Module Name: src Committed By: maxv Date: Sat Jun 17 09:32:53 UTC 2017
Modified Files: src/sys/arch/i386/i386: gdt.c Log Message: Remove dead and broken code. It is not a bad idea to implement USER_LDT on Xen, but it certainly shouldn't be done this way. To generate a diff of this commit: cvs rdiff -u -r1.60 -r1.61 src/sys/arch/i386/i386/gdt.c 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/i386/i386/gdt.c diff -u src/sys/arch/i386/i386/gdt.c:1.60 src/sys/arch/i386/i386/gdt.c:1.61 --- src/sys/arch/i386/i386/gdt.c:1.60 Wed Feb 8 18:53:01 2017 +++ src/sys/arch/i386/i386/gdt.c Sat Jun 17 09:32:53 2017 @@ -1,6 +1,6 @@ -/* $NetBSD: gdt.c,v 1.60 2017/02/08 18:53:01 kre Exp $ */ +/* $NetBSD: gdt.c,v 1.61 2017/06/17 09:32:53 maxv Exp $ */ -/*- +/* * Copyright (c) 1996, 1997, 2009 The NetBSD Foundation, Inc. * All rights reserved. * @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gdt.c,v 1.60 2017/02/08 18:53:01 kre Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gdt.c,v 1.61 2017/06/17 09:32:53 maxv Exp $"); #include "opt_multiprocessor.h" #include "opt_xen.h" @@ -45,28 +45,20 @@ __KERNEL_RCSID(0, "$NetBSD: gdt.c,v 1.60 #include <machine/gdt.h> -#ifndef XEN -int gdt_size[1]; /* total number of GDT entries */ -int gdt_count[1]; /* number of GDT entries in use */ -int gdt_next[1]; /* next available slot for sweeping */ -int gdt_free[1]; /* next free slot; terminated with GNULL_SEL */ -#else -int gdt_size[2]; /* total number of GDT entries */ -int gdt_count[2]; /* number of GDT entries in use */ -int gdt_next[2]; /* next available slot for sweeping */ -int gdt_free[2]; /* next free slot; terminated with GNULL_SEL */ -#endif +int gdt_size; /* total number of GDT entries */ +int gdt_count; /* number of GDT entries in use */ +int gdt_next; /* next available slot for sweeping */ +int gdt_free; /* next free slot; terminated with GNULL_SEL */ +#ifndef XEN static int ldt_count; /* number of LDTs */ static int ldt_max = 1000;/* max number of LDTs */ - -#ifndef XEN static void setgdt(int, const void *, size_t, int, int, int, int); +static int gdt_get_slot(void); +static void gdt_put_slot(int); +static void gdt_grow(void); #endif void gdt_init(void); -static void gdt_grow(int); -static int gdt_get_slot1(int); -static void gdt_put_slot1(int, int); void update_descriptor(union descriptor *table, union descriptor *entry) @@ -96,12 +88,6 @@ setgdt(int sel, const void *base, size_t CPU_INFO_ITERATOR cii; struct cpu_info *ci; -#ifdef XEN - if (type == SDT_SYS386TSS) { - /* printk("XXX TSS descriptor not supported in GDT\n"); */ - return; - } -#endif setsegment(sd, base, limit, type, dpl, def32, gran); for (CPU_INFO_FOREACH(cii, ci)) { if (ci->ci_gdt != NULL) @@ -127,17 +113,10 @@ gdt_init(void) max_len = MAXGDTSIZ * sizeof(gdtstore[0]); min_len = MINGDTSIZ * sizeof(gdtstore[0]); - gdt_size[0] = MINGDTSIZ; - gdt_count[0] = NGDT; - gdt_next[0] = NGDT; - gdt_free[0] = GNULL_SEL; -#ifdef XEN - max_len = max_len * 2; - gdt_size[1] = 0; - gdt_count[1] = MAXGDTSIZ; - gdt_next[1] = MAXGDTSIZ; - gdt_free[1] = GNULL_SEL; -#endif + gdt_size = MINGDTSIZ; + gdt_count = NGDT; + gdt_next = NGDT; + gdt_free = GNULL_SEL; old_gdt = gdtstore; gdtstore = (union descriptor *)uvm_km_alloc(kernel_map, max_len, @@ -185,7 +164,7 @@ gdt_alloc_cpu(struct cpu_info *ci) } pmap_update(pmap_kernel()); memset(ci->ci_gdt, 0, min_len); - memcpy(ci->ci_gdt, gdtstore, gdt_count[0] * sizeof(gdtstore[0])); + memcpy(ci->ci_gdt, gdtstore, gdt_count * sizeof(gdtstore[0])); setsegment(&ci->ci_gdt[GCPU_SEL].sd, ci, sizeof(struct cpu_info) - 1, SDT_MEMRWA, SEL_KPL, 1, 0); } @@ -205,7 +184,7 @@ gdt_init_cpu(struct cpu_info *ci) setregion(®ion, ci->ci_gdt, max_len - 1); lgdt(®ion); #else - size_t len = gdt_size[0] * sizeof(gdtstore[0]); + size_t len = gdt_size * sizeof(gdtstore[0]); unsigned long frames[len >> PAGE_SHIFT]; vaddr_t va; pt_entry_t *ptp; @@ -229,19 +208,20 @@ gdt_init_cpu(struct cpu_info *ci) } } - if (HYPERVISOR_set_gdt(frames, gdt_size[0])) + if (HYPERVISOR_set_gdt(frames, gdt_size)) panic("HYPERVISOR_set_gdt failed!\n"); lgdt_finish(); #endif } +#ifndef XEN /* * Grow the GDT. The GDT is present on each CPU, so we need to iterate over all * of them. We already have the virtual memory, we only need to grow the * physical memory. */ void -gdt_grow(int which) +gdt_grow(void) { size_t old_len, new_len; CPU_INFO_ITERATOR cii; @@ -249,33 +229,10 @@ gdt_grow(int which) struct vm_page *pg; vaddr_t va; - old_len = gdt_size[which] * sizeof(gdtstore[0]); - gdt_size[which] <<= 1; + old_len = gdt_size * sizeof(gdtstore[0]); + gdt_size <<= 1; new_len = old_len << 1; -#ifdef XEN - if (which != 0) { - size_t max_len = MAXGDTSIZ * sizeof(gdtstore[0]); - if (old_len == 0) { - gdt_size[which] = MINGDTSIZ; - new_len = gdt_size[which] * sizeof(gdtstore[0]); - } - for (CPU_INFO_FOREACH(cii, ci)) { - for(va = (vaddr_t)(ci->ci_gdt) + old_len + max_len; - va < (vaddr_t)(ci->ci_gdt) + new_len + max_len; - va += PAGE_SIZE) { - while ((pg = uvm_pagealloc(NULL, 0, NULL, UVM_PGA_ZERO)) - == NULL) { - uvm_wait("gdt_grow"); - } - pmap_kenter_pa(va, VM_PAGE_TO_PHYS(pg), - VM_PROT_READ | VM_PROT_WRITE, 0); - } - } - return; - } -#endif - for (CPU_INFO_FOREACH(cii, ci)) { for (va = (vaddr_t)(ci->ci_gdt) + old_len; va < (vaddr_t)(ci->ci_gdt) + new_len; @@ -300,78 +257,54 @@ gdt_grow(int which) * 3) As a last resort, we increase the size of the GDT, and sweep through * the new slots. */ - -#ifndef XEN static int gdt_get_slot(void) { - - KASSERT(mutex_owned(&cpu_lock)); - - return gdt_get_slot1(0); -} -#endif - -static int -gdt_get_slot1(int which) -{ int slot; size_t offset; KASSERT(mutex_owned(&cpu_lock)); - if (gdt_free[which] != GNULL_SEL) { - slot = gdt_free[which]; - gdt_free[which] = gdtstore[slot].gd.gd_selector; + if (gdt_free != GNULL_SEL) { + slot = gdt_free; + gdt_free = gdtstore[slot].gd.gd_selector; } else { - offset = which * MAXGDTSIZ * sizeof(gdtstore[0]); - if (gdt_next[which] != gdt_count[which] + offset) + offset = 0; + if (gdt_next != gdt_count + offset) panic("gdt_get_slot botch 1"); - if (gdt_next[which] - offset >= gdt_size[which]) { - if (gdt_size[which] >= MAXGDTSIZ) + if (gdt_next - offset >= gdt_size) { + if (gdt_size >= MAXGDTSIZ) panic("gdt_get_slot botch 2"); - gdt_grow(which); + gdt_grow(); } - slot = gdt_next[which]++; + slot = gdt_next++; } - gdt_count[which]++; + gdt_count++; return (slot); } /* * Deallocate a GDT slot, putting it on the free list. */ -#ifndef XEN static void gdt_put_slot(int slot) { - - KASSERT(mutex_owned(&cpu_lock)); - - gdt_put_slot1(slot, 0); -} -#endif - -static void -gdt_put_slot1(int slot, int which) -{ union descriptor d; d.raw[0] = 0; d.raw[1] = 0; KASSERT(mutex_owned(&cpu_lock)); - gdt_count[which]--; + gdt_count--; d.gd.gd_type = SDT_SYSNULL; - d.gd.gd_selector = gdt_free[which]; + d.gd.gd_selector = gdt_free; update_descriptor(&gdtstore[slot], &d); - gdt_free[which] = slot; + gdt_free = slot; } -#ifndef XEN int tss_alloc(const struct i386tss *tss) { @@ -394,7 +327,6 @@ tss_free(int sel) gdt_put_slot(IDXSEL(sel)); mutex_exit(&cpu_lock); } -#endif int ldt_alloc(union descriptor *ldtp, size_t len) @@ -408,15 +340,8 @@ ldt_alloc(union descriptor *ldtp, size_t } ldt_count++; -#ifndef XEN slot = gdt_get_slot(); setgdt(slot, ldtp, len - 1, SDT_SYSLDT, SEL_KPL, 0, 0); -#else - slot = gdt_get_slot1(1); - cpu_info_primary.ci_gdt[slot].ld.ld_base = (uint32_t)ldtp; - cpu_info_primary.ci_gdt[slot].ld.ld_entries = - len / sizeof(union descriptor); -#endif return GSEL(slot, SEL_KPL); } @@ -430,10 +355,7 @@ ldt_free(int sel) KASSERT(ldt_count > 0); slot = IDXSEL(sel); -#ifndef XEN gdt_put_slot(slot); -#else - gdt_put_slot1(slot, 1); -#endif ldt_count--; } +#endif