1 1.12 riastrad /* $NetBSD: getextmemx.c,v 1.12 2024/08/24 20:23:11 riastradh Exp $ */ 2 1.1 drochner 3 1.1 drochner /* 4 1.2 drochner * Copyright (c) 1997, 1999 5 1.1 drochner * Matthias Drochner. All rights reserved. 6 1.1 drochner * 7 1.1 drochner * Redistribution and use in source and binary forms, with or without 8 1.1 drochner * modification, are permitted provided that the following conditions 9 1.1 drochner * are met: 10 1.1 drochner * 1. Redistributions of source code must retain the above copyright 11 1.1 drochner * notice, this list of conditions and the following disclaimer. 12 1.1 drochner * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 drochner * notice, this list of conditions and the following disclaimer in the 14 1.1 drochner * documentation and/or other materials provided with the distribution. 15 1.1 drochner * 16 1.1 drochner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 drochner * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 drochner * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 drochner * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 drochner * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 drochner * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 drochner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 drochner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 drochner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 drochner * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.1 drochner * 27 1.1 drochner */ 28 1.1 drochner 29 1.2 drochner /* 30 1.2 drochner * Try 2 more fancy BIOS calls to get the size of extended 31 1.2 drochner * memory besides the classical int15/88, take maximum. 32 1.2 drochner * needs lowlevel parts from biosmemx.S and biosmem.S 33 1.1 drochner */ 34 1.1 drochner 35 1.1 drochner #include <lib/libsa/stand.h> 36 1.1 drochner #include "libi386.h" 37 1.1 drochner 38 1.2 drochner int 39 1.9 christos getextmemx(void) 40 1.1 drochner { 41 1.11 andvar /* 42 1.12 riastrad * Allocate 6 words, not 5, to work around buggy firmware -- 43 1.12 riastrad * see comment on getmementry in biosmemx.S. 44 1.11 andvar */ 45 1.11 andvar int buf[6], i; 46 1.1 drochner int extmem = getextmem1(); 47 1.3 jdolecek #ifdef SUPPORT_PS2 48 1.3 jdolecek struct { 49 1.3 jdolecek uint16_t len; 50 1.3 jdolecek uint32_t dta[8]; 51 1.3 jdolecek /* pad to 64 bytes - without this, machine would reset */ 52 1.3 jdolecek uint8_t __pad[30]; 53 1.8 perry } __packed bufps2; 54 1.3 jdolecek #endif 55 1.1 drochner 56 1.4 dsl #ifdef DEBUG_MEMSIZE 57 1.5 dsl printf("extmem1: %xk\n", extmem); 58 1.4 dsl #endif 59 1.5 dsl if (!getextmem2(buf)) { 60 1.4 dsl #ifdef DEBUG_MEMSIZE 61 1.5 dsl printf("extmem2: %xk + %xk\n", buf[0], buf[1] * 64); 62 1.4 dsl #endif 63 1.5 dsl if (buf[0] <= 15 * 1024) { 64 1.5 dsl int help = buf[0]; 65 1.5 dsl if (help == 15 * 1024) 66 1.5 dsl help += buf[1] * 64; 67 1.5 dsl if (extmem < help) 68 1.5 dsl extmem = help; 69 1.5 dsl } 70 1.1 drochner } 71 1.1 drochner 72 1.2 drochner i = 0; 73 1.2 drochner do { 74 1.2 drochner if (getmementry(&i, buf)) 75 1.2 drochner break; 76 1.4 dsl #ifdef DEBUG_MEMSIZE 77 1.4 dsl printf("mementry: (%d) %x %x %x %x %x\n", 78 1.4 dsl i, buf[0], buf[1], buf[2], buf[3], buf[4]); 79 1.4 dsl #endif 80 1.2 drochner if ((buf[4] == 1 && buf[0] == 0x100000) 81 1.2 drochner && extmem < buf[2] / 1024) 82 1.1 drochner extmem = buf[2] / 1024; 83 1.2 drochner } while (i); 84 1.3 jdolecek 85 1.3 jdolecek #ifdef SUPPORT_PS2 86 1.3 jdolecek /* use local memory information from RETURN MEMORY-MAP INFORMATION */ 87 1.3 jdolecek if (!getextmemps2((void *) &bufps2)) { 88 1.3 jdolecek int help = bufps2.dta[0]; 89 1.3 jdolecek if (help == 15 * 1024) 90 1.3 jdolecek help += bufps2.dta[1]; 91 1.3 jdolecek if (extmem < help) 92 1.3 jdolecek extmem = help; 93 1.3 jdolecek } 94 1.3 jdolecek #endif 95 1.1 drochner 96 1.9 christos return extmem; 97 1.1 drochner } 98