pr 00.1 move syscall to abi

This commit is contained in:
bQUARKz 2026-02-03 19:17:46 +00:00
parent 90095bb21e
commit 567ab21709
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
7 changed files with 10 additions and 13 deletions

View File

@ -4,6 +4,7 @@ pub mod model;
pub mod log; pub mod log;
pub mod telemetry; pub mod telemetry;
pub mod debugger_protocol; pub mod debugger_protocol;
pub mod syscalls;
// Tipos da VM que fazem parte do contrato (ex.: inspeção de pilha pelo debugger) // Tipos da VM que fazem parte do contrato (ex.: inspeção de pilha pelo debugger)
pub mod virtual_machine { pub mod virtual_machine {

View File

@ -6,7 +6,6 @@ mod input_signal;
mod audio; mod audio;
mod memory_banks; mod memory_banks;
pub mod hardware; pub mod hardware;
pub mod syscalls;
pub use crate::model::HandleId; pub use crate::model::HandleId;
pub use asset::AssetManager; pub use asset::AssetManager;
@ -16,19 +15,18 @@ pub use gfx::Gfx;
pub use input_signal::InputSignals; pub use input_signal::InputSignals;
pub use memory_banks::MemoryBanks; pub use memory_banks::MemoryBanks;
pub use pad::Pad; pub use pad::Pad;
pub use syscalls::Syscall;
pub use touch::Touch; pub use touch::Touch;
pub trait HardwareBridge { pub trait HardwareBridge {
fn gfx(&self) -> &Gfx; fn gfx(&self) -> &Gfx;
fn gfx_mut(&mut self) -> &mut Gfx; fn gfx_mut(&mut self) -> &mut Gfx;
fn audio(&self) -> &Audio; fn audio(&self) -> &Audio;
fn audio_mut(&mut self) -> &mut Audio; fn audio_mut(&mut self) -> &mut Audio;
fn pad(&self) -> &Pad; fn pad(&self) -> &Pad;
fn pad_mut(&mut self) -> &mut Pad; fn pad_mut(&mut self) -> &mut Pad;
fn touch(&self) -> &Touch; fn touch(&self) -> &Touch;
fn touch_mut(&mut self) -> &mut Touch; fn touch_mut(&mut self) -> &mut Touch;

View File

@ -1,5 +1,5 @@
use crate::fs::{FsBackend, FsState, VirtualFS}; use crate::fs::{FsBackend, FsState, VirtualFS};
use crate::hardware::syscalls::Syscall; use crate::abi::syscalls::Syscall;
use crate::hardware::{HardwareBridge, InputSignals}; use crate::hardware::{HardwareBridge, InputSignals};
use crate::log::{LogLevel, LogService, LogSource}; use crate::log::{LogLevel, LogService, LogSource};
use crate::model::{BankType, Cartridge, Color}; use crate::model::{BankType, Cartridge, Color};

View File

@ -20,12 +20,12 @@ impl<'a> HostContext<'a> {
} }
pub trait HostContextProvider { pub trait HostContextProvider {
fn make_ctx<'a>(&'a mut self) -> HostContext<'a>; fn make_ctx(&mut self) -> HostContext;
} }
impl<T: HardwareBridge> HostContextProvider for T { impl<T: HardwareBridge> HostContextProvider for T {
#[inline] #[inline]
fn make_ctx<'a>(&'a mut self) -> HostContext<'a> { fn make_ctx(&'_ mut self) -> HostContext {
HostContext::new(Some(self)) HostContext::new(Some(self))
} }
} }

View File

@ -2,6 +2,7 @@ use crate::virtual_machine::bytecode::decoder::{decode_at, DecodeError};
use prometeu_bytecode::opcode::OpCode; use prometeu_bytecode::opcode::OpCode;
use prometeu_bytecode::FunctionMeta; use prometeu_bytecode::FunctionMeta;
use std::collections::{HashMap, HashSet, VecDeque}; use std::collections::{HashMap, HashSet, VecDeque};
use crate::abi::syscalls::Syscall;
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub enum VerifierError { pub enum VerifierError {
@ -96,7 +97,7 @@ impl Verifier {
} }
OpCode::Syscall => { OpCode::Syscall => {
let id = u32::from_le_bytes(instr.imm[0..4].try_into().unwrap()); let id = u32::from_le_bytes(instr.imm[0..4].try_into().unwrap());
let syscall = crate::hardware::syscalls::Syscall::from_u32(id).ok_or_else(|| { let syscall = Syscall::from_u32(id).ok_or_else(|| {
VerifierError::InvalidSyscallId { pc: func_start + pc, id } VerifierError::InvalidSyscallId { pc: func_start + pc, id }
})?; })?;
(syscall.args_count() as u16, syscall.results_count() as u16) (syscall.args_count() as u16, syscall.results_count() as u16)

View File

@ -1,4 +1,3 @@
use crate::hardware::HardwareBridge;
use crate::virtual_machine::call_frame::CallFrame; use crate::virtual_machine::call_frame::CallFrame;
use crate::virtual_machine::scope_frame::ScopeFrame; use crate::virtual_machine::scope_frame::ScopeFrame;
use crate::virtual_machine::Value; use crate::virtual_machine::Value;
@ -830,7 +829,7 @@ impl VirtualMachine {
let id = u32::from_le_bytes(instr.imm[0..4].try_into().unwrap()); let id = u32::from_le_bytes(instr.imm[0..4].try_into().unwrap());
let syscall = crate::hardware::syscalls::Syscall::from_u32(id).ok_or_else(|| { let syscall = crate::abi::syscalls::Syscall::from_u32(id).ok_or_else(|| {
self.trap(prometeu_bytecode::abi::TRAP_INVALID_SYSCALL, OpCode::Syscall as u16, format!("Unknown syscall: 0x{:08X}", id), pc_at_syscall) self.trap(prometeu_bytecode::abi::TRAP_INVALID_SYSCALL, OpCode::Syscall as u16, format!("Unknown syscall: 0x{:08X}", id), pc_at_syscall)
})?; })?;
@ -932,11 +931,9 @@ mod tests {
}]); }]);
vm vm
} }
use crate::hardware::HardwareBridge;
use crate::virtual_machine::{expect_int, HostReturn, Value, VmFault}; use crate::virtual_machine::{expect_int, HostReturn, Value, VmFault};
use prometeu_bytecode::abi::SourceSpan; use prometeu_bytecode::abi::SourceSpan;
use prometeu_bytecode::FunctionMeta; use prometeu_bytecode::FunctionMeta;
use url::Host;
struct MockNative; struct MockNative;
impl NativeInterface for MockNative { impl NativeInterface for MockNative {