sysctl, HW_PHYSMEM, and crippled gcc
Giorgos Keramidas
keramida at ceid.upatras.gr
Mon Dec 12 05:56:58 PST 2005
On 2005-12-09 21:46, Dan Nelson <dnelson at allantgroup.com> wrote:
>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 .
I'm not sure it breaks, but seeing it just work on a couple of systems
doesn't mean much. You're right of course, that the correct type from
kern_mib.c is better.
Thanks :)
More information about the freebsd-hackers
mailing list