sysctl, HW_PHYSMEM, and crippled gcc

Dan Nelson dnelson at allantgroup.com
Fri Dec 9 19:46:31 PST 2005


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 at allantgroup.com


More information about the freebsd-hackers mailing list