Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Dec 2005 15:55:57 +0200
From:      Giorgos Keramidas <keramida@ceid.upatras.gr>
To:        Dan Nelson <dnelson@allantgroup.com>
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:  <20051212135557.GA1893@flame.pc>
In-Reply-To: <20051210034629.GI95420@dan.emsphone.com>
References:  <10939303.1134158545675.JavaMail.root@vms070.mailsrvcs.net> <20051210020643.GA6206@flame.pc> <20051210034629.GI95420@dan.emsphone.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2005-12-09 21:46, Dan Nelson <dnelson@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 :)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20051212135557.GA1893>