wip: bare bones for C in kernel
This commit is contained in:
@@ -1,74 +0,0 @@
|
||||
@frozen
|
||||
public struct ExceptionContext {
|
||||
public var x0: UInt64
|
||||
public var x1: UInt64
|
||||
public var x2: UInt64
|
||||
public var x3: UInt64
|
||||
public var x4: UInt64
|
||||
public var x5: UInt64
|
||||
public var x6: UInt64
|
||||
public var x7: UInt64
|
||||
public var x8: UInt64
|
||||
public var x9: UInt64
|
||||
public var x10: UInt64
|
||||
public var x11: UInt64
|
||||
public var x12: UInt64
|
||||
public var x13: UInt64
|
||||
public var x14: UInt64
|
||||
public var x15: UInt64
|
||||
public var x16: UInt64
|
||||
public var x17: UInt64
|
||||
public var x18: UInt64
|
||||
public var x19: UInt64
|
||||
public var x20: UInt64
|
||||
public var x21: UInt64
|
||||
public var x22: UInt64
|
||||
public var x23: UInt64
|
||||
public var x24: UInt64
|
||||
public var x25: UInt64
|
||||
public var x26: UInt64
|
||||
public var x27: UInt64
|
||||
public var x28: UInt64
|
||||
public var x29: UInt64 // fp
|
||||
public var x30: UInt64 // lr
|
||||
public var elr_el1: UInt64 // pc
|
||||
public var spsr_el1: UInt64 // cpu status
|
||||
public var esr_el1: UInt64 // error reason
|
||||
}
|
||||
|
||||
@frozen
|
||||
public enum ExceptionType: UInt64 {
|
||||
// curr el with sp0 (EL1t)
|
||||
// usually dont happen cuz we switch to sp_el1, but just in case
|
||||
case syncEL1t = 0
|
||||
case irqEL1t = 1
|
||||
case fiqEL1t = 2
|
||||
case seErrorEL1t = 3
|
||||
|
||||
// curr el with sp1 (EL1h)
|
||||
// exception in kernel space
|
||||
case syncEL1h = 4
|
||||
case irqEL1h = 5
|
||||
case fiqEL1h = 6
|
||||
case seErrorEL1h = 7
|
||||
|
||||
// lower EL 64-bit from userspace
|
||||
case syncEL0_64 = 8
|
||||
case irqEL0_64 = 9
|
||||
case fiqEL0_64 = 10
|
||||
case seErrorEL0_64 = 11
|
||||
|
||||
// lower EL 32-bit from userspace
|
||||
case syncEL0_32 = 12
|
||||
case irqEL0_32 = 13
|
||||
case fiqEL0_32 = 14
|
||||
case seErrorEL0_32 = 15
|
||||
}
|
||||
|
||||
@_cdecl("swift_trap_handler")
|
||||
public func trapHandler(context: UnsafeMutableRawPointer, rawType: UInt64) {
|
||||
let context = context.assumingMemoryBound(to: ExceptionContext.self)
|
||||
let type = ExceptionType(rawValue: rawType)!
|
||||
|
||||
panic(context: context.pointee)
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
struct FDTHeader {
|
||||
let magic: UInt32 // 0xd00dfeed
|
||||
let totalsize: UInt32
|
||||
let off_dt_struct: UInt32
|
||||
let off_dt_strings: UInt32
|
||||
let off_mem_rsvmap: UInt32
|
||||
let version: UInt32
|
||||
let last_comp_version: UInt32
|
||||
let boot_cpuid_phys: UInt32
|
||||
let size_dt_strings: UInt32
|
||||
let size_dt_struct: UInt32
|
||||
}
|
||||
|
||||
struct FDTProperty {
|
||||
let len: UInt32
|
||||
let nameoff: UInt32
|
||||
}
|
||||
|
||||
enum FDTToken: UInt32 {
|
||||
case beginNode = 0x1
|
||||
case endNode = 0x2
|
||||
case prop = 0x3
|
||||
case nop = 0x4
|
||||
case end = 0x9
|
||||
}
|
||||
|
||||
extension UInt32 {
|
||||
var fromBe: UInt32 {
|
||||
return self.byteSwapped
|
||||
}
|
||||
}
|
||||
|
||||
func alignUp(_ value: Int, to: Int) -> Int {
|
||||
return (value + to - 1) & ~(to - 1)
|
||||
}
|
||||
|
||||
let kFDTHeaderMagic = 0xd00dfeed
|
||||
|
||||
func parseDTB(at pointer: UnsafeRawPointer) {
|
||||
let header = pointer.bindMemory(to: FDTHeader.self, capacity: 1).pointee
|
||||
guard header.magic.byteSwapped == kFDTHeaderMagic else {
|
||||
return
|
||||
}
|
||||
|
||||
let structOffset = Int(header.off_dt_struct.byteSwapped)
|
||||
let stringOffset = Int(header.off_dt_strings.byteSwapped)
|
||||
|
||||
var structBase = pointer.advanced(by: structOffset)
|
||||
let stringsBase = pointer.advanced(by: stringOffset)
|
||||
|
||||
var finished = false
|
||||
while !finished {
|
||||
let rawToken = structBase.load(as: UInt32.self).byteSwapped
|
||||
structBase = structBase.advanced(by: 4)
|
||||
|
||||
if let token = FDTToken(rawValue: rawToken) {
|
||||
switch token {
|
||||
case .beginNode:
|
||||
let namePointer = structBase.assumingMemoryBound(to: UInt8.self)
|
||||
let name = String(cString: namePointer)
|
||||
let nameLength = name.utf8.count + 1
|
||||
structBase = structBase.advanced(by: alignUp(nameLength, to: 4))
|
||||
case .prop:
|
||||
let propertyHeader = structBase.load(as: FDTProperty.self)
|
||||
let dataLength = Int(propertyHeader.len.byteSwapped)
|
||||
let nameOffset = Int(propertyHeader.nameoff.byteSwapped)
|
||||
|
||||
let namePointer = stringsBase.advanced(by: nameOffset).assumingMemoryBound(to: UInt8.self)
|
||||
|
||||
structBase = structBase.advanced(by: 8) // skip header
|
||||
structBase = structBase.advanced(by: alignUp(dataLength, to: 4)) // skip data for now
|
||||
|
||||
// TODO: finish it :D
|
||||
case .endNode:
|
||||
continue
|
||||
case .nop:
|
||||
continue
|
||||
case .end:
|
||||
finished = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,5 @@
|
||||
.section .text.boot, "ax"
|
||||
.global _start
|
||||
|
||||
_start:
|
||||
bl kmain
|
||||
.hang:
|
||||
b .hang
|
||||
bl KernelMain
|
||||
b .
|
||||
@@ -1,83 +0,0 @@
|
||||
.macro ventry type
|
||||
.align 7
|
||||
sub sp, sp, #272 // save 272 bytes of stack
|
||||
stp x0, x1, [sp, #0] // move stack
|
||||
mov x1, #\type // move type to x1
|
||||
b common_trap_entry
|
||||
.endm
|
||||
|
||||
.section .text.vectors
|
||||
.align 11
|
||||
.global vectors
|
||||
vector_table:
|
||||
// EL1t (curr EL with SP0)
|
||||
ventry 0 // Sync
|
||||
ventry 1 // IRQ
|
||||
ventry 2 // FIQ
|
||||
ventry 3 // SError
|
||||
|
||||
// EL1h (curr EL with SP1)
|
||||
ventry 4 // Sync
|
||||
ventry 5 // IRQ
|
||||
ventry 6 // FIQ
|
||||
ventry 7 // SError
|
||||
|
||||
// EL0 (lower EL 64-bit from userspace)
|
||||
ventry 8 // Sync
|
||||
ventry 9 // IRQ
|
||||
ventry 10 // FIQ
|
||||
ventry 11 // SError
|
||||
|
||||
// EL0 (lower EL 32-bit from userspace)
|
||||
ventry 12; ventry 13; ventry 14; ventry 15
|
||||
|
||||
common_trap_entry:
|
||||
stp x2, x3, [sp, #16 * 1]
|
||||
stp x4, x5, [sp, #16 * 2]
|
||||
stp x6, x7, [sp, #16 * 3]
|
||||
stp x8, x9, [sp, #16 * 4]
|
||||
stp x10, x11, [sp, #16 * 5]
|
||||
stp x12, x13, [sp, #16 * 6]
|
||||
stp x14, x15, [sp, #16 * 7]
|
||||
stp x16, x17, [sp, #16 * 8]
|
||||
stp x18, x19, [sp, #16 * 9]
|
||||
stp x20, x21, [sp, #16 * 10]
|
||||
stp x22, x23, [sp, #16 * 11]
|
||||
stp x24, x25, [sp, #16 * 12]
|
||||
stp x26, x27, [sp, #16 * 13]
|
||||
stp x28, x29, [sp, #16 * 14]
|
||||
|
||||
mrs x21, elr_el1
|
||||
mrs x22, spsr_el1
|
||||
mrs x23, esr_el1
|
||||
|
||||
stp x30, x21, [sp, #16 * 15]
|
||||
stp x22, x23, [sp, #16 * 16]
|
||||
|
||||
mov x0, sp
|
||||
bl swift_trap_handler
|
||||
|
||||
ldp x22, x23, [sp, #16 * 16]
|
||||
msr spsr_el1, x22
|
||||
|
||||
ldp x30, x21, [sp, #16 * 15]
|
||||
msr elr_el1, x21
|
||||
|
||||
ldp x28, x29, [sp, #16 * 14]
|
||||
ldp x26, x27, [sp, #16 * 13]
|
||||
ldp x24, x25, [sp, #16 * 12]
|
||||
ldp x22, x23, [sp, #16 * 11]
|
||||
ldp x20, x21, [sp, #16 * 10]
|
||||
ldp x18, x19, [sp, #16 * 9]
|
||||
ldp x16, x17, [sp, #16 * 8]
|
||||
ldp x14, x15, [sp, #16 * 7]
|
||||
ldp x12, x13, [sp, #16 * 6]
|
||||
ldp x10, x11, [sp, #16 * 5]
|
||||
ldp x8, x9, [sp, #16 * 4]
|
||||
ldp x6, x7, [sp, #16 * 3]
|
||||
ldp x4, x5, [sp, #16 * 2]
|
||||
ldp x2, x3, [sp, #16 * 1]
|
||||
ldp x0, x1, [sp, #0]
|
||||
|
||||
add sp, sp, #272
|
||||
eret
|
||||
Reference in New Issue
Block a user