On Wed, Jul 04, 2018 at 08:19:25PM +0200, Peter J. Philipp wrote: > Hi again, > > I came up with a fix, but not sure if it's correct. The problem is that the > physical memory here is 32 bits (paddr_t defined in > arch/powerpc/include/_types.h). > So when we have 4 banks of 1 GB we end up with 2^32 which wraps around to 0 on > the paddr_t so we report as 0MB. My fix/workaround is simple I steal a page > upon atop() so that upon wrap-around at 4GB (selfish I know) some pages are > missing and it ends up below MAX of unsigned long. > > According to wikipedia only the PowerMac11,2 supports up to 16 GB the rest > are all maximum 4GB, and I don't think the PowerMac11,2 is supported. > > https://en.wikipedia.org/wiki/Power_Mac_G5 > > -peter
So sorry, it was erroneous... second attempt. The first attempt wasn't safe for replies from OFW that were of size 0. Also on my box the dmesg starts like so on this: OpenBSD 6.3-current (GENERIC.MP) #8: Thu Jul 5 00:59:43 CEST 2018 p...@iota.centroid.eu:/usr/src/sys/arch/macppc/compile/GENERIC.MP real mem = 4294950912 (4095MB) avail mem = 2020478976 (1926MB) mpath0 at root scsibus0 at mpath0: 256 targets mainbus0 at root: model PowerMac7,3 cpu0 at mainbus0: 970FX (Revision 0x300): 1800 MHz cpu1 at mainbus0: 970FX (Revision 0x300): 1800 MHz mem0 at mainbus0 Also to show that a disklabel works it looks like so: iota# disklabel -E wd0 Label editor (enter '?' for help at any prompt) > A > p OpenBSD area: 4096-625142448; size: 625138352; free: 48 # size offset fstype [fsize bsize cpg] a: 2097152 4096 4.2BSD 2048 16384 1 # / b: 8912864 2101248 swap c: 625142448 0 unused d: 8388608 11014112 4.2BSD 2048 16384 1 # /tmp e: 25165760 19402720 4.2BSD 2048 16384 1 # /var f: 4194304 44568480 4.2BSD 2048 16384 1 # /usr g: 2097152 48762784 4.2BSD 2048 16384 1 # /usr/X11R6 h: 20971520 50859936 4.2BSD 2048 16384 1 # /usr/local i: 2048 1 MSDOS j: 4194304 71831456 4.2BSD 2048 16384 1 # /usr/src k: 12582912 76025760 4.2BSD 2048 16384 1 # /usr/obj l: 536533728 88608672 4.2BSD 4096 32768 1 # /home > x iota# Which would seem correct. Regards, -peter Index: ofw_machdep.c =================================================================== RCS file: /cvs/src/sys/arch/macppc/macppc/ofw_machdep.c,v retrieving revision 1.56 diff -u -p -u -r1.56 ofw_machdep.c --- ofw_machdep.c 22 Jul 2017 18:33:38 -0000 1.56 +++ ofw_machdep.c 4 Jul 2018 23:03:05 -0000 @@ -133,7 +133,7 @@ ofw_read_mem_regions(int phandle, int ad { int nreg, navail; int i, j; - uint physpages; + uint physpages, tmp; switch (address_cells) { default: @@ -171,16 +171,22 @@ ofw_read_mem_regions(int phandle, int ad case 2: physpages = 0; for (i = 0, j = 0; i < nreg; i++) { - if (OFmem64[i].size == 0) + tmp = OFmem64[i].size; + if (tmp == 0) continue; - physpages += atop(OFmem64[i].size); + /* + * we steal a page here per memory bank if there is + * some to steal, this will ultimately prevent + * wrapover to 0 + */ + physpages += (atop(tmp) ? atop(tmp) - 1 : 0); if (OFmem64[i].start >= 1ULL << 32) continue; OFmem[j].start = OFmem64[i].start; - if (OFmem64[i].start + OFmem64[i].size >= 1ULL << 32) + if (OFmem64[i].start + tmp >= 1ULL << 32) OFmem[j].size = (1ULL << 32) - OFmem64[i].start; else - OFmem[j].size = OFmem64[i].size; + OFmem[j].size = tmp; j++; } physmem = physpages;