369 lines
5.1 KiB
ArmAsm
369 lines
5.1 KiB
ArmAsm
.global loadGDT
|
|
//void _stdcall loadGDT(struct gdtp* ptr);
|
|
loadGDT:
|
|
mov 0x4(%esp), %eax // Load argument
|
|
lgdt (%eax)
|
|
//GDT is loaded now
|
|
mov $0x10, %ax
|
|
mov %ax, %ds
|
|
mov %ax, %es
|
|
mov %ax, %fs
|
|
mov %ax, %gs
|
|
mov %ax, %ss
|
|
ljmp $0x8, $.1
|
|
.1:
|
|
ret
|
|
.global loadIDT
|
|
//void _stdcall loadIDT(struct idtp* ptr);
|
|
loadIDT:
|
|
mov 0x4(%esp), %eax
|
|
lidt (%eax)
|
|
ret
|
|
.global enterPaging
|
|
//void _stdcall enterPaging(uint32** pd);
|
|
enterPaging:
|
|
mov 0x4(%esp), %eax
|
|
mov %eax, %cr3
|
|
mov %cr4, %eax
|
|
or $0x10, %eax
|
|
mov %eax, %cr4
|
|
mov %cr0, %eax
|
|
or $0x80000000, %eax
|
|
mov %eax, %cr0
|
|
mov (%esp), %eax
|
|
ret
|
|
|
|
//Handle interrupts
|
|
.macro intr_stub nr
|
|
.global intr_stub_\nr
|
|
.align 16
|
|
intr_stub_\nr:
|
|
pushl $0
|
|
pushl $\nr
|
|
jmp intr_common_handler
|
|
.endm
|
|
.macro intr_stub_error_code nr
|
|
.global intr_stub_\nr
|
|
.align 16
|
|
intr_stub_\nr:
|
|
pushl $\nr
|
|
jmp intr_common_handler
|
|
.endm
|
|
intr_stub 0
|
|
intr_stub 1
|
|
intr_stub 2
|
|
intr_stub 3
|
|
intr_stub 4
|
|
intr_stub 5
|
|
intr_stub 6
|
|
intr_stub 7
|
|
intr_stub_error_code 8
|
|
intr_stub 9
|
|
intr_stub_error_code 10
|
|
intr_stub_error_code 11
|
|
intr_stub_error_code 12
|
|
intr_stub_error_code 13
|
|
intr_stub_error_code 14
|
|
intr_stub 15
|
|
intr_stub 16
|
|
intr_stub_error_code 17
|
|
intr_stub 18
|
|
intr_stub 19
|
|
intr_stub 20
|
|
intr_stub 21
|
|
intr_stub 22
|
|
intr_stub 23
|
|
intr_stub 24
|
|
intr_stub 25
|
|
intr_stub 26
|
|
intr_stub 27
|
|
intr_stub 28
|
|
intr_stub 29
|
|
intr_stub 30
|
|
intr_stub 31
|
|
intr_stub 32
|
|
intr_stub 33
|
|
intr_stub 34
|
|
intr_stub 35
|
|
intr_stub 36
|
|
intr_stub 37
|
|
intr_stub 38
|
|
intr_stub 39
|
|
intr_stub 40
|
|
intr_stub 41
|
|
intr_stub 42
|
|
intr_stub 43
|
|
intr_stub 44
|
|
intr_stub 45
|
|
intr_stub 46
|
|
intr_stub 47
|
|
intr_stub 48
|
|
intr_stub 49
|
|
intr_stub 50
|
|
intr_stub 51
|
|
intr_stub 52
|
|
intr_stub 53
|
|
intr_stub 54
|
|
intr_stub 55
|
|
intr_stub 56
|
|
intr_stub 57
|
|
intr_stub 58
|
|
intr_stub 59
|
|
intr_stub 60
|
|
intr_stub 61
|
|
intr_stub 62
|
|
intr_stub 63
|
|
intr_stub 64
|
|
intr_stub 65
|
|
intr_stub 66
|
|
intr_stub 67
|
|
intr_stub 68
|
|
intr_stub 69
|
|
intr_stub 70
|
|
intr_stub 71
|
|
intr_stub 72
|
|
intr_stub 73
|
|
intr_stub 74
|
|
intr_stub 75
|
|
intr_stub 76
|
|
intr_stub 77
|
|
intr_stub 78
|
|
intr_stub 79
|
|
intr_stub 80
|
|
intr_stub 81
|
|
intr_stub 82
|
|
intr_stub 83
|
|
intr_stub 84
|
|
intr_stub 85
|
|
intr_stub 86
|
|
intr_stub 87
|
|
intr_stub 88
|
|
intr_stub 89
|
|
intr_stub 90
|
|
intr_stub 91
|
|
intr_stub 92
|
|
intr_stub 93
|
|
intr_stub 94
|
|
intr_stub 95
|
|
intr_stub 96
|
|
intr_stub 97
|
|
intr_stub 98
|
|
intr_stub 99
|
|
intr_stub 100
|
|
intr_stub 101
|
|
intr_stub 102
|
|
intr_stub 103
|
|
intr_stub 104
|
|
intr_stub 105
|
|
intr_stub 106
|
|
intr_stub 107
|
|
intr_stub 108
|
|
intr_stub 109
|
|
intr_stub 110
|
|
intr_stub 111
|
|
intr_stub 112
|
|
intr_stub 113
|
|
intr_stub 114
|
|
intr_stub 115
|
|
intr_stub 116
|
|
intr_stub 117
|
|
intr_stub 118
|
|
intr_stub 119
|
|
intr_stub 120
|
|
intr_stub 121
|
|
intr_stub 122
|
|
intr_stub 123
|
|
intr_stub 124
|
|
intr_stub 125
|
|
intr_stub 126
|
|
intr_stub 127
|
|
intr_stub 128
|
|
intr_stub 129
|
|
intr_stub 130
|
|
intr_stub 131
|
|
intr_stub 132
|
|
intr_stub 133
|
|
intr_stub 134
|
|
intr_stub 135
|
|
intr_stub 136
|
|
intr_stub 137
|
|
intr_stub 138
|
|
intr_stub 139
|
|
intr_stub 140
|
|
intr_stub 141
|
|
intr_stub 142
|
|
intr_stub 143
|
|
intr_stub 144
|
|
intr_stub 145
|
|
intr_stub 146
|
|
intr_stub 147
|
|
intr_stub 148
|
|
intr_stub 149
|
|
intr_stub 150
|
|
intr_stub 151
|
|
intr_stub 152
|
|
intr_stub 153
|
|
intr_stub 154
|
|
intr_stub 155
|
|
intr_stub 156
|
|
intr_stub 157
|
|
intr_stub 158
|
|
intr_stub 159
|
|
intr_stub 160
|
|
intr_stub 161
|
|
intr_stub 162
|
|
intr_stub 163
|
|
intr_stub 164
|
|
intr_stub 165
|
|
intr_stub 166
|
|
intr_stub 167
|
|
intr_stub 168
|
|
intr_stub 169
|
|
intr_stub 170
|
|
intr_stub 171
|
|
intr_stub 172
|
|
intr_stub 173
|
|
intr_stub 174
|
|
intr_stub 175
|
|
intr_stub 176
|
|
intr_stub 177
|
|
intr_stub 178
|
|
intr_stub 179
|
|
intr_stub 180
|
|
intr_stub 181
|
|
intr_stub 182
|
|
intr_stub 183
|
|
intr_stub 184
|
|
intr_stub 185
|
|
intr_stub 186
|
|
intr_stub 187
|
|
intr_stub 188
|
|
intr_stub 189
|
|
intr_stub 190
|
|
intr_stub 191
|
|
intr_stub 192
|
|
intr_stub 193
|
|
intr_stub 194
|
|
intr_stub 195
|
|
intr_stub 196
|
|
intr_stub 197
|
|
intr_stub 198
|
|
intr_stub 199
|
|
intr_stub 200
|
|
intr_stub 201
|
|
intr_stub 202
|
|
intr_stub 203
|
|
intr_stub 204
|
|
intr_stub 205
|
|
intr_stub 206
|
|
intr_stub 207
|
|
intr_stub 208
|
|
intr_stub 209
|
|
intr_stub 210
|
|
intr_stub 211
|
|
intr_stub 212
|
|
intr_stub 213
|
|
intr_stub 214
|
|
intr_stub 215
|
|
intr_stub 216
|
|
intr_stub 217
|
|
intr_stub 218
|
|
intr_stub 219
|
|
intr_stub 220
|
|
intr_stub 221
|
|
intr_stub 222
|
|
intr_stub 223
|
|
intr_stub 224
|
|
intr_stub 225
|
|
intr_stub 226
|
|
intr_stub 227
|
|
intr_stub 228
|
|
intr_stub 229
|
|
intr_stub 230
|
|
intr_stub 231
|
|
intr_stub 232
|
|
intr_stub 233
|
|
intr_stub 234
|
|
intr_stub 235
|
|
intr_stub 236
|
|
intr_stub 237
|
|
intr_stub 238
|
|
intr_stub 239
|
|
intr_stub 240
|
|
intr_stub 241
|
|
intr_stub 242
|
|
intr_stub 243
|
|
intr_stub 244
|
|
intr_stub 245
|
|
intr_stub 246
|
|
intr_stub 247
|
|
intr_stub 248
|
|
intr_stub 249
|
|
intr_stub 250
|
|
intr_stub 251
|
|
intr_stub 252
|
|
intr_stub 253
|
|
intr_stub 254
|
|
intr_stub 255
|
|
|
|
//This should cover everything.
|
|
.extern handleINT
|
|
intr_common_handler:
|
|
cli
|
|
push %ebp
|
|
push %edi
|
|
push %esi
|
|
push %edx
|
|
push %ecx
|
|
push %ebx
|
|
push %eax
|
|
//Load kernel datasegs
|
|
mov $0x10, %ax
|
|
mov %ax, %ds
|
|
mov %ax, %es
|
|
mov $8, %ecx
|
|
mov $fld_hi, %ebx
|
|
mov $fld_lo, %edx
|
|
.storeloop:
|
|
fstpl (%edx)
|
|
mov (%edx), %eax
|
|
push %eax
|
|
mov (%ebx), %eax
|
|
push %eax
|
|
loop .storeloop
|
|
|
|
push %esp
|
|
call handleINT
|
|
mov %eax, %esp
|
|
mov $8, %ecx
|
|
mov $fld_hi, %ebx
|
|
mov $fld_lo, %edx
|
|
.loadloop:
|
|
pop %eax
|
|
mov %eax, (%ebx)
|
|
pop %eax
|
|
mov %eax, (%edx)
|
|
fldl (%ebx)
|
|
loop .loadloop
|
|
|
|
//Load user datasegs
|
|
mov $0x23, %ax
|
|
mov %ax, %ds
|
|
mov %ax, %es
|
|
pop %eax
|
|
pop %ebx
|
|
pop %ecx
|
|
pop %edx
|
|
pop %esi
|
|
pop %edi
|
|
pop %ebp
|
|
// Take error code and interrupt number from stack
|
|
add $8, %esp
|
|
// Exit interrupt
|
|
iret
|
|
|
|
.section .data
|
|
fld_lo:
|
|
.space 4
|
|
fld_hi:
|
|
.space 4
|