Merge pull request #3439 from andreas-jonsson/netbsd

NetBSD support
This commit is contained in:
gingerBill
2024-05-15 10:33:52 +01:00
committed by GitHub
40 changed files with 1192 additions and 79 deletions
+15 -3
View File
@@ -17,7 +17,7 @@
#include <sys/sysctl.h>
#endif
#if defined(GB_SYSTEM_OPENBSD)
#if defined(GB_SYSTEM_OPENBSD) || defined(GB_SYSTEM_NETBSD)
#include <sys/sysctl.h>
#include <sys/utsname.h>
#endif
@@ -263,6 +263,14 @@ gb_internal void report_ram_info() {
if (sysctl(mibs, 2, &ram_amount, &val_size, NULL, 0) != -1) {
gb_printf("%lld MiB\n", ram_amount / gb_megabytes(1));
}
#elif defined(GB_SYSTEM_NETBSD)
uint64_t ram_amount;
size_t val_size = sizeof(ram_amount);
int mibs[] = { CTL_HW, HW_PHYSMEM64 };
if (sysctl(mibs, 2, &ram_amount, &val_size, NULL, 0) != -1) {
gb_printf("%lu MiB\n", ram_amount / gb_megabytes(1));
}
#elif defined(GB_SYSTEM_OPENBSD)
uint64_t ram_amount;
size_t val_size = sizeof(ram_amount);
@@ -998,13 +1006,17 @@ gb_internal void report_os_info() {
gb_printf("macOS Unknown (kernel: %d.%d.%d)\n", major, minor, patch);
return;
}
#elif defined(GB_SYSTEM_OPENBSD)
#elif defined(GB_SYSTEM_OPENBSD) || defined(GB_SYSTEM_NETBSD)
struct utsname un;
if (uname(&un) != -1) {
gb_printf("%s %s %s %s\n", un.sysname, un.release, un.version, un.machine);
} else {
gb_printf("OpenBSD: Unknown\n");
#if defined(GB_SYSTEM_NETBSD)
gb_printf("NetBSD: Unknown\n");
#else
gb_printf("OpenBSD: Unknown\n");
#endif
}
#elif defined(GB_SYSTEM_FREEBSD)
#define freebsd_version_buffer 129
+13
View File
@@ -18,6 +18,7 @@ enum TargetOsKind : u16 {
TargetOs_essence,
TargetOs_freebsd,
TargetOs_openbsd,
TargetOs_netbsd,
TargetOs_haiku,
TargetOs_wasi,
@@ -84,6 +85,7 @@ gb_global String target_os_names[TargetOs_COUNT] = {
str_lit("essence"),
str_lit("freebsd"),
str_lit("openbsd"),
str_lit("netbsd"),
str_lit("haiku"),
str_lit("wasi"),
@@ -1020,6 +1022,13 @@ gb_global TargetMetrics target_openbsd_amd64 = {
str_lit("x86_64-unknown-openbsd-elf"),
};
gb_global TargetMetrics target_netbsd_amd64 = {
TargetOs_netbsd,
TargetArch_amd64,
8, 8, AMD64_MAX_ALIGNMENT, 16,
str_lit("x86_64-unknown-netbsd-elf"),
};
gb_global TargetMetrics target_haiku_amd64 = {
TargetOs_haiku,
TargetArch_amd64,
@@ -1127,6 +1136,7 @@ gb_global NamedTargetMetrics named_targets[] = {
{ str_lit("freebsd_arm64"), &target_freebsd_arm64 },
{ str_lit("openbsd_amd64"), &target_openbsd_amd64 },
{ str_lit("netbsd_amd64"), &target_netbsd_amd64 },
{ str_lit("haiku_amd64"), &target_haiku_amd64 },
{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
@@ -1886,6 +1896,8 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
#endif
#elif defined(GB_SYSTEM_OPENBSD)
metrics = &target_openbsd_amd64;
#elif defined(GB_SYSTEM_NETBSD)
metrics = &target_netbsd_amd64;
#elif defined(GB_SYSTEM_HAIKU)
metrics = &target_haiku_amd64;
#elif defined(GB_CPU_ARM)
@@ -2423,6 +2435,7 @@ gb_internal bool init_build_paths(String init_filename) {
case TargetOs_essence:
case TargetOs_freebsd:
case TargetOs_openbsd:
case TargetOs_netbsd:
case TargetOs_haiku:
gb_printf_err("-no-crt on unix systems requires either -default-to-nil-allocator or -default-to-panic-allocator to also be present because the default allocator requires crt\n");
return false;
+1
View File
@@ -1013,6 +1013,7 @@ gb_internal void init_universal(void) {
{"FreeBSD", TargetOs_freebsd},
{"Haiku", TargetOs_haiku},
{"OpenBSD", TargetOs_openbsd},
{"NetBSD", TargetOs_netbsd},
{"WASI", TargetOs_wasi},
{"JS", TargetOs_js},
{"Freestanding", TargetOs_freestanding},
+42 -1
View File
@@ -83,6 +83,10 @@ extern "C" {
#ifndef GB_SYSTEM_OPENBSD
#define GB_SYSTEM_OPENBSD 1
#endif
#elif defined(__NetBSD__)
#ifndef GB_SYSTEM_NETBSD
#define GB_SYSTEM_NETBSD 1
#endif
#elif defined(__HAIKU__) || defined(__haiku__)
#ifndef GB_SYSTEM_HAIKU
#define GB_SYSTEM_HAIKU 1
@@ -208,7 +212,7 @@ extern "C" {
#endif
#include <stdlib.h> // NOTE(bill): malloc on linux
#include <sys/mman.h>
#if !defined(GB_SYSTEM_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__HAIKU__)
#if !defined(GB_SYSTEM_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__HAIKU__)
#include <sys/sendfile.h>
#endif
#include <sys/stat.h>
@@ -250,6 +254,11 @@ extern "C" {
#define lseek64 lseek
#endif
#if defined(GB_SYSTEM_NETBSD)
#include <stdio.h>
#define lseek64 lseek
#endif
#if defined(GB_SYSTEM_HAIKU)
#include <stdio.h>
#include <pthread.h>
@@ -817,6 +826,13 @@ typedef struct gbAffinity {
isize thread_count;
isize threads_per_core;
} gbAffinity;
#elif defined(GB_SYSTEM_NETBSD)
typedef struct gbAffinity {
b32 is_accurate;
isize core_count;
isize thread_count;
isize threads_per_core;
} gbAffinity;
#elif defined(GB_SYSTEM_HAIKU)
typedef struct gbAffinity {
b32 is_accurate;
@@ -3269,6 +3285,31 @@ isize gb_affinity_thread_count_for_core(gbAffinity *a, isize core) {
GB_ASSERT(0 <= core && core < a->core_count);
return a->threads_per_core;
}
#elif defined(GB_SYSTEM_NETBSD)
#include <unistd.h>
void gb_affinity_init(gbAffinity *a) {
a->core_count = sysconf(_SC_NPROCESSORS_ONLN);
a->threads_per_core = 1;
a->is_accurate = a->core_count > 0;
a->core_count = a->is_accurate ? a->core_count : 1;
a->thread_count = a->core_count;
}
void gb_affinity_destroy(gbAffinity *a) {
gb_unused(a);
}
b32 gb_affinity_set(gbAffinity *a, isize core, isize thread_index) {
return true;
}
isize gb_affinity_thread_count_for_core(gbAffinity *a, isize core) {
GB_ASSERT(0 <= core && core < a->core_count);
return a->threads_per_core;
}
#elif defined(GB_SYSTEM_HAIKU)
#include <unistd.h>
+1 -1
View File
@@ -341,7 +341,7 @@ gb_internal ReadDirectoryError read_directory(String path, Array<FileInfo> *fi)
return ReadDirectory_None;
}
#elif defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD) || defined(GB_SYSTEM_HAIKU)
#elif defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD) || defined(GB_SYSTEM_NETBSD) || defined(GB_SYSTEM_HAIKU)
#include <dirent.h>
+10 -2
View File
@@ -628,15 +628,23 @@ gb_internal void thread_set_name(Thread *t, char const *name) {
pthread_setname_np(name);
#elif defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD)
pthread_set_name_np(t->posix_handle, name);
#elif defined(GB_SYSTEM_NETBSD)
pthread_setname_np(t->posix_handle, "%s", (void*)name);
#else
// TODO(bill): Test if this works
pthread_setname_np(t->posix_handle, name);
#endif
}
#if defined(GB_SYSTEM_LINUX)
#include <linux/futex.h>
#if defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_NETBSD)
#include <sys/syscall.h>
#ifdef GB_SYSTEM_LINUX
#include <linux/futex.h>
#else
#include <sys/futex.h>
#define SYS_futex SYS___futex
#endif
gb_internal void futex_signal(Futex *addr) {
int ret = syscall(SYS_futex, addr, FUTEX_WAKE | FUTEX_PRIVATE_FLAG, 1, NULL, NULL, 0);