__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