397 lines
3.8 KiB
ArmAsm
397 lines
3.8 KiB
ArmAsm
.macro push_userspace
|
|
pushw %gs
|
|
pushw %fs
|
|
pushw %es
|
|
pushw %ds
|
|
pushal
|
|
.endm
|
|
|
|
.macro load_kernel_segments
|
|
movw $0x10, %ax
|
|
movw %ax, %ds
|
|
movw %ax, %es
|
|
movw %ax, %fs
|
|
|
|
movw $0x28, %ax
|
|
movw %ax, %gs
|
|
.endm
|
|
|
|
.macro pop_userspace
|
|
popal
|
|
popw %ds
|
|
popw %es
|
|
popw %fs
|
|
popw %gs
|
|
.endm
|
|
|
|
isr_stub:
|
|
push_userspace
|
|
load_kernel_segments
|
|
|
|
movl %cr0, %eax; pushl %eax
|
|
movl %cr2, %eax; pushl %eax
|
|
movl %cr3, %eax; pushl %eax
|
|
movl %cr4, %eax; pushl %eax
|
|
|
|
movl %esp, %eax // register ptr
|
|
leal 64(%esp), %ebx // interrupt stack ptr
|
|
movl 60(%esp), %ecx // error code
|
|
movl 56(%esp), %edx // isr number
|
|
|
|
movl %esp, %ebp
|
|
subl $15, %esp
|
|
andl $0xFFFFFFF0, %esp
|
|
|
|
pushl %eax
|
|
pushl %ebx
|
|
pushl %ecx
|
|
pushl %edx
|
|
call cpp_isr_handler
|
|
|
|
movl %ebp, %esp
|
|
addl $16, %esp
|
|
|
|
pop_userspace
|
|
addl $8, %esp
|
|
iret
|
|
|
|
irq_stub:
|
|
push_userspace
|
|
load_kernel_segments
|
|
|
|
movl 40(%esp), %eax # interrupt number
|
|
|
|
movl %esp, %ebp
|
|
subl $15, %esp
|
|
andl $0xFFFFFFF0, %esp
|
|
|
|
subl $12, %esp
|
|
pushl %eax
|
|
call cpp_irq_handler
|
|
|
|
movl %ebp, %esp
|
|
|
|
pop_userspace
|
|
addl $8, %esp
|
|
iret
|
|
|
|
.global asm_yield_handler
|
|
asm_yield_handler:
|
|
# This can only be called from kernel, so no segment saving is needed
|
|
pushal
|
|
|
|
movl %esp, %eax # interrupt registers ptr
|
|
leal 32(%esp), %ebx # interrupt stack ptr
|
|
|
|
movl %esp, %ebp
|
|
subl $15, %esp
|
|
andl $0xFFFFFFF0, %esp
|
|
|
|
subl $8, %esp
|
|
pushl %eax
|
|
pushl %ebx
|
|
call cpp_yield_handler
|
|
|
|
movl %ebp, %esp
|
|
|
|
popal
|
|
iret
|
|
|
|
.global asm_ipi_handler
|
|
asm_ipi_handler:
|
|
push_userspace
|
|
load_kernel_segments
|
|
|
|
movl %esp, %ebp
|
|
subl $15, %esp
|
|
andl $0xFFFFFFF0, %esp
|
|
|
|
call cpp_ipi_handler
|
|
|
|
movl %ebp, %esp
|
|
|
|
pop_userspace
|
|
iret
|
|
|
|
|
|
.global asm_timer_handler
|
|
asm_timer_handler:
|
|
push_userspace
|
|
load_kernel_segments
|
|
|
|
movl %esp, %ebp
|
|
subl $15, %esp
|
|
andl $0xFFFFFFF0, %esp
|
|
|
|
call cpp_timer_handler
|
|
|
|
movl %ebp, %esp
|
|
|
|
pop_userspace
|
|
iret
|
|
|
|
.macro isr n
|
|
.global isr\n
|
|
isr\n:
|
|
pushl $0
|
|
pushl $\n
|
|
jmp isr_stub
|
|
.endm
|
|
|
|
.macro isr_err n
|
|
.global isr\n
|
|
isr\n:
|
|
pushl $\n
|
|
jmp isr_stub
|
|
.endm
|
|
|
|
.macro irq n
|
|
.global irq\n
|
|
irq\n:
|
|
pushl $0
|
|
pushl $\n
|
|
jmp irq_stub
|
|
.endm
|
|
|
|
isr 0
|
|
isr 1
|
|
isr 2
|
|
isr 3
|
|
isr 4
|
|
isr 5
|
|
isr 6
|
|
isr 7
|
|
isr_err 8
|
|
isr 9
|
|
isr_err 10
|
|
isr_err 11
|
|
isr_err 12
|
|
isr_err 13
|
|
isr_err 14
|
|
isr 15
|
|
isr 16
|
|
isr_err 17
|
|
isr 18
|
|
isr 19
|
|
isr 20
|
|
isr 21
|
|
isr 22
|
|
isr 23
|
|
isr 24
|
|
isr 25
|
|
isr 26
|
|
isr 27
|
|
isr 28
|
|
isr 29
|
|
isr 30
|
|
isr 31
|
|
|
|
irq 0
|
|
irq 1
|
|
irq 2
|
|
irq 3
|
|
irq 4
|
|
irq 5
|
|
irq 6
|
|
irq 7
|
|
irq 8
|
|
irq 9
|
|
irq 10
|
|
irq 11
|
|
irq 12
|
|
irq 13
|
|
irq 14
|
|
irq 15
|
|
irq 16
|
|
irq 17
|
|
irq 18
|
|
irq 19
|
|
irq 20
|
|
irq 21
|
|
irq 22
|
|
irq 23
|
|
irq 24
|
|
irq 25
|
|
irq 26
|
|
irq 27
|
|
irq 28
|
|
irq 29
|
|
irq 30
|
|
irq 31
|
|
irq 32
|
|
irq 33
|
|
irq 34
|
|
irq 35
|
|
irq 36
|
|
irq 37
|
|
irq 38
|
|
irq 39
|
|
irq 40
|
|
irq 41
|
|
irq 42
|
|
irq 43
|
|
irq 44
|
|
irq 45
|
|
irq 46
|
|
irq 47
|
|
irq 48
|
|
irq 49
|
|
irq 50
|
|
irq 51
|
|
irq 52
|
|
irq 53
|
|
irq 54
|
|
irq 55
|
|
irq 56
|
|
irq 57
|
|
irq 58
|
|
irq 59
|
|
irq 60
|
|
irq 61
|
|
irq 62
|
|
irq 63
|
|
irq 64
|
|
irq 65
|
|
irq 66
|
|
irq 67
|
|
irq 68
|
|
irq 69
|
|
irq 70
|
|
irq 71
|
|
irq 72
|
|
irq 73
|
|
irq 74
|
|
irq 75
|
|
irq 76
|
|
irq 77
|
|
irq 78
|
|
irq 79
|
|
irq 80
|
|
irq 81
|
|
irq 82
|
|
irq 83
|
|
irq 84
|
|
irq 85
|
|
irq 86
|
|
irq 87
|
|
irq 88
|
|
irq 89
|
|
irq 90
|
|
irq 91
|
|
irq 92
|
|
irq 93
|
|
irq 94
|
|
irq 95
|
|
irq 96
|
|
irq 97
|
|
irq 98
|
|
irq 99
|
|
irq 100
|
|
irq 101
|
|
irq 102
|
|
irq 103
|
|
irq 104
|
|
irq 105
|
|
irq 106
|
|
irq 107
|
|
irq 108
|
|
irq 109
|
|
irq 110
|
|
irq 111
|
|
irq 112
|
|
irq 113
|
|
irq 114
|
|
irq 115
|
|
irq 116
|
|
irq 117
|
|
irq 118
|
|
irq 119
|
|
irq 120
|
|
irq 121
|
|
irq 122
|
|
irq 123
|
|
irq 124
|
|
irq 125
|
|
irq 126
|
|
irq 127
|
|
irq 128
|
|
irq 129
|
|
irq 130
|
|
irq 131
|
|
irq 132
|
|
irq 133
|
|
irq 134
|
|
irq 135
|
|
irq 136
|
|
irq 137
|
|
irq 138
|
|
irq 139
|
|
irq 140
|
|
irq 141
|
|
irq 142
|
|
irq 143
|
|
irq 144
|
|
irq 145
|
|
irq 146
|
|
irq 147
|
|
irq 148
|
|
irq 149
|
|
irq 150
|
|
irq 151
|
|
irq 152
|
|
irq 153
|
|
irq 154
|
|
irq 155
|
|
irq 156
|
|
irq 157
|
|
irq 158
|
|
irq 159
|
|
irq 160
|
|
irq 161
|
|
irq 162
|
|
irq 163
|
|
irq 164
|
|
irq 165
|
|
irq 166
|
|
irq 167
|
|
irq 168
|
|
irq 169
|
|
irq 170
|
|
irq 171
|
|
irq 172
|
|
irq 173
|
|
irq 174
|
|
irq 175
|
|
irq 176
|
|
irq 177
|
|
irq 178
|
|
irq 179
|
|
irq 180
|
|
irq 181
|
|
irq 182
|
|
irq 183
|
|
irq 184
|
|
irq 185
|
|
irq 186
|
|
irq 187
|
|
irq 188
|
|
irq 189
|
|
irq 190
|
|
irq 191
|
|
irq 192
|
|
irq 193
|
|
irq 194
|
|
irq 195
|
|
irq 196
|
|
irq 197
|
|
irq 198
|
|
irq 199
|
|
irq 200
|
|
irq 201
|
|
irq 202
|
|
irq 203
|
|
irq 204
|
|
irq 205
|
|
irq 206
|
|
irq 207
|