From owner-p4-projects@FreeBSD.ORG Tue Feb 20 21:17:31 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 37B1A16B172; Tue, 20 Feb 2007 21:17:31 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 0CAB016B101 for ; Tue, 20 Feb 2007 21:17:31 +0000 (UTC) (envelope-from jkim@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id F198113C467 for ; Tue, 20 Feb 2007 21:17:30 +0000 (UTC) (envelope-from jkim@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l1KLHUoS028534 for ; Tue, 20 Feb 2007 21:17:30 GMT (envelope-from jkim@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l1KLHUjB028528 for perforce@freebsd.org; Tue, 20 Feb 2007 21:17:30 GMT (envelope-from jkim@freebsd.org) Date: Tue, 20 Feb 2007 21:17:30 GMT Message-Id: <200702202117.l1KLHUjB028528@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jkim@freebsd.org using -f From: Jung-uk Kim To: Perforce Change Reviews Cc: Subject: PERFORCE change 114770 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Feb 2007 21:17:31 -0000 http://perforce.freebsd.org/chv.cgi?CH=114770 Change 114770 by jkim@jkim_hammer on 2007/02/20 21:16:55 Fix style(9). Affected files ... .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#39 edit Differences ... ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#39 (text+ko) ==== @@ -71,22 +71,6 @@ #include #include -/* - * Memory and System segment descriptors - */ -struct segment_descriptor { - unsigned sd_lolimit:16 ; /* segment extent (lsb) */ - unsigned sd_lobase:24 __packed; /* segment base address (lsb) */ - unsigned sd_type:5 ; /* segment type */ - unsigned sd_dpl:2 ; /* segment descriptor priority level */ - unsigned sd_p:1 ; /* segment descriptor present */ - unsigned sd_hilimit:4 ; /* segment extent (msb) */ - unsigned sd_xx:2 ; /* unused */ - unsigned sd_def32:1 ; /* default 32 vs 16 bit size */ - unsigned sd_gran:1 ; /* limit granularity (byte/page units)*/ - unsigned sd_hibase:8 ; /* segment base address (msb) */ -} ; - struct l_old_select_argv { l_int nfds; l_uintptr_t readfds; @@ -140,7 +124,7 @@ * Allocate temporary demand zeroed space for argument and * environment strings */ - args->buf = (char *) kmem_alloc_wait(exec_map, + args->buf = (char *)kmem_alloc_wait(exec_map, PATH_MAX + ARG_MAX + MAXSHELLCMDLEN); if (args->buf == NULL) return (ENOMEM); @@ -174,14 +158,14 @@ if (error) { if (error == ENAMETOOLONG) error = E2BIG; - + goto err_exit; } args->stringspace -= length; args->endp += length; args->argc++; } - + args->begin_envv = args->endp; /* @@ -238,13 +222,13 @@ if (error == 0) error = kern_execve(td, &eargs, NULL); if (error == 0) - /* linux process can exec fbsd one, dont attempt + /* Linux process can execute FreeBSD one, do not attempt * to create emuldata for such process using * linux_proc_init, this leads to a panic on KASSERT - * because such process has p->p_emuldata == NULL + * because such process has p->p_emuldata == NULL. */ if (td->td_proc->p_sysent == &elf_linux_sysvec) - error = linux_proc_init(td, 0, 0); + error = linux_proc_init(td, 0, 0); return (error); } @@ -485,7 +469,7 @@ if ((error = fork1(td, RFFDG | RFPROC | RFSTOPPED, 0, &p2)) != 0) return (error); - + if (error == 0) { td->td_retval[0] = p2->p_pid; td->td_retval[1] = 0; @@ -520,7 +504,7 @@ printf(ARGS(vfork, "")); #endif - /* exclude RFPPWAIT */ + /* Exclude RFPPWAIT */ if ((error = fork1(td, RFFDG | RFPROC | RFMEM | RFSTOPPED, 0, &p2)) != 0) return (error); if (error == 0) { @@ -539,7 +523,7 @@ PROC_UNLOCK(p2); td2 = FIRST_THREAD_IN_PROC(p2); - + /* make it run */ mtx_lock_spin(&sched_lock); TD_SET_CAN_RUN(td2); @@ -551,7 +535,7 @@ while (p2->p_flag & P_PPWAIT) msleep(td->td_proc, &p2->p_mtx, PWAIT, "ppwait", 0); PROC_UNLOCK(p2); - + return (0); } @@ -566,10 +550,9 @@ #ifdef DEBUG if (ldebug(clone)) { - printf(ARGS(clone, "flags %x, stack %x, parent tid: %x, child tid: %x"), - (unsigned int)args->flags, (unsigned int)(uintptr_t)args->stack, - (unsigned int)(uintptr_t)args->parent_tidptr, - (unsigned int)(uintptr_t)args->child_tidptr); + printf(ARGS(clone, "flags %x, stack %p, parent tid: %p, " + "child tid: %p"), (unsigned)args->flags, + args->stack, args->parent_tidptr, args->child_tidptr); } #endif @@ -584,11 +567,11 @@ ff |= RFMEM; if (args->flags & CLONE_SIGHAND) ff |= RFSIGSHARE; - /* - * XXX: in linux sharing of fs info (chroot/cwd/umask) - * and open files is independant. in fbsd its in one - * structure but in reality it doesnt make any problems - * because both this flags are set at once usually. + /* + * XXX: In Linux, sharing of fs info (chroot/cwd/umask) + * and open files is independant. In FreeBSD, its in one + * structure but in reality it does not make any problems + * because both of these flags are set at once usually. */ if (!(args->flags & (CLONE_FILES | CLONE_FS))) ff |= RFFDG; @@ -624,7 +607,7 @@ PROC_UNLOCK(p2); sx_xunlock(&proctree_lock); } - + /* create the emuldata */ error = linux_proc_init(td, p2->p_pid, args->flags); /* reference it - no need to check this */ @@ -638,7 +621,7 @@ p2->p_pgrp = td->td_proc->p_pgrp; PROC_UNLOCK(p2); #endif - exit_signal = 0; + exit_signal = 0; } if (args->flags & CLONE_CHILD_SETTID) @@ -654,7 +637,8 @@ EMUL_UNLOCK(&emul_lock); if (args->flags & CLONE_PARENT_SETTID) { - error = copyout(&p2->p_pid, args->parent_tidptr, sizeof(p2->p_pid)); + error = copyout(&p2->p_pid, args->parent_tidptr, + sizeof(p2->p_pid)); if (error) printf(LMSG("copyout failed!")); } @@ -663,40 +647,47 @@ p2->p_sigparent = exit_signal; PROC_UNLOCK(p2); td2 = FIRST_THREAD_IN_PROC(p2); - /* - * in a case of stack = NULL we are supposed to COW calling process stack - * this is what normal fork() does so we just keep the tf_rsp arg intact + /* + * In a case of stack = NULL, we are supposed to COW calling process + * stack. This is what normal fork() does, so we just keep tf_rsp arg + * intact. */ if (args->stack) - td2->td_frame->tf_rsp = PTROUT(args->stack); + td2->td_frame->tf_rsp = PTROUT(args->stack); if (args->flags & CLONE_SETTLS) { struct user_segment_descriptor sd; - struct l_user_desc info; + struct l_user_desc info; int a[2]; - int idx; + int idx; - error = copyin((void *)td->td_frame->tf_rsi, &info, sizeof(struct l_user_desc)); + error = copyin((void *)td->td_frame->tf_rsi, &info, + sizeof(struct l_user_desc)); if (error) { printf(LMSG("copyin failed!")); } else { - + idx = info.entry_number; - + /* - * looks like we're getting the idx we returned - * in the set_thread_area() syscall + * It looks like we're getting the idx we returned + * in the set_thread_area() syscall. */ if (idx != 6 && idx != GUGS32_SEL) { printf(LMSG("resetting idx!")); idx = 6; /* or GUGS32_SEL? */ - } + } /* this doesnt happen in practice */ if (idx == 6) { - /* we might copy out the entry_number as GUGS32_SEL */ + /* + * We might copy out the entry_number + * as GUGS32_SEL. + */ info.entry_number = GUGS32_SEL; - error = copyout(&info, (void *) td->td_frame->tf_rsi, sizeof(struct l_user_desc)); + error = copyout(&info, + (void *)td->td_frame->tf_rsi, + sizeof(struct l_user_desc)); if (error) printf(LMSG("copyout failed!")); } @@ -707,21 +698,14 @@ memcpy(&sd, &a, sizeof(a)); #ifdef DEBUG if (ldebug(clone)) - printf("Segment created in clone with CLONE_SETTLS: " - "lobase: %x, hibase: %x, lolimit: %x, hilimit: %x, " - "type: %i, dpl: %i, p: %i, xx: %i, long: %i, " - "def32: %i, gran: %i\n", - sd.sd_lobase, - sd.sd_hibase, - sd.sd_lolimit, - sd.sd_hilimit, - sd.sd_type, - sd.sd_dpl, - sd.sd_p, - sd.sd_xx, - sd.sd_long, - sd.sd_def32, - sd.sd_gran); + printf("Segment created in clone with " + "CLONE_SETTLS: lobase: %x, hibase: %x, " + "lolimit: %x, hilimit: %x, type: %i, " + "dpl: %i, p: %i, xx: %i, long: %i, " + "def32: %i, gran: %i\n", sd.sd_lobase, + sd.sd_hibase, sd.sd_lolimit, sd.sd_hilimit, + sd.sd_type, sd.sd_dpl, sd.sd_p, sd.sd_xx, + sd.sd_long, sd.sd_def32, sd.sd_gran); #endif td2->td_pcb->pcb_gsbase = (register_t)info.base_addr; td2->td_pcb->pcb_gs32sd = sd; @@ -733,8 +717,9 @@ #ifdef DEBUG if (ldebug(clone)) - printf(LMSG("clone: successful rfork to %ld, stack %p sig = %d"), - (long)p2->p_pid, args->stack, exit_signal); + printf(LMSG("clone: successful rfork to %d, " + "stack %p sig = %d"), (int)p2->p_pid, args->stack, + exit_signal); #endif if (args->flags & CLONE_VFORK) { PROC_LOCK(p2); @@ -752,12 +737,12 @@ td->td_retval[0] = p2->p_pid; td->td_retval[1] = 0; - + if (args->flags & CLONE_VFORK) { - /* wait for the children to exit, ie. emulate vfork */ - PROC_LOCK(p2); + /* wait for the children to exit, ie. emulate vfork */ + PROC_LOCK(p2); while (p2->p_flag & P_PPWAIT) - msleep(td->td_proc, &p2->p_mtx, PWAIT, "ppwait", 0); + msleep(td->td_proc, &p2->p_mtx, PWAIT, "ppwait", 0); PROC_UNLOCK(p2); } @@ -776,8 +761,8 @@ #ifdef DEBUG if (ldebug(mmap2)) - printf(ARGS(mmap2, "%p, %d, %d, 0x%08x, %d, %d"), - (void *)(intptr_t)args->addr, args->len, args->prot, + printf(ARGS(mmap2, "0x%08x, %d, %d, 0x%08x, %d, %d"), + args->addr, args->len, args->prot, args->flags, args->fd, args->pgoff); #endif @@ -803,10 +788,9 @@ #ifdef DEBUG if (ldebug(mmap)) - printf(ARGS(mmap, "%p, %d, %d, 0x%08x, %d, %d"), - (void *)(intptr_t)linux_args.addr, linux_args.len, - linux_args.prot, linux_args.flags, linux_args.fd, - linux_args.pgoff); + printf(ARGS(mmap, "0x%08x, %d, %d, 0x%08x, %d, %d"), + linux_args.addr, linux_args.len, linux_args.prot, + linux_args.flags, linux_args.fd, linux_args.pgoff); #endif if ((linux_args.pgoff % PAGE_SIZE) != 0) return (EINVAL); @@ -891,14 +875,14 @@ bsd_args.fd = linux_args->fd; if (linux_args->flags & LINUX_MAP_GROWSDOWN) { - /* - * The linux MAP_GROWSDOWN option does not limit auto + /* + * The Linux MAP_GROWSDOWN option does not limit auto * growth of the region. Linux mmap with this option * takes as addr the inital BOS, and as len, the initial * region size. It can then grow down from addr without - * limit. However, linux threads has an implicit internal + * limit. However, Linux threads has an implicit internal * limit to stack size of STACK_SIZE. Its just not - * enforced explicitly in linux. But, here we impose + * enforced explicitly in Linux. But, here we impose * a limit of (STACK_SIZE - GUARD_SIZE) on the stack * region, since we can do this with our mmap. * @@ -915,8 +899,8 @@ if ((caddr_t)PTRIN(linux_args->addr) + linux_args->len > p->p_vmspace->vm_maxsaddr) { - /* - * Some linux apps will attempt to mmap + /* + * Some Linux apps will attempt to mmap * thread stacks near the top of their * address space. If their TOS is greater * than vm_maxsaddr, vm_map_growstack() @@ -943,7 +927,7 @@ else bsd_args.len = STACK_SIZE - GUARD_SIZE; - /* + /* * This gives us a new BOS. If we're using VM_STACK, then * mmap will just map the top SGROWSIZ bytes, and let * the stack grow down to the limit at BOS. If we're @@ -1261,7 +1245,8 @@ } int -linux_set_thread_area(struct thread *td, struct linux_set_thread_area_args *args) +linux_set_thread_area(struct thread *td, + struct linux_set_thread_area_args *args) { struct l_user_desc info; struct user_segment_descriptor sd; @@ -1275,47 +1260,43 @@ #ifdef DEBUG if (ldebug(set_thread_area)) - printf(ARGS(set_thread_area, "%i, %x, %x, %i, %i, %i, %i, %i, %i"), - info.entry_number, - info.base_addr, - info.limit, - info.seg_32bit, - info.contents, - info.read_exec_only, - info.limit_in_pages, - info.seg_not_present, - info.useable); + printf(ARGS(set_thread_area, "%i, %x, %x, %i, %i, %i, " + "%i, %i, %i"), info.entry_number, info.base_addr, + info.limit, info.seg_32bit, info.contents, + info.read_exec_only, info.limit_in_pages, + info.seg_not_present, info.useable); #endif idx = info.entry_number; - /* - * Semantics of linux version: every thread in the system has array - * of 3 tls descriptors. 1st is GLIBC TLS, 2nd is WINE, 3rd unknown. This - * syscall loads one of the selected tls decriptors with a value - * and also loads GDT descriptors 6, 7 and 8 with the content of the per-thread - * descriptors. + /* + * Semantics of Linux version: every thread in the system has array + * of three TLS descriptors. 1st is GLIBC TLS, 2nd is WINE, 3rd unknown. + * This syscall loads one of the selected TLS decriptors with a value + * and also loads GDT descriptors 6, 7 and 8 with the content of + * the per-thread descriptors. * - * Semantics of fbsd version: I think we can ignore that linux has 3 per-thread - * descriptors and use just the 1st one. The tls_array[] is used only in - * set/get-thread_area() syscalls and for loading the GDT descriptors. In fbsd - * we use just one GDT descriptor for TLS so we will load just one. - * XXX: this doesnt work when user-space process tries to use more then 1 TLS segment - * comment in the linux sources says wine might do that. + * Semantics of FreeBSD version: I think we can ignore that Linux has + * three per-thread descriptors and use just the first one. + * The tls_array[] is used only in [gs]et_thread_area() syscalls and + * for loading the GDT descriptors. We use just one GDT descriptor + * for TLS, so we will load just one. + * XXX: This doesnt work when user-space process tries to use more + * than one TLS segment. Comment in the Linux source says wine might + * do that. */ - /* - * we support just GLIBC TLS now - * we should let 4 proceed as well because we use this segment so - * if code does two subsequent calls it should succeed + /* + * GLIBC reads current %gs and call set_thread_area() with it. + * We should let GUGS32_SEL proceed as well because we use this + * segment. */ if (idx != 6 && idx != -1 && idx != GUGS32_SEL) return (EINVAL); - /* - * we have to copy out the GDT entry we use - * FreeBSD uses GUGS32_SEL for storing %gs so load that - * XXX: what if userspace program doesnt check this value and tries - * to use 6, 7 or 8? + /* + * We have to copy out the GDT entry we use. + * XXX: What if userspace program does not check return value and + * tries to use 6, 7 or 8? */ idx = info.entry_number = GUGS32_SEL; error = copyout(&info, args->desc, sizeof(struct l_user_desc));