Date: Sun, 30 Jul 2006 23:53:55 +0800 From: "Intron" <mag@intron.ac> To: Divacky Roman <xdivac02@stud.fit.vutbr.cz> Cc: freebsd-hackers@freebsd.org Subject: Re: VM question related to faults Message-ID: <courier.44CCD613.0001443C@intron.ac> In-Reply-To: <20060730105731.GA64955@stud.fit.vutbr.cz> References: <20060730105731.GA64955@stud.fit.vutbr.cz>
next in thread | previous in thread | raw e-mail | index | archive | help
Divacky Roman wrote: > hi, > > while working on SoC linuxolator project I am in a need of this: > > I need to do some operation on memory like mem1 = mem1 + mem2 etc. > where the mem1/mem2 access can trigger fault. (memory not mapped or something) > > currently I solve this by using pcb_onfault. this must be done in asm (kib@ > told me) so currently the code looks like this: > > futex_fault: > movl PCPU(CURPCB), %edx > movl $0, PCB_ONFAULT(%edx) > movl $-EFAULT, %eax > ret > > /* int futex_xchgl(int oparg, caddr_t uaddr, int *oldval); */ > .globl futex_xchgl > futex_xchgl: > movl PCPU(CURPCB), %eax > movl $futex_fault, PCB_ONFAULT(%eax) > movl 4(%esp), %eax > movl 8(%esp), %edx > > xchgl %eax, (%edx) > movl 0xc(%esp), %edx > movl %eax, (%edx) > xorl %eax, %eax > > movl PCPU(CURPCB), %edx > movl $0, PCB_ONFAULT(%edx) > ret > > this is not very nice nor portable. I wonder if its possible to do something > like this: > > LOCK_VM_SOMEHOW(); > if (!memory_accessible(mem1) || !memory_accessible(mem2)) > return EFAULT; > > mem1 = mem1 + mem2; > > UNLOCK_VM_SOMEHOW(); > > if its possible - what is the LOCK_VM_SOMEHOW lock? and what is the > memory_accessible() function? > > thnx for pointing me to the right directions > > roman > > > ---------------------- > www.liberalnistrana.cz > _______________________________________________ > freebsd-hackers@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org" As I know, there're two ways to detect page fault: 1. Look up in page mapping table (i.e. GDT and IDT on x86 or x86_64). See copyin() and copyout() in "/sys/i386/i386/support.s". 2. Capture exception interrupt triggered by CPU (i.e. INT 0x0E on x86 and x86_64) like vm_fault() in "/sys/vm/vm_fault.c". Actually, kernel memory page fault should not arise at all, which means bug made by programmer. ------------------------------------------------------------------------ From Beijing, China
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?courier.44CCD613.0001443C>