amd64/151167: amd64 remote debug fails

Zhouyi Zhou zhouzhouyi at gmail.com
Sun Oct 3 03:20:03 UTC 2010


>Number:         151167
>Category:       amd64
>Synopsis:       amd64 remote debug fails
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-amd64
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Oct 03 03:20:02 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Zhouyi Zhou
>Release:        FreeBSD 8.0
>Organization:
Institute of Computing Technology, CAS
>Environment:
FreeBSD zzy 8.0-RELEASE FreeBSD 8.0-RELEASE #137: Sun Oct  3 14:25:54 UTC 2010     root at zzy:/usr/src/sys/amd64/compile/GENERIC  amd64
>Description:
When remote debug FreeBSD 8.0 using gdb on a Intel x86_64 machine, the next command will cause kernel panic.
>How-To-Repeat:
use next command to step over a function all will cause kernel panic
for example:
Breakpoint 1, fork1 (td=0xffffff0002fce390, flags=20, pages=4, procp=0xffffff804a0afaf0) at ../../../kern/kern_fork.c:283
283             newproc = uma_zalloc(proc_zone, M_WAITOK);
(gdb) n

>Fix:
The problems is in some intel x86_64 machines, the computing the rsp from trap frame is not correct.
void
makectx(struct trapframe *tf, struct pcb *pcb)
{

    pcb->pcb_r12 = tf->tf_r12;
    pcb->pcb_r13 = tf->tf_r13;
    pcb->pcb_r14 = tf->tf_r14;
    pcb->pcb_r15 = tf->tf_r15;
    pcb->pcb_rbp = tf->tf_rbp;
    pcb->pcb_rbx = tf->tf_rbx;
    pcb->pcb_rip = tf->tf_rip;
    pcb->pcb_rsp = (ISPL(tf->tf_cs)) ? tf->tf_rsp : (long)(tf + 1) - 8;
}

But according to <Intel 64 and IA-32 Architecutres Software Developer's Manual Volume 3A: System Programming Guide, Part 1>  section 5.14.2: (64-bit mode also pushes SS:RSP unconditionally, rather than only on a CPL change).

So the function makectx in sys/amd64/amd64/machdep.c should be modified as
void
makectx(struct trapframe *tf, struct pcb *pcb)
{

    pcb->pcb_r12 = tf->tf_r12;
    pcb->pcb_r13 = tf->tf_r13;
    pcb->pcb_r14 = tf->tf_r14;
    pcb->pcb_r15 = tf->tf_r15;
    pcb->pcb_rbp = tf->tf_rbp;
    pcb->pcb_rbx = tf->tf_rbx;
    pcb->pcb_rip = tf->tf_rip;
    pcb->pcb_rsp = tf->tf_rsp;
}

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-amd64 mailing list