kernel - Add PC sampling for x86-64
authorMatthew Dillon <dillon@apollo.backplane.com>
Mon, 24 Sep 2012 21:34:41 +0000 (14:34 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Mon, 24 Sep 2012 21:34:41 +0000 (14:34 -0700)
* Xtimer interrupt (lapic timer) now samples the %rip value and stores
  it in the globaldata structure.  Sampling occurs whether the machine is
  in a critical section or not.

* Used for debugging.

sys/platform/pc64/apic/apic_vector.s
sys/platform/pc64/x86_64/genassym.c
sys/platform/pc64/x86_64/global.s
sys/sys/globaldata.h

index c273c4e..b37e8c7 100644 (file)
@@ -322,6 +322,8 @@ Xtimer:
        addq    $8,%rsp                 /* turn into trapframe */
 
        incl    PCPU(cnt) + V_TIMER
+       movq    TF_RIP(%rsp),%rbx       /* sample addr before checking crit */
+       movq    %rbx,PCPU(sample_pc)
        movq    PCPU(curthread),%rbx
        testl   $-1,TD_CRITCOUNT(%rbx)
        jne     1f
index 677a3a3..7324901 100644 (file)
@@ -111,6 +111,7 @@ ASSYM(GD_CURTHREAD, offsetof(struct mdglobaldata, mi.gd_curthread));
 ASSYM(GD_CNT, offsetof(struct mdglobaldata, mi.gd_cnt));
 ASSYM(GD_CPUID, offsetof(struct mdglobaldata, mi.gd_cpuid));
 ASSYM(GD_CPUMASK, offsetof(struct mdglobaldata, mi.gd_cpumask));
+ASSYM(GD_SAMPLE_PC, offsetof(struct mdglobaldata, mi.gd_sample_pc));
 
 ASSYM(PCB_CR3, offsetof(struct pcb, pcb_cr3));
 ASSYM(PCB_R15, offsetof(struct pcb, pcb_r15));
index f4a0c5a..fcdc193 100644 (file)
@@ -82,6 +82,7 @@
        .globl  gd_cnt, gd_private_tss
        .globl  gd_scratch_rsp
        .globl  gd_user_fs, gd_user_gs
+       .globl  gd_sample_pc
 
        .set    gd_cpuid,globaldata + GD_CPUID
        .set    gd_cpumask,globaldata + GD_CPUMASK
@@ -95,4 +96,5 @@
        .set    gd_scratch_rsp,globaldata + GD_SCRATCH_RSP
        .set    gd_user_fs,globaldata + GD_USER_FS
        .set    gd_user_gs,globaldata + GD_USER_GS
+       .set    gd_sample_pc,globaldata + GD_SAMPLE_PC
 
index 5fe3815..9d2b895 100644 (file)
@@ -167,7 +167,8 @@ struct globaldata {
        const char      *gd_infomsg;            /* debugging */
        struct lwkt_tokref gd_handoff;          /* hand-off tokref */
        void            *gd_delayed_wakeup[2];
-       void            *gd_preserved[6];       /* future fields */
+       void            *gd_sample_pc;          /* sample program ctr/tr */
+       void            *gd_preserved[5];       /* future fields */
        /* extended by <machine/globaldata.h> */
 };