[PATCH] Allow the kernel to start earlier than VM_MAX_ADDRESS
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Mon, 13 Jul 2020 19:34:17 +0000 (20:34 +0100)
committerAurelien Jarno <aurel32@debian.org>
Mon, 13 Jul 2020 19:34:17 +0000 (20:34 +0100)
VM_MAX_ADDRESS shouldn't be hardcoded in libc, the kernel should be able to
decide about it dynamically. This fixes glibc into supporting that. It's however
a bit hackish.

Gbp-Pq: Topic hurd-i386
Gbp-Pq: Name tg-bigmem.diff

sysdeps/mach/hurd/dl-sysdep.c

index 574e2528362b6d0960337431f378b8d53118275a..061d037a3ebd7aad503a476f0b454f009e5dd62d 100644 (file)
@@ -88,12 +88,28 @@ static void fmh(void) {
        max=a; break;}
       fmha=a+=fmhs;}
     if (err) assert(err==KERN_NO_SPACE);
-    if (!fmha)fmhs=0;else{
-    fmhs=max-fmha;
-    err = __vm_map (__mach_task_self (),
-                   &fmha, fmhs, 0, 0, MACH_PORT_NULL, 0, 1,
-                   VM_PROT_NONE, VM_PROT_NONE, VM_INHERIT_COPY);
-    assert_perror(err);}
+    if (!fmha)
+      fmhs=0;
+    else
+      while (1) {
+       fmhs=max-fmha;
+       if (fmhs == 0)
+         break;
+       err = __vm_map (__mach_task_self (),
+                       &fmha, fmhs, 0, 0, MACH_PORT_NULL, 0, 1,
+                       VM_PROT_NONE, VM_PROT_NONE, VM_INHERIT_COPY);
+       if (!err)
+         break;
+       if (err != KERN_INVALID_ADDRESS && err != KERN_NO_SPACE)
+         assert_perror(err);
+       vm_address_t new_max = (max - 1) & 0xf0000000U;
+       if (new_max >= max) {
+         fmhs = 0;
+         fmha = 0;
+         break;
+       }
+       max = new_max;
+      }
   }
 /* XXX loser kludge for vm_map kernel bug */
 #endif