HW_PHYSMEM is available on Mac OS X as well as FreeBSD, however,
its resulting value for Mac OS X is 32 bits. Mac OS X provides
HW_MEMSIZE that is 64 bits version of HW_PHYSMEM. We have to use it.
I tested the patch on Mac OS X 10.6.8, 10.7.4, 10.8.5 and FreeBSD 9.2.
Signed-off-by: Ryota Ozaki <ozaki.ryota(a)gmail.com>
---
src/nodeinfo.c | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 70814c2..a0fdfe7 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -73,6 +73,33 @@ appleFreebsdNodeGetCPUCount(void)
return ncpu;
}
+
+/* VIR_HW_PHYSMEM - the resulting value of HW_PHYSMEM of FreeBSD
+ * is 64 bits while that of Mac OS X is still 32 bits.
+ * Mac OS X provides HW_MEMSIZE for 64 bits version of HW_PHYSMEM
+ * since 10.6.8 (Snow Leopard) at least.
+ */
+# ifdef HW_MEMSIZE
+# define VIR_HW_PHYSMEM HW_MEMSIZE
+# else
+# define VIR_HW_PHYSMEM HW_PHYSMEM
+# endif
+static int
+appleFreebsdNodeGetMemorySize(unsigned long *memory)
+{
+ int mib[2] = { CTL_HW, VIR_HW_PHYSMEM };
+ unsigned long physmem;
+ size_t len = sizeof(physmem);
+
+ if (sysctl(mib, 2, &physmem, &len, NULL, 0) == -1) {
+ virReportSystemError(errno, "%s", _("cannot obtain memory
size"));
+ return -1;
+ }
+
+ *memory = (unsigned long)(physmem / 1024);
+
+ return 0;
+}
#endif
#ifdef __linux__
@@ -914,17 +941,8 @@ cleanup:
nodeinfo->mhz = cpu_freq / 1000000;
# endif
- /* get memory information */
- int mib[2] = { CTL_HW, HW_PHYSMEM };
- unsigned long physmem;
- size_t len = sizeof(physmem);
-
- if (sysctl(mib, 2, &physmem, &len, NULL, 0) == -1) {
- virReportSystemError(errno, "%s", _("cannot obtain memory
size"));
+ if (appleFreebsdNodeGetMemorySize(&nodeinfo->memory) < 0)
return -1;
- }
-
- nodeinfo->memory = (unsigned long)(physmem / 1024);
return 0;
}
--
1.8.4