Date: Thu, 3 Oct 2002 12:13:03 -0700 (PDT) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 18598 for review Message-ID: <200210031913.g93JD36e097384@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=18598 Change 18598 by peter@peter_daintree on 2002/10/03 12:12:48 integrate i386_hammer branch (copy tracked x86 changes to x86-64) Affected files ... .. //depot/projects/hammer/lib/csu/x86_64/crt1.c#3 integrate .. //depot/projects/hammer/sys/x86_64/acpica/OsdEnvironment.c#3 integrate .. //depot/projects/hammer/sys/x86_64/acpica/acpi_machdep.c#4 integrate .. //depot/projects/hammer/sys/x86_64/include/pcb.h#3 integrate .. //depot/projects/hammer/sys/x86_64/include/pcpu.h#2 integrate .. //depot/projects/hammer/sys/x86_64/include/proc.h#3 integrate .. //depot/projects/hammer/sys/x86_64/include/sysarch.h#4 integrate .. //depot/projects/hammer/sys/x86_64/isa/npx.c#12 integrate .. //depot/projects/hammer/sys/x86_64/pci/pci_bus.c#4 integrate .. //depot/projects/hammer/sys/x86_64/pci/pci_cfgreg.c#5 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/legacy.c#3 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#23 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/nexus.c#7 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/pmap.c#6 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/sys_machdep.c#6 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/trap.c#11 integrate Differences ... ==== //depot/projects/hammer/lib/csu/x86_64/crt1.c#3 (text+ko) ==== @@ -100,7 +100,40 @@ monstartup(&eprol, &etext); #endif _init(); +#ifndef __GNUC__ exit( main(argc, argv, env) ); +#else + /* + * Some versions of gcc-2 expect the stack frame to be aligned as + * follows after it is set up in main(): + * + * +--------------+ <--- aligned by PREFERRED_STACK_BOUNDARY + * +%ebp (if any) + + * +--------------+ + * |return address| + * +--------------+ + * | arguments | + * | : | + * | : | + * +--------------+ + * + * We implement the above to fix just the usual case in FreeBSD-4. + * Alignment for main() is too compiler-dependent to handle correctly + * in all cases here (or in the kernel). E.g., a different alignment + * is required for at least gcc-2.95.4 even for the small variation + * of compiling main() with -fomit-frame-pointer. + */ + __asm__(" + andl $~0xf, %%esp # align stack to 16-byte boundary + subl $12+12, %%esp # space for args and padding + movl %0, 0(%%esp) + movl %1, 4(%%esp) + movl %2, 8(%%esp) + call main + movl %%eax, 0(%%esp) + call exit + " : : "r" (argc), "r" (argv), "r" (env) : "ax", "cx", "dx", "memory"); +#endif } #ifdef GCRT @@ -109,4 +142,4 @@ __asm__(".previous"); #endif -__asm__(".ident\t\"$FreeBSD: src/lib/csu/i386-elf/crt1.c,v 1.9 2002/07/16 12:28:49 markm Exp $\""); +__asm__(".ident\t\"$FreeBSD: src/lib/csu/i386-elf/crt1.c,v 1.10 2002/09/29 13:42:27 bde Exp $\""); ==== //depot/projects/hammer/sys/x86_64/acpica/OsdEnvironment.c#3 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/acpica/OsdEnvironment.c,v 1.5 2002/08/22 21:24:00 archie Exp $ + * $FreeBSD: src/sys/i386/acpica/OsdEnvironment.c,v 1.6 2002/09/30 18:45:20 jhb Exp $ */ /* ==== //depot/projects/hammer/sys/x86_64/acpica/acpi_machdep.c#4 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.2 2002/09/06 17:02:01 jhb Exp $ + * $FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.3 2002/09/30 18:45:20 jhb Exp $ */ #include <sys/param.h> ==== //depot/projects/hammer/sys/x86_64/include/pcb.h#3 (text+ko) ==== @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)pcb.h 5.10 (Berkeley) 5/12/91 - * $FreeBSD: src/sys/i386/include/pcb.h,v 1.46 2002/09/16 19:25:41 mini Exp $ + * $FreeBSD: src/sys/i386/include/pcb.h,v 1.47 2002/10/01 14:08:07 phk Exp $ */ #ifndef _I386_PCB_H_ @@ -79,6 +79,9 @@ * core dumps. For the i386: ??? */ struct md_coredump { +#ifdef lint + int dummy; +#endif }; #ifdef _KERNEL ==== //depot/projects/hammer/sys/x86_64/include/pcpu.h#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/include/pcpu.h,v 1.34 2002/07/15 13:29:40 markm Exp $ + * $FreeBSD: src/sys/i386/include/pcpu.h,v 1.35 2002/10/01 14:01:58 phk Exp $ */ #ifndef _MACHINE_PCPU_H_ @@ -31,24 +31,6 @@ #ifdef _KERNEL -#ifndef __GNUC__ - -#ifndef lint -#error gcc or lint is required to use this file -#else /* lint */ -#define __PCPU_PTR(name) -#define __PCPU_GET(name) -#define __PCPU_SET(name, val) -#define PCPU_GET(member) __PCPU_GET(pc_ ## member) -#define PCPU_PTR(member) __PCPU_PTR(pc_ ## member) -#define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val) -#define PCPU_MD_FIELDS \ - int foo; \ - char bar -#endif /* lint */ - -#else /* __GNUC__ */ - #include <machine/segments.h> #include <machine/tss.h> @@ -70,6 +52,16 @@ u_int32_t pc_fpending; /* pending fast interrupts */ \ u_int32_t pc_spending /* pending soft interrupts */ +#if defined(lint) + +extern struct pcpu *pcpup; + +#define PCPU_GET(member) (pcpup->pc_ ## member) +#define PCPU_PTR(member) (&pcpup->pc_ ## member) +#define PCPU_SET(member,value) (pcpup->pc_ ## member = (value)) + +#elif defined(__GNUC__) + /* * Evaluates to the byte offset of the per-cpu variable name. */ @@ -160,7 +152,9 @@ #define PCPU_PTR(member) __PCPU_PTR(pc_ ## member) #define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val) -#endif /* __GNUC__ */ +#else +#error gcc or lint is required to use this file +#endif #endif /* _KERNEL */ ==== //depot/projects/hammer/sys/x86_64/include/proc.h#3 (text+ko) ==== @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)proc.h 7.1 (Berkeley) 5/15/91 - * $FreeBSD: src/sys/i386/include/proc.h,v 1.17 2002/07/10 20:15:58 dillon Exp $ + * $FreeBSD: src/sys/i386/include/proc.h,v 1.18 2002/10/01 14:08:08 phk Exp $ */ #ifndef _MACHINE_PROC_H_ ==== //depot/projects/hammer/sys/x86_64/include/sysarch.h#4 (text+ko) ==== @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/include/sysarch.h,v 1.16 2002/03/20 05:48:58 alfred Exp $ + * $FreeBSD: src/sys/i386/include/sysarch.h,v 1.17 2002/09/28 20:42:04 peter Exp $ */ /* @@ -47,9 +47,9 @@ #define I386_SET_IOPERM 4 /* xxxxx */ struct i386_ldt_args { - int start; + unsigned int start; union descriptor *descs; - int num; + unsigned int num; }; struct i386_ioperm_args { ==== //depot/projects/hammer/sys/x86_64/isa/npx.c#12 (text+ko) ==== @@ -32,7 +32,7 @@ * SUCH DAMAGE. * * from: @(#)npx.c 7.2 (Berkeley) 5/12/91 - * $FreeBSD: src/sys/i386/isa/npx.c,v 1.131 2002/09/16 19:25:59 mini Exp $ + * $FreeBSD: src/sys/i386/isa/npx.c,v 1.132 2002/09/28 17:14:47 phk Exp $ */ #include "opt_debug_npx.h" @@ -184,7 +184,7 @@ /* * Attach routine - announce which it is, and wire into system */ -int +static int npx_attach(dev) device_t dev; { ==== //depot/projects/hammer/sys/x86_64/pci/pci_bus.c#4 (text+ko) ==== @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/pci/pci_bus.c,v 1.91 2002/09/23 18:14:31 jhb Exp $ + * $FreeBSD: src/sys/i386/pci/pci_bus.c,v 1.92 2002/10/02 17:50:38 iwasaki Exp $ * */ @@ -270,6 +270,14 @@ *busnum = nexus_pcib_read_config(0, bus, slot, func, 0x44, 1); break; + /* XXX unknown chipset, but working */ + case 0x00171166: + /* FALLTHROUGH */ + case 0x01011166: + s = "ServerWorks host to PCI bridge(unknown chipset)"; + *busnum = nexus_pcib_read_config(0, bus, slot, func, 0x44, 1); + break; + /* Integrated Micro Solutions -- vendor 0x10e0 */ case 0x884910e0: s = "Integrated Micro Solutions VL Bridge"; ==== //depot/projects/hammer/sys/x86_64/pci/pci_cfgreg.c#5 (text+ko) ==== @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/pci/pci_cfgreg.c,v 1.95 2002/09/23 18:13:42 jhb Exp $ + * $FreeBSD: src/sys/i386/pci/pci_cfgreg.c,v 1.96 2002/09/28 17:36:29 phk Exp $ */ #include <sys/param.h> /* XXX trim includes */ ==== //depot/projects/hammer/sys/x86_64/x86_64/legacy.c#3 (text+ko) ==== @@ -26,7 +26,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/i386/legacy.c,v 1.48 2002/09/23 15:50:06 jhb Exp $ + * $FreeBSD: src/sys/i386/i386/legacy.c,v 1.49 2002/09/30 18:47:11 jhb Exp $ */ /* @@ -53,6 +53,7 @@ #define DEVTOAT(dev) ((struct legacy_device *)device_get_ivars(dev)) +static void legacy_identify(driver_t *driver, device_t parent); static int legacy_probe(device_t); static int legacy_attach(device_t); static int legacy_print_child(device_t, device_t); @@ -70,6 +71,7 @@ static device_method_t legacy_methods[] = { /* Device interface */ + DEVMETHOD(device_identify, legacy_identify), DEVMETHOD(device_probe, legacy_probe), DEVMETHOD(device_attach, legacy_attach), DEVMETHOD(device_detach, bus_generic_detach), @@ -104,10 +106,29 @@ DRIVER_MODULE(legacy, nexus, legacy_driver, legacy_devclass, 0, 0); +static void +legacy_identify(driver_t *driver, device_t parent) +{ + + /* + * Add child device with order of 1 so it gets probed + * after ACPI (which is at order 0. + */ + if (BUS_ADD_CHILD(parent, 1, "legacy", 0) == NULL) + panic("legacy: could not attach"); +} + static int legacy_probe(device_t dev) { + device_t acpi; + /* + * Fail to probe if ACPI is ok. + */ + acpi = devclass_get_device(devclass_find("acpi"), 0); + if (acpi != NULL && device_is_alive(acpi)) + return (ENXIO); device_set_desc(dev, "legacy system"); device_quiet(dev); return (0); ==== //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#23 (text+ko) ==== @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 - * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.538 2002/09/22 01:32:48 mdodd Exp $ + * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.539 2002/09/30 07:02:22 obrien Exp $ */ #include "opt_atalk.h" ==== //depot/projects/hammer/sys/x86_64/x86_64/nexus.c#7 (text+ko) ==== @@ -26,7 +26,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/i386/nexus.c,v 1.48 2002/09/23 16:03:00 jhb Exp $ + * $FreeBSD: src/sys/i386/i386/nexus.c,v 1.49 2002/09/30 18:47:11 jhb Exp $ */ /* @@ -210,14 +210,8 @@ static int nexus_attach(device_t dev) { - device_t child; bus_generic_probe(dev); - if (!devclass_get_device(devclass_find("acpi"), 0)) { - child = BUS_ADD_CHILD(dev, 0, "legacy", 0); - if (child == NULL) - panic("nexus_attach legacy"); - } bus_generic_attach(dev); return 0; } ==== //depot/projects/hammer/sys/x86_64/x86_64/pmap.c#6 (text+ko) ==== @@ -39,7 +39,7 @@ * SUCH DAMAGE. * * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 - * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.364 2002/08/25 04:20:02 alc Exp $ + * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.367 2002/10/02 07:44:21 scottl Exp $ */ /* @@ -442,7 +442,7 @@ } } -void * +static void * pmap_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) { *flags = UMA_SLAB_PRIV; @@ -791,29 +791,39 @@ return m; } +#ifndef KSTACK_MAX_PAGES +#define KSTACK_MAX_PAGES 32 +#endif + /* * Create the kernel stack (including pcb for i386) for a new thread. * This routine directly affects the fork perf for a process and * create performance for a thread. */ void -pmap_new_thread(struct thread *td) +pmap_new_thread(struct thread *td, int pages) { int i; - vm_page_t ma[KSTACK_PAGES]; + vm_page_t ma[KSTACK_MAX_PAGES]; vm_object_t ksobj; vm_page_t m; vm_offset_t ks; + /* Bounds check */ + if (pages <= 1) + pages = KSTACK_PAGES; + else if (pages > KSTACK_MAX_PAGES) + pages = KSTACK_MAX_PAGES; + /* * allocate object for the kstack */ - ksobj = vm_object_allocate(OBJT_DEFAULT, KSTACK_PAGES); + ksobj = vm_object_allocate(OBJT_DEFAULT, pages); td->td_kstack_obj = ksobj; /* get a kernel virtual address for the kstack for this thread */ #ifdef KSTACK_GUARD - ks = kmem_alloc_nofault(kernel_map, (KSTACK_PAGES + 1) * PAGE_SIZE); + ks = kmem_alloc_nofault(kernel_map, (pages + 1) * PAGE_SIZE); if (ks == 0) panic("pmap_new_thread: kstack allocation failed"); if (*vtopte(ks) != 0) @@ -822,16 +832,22 @@ td->td_kstack = ks; #else /* get a kernel virtual address for the kstack for this thread */ - ks = kmem_alloc_nofault(kernel_map, KSTACK_PAGES * PAGE_SIZE); + ks = kmem_alloc_nofault(kernel_map, pages * PAGE_SIZE); if (ks == 0) panic("pmap_new_thread: kstack allocation failed"); td->td_kstack = ks; #endif + /* + * Knowing the number of pages allocated is useful when you + * want to deallocate them. + */ + td->td_kstack_pages = pages; + /* * For the length of the stack, link in a real page of ram for each * page of stack. */ - for (i = 0; i < KSTACK_PAGES; i++) { + for (i = 0; i < pages; i++) { /* * Get a kernel stack page */ @@ -843,7 +859,7 @@ vm_page_flag_clear(m, PG_ZERO); m->valid = VM_PAGE_BITS_ALL; } - pmap_qenter(ks, ma, KSTACK_PAGES); + pmap_qenter(ks, ma, pages); } /* @@ -855,14 +871,16 @@ struct thread *td; { int i; + int pages; vm_object_t ksobj; vm_offset_t ks; vm_page_t m; + pages = td->td_kstack_pages; ksobj = td->td_kstack_obj; ks = td->td_kstack; - pmap_qremove(ks, KSTACK_PAGES); - for (i = 0; i < KSTACK_PAGES; i++) { + pmap_qremove(ks, pages); + for (i = 0; i < pages; i++) { m = vm_page_lookup(ksobj, i); if (m == NULL) panic("pmap_dispose_thread: kstack already missing?"); @@ -877,14 +895,44 @@ * address map. */ #ifdef KSTACK_GUARD - kmem_free(kernel_map, ks - PAGE_SIZE, (KSTACK_PAGES + 1) * PAGE_SIZE); + kmem_free(kernel_map, ks - PAGE_SIZE, (pages + 1) * PAGE_SIZE); #else - kmem_free(kernel_map, ks, KSTACK_PAGES * PAGE_SIZE); + kmem_free(kernel_map, ks, pages * PAGE_SIZE); #endif vm_object_deallocate(ksobj); } /* + * Set up a variable sized alternate kstack. Though it may look MI, it may + * need to be different on certain arches like ia64. + */ +void +pmap_new_altkstack(struct thread *td, int pages) +{ + /* shuffle the original stack */ + td->td_altkstack_obj = td->td_kstack_obj; + td->td_altkstack = td->td_kstack; + td->td_altkstack_pages = td->td_kstack_pages; + + pmap_new_thread(td, pages); +} + +void +pmap_dispose_altkstack(td) + struct thread *td; +{ + pmap_dispose_thread(td); + + /* restore the original kstack */ + td->td_kstack = td->td_altkstack; + td->td_kstack_obj = td->td_altkstack_obj; + td->td_kstack_pages = td->td_altkstack_pages; + td->td_altkstack = 0; + td->td_altkstack_obj = NULL; + td->td_altkstack_pages = 0; +} + +/* * Allow the Kernel stack for a thread to be prejudicially paged out. */ void @@ -892,14 +940,16 @@ struct thread *td; { int i; + int pages; vm_object_t ksobj; vm_offset_t ks; vm_page_t m; + pages = td->td_kstack_pages; ksobj = td->td_kstack_obj; ks = td->td_kstack; - pmap_qremove(ks, KSTACK_PAGES); - for (i = 0; i < KSTACK_PAGES; i++) { + pmap_qremove(ks, pages); + for (i = 0; i < pages; i++) { m = vm_page_lookup(ksobj, i); if (m == NULL) panic("pmap_swapout_thread: kstack already missing?"); @@ -918,14 +968,16 @@ struct thread *td; { int i, rv; - vm_page_t ma[KSTACK_PAGES]; + int pages; + vm_page_t ma[KSTACK_MAX_PAGES]; vm_object_t ksobj; vm_offset_t ks; vm_page_t m; + pages = td->td_kstack_pages; ksobj = td->td_kstack_obj; ks = td->td_kstack; - for (i = 0; i < KSTACK_PAGES; i++) { + for (i = 0; i < pages; i++) { m = vm_page_grab(ksobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY); if (m->valid != VM_PAGE_BITS_ALL) { rv = vm_pager_get_pages(ksobj, &m, 1, 0); @@ -940,7 +992,7 @@ vm_page_wakeup(m); vm_page_unlock_queues(); } - pmap_qenter(ks, ma, KSTACK_PAGES); + pmap_qenter(ks, ma, pages); } /*************************************************** @@ -2308,9 +2360,9 @@ #define PAGEORDER_SIZE (PFBAK+PFFOR) static int pmap_prefault_pageorder[] = { - -PAGE_SIZE, PAGE_SIZE, + -1 * PAGE_SIZE, 1 * PAGE_SIZE, -2 * PAGE_SIZE, 2 * PAGE_SIZE, - -3 * PAGE_SIZE, 3 * PAGE_SIZE + -3 * PAGE_SIZE, 3 * PAGE_SIZE, -4 * PAGE_SIZE, 4 * PAGE_SIZE }; ==== //depot/projects/hammer/sys/x86_64/x86_64/sys_machdep.c#6 (text+ko) ==== @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)sys_machdep.c 5.5 (Berkeley) 1/19/91 - * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.71 2002/04/01 21:30:41 jhb Exp $ + * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.73 2002/09/28 22:44:45 peter Exp $ * */ @@ -363,7 +363,7 @@ num = min(uap->num, nldt); lp = &ldt[uap->start]; } - if (uap->start > nldt) + if (uap->start + num > nldt) return(EINVAL); error = copyout(lp, uap->descs, num * sizeof(union descriptor)); @@ -383,8 +383,9 @@ struct mdproc *mdp = &td->td_proc->p_md; struct proc_ldt *pldt = mdp->md_ldt; struct i386_ldt_args ua, *uap = &ua; + union descriptor *descs; caddr_t old_ldt_base; - int old_ldt_len; + int descs_size, old_ldt_len; register_t savecrit; if ((error = copyin(args, uap, sizeof(struct i386_ldt_args))) < 0) @@ -428,17 +429,23 @@ mtx_unlock_spin(&sched_lock); } + descs_size = uap->num * sizeof(union descriptor); + descs = (union descriptor *)kmem_alloc(kernel_map, descs_size); + if (descs == NULL) + return (ENOMEM); + error = copyin(&uap->descs[0], descs, descs_size); + if (error) { + kmem_free(kernel_map, (vm_offset_t)descs, descs_size); + return (error); + } /* Check descriptors for access violations */ for (i = 0, n = uap->start; i < uap->num; i++, n++) { - union descriptor desc, *dp; - dp = &uap->descs[i]; - error = copyin(dp, &desc, sizeof(union descriptor)); - if (error) - return(error); + union descriptor *dp; + dp = &descs[i]; - switch (desc.sd.sd_type) { + switch (dp->sd.sd_type) { case SDT_SYSNULL: /* system null */ - desc.sd.sd_p = 0; + dp->sd.sd_p = 0; break; case SDT_SYS286TSS: /* system 286 TSS available */ case SDT_SYSLDT: /* system local descriptor table */ @@ -459,6 +466,7 @@ * to create a segment of these types. They are * for OS use only. */ + kmem_free(kernel_map, (vm_offset_t)descs, descs_size); return EACCES; /*NOTREACHED*/ @@ -468,8 +476,11 @@ case SDT_MEMERC: /* memory execute read conforming */ case SDT_MEMERAC: /* memory execute read accessed conforming */ /* Must be "present" if executable and conforming. */ - if (desc.sd.sd_p == 0) + if (dp->sd.sd_p == 0) { + kmem_free(kernel_map, (vm_offset_t)descs, + descs_size); return (EACCES); + } break; case SDT_MEMRO: /* memory read only */ case SDT_MEMROA: /* memory read only accessed */ @@ -485,24 +496,26 @@ case SDT_MEMERA: /* memory execute read accessed */ break; default: + kmem_free(kernel_map, (vm_offset_t)descs, descs_size); return(EINVAL); /*NOTREACHED*/ } /* Only user (ring-3) descriptors may be present. */ - if ((desc.sd.sd_p != 0) && (desc.sd.sd_dpl != SEL_UPL)) + if ((dp->sd.sd_p != 0) && (dp->sd.sd_dpl != SEL_UPL)) { + kmem_free(kernel_map, (vm_offset_t)descs, descs_size); return (EACCES); + } } /* Fill in range */ savecrit = intr_disable(); - error = copyin(uap->descs, + bcopy(uap->descs, &((union descriptor *)(pldt->ldt_base))[uap->start], uap->num * sizeof(union descriptor)); - if (!error) - td->td_retval[0] = uap->start; + td->td_retval[0] = uap->start; intr_restore(savecrit); - - return(error); + kmem_free(kernel_map, (vm_offset_t)descs, descs_size); + return (0); } #endif ==== //depot/projects/hammer/sys/x86_64/x86_64/trap.c#11 (text+ko) ==== @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 - * $FreeBSD: src/sys/i386/i386/trap.c,v 1.233 2002/09/16 19:25:08 mini Exp $ + * $FreeBSD: src/sys/i386/i386/trap.c,v 1.234 2002/09/28 17:14:46 phk Exp $ */ /* @@ -576,7 +576,7 @@ return; } -int +static int trap_pfault(frame, usermode, eva) struct trapframe *frame; int usermode; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200210031913.g93JD36e097384>