Fixed GCC using sse instructions, fixing TSS support (and removed using
authorJohn Hodge <[email protected]>
Mon, 31 May 2010 14:14:20 +0000 (22:14 +0800)
committerJohn Hodge <[email protected]>
Mon, 31 May 2010 14:14:20 +0000 (22:14 +0800)
the TSS as a data segment in GetCPUNum

Kernel/arch/x86_64/Makefile
Kernel/arch/x86_64/include/desctab.h
Kernel/arch/x86_64/proc.c
Kernel/arch/x86_64/start32.asm
Kernel/arch/x86_64/start64.asm

index 6bc6419..be7c12d 100644 (file)
@@ -12,7 +12,7 @@
 MAX_CPUS := 4
 
 CPPFLAGS       := -DMAX_CPUS=$(MAX_CPUS)
-CFLAGS         := $(KERNEL_CFLAGS)
+CFLAGS         := $(KERNEL_CFLAGS) -mno-sse -mno-mmx
 ASFLAGS                := -f elf64 -D MAX_CPUS=$(MAX_CPUS)
 LDFLAGS        := -nostdlib -nodefaultlibs
 
index ee9b20b..de3996c 100644 (file)
@@ -52,9 +52,6 @@ typedef struct {
        Uint32  Rsvd3[2];
        Uint16  Rsvd4;
        Uint16  IOMapBase;
-       
-       // Acess Specific Fields
-       Uint8   CPUNumber;      // CPU Number
 } __attribute__ ((packed)) tTSS;
 
 #endif
index ebb07d6..a1d5c86 100644 (file)
@@ -269,17 +269,17 @@ void ArchThreads_Init()
        #else
        pos = 0;
        #endif
-               gTSSs[pos].CPUNumber = pos;
                gTSSs[pos].RSP0 = 0;    // Set properly by scheduler
-               gGDT[6+pos*2].BaseLow = ((Uint)(&gTSSs[pos])) & 0xFFFF;
-               gGDT[6+pos*2].BaseMid = ((Uint)(&gTSSs[pos])) >> 16;
-               gGDT[6+pos*2].BaseHi = ((Uint)(&gTSSs[pos])) >> 24;
-               gGDT[6+pos*2+1].DWord[0] = ((Uint)(&gTSSs[pos])) >> 32;
+               gGDT[7+pos*2].LimitLow = sizeof(tTSS) & 0xFFFF;
+               gGDT[7+pos*2].BaseLow = ((Uint)(&gTSSs[pos])) & 0xFFFF;
+               gGDT[7+pos*2].BaseMid = ((Uint)(&gTSSs[pos])) >> 16;
+               gGDT[7+pos*2].BaseHi = ((Uint)(&gTSSs[pos])) >> 24;
+               gGDT[7+pos*2+1].DWord[0] = ((Uint)(&gTSSs[pos])) >> 32;
        #if USE_MP
        }
        for(pos=0;pos<giNumCPUs;pos++) {
        #endif
-               __asm__ __volatile__ ("ltr %%ax"::"a"(0x30+pos*8));
+               __asm__ __volatile__ ("ltr %%ax"::"a"(0x38+pos*16));
        #if USE_MP
        }
        #endif
index 4769ee4..011fb47 100644 (file)
@@ -94,7 +94,7 @@ gGDT:
        dd      0x00000000, 0x0000F200  ; 0x20: 64-bit User Data
        dd      0x00000000, 0x0040FA00  ; 0x38: 32-bit User Code
        dd      0x00000000, 0x0040F200  ; 0x30: 32-bit User Data
-       times MAX_CPUS  dd      0, 0, 0, 0      ; 0x38+16*n: TSS 0
+       times MAX_CPUS  dd      0x00008900, 0, 0, 0     ; 0x38+16*n: TSS 0
 gGDTPtr:
        dw      $-gGDT-1
        dd      gGDT-KERNEL_BASE
index 04bac26..33c77d6 100644 (file)
@@ -50,10 +50,10 @@ GetRIP:
 
 [global GetCPUNum]
 GetCPUNum:
-       str ax
-       mov gs, ax
        xor rax, rax
-       mov al, [gs:104]        ; End of TSS
+       str ax
+       sub ax, 0x38    ; TSS Base
+       shr ax, 4       ; One 16-byte TSS per CPU
        ret
 
 KSTACK_USERSTATE_SIZE  equ     (16+1+5)*8      ; GPRegs, CPU, IRET

UCC git Repository :: git.ucc.asn.au