Skip to content

Commit a7f00ec

Browse files
committed
Patch musl libc for Hyperlight
Signed-off-by: Ludvig Liljenberg <[email protected]>
1 parent 053e1ec commit a7f00ec

File tree

29 files changed

+67
-211
lines changed

29 files changed

+67
-211
lines changed

src/hyperlight_guest/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@ log = { version = "0.4", default-features = false }
2929
[build-dependencies]
3030
cc = "1.2"
3131
cfg-if = "1.0"
32+
glob = "0.3.1"

src/hyperlight_guest/build.rs

Lines changed: 18 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -52,59 +52,12 @@ fn cargo_main() {
5252
}
5353

5454
if cfg!(feature = "libc") {
55-
cfg.file("third_party/libc/musl/src/ctype/isalpha.c")
56-
.file("third_party/libc/musl/src/ctype/isalnum.c")
57-
.file("third_party/libc/musl/src/ctype/isdigit.c")
58-
.file("third_party/libc/musl/src/ctype/isgraph.c")
59-
.file("third_party/libc/musl/src/ctype/islower.c")
60-
.file("third_party/libc/musl/src/ctype/isprint.c")
61-
.file("third_party/libc/musl/src/ctype/isspace.c")
62-
.file("third_party/libc/musl/src/ctype/isupper.c")
63-
.file("third_party/libc/musl/src/ctype/isxdigit.c")
64-
.file("third_party/libc/musl/src/ctype/tolower.c")
65-
.file("third_party/libc/musl/src/ctype/toupper.c")
66-
.file("third_party/libc/musl/src/errno/__errno_location.c")
67-
.file("third_party/libc/musl/src/internal/floatscan.c")
68-
.file("third_party/libc/musl/src/internal/intscan.c")
69-
.file("third_party/libc/musl/src/internal/shgetc.c")
70-
.file("third_party/libc/musl/src/math/copysign.c")
71-
.file("third_party/libc/musl/src/math/copysignl.c")
72-
.file("third_party/libc/musl/src/math/fabs.c")
73-
.file("third_party/libc/musl/src/math/fabsl.c")
74-
.file("third_party/libc/musl/src/math/fmod.c")
75-
.file("third_party/libc/musl/src/math/fmodl.c")
76-
.file("third_party/libc/musl/src/math/scalbnl.c")
77-
.file("third_party/libc/musl/src/math/__signbit.c")
78-
.file("third_party/libc/musl/src/math/__signbitl.c")
79-
.file("third_party/libc/musl/src/math/__fpclassify.c")
80-
.file("third_party/libc/musl/src/math/__fpclassifyl.c")
81-
.file("third_party/libc/musl/src/stdio/__toread.c")
82-
.file("third_party/libc/musl/src/stdio/__uflow.c")
83-
.file("third_party/libc/musl/src/stdlib/atoi.c")
84-
.file("third_party/libc/musl/src/stdlib/strtod.c")
85-
.file("third_party/libc/musl/src/stdlib/strtol.c")
86-
.file("third_party/libc/musl/src/stdlib/qsort.c")
87-
.file("third_party/libc/musl/src/stdlib/qsort_nr.c")
88-
.file("third_party/libc/musl/src/stdlib/bsearch.c")
89-
.file("third_party/libc/musl/src/string/memchr.c")
90-
.file("third_party/libc/musl/src/string/memcmp.c")
91-
.file("third_party/libc/musl/src/string/memcpy.c")
92-
.file("third_party/libc/musl/src/string/memmove.c")
93-
.file("third_party/libc/musl/src/string/memset.c")
94-
.file("third_party/libc/musl/src/string/stpncpy.c")
95-
.file("third_party/libc/musl/src/string/strchr.c")
96-
.file("third_party/libc/musl/src/string/strchrnul.c")
97-
.file("third_party/libc/musl/src/string/strcmp.c")
98-
.file("third_party/libc/musl/src/string/strcspn.c")
99-
.file("third_party/libc/musl/src/string/strlen.c")
100-
.file("third_party/libc/musl/src/string/strncasecmp.c")
101-
.file("third_party/libc/musl/src/string/strncat.c")
102-
.file("third_party/libc/musl/src/string/strncmp.c")
103-
.file("third_party/libc/musl/src/string/strncpy.c")
104-
.file("third_party/libc/musl/src/string/strspn.c")
105-
.file("third_party/libc/musl/src/string/strstr.c")
106-
.file("third_party/libc/musl/src/prng/rand.c")
107-
.include("third_party/libc/musl/src/include")
55+
let entries = glob::glob("third_party/libc/musl/**/*.[cs]") // .c and .s files
56+
.expect("glob pattern should be valid")
57+
.filter_map(Result::ok);
58+
cfg.files(entries);
59+
60+
cfg.include("third_party/libc/musl/src/include")
10861
.include("third_party/libc/musl/include")
10962
.include("third_party/libc/musl/src/internal")
11063
.include("third_party/libc/musl/arch/generic")
@@ -124,24 +77,22 @@ fn cargo_main() {
12477
feature = "libc",
12578
feature = "alloca"
12679
)) {
127-
if is_pe {
128-
cfg.define("hidden", "");
129-
cfg.define("weak_alias(old, new) ", " ");
130-
cfg.define("__DEFINED_va_list", None);
131-
cfg.define("__DEFINED___isoc_va_list", None);
132-
}
133-
cfg.define("__x86_64__", None);
134-
cfg.define("__LITTLE_ENDIAN__", None);
80+
cfg.define("HYPERLIGHT", None); // used in certain musl files for conditional compilation
13581

13682
// silence compiler warnings
137-
cfg.flag("-Wno-sign-compare");
138-
cfg.flag("-Wno-bitwise-op-parentheses");
139-
cfg.flag("-Wno-unknown-pragmas");
140-
cfg.flag("-Wno-shift-op-parentheses");
141-
cfg.flag("-Wno-logical-op-parentheses");
142-
cfg.flag("-Wno-unused-but-set-variable");
83+
cfg.flag("-Wno-unused-command-line-argument") // including .s files makes clang believe arguments are unused
84+
.flag("-Wno-sign-compare")
85+
.flag("-Wno-bitwise-op-parentheses")
86+
.flag("-Wno-unknown-pragmas")
87+
.flag("-Wno-shift-op-parentheses")
88+
.flag("-Wno-logical-op-parentheses")
89+
.flag("-Wno-unused-but-set-variable")
90+
.flag("-Wno-unused-parameter")
91+
.flag("-Wno-string-plus-int");
14392

14493
if is_pe {
94+
cfg.flag("-Wno-unused-label");
95+
cfg.flag("-Wno-unused-variable");
14596
cfg.compiler("clang-cl");
14697
} else {
14798
cfg.flag("-fPIC");

src/hyperlight_guest/third_party/libc/musl/arch/x86_64/bits/alltypes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515

1616
#ifndef __cplusplus
1717
#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t)
18+
#ifdef _MSC_VER
19+
typedef unsigned short wchar_t;
20+
#else
1821
typedef int wchar_t;
22+
#endif
1923
#define __DEFINED_wchar_t
2024
#endif
2125

src/hyperlight_guest/third_party/libc/musl/arch/x86_64/bits/float.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@
44
#define FLT_EVAL_METHOD 0
55
#endif
66

7+
#ifdef _MSC_VER
8+
#define LDBL_TRUE_MIN 4.9406564584124654e-324
9+
#define LDBL_MIN 2.2250738585072014e-308
10+
#define LDBL_MAX 1.7976931348623158e+308
11+
#define LDBL_EPSILON 2.2204460492503131e-016
12+
13+
#define LDBL_MANT_DIG 53
14+
#define LDBL_MIN_EXP (-1021)
15+
#define LDBL_MAX_EXP 1024
16+
17+
#define LDBL_DIG 15
18+
#define LDBL_MIN_10_EXP (-307)
19+
#define LDBL_MAX_10_EXP308
20+
21+
#define DECIMAL_DIG 17
22+
#else
723
#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
824
#define LDBL_MIN 3.3621031431120935063e-4932L
925
#define LDBL_MAX 1.1897314953572317650e+4932L
@@ -18,3 +34,4 @@
1834
#define LDBL_MAX_10_EXP 4932
1935

2036
#define DECIMAL_DIG 21
37+
#endif

src/hyperlight_guest/third_party/libc/musl/include/math.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ extern "C" {
1111
#define __NEED_double_t
1212
#include <bits/alltypes.h>
1313

14-
#if 100*__GNUC__+__GNUC_MINOR__ >= 303
14+
#if 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined (HYPERLIGHT)
1515
#define NAN __builtin_nanf("")
1616
#define INFINITY __builtin_inff()
1717
#else

src/hyperlight_guest/third_party/libc/musl/include/stdio.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ typedef union _G_fpos64_t {
5959
double __align;
6060
} fpos_t;
6161

62+
#ifndef HYPERLIGHT
63+
6264
extern FILE *const stdin;
6365
extern FILE *const stdout;
6466
extern FILE *const stderr;
@@ -221,4 +223,6 @@ FILE *fopencookie(void *, const char *, cookie_io_functions_t);
221223
}
222224
#endif
223225

226+
#endif //HYPERLIGHT
227+
224228
#endif
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#include <errno.h>
2-
#include "pthread_impl.h"
2+
3+
int errno_val;
34

45
int *__errno_location(void)
56
{
6-
return &__pthread_self()->errno_val;
7+
return &errno_val;
78
}
89

9-
weak_alias(__errno_location, ___errno_location);
10+
weak_alias(__errno_location, ___errno_location);
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#include <stdio.h>
22
#include <stdlib.h>
3+
#include "printf.h"
34

45
_Noreturn void __assert_fail(const char *expr, const char *file, int line, const char *func)
56
{
6-
fprintf(stderr, "Assertion failed: %s (%s: %s: %d)\n", expr, file, func, line);
7+
printf("Assertion failed: %s (%s: %s: %d)\n", expr, file, func, line);
78
abort();
89
}

src/hyperlight_guest/third_party/libc/musl/src/fenv/x86_64/fenv.s

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
.global feclearexcept
2-
.type feclearexcept,@function
32
feclearexcept:
43
# maintain exceptions in the sse mxcsr, clear x87 exceptions
54
mov %edi,%ecx
@@ -20,7 +19,6 @@ feclearexcept:
2019
ret
2120

2221
.global feraiseexcept
23-
.type feraiseexcept,@function
2422
feraiseexcept:
2523
and $0x3f,%edi
2624
stmxcsr -8(%rsp)
@@ -30,8 +28,6 @@ feraiseexcept:
3028
ret
3129

3230
.global __fesetround
33-
.hidden __fesetround
34-
.type __fesetround,@function
3531
__fesetround:
3632
push %rax
3733
xor %eax,%eax
@@ -49,7 +45,6 @@ __fesetround:
4945
ret
5046

5147
.global fegetround
52-
.type fegetround,@function
5348
fegetround:
5449
push %rax
5550
stmxcsr (%rsp)
@@ -59,15 +54,13 @@ fegetround:
5954
ret
6055

6156
.global fegetenv
62-
.type fegetenv,@function
6357
fegetenv:
6458
xor %eax,%eax
6559
fnstenv (%rdi)
6660
stmxcsr 28(%rdi)
6761
ret
6862

6963
.global fesetenv
70-
.type fesetenv,@function
7164
fesetenv:
7265
xor %eax,%eax
7366
inc %rdi
@@ -86,7 +79,6 @@ fesetenv:
8679
ret
8780

8881
.global fetestexcept
89-
.type fetestexcept,@function
9082
fetestexcept:
9183
and $0x3f,%edi
9284
push %rax

src/hyperlight_guest/third_party/libc/musl/src/internal/stdio_impl.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
#define _STDIO_IMPL_H
33

44
#include <stdio.h>
5+
#ifndef HYPERLIGHT
56
#include "syscall.h"
67

78
#define UNGET 8
89

910
#define FFINALLOCK(f) ((f)->lock>=0 ? __lockfile((f)) : 0)
1011
#define FLOCK(f) int __need_unlock = ((f)->lock>=0 ? __lockfile((f)) : 0)
1112
#define FUNLOCK(f) do { if (__need_unlock) __unlockfile((f)); } while (0)
13+
#endif // HYPERLIGHT
1214

1315
#define F_PERM 1
1416
#define F_NORD 4
@@ -47,6 +49,11 @@ struct _IO_FILE {
4749
struct __locale_struct *locale;
4850
};
4951

52+
hidden int __toread(FILE *);
53+
hidden int __towrite(FILE *);
54+
int __uflow(FILE *);
55+
56+
#ifndef HYPERLIGHT
5057
extern hidden FILE *volatile __stdin_used;
5158
extern hidden FILE *volatile __stdout_used;
5259
extern hidden FILE *volatile __stderr_used;
@@ -60,16 +67,13 @@ hidden size_t __stdout_write(FILE *, const unsigned char *, size_t);
6067
hidden off_t __stdio_seek(FILE *, off_t, int);
6168
hidden int __stdio_close(FILE *);
6269

63-
hidden int __toread(FILE *);
64-
hidden int __towrite(FILE *);
65-
6670
hidden void __stdio_exit(void);
6771
hidden void __stdio_exit_needed(void);
6872

6973
#if defined(__PIC__) && (100*__GNUC__+__GNUC_MINOR__ >= 303)
7074
__attribute__((visibility("protected")))
7175
#endif
72-
int __overflow(FILE *, int), __uflow(FILE *);
76+
int __overflow(FILE *, int);
7377

7478
hidden int __fseeko(FILE *, off_t, int);
7579
hidden int __fseeko_unlocked(FILE *, off_t, int);
@@ -110,3 +114,4 @@ hidden FILE *__fopen_rb_ca(const char *, FILE *, unsigned char *, size_t);
110114
hidden int __fclose_ca(FILE *);
111115

112116
#endif
117+
#endif

0 commit comments

Comments
 (0)