commit 622086fcc5ceed2c72aab98a7af66d6a103f9ad3
parent d376a690e119fd335da9ce307531ccdb29cecb01
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 15 Mar 2024 11:42:37 +0900
try to understand ExceptionEntry and ExceptionExit
Diffstat:
3 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/ex3/main.c b/ex3/main.c
@@ -7,6 +7,7 @@ void halt(void);
 void *get_sp(void);
 void wfi(void);
 void *memcpy(void *s1, void *s2, long n);
+void setreg(void);
 
 extern char proc0_start, proc0_size;
 extern char proc1_start, proc1_size;
@@ -37,28 +38,22 @@ int
 main(void) {
 	init();
 	proc p0, p1;
-	puts("main");
-	puts("main2");
 
 	memcpy((void *)0x20000000, &proc0_start, (long) &proc0_size);
-	puts("main2.5");
 	memcpy((void *)0x20000100, &proc1_start, (long) &proc1_size);
-	puts("main3");
 
 	p0.r[13] = (void *) 0x20000100; // sp
 	p0.r[14] = (void *) main; // lr
 	p0.r[15] = (void *) 0x20000000; // pc
-	puts("main4");
 
 	p1.r[13] = (void *) 0x20000200; // sp
 	p1.r[14] = (void *) main; // lr
 	p1.r[15] = (void *) 0x20000100; // pc
-	puts("main5");
 
 	for (;;) {
+		setreg();
 		wfi();
 	}
-
 	return 0;
 }
 
@@ -88,6 +83,12 @@ isr_svcall(void) {
 
 void
 isr_alarm(void) {
+	int *sp = get_sp();
+	for (int i = 0; i < 12; i += 1) {
+		printh(sp+i);
+		printh(*(sp+i));
+		puts("");
+	}
 	scheduler();
 	set_alarm(1000 * 1000);
 }
diff --git a/ex3/proc.s b/ex3/proc.s
@@ -28,9 +28,9 @@ get_sp:
 	mov r0, sp
 	bx lr
 
-	// Set_reg sets registers for debugging.
+	// Setreg sets registers for debugging.
 	// Modified registers are:
-	// 	ReturnAddress(), LR, R12, R3, R2, R1 and R0.
+	//  LR, R12, R3, R2, R1 and R0.
 	.global setreg
 setreg:
 	push {lr}
diff --git a/ex3/start.s b/ex3/start.s
@@ -6,6 +6,7 @@
 	.global vectors
 vectors:
 	.word 0x20040000 // 0 initial SP
+	// "+1" is to indicate that the handlers are thumb functions.
 	.word reset+1  // 1 entry point
 	.word reset+1  // 2 NMI
 	.word isr_hard_fault+1  // 3 hard fault