Hi, Ping. I just booted with a bsd.rd and saw this issue is still outstanding. Is the patch that I provided not good enough?
Regards, -peter On Thu, Jul 05, 2018 at 02:00:45PM +0200, Peter J. Philipp wrote: > On Thu, Jul 05, 2018 at 11:20:51AM +0200, Mark Kettenis wrote: > > > 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: > > > > Sorry, but this isn't quite right. What the code should really do is > > count all memory below the 4G boundary. Since part if the phyical > > address space is reserved for devices that will be less < 4GB. > > > > Yes that means that dmesg will not report the full amount of memory in > > the machine. But you can't use that memory anyway on a 32-bit OpenBSD > > system. And if the physmem variable includes a lot of memory that > > isn't actually usable, the kernel will make bad choices in sizing > > various things. > > > > Cheers, > > > > Mark > > Hi Mark, > > That makes perfect sense. I adjusted my patch and wonder if you like it? > The patch takes a "pagelimit" which is UINT_MAX >> PAGE_SHIFT and doesn't > allow page counts over that. This way is guaranteed that there is never > an overflow. It perhaps isn't the classiest patch out there. > > Here is what the dmesg reports from real memory from the last patch and below > it the real memory from this patch. > > iota# dmesg | grep ^real\ mem > real mem = 4294950912 (4095MB) > real mem = 4294963200 (4095MB) > > 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 5 Jul 2018 11:51:35 -0000 > @@ -131,9 +131,10 @@ ppc_mem_regions(struct mem_region **memp > void > ofw_read_mem_regions(int phandle, int address_cells, int size_cells) > { > + const uint pagelimit = (UINT_MAX >> PAGE_SHIFT); > int nreg, navail; > int i, j; > - uint physpages; > + uint physpages, tmp; > > switch (address_cells) { > default: > @@ -171,16 +172,26 @@ 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) > + if ((tmp = OFmem64[i].size) == 0) > continue; > - physpages += atop(OFmem64[i].size); > + > + /* > + * restrict overflows to constant pagelimit, > + * even if > 4 GB of memory exist in the machine > + */ > + > + if (physpages + atop(tmp) > pagelimit) > + physpages = pagelimit; > + else > + physpages += atop(tmp); > + > 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;