Skip to content

Commit fde5639

Browse files
committed
Make musl initialization work with unikraft
Work around some syscalls not being implemented in unikraft. Signed-off-by: Cyril Soldani <[email protected]>
1 parent 9cc1990 commit fde5639

4 files changed

+100
-0
lines changed

patches/0013-init-no-mprotect.patch

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--- a/src/thread/pthread_create.c 2020-11-06 14:30:42.098195850 +0100
2+
+++ b/src/thread/pthread_create.c 2020-11-06 14:41:51.039515090 +0100
3+
@@ -244,11 +244,6 @@
4+
if (guard) {
5+
map = __mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANON, -1, 0);
6+
if (map == MAP_FAILED) goto fail;
7+
- if (__mprotect(map+guard, size-guard, PROT_READ|PROT_WRITE)
8+
- && errno != ENOSYS) {
9+
- __munmap(map, size);
10+
- goto fail;
11+
- }
12+
} else {
13+
map = __mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
14+
if (map == MAP_FAILED) goto fail;

patches/0014-mmap-alloc.patch

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--- a/src/mman/mmap.c 2020-11-06 14:33:14.588895081 +0100
2+
+++ b/src/mman/mmap.c 2020-11-06 14:54:26.393274709 +0100
3+
@@ -6,6 +6,9 @@
4+
#include "syscall.h"
5+
#include "libc.h"
6+
7+
+#include <uk/alloc.h>
8+
+#include <uk/assert.h>
9+
+
10+
static void dummy(void) { }
11+
weak_alias(dummy, __vm_wait);
12+
13+
@@ -26,11 +29,22 @@
14+
if (flags & MAP_FIXED) {
15+
__vm_wait();
16+
}
17+
+ if (start == NULL && fd == -1 && (flags & MAP_ANON)) {
18+
+ start = NULL;
19+
+ uk_posix_memalign(
20+
+ uk_alloc_get_default(),
21+
+ &start,
22+
+ 4096, // TODO read actual page size
23+
+ len);
24+
+ UK_ASSERT(start != NULL);
25+
+ ret = (long) start;
26+
+ } else {
27+
#ifdef SYS_mmap2
28+
- ret = __syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT);
29+
+ ret = __syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT);
30+
#else
31+
- ret = __syscall(SYS_mmap, start, len, prot, flags, fd, off);
32+
+ ret = __syscall(SYS_mmap, start, len, prot, flags, fd, off);
33+
#endif
34+
+ }
35+
/* Fixup incorrect EPERM from kernel. */
36+
if (ret == -EPERM && !start && (flags&MAP_ANON) && !(flags&MAP_FIXED))
37+
ret = -ENOMEM;
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--- a/src/env/__init_tls.c 2020-11-06 14:11:05.226052792 +0100
2+
+++ b/src/env/__init_tls.c 2020-11-06 14:37:32.885073260 +0100
3+
@@ -8,6 +8,9 @@
4+
#include "atomic.h"
5+
#include "syscall.h"
6+
7+
+#include <uk/alloc.h>
8+
+#include <uk/assert.h>
9+
+
10+
int __init_tp(void *p)
11+
{
12+
pthread_t td = p;
13+
@@ -114,16 +117,13 @@
14+
+ MIN_TLS_ALIGN-1 & -MIN_TLS_ALIGN;
15+
16+
if (libc.tls_size > sizeof builtin_tls) {
17+
-#ifndef SYS_mmap2
18+
-#define SYS_mmap2 SYS_mmap
19+
-#endif
20+
- mem = (void *)__syscall(
21+
- SYS_mmap2,
22+
- 0, libc.tls_size, PROT_READ|PROT_WRITE,
23+
- MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
24+
- /* -4095...-1 cast to void * will crash on dereference anyway,
25+
- * so don't bloat the init code checking for error codes and
26+
- * explicitly calling a_crash(). */
27+
+ mem = NULL;
28+
+ uk_posix_memalign(
29+
+ uk_alloc_get_default(),
30+
+ &mem,
31+
+ 4096, // TODO read actual page size
32+
+ libc.tls_size);
33+
+ UK_ASSERT(mem != NULL);
34+
} else {
35+
mem = builtin_tls;
36+
}

patches/0016-avoid-arch_prctl.patch

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--- a/src/thread/x86_64/__set_thread_area.s 2018-02-22 19:39:19.000000000 +0100
2+
+++ b/src/thread/x86_64/__set_thread_area.s 2020-11-13 12:26:36.600544392 +0100
3+
@@ -3,8 +3,6 @@
4+
.global __set_thread_area
5+
.type __set_thread_area,@function
6+
__set_thread_area:
7+
- mov %rdi,%rsi /* shift for syscall */
8+
- movl $0x1002,%edi /* SET_FS register */
9+
- movl $158,%eax /* set fs segment to */
10+
- syscall /* arch_prctl(SET_FS, arg)*/
11+
+ wrfsbase %rdi
12+
+ movq $0,%rax
13+
ret

0 commit comments

Comments
 (0)