From owner-freebsd-hackers@FreeBSD.ORG Sun Jul 30 10:57:39 2006 Return-Path: X-Original-To: hackers@freebsd.org Delivered-To: freebsd-hackers@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6EE3516A4E1 for ; Sun, 30 Jul 2006 10:57:39 +0000 (UTC) (envelope-from xdivac02@stud.fit.vutbr.cz) Received: from eva.fit.vutbr.cz (eva.fit.vutbr.cz [147.229.10.14]) by mx1.FreeBSD.org (Postfix) with ESMTP id CE30E43D46 for ; Sun, 30 Jul 2006 10:57:38 +0000 (GMT) (envelope-from xdivac02@stud.fit.vutbr.cz) Received: from eva.fit.vutbr.cz (localhost [127.0.0.1]) by eva.fit.vutbr.cz (envelope-from xdivac02@eva.fit.vutbr.cz) (8.13.7/8.13.7) with ESMTP id k6UAvWDI065157 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Sun, 30 Jul 2006 12:57:32 +0200 (CEST) Received: (from xdivac02@localhost) by eva.fit.vutbr.cz (8.13.7/8.13.3/Submit) id k6UAvWJj065156 for hackers@freebsd.org; Sun, 30 Jul 2006 12:57:32 +0200 (CEST) Date: Sun, 30 Jul 2006 12:57:32 +0200 From: Divacky Roman To: hackers@freebsd.org Message-ID: <20060730105731.GA64955@stud.fit.vutbr.cz> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2i X-Scanned-By: MIMEDefang 2.54 on 147.229.10.14 Cc: Subject: VM question related to faults X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 30 Jul 2006 10:57:39 -0000 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