From owner-p4-projects Sat Sep 21 21:56:52 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 60BDF37B404; Sat, 21 Sep 2002 21:56:39 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0E89137B401 for ; Sat, 21 Sep 2002 21:56:39 -0700 (PDT) Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8BCBE43E6E for ; Sat, 21 Sep 2002 21:56:38 -0700 (PDT) (envelope-from peter@freebsd.org) Received: from freefall.freebsd.org (perforce@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.6/8.12.6) with ESMTP id g8M4ucCo004720 for ; Sat, 21 Sep 2002 21:56:38 -0700 (PDT) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by freefall.freebsd.org (8.12.6/8.12.6/Submit) id g8M4uciP004717 for perforce@freebsd.org; Sat, 21 Sep 2002 21:56:38 -0700 (PDT) Date: Sat, 21 Sep 2002 21:56:38 -0700 (PDT) Message-Id: <200209220456.g8M4uciP004717@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm Subject: PERFORCE change 17910 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://people.freebsd.org/~peter/p4db/chv.cgi?CH=17910 Change 17910 by peter@peter_overcee on 2002/09/21 21:55:54 integrate i386_hammer branch to pick up some i386 changes I want. Affected files ... .. //depot/projects/hammer/sys/x86_64/include/cpufunc.h#3 integrate .. //depot/projects/hammer/sys/x86_64/include/segments.h#5 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/autoconf.c#4 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#20 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/mem.c#3 integrate .. //depot/projects/hammer/sys/x86_64/x86_64/support.s#5 integrate Differences ... ==== //depot/projects/hammer/sys/x86_64/include/cpufunc.h#3 (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/cpufunc.h,v 1.129 2002/09/21 18:26:53 markm Exp $ + * $FreeBSD: src/sys/i386/include/cpufunc.h,v 1.130 2002/09/22 04:45:21 peter Exp $ */ /* @@ -46,6 +46,7 @@ #include struct thread; +struct region_descriptor; __BEGIN_DECLS #define readb(va) (*(volatile u_int8_t *) (va)) @@ -468,6 +469,27 @@ __asm __volatile("movl %0,%%gs" : : "rm" (sel)); } +/* void lidt(struct region_descriptor *addr); */ +static __inline void +lidt(struct region_descriptor *addr) +{ + __asm __volatile("lidt (%0)" : : "r" (addr)); +} + +/* void lldt(u_short sel); */ +static __inline void +lldt(u_short sel) +{ + __asm __volatile("lldt %0" : : "r" (sel)); +} + +/* void ltr(u_short sel); */ +static __inline void +ltr(u_short sel) +{ + __asm __volatile("ltr %0" : : "r" (sel)); +} + static __inline u_int rdr0(void) { @@ -622,6 +644,10 @@ void load_cr4(u_int cr4); void load_fs(u_int sel); void load_gs(u_int sel); +struct region_descriptor; +void lidt(struct region_descriptor *addr); +void lldt(u_short sel); +void ltr(u_short sel); void outb(u_int port, u_char data); void outl(u_int port, u_int data); void outsb(u_int port, void *addr, size_t cnt); @@ -663,7 +689,6 @@ #endif /* __GNUC__ */ -void ltr(u_short sel); void reset_dbregs(void); __END_DECLS ==== //depot/projects/hammer/sys/x86_64/include/segments.h#5 (text+ko) ==== @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)segments.h 7.1 (Berkeley) 5/9/91 - * $FreeBSD: src/sys/i386/include/segments.h,v 1.29 2002/03/23 15:09:35 bde Exp $ + * $FreeBSD: src/sys/i386/include/segments.h,v 1.30 2002/09/22 04:45:21 peter Exp $ */ #ifndef _MACHINE_SEGMENTS_H_ @@ -224,8 +224,6 @@ extern union descriptor ldt[NLDT]; void lgdt(struct region_descriptor *rdp); -void lidt(struct region_descriptor *rdp); -void lldt(u_short sel); void sdtossd(struct segment_descriptor *sdp, struct soft_segment_descriptor *ssdp); void ssdtosd(struct soft_segment_descriptor *ssdp, ==== //depot/projects/hammer/sys/x86_64/x86_64/autoconf.c#4 (text+ko) ==== @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)autoconf.c 7.1 (Berkeley) 5/9/91 - * $FreeBSD: src/sys/i386/i386/autoconf.c,v 1.169 2002/09/20 17:59:09 phk Exp $ + * $FreeBSD: src/sys/i386/i386/autoconf.c,v 1.170 2002/09/22 00:59:01 jake Exp $ */ /* @@ -61,7 +61,6 @@ #include #include -#if defined(NFSCLIENT) && defined(NFS_ROOT) #include #include #include @@ -73,7 +72,6 @@ #include #include #include -#endif #include #include @@ -88,10 +86,6 @@ static void configure(void *); static void configure_final(void *); -#if defined(NFSCLIENT) && defined(NFS_ROOT) && !defined(BOOTP_NFSROOT) -static void pxe_setup_nfsdiskless(void); -#endif - SYSINIT(configure1, SI_SUB_CONFIGURE, SI_ORDER_FIRST, configure_first, NULL); /* SI_ORDER_SECOND is hookable */ SYSINIT(configure2, SI_SUB_CONFIGURE, SI_ORDER_THIRD, configure, NULL); @@ -175,184 +169,10 @@ #endif #if defined(NFSCLIENT) && defined(NFS_ROOT) #if !defined(BOOTP_NFSROOT) - pxe_setup_nfsdiskless(); + nfs_setup_diskless(); if (nfs_diskless_valid) #endif rootdevnames[0] = "nfs:"; #endif } SYSINIT(cpu_rootconf, SI_SUB_ROOT_CONF, SI_ORDER_FIRST, cpu_rootconf, NULL) - -#if defined(NFSCLIENT) && defined(NFS_ROOT) && !defined(BOOTP_NFSROOT) - -static int -inaddr_to_sockaddr(char *ev, struct sockaddr_in *sa) -{ - u_int32_t a[4]; - char *cp; - int count; - - bzero(sa, sizeof(*sa)); - sa->sin_len = sizeof(*sa); - sa->sin_family = AF_INET; - - if ((cp = getenv(ev)) == NULL) - return(1); - count = sscanf(cp, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]); - freeenv(cp); - if (count != 4) - return(1); - /* XXX is this ordering correct? */ - sa->sin_addr.s_addr = (a[3] << 24) + (a[2] << 16) + (a[1] << 8) + a[0]; - return(0); -} - -static int -hwaddr_to_sockaddr(char *ev, struct sockaddr_dl *sa) -{ - char *cp; - u_int32_t a[6]; - int count; - - bzero(sa, sizeof(*sa)); - sa->sdl_len = sizeof(*sa); - sa->sdl_family = AF_LINK; - sa->sdl_type = IFT_ETHER; - sa->sdl_alen = ETHER_ADDR_LEN; - if ((cp = getenv(ev)) == NULL) - return(1); - count = sscanf(cp, "%x:%x:%x:%x:%x:%x", - &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); - freeenv(cp); - if (count != 6) - return(1); - sa->sdl_data[0] = a[0]; - sa->sdl_data[1] = a[1]; - sa->sdl_data[2] = a[2]; - sa->sdl_data[3] = a[3]; - sa->sdl_data[4] = a[4]; - sa->sdl_data[5] = a[5]; - return(0); -} - -static int -decode_nfshandle(char *ev, u_char *fh) -{ - u_char *cp, *ep; - int len, val; - - ep = cp = getenv(ev); - if (cp == NULL) - return(0); - if ((strlen(cp) < 2) || (*cp != 'X')) { - freeenv(ep); - return (0); - } - len = 0; - cp++; - for (;;) { - if (*cp == 'X') { - freeenv(ep); - return(len); - } - if ((sscanf(cp, "%2x", &val) != 1) || (val > 0xff)) { - freeenv(ep); - return(0); - } - *(fh++) = val; - len++; - cp += 2; - if (len > NFSX_V2FH) { - freeenv(ep); - return(0); - } - } -} - -/* - * Populate the essential fields in the nfsv3_diskless structure. - * - * The loader is expected to export the following environment variables: - * - * boot.netif.ip IP address on boot interface - * boot.netif.netmask netmask on boot interface - * boot.netif.gateway default gateway (optional) - * boot.netif.hwaddr hardware address of boot interface - * boot.nfsroot.server IP address of root filesystem server - * boot.nfsroot.path path of the root filesystem on server - * boot.nfsroot.nfshandle NFS handle for root filesystem on server - */ -static void -pxe_setup_nfsdiskless(void) -{ - struct nfs_diskless *nd = &nfs_diskless; - struct ifnet *ifp; - struct ifaddr *ifa; - struct sockaddr_dl *sdl, ourdl; - struct sockaddr_in myaddr, netmask; - char *cp; - - /* set up interface */ - if (inaddr_to_sockaddr("boot.netif.ip", &myaddr)) - return; - if (inaddr_to_sockaddr("boot.netif.netmask", &netmask)) { - printf("PXE: no netmask\n"); - return; - } - bcopy(&myaddr, &nd->myif.ifra_addr, sizeof(myaddr)); - bcopy(&myaddr, &nd->myif.ifra_broadaddr, sizeof(myaddr)); - ((struct sockaddr_in *) &nd->myif.ifra_broadaddr)->sin_addr.s_addr = - myaddr.sin_addr.s_addr | ~ netmask.sin_addr.s_addr; - bcopy(&netmask, &nd->myif.ifra_mask, sizeof(netmask)); - - if (hwaddr_to_sockaddr("boot.netif.hwaddr", &ourdl)) { - printf("PXE: no hardware address\n"); - return; - } - ifa = NULL; - TAILQ_FOREACH(ifp, &ifnet, if_link) { - TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { - if ((ifa->ifa_addr->sa_family == AF_LINK) && - (sdl = ((struct sockaddr_dl *)ifa->ifa_addr))) { - if ((sdl->sdl_type == ourdl.sdl_type) && - (sdl->sdl_alen == ourdl.sdl_alen) && - !bcmp(sdl->sdl_data + sdl->sdl_nlen, - ourdl.sdl_data + ourdl.sdl_nlen, - sdl->sdl_alen)) - goto match_done; - } - } - } - printf("PXE: no interface\n"); - return; /* no matching interface */ -match_done: - sprintf(nd->myif.ifra_name, "%s%d", ifp->if_name, ifp->if_unit); - - - /* set up gateway */ - inaddr_to_sockaddr("boot.netif.gateway", &nd->mygateway); - - /* XXX set up swap? */ - - /* set up root mount */ - nd->root_args.rsize = 8192; /* XXX tunable? */ - nd->root_args.wsize = 8192; - nd->root_args.sotype = SOCK_DGRAM; - nd->root_args.flags = (NFSMNT_WSIZE | NFSMNT_RSIZE | NFSMNT_RESVPORT); - if (inaddr_to_sockaddr("boot.nfsroot.server", &nd->root_saddr)) { - printf("PXE: no server\n"); - return; - } - nd->root_saddr.sin_port = htons(NFS_PORT); - if (decode_nfshandle("boot.nfsroot.nfshandle", &nd->root_fh[0]) == 0) { - printf("PXE: no NFS handle\n"); - return; - } - if ((cp = getenv("boot.nfsroot.path")) != NULL) { - strncpy(nd->root_hostnam, cp, MNAMELEN - 1); - freeenv(cp); - } - - nfs_diskless_valid = 1; -} -#endif ==== //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#20 (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.537 2002/09/20 17:50:53 phk Exp $ + * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.538 2002/09/22 01:32:48 mdodd Exp $ */ #include "opt_atalk.h" @@ -508,6 +508,10 @@ struct trapframe *regs = td->td_frame; struct pcb *pcb = td->td_pcb; + /* Reset pc->pcb_gs and %gs before possibly invalidating it. */ + pcb->pcb_gs = _udatasel; + load_gs(_udatasel); + if (td->td_proc->p_md.md_ldt) user_ldt_free(td); @@ -524,19 +528,6 @@ /* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */ regs->tf_ebx = ps_strings; - /* reset %gs as well */ - if (pcb == PCPU_GET(curpcb)) - load_gs(_udatasel); - - /* - * Always reset pcb->pcb_gs to udatasel, it will be loaded into gs - * by cpu_switch_load_gs when this process returns from the system - * call. Failing to reset pcb_gs here can cause cpu_switch_load_gs - * to trigger a general protection fault if the parent process had - * modified gs to point at a LDT entry. - */ - pcb->pcb_gs = _udatasel; - /* * Reset the hardware debug registers if they were in use. * They won't have any meaning for the newly exec'd process. ==== //depot/projects/hammer/sys/x86_64/x86_64/mem.c#3 (text+ko) ==== @@ -38,7 +38,7 @@ * * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 - * $FreeBSD: src/sys/i386/i386/mem.c,v 1.97 2002/08/03 00:59:15 peter Exp $ + * $FreeBSD: src/sys/i386/i386/mem.c,v 1.98 2002/09/21 19:02:17 markm Exp $ */ /* @@ -182,19 +182,17 @@ eaddr = round_page(uio->uio_offset + c); if (addr < (vm_offset_t)VADDR(PTDPTDI, 0)) - return EFAULT; + return (EFAULT); if (eaddr >= (vm_offset_t)VADDR(APTDPTDI, 0)) - return EFAULT; + return (EFAULT); for (; addr < eaddr; addr += PAGE_SIZE) - if (pmap_extract(kernel_pmap, addr) == 0) { - return EFAULT; - } + if (pmap_extract(kernel_pmap, addr) == 0) + return (EFAULT); if (!kernacc((caddr_t)(int)uio->uio_offset, c, uio->uio_rw == UIO_READ ? - VM_PROT_READ : VM_PROT_WRITE)) { + VM_PROT_READ : VM_PROT_WRITE)) return (EFAULT); - } error = uiomove((caddr_t)(int)uio->uio_offset, (int)c, uio); continue; } @@ -221,14 +219,14 @@ /* minor device 0 is physical memory */ case 0: - return i386_btop(offset); + return (i386_btop(offset)); /* minor device 1 is kernel memory */ case 1: - return i386_btop(vtophys(offset)); + return (i386_btop(vtophys(offset))); default: - return -1; + return (-1); } } @@ -270,9 +268,9 @@ error = copyout(md, mo->mo_desc, nd * sizeof(struct mem_range_desc)); free(md, M_MEMDESC); - } else { + } + else nd = mem_range_softc.mr_ndesc; - } mo->mo_arg[0] = nd; break; @@ -301,13 +299,11 @@ if (mem_range_softc.mr_op == NULL) return (EOPNOTSUPP); - if (*arg == 0) { + if (*arg == 0) *arg = mem_range_softc.mr_ndesc; - } - else { + else bcopy(mem_range_softc.mr_desc, mrd, (*arg) * sizeof(struct mem_range_desc)); - } return (0); } @@ -338,19 +334,19 @@ 0640, "kmem"); iodev = make_dev(&mem_cdevsw, 14, UID_ROOT, GID_WHEEL, 0600, "io"); - return 0; + return (0); case MOD_UNLOAD: destroy_dev(memdev); destroy_dev(kmemdev); destroy_dev(iodev); - return 0; + return (0); case MOD_SHUTDOWN: - return 0; + return (0); default: - return EOPNOTSUPP; + return (EOPNOTSUPP); } } ==== //depot/projects/hammer/sys/x86_64/x86_64/support.s#5 (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/i386/support.s,v 1.92 2002/09/16 19:25:08 mini Exp $ + * $FreeBSD: src/sys/i386/i386/support.s,v 1.93 2002/09/22 04:45:20 peter Exp $ */ #include @@ -656,27 +656,6 @@ pushq %rax lretq -/* - * void lidt(struct region_descriptor *rdp); - */ -ENTRY(lidt) - lidt (%rdi) - ret - -/* - * void lldt(u_short sel) - */ -ENTRY(lldt) - lldt %di - ret - -/* - * void ltr(u_short sel) - */ -ENTRY(ltr) - ltr %di - ret - /* void reset_dbregs() */ ENTRY(reset_dbregs) movl $0,%eax To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message