tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Some fixes in MI code regarding PAE



Hi,

Jeremy kindly posted [1] different patches to enable PAE, as well as the NX bit, when possible.

I just finished porting Jeremy's patches to current, and I'd like to commit a tiny fraction of it: mainly fixes in UVM code where there is a risk of unwanted (but IMHO harmless) overflows when shifting bits from frame numbers to addresses.

Patch is attached, or available here [2].

It was compile tested for amd64, and compile+boot tested for i386.

Explanations:
- printfs using PRIxADDR instead of hardcoding long types in format
- ptoa() => ctob() + cast to uint64_t (when necessary) for integer values that could be higher than 1M, risking truncation when casted to vaddr_t via ptoa().

Opinions? (I am wondering if the part concerning the overflows should not be pulled-up to NetBSD-4 and NetBSD-5).

The rest (mostly modifications in x86 MD code) will follow in the next few days, after some polishing (still too many "#ifdef's PAE" to my taste in pmap). FWIW, current state is here [3].


[1] http://mail-index.netbsd.org/port-i386/2009/12/20/msg001674.html

[2] http://www.netbsd.org/~jym/pae-mi.diff

[3] http://www.netbsd.org/~jym/pae.diff

--
Jean-Yves Migeon
jeanyves.migeon%free.fr@localhost
Index: dev/isa/i82365_isasubr.c
===================================================================
RCS file: /cvsroot/src/sys/dev/isa/i82365_isasubr.c,v
retrieving revision 1.45
diff -u -u -r1.45 i82365_isasubr.c
--- dev/isa/i82365_isasubr.c    17 Sep 2009 18:14:41 -0000      1.45
+++ dev/isa/i82365_isasubr.c    7 Jan 2010 23:45:15 -0000
@@ -431,17 +431,19 @@
                sc->iosize = 0xbff;
        }
 
-       DPRINTF(("%s: bus_space_alloc range 0x%04lx-0x%04lx (probed)\n",
-           device_xname(&sc->dev), (long) sc->iobase,
-           (long) sc->iobase + sc->iosize));
+       DPRINTF(("%s: bus_space_alloc range "
+           "0x%04" PRIxPADDR "-0x%04" PRIxPADDR " (probed)\n",
+           device_xname(&sc->dev), sc->iobase,
+           sc->iobase + sc->iosize));
 
        if (pcic_isa_alloc_iobase && pcic_isa_alloc_iosize) {
                sc->iobase = pcic_isa_alloc_iobase;
                sc->iosize = pcic_isa_alloc_iosize;
 
-               DPRINTF(("%s: bus_space_alloc range 0x%04lx-0x%04lx "
-                   "(config override)\n", device_xname(&sc->dev),
-                   (long) sc->iobase, (long) sc->iobase + sc->iosize));
+               DPRINTF(("%s: bus_space_alloc range "
+                   "0x%04" PRIxPADDR "-0x%04" PRIxPADDR "(config override)\n",
+                   device_xname(&sc->dev),
+                   sc->iobase, sc->iobase + sc->iosize));
        }
 }
 
Index: dev/isapnp/i82365_isapnp.c
===================================================================
RCS file: /cvsroot/src/sys/dev/isapnp/i82365_isapnp.c,v
retrieving revision 1.30
diff -u -u -r1.30 i82365_isapnp.c
--- dev/isapnp/i82365_isapnp.c  17 Sep 2009 18:14:41 -0000      1.30
+++ dev/isapnp/i82365_isapnp.c  7 Jan 2010 23:45:15 -0000
@@ -1,4 +1,3 @@
-/*     $NetBSD: i82365_isapnp.c,v 1.30 2009/09/17 18:14:41 tsutsui Exp $       
*/
 
 /*
  * Copyright (c) 1998 Bill Sommerfeld.  All rights reserved.
@@ -153,7 +152,7 @@
                printf(": can't alloc mem space\n");
                return;
        }
-       printf(": using iomem 0x%lx iosiz 0x%x", maddr, msize);
+       printf(": using iomem %#" PRIxPADDR " iosiz %#x", maddr, msize);
        sc->membase = maddr;
        sc->subregionmask = (1 << (msize / PCIC_MEM_PAGESIZE)) - 1;
 
Index: dev/pci/agp.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/agp.c,v
retrieving revision 1.65
diff -u -u -r1.65 agp.c
--- dev/pci/agp.c       27 Jan 2009 08:39:33 -0000      1.65
+++ dev/pci/agp.c       7 Jan 2010 23:45:16 -0000
@@ -327,7 +327,7 @@
         * Work out an upper bound for agp memory allocation. This
         * uses a heuristic table from the Linux driver.
         */
-       memsize = ptoa(physmem) >> 20;
+       memsize = physmem >> 8; /* total physmem in MB */
        for (i = 0; i < agp_max_size; i++) {
                if (memsize <= agp_max[i][0])
                        break;
Index: kern/kern_proc.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_proc.c,v
retrieving revision 1.159
diff -u -u -r1.159 kern_proc.c
--- kern/kern_proc.c    17 Dec 2009 01:25:10 -0000      1.159
+++ kern/kern_proc.c    7 Jan 2010 23:45:40 -0000
@@ -416,7 +416,7 @@
        limit0.pl_rlimit[RLIMIT_NPROC].rlim_cur =
            maxproc < maxuprc ? maxproc : maxuprc;
 
-       lim = ptoa(uvmexp.free);
+       lim = ctob((uint64_t)uvmexp.free);
        limit0.pl_rlimit[RLIMIT_RSS].rlim_max = lim;
        limit0.pl_rlimit[RLIMIT_MEMLOCK].rlim_max = lim;
        limit0.pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = lim / 3;
Index: uvm/uvm_glue.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_glue.c,v
retrieving revision 1.143
diff -u -u -r1.143 uvm_glue.c
--- uvm/uvm_glue.c      17 Dec 2009 01:25:11 -0000      1.143
+++ uvm/uvm_glue.c      7 Jan 2010 23:54:46 -0000
@@ -407,7 +407,7 @@
        p->p_rlimit[RLIMIT_DATA].rlim_max = maxdmap;
        p->p_rlimit[RLIMIT_AS].rlim_cur = RLIM_INFINITY;
        p->p_rlimit[RLIMIT_AS].rlim_max = RLIM_INFINITY;
-       p->p_rlimit[RLIMIT_RSS].rlim_cur = ptoa(uvmexp.free);
+       p->p_rlimit[RLIMIT_RSS].rlim_cur = ctob((uint64_t)uvmexp.free);
 }
 
 /*
Index: uvm/uvm_page.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_page.c,v
retrieving revision 1.152
diff -u -u -r1.152 uvm_page.c
--- uvm/uvm_page.c      7 Nov 2009 07:27:50 -0000       1.152
+++ uvm/uvm_page.c      7 Jan 2010 23:54:46 -0000
@@ -339,7 +339,7 @@
 void
 uvm_page_init(vaddr_t *kvm_startp, vaddr_t *kvm_endp)
 {
-       vsize_t freepages, pagecount, bucketcount, n;
+       psize_t freepages, pagecount, bucketcount, n;
        struct pgflbucket *bucketarray, *cpuarray;
        struct vm_page *pagearray;
        int lcv;
@@ -439,7 +439,7 @@
                vm_physmem[lcv].lastpg = vm_physmem[lcv].pgs + (n - 1);
 
                /* init and free vm_pages (we've already zeroed them) */
-               paddr = ptoa(vm_physmem[lcv].start);
+               paddr = ctob(vm_physmem[lcv].start);
                for (i = 0 ; i < n ; i++, paddr += PAGE_SIZE) {
                        vm_physmem[lcv].pgs[i].phys_addr = paddr;
 #ifdef __HAVE_VM_PAGE_MD
@@ -642,7 +642,7 @@
                /* try from front */
                if (vm_physmem[lcv].avail_start == vm_physmem[lcv].start &&
                    vm_physmem[lcv].avail_start < vm_physmem[lcv].avail_end) {
-                       *paddrp = ptoa(vm_physmem[lcv].avail_start);
+                       *paddrp = ctob(vm_physmem[lcv].avail_start);
                        vm_physmem[lcv].avail_start++;
                        vm_physmem[lcv].start++;
                        /* nothing left?   nuke it */
@@ -661,7 +661,7 @@
                /* try from rear */
                if (vm_physmem[lcv].avail_end == vm_physmem[lcv].end &&
                    vm_physmem[lcv].avail_start < vm_physmem[lcv].avail_end) {
-                       *paddrp = ptoa(vm_physmem[lcv].avail_end - 1);
+                       *paddrp = ctob(vm_physmem[lcv].avail_end - 1);
                        vm_physmem[lcv].avail_end--;
                        vm_physmem[lcv].end--;
                        /* nothing left?   nuke it */
@@ -690,7 +690,7 @@
                if (vm_physmem[lcv].avail_start >= vm_physmem[lcv].avail_end)
                        continue;  /* nope */
 
-               *paddrp = ptoa(vm_physmem[lcv].avail_start);
+               *paddrp = ctob(vm_physmem[lcv].avail_start);
                vm_physmem[lcv].avail_start++;
                /* truncate! */
                vm_physmem[lcv].start = vm_physmem[lcv].avail_start;
@@ -793,7 +793,7 @@
                }
                /* zero data, init phys_addr and free_list, and free pages */
                memset(pgs, 0, sizeof(struct vm_page) * npages);
-               for (lcv = 0, paddr = ptoa(start) ;
+               for (lcv = 0, paddr = ctob(start) ;
                                 lcv < npages ; lcv++, paddr += PAGE_SIZE) {
                        pgs[lcv].phys_addr = paddr;
                        pgs[lcv].free_list = free_list;


Home | Main Index | Thread Index | Old Index