__tls_get_addr problem with recent current

Artem Belevich fbsdlist at src.cx
Sat Aug 30 21:03:03 UTC 2008


With the new patch kernel has crashed as soon as I ran i386 app,
though the crash happened within in-kernel thread g_up:

Fatal trap 12: page fault while in kernel mode
cpuid = 2; apic id = 02
fault virtual address   = 0x20
fault code              = supervisor read data, page not present
instruction pointer     = 0x8:0xffffffff804a821f
stack pointer           = 0x10:0xffffffffac280b60
frame pointer           = 0x10:0x0
code segment            = base 0x0, limit 0xfffff, type 0x1b
                       = DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags        = resume, IOPL = 0
current process         = 3 (g_up)
trap number             = 12
panic: page fault
cpuid = 2
Uptime: 37s
Physical memory: 8169 MB
Dumping 380 MB: 365 349 333 317 301 285 269 253 237 221 205 189 173
157 141 125 109 93 77 61 45 29 13

--Artem
On 8/30/08, Kostik Belousov <kostikbel at gmail.com> wrote:
> Hmm, after I sent the patch, I started thought that, in fact, we shall
>  reread the fsbase when switching from 32bit process, not when switching
>  to such process. Could you, please, retest with the following change
>  (against stock sources, not over the previous patch) ?
>
>
>  diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S
>
> index f34b0cc..29ce2e1 100644
>
> --- a/sys/amd64/amd64/cpu_switch.S
>  +++ b/sys/amd64/amd64/cpu_switch.S
>
> @@ -249,6 +249,10 @@ store_seg:
>   1:     movl    %ds,PCB_DS(%r8)
>         movl    %es,PCB_ES(%r8)
>         movl    %fs,PCB_FS(%r8)
>  +       movl    $MSR_FSBASE,%ecx
>
> +       rdmsr
>  +       shlq    $32,%rdx
>  +       leaq    (%rax,%rdx),%r9
>
>         jmp     done_store_seg
>
>  2:     movq    PCB_GS32P(%r8),%rax
>
>         movq    (%rax),%rax
>
>


More information about the freebsd-current mailing list