On Wed, 2004-03-10 at 14:13, Robert Watson wrote: > On Wed, 10 Mar 2004, David Gilbert wrote: > > > Has anyone made an attempt to run usermode linux on FreeBSD? Is the > > issue-list long? > > There was a neat paper at BSDCon 2003 discussing running usermode FreeBSD > on Linux, and it talked about what would be necessary to make usermode > FreeBSD run on FreeBSD. You can find the paper off the USENIX web site, > or perhaps via Google. I think it was a relatively small set of changes. I have been toying with user mode BSD... and maybe even run user-mode Linux on FreeBSD.... And one of the requirements is to be able to alter syscalls in flight. I think something line the following patch would help... The concept goes something like this... The User-mode-unix would rfork and set up ptrace, The parent monitors the child process for syscalls... child = rfork_thread(RFPROC|RFMEM, stack, child_func, NULL); waitpid(child, &status, WUNTRACED); ptrace(PT_TO_SCE, child, (caddr_t)1, 0); for (;;) { waitpid(child, &status, WUNTRACED); if (WSTOPSIG(status) == SIGTRAP) { struct reg r; ptrace(PT_GETREGS, child, (caddr_t)&r, 0); save_syscall= r.r_eax; r.r_eax = SYS_getpid; ptrace(PT_SETREGS, child, (caddr_t)&r, 0); ptrace(PT_TO_SCX, child, (caddr_t)1, 0); waitpid(child, &status, WUNTRACED); ptrace(PT_GETREGS, child, (caddr_t)&r, 0); r.r_eax = save_syscall; simulate_syscall(&r); ptrace(PT_SETREGS, child, (caddr_t)&r, 0); } ptrace(PT_TO_SCE, child, (caddr_t)1, 0); } User mode Linux works with a similar mechanism. BTW, I haven't yet tested the patch below - just want some wiser, more experienced eyes to look at it first. --- trap.c.orig Thu Mar 11 15:22:17 2004 +++ trap.c Thu Mar 11 15:50:06 2004 _at__at_ -936,6 +936,7 _at__at_ cred_update_thread(td); if (p->p_flag & P_SA) thread_user_enter(p, td); + redo_syscall: params = (caddr_t)frame.tf_esp + sizeof(int); code = frame.tf_eax; orig_tf_eflags = frame.tf_eflags; _at__at_ -1003,7 +1004,17 _at__at_ STOPEVENT(p, S_SCE, narg); - PTRACESTOP_SC(p, td, S_PT_SCE); + + if ((p->p_flag & P_TRACED) && (p->p_stops & S_PT_SCE)) { + PROC_LOCK(p); + ptracestop(td, SIGTRAP); + if (!((p->p_flag & P_TRACED) && + (p->p_stops & S_PT_SCE))) { + if ((callp->sy_narg & SYF_MPSAFE) == 0) + mtx_unlock(&Giant); + goto redo_syscall; + } + } error = (*callp->sy_call)(td, args); } > Robert N M Watson FreeBSD Core Team, TrustedBSD Projects > robert_at_fledge.watson.org Senior Research Scientist, McAfee Research > > > > > > Dave. > > > > -- > > ============================================================================ > > |David Gilbert, Independent Contractor. | Two things can only be | > > |Mail: dave_at_daveg.ca | equal if and only if they | > > |http://daveg.ca | are precisely opposite. | > > =========================================================GLO================ > > _______________________________________________ > > freebsd-hackers_at_freebsd.org mailing list > > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > > To unsubscribe, send any mail to "freebsd-hackers-unsubscribe_at_freebsd.org" > > > > _______________________________________________ > freebsd-current_at_freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-current > To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org" > FLAGS (\Seen)) -- Antony T Curtis BSc Unix Analyst Programmer http://homepage.ntlworld.com/antony.t.curtis/Received on Thu Mar 11 2004 - 07:11:55 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:47 UTC