Date: Fri, 9 Dec 2005 21:46:29 -0600 From: Dan Nelson <dnelson@allantgroup.com> To: Giorgos Keramidas <keramida@linux.gr> Cc: freebsd-hackers@freebsd.org, babkin@users.sourceforge.net, Divacky Roman <xdivac02@stud.fit.vutbr.cz> Subject: Re: sysctl, HW_PHYSMEM, and crippled gcc Message-ID: <20051210034629.GI95420@dan.emsphone.com> In-Reply-To: <20051210020643.GA6206@flame.pc> References: <10939303.1134158545675.JavaMail.root@vms070.mailsrvcs.net> <20051210020643.GA6206@flame.pc>
next in thread | previous in thread | raw e-mail | index | archive | help
In the last episode (Dec 10), Giorgos Keramidas said:
> >>On Thu, Dec 08, 2005 at 05:06:16PM -0800, Steve Kargl wrote:
> >>> Anyone have any insight into fixing gcc to make better
> >>> use of system memory on systems with more than 4 GB.
> >>> It appears that libiberty/physmem.c tries to use sysctl()
> >>> to determine the amount of physical memory in a system.
> >>>
> >>> { /* This works on *bsd and darwin. */
> >>> unsigned int physmem;
> >>> size_t len = sizeof physmem;
> >>> static int mib[2] = { CTL_HW, HW_PHYSMEM };
> >>>
> >>> if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0
> >>> && len == sizeof (physmem))
> >>> return (double) physmem;
> >>> }
> >>>
> >>> This works if you have less than 4GB because of the unsigned
> >>> int physmem. I have 12 GB, which of course, when expanded
> >>> to the number of bytes doesn't fit into a unsigned int physmem.
>
> Can someone with access to a system with more than 4 GB verify that the
> following works correctly?
>
> % flame:/home/keramida/tmp/physmem$ cat -n physmem.c
> % 9 int
> % 10 main(void)
> % 11 {
> % 12 uint64_t physmem;
> % 13 size_t len = sizeof physmem;
> % 14 static int mib[] = { CTL_HW, HW_PHYSMEM };
> % 15 static size_t miblen = sizeof(mib) / sizeof(mib[0]);
> % 16
> % 17 if (sysctl(mib, miblen, &physmem, &len, NULL, 0) != 0)
> % 18 err(1, "sysctl hw.physmem");
> % 19 printf("Physical memory = %ju bytes\n", (intmax_t)physmem);
> % 20 return EXIT_SUCCESS;
> % 21 }
Won't this break on x86, where physmem is 32 bits? Just use "unsigned
long", which is what the sysctl type is according to kern_mib.c .
--
Dan Nelson
dnelson@allantgroup.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20051210034629.GI95420>
