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 */
|