Index: sys/arm/arm/locore-v6.S =================================================================== --- sys/arm/arm/locore-v6.S +++ sys/arm/arm/locore-v6.S @@ -171,6 +171,7 @@ ldr r5, [r4, #4] str r5, [r0, #24] /* store the pagetable address */ mov fp, #0 /* trace back starts here */ + mcr p15, 0, fp, c13, c0, 3 /* Zero the thread pointer */ bl _C_LABEL(initarm) /* Off we go */ /* init arm will return the new stack pointer. */ @@ -437,6 +438,7 @@ ldr pc, =1f 1: mov fp, #0 /* trace back starts here */ + mcr p15, 0, fp, c13, c0, 3 /* Zero the thread pointer */ bl _C_LABEL(init_secondary)/* Off we go, cpu id in r0. */ adr r0, .Lmpreturned Index: sys/arm/arm/sys_machdep.c =================================================================== --- sys/arm/arm/sys_machdep.c +++ sys/arm/arm/sys_machdep.c @@ -84,9 +84,8 @@ arm32_set_tp(struct thread *td, void *args) { - if (td != curthread) - td->td_md.md_tp = (register_t)args; - else + td->td_md.md_tp = (register_t)args; + if (td == curthread) #ifndef ARM_TP_ADDRESS set_tls(args); #else @@ -101,12 +100,16 @@ if (td != curthread) td->td_retval[0] = td->td_md.md_tp; - else + else { #ifndef ARM_TP_ADDRESS + KASSERT((register_t)get_tls() == td->td_md.md_tp, + ("arm32_get_tp: Invalid TLS pointer (%x != %x)", + (register_t)get_tls(), td->td_md.md_tp)); td->td_retval[0] = (register_t)get_tls(); #else td->td_retval[0] = *(register_t *)ARM_TP_ADDRESS; #endif + } return (0); } Index: sys/arm/arm/syscall.c =================================================================== --- sys/arm/arm/syscall.c +++ sys/arm/arm/syscall.c @@ -168,6 +168,11 @@ { struct thread *td = curthread; +#ifndef ARM_TP_ADDRESS + KASSERT((register_t)get_tls() == td->td_md.md_tp, + ("swi_handler: Invalid TLS pointer on entrance (%x != %x)", + (register_t)get_tls(), td->td_md.md_tp)); +#endif td->td_frame = frame; td->td_pticks = 0; @@ -194,4 +199,10 @@ } syscall(td, frame); + +#ifndef ARM_TP_ADDRESS + KASSERT((register_t)get_tls() == td->td_md.md_tp, + ("swi_handler: Invalid TLS pointer on exit (%x != %x)", + (register_t)get_tls(), td->td_md.md_tp)); +#endif } Index: sys/arm/arm/vm_machdep.c =================================================================== --- sys/arm/arm/vm_machdep.c +++ sys/arm/arm/vm_machdep.c @@ -145,6 +145,9 @@ #ifdef ARM_TP_ADDRESS td2->td_md.md_tp = *(register_t *)ARM_TP_ADDRESS; #else + KASSERT((register_t)get_tls() == td1->td_md.md_tp, + ("cpu_fork: Invalid TLS pointer (%x != %x)", + (register_t)get_tls(), td1->td_md.md_tp)); td2->td_md.md_tp = (register_t) get_tls(); #endif }