VM question related to faults

Divacky Roman xdivac02 at stud.fit.vutbr.cz
Sun Jul 30 10:57:39 UTC 2006


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


More information about the freebsd-hackers mailing list