riscv: integrated wcn code for rtos kernel into rtos sdk. [4/10]

PD#SWPL-154565

Problem:
integrated wcn code for rtos kernel into rtos sdk.

Solution:
integrated wcn code for rtos kernel into rtos sdk.

Verify:
N/A

Change-Id: I35de2185562fc387bdc8529bd36e2f4c8cecdfa1
Signed-off-by: xiaohu.huang <xiaohu.huang@amlogic.com>
diff --git a/entry_wcn.S b/entry_wcn.S
new file mode 100644
index 0000000..3e82883
--- /dev/null
+++ b/entry_wcn.S
@@ -0,0 +1,243 @@
+/*
+ * Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef ENTRY_S
+#define ENTRY_S
+
+#include "riscv_encoding.h"
+
+#if __riscv_xlen == 64
+#define SLL32 sllw
+#define STORE sd
+#define LOAD ld
+#define LWU lwu
+#define LOG_REGBYTES 3
+#else
+#define SLL32 sll
+#define STORE sw
+#define LOAD lw
+#define LWU lw
+#define LOG_REGBYTES 2
+#endif
+#define REGBYTES (1 << LOG_REGBYTES)
+
+#if __riscv_flen == 64
+#define FPSTORE fsd
+#define FPLOAD fld
+#define LOG_FPREGBYTES 3
+#else
+#define FPSTORE fsw
+#define FPLOAD flw
+#define LOG_FPREGBYTES 2
+#endif
+
+.align 2
+.extern interrupt_register_nmi
+.extern interrupt_register_exception
+
+.macro wr_reg, address, value
+    li  t0, \address
+    li  t1, \value
+    sw  t1, (t0)
+.endm
+
+###############################################
+###############################################
+#only save caller registers
+.macro SAVE_CONTEXT
+  STORE x1,  0*REGBYTES(sp)
+  STORE x5,  1*REGBYTES(sp)
+  STORE x6,  2*REGBYTES(sp)
+  STORE x7,  3*REGBYTES(sp)
+  STORE x10, 4*REGBYTES(sp)
+  STORE x11, 5*REGBYTES(sp)
+  STORE x12, 6*REGBYTES(sp)
+  STORE x13, 7*REGBYTES(sp)
+  STORE x14, 8*REGBYTES(sp)
+  STORE x15, 9*REGBYTES(sp)
+  STORE x16, 10*REGBYTES(sp)
+  STORE x17, 11*REGBYTES(sp)
+  STORE x28, 12*REGBYTES(sp)
+  STORE x29, 13*REGBYTES(sp)
+  STORE x30, 14*REGBYTES(sp)
+  STORE x31, 15*REGBYTES(sp)
+.endm
+###############################################
+###############################################
+#restore caller registers
+.macro RESTORE_CONTEXT
+  LOAD x1,  0*REGBYTES(sp)
+  LOAD x5,  1*REGBYTES(sp)
+  LOAD x6,  2*REGBYTES(sp)
+  LOAD x7,  3*REGBYTES(sp)
+  LOAD x10, 4*REGBYTES(sp)
+  LOAD x11, 5*REGBYTES(sp)
+  LOAD x12, 6*REGBYTES(sp)
+  LOAD x13, 7*REGBYTES(sp)
+  LOAD x14, 8*REGBYTES(sp)
+  LOAD x15, 9*REGBYTES(sp)
+  LOAD x16, 10*REGBYTES(sp)
+  LOAD x17, 11*REGBYTES(sp)
+  LOAD x28, 12*REGBYTES(sp)
+  LOAD x29, 13*REGBYTES(sp)
+  LOAD x30, 14*REGBYTES(sp)
+  LOAD x31, 15*REGBYTES(sp)
+.endm
+###############################################
+###############################################
+#restore caller registers
+.macro RESTORE_CONTEXT_EXCEPT_X5
+  LOAD x1,  0*REGBYTES(sp)
+  LOAD x6,  2*REGBYTES(sp)
+  LOAD x7,  3*REGBYTES(sp)
+  LOAD x10, 4*REGBYTES(sp)
+  LOAD x11, 5*REGBYTES(sp)
+  LOAD x12, 6*REGBYTES(sp)
+  LOAD x13, 7*REGBYTES(sp)
+  LOAD x14, 8*REGBYTES(sp)
+  LOAD x15, 9*REGBYTES(sp)
+  LOAD x16, 10*REGBYTES(sp)
+  LOAD x17, 11*REGBYTES(sp)
+  LOAD x28, 12*REGBYTES(sp)
+  LOAD x29, 13*REGBYTES(sp)
+  LOAD x30, 14*REGBYTES(sp)
+  LOAD x31, 15*REGBYTES(sp)
+.endm
+###############################################
+###############################################
+#restore caller registers
+.macro RESTORE_CONTEXT_ONLY_X5
+  LOAD x5,  1*REGBYTES(sp)
+.endm
+###############################################
+###############################################
+# Save the mepc and mstatus
+#
+.macro SAVE_MEPC_MSTATUS
+  csrr x5, CSR_MEPC  
+  STORE x5,  16*REGBYTES(sp)
+  csrr x5, CSR_MSTATUS  
+  STORE x5,  17*REGBYTES(sp)
+  csrr x5, CSR_MSUBM
+  STORE x5,  18*REGBYTES(sp)
+.endm
+
+###############################################
+###############################################
+# Restore the mepc and mstatus
+#
+.macro RESTORE_MEPC_MSTATUS
+  LOAD x5,  16*REGBYTES(sp)
+  csrw CSR_MEPC, x5  
+  LOAD x5,  17*REGBYTES(sp)
+  csrw CSR_MSTATUS, x5  
+  LOAD x5,  18*REGBYTES(sp)
+  csrw CSR_MSUBM, x5
+.endm
+###############################################
+###############################################
+# Disable Interrupt
+#
+.macro DISABLE_MIE
+  csrc CSR_MSTATUS, MSTATUS_MIE
+.endm
+###############################################
+###############################################
+# Enable Interrupt
+#
+.macro ENABLE_MIE
+  csrs CSR_MSTATUS, MSTATUS_MIE  
+.endm
+###############################################
+###############################################
+
+  .align 6
+  .global exception_entry
+exception_entry:
+  addi sp, sp, -19*REGBYTES  // allocate stack
+
+  // saving registers
+  SAVE_CONTEXT
+  // saving mepc/mstatus
+  SAVE_MEPC_MSTATUS
+
+  csrr a0, mcause
+  mv a1, sp
+  call interrupt_register_exception
+  
+  // restore mepc/mstatus registers
+  RESTORE_MEPC_MSTATUS
+  // restore registers
+  RESTORE_CONTEXT
+  
+  addi sp, sp, 19*REGBYTES  // get back stack
+  mret
+
+###############################################
+###############################################
+
+  .align 2
+  .global nmi_entry
+nmi_entry:
+  addi sp, sp, -19*REGBYTES  // allocate stack
+
+  // saving registers
+  SAVE_CONTEXT
+  // saving mepc/mstatus
+  SAVE_MEPC_MSTATUS
+  
+  csrr a0, mcause
+  call interrupt_register_nmi
+  
+  // restore mepc/mstatus registers
+  RESTORE_MEPC_MSTATUS
+  // restore registers
+  RESTORE_CONTEXT
+  
+  addi sp, sp, 19*REGBYTES  // get back stack
+  mret
+
+###############################################
+###############################################
+
+  .align 2
+  .global int_entry
+int_entry:
+  addi sp, sp, -19*REGBYTES  // allocate stack
+
+  // saving registers
+  SAVE_CONTEXT
+  // store mcause/mepc/msubm to stack
+  csrrwi  x0, CSR_PUSHMCAUSE, 16
+  csrrwi  x0, CSR_PUSHMEPC, 17
+  csrrwi  x0, CSR_PUSHMSUBM, 18
+
+service_loop:
+  // Claim the CLIC to find its pending highest ID
+  // if the ID is not 0, then automatically enable the mstatus.MIE, and jump to its vector-entry-label
+  // and update the link register
+  csrrw ra, CSR_JALMNXTI, ra
+
+  RESTORE_CONTEXT_EXCEPT_X5
+
+  #---- Critical section with interrupts disabled -----------------------
+  DISABLE_MIE # Disable interrupts
+
+  LOAD x5,  18*REGBYTES(sp)
+  csrw CSR_MSUBM, x5
+  LOAD x5,  17*REGBYTES(sp)
+  csrw CSR_MEPC, x5
+  LOAD x5,  16*REGBYTES(sp)
+  csrw CSR_MCAUSE, x5
+
+  RESTORE_CONTEXT_ONLY_X5
+
+  // De-allocate the stack space
+  addi sp, sp, 19*REGBYTES
+  // Return to regular code
+  mret
+  
+#endif