summaryrefslogtreecommitdiff
path: root/emulators/qemu-devel/files/extra-patch-sysctl-hw-availpages
blob: 5253802430bc020ad396d6e327d4d78075c21a51 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
From nox Mon Sep 17 00:00:00 2001
From: Juergen Lock <nox@jelal.kn-bremen.de>
Date: 05 Apr 2014 21:06:00 +0200
Subject: Fix bsd-user FreeBSD hw.availpages sysctl

hw.availpages is defined as OID_AUTO so the mib can change; find out
it's value at the first hw.* sysctl syscall.

Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>

--- a/bsd-user/freebsd/os-sys.c
+++ b/bsd-user/freebsd/os-sys.c
@@ -219,24 +219,36 @@ abi_long do_freebsd_sysctl(CPUArchState 
             ret = 0;
             goto out;
 
-        case 851: /* hw.availpages */
+        default:
             {
-                long lvalue;
-                size_t len = sizeof(lvalue);
+                static int oid_hw_availpages;
+
+                if (!oid_hw_availpages) {
+                    int real_oid[CTL_MAXNAME+2];
+                    size_t len = sizeof(real_oid) / sizeof(int);
 
-                if (sysctlbyname("hw.availpages", &lvalue, &len, NULL, 0)
-                        == -1) {
-                    ret = -1;
-                } else {
-                    (*(abi_ulong *)holdp) = tswapal((abi_ulong)lvalue);
-                    holdlen = sizeof(abi_ulong);
-                    ret = 0;
+                    if (sysctlnametomib("hw.availpages", real_oid, &len) >= 0)
+                        oid_hw_availpages = real_oid[1];
                 }
-            }
-            goto out;
 
-        default:
-            break;
+                if (oid_hw_availpages && snamep[1] == oid_hw_availpages) {
+                    long lvalue;
+                    size_t len = sizeof(lvalue);
+
+                    if (sysctlbyname("hw.availpages", &lvalue, &len, NULL, 0)
+                            == -1) {
+                        ret = -1;
+                    } else {
+                        if (oldlen) {
+                            (*(abi_ulong *)holdp) = tswapal((abi_ulong)lvalue);
+                        }
+                        holdlen = sizeof(abi_ulong);
+                        ret = 0;
+                    }
+                    goto out;
+                }
+                break;
+            }
         }
     default:
         break;