summaryrefslogtreecommitdiff
path: root/lang/m3gdb/files/patch-ae
blob: 8690958f734e44d4a9da2ee5fe512bd629f391b9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
--- src/gnu/usr.bin/gdb/gdb/freebsd-nat.c.orig	Tue Sep 15 06:49:02 1998
+++ src/gnu/usr.bin/gdb/gdb/freebsd-nat.c	Sat Sep 18 10:54:57 2004
@@ -108,17 +108,23 @@
    * First get virtual address of user structure. Then calculate offset.
    */
   memcpy(&tmp_uaddr,
+#if defined(__FreeBSD__) && __FreeBSD__ >= 5
+	 &((struct user *) core_reg_sect)->u_kproc.ki_addr,
+#else
	 &((struct user *) core_reg_sect)->u_kproc.kp_proc.p_addr,
+#endif
 	 sizeof(tmp_uaddr));
   offset = -reg_addr - (int) tmp_uaddr;
   
   for (regno = 0; regno < NUM_REGS; regno++)
     {
       cregno = tregmap[regno];
-      if (cregno == tFS)
-        addr = offsetof (struct user, u_pcb) + offsetof (struct pcb, pcb_fs);
-      else if (cregno == tGS)
-        addr = offsetof (struct user, u_pcb) + offsetof (struct pcb, pcb_gs);
+      if (cregno == tGS)
+#if defined(__FreeBSD__) && __FreeBSD__ >= 5
+        addr = offsetof (struct user, u_kproc) + offsetof (struct kinfo_proc, ki_pcb) + offsetof (struct pcb, pcb_gs);
+#else
+        addr = offsetof (struct user, u_pcb) + offsetof (struct pcb, pcb_gs);
+#endif
       else
         addr = offset + 4 * cregno;
       if (addr < 0 || addr >= core_reg_size)
@@ -136,7 +134,11 @@
       error ("Register %s not found in core file.", reg_names[bad_reg]);
     }
 
-  addr = offsetof (struct user, u_pcb) + offsetof (struct pcb, pcb_savefpu);
+#if defined(__FreeBSD__) && __FreeBSD__ >= 5
+  addr = offsetof (struct user, u_kproc) + offsetof (struct kinfo_proc, ki_pcb) + offsetof (struct pcb, pcb_save);
+#else
+  addr = offsetof (struct user, u_pcb) + offsetof (struct pcb, pcb_save);
+#endif
   memcpy (&pcb_savefpu, core_reg_sect + addr, sizeof pcb_savefpu);
 }
 
@@ -166,7 +164,6 @@
 extern void print_387_status_word ();
 
 #define	fpstate		save87
-#define	U_FPSTATE(u)	u.u_pcb.pcb_savefpu
 
 static void
 i387_to_double (from, to)
@@ -331,41 +328,19 @@
 void
 i386_float_info ()
 {
-  struct user u; /* just for address computations */
-  int i;
-  /* fpstate defined in <sys/user.h> */
+  struct fpstate fps;
   struct fpstate *fpstatep;
-  char buf[sizeof (struct fpstate) + 2 * sizeof (int)];
-  unsigned int uaddr;
-  char fpvalid;
-  unsigned int rounded_addr;
-  unsigned int rounded_size;
-  /*extern int corechan;*/
-  int skip;
   extern int inferior_pid;
   
-  uaddr = (char *)&U_FPSTATE(u) - (char *)&u;
   if (inferior_pid != 0 && core_bfd == NULL) 
     {
-      int *ip;
-      
-      rounded_addr = uaddr & -sizeof (int);
-      rounded_size = (((uaddr + sizeof (struct fpstate)) - uaddr) +
-		      sizeof (int) - 1) / sizeof (int);
-      skip = uaddr - rounded_addr;
-      
-      ip = (int *)buf;
-      for (i = 0; i < rounded_size; i++) 
-	{
-	  *ip++ = ptrace (PT_READ_U, inferior_pid, (caddr_t)rounded_addr, 0);
-	  rounded_addr += sizeof (int);
-	}
-      fpstatep = (struct fpstate *)(buf + skip);
+      ptrace(PT_GETFPREGS, inferior_pid, (caddr_t)&fps, 0);
+      fpstatep = &fps;
     } 
   else 
     fpstatep = &pcb_savefpu;
 
-  print_387_status (fpstatep->sv_ex_sw, (struct env387 *)fpstatep);
+  print_387_status (0, (struct env387 *)fpstatep);
 }
 #endif /* FLOAT_INFO */