From owner-svn-src-all@FreeBSD.ORG Tue Aug 10 06:25:08 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A7EC71065672; Tue, 10 Aug 2010 06:25:08 +0000 (UTC) (envelope-from jkim@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 96D278FC13; Tue, 10 Aug 2010 06:25:08 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o7A6P8sT033379; Tue, 10 Aug 2010 06:25:08 GMT (envelope-from jkim@svn.freebsd.org) Received: (from jkim@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o7A6P8rX033377; Tue, 10 Aug 2010 06:25:08 GMT (envelope-from jkim@svn.freebsd.org) Message-Id: <201008100625.o7A6P8rX033377@svn.freebsd.org> From: Jung-uk Kim Date: Tue, 10 Aug 2010 06:25:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r211131 - head/sys/compat/x86bios X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 Aug 2010 06:25:08 -0000 Author: jkim Date: Tue Aug 10 06:25:08 2010 New Revision: 211131 URL: http://svn.freebsd.org/changeset/base/211131 Log: Tidy up locking and memory allocation for the real mode emulator wrapper. Now we use a regular mutex instead of a spin mutex. When we enter and exit the emulator, spinlock_enter() and spinlock_exit() are additionally used. Move some page table related stuff from x86bios_init() and x86bios_uninit() to x86bios_map_mem() and x86bios_unmap_mem(). Modified: head/sys/compat/x86bios/x86bios.c Modified: head/sys/compat/x86bios/x86bios.c ============================================================================== --- head/sys/compat/x86bios/x86bios.c Tue Aug 10 05:15:35 2010 (r211130) +++ head/sys/compat/x86bios/x86bios.c Tue Aug 10 06:25:08 2010 (r211131) @@ -556,9 +556,9 @@ x86bios_alloc(uint32_t *offset, size_t s x86bios_rom_phys, X86BIOS_PAGE_SIZE, 0); if (vaddr != NULL) { *offset = vtophys(vaddr); - mtx_lock_spin(&x86bios_lock); + mtx_lock(&x86bios_lock); x86bios_set_pages((vm_offset_t)vaddr, *offset, size); - mtx_unlock_spin(&x86bios_lock); + mtx_unlock(&x86bios_lock); } return (vaddr); @@ -575,10 +575,10 @@ x86bios_free(void *addr, size_t size) if (paddr < X86BIOS_RAM_BASE || paddr >= x86bios_rom_phys || paddr % X86BIOS_PAGE_SIZE != 0) return; - mtx_lock_spin(&x86bios_lock); + mtx_lock(&x86bios_lock); bzero(x86bios_map + paddr / X86BIOS_PAGE_SIZE, sizeof(*x86bios_map) * howmany(size, X86BIOS_PAGE_SIZE)); - mtx_unlock_spin(&x86bios_lock); + mtx_unlock(&x86bios_lock); contigfree(addr, size, M_DEVBUF); } @@ -595,18 +595,17 @@ void x86bios_call(struct x86regs *regs, uint16_t seg, uint16_t off) { - if (x86bios_map == NULL) - return; - if (x86bios_trace_call) X86BIOS_TRACE(Calling 0x%06x, (seg << 4) + off, regs); - mtx_lock_spin(&x86bios_lock); + mtx_lock(&x86bios_lock); + spinlock_enter(); memcpy(&x86bios_emu.x86, regs, sizeof(*regs)); x86bios_fault = 0; x86emu_exec_call(&x86bios_emu, seg, off); memcpy(regs, &x86bios_emu.x86, sizeof(*regs)); - mtx_unlock_spin(&x86bios_lock); + spinlock_exit(); + mtx_unlock(&x86bios_lock); if (x86bios_trace_call) { X86BIOS_TRACE(Exiting 0x%06x, (seg << 4) + off, regs); @@ -634,18 +633,17 @@ x86bios_intr(struct x86regs *regs, int i if (intno < 0 || intno > 255) return; - if (x86bios_map == NULL) - return; - if (x86bios_trace_int) X86BIOS_TRACE(Calling INT 0x%02x, intno, regs); - mtx_lock_spin(&x86bios_lock); + mtx_lock(&x86bios_lock); + spinlock_enter(); memcpy(&x86bios_emu.x86, regs, sizeof(*regs)); x86bios_fault = 0; x86emu_exec_intr(&x86bios_emu, intno); memcpy(regs, &x86bios_emu.x86, sizeof(*regs)); - mtx_unlock_spin(&x86bios_lock); + spinlock_exit(); + mtx_unlock(&x86bios_lock); if (x86bios_trace_int) { X86BIOS_TRACE(Exiting INT 0x%02x, intno, regs); @@ -667,6 +665,7 @@ static __inline void x86bios_unmap_mem(void) { + free(x86bios_map, M_DEVBUF); if (x86bios_ivt != NULL) #ifdef X86BIOS_NATIVE_ARCH pmap_unmapdev((vm_offset_t)x86bios_ivt, X86BIOS_IVT_SIZE); @@ -683,6 +682,9 @@ static __inline int x86bios_map_mem(void) { + x86bios_map = malloc(sizeof(*x86bios_map) * X86BIOS_PAGES, M_DEVBUF, + M_WAITOK | M_ZERO); + #ifdef X86BIOS_NATIVE_ARCH x86bios_ivt = pmap_mapbios(X86BIOS_IVT_BASE, X86BIOS_IVT_SIZE); @@ -714,6 +716,13 @@ x86bios_map_mem(void) X86BIOS_RAM_BASE, x86bios_rom_phys, X86BIOS_PAGE_SIZE, 0); x86bios_seg_phys = vtophys(x86bios_seg); + x86bios_set_pages((vm_offset_t)x86bios_ivt, X86BIOS_IVT_BASE, + X86BIOS_IVT_SIZE); + x86bios_set_pages((vm_offset_t)x86bios_rom, x86bios_rom_phys, + X86BIOS_ROM_SIZE); + x86bios_set_pages((vm_offset_t)x86bios_seg, x86bios_seg_phys, + X86BIOS_SEG_SIZE); + if (bootverbose) { printf("x86bios: IVT 0x%06jx-0x%06jx at %p\n", (vm_paddr_t)X86BIOS_IVT_BASE, @@ -746,20 +755,11 @@ x86bios_init(void) { int i; + mtx_init(&x86bios_lock, "x86bios lock", NULL, MTX_DEF); + if (x86bios_map_mem() != 0) return (ENOMEM); - mtx_init(&x86bios_lock, "x86bios lock", NULL, MTX_SPIN); - - x86bios_map = malloc(sizeof(*x86bios_map) * X86BIOS_PAGES, M_DEVBUF, - M_WAITOK | M_ZERO); - x86bios_set_pages((vm_offset_t)x86bios_ivt, X86BIOS_IVT_BASE, - X86BIOS_IVT_SIZE); - x86bios_set_pages((vm_offset_t)x86bios_rom, x86bios_rom_phys, - X86BIOS_ROM_SIZE); - x86bios_set_pages((vm_offset_t)x86bios_seg, x86bios_seg_phys, - X86BIOS_SEG_SIZE); - bzero(&x86bios_emu, sizeof(x86bios_emu)); x86bios_emu.emu_rdb = x86bios_emu_rdb; @@ -785,18 +785,8 @@ x86bios_init(void) static int x86bios_uninit(void) { - vm_offset_t *map = x86bios_map; - - mtx_lock_spin(&x86bios_lock); - if (x86bios_map != NULL) { - free(x86bios_map, M_DEVBUF); - x86bios_map = NULL; - } - mtx_unlock_spin(&x86bios_lock); - - if (map != NULL) - x86bios_unmap_mem(); + x86bios_unmap_mem(); mtx_destroy(&x86bios_lock); return (0);