Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Kernel Liteos M
提交
5ee18038
K
Kernel Liteos M
项目概览
OpenHarmony
/
Kernel Liteos M
大约 1 年 前同步成功
通知
20
Star
28
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos M
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5ee18038
编写于
1月 16, 2021
作者:
O
openharmony_ci
提交者:
Gitee
1月 16, 2021
浏览文件
操作
浏览文件
下载
差异文件
!16 支持riscv未对齐访问异常扩展
Merge pull request !16 from zhushengle/riscv
上级
0c14e12d
282f64c9
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
79 addition
and
51 deletion
+79
-51
kernel/arch/risc-v/los_arch_interrupt.h
kernel/arch/risc-v/los_arch_interrupt.h
+2
-0
kernel/arch/risc-v/los_exc.S
kernel/arch/risc-v/los_exc.S
+53
-46
kernel/arch/risc-v/los_interrupt.c
kernel/arch/risc-v/los_interrupt.c
+24
-5
未找到文件。
kernel/arch/risc-v/los_arch_interrupt.h
浏览文件 @
5ee18038
...
...
@@ -279,6 +279,8 @@ extern UINT32 g_intCount;
*/
#define OS_ERRNO_HWI_HWINUM_UNCREATE LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x0b)
extern
UINT32
HalUnalignedAccessFix
(
UINTPTR
mcause
,
UINTPTR
mepc
,
UINTPTR
mtval
,
VOID
*
sp
);
#ifdef __cplusplus
#if __cplusplus
}
...
...
kernel/arch/risc-v/los_exc.S
浏览文件 @
5ee18038
...
...
@@ -33,21 +33,8 @@
#define _LOS_EXC_S
#include "soc.h"
.
macro
PUSH_ECALL_CALLER_REG
addi
sp
,
sp
,
-
16
*
REGBYTES
SREG
a7
,
2
*
REGBYTES
(
sp
)
SREG
a6
,
3
*
REGBYTES
(
sp
)
SREG
a5
,
4
*
REGBYTES
(
sp
)
SREG
a4
,
5
*
REGBYTES
(
sp
)
SREG
a3
,
6
*
REGBYTES
(
sp
)
SREG
a2
,
7
*
REGBYTES
(
sp
)
SREG
a1
,
8
*
REGBYTES
(
sp
)
SREG
a0
,
9
*
REGBYTES
(
sp
)
SREG
ra
,
15
*
REGBYTES
(
sp
)
.
endm
.
macro
PUSH_OTHER_CALLER_REG
addi
sp
,
sp
,
-
16
*
REGBYTES
.
macro
PUSH_CALLER_REG
addi
sp
,
sp
,
-(
32
*
REGBYTES
)
SREG
t6
,
2
*
REGBYTES
(
sp
)
SREG
t5
,
3
*
REGBYTES
(
sp
)
SREG
t4
,
4
*
REGBYTES
(
sp
)
...
...
@@ -55,30 +42,50 @@
SREG
t2
,
6
*
REGBYTES
(
sp
)
SREG
t1
,
7
*
REGBYTES
(
sp
)
SREG
t0
,
8
*
REGBYTES
(
sp
)
SREG
a7
,
18
*
REGBYTES
(
sp
)
SREG
a6
,
19
*
REGBYTES
(
sp
)
SREG
a5
,
20
*
REGBYTES
(
sp
)
SREG
a4
,
21
*
REGBYTES
(
sp
)
SREG
a3
,
22
*
REGBYTES
(
sp
)
SREG
a2
,
23
*
REGBYTES
(
sp
)
SREG
a1
,
24
*
REGBYTES
(
sp
)
SREG
a0
,
25
*
REGBYTES
(
sp
)
SREG
ra
,
31
*
REGBYTES
(
sp
)
.
endm
.
macro
POP_CALLER_REG
LREG
t6
,
2
*
REGBYTES
(
sp
)
LREG
t5
,
3
*
REGBYTES
(
sp
)
LREG
t4
,
4
*
REGBYTES
(
sp
)
LREG
t3
,
5
*
REGBYTES
(
sp
)
LREG
t2
,
6
*
REGBYTES
(
sp
)
LREG
t1
,
7
*
REGBYTES
(
sp
)
LREG
t0
,
8
*
REGBYTES
(
sp
)
LREG
a7
,
18
*
REGBYTES
(
sp
)
LREG
a6
,
19
*
REGBYTES
(
sp
)
LREG
a5
,
20
*
REGBYTES
(
sp
)
LREG
a4
,
21
*
REGBYTES
(
sp
)
LREG
a3
,
22
*
REGBYTES
(
sp
)
LREG
a2
,
23
*
REGBYTES
(
sp
)
LREG
a1
,
24
*
REGBYTES
(
sp
)
LREG
a0
,
25
*
REGBYTES
(
sp
)
LREG
ra
,
31
*
REGBYTES
(
sp
)
addi
sp
,
sp
,
32
*
REGBYTES
.
endm
.
macro
PUSH_OTHER_REG
addi
sp
,
sp
,
-
16
*
REGBYTES
SREG
t6
,
2
*
REGBYTES
(
sp
)
SREG
t5
,
3
*
REGBYTES
(
sp
)
SREG
t4
,
4
*
REGBYTES
(
sp
)
SREG
t3
,
5
*
REGBYTES
(
sp
)
SREG
t2
,
6
*
REGBYTES
(
sp
)
SREG
t1
,
7
*
REGBYTES
(
sp
)
SREG
t0
,
8
*
REGBYTES
(
sp
)
SREG
s11
,
9
*
REGBYTES
(
sp
)
SREG
s10
,
10
*
REGBYTES
(
sp
)
SREG
s9
,
11
*
REGBYTES
(
sp
)
SREG
s8
,
12
*
REGBYTES
(
sp
)
SREG
s7
,
13
*
REGBYTES
(
sp
)
SREG
s6
,
14
*
REGBYTES
(
sp
)
SREG
s5
,
15
*
REGBYTES
(
sp
)
SREG
s4
,
26
*
REGBYTES
(
sp
)
SREG
s3
,
27
*
REGBYTES
(
sp
)
SREG
s2
,
28
*
REGBYTES
(
sp
)
SREG
s1
,
29
*
REGBYTES
(
sp
)
SREG
s0
,
30
*
REGBYTES
(
sp
)
.
macro
PUSH_CALLEE_REG
SREG
s11
,
9
*
REGBYTES
(
sp
)
SREG
s10
,
10
*
REGBYTES
(
sp
)
SREG
s9
,
11
*
REGBYTES
(
sp
)
SREG
s8
,
12
*
REGBYTES
(
sp
)
SREG
s7
,
13
*
REGBYTES
(
sp
)
SREG
s6
,
14
*
REGBYTES
(
sp
)
SREG
s5
,
15
*
REGBYTES
(
sp
)
SREG
s4
,
26
*
REGBYTES
(
sp
)
SREG
s3
,
27
*
REGBYTES
(
sp
)
SREG
s2
,
28
*
REGBYTES
(
sp
)
SREG
s1
,
29
*
REGBYTES
(
sp
)
SREG
s0
,
30
*
REGBYTES
(
sp
)
.
endm
.
macro
POP_ALL_REG
...
...
@@ -119,20 +126,21 @@
.
global
HalTrapEntry
.
align
4
HalTrapEntry
:
PUSH_OTHER_REG
addi
sp
,
sp
,
-
4
*
REGBYTES
PUSH_CALLEE_REG
csrr
t0
,
mstatus
sw
t0
,
16
*
REGBYTES
(
sp
)
csrr
t0
,
mepc
sw
t0
,
17
*
REGBYTES
(
sp
)
sw
tp
,
1
*
REGBYTES
(
sp
)
sw
sp
,
0
*
REGBYTES
(
sp
)
addi
sp
,
sp
,
-(
4
*
REGBYTES
)
csrr
a0
,
mcause
sw
a0
,
0
*
REGBYTES
(
sp
)
csrr
t0
,
mtval
sw
t0
,
1
*
REGBYTES
(
sp
)
csrr
t0
,
medeleg
sw
t0
,
2
*
REGBYTES
(
sp
)
sw
gp
,
3
*
REGBYTES
(
sp
)
sw
sp
,
4
*
REGBYTES
(
sp
)
sw
tp
,
5
*
REGBYTES
(
sp
)
csrr
t0
,
mstatus
sw
t0
,
20
*
REGBYTES
(
sp
)
csrr
t0
,
mepc
sw
t0
,
21
*
REGBYTES
(
sp
)
mv
a0
,
sp
csrw
mscratch
,
sp
la
t0
,
g_excInfo
...
...
@@ -161,14 +169,13 @@ HalTrapEntry:
.
equ
TRAP_INTERRUPT_MODE_MASK
,
0x80000000
.
align
4
HalTrapVector
:
PUSH_
ECALL_
CALLER_REG
PUSH_CALLER_REG
csrr
a0
,
mcause
li
a1
,
TRAP_INTERRUPT_MODE_MASK
li
a2
,
MCAUSE_INT_ID_MASK
and
a1
,
a0
,
a1
and
a0
,
a2
,
a0
beqz
a1
,
HalTrapEntry
PUSH_OTHER_CALLER_REG
csrw
mscratch
,
sp
la
sp
,
__start_and_irq_stack_top
jal
HalHwiInterruptDone
...
...
kernel/arch/risc-v/los_interrupt.c
浏览文件 @
5ee18038
...
...
@@ -48,6 +48,8 @@ static ExcInfoArray g_excArray[OS_EXC_TYPE_MAX];
LosExcInfo
g_excInfo
;
#define RISCV_EXC_TYPE_NUM 16
#define RISCV_EXC_LOAD_MISALIGNED 4
#define RISCV_EXC_STORE_MISALIGNED 6
const
CHAR
g_excInformation
[
RISCV_EXC_TYPE_NUM
][
50
]
=
{
{
"Instruction address misaligned!"
},
{
"Instruction access fault!"
},
...
...
@@ -332,13 +334,10 @@ STATIC VOID ExcInfoDisplayContext(const LosExcInfo *exc)
STATIC
VOID
ExcInfoDisplay
(
const
LosExcContext
*
excBufAddr
)
{
g_excInfo
.
type
=
excBufAddr
->
mcause
;
g_excInfo
.
context
=
(
LosExcContext
*
)
excBufAddr
;
PRINTK
(
"
\r\n
Exception Information
\n\r
"
);
if
(
excBufAddr
->
mcaus
e
<
RISCV_EXC_TYPE_NUM
)
{
PRINTK
(
"Exc type : Oops - %s
\n\r
"
,
g_excInformation
[
excBufAddr
->
mcaus
e
]);
if
(
g_excInfo
.
typ
e
<
RISCV_EXC_TYPE_NUM
)
{
PRINTK
(
"Exc type : Oops - %s
\n\r
"
,
g_excInformation
[
g_excInfo
.
typ
e
]);
}
else
{
PRINTK
(
"Exc type : Oops - Invalid
\n\r
"
);
}
...
...
@@ -349,13 +348,33 @@ STATIC VOID ExcInfoDisplay(const LosExcContext *excBufAddr)
ExcInfoDisplayContext
(
&
g_excInfo
);
}
WEAK
UINT32
HalUnalignedAccessFix
(
UINTPTR
mcause
,
UINTPTR
mepc
,
UINTPTR
mtval
,
VOID
*
sp
)
{
/* Unaligned acess fixes are not supported by default */
PRINTK
(
"Unaligned acess fixes are not support by default!
\n\r
"
);
return
LOS_NOK
;
}
VOID
HalExcEntry
(
const
LosExcContext
*
excBufAddr
)
{
UINT32
ret
;
g_excInfo
.
type
=
excBufAddr
->
mcause
&
0x1FF
;
g_excInfo
.
context
=
(
LosExcContext
*
)
excBufAddr
;
if
(
g_excInfo
.
nestCnt
>
2
)
{
PRINTK
(
"hard faule!
\n\r
"
);
goto
SYSTEM_DEATH
;
}
if
((
g_excInfo
.
type
==
RISCV_EXC_LOAD_MISALIGNED
)
||
(
g_excInfo
.
type
==
RISCV_EXC_STORE_MISALIGNED
))
{
ret
=
HalUnalignedAccessFix
(
excBufAddr
->
mcause
,
excBufAddr
->
taskContext
.
mepc
,
excBufAddr
->
mtval
,
(
VOID
*
)
excBufAddr
);
if
(
!
ret
)
{
return
;
}
}
ExcInfoDisplay
(
excBufAddr
);
PRINTK
(
"----------------All Task infomation ------------
\n\r
"
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录