From 3d53b641bf475b1588559d8d130a6d491d59927a Mon Sep 17 00:00:00 2001 From: Able Date: Sat, 16 Nov 2024 02:51:58 -0600 Subject: [PATCH 1/5] interrupt work --- kernel/src/arch/mod.rs | 22 ++++++++++++ kernel/src/arch/x86_64/interrupts.rs | 36 +++++++++++++++++-- .../service_definition_service.rs | 3 +- kernel/src/holeybytes/mod.rs | 2 +- 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/kernel/src/arch/mod.rs b/kernel/src/arch/mod.rs index c1a5e1bd9..30621ca13 100644 --- a/kernel/src/arch/mod.rs +++ b/kernel/src/arch/mod.rs @@ -14,3 +14,25 @@ arch_cond!( riscv64: "riscv64", x86_64: "x86_64", ); +use {crate::arch::interrupts::Interrupt, alloc::string::String}; +pub struct InterruptList { + list: HashMap, +} +use hashbrown::HashMap; +impl InterruptList { + pub fn new() -> Self { + Self { + list: HashMap::new(), + } + } +} +use { + alloc::vec::Vec, + spin::{Lazy, Mutex}, +}; +pub static INTERRUPT_LIST: Lazy> = Lazy::new(|| { + let mut il = InterruptList::new(); + use crate::alloc::string::ToString; + il.list.insert(Interrupt::Timer, "PS/2 Mouse".to_string()); + Mutex::new(il) +}); diff --git a/kernel/src/arch/x86_64/interrupts.rs b/kernel/src/arch/x86_64/interrupts.rs index 25c2931bd..0d3215d53 100644 --- a/kernel/src/arch/x86_64/interrupts.rs +++ b/kernel/src/arch/x86_64/interrupts.rs @@ -11,7 +11,10 @@ static mut LAPIC: LocalApic = unsafe { MaybeUninit::zeroed().assume_init() }; static mut IDT: InterruptDescriptorTable = unsafe { MaybeUninit::zeroed().assume_init() }; #[repr(u8)] -#[derive(Debug)] +#[derive(Debug)]#[derive(Eq, Hash, PartialEq)] + + +pub enum Interrupt { Timer = 32, ApicErr = u8::MAX - 1, @@ -61,6 +64,8 @@ extern "x86-interrupt" fn page_fault( } extern "x86-interrupt" fn timer(_isf: InterruptStackFrame) { + interrupt(Interrupt::Timer); + unsafe { LAPIC.end_of_interrupt(); } @@ -81,6 +86,31 @@ extern "x86-interrupt" fn spurious(_: InterruptStackFrame) { } fn interrupt(interrupt_type: Interrupt){ - log::info!("Interrupt type {:?}", interrupt_type); - panic!() + + use crate::arch::INTERRUPT_LIST; + let il = INTERRUPT_LIST.lock(); + let val = il.list.get(&interrupt_type).unwrap(); + + use crate::holeybytes::kernel_services::service_definition_service::sds_search_service; + let buffer = sds_search_service(val); + if buffer != 0 { + use alloc::vec::Vec;use crate::kmain::IPC_BUFFERS; + let mut buffs = IPC_BUFFERS.lock(); + match buffs.get_mut(&buffer) { + Some(buff) => { + let mut msg_vec = Vec::new(); + msg_vec.push(0xff); + buff.push(msg_vec.to_vec()); + log::debug!("Sent Message {:?} to Buffer({})", msg_vec, buffer); + } + None => { + log::error!("Access of non-existent buffer {}", buffer) + } + } + + + + // log::info!("{}", buffer); + +} } \ No newline at end of file diff --git a/kernel/src/holeybytes/kernel_services/service_definition_service.rs b/kernel/src/holeybytes/kernel_services/service_definition_service.rs index 7cf03ecc2..10db0945f 100644 --- a/kernel/src/holeybytes/kernel_services/service_definition_service.rs +++ b/kernel/src/holeybytes/kernel_services/service_definition_service.rs @@ -92,8 +92,7 @@ fn sds_create_service(protocol: &'static str) -> u64 { // let a: protocol::Protocol = protocol.into(); buff_id } - -fn sds_search_service(protocol: &str) -> u64 { +pub fn sds_search_service(protocol: &str) -> u64 { let services = SERVICES.lock(); let compare = Protocol::from(protocol); for (bid, protocol_canidate) in &services.0 { diff --git a/kernel/src/holeybytes/mod.rs b/kernel/src/holeybytes/mod.rs index 42e4812db..2c4dbab4f 100644 --- a/kernel/src/holeybytes/mod.rs +++ b/kernel/src/holeybytes/mod.rs @@ -1,5 +1,5 @@ mod ecah; -mod kernel_services; +pub mod kernel_services; mod mem; use { From ee82bc5705df1547dc3d5216c5866012c49b779d Mon Sep 17 00:00:00 2001 From: koniifer Date: Sat, 16 Nov 2024 09:30:43 +0000 Subject: [PATCH 2/5] minor changes --- Cargo.lock | 10 +++++----- sysdata/libraries/stn/src/memory.hb | 4 ++-- sysdata/programs/render_example/src/examples/orbit.hb | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 17a86d650..1e7ac8f6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -228,12 +228,12 @@ dependencies = [ [[package]] name = "hbbytecode" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#7058efe75c7ad245db80986e77a97d426b9be8a4" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#baa70d3f1272c2cbb208ca17115dc54b7d31af5c" [[package]] name = "hblang" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#7058efe75c7ad245db80986e77a97d426b9be8a4" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#baa70d3f1272c2cbb208ca17115dc54b7d31af5c" dependencies = [ "hashbrown 0.15.1", "hbbytecode", @@ -245,7 +245,7 @@ dependencies = [ [[package]] name = "hbvm" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#7058efe75c7ad245db80986e77a97d426b9be8a4" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#baa70d3f1272c2cbb208ca17115dc54b7d31af5c" dependencies = [ "hbbytecode", ] @@ -428,9 +428,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.162" +version = "0.2.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "1fdaeca4cf44ed4ac623e86ef41f056e848dbeab7ec043ecb7326ba300b36fd0" [[package]] name = "limine" diff --git a/sysdata/libraries/stn/src/memory.hb b/sysdata/libraries/stn/src/memory.hb index 03a6cfece..609104ccb 100644 --- a/sysdata/libraries/stn/src/memory.hb +++ b/sysdata/libraries/stn/src/memory.hb @@ -6,7 +6,7 @@ $uninit := fn($Expr: type): ?Expr { return null } -dangling := fn($Expr: type): ^Expr { +$dangling := fn($Expr: type): ^Expr { return @bitcast(@alignof(Expr)) } @@ -23,7 +23,7 @@ alloc := fn($Expr: type, num: uint): ^Expr { ptr := request_page(MAX_ALLOC) remaining := pages - MAX_ALLOC loop if remaining < MAX_ALLOC break else { - _ = request_page(@intcast(MAX_ALLOC)) + _ = request_page(MAX_ALLOC) remaining -= MAX_ALLOC } _ = request_page(@intcast(remaining)) diff --git a/sysdata/programs/render_example/src/examples/orbit.hb b/sysdata/programs/render_example/src/examples/orbit.hb index 84b47e3ca..b83d1d40f 100644 --- a/sysdata/programs/render_example/src/examples/orbit.hb +++ b/sysdata/programs/render_example/src/examples/orbit.hb @@ -25,7 +25,6 @@ example := fn(): void { render.clear(screen, render.black) render.put_filled_circle(screen, .(screen.width / 2, screen.height / 2), 128, render.light_yellow) render.put_circle(screen, .(screen.width / 2, screen.height / 2), 256, render.light_blue) - // Precision issues? render.put_textured_circle(screen, able, .(able.width / 2, able.height / 2), .(screen.width / 2 + @intcast(@fti(sin(angle) * 256)), screen.height / 2 + @intcast(@fti(cos(angle) * 256))), able.width / 2 - 1) render.put_textured_circle(screen, mini, .(mini.width / 2, mini.height / 2), .(screen.width / 2 + @intcast(@fti(sin(angle + PI) * 256)), screen.height / 2 + @intcast(@fti(cos(angle + PI) * 256))), mini.width / 2 - 1) render.sync(screen) From d958a103faa4442b9fe6436b5399248e9ce37fe5 Mon Sep 17 00:00:00 2001 From: koniifer Date: Sat, 16 Nov 2024 09:34:17 +0000 Subject: [PATCH 3/5] fix --- kernel/src/arch/x86_64/interrupts.rs | 44 ++++++++++++---------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/kernel/src/arch/x86_64/interrupts.rs b/kernel/src/arch/x86_64/interrupts.rs index 0d3215d53..4bd3c8a96 100644 --- a/kernel/src/arch/x86_64/interrupts.rs +++ b/kernel/src/arch/x86_64/interrupts.rs @@ -11,11 +11,9 @@ static mut LAPIC: LocalApic = unsafe { MaybeUninit::zeroed().assume_init() }; static mut IDT: InterruptDescriptorTable = unsafe { MaybeUninit::zeroed().assume_init() }; #[repr(u8)] -#[derive(Debug)]#[derive(Eq, Hash, PartialEq)] +#[derive(Debug, Eq, Hash, PartialEq)] - -pub -enum Interrupt { +pub enum Interrupt { Timer = 32, ApicErr = u8::MAX - 1, Spurious = u8::MAX, @@ -64,7 +62,7 @@ extern "x86-interrupt" fn page_fault( } extern "x86-interrupt" fn timer(_isf: InterruptStackFrame) { - interrupt(Interrupt::Timer); + // interrupt(Interrupt::Timer); unsafe { LAPIC.end_of_interrupt(); @@ -85,8 +83,7 @@ extern "x86-interrupt" fn spurious(_: InterruptStackFrame) { } } -fn interrupt(interrupt_type: Interrupt){ - +fn interrupt(interrupt_type: Interrupt) { use crate::arch::INTERRUPT_LIST; let il = INTERRUPT_LIST.lock(); let val = il.list.get(&interrupt_type).unwrap(); @@ -94,23 +91,20 @@ fn interrupt(interrupt_type: Interrupt){ use crate::holeybytes::kernel_services::service_definition_service::sds_search_service; let buffer = sds_search_service(val); if buffer != 0 { - use alloc::vec::Vec;use crate::kmain::IPC_BUFFERS; - let mut buffs = IPC_BUFFERS.lock(); - match buffs.get_mut(&buffer) { - Some(buff) => { - let mut msg_vec = Vec::new(); - msg_vec.push(0xff); - buff.push(msg_vec.to_vec()); - log::debug!("Sent Message {:?} to Buffer({})", msg_vec, buffer); - } - None => { - log::error!("Access of non-existent buffer {}", buffer) - } - } - - - - // log::info!("{}", buffer); + use {crate::kmain::IPC_BUFFERS, alloc::vec::Vec}; + let mut buffs = IPC_BUFFERS.lock(); + match buffs.get_mut(&buffer) { + Some(buff) => { + let mut msg_vec = Vec::new(); + msg_vec.push(0xFF); + buff.push(msg_vec.to_vec()); + log::debug!("Sent Message {:?} to Buffer({})", msg_vec, buffer); + } + None => { + log::error!("Access of non-existent buffer {}", buffer) + } + } + // log::info!("{}", buffer); + } } -} \ No newline at end of file From 2808bc9e7c6f3dd0f284b7bbc26147fe8d9b8d27 Mon Sep 17 00:00:00 2001 From: koniifer Date: Sat, 16 Nov 2024 16:34:45 +0000 Subject: [PATCH 4/5] various fixes, update to latest rust nightly --- Cargo.lock | 57 +++++-------------------- kernel/.cargo/config.toml | 3 -- kernel/lds/x86_64.ld | 1 + kernel/src/arch/mod.rs | 12 ++++-- kernel/src/arch/x86_64/mod.rs | 6 +-- kernel/src/lib.rs | 3 +- kernel/targets/aarch64-virt-ableos.json | 2 +- rust-toolchain.toml | 4 +- 8 files changed, 27 insertions(+), 61 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1e7ac8f6b..86916eeec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aarch64-cpu" @@ -65,15 +65,6 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" -dependencies = [ - "allocator-api2", -] - [[package]] name = "byteorder" version = "1.5.0" @@ -208,12 +199,6 @@ dependencies = [ "wasi", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.1" @@ -228,24 +213,23 @@ dependencies = [ [[package]] name = "hbbytecode" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#baa70d3f1272c2cbb208ca17115dc54b7d31af5c" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#4088bd18b189b15996a4bdd6ab47141372457875" [[package]] name = "hblang" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#baa70d3f1272c2cbb208ca17115dc54b7d31af5c" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#4088bd18b189b15996a4bdd6ab47141372457875" dependencies = [ - "hashbrown 0.15.1", + "hashbrown", "hbbytecode", "hbvm", "log", - "regalloc2", ] [[package]] name = "hbvm" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#baa70d3f1272c2cbb208ca17115dc54b7d31af5c" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#4088bd18b189b15996a4bdd6ab47141372457875" dependencies = [ "hbbytecode", ] @@ -396,7 +380,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown", ] [[package]] @@ -406,7 +390,7 @@ dependencies = [ "aarch64-cpu", "crossbeam-queue", "derive_more", - "hashbrown 0.15.1", + "hashbrown", "hbvm", "limine", "log", @@ -428,9 +412,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.163" +version = "0.2.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fdaeca4cf44ed4ac623e86ef41f056e848dbeab7ec043ecb7326ba300b36fd0" +checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" [[package]] name = "limine" @@ -553,19 +537,6 @@ dependencies = [ "bitflags 2.6.0", ] -[[package]] -name = "regalloc2" -version = "0.10.2" -source = "git+https://github.com/jakubDoka/regalloc2?branch=reuse-allocations#21c43e3ee182824e92e2b25f1d3c03ed47f9c02b" -dependencies = [ - "allocator-api2", - "bumpalo", - "hashbrown 0.14.5", - "log", - "rustc-hash", - "smallvec", -] - [[package]] name = "regex-syntax" version = "0.8.5" @@ -602,12 +573,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - [[package]] name = "rustc_version" version = "0.4.1" @@ -619,9 +584,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e" dependencies = [ "log", "once_cell", diff --git a/kernel/.cargo/config.toml b/kernel/.cargo/config.toml index e05259036..422bf9d2a 100644 --- a/kernel/.cargo/config.toml +++ b/kernel/.cargo/config.toml @@ -1,6 +1,3 @@ [unstable] build-std = ["core", "compiler_builtins", "alloc"] build-std-features = ["compiler-builtins-mem"] - -[build] -target = "./targets/x86_64-ableos.json" diff --git a/kernel/lds/x86_64.ld b/kernel/lds/x86_64.ld index 8e899a4d3..19ee79f64 100644 --- a/kernel/lds/x86_64.ld +++ b/kernel/lds/x86_64.ld @@ -38,6 +38,7 @@ SECTIONS .data : { *(.data .data.*) + *(.got .got.*) } :data .bss : { diff --git a/kernel/src/arch/mod.rs b/kernel/src/arch/mod.rs index 30621ca13..305872f31 100644 --- a/kernel/src/arch/mod.rs +++ b/kernel/src/arch/mod.rs @@ -14,11 +14,16 @@ arch_cond!( riscv64: "riscv64", x86_64: "x86_64", ); + +#[cfg(target_arch = "x86_64")] use {crate::arch::interrupts::Interrupt, alloc::string::String}; +#[cfg(target_arch = "x86_64")] pub struct InterruptList { list: HashMap, } +#[cfg(target_arch = "x86_64")] use hashbrown::HashMap; +#[cfg(target_arch = "x86_64")] impl InterruptList { pub fn new() -> Self { Self { @@ -26,10 +31,9 @@ impl InterruptList { } } } -use { - alloc::vec::Vec, - spin::{Lazy, Mutex}, -}; +#[cfg(target_arch = "x86_64")] +use spin::{Lazy, Mutex}; +#[cfg(target_arch = "x86_64")] pub static INTERRUPT_LIST: Lazy> = Lazy::new(|| { let mut il = InterruptList::new(); use crate::alloc::string::ToString; diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs index aa4f6cd58..fbc362c11 100644 --- a/kernel/src/arch/x86_64/mod.rs +++ b/kernel/src/arch/x86_64/mod.rs @@ -33,7 +33,7 @@ const INITIAL_KERNEL_HEAP_SIZE: *const () = _initial_kernel_heap_size as _; #[cfg(not(target_feature = "avx2"))] unsafe extern "C" fn _kernel_start() -> ! { // Initialise SSE, then jump to kernel entrypoint - core::arch::asm!( + core::arch::naked_asm!( // Initialise SSE "mov rax, cr0", "and ax, 0xfffb", @@ -46,7 +46,6 @@ unsafe extern "C" fn _kernel_start() -> ! { // Jump to the kernel entry point "jmp {}", sym start, - options(noreturn), ) } @@ -54,7 +53,7 @@ unsafe extern "C" fn _kernel_start() -> ! { #[naked] #[cfg(target_feature = "avx2")] unsafe extern "C" fn _kernel_start() -> ! { - core::arch::asm!( + core::arch::naked_asm!( // Enable protected mode and configure control registers "mov rax, cr0", "and ax, 0xFFFB", // Clear CR0.EM (bit 2) for coprocessor emulation @@ -100,7 +99,6 @@ unsafe extern "C" fn _kernel_start() -> ! { "jmp {0}", sym start, sym oops, - options(noreturn), ) } diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index a94f94b11..3eff39d8e 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -5,7 +5,6 @@ #![feature( slice_split_once, exclusive_wrapper, - new_uninit, core_intrinsics, abi_x86_interrupt, alloc_error_handler, @@ -15,7 +14,7 @@ pointer_is_aligned_to )] #![test_runner(crate::test_runner)] -#![allow(dead_code, internal_features)] +#![allow(dead_code, internal_features, static_mut_refs)] extern crate alloc; mod allocator; diff --git a/kernel/targets/aarch64-virt-ableos.json b/kernel/targets/aarch64-virt-ableos.json index fcb14d005..9ee18cf01 100644 --- a/kernel/targets/aarch64-virt-ableos.json +++ b/kernel/targets/aarch64-virt-ableos.json @@ -1,6 +1,6 @@ { "arch": "aarch64", - "data-layout": "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", + "data-layout": "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32", "disable-redzone": true, "env": "", "executables": true, diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 9353a5446..e66400a04 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,5 @@ [toolchain] -channel = "nightly-2024-07-27" +# old toolchain +# channel = "nightly-2024-07-27" +channel = "nightly" components = ["rust-src", "llvm-tools"] From da5f1a7a193342e62bf11e0dd529ca14d250468f Mon Sep 17 00:00:00 2001 From: koniifer Date: Sat, 16 Nov 2024 20:42:16 +0000 Subject: [PATCH 5/5] compiler update --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86916eeec..7d4cd9e7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -213,12 +213,12 @@ dependencies = [ [[package]] name = "hbbytecode" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#4088bd18b189b15996a4bdd6ab47141372457875" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#12bb7029b4bafd1edff77ed9a12888374cc7f8be" [[package]] name = "hblang" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#4088bd18b189b15996a4bdd6ab47141372457875" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#12bb7029b4bafd1edff77ed9a12888374cc7f8be" dependencies = [ "hashbrown", "hbbytecode", @@ -229,7 +229,7 @@ dependencies = [ [[package]] name = "hbvm" version = "0.1.0" -source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#4088bd18b189b15996a4bdd6ab47141372457875" +source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#12bb7029b4bafd1edff77ed9a12888374cc7f8be" dependencies = [ "hbbytecode", ]