Date: Sun, 8 Jan 2006 21:43:53 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 89382 for review Message-ID: <200601082143.k08LhrTR067150@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=89382 Change 89382 by kmacy@kmacy:freebsd7_xen3 on 2006/01/08 21:43:38 remove unused / unloved NFS_ROOT code remove unusable debug code remove dead defines in xen-os.h add crude boot memory allocator for use early in initialization to simplify porting from linux Affected files ... .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#4 edit .. //depot/projects/xen3/src/sys/i386-xen/include/xen-os.h#2 edit Differences ... ==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#4 (text+ko) ==== @@ -86,233 +86,7 @@ void ni_cli(void); void ni_sti(void); -#ifdef NFS_ROOT - -static int -xdr_opaque_decode(struct mbuf **mptr, u_char *buf, int len) -{ - struct mbuf *m; - int alignedlen; - - m = *mptr; - alignedlen = ( len + 3 ) & ~3; - - if (m->m_len < alignedlen) { - m = m_pullup(m, alignedlen); - if (m == NULL) { - *mptr = NULL; - return EBADRPC; - } - } - bcopy(mtod(m, u_char *), buf, len); - m_adj(m, alignedlen); - *mptr = m; - return 0; -} - - -static int -getdec(char **ptr) -{ - char *p; - int ret; - - p = *ptr; - ret = 0; - if ((*p < '0') || (*p > '9')) - return -1; - while ((*p >= '0') && (*p <= '9')) { - ret = ret * 10 + (*p - '0'); - p++; - } - *ptr = p; - return ret; -} - -int -setinaddr(struct sockaddr_in *addr, char *ipstr) -{ - unsigned int ip; - int val; - - ip = 0; - if (((val = getdec(&ipstr)) < 0) || (val > 255)) - return 1; - ip = val << 24; - if (*ipstr != '.') - return 1; - ipstr++; - if (((val = getdec(&ipstr)) < 0) || (val > 255)) - return 1; - ip |= (val << 16); - if (*ipstr != '.') - return 1; - ipstr++; - if (((val = getdec(&ipstr)) < 0) || (val > 255)) - return 1; - ip |= (val << 8); - if (*ipstr != '.') - return 1; - ipstr++; - if (((val = getdec(&ipstr)) < 0) || (val > 255)) - return 1; - ip |= val; - - addr->sin_addr.s_addr = htonl(ip); - addr->sin_len = sizeof(struct sockaddr_in); - addr->sin_family = AF_INET; - - 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); -} -extern int in_control(struct socket *so, u_long cmd, - caddr_t data, struct ifnet *ifp, - struct thread *td); - -static int -xen_setnetwork(void) -{ - int error = 0; - struct ifaddr *ifa; - struct ifnet *ifp; - struct sockaddr_dl *sdl, ourdl; - - if (sizeof(struct sockaddr) != sizeof(struct sockaddr_in)) - panic("sizes not equal\n"); - - if (hwaddr_to_sockaddr("boot.netif.hwaddr", &ourdl)) { - printf("nfs_diskless: no hardware address\n"); - return -1; - } - - - ifa = NULL; - IFNET_RLOCK(); - 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)) { - IFNET_RUNLOCK(); - goto match_done; - } - } - } - } - IFNET_RUNLOCK(); - printf("nfs_diskless: no interface\n"); - return -1; /* no matching interface */ - match_done: - if (getenv("boot.netif.ip") && getenv("boot.netif.gateway") && - getenv("boot.netif.netmask")) { - struct ifaliasreq ifra; - char *ip; - - bzero(&ifra, sizeof(ifra)); - strcpy(ifra.ifra_name, "xn0"); - ip = getenv("boot.netif.ip"); - setinaddr((struct sockaddr_in *)&(ifra.ifra_addr), ip); - printf("setting ip to %s\n", ip); - ip = getenv("boot.netif.netmask"); - setinaddr((struct sockaddr_in *)&ifra.ifra_mask, ip); - setinaddr((struct sockaddr_in *)&ifra.ifra_broadaddr, "255.255.255.255"); - - - if ((error = in_control(NULL, SIOCAIFADDR, (caddr_t) &ifra, ifp, curthread))) - printf("couldn't set interface address %d\n", error); -#if 0 - if ((error = xn_ioctl(ifp, SIOCSIFNETMASK, (caddr_t)&ifa))) - printf("couldn't set interface netmask %d\n", error); -#endif - } - return error; -} - -int -xen_setnfshandle(void) -{ - char *path, *ip; - u_char fhp[NFSX_V2FH]; - int error = 0; - struct sockaddr_in sin_local, *sin ; - struct mbuf *m; - - if ((error = xen_setnetwork())) - return error; - - sin = &sin_local; - - path = getenv("boot.nfsroot.path"); - ip = getenv("boot.nfsroot.server"); - - /* we aren't configured for NFS root */ - if (!path || !ip) - return 0; - - error = setinaddr(sin, ip); - if (error) { - printf("invalid ip address %s\n", ip); - return error; - } - - error = krpc_portmap(sin, RPCPROG_MNT, RPCMNT_VER1, - &sin->sin_port, curthread); - if (error) { - printf("failed to find port number for mountd\n"); - return error; - } - m = xdr_string_encode(path, strlen(path)); - - /* Do RPC to mountd */ - error = krpc_call(sin, RPCPROG_MNT, RPCMNT_VER1, - RPCMNT_MOUNT, &m, NULL, curthread); - if (error) { - printf("call to mountd failed\n"); - return error; - } - - if (xdr_opaque_decode(&m, fhp, NFSX_V2FH) != 0) { - printf("failed to decode nfs file handle\n"); - return error; - } - - setenv("boot.nfsroot.nfshandle", fhp); - - return 0; -} -#endif void ni_cli(void) { @@ -575,6 +349,8 @@ extern unsigned long *SMPpt; extern struct user *proc0uarea; extern vm_offset_t proc0kstack; +char *bootmem_start, *bootmem_current, *bootmem_end; + pteinfo_t *pteinfo_list; void initvalues(start_info_t *startinfo); @@ -587,7 +363,32 @@ #define PFNTOV(x) (((unsigned long)(x) << PAGE_SHIFT) + KERNBASE) #define PG_KERNEL (PG_V | PG_A | PG_RW | PG_M) +void * +bootmem_alloc(unsigned int size) +{ + char *retptr; + + retptr = bootmem_current; + PANIC_IF(retptr + size > bootmem_end); + bootmem_current += size; + return retptr; +} + +void +bootmem_free(void *ptr, unsigned int size) +{ + char *tptr; + + tptr = ptr; + PANIC_IF(tptr != bootmem_current - size || + bootmem_current - size < bootmem_start); + + bootmem_current -= size; +} + + + void initvalues(start_info_t *startinfo) { @@ -639,6 +440,11 @@ ldt = (union descriptor *)PFNTOV(tmpindex); tmpindex++; + /* allocate 4 pages for bootmem allocator */ + bootmem_start = bootmem_current = (char *)PFNTOV(tmpindex); + tmpindex += 4; + bootmem_end = (char *)PFNTOV(tmpindex); + /* initialize page directory shadow page */ pdir_shadow = (vm_offset_t *)PFNTOV(tmpindex); i686_pagezero(pdir_shadow); @@ -775,41 +581,3 @@ panic("xen_failsafe_handler called!\n"); } - - - - -#if defined(XENDEBUG) -static void -xpmap_dump_pt(pt_entry_t *ptp, int p) -{ - pt_entry_t pte; - int j; - int bufpos; - - pte = xpmap_ptom((uint32_t)ptp - KERNTEXTOFF); - PRINTK(("%03x: %p(%p) %08x\n", p, ptp, (void *)pte, p << PDRSHIFT)); - - bufpos = 0; - for (j = 0; j < PTES_PER_PTP; j++) { - if ((ptp[j] & PG_V) == 0) - continue; - pte = ptp[j] /* & PG_FRAME */; - bufpos += sprintf(XBUF + bufpos, "%x:%03x:%08x ", - p, j, pte); - if (bufpos > 70) { - int k; - sprintf(XBUF + bufpos, "\n"); - PRINTK((XBUF)); - bufpos = 0; - for (k = 0; k < 1000000; k++); - } - } - if (bufpos) { - PRINTK((XBUF)); - bufpos = 0; - } -} -#endif - - ==== //depot/projects/xen3/src/sys/i386-xen/include/xen-os.h#2 (text+ko) ==== @@ -38,32 +38,12 @@ #define per_cpu(var, cpu) (*((void)cpu, &per_cpu__##var)) - -/* - * These are the segment descriptors provided for us by the hypervisor. - * For now, these are hardwired -- guest OSes cannot update the GDT - * or LDT. - * - * It shouldn't be hard to support descriptor-table frobbing -- let me - * know if the BSD or XP ports require flexibility here. +/* crude memory allocator for memory allocation early in + * boot */ - +void *bootmem_alloc(unsigned int size); +void bootmem_free(void *ptr, unsigned int size); -/* - * these are also defined in hypervisor-if.h but can't be pulled in as - * they are used in start of day assembly. Need to clean up the .h files - * a bit more... - */ -#if 0 -#ifndef FLAT_RING1_CS -#define FLAT_RING1_CS 0x0819 -#define FLAT_RING1_DS 0x0821 -#define FLAT_RING3_CS 0x082b -#define FLAT_RING3_DS 0x0833 -#endif -#endif -#define __KERNEL_CS FLAT_RING1_CS -#define __KERNEL_DS FLAT_RING1_DS /* Everything below this point is not included by assembler (.S) files. */ #ifndef __ASSEMBLY__
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601082143.k08LhrTR067150>