Skip to content

Instantly share code, notes, and snippets.

@bartoldeman
Created July 7, 2023 13:37
Show Gist options
  • Save bartoldeman/f97d184e547eff2fbca355083f30db86 to your computer and use it in GitHub Desktop.
Save bartoldeman/f97d184e547eff2fbca355083f30db86 to your computer and use it in GitHub Desktop.
diff --git a/src/arch/linux/async/signal.c b/src/arch/linux/async/signal.c
index 34ab3dd5c..71fe9ce74 100644
--- a/src/arch/linux/async/signal.c
+++ b/src/arch/linux/async/signal.c
@@ -743,6 +743,10 @@ static void sigasync(int sig, siginfo_t *si, void *uc)
static void sigasync_std(int sig, siginfo_t *si, void *uc)
{
+#ifdef __APPLE__
+ // XXX should not be necessary!
+ if (!pthread_equal(pthread_self(), dosemu_pthread_self)) return;
+#endif
sigasync0(sig);
if (!asighandlers[sig]) {
error("handler for sig %i not registered\n", sig);
diff --git a/src/base/dev/misc/vtmr.c b/src/base/dev/misc/vtmr.c
index 6a00f9415..cfae9f951 100644
--- a/src/base/dev/misc/vtmr.c
+++ b/src/base/dev/misc/vtmr.c
@@ -58,7 +58,7 @@ static uint16_t vtmr_imr;
static uint16_t vtmr_pirr;
static pthread_t vtmr_thr;
-static sem_t vtmr_sem;
+static sem_t _vtmr_sem, *vtmr_sem = &_vtmr_sem;
#if MULTICORE_EXAMPLE
static int smi_tid;
static char *rmstack;
@@ -290,7 +290,7 @@ static void *vtmr_thread(void *arg)
pthread_cleanup_pop(1);
#else
while (1) {
- sem_wait(&vtmr_sem);
+ sem_wait(vtmr_sem);
vtmr_smi(NULL);
}
#endif
@@ -300,7 +300,7 @@ static void *vtmr_thread(void *arg)
#if MULTICORE_EXAMPLE
static void vtmr_hlt(Bit16u idx, HLT_ARG(arg))
{
- sem_wait(&vtmr_sem);
+ sem_wait(vtmr_sem);
coopth_start(smi_tid, NULL);
}
#endif
@@ -328,7 +328,7 @@ void vtmr_init(void)
hlt_off = hlt_register_handler_vm86(hlt_hdlr);
#endif
- sem_init(&vtmr_sem, 0, 0);
+ sem_init(vtmr_sem, 0, 0);
for (i = 0; i < VTMR_MAX; i++) {
pthread_mutex_init(&vth[i].done_mtx, NULL);
pthread_cond_init(&vth[i].done_cnd, NULL);
@@ -367,7 +367,7 @@ static int do_vtmr_raise(int timer)
pirr = __sync_fetch_and_or(&vtmr_pirr, mask);
if (!(pirr & mask)) {
h_printf("vtmr: posting timer event\n");
- sem_post(&vtmr_sem);
+ sem_post(vtmr_sem);
return 1;
}
return 0;
diff --git a/src/base/dev/sb16/adlib.c b/src/base/dev/sb16/adlib.c
index ee9f2ef2f..71daf09ab 100644
--- a/src/base/dev/sb16/adlib.c
+++ b/src/base/dev/sb16/adlib.c
@@ -69,7 +69,7 @@ static const int opl3_rate = 44100;
static pthread_mutex_t synth_mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t run_mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_t syn_thr;
-static sem_t syn_sem;
+static sem_t _syn_sem, *syn_sem = &_syn_sem;
static void *synth_thread(void *arg);
Bit8u adlib_io_read_base(ioport_t port)
@@ -152,7 +152,7 @@ void opl3_init(void)
opl3_impl = oplops->Create(opl3_rate);
if (oplops->Generate) {
- sem_init(&syn_sem, 0, 0);
+ sem_init(syn_sem, 0, 0);
pthread_create(&syn_thr, NULL, synth_thread, NULL);
#if defined(HAVE_PTHREAD_SETNAME_NP) && defined(__GLIBC__)
pthread_setname_np(syn_thr, "dosemu: adlib");
@@ -172,7 +172,7 @@ void adlib_done(void)
return;
pthread_cancel(syn_thr);
pthread_join(syn_thr, NULL);
- sem_destroy(&syn_sem);
+ sem_destroy(syn_sem);
}
static void adlib_process_samples(int nframes)
@@ -218,7 +218,7 @@ static void *synth_thread(void *arg)
{
int a_run;
while (1) {
- sem_wait(&syn_sem);
+ sem_wait(syn_sem);
pthread_mutex_lock(&run_mtx);
a_run = adlib_running;
pthread_mutex_unlock(&run_mtx);
@@ -235,7 +235,7 @@ void adlib_timer(void)
{
if (!oplops->Generate)
return;
- sem_post(&syn_sem);
+ sem_post(syn_sem);
}
void opl_register_ops(struct opl_ops *ops)
diff --git a/src/base/emu-i386/simx86/codegen-x86.c b/src/base/emu-i386/simx86/codegen-x86.c
index f45487f72..8326fb22c 100644
--- a/src/base/emu-i386/simx86/codegen-x86.c
+++ b/src/base/emu-i386/simx86/codegen-x86.c
@@ -3332,7 +3332,7 @@ asm(".text\n"
#ifdef __cplusplus
extern "C"
#endif
-void do_seq_start(void);
+void do_seq_start(void) asm("do_seq_start");
static unsigned Exec_x86_asm(unsigned *mem_ref, unsigned long *flg,
unsigned char *ecpu, unsigned char *SeqStart)
{
diff --git a/src/base/emu-i386/simx86/cpatch.c b/src/base/emu-i386/simx86/cpatch.c
index adfd70a74..c689ab919 100644
--- a/src/base/emu-i386/simx86/cpatch.c
+++ b/src/base/emu-i386/simx86/cpatch.c
@@ -39,6 +39,16 @@
#ifdef HOST_ARCH_X86
+asmlinkage void rep_movs_stos(struct rep_stack *stack) asm("rep_movs_stos");
+asmlinkage void stk_16(dosaddr_t addr, Bit16u value) asm("stk_16");
+asmlinkage void stk_32(dosaddr_t addr, Bit32u value) asm("stk_32");
+asmlinkage void wri_8(dosaddr_t addr, Bit8u value, unsigned char *eip) asm("wri_8");
+asmlinkage void wri_16(dosaddr_t addr, Bit16u value, unsigned char *eip) asm("wri_16");
+asmlinkage void wri_32(dosaddr_t addr, Bit32u value, unsigned char *eip) asm("wri_32");
+asmlinkage Bit8u read_8(dosaddr_t addr) asm("read_8");
+asmlinkage Bit16u read_16(dosaddr_t addr) asm("read_16");
+asmlinkage Bit32u read_32(dosaddr_t addr) asm("read_32");
+
static int in_cpatch;
/*
diff --git a/src/base/lib/mapping/mapfile.c b/src/base/lib/mapping/mapfile.c
index 818072686..9be7ea311 100644
--- a/src/base/lib/mapping/mapfile.c
+++ b/src/base/lib/mapping/mapfile.c
@@ -88,6 +88,7 @@ static void *alias_mapping_file(int cap, void *target, size_t mapsize, int prote
if (addr == MAP_FAILED) {
addr = mmap(target, mapsize, protect & ~PROT_EXEC, MAP_SHARED | fixed,
p->fd, offs);
+#ifndef __APPLE__
if (addr != MAP_FAILED) {
int ret = mprotect(addr, mapsize, protect);
if (ret == -1) {
@@ -97,6 +98,7 @@ static void *alias_mapping_file(int cap, void *target, size_t mapsize, int prote
}
} else
perror("mmap()");
+#endif
}
#if 1
Q_printf("MAPPING: alias_map, fileoffs %llx to %p size %zx, result %p\n",
diff --git a/src/base/lib/mapping/mapping.c b/src/base/lib/mapping/mapping.c
index 2c1a4ed7a..f851fd550 100644
--- a/src/base/lib/mapping/mapping.c
+++ b/src/base/lib/mapping/mapping.c
@@ -421,6 +421,9 @@ int mprotect_mapping(int cap, dosaddr_t targ, size_t mapsize, int protect)
if (is_kvm_map(cap))
mprotect_kvm(cap, targ, mapsize, protect);
if (!(cap & MAPPING_LOWMEM)) {
+#ifdef __APPLE__
+ protect &= ~PROT_EXEC;
+#endif
ret = mprotect(MEM_BASE32(targ), mapsize, protect);
if (ret)
error("mprotect() failed: %s\n", strerror(errno));
@@ -432,6 +435,9 @@ int mprotect_mapping(int cap, dosaddr_t targ, size_t mapsize, int protect)
if (addr == MAP_FAILED || i == KVM_BASE)
continue;
assert(i == MEM_BASE || targ + mapsize <= ALIAS_SIZE);
+#ifdef __APPLE__
+ protect &= ~PROT_EXEC;
+#endif
Q__printf("MAPPING: mprotect, cap=%s, addr=%p, size=%zx, protect=%x\n",
cap, addr, mapsize, protect);
ret = mprotect(addr, mapsize, protect);
@@ -930,6 +936,9 @@ close_kmem (void)
void *mapping_find_hole(unsigned long start, unsigned long stop,
unsigned long size)
{
+#ifdef __APPLE__
+ return MAP_FAILED;
+#else
FILE *fp;
unsigned long beg, end, pend;
int fd, ret;
@@ -963,6 +972,7 @@ void *mapping_find_hole(unsigned long start, unsigned long stop,
if (ret != 2)
return MAP_FAILED;
return (void *)pend;
+#endif
}
int mcommit(void *ptr, size_t size)
diff --git a/src/base/lib/mcontext/asm.SS b/src/base/lib/mcontext/asm.SS
index e27ca3f64..fefe87760 100644
--- a/src/base/lib/mcontext/asm.SS
+++ b/src/base/lib/mcontext/asm.SS
@@ -25,8 +25,8 @@
#define GET _getmcontext
#elif defined(__x86_64__)
#define NEEDAMD64CONTEXT 1
-#define SET _setmcontext
-#define GET _getmcontext
+#define SET __setmcontext
+#define GET __getmcontext
#elif defined(__arm__)
#define NEEDARMCONTEXT 1
#define SET _setmcontext
diff --git a/src/base/lib/timer/evtimer.c b/src/base/lib/timer/evtimer.c
index e67cda2cb..84349762a 100644
--- a/src/base/lib/timer/evtimer.c
+++ b/src/base/lib/timer/evtimer.c
@@ -39,8 +39,18 @@
#endif
#include "evtimer.h"
+#ifdef __APPLE__
+#include <dispatch/dispatch.h>
+#endif
+
struct evtimer {
+#ifdef __APPLE__
+ dispatch_queue_t queue;
+ dispatch_source_t source;
+ int suspended;
+#else
timer_t tmr;
+#endif
void (*callback)(int ticks, void *);
void *arg;
clockid_t clk_id;
@@ -53,14 +63,26 @@ struct evtimer {
int in_cbk;
};
+#ifdef __APPLE__
+static void evhandler(void *arg)
+#else
static void evhandler(union sigval sv)
+#endif
{
int bl;
- struct evtimer *t = sv.sival_ptr;
+ struct evtimer *t;
+#ifdef __APPLE__
+ t = arg;
+#else
+ t = sv.sival_ptr;
+#endif
pthread_mutex_lock(&t->block_mtx);
bl = t->blocked;
- t->ticks += timer_getoverrun(t->tmr) + 1;
+#ifndef __APPLE__
+ t->ticks += timer_getoverrun(t->tmr);
+#endif
+ t->ticks++;
if (!bl)
t->in_cbk++;
pthread_mutex_unlock(&t->block_mtx);
@@ -74,21 +96,48 @@ static void evhandler(union sigval sv)
}
}
+#ifdef __APPLE__
+#include <stdio.h>
+static void evtimer_cancel(void *arg)
+{
+ struct evtimer *t = arg;
+ //if (t->source)
+ // dispatch_release(t->source);
+ //if (t->queue)
+ // dispatch_release(t->queue);
+ t->source = NULL;
+ t->queue = NULL;
+}
+#endif
+
void *evtimer_create(void (*cbk)(int ticks, void *), void *arg)
{
struct evtimer *t;
clockid_t id = CLOCK_MONOTONIC;
+#ifndef __APPLE__
struct sigevent sev = { .sigev_notify = SIGEV_THREAD,
.sigev_notify_function = evhandler };
timer_t tmr;
int rc;
+#endif
t = malloc(sizeof(*t));
assert(t);
+#ifdef __APPLE__
+ t->queue = dispatch_queue_create("timerqueue", 0);
+ t->source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,
+ 0, 0, t->queue);
+ t->suspended = 1;
+ dispatch_set_context(t->source, t);
+ dispatch_source_set_event_handler_f(t->source, evhandler);
+ dispatch_source_set_cancel_handler_f(t->source, evtimer_cancel);
+ t->start.tv_sec = t->start.tv_nsec = 0;
+#else
sev.sigev_value.sival_ptr = t;
rc = timer_create(id, &sev, &tmr);
assert(rc != -1);
t->tmr = tmr;
+#endif
t->callback = cbk;
t->arg = arg;
t->clk_id = id;
@@ -105,7 +154,11 @@ void evtimer_delete(void *tmr)
{
struct evtimer *t = tmr;
+#ifndef __APPLE__
timer_delete(t->tmr);
+#else
+ dispatch_source_cancel(t->source);
+#endif
pthread_mutex_destroy(&t->start_mtx);
pthread_mutex_destroy(&t->block_mtx);
pthread_cond_destroy(&t->block_cnd);
@@ -115,17 +168,29 @@ void evtimer_delete(void *tmr)
void evtimer_set_rel(void *tmr, uint64_t ns, int periodic)
{
struct evtimer *t = tmr;
+ struct timespec start;
+
+ clock_gettime(t->clk_id, &start);
+#ifdef __APPLE__
+ dispatch_time_t dstart;
+ if (!t->suspended)
+ dispatch_suspend(t->source);
+ dstart = dispatch_time(DISPATCH_TIME_NOW, ns);
+ dispatch_source_set_timer(t->source, dstart, ns, 0);
+ dispatch_resume(t->source);
+ t->suspended = 0;
+#else
struct itimerspec i = {};
- struct timespec rel, abs, start;
+ struct timespec rel, abs;
rel.tv_sec = ns / NANOSECONDS_PER_SECOND;
rel.tv_nsec = ns % NANOSECONDS_PER_SECOND;
if (periodic)
i.it_interval = rel;
- clock_gettime(t->clk_id, &start);
timespecadd(&start, &rel, &abs);
i.it_value = abs;
timer_settime(t->tmr, TIMER_ABSTIME, &i, NULL);
+#endif
pthread_mutex_lock(&t->start_mtx);
t->start = start;
pthread_mutex_unlock(&t->start_mtx);
@@ -134,22 +199,30 @@ void evtimer_set_rel(void *tmr, uint64_t ns, int periodic)
uint64_t evtimer_gettime(void *tmr)
{
struct evtimer *t = tmr;
- struct timespec rel, abs;
+ struct timespec abs;
+ uint64_t rel;
clock_gettime(t->clk_id, &abs);
pthread_mutex_lock(&t->start_mtx);
- timespecsub(&abs, &t->start, &rel);
+ rel = abs.tv_sec * NANOSECONDS_PER_SECOND + abs.tv_nsec -
+ (t->start.tv_sec * NANOSECONDS_PER_SECOND + t->start.tv_nsec);
pthread_mutex_unlock(&t->start_mtx);
- return (rel.tv_sec * NANOSECONDS_PER_SECOND + rel.tv_nsec);
+ return rel;
}
void evtimer_stop(void *tmr)
{
struct evtimer *t = tmr;
- struct itimerspec i = {};
struct timespec start;
+#ifdef __APPLE__
+ if (!t->suspended)
+ dispatch_suspend(t->source);
+ t->suspended = 1;
+#else
+ struct itimerspec i = {};
timer_settime(t->tmr, 0, &i, NULL);
+#endif
clock_gettime(t->clk_id, &start);
pthread_mutex_lock(&t->start_mtx);
t->start = start;
diff --git a/src/base/misc/dos2linux.c b/src/base/misc/dos2linux.c
index f2cd5e6f8..51df81f66 100644
--- a/src/base/misc/dos2linux.c
+++ b/src/base/misc/dos2linux.c
@@ -189,14 +189,14 @@ static int pty_fd;
static int pty_done;
static int cbrk;
static sem_t *pty_sem;
-static sem_t rd_sem;
+static sem_t _rd_sem, *rd_sem = &_rd_sem;
static pthread_t reader;
static void *queue;
static void *rd_thread(void *arg)
{
while (1) {
- sem_wait(&rd_sem);
+ sem_wait(rd_sem);
while (1) {
void *ptr;
unsigned len;
@@ -223,7 +223,7 @@ static void pty_thr(void)
init_charset_state(&kstate, trconfig.keyb_charset);
init_charset_state(&dstate, trconfig.dos_charset);
- sem_post(&rd_sem);
+ sem_post(rd_sem);
while (1) {
rd = spscq_read(queue, buf, sizeof(buf) - 1);
if (rd > 0) {
@@ -268,7 +268,7 @@ void dos2tty_init(void)
return;
}
unlockpt(pty_fd);
- sem_init(&rd_sem, 0, 0);
+ sem_init(rd_sem, 0, 0);
queue = spscq_init(1024 * 64); // 64K queue
pthread_create(&reader, NULL, rd_thread, queue);
}
@@ -279,7 +279,7 @@ void dos2tty_done(void)
pthread_join(reader, NULL);
spscq_done(queue);
close(pty_fd);
- sem_destroy(&rd_sem);
+ sem_destroy(rd_sem);
}
static void dos2tty_start(void)
diff --git a/src/base/misc/ioctl.c b/src/base/misc/ioctl.c
index 39c0b005a..b576ae2cc 100644
--- a/src/base/misc/ioctl.c
+++ b/src/base/misc/ioctl.c
@@ -321,7 +321,9 @@ void ioselect_init(void)
void ioselect_done(void)
{
+#ifndef __APPLE__
pthread_cancel(io_thr);
pthread_join(io_thr, NULL);
+#endif
close(syncpipe[1]);
}
diff --git a/src/base/misc/utilities.c b/src/base/misc/utilities.c
index fe5315391..661312586 100644
--- a/src/base/misc/utilities.c
+++ b/src/base/misc/utilities.c
@@ -985,12 +985,12 @@ static int tee_close(void *cookie)
return ret;
}
+#ifdef HAVE_FOPENCOOKIE
static cookie_io_functions_t tee_ops = {
.write = tee_write,
.close = tee_close,
};
-#ifdef HAVE_FOPENCOOKIE
FILE *fstream_tee(FILE *orig, FILE *copy)
{
FILE *f;
@@ -1060,14 +1060,15 @@ pid_t run_external_command(const char *path, int argc, const char **argv,
dup(pts_fd);
close(pts_fd);
close(pty_fd);
- if (close_from != -1)
- closefrom(close_from);
+ //if (close_from != -1)
+ // closefrom(close_from);
/* close signals, then unblock */
signal_done();
/* flush pending signals */
- do {
- wt = sigtimedwait(&set, NULL, &to);
- } while (wt != -1);
+ //do {
+ //wt = sigwaitinfo(&set, NULL);
+ //wt = sigtimedwait(&set, NULL, &to);
+ //} while (wt != -1);
sigprocmask(SIG_SETMASK, &oset, NULL);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
diff --git a/src/base/video/render.c b/src/base/video/render.c
index 0b0ed6b02..c58f987df 100644
--- a/src/base/video/render.c
+++ b/src/base/video/render.c
@@ -35,7 +35,7 @@ static pthread_t render_thr;
#endif
static pthread_mutex_t render_mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_rwlock_t mode_mtx = PTHREAD_RWLOCK_INITIALIZER;
-static sem_t render_sem;
+static sem_t _render_sem, *render_sem = &_render_sem;
static void do_rend_gfx(void);
static void do_rend_text(void);
static int remap_mode(void);
@@ -241,8 +241,9 @@ int remapper_init(int have_true_color, int have_shmap, int features,
#if RENDER_THREADED
static void *render_thread(void *arg)
{
+ signal_block_async_nosig(NULL);
while (1) {
- sem_wait(&render_sem);
+ sem_wait(render_sem);
pthread_mutex_lock(&upd_mtx);
is_updating = 1;
pthread_mutex_unlock(&upd_mtx);
@@ -264,7 +265,7 @@ int render_init(void)
{
int err = 0;
#if RENDER_THREADED
- err = sem_init(&render_sem, 0, 0);
+ err = sem_init(render_sem, 0, 0);
assert(!err);
err = pthread_create(&render_thr, NULL, render_thread, NULL);
#if defined(HAVE_PTHREAD_SETNAME_NP) && defined(__GLIBC__)
@@ -287,7 +288,7 @@ void render_done(void)
#if RENDER_THREADED
pthread_cancel(render_thr);
pthread_join(render_thr, NULL);
- sem_destroy(&render_sem);
+ sem_destroy(render_sem);
#endif
}
@@ -652,7 +653,7 @@ int update_screen(void)
if (upd)
return 1;
- sem_post(&render_sem);
+ sem_post(render_sem);
return 1;
}
diff --git a/src/include/utilities.h b/src/include/utilities.h
index 7a2b12a00..0a072d349 100644
--- a/src/include/utilities.h
+++ b/src/include/utilities.h
@@ -3,6 +3,9 @@
#include <sys/types.h>
#include <semaphore.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <assert.h>
#include "dosemu_debug.h"
extern char *logptr, *logbuf;
@@ -120,4 +123,25 @@ pid_t run_external_command(const char *path, int argc,
optind = 0
#endif
+#ifdef __APPLE__
+static inline int sem_init_helper(sem_t **sem, int pshared, unsigned int val,
+ const char *file, int line)
+{
+ char *sem_name;
+ sem_t *psem;
+
+ asprintf(&sem_name, "/dosemu_%s%i_sem_%i", file, line, getpid());
+ assert(sem_name);
+ psem = sem_open(sem_name, O_CREAT, S_IRUSR | S_IWUSR, val);
+ free(sem_name);
+ if (psem == SEM_FAILED)
+ return -1;
+ sem_unlink(psem);
+ *sem = psem;
+ return 0;
+}
+#define sem_init(sem,pshared,val) sem_init_helper(&sem,pshared,val,__FILE__,__LINE__)
+#define sem_destroy(x) sem_close(x)
+#endif
+
#endif /* UTILITIES_H */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment