From owner-freebsd-hackers@FreeBSD.ORG Mon Dec 12 13:56:58 2005 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 25CB016A420 for ; Mon, 12 Dec 2005 13:56:58 +0000 (GMT) (envelope-from keramida@ceid.upatras.gr) Received: from aiolos.otenet.gr (aiolos.otenet.gr [195.170.0.93]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0470843D68 for ; Mon, 12 Dec 2005 13:56:55 +0000 (GMT) (envelope-from keramida@ceid.upatras.gr) Received: from flame.pc (aris.bedc.ondsl.gr [62.103.39.226]) by aiolos.otenet.gr (8.13.4/8.13.4/Debian-8) with SMTP id jBCDulr6004335; Mon, 12 Dec 2005 15:56:47 +0200 Received: by flame.pc (Postfix, from userid 1001) id 73A4D115BB; Mon, 12 Dec 2005 15:55:57 +0200 (EET) Date: Mon, 12 Dec 2005 15:55:57 +0200 From: Giorgos Keramidas To: Dan Nelson Message-ID: <20051212135557.GA1893@flame.pc> References: <10939303.1134158545675.JavaMail.root@vms070.mailsrvcs.net> <20051210020643.GA6206@flame.pc> <20051210034629.GI95420@dan.emsphone.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20051210034629.GI95420@dan.emsphone.com> Cc: freebsd-hackers@freebsd.org, babkin@users.sourceforge.net, Divacky Roman Subject: Re: sysctl, HW_PHYSMEM, and crippled gcc X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 12 Dec 2005 13:56:58 -0000 On 2005-12-09 21:46, Dan Nelson 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 :)