diff options
author | Russ Cox <rsc@x40.(none)> | 2009-09-02 07:59:24 -0700 |
---|---|---|
committer | Russ Cox <rsc@x40.(none)> | 2009-09-02 07:59:24 -0700 |
commit | f8ab2079cda8fc89f576b3b78a23a9c62891d74d (patch) | |
tree | 552afd44e63a0780b998a8bac17c923de8cd8308 | |
parent | 57ae146362df2350737e5194ca81d925b9466124 (diff) | |
download | xv6-labs-f8ab2079cda8fc89f576b3b78a23a9c62891d74d.tar.gz xv6-labs-f8ab2079cda8fc89f576b3b78a23a9c62891d74d.tar.bz2 xv6-labs-f8ab2079cda8fc89f576b3b78a23a9c62891d74d.zip |
fix TLS again;
still not quite but a lot better.
-rw-r--r-- | proc.c | 5 | ||||
-rw-r--r-- | proc.h | 5 |
2 files changed, 7 insertions, 3 deletions
@@ -70,12 +70,13 @@ ksegment(void) c = &cpus[cpunum()]; c->gdt[SEG_KCODE] = SEG(STA_X|STA_R, 0, 0x100000 + 64*1024-1, 0); c->gdt[SEG_KDATA] = SEG(STA_W, 0, 0xffffffff, 0); - c->gdt[SEG_KCPU] = SEG(STA_W, (uint)(&c->tls+1), 0xffffffff, 0); + c->gdt[SEG_KCPU] = SEG(STA_W, &c->tlsstruct, 0xffffffff, 0); lgdt(c->gdt, sizeof(c->gdt)); loadfsgs(SEG_KCPU << 3); - // Initialize cpu-local variables. + // Initialize cpu-local storage. c->tlsstruct = &c->tlsstruct; + asm volatile(""); // Do not let gcc reorder across this line. cpu = c; proc = 0; } @@ -58,7 +58,10 @@ struct cpu { volatile uint booted; // Has the CPU started? int ncli; // Depth of pushcli nesting. int intena; // Were interrupts enabled before pushcli? - void *tls[2]; + + // "Thread"-local storage variables + struct cpu *cpu; + struct proc *proc; void *tlsstruct; }; |