pr 00.1 move syscall to abi
This commit is contained in:
parent
90095bb21e
commit
567ab21709
@ -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 {
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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};
|
||||||
|
|||||||
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user