summaryrefslogtreecommitdiff
path: root/libcpu/aarch64/common/vector_gcc.S
blob: d4c6223bcf1c7b50ede8781ec5113a8dd2f5870f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 * Copyright (c) 2006-2020, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-10-06     ZhaoXiaowei  the first version
 * 2024-03-28     Shell        Move vector handling codes from context_gcc.S
 */

#ifndef __ASSEMBLY__
#define __ASSEMBLY__
#endif

#include <rtconfig.h>

.text
.globl system_vectors
.globl vector_exception
.globl vector_irq
.globl vector_fiq

system_vectors:
.align 11
    .set    VBAR, system_vectors
    .org    VBAR

    /*  Exception from CurrentEL (EL1) with SP_EL0 (SPSEL=1) */
    .org (VBAR + 0x00 + 0)
    b vector_serror                     /* Synchronous */
    .org (VBAR + 0x80 + 0)
    b vector_serror                     /* IRQ/vIRQ */
    .org (VBAR + 0x100 + 0)
    b vector_serror                     /* FIQ/vFIQ */
    .org (VBAR + 0x180 + 0)
    b vector_serror                     /* Error/vError */

    /*  Exception from CurrentEL (EL1) with SP_ELn */
    .org (VBAR + 0x200 + 0)
    b vector_exception                  /* Synchronous */
    .org (VBAR + 0x280 + 0)
    b vector_irq                        /* IRQ/vIRQ */
    .org (VBAR + 0x300 + 0)
    b vector_fiq                        /* FIQ/vFIQ */
    .org (VBAR + 0x380 + 0)
    b vector_serror

    /* Exception from lower EL, aarch64 */
    .org (VBAR + 0x400 + 0)
    b vector_exception
    .org (VBAR + 0x480 + 0)
    b vector_irq
    .org (VBAR + 0x500 + 0)
    b vector_fiq
    .org (VBAR + 0x580 + 0)
    b vector_serror

    /* Exception from lower EL, aarch32 */
    .org (VBAR + 0x600 + 0)
    b vector_serror
    .org (VBAR + 0x680 + 0)
    b vector_serror
    .org (VBAR + 0x700 + 0)
    b vector_serror
    .org (VBAR + 0x780 + 0)
    b vector_serror

#include "include/vector_gcc.h"
#define EFRAMEX x19

START_POINT(vector_exception)
    SAVE_IRQ_CONTEXT
    mov     EFRAMEX, sp

    SAVE_USER_CTX EFRAMEX, x0

    mov     x0, EFRAMEX
    bl      rt_hw_trap_exception
    RESTORE_USER_CTX EFRAMEX, x0

    /* do exception switch for IRQ/exception handlers */
    EXCEPTION_SWITCH sp, x0

    RESTORE_IRQ_CONTEXT
    eret
START_POINT_END(vector_exception)

START_POINT(vector_serror)
    SAVE_IRQ_CONTEXT
    mov     EFRAMEX, sp

    SAVE_USER_CTX EFRAMEX, x0

    mov     x0, EFRAMEX
    bl      rt_hw_trap_serror

    RESTORE_USER_CTX EFRAMEX, x0

    NEVER_RETURN
START_POINT_END(vector_serror)

START_POINT(vector_irq)
    SAVE_IRQ_CONTEXT
    mov     EFRAMEX, sp

    /* trace IRQ level */
    bl      rt_interrupt_enter

    SAVE_USER_CTX EFRAMEX, x0

    /* handline IRQ */
    mov     x0, EFRAMEX
    bl      rt_hw_trap_irq

    RESTORE_USER_CTX EFRAMEX, x0

    /* restore IRQ level */
    bl      rt_interrupt_leave

    mov     x0, EFRAMEX
    bl      rt_hw_vector_irq_sched

    b       rt_hw_irq_exit
START_POINT_END(vector_irq)

rt_hw_irq_exit:
    .globl rt_hw_irq_exit

    /* do exception switch for IRQ/exception handlers */
    EXCEPTION_SWITCH sp, x0

    RESTORE_IRQ_CONTEXT
    eret