Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/x86_64/x86_64 Use a seperate stack for the double f...
details: https://anonhg.NetBSD.org/src/rev/90de5014edee
branches: trunk
changeset: 533567:90de5014edee
user: fvdl <fvdl%NetBSD.org@localhost>
date: Thu Jul 04 10:46:21 2002 +0000
description:
Use a seperate stack for the double fault trap.
diffstat:
sys/arch/x86_64/x86_64/machdep.c | 25 ++++++++++++++++++-------
1 files changed, 18 insertions(+), 7 deletions(-)
diffs (84 lines):
diff -r 01468ae0022f -r 90de5014edee sys/arch/x86_64/x86_64/machdep.c
--- a/sys/arch/x86_64/x86_64/machdep.c Thu Jul 04 10:44:00 2002 +0000
+++ b/sys/arch/x86_64/x86_64/machdep.c Thu Jul 04 10:46:21 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.12 2002/06/25 01:24:50 thorpej Exp $ */
+/* $NetBSD: machdep.c,v 1.13 2002/07/04 10:46:21 fvdl Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2000 The NetBSD Foundation, Inc.
@@ -141,6 +141,8 @@
char machine[] = "x86_64"; /* cpu "architecture" */
char machine_arch[] = "x86_64"; /* machine == machine_arch */
+char x86_64_doubleflt_stack[NBPG];
+
u_int cpu_serial[3];
char cpu_model[] = "Hammer x86-64";
@@ -196,7 +198,7 @@
int cpu_dumpsize __P((void));
u_long cpu_dump_mempagecnt __P((void));
void dumpsys __P((void));
-void init_x86_64 __P((vaddr_t));
+void init_x86_64 __P((paddr_t));
/*
* Machine-dependent startup code
@@ -358,6 +360,7 @@
GSYSSEL(GLDT_SEL, SEL_KPL);
pcb->pcb_cr0 = rcr0();
pcb->pcb_tss.tss_rsp0 = (u_int64_t)proc0.p_addr + USPACE - 16;
+ pcb->pcb_tss.tss_ist[0] = (u_int64_t)&x86_64_doubleflt_stack[NBPG - 8];
tss_alloc(&proc0);
ltr(proc0.p_md.md_tss_sel);
@@ -1121,14 +1124,14 @@
void
init_x86_64(first_avail)
- vaddr_t first_avail;
+ paddr_t first_avail;
{
extern void consinit __P((void));
extern struct extent *iomem_ex;
struct btinfo_memmap *bim;
struct region_descriptor region;
struct mem_segment_descriptor *ldt_segp;
- int x, first16q;
+ int x, first16q, ist;
u_int64_t seg_start, seg_end;
u_int64_t seg_start1, seg_end1;
@@ -1474,10 +1477,16 @@
pmap_growkernel(VM_MIN_KERNEL_ADDRESS + 32 * 1024 * 1024);
- pmap_enter(pmap_kernel(), idt_vaddr, idt_paddr,
+#if 0
+ pmap_kenter(pmap_kernel(), idt_vaddr, idt_paddr,
VM_PROT_READ|VM_PROT_WRITE, PMAP_WIRED|VM_PROT_READ|VM_PROT_WRITE);
pmap_enter(pmap_kernel(), idt_vaddr + PAGE_SIZE, idt_paddr + PAGE_SIZE,
VM_PROT_READ|VM_PROT_WRITE, PMAP_WIRED|VM_PROT_READ|VM_PROT_WRITE);
+#else
+ pmap_kenter_pa(idt_vaddr, idt_paddr, VM_PROT_READ|VM_PROT_WRITE);
+ pmap_kenter_pa(idt_vaddr + PAGE_SIZE, idt_paddr + PAGE_SIZE,
+ VM_PROT_READ|VM_PROT_WRITE);
+#endif
idt = (struct gate_descriptor *)idt_vaddr;
gdtstore = (char *)(idt + NIDT);
@@ -1540,9 +1549,11 @@
sizeof (struct gate_descriptor));
/* exceptions */
- for (x = 0; x < 32; x++)
- setgate(&idt[x], IDTVEC(exceptions)[x], 0, SDT_SYS386TGT,
+ for (x = 0; x < 32; x++) {
+ ist = (x == 8) ? 1 : 0;
+ setgate(&idt[x], IDTVEC(exceptions)[x], ist, SDT_SYS386TGT,
(x == 3 || x == 4) ? SEL_UPL : SEL_KPL);
+ }
/* new-style interrupt gate for syscalls */
setgate(&idt[128], &IDTVEC(osyscall), 0, SDT_SYS386TGT, SEL_UPL);
Home |
Main Index |
Thread Index |
Old Index