xref: /openbmc/u-boot/arch/riscv/cpu/mtrap.S (revision 7e40d0a3)
14b3f5ed5SBin Meng/* SPDX-License-Identifier: GPL-2.0+ */
24b3f5ed5SBin Meng/*
34b3f5ed5SBin Meng * M-mode Trap Handler Code for RISC-V Core
44b3f5ed5SBin Meng *
54b3f5ed5SBin Meng * Copyright (c) 2017 Microsemi Corporation.
64b3f5ed5SBin Meng * Copyright (c) 2017 Padmarao Begari <Padmarao.Begari@microsemi.com>
74b3f5ed5SBin Meng *
84b3f5ed5SBin Meng * Copyright (C) 2017 Andes Technology Corporation
94b3f5ed5SBin Meng * Rick Chen, Andes Technology Corporation <rick@andestech.com>
104b3f5ed5SBin Meng *
114b3f5ed5SBin Meng * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
124b3f5ed5SBin Meng */
134b3f5ed5SBin Meng
144b3f5ed5SBin Meng#include <common.h>
154b3f5ed5SBin Meng#include <asm/encoding.h>
164b3f5ed5SBin Meng
174b3f5ed5SBin Meng#ifdef CONFIG_32BIT
184b3f5ed5SBin Meng#define LREG		lw
194b3f5ed5SBin Meng#define SREG		sw
204b3f5ed5SBin Meng#define REGBYTES	4
214b3f5ed5SBin Meng#else
224b3f5ed5SBin Meng#define LREG		ld
234b3f5ed5SBin Meng#define SREG		sd
244b3f5ed5SBin Meng#define REGBYTES	8
254b3f5ed5SBin Meng#endif
264b3f5ed5SBin Meng
274b3f5ed5SBin Meng	.text
284b3f5ed5SBin Meng
294b3f5ed5SBin Meng	/* trap entry */
304b3f5ed5SBin Meng	.align 2
314b3f5ed5SBin Meng	.global trap_entry
324b3f5ed5SBin Mengtrap_entry:
334b3f5ed5SBin Meng	addi sp, sp, -32 * REGBYTES
344b3f5ed5SBin Meng	SREG x1,   1 * REGBYTES(sp)
354b3f5ed5SBin Meng	SREG x2,   2 * REGBYTES(sp)
364b3f5ed5SBin Meng	SREG x3,   3 * REGBYTES(sp)
374b3f5ed5SBin Meng	SREG x4,   4 * REGBYTES(sp)
384b3f5ed5SBin Meng	SREG x5,   5 * REGBYTES(sp)
394b3f5ed5SBin Meng	SREG x6,   6 * REGBYTES(sp)
404b3f5ed5SBin Meng	SREG x7,   7 * REGBYTES(sp)
414b3f5ed5SBin Meng	SREG x8,   8 * REGBYTES(sp)
424b3f5ed5SBin Meng	SREG x9,   9 * REGBYTES(sp)
434b3f5ed5SBin Meng	SREG x10, 10 * REGBYTES(sp)
444b3f5ed5SBin Meng	SREG x11, 11 * REGBYTES(sp)
454b3f5ed5SBin Meng	SREG x12, 12 * REGBYTES(sp)
464b3f5ed5SBin Meng	SREG x13, 13 * REGBYTES(sp)
474b3f5ed5SBin Meng	SREG x14, 14 * REGBYTES(sp)
484b3f5ed5SBin Meng	SREG x15, 15 * REGBYTES(sp)
494b3f5ed5SBin Meng	SREG x16, 16 * REGBYTES(sp)
504b3f5ed5SBin Meng	SREG x17, 17 * REGBYTES(sp)
514b3f5ed5SBin Meng	SREG x18, 18 * REGBYTES(sp)
524b3f5ed5SBin Meng	SREG x19, 19 * REGBYTES(sp)
534b3f5ed5SBin Meng	SREG x20, 20 * REGBYTES(sp)
544b3f5ed5SBin Meng	SREG x21, 21 * REGBYTES(sp)
554b3f5ed5SBin Meng	SREG x22, 22 * REGBYTES(sp)
564b3f5ed5SBin Meng	SREG x23, 23 * REGBYTES(sp)
574b3f5ed5SBin Meng	SREG x24, 24 * REGBYTES(sp)
584b3f5ed5SBin Meng	SREG x25, 25 * REGBYTES(sp)
594b3f5ed5SBin Meng	SREG x26, 26 * REGBYTES(sp)
604b3f5ed5SBin Meng	SREG x27, 27 * REGBYTES(sp)
614b3f5ed5SBin Meng	SREG x28, 28 * REGBYTES(sp)
624b3f5ed5SBin Meng	SREG x29, 29 * REGBYTES(sp)
634b3f5ed5SBin Meng	SREG x30, 30 * REGBYTES(sp)
644b3f5ed5SBin Meng	SREG x31, 31 * REGBYTES(sp)
654b3f5ed5SBin Meng	csrr a0, MODE_PREFIX(cause)
664b3f5ed5SBin Meng	csrr a1, MODE_PREFIX(epc)
674b3f5ed5SBin Meng	mv a2, sp
684b3f5ed5SBin Meng	jal handle_trap
694b3f5ed5SBin Meng	csrw MODE_PREFIX(epc), a0
704b3f5ed5SBin Meng
714b3f5ed5SBin Meng	LREG x1,   1 * REGBYTES(sp)
724b3f5ed5SBin Meng	LREG x3,   3 * REGBYTES(sp)
734b3f5ed5SBin Meng	LREG x4,   4 * REGBYTES(sp)
744b3f5ed5SBin Meng	LREG x5,   5 * REGBYTES(sp)
754b3f5ed5SBin Meng	LREG x6,   6 * REGBYTES(sp)
764b3f5ed5SBin Meng	LREG x7,   7 * REGBYTES(sp)
774b3f5ed5SBin Meng	LREG x8,   8 * REGBYTES(sp)
784b3f5ed5SBin Meng	LREG x9,   9 * REGBYTES(sp)
794b3f5ed5SBin Meng	LREG x10, 10 * REGBYTES(sp)
804b3f5ed5SBin Meng	LREG x11, 11 * REGBYTES(sp)
814b3f5ed5SBin Meng	LREG x12, 12 * REGBYTES(sp)
824b3f5ed5SBin Meng	LREG x13, 13 * REGBYTES(sp)
834b3f5ed5SBin Meng	LREG x14, 14 * REGBYTES(sp)
844b3f5ed5SBin Meng	LREG x15, 15 * REGBYTES(sp)
854b3f5ed5SBin Meng	LREG x16, 16 * REGBYTES(sp)
864b3f5ed5SBin Meng	LREG x17, 17 * REGBYTES(sp)
874b3f5ed5SBin Meng	LREG x18, 18 * REGBYTES(sp)
884b3f5ed5SBin Meng	LREG x19, 19 * REGBYTES(sp)
894b3f5ed5SBin Meng	LREG x20, 20 * REGBYTES(sp)
904b3f5ed5SBin Meng	LREG x21, 21 * REGBYTES(sp)
914b3f5ed5SBin Meng	LREG x22, 22 * REGBYTES(sp)
924b3f5ed5SBin Meng	LREG x23, 23 * REGBYTES(sp)
934b3f5ed5SBin Meng	LREG x24, 24 * REGBYTES(sp)
944b3f5ed5SBin Meng	LREG x25, 25 * REGBYTES(sp)
954b3f5ed5SBin Meng	LREG x26, 26 * REGBYTES(sp)
964b3f5ed5SBin Meng	LREG x27, 27 * REGBYTES(sp)
974b3f5ed5SBin Meng	LREG x28, 28 * REGBYTES(sp)
984b3f5ed5SBin Meng	LREG x29, 29 * REGBYTES(sp)
994b3f5ed5SBin Meng	LREG x30, 30 * REGBYTES(sp)
1004b3f5ed5SBin Meng	LREG x31, 31 * REGBYTES(sp)
101*496262ccSBin Meng	LREG x2,   2 * REGBYTES(sp)
1024b3f5ed5SBin Meng	addi sp, sp, 32 * REGBYTES
1034b3f5ed5SBin Meng	MODE_PREFIX(ret)
104