x86: encode cpu# in IA32_TSC_AUX and size of GDTe#15
This commit is contained in:
@ -10,7 +10,7 @@
|
|||||||
* HISTORY
|
* HISTORY
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define X86_CPU_LOCAL_OFFSET_TSS 128
|
#define X86_CPU_LOCAL_OFFSET_TSS 176
|
||||||
#define X86_TSS_OFFSET_SP0 4
|
#define X86_TSS_OFFSET_SP0 4
|
||||||
#define X86_CPU_LOCAL_OFFSET_SP0 \
|
#define X86_CPU_LOCAL_OFFSET_SP0 \
|
||||||
(X86_CPU_LOCAL_OFFSET_TSS + X86_TSS_OFFSET_SP0)
|
(X86_CPU_LOCAL_OFFSET_TSS + X86_TSS_OFFSET_SP0)
|
||||||
|
|||||||
@ -103,6 +103,12 @@ static uint64_t gdt[] __attribute__((aligned(16))) = {
|
|||||||
0x00aff3000000ffff, /* 56 : USER_DS */
|
0x00aff3000000ffff, /* 56 : USER_DS */
|
||||||
0x0000890000000067, /* 64 : TSS */
|
0x0000890000000067, /* 64 : TSS */
|
||||||
0, /* (72: TSS) */
|
0, /* (72: TSS) */
|
||||||
|
0, /* 80 */
|
||||||
|
0, /* 88 */
|
||||||
|
0, /* 96 */
|
||||||
|
0, /* 104 */
|
||||||
|
0, /* 112 */
|
||||||
|
0x0000f10000000000, /* 120 : GETCPU */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tss64 tss __attribute__((aligned(16)));
|
struct tss64 tss __attribute__((aligned(16)));
|
||||||
@ -570,6 +576,7 @@ static void init_smp_processor(void)
|
|||||||
{
|
{
|
||||||
struct x86_cpu_local_variables *v;
|
struct x86_cpu_local_variables *v;
|
||||||
unsigned long tss_addr;
|
unsigned long tss_addr;
|
||||||
|
unsigned node_cpu;
|
||||||
|
|
||||||
v = get_x86_this_cpu_local();
|
v = get_x86_this_cpu_local();
|
||||||
tss_addr = (unsigned long)&v->tss;
|
tss_addr = (unsigned long)&v->tss;
|
||||||
@ -590,6 +597,9 @@ static void init_smp_processor(void)
|
|||||||
| (0x89UL << 40) | ((tss_addr & 0xff000000) << 32);
|
| (0x89UL << 40) | ((tss_addr & 0xff000000) << 32);
|
||||||
v->gdt[GLOBAL_TSS_ENTRY + 1] = (tss_addr >> 32);
|
v->gdt[GLOBAL_TSS_ENTRY + 1] = (tss_addr >> 32);
|
||||||
|
|
||||||
|
node_cpu = v->processor_id; /* assumes NUMA node 0 */
|
||||||
|
v->gdt[GETCPU_ENTRY] |= node_cpu;
|
||||||
|
|
||||||
v->gdt_ptr.size = sizeof(v->gdt) - 1;
|
v->gdt_ptr.size = sizeof(v->gdt) - 1;
|
||||||
v->gdt_ptr.address = (unsigned long)v->gdt;
|
v->gdt_ptr.address = (unsigned long)v->gdt;
|
||||||
|
|
||||||
@ -597,6 +607,8 @@ static void init_smp_processor(void)
|
|||||||
reload_gdt(&v->gdt_ptr);
|
reload_gdt(&v->gdt_ptr);
|
||||||
|
|
||||||
set_kstack((unsigned long)get_x86_this_cpu_kstack());
|
set_kstack((unsigned long)get_x86_this_cpu_kstack());
|
||||||
|
#define MSR_IA32_TSC_AUX 0xc0000103
|
||||||
|
wrmsr(MSR_IA32_TSC_AUX, node_cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *trampoline_va, *first_page_va;
|
static char *trampoline_va, *first_page_va;
|
||||||
|
|||||||
@ -22,6 +22,7 @@
|
|||||||
#define USER_CS_ENTRY 6
|
#define USER_CS_ENTRY 6
|
||||||
#define USER_DS_ENTRY 7
|
#define USER_DS_ENTRY 7
|
||||||
#define GLOBAL_TSS_ENTRY 8
|
#define GLOBAL_TSS_ENTRY 8
|
||||||
|
#define GETCPU_ENTRY 15
|
||||||
|
|
||||||
#define KERNEL_CS (KERNEL_CS_ENTRY * 8)
|
#define KERNEL_CS (KERNEL_CS_ENTRY * 8)
|
||||||
#define KERNEL_DS (KERNEL_DS_ENTRY * 8)
|
#define KERNEL_DS (KERNEL_DS_ENTRY * 8)
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
* - 4096 : kernel stack
|
* - 4096 : kernel stack
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define X86_CPU_LOCAL_OFFSET_TSS 128
|
#define X86_CPU_LOCAL_OFFSET_TSS 176
|
||||||
#define X86_CPU_LOCAL_OFFSET_KSTACK 16
|
#define X86_CPU_LOCAL_OFFSET_KSTACK 16
|
||||||
#define X86_CPU_LOCAL_OFFSET_USTACK 24
|
#define X86_CPU_LOCAL_OFFSET_USTACK 24
|
||||||
|
|
||||||
@ -39,13 +39,13 @@ struct x86_cpu_local_variables {
|
|||||||
struct x86_desc_ptr gdt_ptr;
|
struct x86_desc_ptr gdt_ptr;
|
||||||
unsigned short pad[3];
|
unsigned short pad[3];
|
||||||
/* 48 */
|
/* 48 */
|
||||||
uint64_t gdt[10];
|
uint64_t gdt[16];
|
||||||
/* 128 */
|
/* 176 */
|
||||||
struct tss64 tss;
|
struct tss64 tss;
|
||||||
/* 232 */
|
/* 280 */
|
||||||
unsigned long paniced;
|
unsigned long paniced;
|
||||||
uint64_t panic_regs[21];
|
uint64_t panic_regs[21];
|
||||||
/* 408 */
|
/* 456 */
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct x86_cpu_local_variables *get_x86_cpu_local_variable(int id);
|
struct x86_cpu_local_variables *get_x86_cpu_local_variable(int id);
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
* 2013/?? - bgerofi + shimosawa: handle rsp correctly for nested interrupts
|
* 2013/?? - bgerofi + shimosawa: handle rsp correctly for nested interrupts
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define X86_CPU_LOCAL_OFFSET_TSS 128
|
#define X86_CPU_LOCAL_OFFSET_TSS 176
|
||||||
#define X86_TSS_OFFSET_SP0 4
|
#define X86_TSS_OFFSET_SP0 4
|
||||||
#define X86_CPU_LOCAL_OFFSET_SP0 \
|
#define X86_CPU_LOCAL_OFFSET_SP0 \
|
||||||
(X86_CPU_LOCAL_OFFSET_TSS + X86_TSS_OFFSET_SP0)
|
(X86_CPU_LOCAL_OFFSET_TSS + X86_TSS_OFFSET_SP0)
|
||||||
|
|||||||
@ -216,7 +216,9 @@ SYSCALL_DECLARE(rt_sigreturn)
|
|||||||
struct sigsp ksigsp;
|
struct sigsp ksigsp;
|
||||||
struct sigsp *sigsp;
|
struct sigsp *sigsp;
|
||||||
|
|
||||||
asm("movq %%gs:132, %0" : "=r" (regs));
|
asm ("movq %%gs:(%1),%0"
|
||||||
|
: "=r"(regs)
|
||||||
|
: "r"(offsetof(struct x86_cpu_local_variables, tss.rsp0)));
|
||||||
--regs;
|
--regs;
|
||||||
|
|
||||||
sigsp = (struct sigsp *)regs->gpr.rsp;
|
sigsp = (struct sigsp *)regs->gpr.rsp;
|
||||||
@ -680,7 +682,9 @@ do_signal(unsigned long rc, void *regs0, struct thread *thread, struct sig_pendi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(regs == NULL){ /* call from syscall */
|
if(regs == NULL){ /* call from syscall */
|
||||||
asm("movq %%gs:132, %0" : "=r" (regs));
|
asm ("movq %%gs:(%1),%0"
|
||||||
|
: "=r"(regs)
|
||||||
|
: "r"(offsetof(struct x86_cpu_local_variables, tss.rsp0)));
|
||||||
--regs;
|
--regs;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|||||||
Reference in New Issue
Block a user