Yep, that worked. Ran into a little compiler error though (updating to see if that solvs it):
Compiling libk v0.1.0 (C:\Users\ethin\source\kernel\libk)
error: could not compile `libk`
Caused by:
process didn't exit successfully: `rustc --crate-name libk --edition=2018 libk\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type lib --emit=dep-info,metadata,link -C panic=abort -C embed-bitcode=no -C codegen-units=64 -C debuginfo=2 --cfg "feature=\"default\"" --cfg "feature=\"nvme\"" -C metadata=4bd721d67899f00e -C extra-filename=-4bd721d67899f00e --out-dir C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps --target \\?\C:\Users\ethin\source\kernel\x86_64-kernel-none.json -C incremental=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\incremental -L dependency=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps -L dependency=C:\Users\ethin\source\kernel\target\debug\deps --extern acpi=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libacpi-efad077d7ec36226.rmeta --extern noprelude:alloc=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\liballoc-d1865a98d5f9bf9b.rmeta --extern bit_field=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libbit_field-ccd2311a70e48359.rmeta --extern bitflags=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libbitflags-f8f0414bae7e2c27.rmeta --extern block_device=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libblock_device-8f431d64cb9b27ae.rmeta --extern bootloader=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libbootloader-d8abd844d46cf313.rmeta --extern byteorder=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libbyteorder-98be04c51d5e90c5.rmeta --extern noprelude:compiler_builtins=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libcompiler_builtins-66aa1306f28a7f7c.rmeta --extern noprelude:core=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libcore-af4f4e5bfcb0e59c.rmeta --extern cpuio=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libcpuio-9930b93ed144d1a7.rmeta --extern crossbeam_queue=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libcrossbeam_queue-580655f93cc08ae6.rmeta --extern dia_semver=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libdia_semver-32f575449794634d.rmeta --extern hashbrown=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libhashbrown-1faa84aff47a7e04.rmeta --extern heapless=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libheapless-eb3a0fee0db8a73a.rmeta --extern iced_x86=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libiced_x86-00d371cb78607e38.rmeta --extern lazy_static=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\liblazy_static-a9074d75edc38795.rmeta --extern linked_list_allocator=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\liblinked_list_allocator-1f6e0d5ee5401778.rmeta --extern log=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\liblog-2a42d1cea634d96f.rmeta --extern minivec=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libminivec-eb14ee2455aa3a4d.rmeta --extern rand_core=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\librand_core-a646e0b0ae446e1b.rmeta --extern rand_hc=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\librand_hc-d83d139e6e9e690b.rmeta --extern raw_cpuid=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libraw_cpuid-ce2e9d9c9505cffc.rmeta --extern spin=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libspin-15c476d4161c24bd.rmeta --extern static_assertions=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libstatic_assertions-49fb235a8caf6bce.rmeta --extern voladdress=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libvoladdress-c2f18ee6b36f4e30.rmeta --extern x86=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libx86-a739ea20a63b10f2.rmeta --extern x86_64=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libx86_64-04da3eaf6e562b63.rmeta --extern zerocopy=C:\Users\ethin\source\kernel\target\x86_64-kernel-none\debug\deps\libzerocopy-7f9bd23a2a2d7923.rmeta -Z unstable-options` (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)
Edit: Okay, so it doesn't like that, apparently. I have a function for unregistering handlers when a driver is ready to be shut down:
pub fn unregister_interrupt_handler(int: u8, id: usize) -> bool {
x86_64::instructions::interrupts::disable();
debug!("Unregistering handler for int. {:X} (id {:X})", int, id);
let mut tbl = IRQ_FUNCS.write();
let irq = 32_u8.saturating_add(int);
if let Some(funcs) = tbl.get_mut(&irq) {
if funcs.len() >= id {
let _ = funcs.remove(id);
} else {
x86_64::instructions::interrupts::enable();
return false;
}
}
x86_64::instructions::interrupts::enable();
true
}
I've tried that, and this:
pub fn unregister_interrupt_handler(int: u8, id: usize) -> bool {
x86_64::instructions::interrupts::disable();
debug!("Unregistering handler for int. {:X} (id {:X})", int, id);
let mut tbl = IRQ_FUNCS.write();
let irq = 32_u8.saturating_add(int);
if let Some(funcs) = tbl.get_mut(&irq) {
if funcs.len() >= id {
let b = funcs.remove(id);
drop(b);
} else {
x86_64::instructions::interrupts::enable();
return false;
}
}
x86_64::instructions::interrupts::enable();
true
}
It really hates both of these, I think. I don't know because its not syntactically or semantically incorrect, but it did this after it complained that I needed to use the result of Box<T>
.