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