You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/08/23 14:04:50 UTC
[incubator-nuttx] 02/02: arch/sim: add windows host simulate support
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 62977ec4e86a4e422977a3b2c1f5373da926873a
Author: chao.an <an...@xiaomi.com>
AuthorDate: Tue Aug 23 11:48:34 2022 +0800
arch/sim: add windows host simulate support
Signed-off-by: chao.an <an...@xiaomi.com>
---
arch/sim/src/Makefile | 6 +-
arch/sim/src/sim/posix/up_vpnkit.c | 20 ----
arch/sim/src/sim/up_internal.h | 11 ++-
arch/sim/src/sim/win/up_hostirq.c | 98 ++++++++++++++++++
arch/sim/src/sim/win/up_hostmemory.c | 89 +++++++++++++++++
arch/sim/src/sim/win/up_hostmisc.c | 49 +++++++++
arch/sim/src/sim/win/up_hosttime.c | 133 +++++++++++++++++++++++++
arch/sim/src/sim/win/up_simuart.c | 142 +++++++++++++++++++++++++++
boards/sim/sim/sim/configs/windows/defconfig | 30 ++++++
libs/libc/machine/sim/Make.defs | 12 ++-
libs/libc/machine/sim/arch_setjmp_x86.asm | 73 ++++++++++++++
tools/ci/testlist/sim-02.dat | 3 +
12 files changed, 638 insertions(+), 28 deletions(-)
diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile
index 2afb1a5a7b..aa59c12e1b 100644
--- a/arch/sim/src/Makefile
+++ b/arch/sim/src/Makefile
@@ -76,7 +76,11 @@ endif
endif
VPATH = :sim
-VPATH += :sim/posix
+ifeq ($(CONFIG_WINDOWS_NATIVE),y)
+ VPATH += :sim/win
+else
+ VPATH += :sim/posix
+endif
DEPPATH = $(patsubst %,--dep-path %,$(subst :, ,$(VPATH)))
CFLAGS += -fvisibility=default
diff --git a/arch/sim/src/sim/posix/up_vpnkit.c b/arch/sim/src/sim/posix/up_vpnkit.c
index fc9d3d864b..37408eb06c 100644
--- a/arch/sim/src/sim/posix/up_vpnkit.c
+++ b/arch/sim/src/sim/posix/up_vpnkit.c
@@ -257,23 +257,3 @@ void vpnkit_send(unsigned char *buf, unsigned int buflen)
DEBUG("a packet sent (size %u)", buflen);
}
-
-/****************************************************************************
- * Name: vpnkit_ifup
- *
- ****************************************************************************/
-
-void vpnkit_ifup(in_addr_t ifaddr)
-{
- DEBUG("vpnkit_ifup called");
-}
-
-/****************************************************************************
- * Name: vpnkit_ifdown
- *
- ****************************************************************************/
-
-void vpnkit_ifdown(void)
-{
- DEBUG("vpnkit_ifdown called");
-}
diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h
index 86acc24e39..b9cb0c9d4e 100644
--- a/arch/sim/src/sim/up_internal.h
+++ b/arch/sim/src/sim/up_internal.h
@@ -32,7 +32,10 @@
#ifndef __ASSEMBLY__
# include <sys/types.h>
# include <stdbool.h>
-# include <netinet/in.h>
+# include <stdint.h>
+# if defined(CONFIG_SIM_NETDEV_TAP)
+# include <netinet/in.h>
+# endif
#endif
/****************************************************************************
@@ -298,15 +301,13 @@ void vpnkit_init(void *priv,
int vpnkit_avail(void);
unsigned int vpnkit_read(unsigned char *buf, unsigned int buflen);
void vpnkit_send(unsigned char *buf, unsigned int buflen);
-void vpnkit_ifup(in_addr_t ifaddr);
-void vpnkit_ifdown(void);
# define netdev_init(priv,txcb,rxcb) vpnkit_init(priv,txcb,rxcb)
# define netdev_avail() vpnkit_avail()
# define netdev_read(buf,buflen) vpnkit_read(buf,buflen)
# define netdev_send(buf,buflen) vpnkit_send(buf,buflen)
-# define netdev_ifup(ifaddr) vpnkit_ifup(ifaddr)
-# define netdev_ifdown() vpnkit_ifdown()
+# define netdev_ifup(ifaddr) {}
+# define netdev_ifdown() {}
#endif
/* up_netdriver.c ***********************************************************/
diff --git a/arch/sim/src/sim/win/up_hostirq.c b/arch/sim/src/sim/win/up_hostirq.c
new file mode 100644
index 0000000000..2c22252cc1
--- /dev/null
+++ b/arch/sim/src/sim/win/up_hostirq.c
@@ -0,0 +1,98 @@
+/****************************************************************************
+ * arch/sim/src/sim/win/up_hostirq.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdint.h>
+#include <windows.h>
+
+#include "up_internal.h"
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+volatile void *g_current_regs[CONFIG_SMP_NCPUS];
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_irq_save
+ *
+ * Description:
+ * Disable interrupts and returned the mask before disabling them.
+ *
+ ****************************************************************************/
+
+uint64_t up_irq_save(void)
+{
+ return 0;
+}
+
+/****************************************************************************
+ * Name: up_irq_restore
+ *
+ * Input Parameters:
+ * flags - the mask used to restore interrupts
+ *
+ * Description:
+ * Re-enable interrupts using the specified mask in flags argument.
+ *
+ ****************************************************************************/
+
+void up_irq_restore(uint64_t flags)
+{
+}
+
+/****************************************************************************
+ * Name: up_irqinitialize
+ ****************************************************************************/
+
+void up_irqinitialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: up_enable_irq
+ *
+ * Description:
+ * Enable the IRQ specified by 'irq'
+ *
+ ****************************************************************************/
+
+void up_enable_irq(int irq)
+{
+}
+
+/****************************************************************************
+ * Name: up_disable_irq
+ *
+ * Description:
+ * Disable the IRQ specified by 'irq'
+ *
+ ****************************************************************************/
+
+void up_disable_irq(int irq)
+{
+}
diff --git a/arch/sim/src/sim/win/up_hostmemory.c b/arch/sim/src/sim/win/up_hostmemory.c
new file mode 100644
index 0000000000..47ad9bc047
--- /dev/null
+++ b/arch/sim/src/sim/win/up_hostmemory.c
@@ -0,0 +1,89 @@
+/****************************************************************************
+ * arch/sim/src/sim/win/up_hostmemory.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <windows.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: host_alloc_heap
+ *
+ * Description:
+ * Allocate executable memory for heap.
+ *
+ ****************************************************************************/
+
+void *host_alloc_heap(size_t sz)
+{
+ return _aligned_malloc(sz, 8);
+}
+
+void *host_alloc_shmem(const char *name, size_t size, int master)
+{
+ HANDLE handle;
+ void *mem;
+
+ handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
+ PAGE_READWRITE, 0, 0, name);
+ if (handle == NULL)
+ {
+ return NULL;
+ }
+
+ mem = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, size);
+ CloseHandle(handle);
+
+ return mem;
+}
+
+void host_free_shmem(void *mem)
+{
+ UnmapViewOfFile(mem);
+}
+
+size_t host_malloc_size(void *mem)
+{
+ return _msize(mem);
+}
+
+void *host_memalign(size_t alignment, size_t size)
+{
+ return _aligned_malloc(size, alignment);
+}
+
+void host_free(void *mem)
+{
+ _aligned_free(mem);
+}
+
+void *host_realloc(void *oldmem, size_t size)
+{
+ return _aligned_realloc(oldmem, size, 8);
+}
+
+void host_mallinfo(int *aordblks, int *uordblks)
+{
+}
diff --git a/arch/sim/src/sim/win/up_hostmisc.c b/arch/sim/src/sim/win/up_hostmisc.c
new file mode 100644
index 0000000000..795a9849a1
--- /dev/null
+++ b/arch/sim/src/sim/win/up_hostmisc.c
@@ -0,0 +1,49 @@
+/****************************************************************************
+ * arch/sim/src/sim/win/up_hostmisc.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <windows.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: host_abort
+ *
+ * Description:
+ * Abort the simulation
+ *
+ * Input Parameters:
+ * status - Exit status to set
+ ****************************************************************************/
+
+void host_abort(int status)
+{
+ ExitProcess(status);
+}
+
+int host_backtrace(void** array, int size)
+{
+ return CaptureStackBackTrace(0, size, array, NULL);
+}
diff --git a/arch/sim/src/sim/win/up_hosttime.c b/arch/sim/src/sim/win/up_hosttime.c
new file mode 100644
index 0000000000..cb857882e7
--- /dev/null
+++ b/arch/sim/src/sim/win/up_hosttime.c
@@ -0,0 +1,133 @@
+/****************************************************************************
+ * arch/sim/src/sim/win/up_hosttime.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <windows.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define POW10_9 (1000000000ull)
+
+/* Number of 100ns-seconds between the beginning of the Windows epoch
+ * (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970)
+ */
+
+#define DELTA_EPOCH_IN_100NS (0x19db1ded53e8000ull)
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: host_gettime
+ ****************************************************************************/
+
+uint64_t host_gettime(bool rtc)
+{
+ static LARGE_INTEGER start;
+ LARGE_INTEGER counter;
+ LARGE_INTEGER freq;
+ FILETIME ftime;
+
+ if (rtc)
+ {
+ GetSystemTimeAsFileTime(&ftime);
+
+ return (((uint64_t)ftime.dwHighDateTime << 32 |
+ ftime.dwLowDateTime) - DELTA_EPOCH_IN_100NS) * 100;
+ }
+
+ QueryPerformanceFrequency(&freq);
+ QueryPerformanceCounter(&counter);
+
+ counter.QuadPart = counter.QuadPart * POW10_9 / freq.QuadPart;
+
+ if (start.QuadPart == 0)
+ {
+ start.QuadPart = counter.QuadPart;
+ }
+
+ return counter.QuadPart - start.QuadPart;
+}
+
+/****************************************************************************
+ * Name: host_sleep
+ ****************************************************************************/
+
+void host_sleep(uint64_t nsec)
+{
+ LARGE_INTEGER due;
+ HANDLE timer;
+
+ /* Convert to 100 nanosecond interval,
+ * negative value indicates relative time
+ */
+
+ due.QuadPart = -((nsec + 99) / 100);
+
+ timer = CreateWaitableTimer(NULL, TRUE, NULL);
+ if (timer != NULL)
+ {
+ SetWaitableTimer(timer, &due, 0, NULL, NULL, 0);
+ WaitForSingleObject(timer, INFINITE);
+ CloseHandle(timer);
+ }
+}
+
+/****************************************************************************
+ * Name: host_sleepuntil
+ ****************************************************************************/
+
+void host_sleepuntil(uint64_t nsec)
+{
+ uint64_t now;
+
+ now = host_gettime(false);
+ if (nsec > now)
+ {
+ host_sleep(nsec - now);
+ }
+}
+
+/****************************************************************************
+ * Name: host_settimer
+ *
+ * Description:
+ * Set up a timer to send periodic signals.
+ *
+ * Input Parameters:
+ * irq - a pointer where we save the host signal number for SIGALRM
+ *
+ * Returned Value:
+ * On success, (0) zero value is returned, otherwise a negative value.
+ *
+ ****************************************************************************/
+
+int host_settimer(int *irq)
+{
+ return -ENOSYS;
+}
diff --git a/arch/sim/src/sim/win/up_simuart.c b/arch/sim/src/sim/win/up_simuart.c
new file mode 100644
index 0000000000..9ce4c9ddfe
--- /dev/null
+++ b/arch/sim/src/sim/win/up_simuart.c
@@ -0,0 +1,142 @@
+/****************************************************************************
+ * arch/sim/src/sim/win/up_simuart.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdbool.h>
+#include <windows.h>
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static HANDLE g_stdin_handle;
+static HANDLE g_stdout_handle;
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: simuart_start
+ ****************************************************************************/
+
+void simuart_start(void)
+{
+ DWORD mode;
+
+ g_stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
+ if (GetConsoleMode(g_stdin_handle, &mode))
+ {
+ SetConsoleMode(g_stdin_handle, mode & ~(ENABLE_MOUSE_INPUT |
+ ENABLE_WINDOW_INPUT |
+ ENABLE_ECHO_INPUT |
+ ENABLE_LINE_INPUT));
+ FlushConsoleInputBuffer(g_stdin_handle);
+ }
+
+ g_stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+}
+
+/****************************************************************************
+ * Name: simuart_open
+ ****************************************************************************/
+
+int simuart_open(const char *pathname)
+{
+ return -ENOSYS;
+}
+
+/****************************************************************************
+ * Name: simuart_close
+ ****************************************************************************/
+
+void simuart_close(int fd)
+{
+}
+
+/****************************************************************************
+ * Name: simuart_putc
+ ****************************************************************************/
+
+int simuart_putc(int fd, int ch)
+{
+ DWORD nwritten;
+
+ if (WriteConsole(g_stdout_handle, &ch, 1, &nwritten, NULL))
+ {
+ return ch;
+ }
+
+ return -EIO;
+}
+
+/****************************************************************************
+ * Name: simuart_getc
+ ****************************************************************************/
+
+int simuart_getc(int fd)
+{
+ unsigned char ch;
+ DWORD nread;
+
+ if (ReadConsole(g_stdin_handle, &ch, 1, &nread, 0))
+ {
+ return ch;
+ }
+
+ return -EIO;
+}
+
+/****************************************************************************
+ * Name: simuart_getcflag
+ ****************************************************************************/
+
+int simuart_getcflag(int fd, unsigned int *cflag)
+{
+ return -ENOSYS;
+}
+
+/****************************************************************************
+ * Name: simuart_setcflag
+ ****************************************************************************/
+
+int simuart_setcflag(int fd, unsigned int cflag)
+{
+ return -ENOSYS;
+}
+
+/****************************************************************************
+ * Name: simuart_checkc
+ ****************************************************************************/
+
+bool simuart_checkc(int fd)
+{
+ DWORD size;
+
+ if (GetNumberOfConsoleInputEvents(g_stdin_handle, &size) && size > 1)
+ {
+ return true;
+ }
+
+ return false;
+}
diff --git a/boards/sim/sim/sim/configs/windows/defconfig b/boards/sim/sim/sim/configs/windows/defconfig
new file mode 100644
index 0000000000..fda3a4b07b
--- /dev/null
+++ b/boards/sim/sim/sim/configs/windows/defconfig
@@ -0,0 +1,30 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+CONFIG_ARCH="sim"
+CONFIG_ARCH_BOARD="sim"
+CONFIG_ARCH_BOARD_SIM=y
+CONFIG_ARCH_CHIP="sim"
+CONFIG_ARCH_FLOAT_H=y
+CONFIG_ARCH_SIM=y
+CONFIG_BOARDCTL_POWEROFF=y
+CONFIG_BUILTIN=y
+CONFIG_DEV_LOOP=y
+CONFIG_DEV_ZERO=y
+CONFIG_EXAMPLES_HELLO=y
+CONFIG_FS_PROCFS=y
+CONFIG_FS_PROCFS_EXCLUDE_MEMINFO=y
+CONFIG_FS_TMPFS=y
+CONFIG_HOST_X86=y
+CONFIG_IDLETHREAD_STACKSIZE=4096
+CONFIG_INIT_ENTRYPOINT="nsh_main"
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_READLINE=y
+CONFIG_SIM_STACKSIZE_ADJUSTMENT=10240
+CONFIG_SYSTEM_NSH=y
+CONFIG_TESTING_OSTEST=y
diff --git a/libs/libc/machine/sim/Make.defs b/libs/libc/machine/sim/Make.defs
index d4067597ee..867d95179f 100644
--- a/libs/libc/machine/sim/Make.defs
+++ b/libs/libc/machine/sim/Make.defs
@@ -27,7 +27,11 @@ ifeq ($(CONFIG_LIBC_ARCH_ELF),y)
CSRCS += arch_elf.c
endif
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
-ASRCS += arch_setjmp_x86.S
+ ifeq ($(CONFIG_HOST_WINDOWS),y)
+ ASRCS += arch_setjmp_x86.asm
+ else
+ ASRCS += arch_setjmp_x86.S
+ endif
endif
else
ifeq ($(CONFIG_LIBC_ARCH_ELF),y)
@@ -42,7 +46,11 @@ ifeq ($(CONFIG_LIBC_ARCH_ELF),y)
CSRCS += arch_elf.c
endif
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
-ASRCS += arch_setjmp_x86.S
+ ifeq ($(CONFIG_HOST_WINDOWS),y)
+ ASRCS += arch_setjmp_x86.asm
+ else
+ ASRCS += arch_setjmp_x86.S
+ endif
endif
else ifeq ($(CONFIG_HOST_ARM),y)
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
diff --git a/libs/libc/machine/sim/arch_setjmp_x86.asm b/libs/libc/machine/sim/arch_setjmp_x86.asm
new file mode 100644
index 0000000000..b8758c653b
--- /dev/null
+++ b/libs/libc/machine/sim/arch_setjmp_x86.asm
@@ -0,0 +1,73 @@
+;***************************************************************************
+; libs/libc/machine/sim/arch_setjmp_x86.asm
+;
+; Licensed to the Apache Software Foundation (ASF) under one or more
+; contributor license agreements. See the NOTICE file distributed with
+; this work for additional information regarding copyright ownership. The
+; ASF licenses this file to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance with the
+; License. You may obtain a copy of the License at
+;
+; http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+; WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+; License for the specific language governing permissions and limitations
+; under the License.
+;
+;***************************************************************************
+
+;***************************************************************************
+; Public Functions
+;***************************************************************************
+
+.model flat, c
+.code
+
+public setjmp
+public longjmp
+
+setjmp:
+ mov eax, dword ptr [esp+4]
+ mov dword ptr [eax], ebx
+ mov dword ptr [eax+4], esi
+ mov dword ptr [eax+8], edi
+
+ ; Save the value of SP as will be after we return
+
+ lea ecx, dword ptr [esp+4]
+ mov dword ptr [eax+10h], ecx
+
+ ; Save the return PC
+
+ mov ecx, dword ptr [esp]
+ mov dword ptr [eax+14h], ecx
+
+ ; Save the framepointer
+
+ mov dword ptr [eax+0ch], ebp
+
+ ; And return 0
+
+ xor eax, eax
+ ret
+
+longjmp:
+ mov ecx, dword ptr [esp+4] ; jmpbuf in ecx.
+ mov eax, dword ptr [esp+8] ; Second argument is return value
+
+ ; Save the return address now
+
+ mov edx, dword ptr [ecx+14h]
+
+ ; Restore registers
+
+ mov ebx, dword ptr [ecx]
+ mov esi, dword ptr [ecx+4]
+ mov edi, dword ptr [ecx+8]
+ mov ebp, dword ptr [ecx+0ch]
+ mov esp, dword ptr [ecx+10h]
+ jmp dword ptr [ecx+14h]
+
+end
diff --git a/tools/ci/testlist/sim-02.dat b/tools/ci/testlist/sim-02.dat
index 44838f3ed5..5eac486758 100644
--- a/tools/ci/testlist/sim-02.dat
+++ b/tools/ci/testlist/sim-02.dat
@@ -12,3 +12,6 @@
# macOS doesn't have X11
-Darwin,sim:touchscreen
+
+# Do not build Windows configs
+-,sim:windows