From ceb0c5d066e6de59bc4d8417573742019b807e6f Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Wed, 16 Oct 2024 14:54:05 +0300 Subject: [PATCH] use complex initializer in dosio.c Sometimes the constant initializer doesn't suit for swappable context. Add support for complex initializers and use in dosio.c. Should fix crash with pcmos build. See https://github.com/dosemu2/dosemu2/pull/2291 --- include/libc/djctx.h | 7 ++++++- src/libc/dos/io/dosio.c | 25 ++++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/include/libc/djctx.h b/include/libc/djctx.h index 4fcb6b50..74ed7f3f 100644 --- a/include/libc/djctx.h +++ b/include/libc/djctx.h @@ -26,13 +26,14 @@ void djregister_ctx_hooks(void (*)(int), void (*)(void), void (*)(void), #define SW_CTX_MAX 100 -#define DJ64_DEFINE_SWAPPABLE_CONTEXT2(t, c, init, pre, post) \ +#define DJ64_DEFINE_SWAPPABLE_CONTEXT3(t, c, init, pre, post, cinit) \ static struct t t##_contexts[SW_CTX_MAX]; \ static void t##_init(int idx) \ { \ struct t *x = &t##_contexts[idx]; \ assert(c != x); \ *x = init; \ + cinit(x); \ } \ static void t##_deinit(void) \ { \ @@ -56,6 +57,10 @@ static void static_##t##_init(void) \ djregister_ctx_hooks(t##_init, t##_deinit, t##_save, t##_restore); \ } +#define DJ64_DEFINE_SWAPPABLE_CONTEXT2(t, c, init, pre, post) \ + static void _dummy_cinit(struct t *dummy) {} \ + DJ64_DEFINE_SWAPPABLE_CONTEXT3(t, c, init, pre, post, _dummy_cinit) + #define DJ64_DEFINE_SWAPPABLE_CONTEXT(t, c) \ static const struct t ctx_##t##_init = {}; \ DJ64_DEFINE_SWAPPABLE_CONTEXT2(t, c, ctx_##t##_init,,) diff --git a/src/libc/dos/io/dosio.c b/src/libc/dos/io/dosio.c index 683ee81c..312eb4e3 100644 --- a/src/libc/dos/io/dosio.c +++ b/src/libc/dos/io/dosio.c @@ -11,13 +11,13 @@ #include #include -static const char init_fh[] = { - O_TEXT, - O_TEXT, - O_TEXT, - O_BINARY, - O_BINARY -}; +#define init_fh { \ + O_TEXT, \ + O_TEXT, \ + O_TEXT, \ + O_BINARY, \ + O_BINARY, \ +} struct fh_state { char init_file_handle_modes[20]; @@ -32,6 +32,7 @@ char *__file_handle_modes; static const struct fh_state fhinit = { + .init_file_handle_modes = init_fh, .dosio_bss_count = -1, .count = 20, }; @@ -46,8 +47,12 @@ static void fhs_post(void) #define _RS(x) x = fhs->x _RS(__file_handle_modes); } -DJ64_DEFINE_SWAPPABLE_CONTEXT2(fh_state, fhs, fhinit, - fhs_pre(), fhs_post()); +static void fhs_init(struct fh_state *st) +{ + st->__file_handle_modes = st->init_file_handle_modes; +} +DJ64_DEFINE_SWAPPABLE_CONTEXT3(fh_state, fhs, fhinit, + fhs_pre(), fhs_post(), fhs_init); #define init_file_handle_modes fhs->init_file_handle_modes #define dosio_bss_count fhs->dosio_bss_count @@ -62,8 +67,6 @@ __file_handle_set(int fd, int mode) { dosio_bss_count = __bss_count; count = 20; - memcpy(init_file_handle_modes, init_fh, sizeof(init_fh)); - __file_handle_modes = init_file_handle_modes; } /* Check for bogus values */