From owner-freebsd-mobile Tue Jul 16 11:32:27 1996 Return-Path: owner-mobile Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id LAA20854 for mobile-outgoing; Tue, 16 Jul 1996 11:32:27 -0700 (PDT) Received: from rocky.mt.sri.com (rocky.mt.sri.com [206.127.76.100]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id LAA20845; Tue, 16 Jul 1996 11:32:23 -0700 (PDT) Received: (from nate@localhost) by rocky.mt.sri.com (8.7.5/8.7.3) id MAA25236; Tue, 16 Jul 1996 12:32:16 -0600 (MDT) Date: Tue, 16 Jul 1996 12:32:16 -0600 (MDT) Message-Id: <199607161832.MAA25236@rocky.mt.sri.com> From: Nate Williams To: mobile@freebsd.org CC: bde@freebsd.org, davidg@freebsd.org Subject: Possible fix for APM_DSVALUE_BUG Sender: owner-mobile@freebsd.org X-Loop: FreeBSD.org Precedence: bulk OK, I lied about not getting to this this week. ;) Based on a comment David Greenman made, I tried out the following code and it seems to work. At least, I can now run the APM commands on my laptop w/out a kernel panic, although suspend/resume doesn't work because the hardware suspend/resume on my box has been disabled for a different project. Again, this code is probably not going to be exactly the same as the code in the final version, but functionally it should be similar. Can ThinkPad owners please apply this to /sys/i386/i386/machdep.c, and build a new kernel with it. If it works (it should work fine), remove the APM_DSVALUE_BUG option from the config file and see if it still works. (It should). I'll be around today and tomorrow, but I'm leaving on my mini-vacation Weds. night and won't be back until early next week. For a description of the problem, see my previous article. Nate ------ ps. To Bruce and David, can you review this patch and give me any feedback/suggestions. As it stands now this should work fine in -current in spite of the bootblock differences, since the code is never executed unless the bootblocks return valid information. Also, please note the code inside '#ifdef unsure_if_needed'. Should the mapping have to occur on page boundaries? I am using it fine w/out the rounding down right now. -------- Index: machdep.c =================================================================== RCS file: /home/CVS/src/sys/i386/i386/machdep.c,v retrieving revision 1.195 diff -u -r1.195 machdep.c --- machdep.c 1996/07/12 06:09:49 1.195 +++ machdep.c 1996/07/16 18:21:19 @@ -1239,9 +1239,39 @@ * the official interface should be used. */ if (bootinfo.bi_memsizes_valid) { - if (bootinfo.bi_basemem != biosbasemem) - printf("BIOS basemem (%ldK) != RTC basemem (%dK)\n", + vm_offset_t pa, va, tmpva; + vm_size_t size; + unsigned *pte; + + if (bootinfo.bi_basemem != biosbasemem) { + printf("BIOS basemem (%ldK) != RTC basemem (%dK),", bootinfo.bi_basemem, biosbasemem); + printf(" setting to BIOS basemem\n"); + biosbasemem = bootinfo.bi_basemem; + /* + * XXX - Map this 'hole' of memory in the same manner + * as the ISA_HOLE (read/write/non-cacheable), since + * the BIOS 'fudges' it to become part of the ISA_HOLE. + * This code is similar to the code used in + * pmap_mapdev, but since no memory needs to be + * allocated we simply change the mapping. + */ +#ifdef unsure_if_needed + /* Round it down to the nearest page */ + pa = rounddown(biosbasemem * 1024, PAGE_SIZE); +#else + pa = biosbasemem * 1024; +#endif + va = pa + KERNBASE; + size = roundup(ISA_HOLE_START - pa, PAGE_SIZE); + for (tmpva = va; size > 0;) { + pte = (unsigned *)vtopte(tmpva); + *pte = pa | PG_RW | PG_V | PG_N; + size -= PAGE_SIZE; + tmpva += PAGE_SIZE; + pa += PAGE_SIZE; + } + } if (bootinfo.bi_extmem != biosextmem) printf("BIOS extmem (%ldK) != RTC extmem (%dK)\n", bootinfo.bi_extmem, biosextmem);