diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/i386obsd-nat.c | 10 |
2 files changed, 12 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8ad9ac4..7d1cac1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-08-06 Mark Kettenis <kettenis@gnu.org> + + * i386obsd-nat.c (i386obsd_supply_pcb): Adjust for changes in + OpenBSD 4.3. + 2008-08-06 Vladimir Prus <vladimir@codesourcery.com> Tom Tromey <tromey@redhat.com> Thiago Jung Bauermann <bauerman@br.ibm.com> diff --git a/gdb/i386obsd-nat.c b/gdb/i386obsd-nat.c index 1c45865..1585efb 100644 --- a/gdb/i386obsd-nat.c +++ b/gdb/i386obsd-nat.c @@ -60,10 +60,11 @@ i386obsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) /* Read the stack frame, and check its validity. We do this by checking if the saved interrupt priority level in the stack frame looks reasonable.. */ - read_memory (pcb->pcb_esp, (char *) &sf, sizeof sf); - if ((unsigned int) sf.sf_ppl < 0x100 && (sf.sf_ppl & 0xf) == 0) +#ifdef PCB_SAVECTX + if ((pcb->pcb_flags & PCB_SAVECTX) == 0) { /* Yes, we have a frame that matches cpu_switch(). */ + read_memory (pcb->pcb_esp, (char *) &sf, sizeof sf); pcb->pcb_esp += sizeof (struct switchframe); regcache_raw_supply (regcache, I386_EDI_REGNUM, &sf.sf_edi); regcache_raw_supply (regcache, I386_ESI_REGNUM, &sf.sf_esi); @@ -71,9 +72,12 @@ i386obsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) regcache_raw_supply (regcache, I386_EIP_REGNUM, &sf.sf_eip); } else +#endif { /* No, the pcb must have been last updated by savectx(). */ - pcb->pcb_esp += 4; + pcb->pcb_esp = pcb->pcb_ebp; + pcb->pcb_ebp = read_memory_integer(pcb->pcb_esp, 4); + sf.sf_eip = read_memory_integer(pcb->pcb_esp + 4, 4); regcache_raw_supply (regcache, I386_EIP_REGNUM, &sf); } |