mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 14:27:37 +08:00
sim: Initial support on MacOS M1 and Linux AARCH64 based hosts.
This commit is contained in:
@@ -23,6 +23,10 @@ config HOST_ARM
|
|||||||
bool "arm"
|
bool "arm"
|
||||||
select ARCH_HAVE_STACKCHECK
|
select ARCH_HAVE_STACKCHECK
|
||||||
|
|
||||||
|
config HOST_ARM64
|
||||||
|
bool "arm64"
|
||||||
|
select ARCH_HAVE_STACKCHECK
|
||||||
|
|
||||||
endchoice # Host CPU Type
|
endchoice # Host CPU Type
|
||||||
|
|
||||||
config ARCH_CHIP
|
config ARCH_CHIP
|
||||||
|
|||||||
@@ -104,7 +104,8 @@
|
|||||||
# define UINT16_C(x) x
|
# define UINT16_C(x) x
|
||||||
# define UINT32_C(x) x ## u
|
# define UINT32_C(x) x ## u
|
||||||
|
|
||||||
#if defined(CONFIG_HOST_X86_64) && !defined(CONFIG_SIM_M32)
|
#if (defined(CONFIG_HOST_X86_64) && !defined(CONFIG_SIM_M32)) || \
|
||||||
|
defined(CONFIG_HOST_ARM64)
|
||||||
# define PRIdPTR "ld"
|
# define PRIdPTR "ld"
|
||||||
# define PRIiPTR "li"
|
# define PRIiPTR "li"
|
||||||
# define PRIoPTR "lo"
|
# define PRIoPTR "lo"
|
||||||
|
|||||||
@@ -54,14 +54,15 @@
|
|||||||
|
|
||||||
/* These change on 32-bit and 64-bit platforms */
|
/* These change on 32-bit and 64-bit platforms */
|
||||||
|
|
||||||
#if !defined(CONFIG_HOST_X86_64) || defined(CONFIG_SIM_M32)
|
#if (defined(CONFIG_HOST_X86_64) && !defined(CONFIG_SIM_M32)) || \
|
||||||
# define LONG_MIN (-LONG_MAX - 1)
|
defined(CONFIG_HOST_ARM64)
|
||||||
# define LONG_MAX 2147483647L
|
|
||||||
# define ULONG_MAX 4294967295UL
|
|
||||||
#else
|
|
||||||
# define LONG_MIN (-LONG_MAX - 1)
|
# define LONG_MIN (-LONG_MAX - 1)
|
||||||
# define LONG_MAX 9223372036854775807L
|
# define LONG_MAX 9223372036854775807L
|
||||||
# define ULONG_MAX 18446744073709551615UL
|
# define ULONG_MAX 18446744073709551615UL
|
||||||
|
#else
|
||||||
|
# define LONG_MIN (-LONG_MAX - 1)
|
||||||
|
# define LONG_MAX 2147483647L
|
||||||
|
# define ULONG_MAX 4294967295UL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LLONG_MIN (-LLONG_MAX - 1)
|
#define LLONG_MIN (-LLONG_MAX - 1)
|
||||||
@@ -71,12 +72,13 @@
|
|||||||
/* A pointer is 4 or 8 bytes */
|
/* A pointer is 4 or 8 bytes */
|
||||||
|
|
||||||
#define PTR_MIN (-PTR_MAX - 1)
|
#define PTR_MIN (-PTR_MAX - 1)
|
||||||
#if !defined(CONFIG_HOST_X86_64) || defined(CONFIG_SIM_M32)
|
#if (defined(CONFIG_HOST_X86_64) && !defined(CONFIG_SIM_M32)) || \
|
||||||
# define PTR_MAX 2147483647
|
defined(CONFIG_HOST_ARM64)
|
||||||
# define UPTR_MAX 4294967295U
|
|
||||||
#else
|
|
||||||
# define PTR_MAX 9223372036854775807LL
|
# define PTR_MAX 9223372036854775807LL
|
||||||
# define UPTR_MAX 18446744073709551615ULL
|
# define UPTR_MAX 18446744073709551615ULL
|
||||||
|
#else
|
||||||
|
# define PTR_MAX 2147483647
|
||||||
|
# define UPTR_MAX 4294967295U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ARCH_SIM_INCLUDE_LIMITS_H */
|
#endif /* __ARCH_SIM_INCLUDE_LIMITS_H */
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
# define XCPTCONTEXT_SIZE (8 * XCPTCONTEXT_REGS)
|
# define XCPTCONTEXT_SIZE (8 * XCPTCONTEXT_REGS)
|
||||||
|
|
||||||
# ifdef __ASSEMBLY__
|
# ifdef __ASSEMBLY__
|
||||||
|
|
||||||
# define JB_RBX (0*8)
|
# define JB_RBX (0*8)
|
||||||
# define JB_RSP (1*8)
|
# define JB_RSP (1*8)
|
||||||
# define JB_RBP (2*8)
|
# define JB_RBP (2*8)
|
||||||
@@ -51,6 +52,7 @@
|
|||||||
# define JB_RSI (7*8)
|
# define JB_RSI (7*8)
|
||||||
|
|
||||||
# else
|
# else
|
||||||
|
|
||||||
# define JB_RBX (0)
|
# define JB_RBX (0)
|
||||||
# define JB_RSP (1)
|
# define JB_RSP (1)
|
||||||
# define JB_RBP (2)
|
# define JB_RBP (2)
|
||||||
@@ -75,6 +77,7 @@
|
|||||||
# define XCPTCONTEXT_SIZE (4 * XCPTCONTEXT_REGS)
|
# define XCPTCONTEXT_SIZE (4 * XCPTCONTEXT_REGS)
|
||||||
|
|
||||||
# ifdef __ASSEMBLY__
|
# ifdef __ASSEMBLY__
|
||||||
|
|
||||||
# define JB_EBX (0*4)
|
# define JB_EBX (0*4)
|
||||||
# define JB_ESI (1*4)
|
# define JB_ESI (1*4)
|
||||||
# define JB_EDI (2*4)
|
# define JB_EDI (2*4)
|
||||||
@@ -83,6 +86,7 @@
|
|||||||
# define JB_PC (5*4)
|
# define JB_PC (5*4)
|
||||||
|
|
||||||
# else
|
# else
|
||||||
|
|
||||||
# define JB_EBX (0)
|
# define JB_EBX (0)
|
||||||
# define JB_ESI (1)
|
# define JB_ESI (1)
|
||||||
# define JB_EDI (2)
|
# define JB_EDI (2)
|
||||||
@@ -97,12 +101,42 @@
|
|||||||
# define JB_FP JB_EBP
|
# define JB_FP JB_EBP
|
||||||
|
|
||||||
#elif defined(CONFIG_HOST_ARM)
|
#elif defined(CONFIG_HOST_ARM)
|
||||||
|
|
||||||
# define XCPTCONTEXT_REGS 16
|
# define XCPTCONTEXT_REGS 16
|
||||||
# define XCPTCONTEXT_SIZE (4 * XCPTCONTEXT_REGS)
|
# define XCPTCONTEXT_SIZE (4 * XCPTCONTEXT_REGS)
|
||||||
|
|
||||||
# define JB_FP 7
|
# define JB_FP 7
|
||||||
# define JB_SP 8
|
# define JB_SP 8
|
||||||
# define JB_PC 9
|
# define JB_PC 9
|
||||||
|
|
||||||
|
#elif defined(CONFIG_HOST_ARM64)
|
||||||
|
|
||||||
|
# define XCPTCONTEXT_REGS 32
|
||||||
|
# define XCPTCONTEXT_SIZE (8 * XCPTCONTEXT_REGS)
|
||||||
|
|
||||||
|
# ifdef __ASSEMBLY__
|
||||||
|
|
||||||
|
# define JB_X19_X20 #0x00
|
||||||
|
# define JB_X21_X22 #0x10
|
||||||
|
# define JB_X23_X24 #0x20
|
||||||
|
# define JB_X25_X26 #0x30
|
||||||
|
# define JB_X27_X28 #0x40
|
||||||
|
# define JB_X29_XLR #0x50
|
||||||
|
# define JB_XFP_XSP #0x60
|
||||||
|
|
||||||
|
# define JB_D08_D09 #0x70
|
||||||
|
# define JB_D10_D11 #0x80
|
||||||
|
# define JB_D12_D13 #0x90
|
||||||
|
# define JB_D14_D15 #0xA0
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
# define JB_PC (11)
|
||||||
|
# define JB_FP (12)
|
||||||
|
# define JB_SP (13)
|
||||||
|
|
||||||
|
# endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -113,6 +147,7 @@
|
|||||||
|
|
||||||
typedef unsigned long xcpt_reg_t;
|
typedef unsigned long xcpt_reg_t;
|
||||||
typedef xcpt_reg_t jmp_buf[XCPTCONTEXT_REGS];
|
typedef xcpt_reg_t jmp_buf[XCPTCONTEXT_REGS];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ else ifeq ($(CONFIG_HOST_X86),y)
|
|||||||
ASRCS += up_vfork_x86.S
|
ASRCS += up_vfork_x86.S
|
||||||
else ifeq ($(CONFIG_HOST_ARM),y)
|
else ifeq ($(CONFIG_HOST_ARM),y)
|
||||||
ASRCS += up_vfork_arm.S
|
ASRCS += up_vfork_arm.S
|
||||||
|
else ifeq ($(CONFIG_HOST_ARM64),y)
|
||||||
|
ASRCS += up_vfork_arm64.S
|
||||||
endif
|
endif
|
||||||
|
|
||||||
AOBJS = $(ASRCS:.S=$(OBJEXT))
|
AOBJS = $(ASRCS:.S=$(OBJEXT))
|
||||||
|
|||||||
@@ -63,8 +63,16 @@ void *host_alloc_heap(size_t sz)
|
|||||||
{
|
{
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
|
#if defined(CONFIG_HOST_MACOS) && defined(CONFIG_HOST_ARM64)
|
||||||
|
/* see: https://developer.apple.com/forums/thread/672804 */
|
||||||
|
|
||||||
|
p = mmap(NULL, sz, PROT_READ | PROT_WRITE,
|
||||||
|
MAP_ANON | MAP_SHARED, -1, 0);
|
||||||
|
#else
|
||||||
p = mmap(NULL, sz, PROT_READ | PROT_WRITE | PROT_EXEC,
|
p = mmap(NULL, sz, PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||||
MAP_ANON | MAP_PRIVATE, -1, 0);
|
MAP_ANON | MAP_PRIVATE, -1, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (p == MAP_FAILED)
|
if (p == MAP_FAILED)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -82,12 +82,19 @@ void up_initial_state(struct tcb_s *tcb)
|
|||||||
* Thus, we need to emulate the effect of a CALL here, by subtracting
|
* Thus, we need to emulate the effect of a CALL here, by subtracting
|
||||||
* sizeof(xcpt_reg_t), which is the amount a CALL would move RSP to store
|
* sizeof(xcpt_reg_t), which is the amount a CALL would move RSP to store
|
||||||
* the return address.
|
* the return address.
|
||||||
|
*
|
||||||
|
* Note: On ARM64 architectures the return address is passed via LR
|
||||||
|
* register. No extra adjustment for the stack needed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tcb->xcp.regs[JB_SP] = (xcpt_reg_t)tcb->stack_base_ptr +
|
tcb->xcp.regs[JB_SP] = (xcpt_reg_t)tcb->stack_base_ptr
|
||||||
tcb->adj_stack_size -
|
#if !defined(CONFIG_HOST_ARM64)
|
||||||
sizeof(xcpt_reg_t);
|
- sizeof(xcpt_reg_t)
|
||||||
|
#endif
|
||||||
|
+ tcb->adj_stack_size;
|
||||||
|
|
||||||
tcb->xcp.regs[JB_PC] = (xcpt_reg_t)tcb->start;
|
tcb->xcp.regs[JB_PC] = (xcpt_reg_t)tcb->start;
|
||||||
|
|
||||||
#ifdef CONFIG_SIM_ASAN
|
#ifdef CONFIG_SIM_ASAN
|
||||||
__asan_unpoison_memory_region(tcb->stack_alloc_ptr, tcb->adj_stack_size);
|
__asan_unpoison_memory_region(tcb->stack_alloc_ptr, tcb->adj_stack_size);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/sim/src/sim/up_vfork_arm64.S
|
||||||
|
*
|
||||||
|
* 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 <nuttx/config.h>
|
||||||
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CONFIG_HOST_MACOS)
|
||||||
|
#define SYMBOL(x) _##x
|
||||||
|
#else
|
||||||
|
#define SYMBOL(x) x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Symbols
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
.file "up_vfork_arm64.S"
|
||||||
|
.globl SYMBOL(up_vfork)
|
||||||
|
.globl SYMBOL(setjmp)
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: vfork
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* The vfork() function has the same effect as fork(), except that the
|
||||||
|
* behavior is undefined if the process created by vfork() either modifies
|
||||||
|
* any data other than a variable of type pid_t used to store the return
|
||||||
|
* value from vfork(), or returns from the function in which vfork() was
|
||||||
|
* called, or calls any other function before successfully calling _exit()
|
||||||
|
* or one of the exec family of functions.
|
||||||
|
*
|
||||||
|
* This thin layer implements vfork by simply calling up_vfork() with the
|
||||||
|
* vfork() context as an argument. The overall sequence is:
|
||||||
|
*
|
||||||
|
* 1) User code calls vfork(). vfork() collects context information and
|
||||||
|
* transfers control up up_vfork().
|
||||||
|
* 2) up_vfork() and calls nxtask_setup_vfork().
|
||||||
|
* 3) nxtask_setup_vfork() allocates and configures the child task's TCB.
|
||||||
|
* This consists of:
|
||||||
|
* - Allocation of the child task's TCB.
|
||||||
|
* - Initialization of file descriptors and streams
|
||||||
|
* - Configuration of environment variables
|
||||||
|
* - Allocate and initialize the stack
|
||||||
|
* - Setup the input parameters for the task.
|
||||||
|
* - Initialization of the TCB (including call to up_initial_state())
|
||||||
|
* 4) up_vfork() provides any additional operating context. up_vfork must:
|
||||||
|
* - Initialize special values in any CPU registers that were not
|
||||||
|
* already configured by up_initial_state()
|
||||||
|
* 5) up_vfork() then calls nxtask_start_vfork()
|
||||||
|
* 6) nxtask_start_vfork() then executes the child thread.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Upon successful completion, vfork() returns 0 to the child process and
|
||||||
|
* returns the process ID of the child process to the parent process.
|
||||||
|
* Otherwise, -1 is returned to the parent, no child process is created,
|
||||||
|
* and errno is set to indicate the error.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl SYMBOL(vfork)
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
SYMBOL(vfork):
|
||||||
|
|
||||||
|
stp x29, x30, [sp] /* save FP/LR register */
|
||||||
|
sub sp, sp, #XCPTCONTEXT_SIZE /* area from stack for setjmp() */
|
||||||
|
|
||||||
|
mov x0, sp /* pass stack area to setjmp() */
|
||||||
|
bl SYMBOL(setjmp) /* save register for longjmp() */
|
||||||
|
|
||||||
|
subs x0, x0, #1 /* 0: parent / 1: child */
|
||||||
|
cbz x0, 1f /* child --> return */
|
||||||
|
|
||||||
|
mov x0, sp /* pass stack area to up_vfork() */
|
||||||
|
bl SYMBOL(up_vfork) /* further process task creation */
|
||||||
|
|
||||||
|
1:
|
||||||
|
add sp, sp, #XCPTCONTEXT_SIZE /* release area from stack */
|
||||||
|
ldp x29, x30, [sp] /* restore FP/LR register */
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.end
|
||||||
@@ -472,6 +472,7 @@ Common Configuration Information
|
|||||||
CONFIG_HOST_WINDOWS=n
|
CONFIG_HOST_WINDOWS=n
|
||||||
CONFIG_HOST_X86=y
|
CONFIG_HOST_X86=y
|
||||||
CONFIG_HOST_X86_64=n
|
CONFIG_HOST_X86_64=n
|
||||||
|
CONFIG_HOST_ARM64=n
|
||||||
|
|
||||||
b. Linux, 64-bit CPU, 32-bit build
|
b. Linux, 64-bit CPU, 32-bit build
|
||||||
|
|
||||||
@@ -479,6 +480,7 @@ Common Configuration Information
|
|||||||
CONFIG_HOST_WINDOWS=n
|
CONFIG_HOST_WINDOWS=n
|
||||||
CONFIG_HOST_X86=n
|
CONFIG_HOST_X86=n
|
||||||
CONFIG_HOST_X86_64=y
|
CONFIG_HOST_X86_64=y
|
||||||
|
CONFIG_HOST_ARM64=n
|
||||||
CONFIG_SIM_X8664_MICROSOFT=n
|
CONFIG_SIM_X8664_MICROSOFT=n
|
||||||
CONFIG_SIM_X8664_SYSTEMV=y
|
CONFIG_SIM_X8664_SYSTEMV=y
|
||||||
CONFIG_SIM_M32=y
|
CONFIG_SIM_M32=y
|
||||||
@@ -489,6 +491,7 @@ Common Configuration Information
|
|||||||
CONFIG_HOST_WINDOWS=n
|
CONFIG_HOST_WINDOWS=n
|
||||||
CONFIG_HOST_X86=n
|
CONFIG_HOST_X86=n
|
||||||
CONFIG_HOST_X86_64=y
|
CONFIG_HOST_X86_64=y
|
||||||
|
CONFIG_HOST_ARM64=n
|
||||||
CONFIG_SIM_X8664_MICROSOFT=n
|
CONFIG_SIM_X8664_MICROSOFT=n
|
||||||
CONFIG_SIM_X8664_SYSTEMV=y
|
CONFIG_SIM_X8664_SYSTEMV=y
|
||||||
CONFIG_SIM_M32=n
|
CONFIG_SIM_M32=n
|
||||||
@@ -500,6 +503,7 @@ Common Configuration Information
|
|||||||
CONFIG_WINDOWS_CYGWIN=y
|
CONFIG_WINDOWS_CYGWIN=y
|
||||||
CONFIG_HOST_X86=y
|
CONFIG_HOST_X86=y
|
||||||
CONFIG_HOST_X86_64=n
|
CONFIG_HOST_X86_64=n
|
||||||
|
CONFIG_HOST_ARM64=n
|
||||||
|
|
||||||
e. Cygwin64, 64-bit, 32-bit build
|
e. Cygwin64, 64-bit, 32-bit build
|
||||||
|
|
||||||
@@ -512,6 +516,7 @@ Common Configuration Information
|
|||||||
CONFIG_WINDOWS_CYGWIN=y
|
CONFIG_WINDOWS_CYGWIN=y
|
||||||
CONFIG_HOST_X86=n
|
CONFIG_HOST_X86=n
|
||||||
CONFIG_HOST_X86_64=y
|
CONFIG_HOST_X86_64=y
|
||||||
|
CONFIG_HOST_ARM64=n
|
||||||
CONFIG_SIM_X8664_MICROSOFT=y
|
CONFIG_SIM_X8664_MICROSOFT=y
|
||||||
CONFIG_SIM_X8664_SYSTEMV=n
|
CONFIG_SIM_X8664_SYSTEMV=n
|
||||||
CONFIG_SIM_M32=n
|
CONFIG_SIM_M32=n
|
||||||
@@ -523,6 +528,31 @@ Common Configuration Information
|
|||||||
CONFIG_HOST_WINDOWS=n
|
CONFIG_HOST_WINDOWS=n
|
||||||
CONFIG_HOST_X86=n
|
CONFIG_HOST_X86=n
|
||||||
CONFIG_HOST_X86_64=y
|
CONFIG_HOST_X86_64=y
|
||||||
|
CONFIG_HOST_ARM64=n
|
||||||
|
CONFIG_SIM_X8664_MICROSOFT=n
|
||||||
|
CONFIG_SIM_X8664_SYSTEMV=y
|
||||||
|
CONFIG_SIM_M32=n
|
||||||
|
|
||||||
|
h. macOS M1, 64-bit, 64-bit build
|
||||||
|
|
||||||
|
CONFIG_HOST_LINUX=n
|
||||||
|
CONFIG_HOST_MACOS=y
|
||||||
|
CONFIG_HOST_WINDOWS=n
|
||||||
|
CONFIG_HOST_X86=n
|
||||||
|
CONFIG_HOST_X86_64=n
|
||||||
|
CONFIG_HOST_ARM64=y
|
||||||
|
CONFIG_SIM_X8664_MICROSOFT=n
|
||||||
|
CONFIG_SIM_X8664_SYSTEMV=y
|
||||||
|
CONFIG_SIM_M32=n
|
||||||
|
|
||||||
|
i. Linux ARM64, 64-bit, 64-bit build
|
||||||
|
|
||||||
|
CONFIG_HOST_LINUX=y
|
||||||
|
CONFIG_HOST_MACOS=n
|
||||||
|
CONFIG_HOST_WINDOWS=n
|
||||||
|
CONFIG_HOST_X86=n
|
||||||
|
CONFIG_HOST_X86_64=n
|
||||||
|
CONFIG_HOST_ARM64=y
|
||||||
CONFIG_SIM_X8664_MICROSOFT=n
|
CONFIG_SIM_X8664_MICROSOFT=n
|
||||||
CONFIG_SIM_X8664_SYSTEMV=y
|
CONFIG_SIM_X8664_SYSTEMV=y
|
||||||
CONFIG_SIM_M32=n
|
CONFIG_SIM_M32=n
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ else ifeq ($(CONFIG_HOST_ARM),y)
|
|||||||
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
|
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
|
||||||
ASRCS += arch_setjmp_arm.S
|
ASRCS += arch_setjmp_arm.S
|
||||||
endif
|
endif
|
||||||
|
else ifeq ($(CONFIG_HOST_ARM64),y)
|
||||||
|
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
|
||||||
|
ASRCS += arch_setjmp_arm64.S
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
DEPPATH += --dep-path machine/sim
|
DEPPATH += --dep-path machine/sim
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* libs/libc/machine/sim/arch_setjmp_arm64.S
|
||||||
|
*
|
||||||
|
* 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 <nuttx/config.h>
|
||||||
|
#include <arch/setjmp.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CONFIG_HOST_MACOS)
|
||||||
|
#define SYMBOL(x) _##x
|
||||||
|
#else
|
||||||
|
#define SYMBOL(x) x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl SYMBOL(setjmp)
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
SYMBOL(setjmp):
|
||||||
|
|
||||||
|
stp x19, x20, [x0, JB_X19_X20]
|
||||||
|
stp x21, x22, [x0, JB_X21_X22]
|
||||||
|
stp x23, x24, [x0, JB_X23_X24]
|
||||||
|
stp x25, x26, [x0, JB_X25_X26]
|
||||||
|
stp x27, x28, [x0, JB_X27_X28]
|
||||||
|
stp x29, lr, [x0, JB_X29_XLR]
|
||||||
|
mov x1, sp /* STP can't access SP */
|
||||||
|
stp fp, x1, [x0, JB_XFP_XSP]
|
||||||
|
stp d8, d9, [x0, JB_D08_D09]
|
||||||
|
stp d10, d11, [x0, JB_D10_D11]
|
||||||
|
stp d12, d13, [x0, JB_D12_D13]
|
||||||
|
stp d14, d15, [x0, JB_D14_D15]
|
||||||
|
|
||||||
|
mov x0,#0 /* return value */
|
||||||
|
ret
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl SYMBOL(longjmp)
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
SYMBOL(longjmp):
|
||||||
|
|
||||||
|
ldp x19, x20, [x0, JB_X19_X20]
|
||||||
|
ldp x21, x22, [x0, JB_X21_X22]
|
||||||
|
ldp x23, x24, [x0, JB_X23_X24]
|
||||||
|
ldp x25, x26, [x0, JB_X25_X26]
|
||||||
|
ldp x27, x28, [x0, JB_X27_X28]
|
||||||
|
ldp x29, lr, [x0, JB_X29_XLR]
|
||||||
|
ldp fp, x2, [x0, JB_XFP_XSP]
|
||||||
|
ldp d8, d9, [x0, JB_D08_D09]
|
||||||
|
ldp d10, d11, [x0, JB_D10_D11]
|
||||||
|
ldp d12, d13, [x0, JB_D12_D13]
|
||||||
|
ldp d14, d15, [x0, JB_D14_D15]
|
||||||
|
mov sp, x2 /* LDP can't access SP */
|
||||||
|
|
||||||
|
mov x0, x1
|
||||||
|
cmp x0, #0
|
||||||
|
b.ne 1f /* return 1, if val is 0 */
|
||||||
|
|
||||||
|
mov x0,#1 /* return value */
|
||||||
|
|
||||||
|
1:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.end
|
||||||
+8
-8
@@ -112,10 +112,10 @@ fi
|
|||||||
if [ -z "$cpu" ]; then
|
if [ -z "$cpu" ]; then
|
||||||
case $(uname -m) in
|
case $(uname -m) in
|
||||||
arm64)
|
arm64)
|
||||||
cpu=arm
|
cpu=arm64
|
||||||
;;
|
;;
|
||||||
aarch64)
|
aarch64)
|
||||||
cpu=arm
|
cpu=arm64
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
# Assume x86_64 as default
|
# Assume x86_64 as default
|
||||||
@@ -164,9 +164,9 @@ if [ "X$host" == "Xlinux" -o "X$host" == "Xmacos" -o "X$host" == "Xbsd" ]; then
|
|||||||
kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_BSD
|
kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_BSD
|
||||||
kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_LINUX
|
kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_LINUX
|
||||||
|
|
||||||
if [ "X$cpu" == "Xarm" ]; then
|
if [ "X$cpu" == "Xarm64" ]; then
|
||||||
echo " Select CONFIG_HOST_ARM=y"
|
echo " Select CONFIG_HOST_ARM64=y"
|
||||||
kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_ARM
|
kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_ARM64
|
||||||
fi
|
fi
|
||||||
|
|
||||||
elif [ "X$host" == "Xbsd" ]; then
|
elif [ "X$host" == "Xbsd" ]; then
|
||||||
@@ -181,9 +181,9 @@ if [ "X$host" == "Xlinux" -o "X$host" == "Xmacos" -o "X$host" == "Xbsd" ]; then
|
|||||||
kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_BSD
|
kconfig-tweak --file $nuttx/.config --disable CONFIG_HOST_BSD
|
||||||
kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_MACOS
|
kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_MACOS
|
||||||
|
|
||||||
if [ "X$cpu" == "Xarm" ]; then
|
if [ "X$cpu" == "Xarm64" ]; then
|
||||||
echo " Select CONFIG_HOST_ARM=y"
|
echo " Select CONFIG_HOST_ARM64=y"
|
||||||
kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_ARM
|
kconfig-tweak --file $nuttx/.config --enable CONFIG_HOST_ARM64
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user