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 2021/07/01 04:02:04 UTC

[incubator-nuttx] branch master updated: Renesas/RX: add RX setjmp, ARCH_RENESAS_RX, and RX65N ioctl

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


The following commit(s) were added to refs/heads/master by this push:
     new 8638340  Renesas/RX: add RX setjmp, ARCH_RENESAS_RX, and RX65N ioctl
8638340 is described below

commit 863834057b94a27bb5eacb4caaa01353a41b2bdc
Author: McKay Ransom <mr...@campbellsci.com>
AuthorDate: Mon Jun 28 15:59:30 2021 -0600

    Renesas/RX: add RX setjmp, ARCH_RENESAS_RX, and RX65N ioctl
---
 arch/renesas/Kconfig                           |  20 ++--
 arch/renesas/include/setjmp.h                  |  56 ++++++++++
 arch/renesas/src/rx65n/rx65n_serial.c          |  27 +++++
 libs/libc/machine/Kconfig                      |   3 +
 libs/libc/machine/Make.defs                    |   3 +
 libs/libc/machine/renesas/Kconfig              |   9 ++
 libs/libc/machine/{ => renesas}/Make.defs      |  18 +--
 libs/libc/machine/renesas/rx/Kconfig           |   7 ++
 libs/libc/machine/{ => renesas/rx}/Make.defs   |  21 +---
 libs/libc/machine/renesas/rx/gnu/arch_setjmp.S | 146 +++++++++++++++++++++++++
 10 files changed, 272 insertions(+), 38 deletions(-)

diff --git a/arch/renesas/Kconfig b/arch/renesas/Kconfig
index 470e4f4..9c341de 100644
--- a/arch/renesas/Kconfig
+++ b/arch/renesas/Kconfig
@@ -57,25 +57,32 @@ config ARCH_SH1
 	bool
 	default n
 
+config ARCH_RENESAS_RX
+    bool
+    default n
+    select ARCH_HAVE_SETJMP
+    select CYGWIN_WINTOOL if WINDOWS_CYGWIN
+
 config ARCH_RX65N
 	bool
 	default n
-	select CYGWIN_WINTOOL if WINDOWS_CYGWIN
+	select ARCH_RENESAS_RX
 
 config ARCH_RX65N_RSK1MB
 	bool
 	default n
-	select CYGWIN_WINTOOL if WINDOWS_CYGWIN
+	select ARCH_RENESAS_RX
 
 config ARCH_RX65N_RSK2MB
 	bool
 	default n
-	select CYGWIN_WINTOOL if WINDOWS_CYGWIN
+	select ARCH_RENESAS_RX
+
 
 config ARCH_RX65N_GRROSE
 	bool
 	default n
-	select CYGWIN_WINTOOL if WINDOWS_CYGWIN
+	select ARCH_RENESAS_RX
 
 config ARCH_M16C
 	bool
@@ -85,10 +92,7 @@ config ARCH_CHIP
 	string
 	default "sh1"		if ARCH_SH1
 	default "m16c"		if ARCH_M16C
-	default "rx65n"		if ARCH_RX65N
-	default "rx65n"		if ARCH_RX65N_RSK1MB
-	default "rx65n"		if ARCH_RX65N_RSK2MB
-	default "rx65n"		if ARCH_RX65N_GRROSE
+	default "rx65n"		if ARCH_RENESAS_RX
 
 source arch/renesas/src/common/Kconfig
 source arch/renesas/src/m16c/Kconfig
diff --git a/arch/renesas/include/setjmp.h b/arch/renesas/include/setjmp.h
new file mode 100644
index 0000000..5c288b7
--- /dev/null
+++ b/arch/renesas/include/setjmp.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * arch/renesas/include/setjmp.h
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RENESAS_INCLUDE_SETJUMP_H
+#define __ARCH_RENESAS_INCLUDE_SETJUMP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/compiler.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#if defined(CONFIG_ARCH_RENESAS_RX)
+struct setjmp_buf_s
+{
+  unsigned regs[10];
+};
+
+/* Traditional typedef for setjmp_buf */
+
+typedef struct setjmp_buf_s jmp_buf[1];
+
+#else
+#  error "setjmp() not compiled!"
+#endif /* CONFIG_ARCH_RX... */
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+int setjmp(jmp_buf env);
+void longjmp(jmp_buf env, int val) noreturn_function;
+
+#endif /* __ARCH_RENESAS_INCLUDE_SETJUMP_H */
diff --git a/arch/renesas/src/rx65n/rx65n_serial.c b/arch/renesas/src/rx65n/rx65n_serial.c
index eeb4698..41f79c4 100644
--- a/arch/renesas/src/rx65n/rx65n_serial.c
+++ b/arch/renesas/src/rx65n/rx65n_serial.c
@@ -281,6 +281,7 @@ static int  up_setup(struct uart_dev_s *dev);
 static void up_shutdown(struct uart_dev_s *dev);
 static int  up_attach(struct uart_dev_s *dev);
 static void up_detach(struct uart_dev_s *dev);
+static int  up_ioctl(struct file *filep, int cmd, unsigned long arg);
 static int  up_xmtinterrupt(int irq, void *context, FAR void *arg);
 static int  up_rcvinterrupt(int irq, void *context, FAR void *arg);
 static int  up_eriinterrupt(int irq, void *context, FAR void *arg);
@@ -365,6 +366,7 @@ struct uart_ops_s g_sci_ops =
   .attach      =  up_attach,
   .detach      =  up_detach,
   .receive     =  up_receive,
+  .ioctl       =  up_ioctl,
   .rxint       =  up_rxint,
   .rxavailable =  up_rxavailable,
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
@@ -1283,6 +1285,31 @@ static int  up_xmtinterrupt(int irq, void *context, FAR void *arg)
 }
 
 /****************************************************************************
+ * Name: up_ioctl
+ *
+ * Description:
+ *   All ioctl calls will be routed through this method
+ *
+ ****************************************************************************/
+
+static int up_ioctl(struct file *filep, int cmd, unsigned long arg)
+{
+    int                ret    = OK;
+
+    switch (cmd)
+    {
+#ifdef CONFIG_SERIAL_TERMIOS
+#error CONFIG_SERIAL_TERMIOS NOT IMPLEMENTED
+#endif /* CONFIG_SERIAL_TERMIOS */
+       default:
+            ret = -ENOTTY;
+            break;
+    }
+
+    return ret;
+}
+
+/****************************************************************************
  * Name: up_receive
  *
  * Description:
diff --git a/libs/libc/machine/Kconfig b/libs/libc/machine/Kconfig
index f0f439f..110c7d3 100644
--- a/libs/libc/machine/Kconfig
+++ b/libs/libc/machine/Kconfig
@@ -174,5 +174,8 @@ endif
 if ARCH_XTENSA
 source libs/libc/machine/xtensa/Kconfig
 endif
+if ARCH_RENESAS
+source libs/libc/machine/renesas/Kconfig
+endif
 
 endmenu # Architecture-Specific Support
diff --git a/libs/libc/machine/Make.defs b/libs/libc/machine/Make.defs
index 4817ca8..818dffb 100644
--- a/libs/libc/machine/Make.defs
+++ b/libs/libc/machine/Make.defs
@@ -33,3 +33,6 @@ endif
 ifeq ($(CONFIG_ARCH_XTENSA),y)
 include $(TOPDIR)/libs/libc/machine/xtensa/Make.defs
 endif
+ifeq ($(CONFIG_ARCH_RENESAS),y)
+include $(TOPDIR)/libs/libc/machine/renesas/Make.defs
+endif
diff --git a/libs/libc/machine/renesas/Kconfig b/libs/libc/machine/renesas/Kconfig
new file mode 100644
index 0000000..a638723
--- /dev/null
+++ b/libs/libc/machine/renesas/Kconfig
@@ -0,0 +1,9 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+#if ARCH_RENESAS_RX
+#source libs/libc/machine/renesas/rx/Kconfig
+#endif
+
diff --git a/libs/libc/machine/Make.defs b/libs/libc/machine/renesas/Make.defs
similarity index 67%
copy from libs/libc/machine/Make.defs
copy to libs/libc/machine/renesas/Make.defs
index 4817ca8..a99c83e 100644
--- a/libs/libc/machine/Make.defs
+++ b/libs/libc/machine/renesas/Make.defs
@@ -1,5 +1,5 @@
 ############################################################################
-# libs/libc/machine/Make.defs
+# libs/libc/machine/renesas/Make.defs
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -18,18 +18,6 @@
 #
 ############################################################################
 
-ifeq ($(CONFIG_ARCH_ARM),y)
-include $(TOPDIR)/libs/libc/machine/arm/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_RISCV),y)
-include $(TOPDIR)/libs/libc/machine/risc-v/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_SIM),y)
-include $(TOPDIR)/libs/libc/machine/sim/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_X86),y)
-include $(TOPDIR)/libs/libc/machine/x86/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_XTENSA),y)
-include $(TOPDIR)/libs/libc/machine/xtensa/Make.defs
+ifeq ($(CONFIG_ARCH_RENESAS_RX),y)
+include $(TOPDIR)/libs/libc/machine/renesas/rx/Make.defs
 endif
diff --git a/libs/libc/machine/renesas/rx/Kconfig b/libs/libc/machine/renesas/rx/Kconfig
new file mode 100644
index 0000000..cb611de
--- /dev/null
+++ b/libs/libc/machine/renesas/rx/Kconfig
@@ -0,0 +1,7 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+if ARCH_RENESAS_RX
+endif
diff --git a/libs/libc/machine/Make.defs b/libs/libc/machine/renesas/rx/Make.defs
similarity index 67%
copy from libs/libc/machine/Make.defs
copy to libs/libc/machine/renesas/rx/Make.defs
index 4817ca8..4e8aa5a 100644
--- a/libs/libc/machine/Make.defs
+++ b/libs/libc/machine/renesas/rx/Make.defs
@@ -1,5 +1,5 @@
 ############################################################################
-# libs/libc/machine/Make.defs
+# libs/libc/machine/renesas/rx/Make.defs
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -18,18 +18,9 @@
 #
 ############################################################################
 
-ifeq ($(CONFIG_ARCH_ARM),y)
-include $(TOPDIR)/libs/libc/machine/arm/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_RISCV),y)
-include $(TOPDIR)/libs/libc/machine/risc-v/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_SIM),y)
-include $(TOPDIR)/libs/libc/machine/sim/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_X86),y)
-include $(TOPDIR)/libs/libc/machine/x86/Make.defs
-endif
-ifeq ($(CONFIG_ARCH_XTENSA),y)
-include $(TOPDIR)/libs/libc/machine/xtensa/Make.defs
+ifeq ($(CONFIG_ARCH_SETJMP_H),y)
+ASRCS += arch_setjmp.S
 endif
+
+DEPPATH += --dep-path machine/renesas/rx/gnu
+VPATH += :machine/renesas/rx/gnu
diff --git a/libs/libc/machine/renesas/rx/gnu/arch_setjmp.S b/libs/libc/machine/renesas/rx/gnu/arch_setjmp.S
new file mode 100644
index 0000000..bff7aa1
--- /dev/null
+++ b/libs/libc/machine/renesas/rx/gnu/arch_setjmp.S
@@ -0,0 +1,146 @@
+/****************************************************************************
+ * libs/libc/machine/renesas/rx/gnu/arm_setjmp.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>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Symbols
+ ****************************************************************************/
+
+	.text
+	.global	_setjmp
+	.global	_longjmp
+
+	.file	"setjmp.S"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: setjmp
+ *
+ * Description:
+ *   Given the pointer to a register save area (in R1), save the state of the
+ *   all callee-saved registers
+ *
+ * C Function Prototype:
+ *   int setjmp(jmp_buf env);
+ *
+ * Input Parameters:
+ *   env - A pointer to the register save area in which to save the floating point
+ *     registers and core registers.  Since setjmp() can not be inlined, we
+ *     only need to save the ABI-specified callee-saved registers.
+ *
+ * Returned Value:
+ *   0      setjmp called directly
+ *   non-0  we justed returned from a longjmp()
+ *
+ ****************************************************************************/
+
+	.type	_setjmp, function
+_setjmp:
+	/* save Stack Pointer */
+	mov.l		r0, [r1]
+
+	/* Store callee-saved registers R6-R13 */
+	mov.l		r6, 0x4[r1]
+        mov.l   	r7, 0x8[r1]
+        mov.l   	r8, 0xc[r1]
+        mov.l   	r9, 0x10[r1]
+        mov.l   	r10, 0x14[r1]
+        mov.l   	r11, 0x18[r1]
+        mov.l   	r12, 0x1c[r1]
+        mov.l   	r13, 0x20[r1]
+
+	/* get return address from stack */
+        mov.l   	[r0], r2
+
+	/* save return address */
+        mov.l   	r2, 0x24[r1]
+	
+	/* return 0 */
+        mov     	#0, r1
+	rts
+
+	.size	_setjmp, .-_setjmp
+
+/****************************************************************************
+ * Name: longjmp
+ *
+ * Description:
+ *   The longjmp() function used the information saved in env to transfer control
+ *   control back to the point where setjmp() was called and to restore ("rewind")
+ *   the stack to its state at the time of the setjmp() call.  When control is
+ *   passed back to where setjmp() had been called, setjmp() will return with
+ *   'val', the second parameter passed to longjmp().
+ *
+ * C Function Prototype:
+ *   void longjmp(jmp_buf env, int val);
+ *
+ * Input Parameters:
+ *   jmp_buf env
+ *   int     val
+ *
+ * Returned Value:
+ *   This function does not return anything explicitly.
+ *
+ ****************************************************************************/
+
+	.type	_longjmp, function
+_longjmp:
+	/* check if r2 is zero */
+	tst     	r2, r2
+	/* set r2 to 1 if it was zero */
+        stz     	#1, r2
+
+	/* restore stack pointer */
+        mov.l   	[r1], r0
+
+	/* get the saved return address */
+        mov.l   	0x24[r1], r3
+	/* set our return address */
+        mov.l   	r3, [r0]
+
+	/* restore callee-saved registers R6-R13 */
+        mov.l   	0x20[r1], r13
+        mov.l   	0x1c[r1], r12
+        mov.l   	0x18[r1], r11
+        mov.l   	0x14[r1], r10
+        mov.l   	0x10[r1], r9
+        mov.l   	0xc[r1], r8
+        mov.l   	0x8[r1], r7
+        mov.l   	0x4[r1], r6
+
+	/* return val */
+	mov.l		r2, r1
+	/* return */
+        rts
+
+	.size	_longjmp, .-_longjmp
+	.end