Module Name: src
Committed By: cherry
Date: Sat Nov 4 08:50:48 UTC 2017
Modified Files:
src/sys/arch/amd64/amd64: machdep.c
src/sys/arch/amd64/include: segments.h
src/sys/arch/i386/i386: machdep.c
src/sys/arch/i386/include: segments.h
src/sys/arch/x86/x86: idt.c
src/sys/arch/xen/conf: files.xen
Log Message:
In XEN PV, the idt vector table is not required to be altered at
runtime, since only entries for exceptions/traps are registered with
the hypervisor and interrupts are managed via a completely different
mechanism.
This change uses the idt_vec_reserve() mechanism nevertheless,
modifying it slightly to only do namespace management in XEN, while on
native it will continue to do idt entry init as before.
Rationale: Consistent API usage and potential future merging of
XEN/non-XEN code.
There are no functional changes in this commit.
To generate a diff of this commit:
cvs rdiff -u -r1.274 -r1.275 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/amd64/include/segments.h
cvs rdiff -u -r1.797 -r1.798 src/sys/arch/i386/i386/machdep.c
cvs rdiff -u -r1.62 -r1.63 src/sys/arch/i386/include/segments.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/x86/x86/idt.c
cvs rdiff -u -r1.157 -r1.158 src/sys/arch/xen/conf/files.xen
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/machdep.c
diff -u src/sys/arch/amd64/amd64/machdep.c:1.274 src/sys/arch/amd64/amd64/machdep.c:1.275
--- src/sys/arch/amd64/amd64/machdep.c:1.274 Sun Oct 29 10:25:28 2017
+++ src/sys/arch/amd64/amd64/machdep.c Sat Nov 4 08:50:47 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.274 2017/10/29 10:25:28 maxv Exp $ */
+/* $NetBSD: machdep.c,v 1.275 2017/11/04 08:50:47 cherry Exp $ */
/*
* Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011
@@ -110,7 +110,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.274 2017/10/29 10:25:28 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.275 2017/11/04 08:50:47 cherry Exp $");
/* #define XENDEBUG_LOW */
@@ -1747,6 +1747,7 @@ init_x86_64(paddr_t first_avail)
GSEL(GCODE_SEL, SEL_KPL));
#else /* XEN */
pmap_changeprot_local(idt_vaddr, VM_PROT_READ|VM_PROT_WRITE);
+ idt_vec_reserve(x);
xen_idt[xen_idt_idx].vector = x;
switch (x) {
@@ -1776,6 +1777,7 @@ init_x86_64(paddr_t first_avail)
setgate(&idt[128], &IDTVEC(osyscall), 0, SDT_SYS386IGT, SEL_UPL,
GSEL(GCODE_SEL, SEL_KPL));
#else
+ idt_vec_reserve(128);
xen_idt[xen_idt_idx].vector = 128;
xen_idt[xen_idt_idx].flags = SEL_KPL;
xen_idt[xen_idt_idx].cs = GSEL(GCODE_SEL, SEL_KPL);
Index: src/sys/arch/amd64/include/segments.h
diff -u src/sys/arch/amd64/include/segments.h:1.32 src/sys/arch/amd64/include/segments.h:1.33
--- src/sys/arch/amd64/include/segments.h:1.32 Wed Nov 1 07:14:29 2017
+++ src/sys/arch/amd64/include/segments.h Sat Nov 4 08:50:47 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: segments.h,v 1.32 2017/11/01 07:14:29 maxv Exp $ */
+/* $NetBSD: segments.h,v 1.33 2017/11/04 08:50:47 cherry Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California.
@@ -245,12 +245,12 @@ void set_mem_segment(struct mem_segment_
void cpu_init_idt(void);
void update_descriptor(void *, void *);
-#if !defined(XEN)
+
void idt_vec_reserve(int);
int idt_vec_alloc(int, int);
void idt_vec_set(int, void (*)(void));
void idt_vec_free(int);
-#endif
+
struct lwp;
void cpu_segregs64_zero(struct lwp *);
Index: src/sys/arch/i386/i386/machdep.c
diff -u src/sys/arch/i386/i386/machdep.c:1.797 src/sys/arch/i386/i386/machdep.c:1.798
--- src/sys/arch/i386/i386/machdep.c:1.797 Sun Oct 29 10:01:21 2017
+++ src/sys/arch/i386/i386/machdep.c Sat Nov 4 08:50:47 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.797 2017/10/29 10:01:21 maxv Exp $ */
+/* $NetBSD: machdep.c,v 1.798 2017/11/04 08:50:47 cherry Exp $ */
/*
* Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009, 2017
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.797 2017/10/29 10:01:21 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.798 2017/11/04 08:50:47 cherry Exp $");
#include "opt_beep.h"
#include "opt_compat_freebsd.h"
@@ -1355,6 +1355,7 @@ init386(paddr_t first_avail)
xen_idt_idx = 0;
for (x = 0; x < 32; x++) {
KASSERT(xen_idt_idx < MAX_XEN_IDT);
+ idt_vec_reserve(x);
xen_idt[xen_idt_idx].vector = x;
switch (x) {
@@ -1377,6 +1378,7 @@ init386(paddr_t first_avail)
xen_idt_idx++;
}
KASSERT(xen_idt_idx < MAX_XEN_IDT);
+ idt_vec_reserve(128);
xen_idt[xen_idt_idx].vector = 128;
xen_idt[xen_idt_idx].flags = SEL_UPL;
xen_idt[xen_idt_idx].cs = GSEL(GCODE_SEL, SEL_KPL);
Index: src/sys/arch/i386/include/segments.h
diff -u src/sys/arch/i386/include/segments.h:1.62 src/sys/arch/i386/include/segments.h:1.63
--- src/sys/arch/i386/include/segments.h:1.62 Sun Sep 17 09:41:35 2017
+++ src/sys/arch/i386/include/segments.h Sat Nov 4 08:50:47 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: segments.h,v 1.62 2017/09/17 09:41:35 maxv Exp $ */
+/* $NetBSD: segments.h,v 1.63 2017/11/04 08:50:47 cherry Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -200,12 +200,12 @@ void unsetgate(struct gate_descriptor *)
void cpu_init_idt(void);
void update_descriptor(union descriptor *, union descriptor *);
-#if !defined(XEN)
+
void idt_vec_reserve(int);
int idt_vec_alloc(int, int);
void idt_vec_set(int, void (*)(void));
void idt_vec_free(int);
-#endif
+
#endif /* _KERNEL */
Index: src/sys/arch/x86/x86/idt.c
diff -u src/sys/arch/x86/x86/idt.c:1.5 src/sys/arch/x86/x86/idt.c:1.6
--- src/sys/arch/x86/x86/idt.c:1.5 Mon Aug 7 17:10:09 2017
+++ src/sys/arch/x86/x86/idt.c Sat Nov 4 08:50:47 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: idt.c,v 1.5 2017/08/07 17:10:09 maxv Exp $ */
+/* $NetBSD: idt.c,v 1.6 2017/11/04 08:50:47 cherry Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2000, 2009 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: idt.c,v 1.5 2017/08/07 17:10:09 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: idt.c,v 1.6 2017/11/04 08:50:47 cherry Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -75,9 +75,12 @@ __KERNEL_RCSID(0, "$NetBSD: idt.c,v 1.5
#include <machine/segments.h>
+/* On xen PV this is just numberspace management - used in x86/intr.c */
#if !defined(XEN)
struct gate_descriptor *idt;
+#endif
+
static char idt_allocmap[NIDT];
/*
@@ -120,8 +123,10 @@ idt_vec_set(int vec, void (*function)(vo
{
KASSERT(idt_allocmap[vec] == 1);
+#if !defined(XEN)
setgate(&idt[vec], function, 0, SDT_SYS386IGT, SEL_KPL,
GSEL(GCODE_SEL, SEL_KPL));
+#endif
}
/*
@@ -131,8 +136,9 @@ void
idt_vec_free(int vec)
{
+#if !defined(XEN)
unsetgate(&idt[vec]);
+#endif
idt_allocmap[vec] = 0;
}
-#endif /* !defined(XEN) */
Index: src/sys/arch/xen/conf/files.xen
diff -u src/sys/arch/xen/conf/files.xen:1.157 src/sys/arch/xen/conf/files.xen:1.158
--- src/sys/arch/xen/conf/files.xen:1.157 Sat Nov 4 07:01:45 2017
+++ src/sys/arch/xen/conf/files.xen Sat Nov 4 08:50:47 2017
@@ -1,4 +1,4 @@
-# $NetBSD: files.xen,v 1.157 2017/11/04 07:01:45 cherry Exp $
+# $NetBSD: files.xen,v 1.158 2017/11/04 08:50:47 cherry Exp $
# NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp
# NetBSD: files.i386,v 1.254 2004/03/25 23:32:10 jmc Exp
@@ -140,6 +140,7 @@ file arch/xen/x86/consinit.c machdep
file arch/x86/x86/identcpu.c machdep
file arch/xen/x86/intr.c machdep
file arch/xen/x86/xen_ipi.c multiprocessor
+file arch/x86/x86/idt.c machdep
file arch/x86/x86/pmap.c machdep
file arch/x86/x86/pmap_tlb.c machdep
file arch/x86/x86/procfs_machdep.c procfs