1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-03-22 16:58:03 +00:00

Compare commits

...

1 Commits

3 changed files with 26 additions and 9 deletions

View File

@@ -315,7 +315,7 @@ const char *nethubHelpstring =
const char *nethubHelpstring = ""; const char *nethubHelpstring = "";
#endif #endif
#if defined(MAIKO_EMULATE_TIMER_INTERRUPTS) || defined(MAIKO_EMULATE_ASYNC_INTERRUPTS) #if MAIKO_OS_LINUX || defined(MAIKO_EMULATE_TIMER_INTERRUPTS) || defined(MAIKO_EMULATE_ASYNC_INTERRUPTS)
extern int insnsCountdownForTimerAsyncEmulation; extern int insnsCountdownForTimerAsyncEmulation;
#endif #endif
@@ -601,7 +601,7 @@ int main(int argc, char *argv[])
} }
#endif /* MAIKO_ENABLE_NETHUB */ #endif /* MAIKO_ENABLE_NETHUB */
#if defined(MAIKO_EMULATE_TIMER_INTERRUPTS) || defined(MAIKO_EMULATE_ASYNC_INTERRUPTS) #if MAIKO_OS_LINUX || defined(MAIKO_EMULATE_TIMER_INTERRUPTS) || defined(MAIKO_EMULATE_ASYNC_INTERRUPTS)
else if (!strcmp(argv[i], "-intr-emu-insns")) { else if (!strcmp(argv[i], "-intr-emu-insns")) {
if (argc > ++i) { if (argc > ++i) {
errno = 0; errno = 0;

View File

@@ -454,6 +454,11 @@ static void int_timer_service(int sig)
/* */ /* */
/************************************************************************/ /************************************************************************/
#if MAIKO_OS_LINUX
// for WSL1, which doesn't support setitimer(ITIMER_VIRTUAL ...)
int linux_emulate_timer = 0;
#endif /* MAIKO_OS_LINUX */
static void int_timer_init(void) static void int_timer_init(void)
{ {
@@ -489,6 +494,11 @@ static void int_timer_init(void)
/* then attach a timer to it and turn it loose */ /* then attach a timer to it and turn it loose */
timert.it_interval.tv_sec = timert.it_value.tv_sec = 0; timert.it_interval.tv_sec = timert.it_value.tv_sec = 0;
timert.it_interval.tv_usec = timert.it_value.tv_usec = TIMER_INTERVAL; timert.it_interval.tv_usec = timert.it_value.tv_usec = TIMER_INTERVAL;
#if MAIKO_OS_LINUX
// (For WSL1) Capture error output from setittimer to indicate need to emulate timer
linux_emulate_timer =
#endif /* MAIKO_OS_LINUX */
setitimer(ITIMER_VIRTUAL, &timert, NULL); setitimer(ITIMER_VIRTUAL, &timert, NULL);
DBPRINT(("Timer interval set to %ld usec\n", (long)timert.it_value.tv_usec)); DBPRINT(("Timer interval set to %ld usec\n", (long)timert.it_value.tv_usec));
@@ -499,7 +509,7 @@ static void int_timer_init(void)
/* */ /* */
/* */ /* */
/* */ /* */
/* */ /*
/* */ /* */
/* */ /* */
/* */ /* */

View File

@@ -173,7 +173,7 @@ static const int n_mask_array[16] = {
extern int TIMER_INTERVAL; extern int TIMER_INTERVAL;
#if defined(MAIKO_EMULATE_TIMER_INTERRUPTS) || defined(MAIKO_EMULATE_ASYNC_INTERRUPTS) #if MAIKO_OS_LINUX || defined(MAIKO_EMULATE_TIMER_INTERRUPTS) || defined(MAIKO_EMULATE_ASYNC_INTERRUPTS)
# if !defined(MAIKO_TIMER_ASYNC_EMULATION_INSNS_COUNTDOWN) # if !defined(MAIKO_TIMER_ASYNC_EMULATION_INSNS_COUNTDOWN)
# define MAIKO_TIMER_ASYNC_EMULATION_INSNS_COUNTDOWN 20000 # define MAIKO_TIMER_ASYNC_EMULATION_INSNS_COUNTDOWN 20000
@@ -181,7 +181,9 @@ extern int TIMER_INTERVAL;
int insnsCountdownForTimerAsyncEmulation = MAIKO_TIMER_ASYNC_EMULATION_INSNS_COUNTDOWN; int insnsCountdownForTimerAsyncEmulation = MAIKO_TIMER_ASYNC_EMULATION_INSNS_COUNTDOWN;
static int pseudoTimerAsyncCountdown = MAIKO_TIMER_ASYNC_EMULATION_INSNS_COUNTDOWN; static int pseudoTimerAsyncCountdown = MAIKO_TIMER_ASYNC_EMULATION_INSNS_COUNTDOWN;
#if MAIKO_OS_LINUX
extern int linux_emulate_timer;
#endif /* MAIKO_OS_LINUX */
#endif #endif
void dispatch(void) { void dispatch(void) {
@@ -282,10 +284,12 @@ nextopcode:
#endif /* PCTRACE */ #endif /* PCTRACE */
/* quick_stack_check();*/ /* JDS 2/12/98 */ /* quick_stack_check();*/ /* JDS 2/12/98 */
#if MAIKO_OS_LINUX || defined(MAIKO_EMULATE_TIMER_INTERRUPTS) || defined(MAIKO_EMULATE_ASYNC_INTERRUPTS)
#if defined(MAIKO_EMULATE_TIMER_INTERRUPTS) || defined(MAIKO_EMULATE_ASYNC_INTERRUPTS) #if MAIKO_OS_LINUX
if (--pseudoTimerAsyncCountdown <= 0) { if (linux_emulate_timer) {
Irq_Stk_Check = 0; #endif /* MAIKO_OS_LINUX */
if (--pseudoTimerAsyncCountdown <= 0) {
Irq_Stk_Check = 0;
Irq_Stk_End = 0; Irq_Stk_End = 0;
#if defined(MAIKO_EMULATE_ASYNC_INTERRUPTS) #if defined(MAIKO_EMULATE_ASYNC_INTERRUPTS)
IO_Signalled = TRUE; IO_Signalled = TRUE;
@@ -294,6 +298,9 @@ nextopcode:
emscripten_sleep(1); emscripten_sleep(1);
#endif #endif
pseudoTimerAsyncCountdown = insnsCountdownForTimerAsyncEmulation; pseudoTimerAsyncCountdown = insnsCountdownForTimerAsyncEmulation;
#if MAIKO_OS_LINUX
}
#endif /* MAIKO_OS_LINUX */
} }
#endif #endif