Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/x86/x86 vga_post_init: fix a bug and memleak in err...
details: https://anonhg.NetBSD.org/src/rev/31bbf0cb1805
branches: trunk
changeset: 757922:31bbf0cb1805
user: rmind <rmind%NetBSD.org@localhost>
date: Sun Oct 03 19:46:35 2010 +0000
description:
vga_post_init: fix a bug and memleak in error path.
diffstat:
sys/arch/x86/x86/vga_post.c | 38 +++++++++++++++++++++-----------------
1 files changed, 21 insertions(+), 17 deletions(-)
diffs (86 lines):
diff -r 3981aa5581b4 -r 31bbf0cb1805 sys/arch/x86/x86/vga_post.c
--- a/sys/arch/x86/x86/vga_post.c Sun Oct 03 19:44:47 2010 +0000
+++ b/sys/arch/x86/x86/vga_post.c Sun Oct 03 19:46:35 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vga_post.c,v 1.15 2010/06/28 00:39:47 rmind Exp $ */
+/* $NetBSD: vga_post.c,v 1.16 2010/10/03 19:46:35 rmind Exp $ */
/*-
* Copyright (c) 2007 Joerg Sonnenberger <joerg%NetBSD.org@localhost>.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vga_post.c,v 1.15 2010/06/28 00:39:47 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vga_post.c,v 1.16 2010/10/03 19:46:35 rmind Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -143,30 +143,30 @@
vaddr_t sys_image, sys_bios_data;
int err;
- sys_bios_data = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_VAONLY);
- if (sys_bios_data == 0)
- return NULL;
-
sys_image = uvm_km_alloc(kernel_map, 1024 * 1024, 0, UVM_KMF_VAONLY);
if (sys_image == 0) {
- uvm_km_free(kernel_map, sys_bios_data, PAGE_SIZE,
- UVM_KMF_VAONLY);
return NULL;
}
sc = kmem_alloc(sizeof(*sc), KM_SLEEP);
+ sc->sys_image = sys_image;
+ sc->emu.sys_private = sc;
err = uvm_pglistalloc(BASE_MEMORY, 0, (paddr_t)-1, 0, 0,
&sc->ram_backing, BASE_MEMORY/PAGE_SIZE, 1);
if (err) {
- uvm_km_free(kernel_map, sc->sys_image, 1024 * 1024,
- UVM_KMF_VAONLY);
+ uvm_km_free(kernel_map, sc->sys_image,
+ 1024 * 1024, UVM_KMF_VAONLY);
kmem_free(sc, sizeof(*sc));
return NULL;
}
- sc->sys_image = sys_image;
- sc->emu.sys_private = sc;
-
+ /*
+ * Map and copy BIOS data.
+ */
+ sys_bios_data = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_VAONLY);
+ if (sys_bios_data == 0) {
+ return NULL;
+ }
pmap_kenter_pa(sys_bios_data, 0, VM_PROT_READ, 0);
pmap_update(pmap_kernel());
@@ -176,17 +176,21 @@
pmap_update(pmap_kernel());
uvm_km_free(kernel_map, sys_bios_data, PAGE_SIZE, UVM_KMF_VAONLY);
+ /*
+ * Map 0 .. 64KB and 640KB .. 1MB ranges.
+ */
iter = 0;
TAILQ_FOREACH(pg, &sc->ram_backing, pageq.queue) {
pmap_kenter_pa(sc->sys_image + iter, VM_PAGE_TO_PHYS(pg),
- VM_PROT_READ | VM_PROT_WRITE, 0);
+ VM_PROT_READ | VM_PROT_WRITE, 0);
iter += PAGE_SIZE;
}
- KASSERT(iter == 65536);
+ KASSERT(iter == BASE_MEMORY);
- for (iter = 640 * 1024; iter < 1024 * 1024; iter += PAGE_SIZE)
+ for (iter = 640 * 1024; iter < 1024 * 1024; iter += PAGE_SIZE) {
pmap_kenter_pa(sc->sys_image + iter, iter,
- VM_PROT_READ | VM_PROT_WRITE, 0);
+ VM_PROT_READ | VM_PROT_WRITE, 0);
+ }
pmap_update(pmap_kernel());
memset(&sc->emu, 0, sizeof(sc->emu));
Home |
Main Index |
Thread Index |
Old Index