commit 8814a540561ad066ba6155aeaccae86900bac2a8
parent fffa152122240112565655f51547ef6c5a6c0a57
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri,  8 Mar 2024 14:26:06 +0900
wip
Diffstat:
4 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/ex3/main.c b/ex3/main.c
@@ -3,7 +3,7 @@ int puts(char *);
 void printh(void *);
 void set_alarm(unsigned int);
 
-extern void *proc0;
+extern void proc0_start, proc0_size;
 
 // A proc represents a process in execution.
 typedef struct proc {
@@ -31,6 +31,16 @@ main(void) {
 
 	proc *p0 = (proc *) 0x20041000, *p1 = (proc *) 0x20041100; // sram5
 
+	printh(&proc0_start);
+	puts("a");
+	printh(&proc0_size);
+	puts("b");
+
+	memcpy((void *)0x20000000, (void *)&proc0_start, (long) &proc0_size);
+	proc0();
+
+	puts("c");
+
 	p0->r[13] = (void *) 0x20000100; // sp
 	p0->r[14] = (void *) 0xdeadbeef; // lr
 	p0->r[15] = (void *) 0x20000000; // pc
diff --git a/ex3/memmap.ld b/ex3/memmap.ld
@@ -28,6 +28,8 @@ SECTIONS
 	.proc0 0x20000000 : {
 		*(.proc0)
 	} > SRAM AT > FLASH
+	proc0_start = LOADADDR(.proc0);
+	proc0_size = SIZEOF(.proc0);
 	.proc1 0x20000100 : {
 		*(.proc1)
 	} > SRAM AT > FLASH
diff --git a/ex3/proc.s b/ex3/proc.s
@@ -3,7 +3,7 @@
 proc0:
 	ldr r0, msg0
 	bl puts
-	b proc0
+	bx lr
 
 msg0:
 	.asciz "proc0"
diff --git a/ex3/start.s b/ex3/start.s
@@ -234,6 +234,22 @@ puts_end:
 	mov r0, #0 // return value
 	pop {r4, pc}
 
+	// void *memcpy(void *s1, void *s2, long n);
+	// Memcpy copies n bytes from memory area s2 to s1. It returns s1.
+	// TODO: Use ldr instead of ldrb.
+	.global memcpy
+memcpy:
+	push {r4, lr}
+	mov r4, #0
+memcpy_loop:
+	ldrb r3, [r1, r4]
+	strb r3, [r0, r4]
+	add r4, #1
+	cmp r4, r2
+	blt memcpy_loop
+	pop {r4, pc}
+
+
 putbyte:
 	ldr r3, uart0_base
 	mov r1, #1