-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSTUMPOS.s
More file actions
130 lines (96 loc) · 3.56 KB
/
STUMPOS.s
File metadata and controls
130 lines (96 loc) · 3.56 KB
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
#include "macro_def.c"
; ====================================================
; STUMP OS – DEMO ENVIRONMENT FOR COMP22111 STUMP
; ====================================================
ORG &0000
bal boot
sys_call_function defw sys_call
sys_table_pointer defw SYSCALL_TABLE
return defw return_func
kernel_pcb_pointer defw kernel_pcb
kernel_stack_pointer defw kernel_stack_base
peripheral_table_pointer DEFW PERIPHERAL_TABLE
util_table_pointer DEFW util_table
pcb_head defw 0x0
kernel_statistics_table_ptr DEFW kernel_statistics_table
stack_size defw 0x50
current_pcb DEFW 0x0 ; this is the address of the pcb that is curerntly running
HEAP_START_POINTER DEFW HEAP_START
HEAP_END_POINTER DEFW HEAP_END
program_table_ptr_main DEFW program_table
org 0xE
panic:
J_SYS_CALL(panic_func)
; NOTE: The very first sys_call should be sys_enter otherwise the context switching
; will have undefined behaviour
; ---------------------------
; boot / reset initialization
; ---------------------------
boot:
; -----------------------
; 1) zero PCB bookkeeping
; -----------------------
st r0, [ r0, #pcb_head ] ; pcb_head = 0
st r0, [ r0, #current_pcb ] ; current_pcb = 0
; -----------------------
; 2) init heap pointers & header
; -----------------------
ld r2, [ r0, #HEAP_START_POINTER ] ; r2 = HEAP_START (address)
ld r3, [ r0, #HEAP_END_POINTER ] ; r3 = HEAP_END (address)
sub r1, r3, r2
sub r1, r1, #block_header_struct_size ; r1 = payload size available (u16)
; store size in header: [r2 + 0] = r1
st r1, [ r2, #block_header_size_offset ]
; store is_free = 1 : [r2 + 1] = 1
mov r4, #1
st r4, [ r2, #block_header_is_free_offset ]
; store owner
st r0, [ r2, #block_header_owner_offset ]
; -----------------------
; 3) init kernel PCB & kernel stack
; -----------------------
; kernel_pcb layout: offset 0 = kernel_stack_top, offset 1 = is_sys_state (based on uses)
; set kernel_stack_top = kernel_stack_end, clear is_sys_state (0)
ld r5, [ r0, #kernel_stack_pointer ] ; r5 = kernel_stack_end (symbol word)
ld r4, [ r0, #kernel_pcb_pointer ]
st r5, [ r4, r0 ] ; kernel_pcb->r6 = kernel_stack_top
mov r6, #0
st r6, [ r4, #1 ] ; kernel_pcb->is_sys_state = 0
; set runtime r6 (SP) to kernel stack top so kernel runs with proper stack
mov r6, r5 ; set r6 = kernel_stack_end
; -----------------------
; 4) clear peripherals / visual reset
; -----------------------
; call clearLCD and clearLED to make a predictable starting screen
add r5, r7, #6
PUSH(r5)
ld r5, [ r0, #sys_table_pointer ]
add r5, r5, #15
add r5, r5, #15
ld r7, [ r5, #reset_peripherals_func]
; -----------------------
; 5) clear kernel statistics
; -----------------------
ld r1, [r0, #kernel_statistics_table_ptr]
st r0, [r1, #pcb_count_offset]
st r0, [r1, #syscall_count_offset]
st r0, [r1, #memory_allocated_words_offset]
st r0, [r1, #system_ticks_offset]
; sys_enter
ld r1, boot_proc
add r4, r0, #enter_func
SYSCALL()
boot_proc defw boot_user
return_func:
POP(r7)
#include "./User/user_program_table.s"
#include "./util/util.s"
#include "./Scheduler/PCB_controller.s"
#include "./kernel_data.s"
#include "./kernel_statistics.s"
#include "./Scheduler/context_switch.s"
#include "./Scheduler/yield.s"
#include "./Syscalls/panic.s"
#include "./Heap/heap_alloc.s"
#include "./Peripherals/peripherals.s"
#include "./Heap/heap.s"