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