Cleans up sysenter_init
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 25 Jun 2013 20:15:33 +0000 (13:15 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 26 Jun 2013 05:20:24 +0000 (22:20 -0700)
It's existence is arch specific, so we don't really want it in kernel_init (or
riscv) and within x86, each subarch has different ways to set it up.

kern/arch/riscv/trap.c
kern/arch/x86/smp_boot.c
kern/arch/x86/trap.c
kern/arch/x86/trap.h
kern/arch/x86/trap32.h
kern/arch/x86/trap64.h
kern/include/trap.h
kern/src/init.c

index 779f8da..e35534f 100644 (file)
@@ -53,11 +53,6 @@ idt_init(void)
 {
 }
 
-void
-sysenter_init(void)
-{
-}
-
 /* Helper.  For now, this copies out the TF to pcpui, and sets cur_ctx to point
  * to it. */
 static void set_current_ctx_hw(struct per_cpu_info *pcpui,
index eb94bdb..e70a62d 100644 (file)
@@ -232,20 +232,15 @@ uint32_t smp_main(void)
         * we use the bottom of the stack page... */
        *(uintptr_t*)page2kva(my_stack) = (uintptr_t)gdt_etc;
 
-       /* TODO: 64b is diff, use a helper */
-       // Set up MSR for SYSENTER 
-       write_msr(MSR_IA32_SYSENTER_CS, GD_KT);
-       write_msr(MSR_IA32_SYSENTER_ESP, my_stack_top);
-       write_msr(MSR_IA32_SYSENTER_EIP, (uintptr_t) &sysenter_handler);
-
        // Build and load the gdt / gdt_pd
        memcpy(my_gdt, gdt, sizeof(segdesc_t)*SEG_COUNT);
        *my_gdt_pd = (pseudodesc_t) {
                sizeof(segdesc_t)*SEG_COUNT - 1, (uintptr_t) my_gdt };
        asm volatile("lgdt %0" : : "m"(*my_gdt_pd));
 
-       // Need to set the TSS so we know where to trap on this core
+       /* Set up our kernel stack when changing rings */
        x86_set_stacktop_tss(my_ts, my_stack_top);
+       x86_sysenter_init(my_stack_top);
        // Initialize the TSS field of my_gdt.
        syssegdesc_t *ts_slot = (syssegdesc_t*)&my_gdt[GD_TSS >> 3];
        *ts_slot = (syssegdesc_t)SEG_SYS_SMALL(STS_T32A, (uintptr_t)my_ts,
index 1c3430d..0d31fe4 100644 (file)
@@ -132,9 +132,10 @@ void idt_init(void)
        idt[T_SYSCALL].gd_type = SINIT(STS_IG32);
        idt[T_BRKPT].gd_dpl = SINIT(3);
 
-       /* Setup a TSS so that we get the right stack when we trap to the kernel. */
+       /* Set up our kernel stack when changing rings */
        /* Note: we want 16 byte aligned kernel stack frames (AMD 2:8.9.3) */
        x86_set_stacktop_tss(&ts, (uintptr_t)bootstacktop);
+       x86_sysenter_init((uintptr_t)bootstacktop);
 
 #ifdef CONFIG_KTHREAD_POISON
        /* TODO: KTHR-STACK */
index 48eb1ed..6c1f7be 100644 (file)
@@ -93,6 +93,7 @@ extern gatedesc_t idt[];
 extern pseudodesc_t idt_pd;
 extern taskstate_t ts;
 extern const char *x86_trapname(int trapno);
+extern void sysenter_handler(void);
 
 /* Defined and set up in in arch/init.c, used for XMM initialization */
 extern struct ancillary_state x86_default_fpu;
index 0d87fd9..fa5651e 100644 (file)
@@ -58,6 +58,13 @@ static inline void x86_fake_rdtscp(struct hw_trapframe *hw_tf)
        hw_tf->tf_regs.reg_ecx = core_id();
 }
 
+static inline void x86_sysenter_init(uintptr_t stacktop)
+{
+       write_msr(MSR_IA32_SYSENTER_CS, GD_KT);
+       write_msr(MSR_IA32_SYSENTER_ESP, stacktop);
+       write_msr(MSR_IA32_SYSENTER_EIP, (uintptr_t) &sysenter_handler);
+}
+
 static inline void x86_set_sysenter_stacktop(uintptr_t stacktop)
 {
        write_msr(MSR_IA32_SYSENTER_ESP, stacktop);
index 4098902..885f8e9 100644 (file)
@@ -60,6 +60,14 @@ static inline void x86_fake_rdtscp(struct hw_trapframe *hw_tf)
        hw_tf->tf_rcx = core_id();
 }
 
+/* TODO: use syscall.  all of this sysenter stuff is wrong  */
+static inline void x86_sysenter_init(uintptr_t stacktop)
+{
+       write_msr(MSR_IA32_SYSENTER_CS, GD_KT);
+       write_msr(MSR_IA32_SYSENTER_ESP, stacktop);
+       write_msr(MSR_IA32_SYSENTER_EIP, (uintptr_t) &sysenter_handler);
+}
+
 static inline void x86_set_sysenter_stacktop(uintptr_t stacktop)
 {
        write_msr(MSR_IA32_SYSENTER_ESP, stacktop);
index bd32897..78deb69 100644 (file)
@@ -43,9 +43,6 @@ void page_fault_handler(struct hw_trapframe *hw_tf);
 void set_core_timer(uint32_t usec, bool periodic);
 void timer_interrupt(struct hw_trapframe *hw_tf, void *data);
 
-void sysenter_init(void);
-extern void sysenter_handler();
-
 extern inline void save_fp_state(struct ancillary_state *silly);
 extern inline void restore_fp_state(struct ancillary_state *silly);
 extern inline void init_fp_state(void);
index 9bb4f25..9b8ea0f 100644 (file)
@@ -80,7 +80,6 @@ void kernel_init(multiboot_info_t *mboot_info)
        devfs_init();
        idt_init();
        kernel_msg_init();
-       sysenter_init();
        timer_init();
        train_timing();
        kb_buf_init(&cons_buf);