x86_64: Add setidt(), which setup an IDT entry on the specified cpu
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 24 Dec 2011 16:27:40 +0000 (00:27 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 27 Dec 2011 05:44:42 +0000 (13:44 +0800)
sys/platform/pc64/include/md_var.h
sys/platform/pc64/x86_64/machdep.c

index 7bc3747..cffe7c9 100644 (file)
@@ -83,6 +83,8 @@ void  pagezero(void *addr);
 void   pagecopy(void *from, void *to);
 void   setidt_global(int idx, alias_for_inthand_t *func,
            int typ, int dpl, int ist);
+void   setidt(int idx, alias_for_inthand_t *func,
+           int typ, int dpl, int ist, int cpu);
 int    user_dbreg_trap(void);
 void   fpstate_drop(struct thread *td);
 
index e8e046d..2857edb 100644 (file)
@@ -1294,6 +1294,24 @@ setidt_global(int idx, inthand_t *func, int typ, int dpl, int ist)
        }
 }
 
+void
+setidt(int idx, inthand_t *func, int typ, int dpl, int ist, int cpu)
+{
+       struct gate_descriptor *ip;
+
+       KASSERT(cpu >= 0 && cpu < ncpus, ("invalid cpu %d\n", cpu));
+
+       ip = &idt_arr[cpu][idx];
+       ip->gd_looffset = (uintptr_t)func;
+       ip->gd_selector = GSEL(GCODE_SEL, SEL_KPL);
+       ip->gd_ist = ist;
+       ip->gd_xx = 0;
+       ip->gd_type = typ;
+       ip->gd_dpl = dpl;
+       ip->gd_p = 1;
+       ip->gd_hioffset = ((uintptr_t)func)>>16 ;
+}
+
 #define        IDTVEC(name)    __CONCAT(X,name)
 
 extern inthand_t