9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 4f99279eefda528df0ecafdd206d51e0f4478f5b
parent 05136086b8ab20eea80da672565a335c31a250fc
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sun, 27 Sep 2020 11:06:23 +0200

os9/arm64: Improve architecture functions

Change-Id: Id7f2997168c70d4eac0485093d54a3f818b75c3d

Diffstat:
Minclude/os9/os9.h | 7+++----
Msrc/os9/arch/arm64/arch.h | 4++--
Msrc/os9/arch/arm64/arch.s | 84++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Msrc/os9/arch/arm64/main.c | 4++--
Msrc/os9/panic.c | 2+-
5 files changed, 61 insertions(+), 40 deletions(-)

diff --git a/include/os9/os9.h b/include/os9/os9.h @@ -20,8 +20,8 @@ #define LINELEN 80 #define PAGESIZE 4096 -#define IENABLE 1 -#define IDISABLE 0 +#define ENABLE 1 +#define DISABLE 0 typedef struct context Context; typedef struct proc Proc; @@ -166,7 +166,7 @@ extern void dumpregs(Context *ctx, int fd); /* architectural functions */ extern Context *getcontext(Context *ctx); extern void *alloc(size_t size); -extern void intr(int mode); +extern void interrupt(int); extern uint8_t inm8(void *addr); extern uint16_t inm16(void *addr); extern uint32_t inm32(void *addr); @@ -185,7 +185,6 @@ extern Task *gettask(Proc *, int); extern void sched(void); /* globals */ -extern unsigned in_debug; extern jmp_buf dbgrecover; extern const char *const regnames[]; diff --git a/src/os9/arch/arm64/arch.h b/src/os9/arch/arm64/arch.h @@ -89,8 +89,8 @@ struct mach { }; extern void main(Mach *); -extern void syswr(enum sysreg, unsigned long long); -extern unsigned long long sysrd(enum sysreg); +extern void syswr(int, unsigned long long); +extern unsigned long long sysrd(int); extern void barrier(int); extern void invdcachesetway(void *); extern void invdcache(void); diff --git a/src/os9/arch/arm64/arch.s b/src/os9/arch/arm64/arch.s @@ -1,13 +1,8 @@ .FILE "arch.s" - .GLOBL panic,halt,intr,swtch,getcontext - .GLOBL barrier,vectbl,doswtch,inm8,inm16,inm32 - .GLOBL outm8,outm16,outm32 - .GLOBL invdcachesetway,invicache,vectbl,invtlb - .GLOBL inm8,inm16,inm32,outm8,outm16,outm32 - .TEXT -intr: + .GLOBL interrupt +interrupt: CBNZ X0,1f MSR DAIFSET,#15 RET @@ -15,6 +10,8 @@ intr: MSR DAIFCLR,#15 RET + .TEXT + .GLOBL barrier barrier: ADR X1,1f LSL X0,X0,#3 @@ -28,48 +25,70 @@ barrier: DSB SY RET + .TEXT + .GLOBL invtlb invtlb: TLBI VMALLE1IS RET + .TEXT + .GLOBL invdcachesetway invdcachesetway: DC ISW,X0 RET + .TEXT + .GLOBL invicache invicache: IC IALLU RET + .TEXT + .GLOBL inm8 inm8: LDRB W0,[X0] RET + .TEXT + .GLOBL inm16 inm16: LDRH W0,[X0] RET + .TEXT + .GLOBL inm32 inm32: LDR W0,[X0] RET + .TEXT + .GLOBL outm8 outm8: STRB W0,[X1] RET + .TEXT + .GLOBL outm16 outm16: STRH W0,[X1] RET + .TEXT + .GLOBL outm32 outm32: STR W0,[X1] RET + .TEXT + .GLOBL halt halt: MSR DAIFSET,#15 WFE B halt -getcontext: + .TEXT + .GLOBL getctx +getctx: STP X0,X1,[X0,#16*0] STP X2,X3,[X0,#16*1] STP X4,X5,[X0,#16*2] @@ -99,7 +118,8 @@ getcontext: RET -exception: + .TEXT +EXCEPTION: MSR SPSEL,#1 STP X0,X1,[SP,#-16*(17-0)] STP X2,X3,[SP,#-16*(17-1)] @@ -132,14 +152,15 @@ exception: MOV X0,SP MOV X29,#0 BL trap - ADR X0,outsync + ADR X0,OUTSYN B panic .DATA -outsync: +OUTSYN: .ASCIZ "out of sync" .TEXT + .GLOBL swtch swtch: LDP X9,X10,[X0,#16*17] MSR FAR_EL1,X10 @@ -171,42 +192,43 @@ swtch: ERET .ALIGN 11 + .GLOBL vectbl vectbl: - /* Current EL with SP0 */ - B exception /* Sync */ +// CURRENT EL WITH SP0 + B EXCEPTION // SYNc .ALIGN 7 - B exception /* IRQ/vIRQ */ + B EXCEPTION // IRQ .ALIGN 7 - B exception /* FIQ/vFIQ */ + B EXCEPTION // FIQ .ALIGN 7 - B exception /* SError/VSError */ + B EXCEPTION // SERROR - /* Current EL with SPx */ +// CURRENT EL WITH SPX .ALIGN 7 - B exception /* Sync */ + B EXCEPTION // SYNC .ALIGN 7 - B exception /* IRQ/vIRQ */ + B EXCEPTION // IRQ .ALIGN 7 - B exception /* FIQ/vFIQ */ + B EXCEPTION // FIQ .ALIGN 7 - B exception /* SError/VSError */ + B EXCEPTION // SERROR - /* Lower EL using AArch64 */ +// LOWER EL USING AARCH64 .ALIGN 7 - B exception /* Sync */ + B EXCEPTION // SYNC .ALIGN 7 - B exception /* IRQ/vIRQ */ + B EXCEPTION // IRQ .ALIGN 7 - B exception /* FIQ/vFIQ */ + B EXCEPTION // FIQ .ALIGN 7 - B exception /* SError/VSError */ + B EXCEPTION // SERROR - /* Lower EL using AArch32 */ +// LOWER EL USING AARCH32 .ALIGN 7 - B exception /* Sync */ + B EXCEPTION // SYNC .ALIGN 7 - B exception /* IRQ/vIRQ */ + B EXCEPTION // IRQ .ALIGN 7 - B exception /* FIQ/vFIQ */ + B EXCEPTION // FIQ .ALIGN 7 - B exception /* SError/VSError */ + B EXCEPTION // SERROR diff --git a/src/os9/arch/arm64/main.c b/src/os9/arch/arm64/main.c @@ -68,7 +68,7 @@ static void imach(Mach *m) { extern void *vectbl; - unsigned long long tcr, sctlr, ttbr; + uint64_t tcr, sctlr, ttbr; syswr(VBAR_EL1, (phyaddr_t) vectbl); barrier(ISB); @@ -161,7 +161,7 @@ main(Mach *m) imach(m); halt(); idev(); - intr(IENABLE); + interrupt(ENABLE); barrier(ISB); namespace(); info(); diff --git a/src/os9/panic.c b/src/os9/panic.c @@ -83,7 +83,7 @@ panic(const char *msg) if (first) { first = 0; - getcontext(&ctx); + getctx(&ctx); kprint(kerr, "panic: %s\n", msg); dumpregs(&ctx, kerr); backtrace(&ctx);