#![allow(clippy::missing_safety_doc)]
use core::{mem, ptr};
#[macro_use]
mod macros;
mod ctrl;
pub use ctrl::*;
mod display;
pub use display::*;
mod ge;
pub use ge::*;
mod kernel;
pub use kernel::*;
mod usb;
pub use usb::*;
mod power;
pub use power::*;
mod wlan;
pub use wlan::*;
mod rtc;
pub use rtc::*;
mod io;
pub use io::*;
mod audio;
pub use audio::*;
mod atrac;
pub use atrac::*;
mod jpeg;
pub use jpeg::*;
mod umd;
pub use umd::*;
mod mpeg;
pub use mpeg::*;
mod hprm;
pub use hprm::*;
mod gu;
pub use gu::*;
mod gum;
pub use gum::*;
mod types;
pub use types::*;
mod mp3;
pub use mp3::*;
mod registry;
pub use registry::*;
mod openpsid;
pub use openpsid::*;
mod utility;
pub use utility::*;
mod net;
pub use net::*;
mod font;
pub use font::*;
mod psmf;
pub use psmf::*;
pub mod vfpu_context;
use core::ffi::c_void;
#[repr(C)]
pub struct SceStubLibraryEntry {
pub name: *const u8,
pub version: [u8; 2],
pub flags: u16,
pub len: u8,
pub v_stub_count: u8,
pub stub_count: u16,
pub nid_table: *const u32,
pub stub_table: *const c_void,
}
unsafe impl Sync for SceStubLibraryEntry {}
#[repr(u16)]
pub enum ModuleInfoAttr {
User = 0,
NoStop = 0x0001,
SingleLoad = 0x0002,
SingleStart = 0x0004,
Kernel = 0x1000,
}
#[repr(C, packed)]
pub struct SceModuleInfo {
pub mod_attribute: u16,
pub mod_version: [u8; 2],
pub mod_name: [u8; 27],
pub terminal: u8,
pub gp_value: *const u8,
pub ent_top: *const u8,
pub ent_end: *const u8,
pub stub_top: *const u8,
pub stub_end: *const u8,
}
unsafe impl Sync for SceModuleInfo {}
impl SceModuleInfo {
#[doc(hidden)]
pub const fn name(s: &str) -> [u8; 27] {
let bytes = s.as_bytes();
let mut result = [0; 27];
let mut i = 0;
while i < bytes.len() {
result[i] = bytes[i];
i += 1;
}
result
}
}
#[repr(C, packed)]
pub struct SceLibraryEntry {
pub name: *const u8,
pub version: (u8, u8),
pub attribute: SceLibAttr,
pub entry_len: u8,
pub var_count: u8,
pub func_count: u16,
pub entry_table: *const SceLibraryEntryTable,
}
unsafe impl Sync for SceLibraryEntry {}
bitflags::bitflags! {
pub struct SceLibAttr: u16 {
const SCE_LIB_NO_SPECIAL_ATTR = 0;
const SCE_LIB_AUTO_EXPORT = 0x1;
const SCE_LIB_WEAK_EXPORT = 0x2;
const SCE_LIB_NOLINK_EXPORT = 0x4;
const SCE_LIB_WEAK_IMPORT = 0x8;
const SCE_LIB_SYSCALL_EXPORT = 0x4000;
const SCE_LIB_IS_SYSLIB = 0x8000;
}
}
#[repr(C)]
pub struct SceLibraryEntryTable {
pub module_start_nid: u32,
pub module_info_nid: u32,
pub module_start: unsafe extern "C" fn(usize, *mut c_void) -> isize,
pub module_info: *const SceModuleInfo,
}
unsafe impl Sync for SceLibraryEntryTable {}
pub enum MsCbEvent {
Inserted = 1,
Ejected = 2,
}
#[inline(always)]
#[allow(non_snake_case)]
pub unsafe fn MScmIsMediumInserted() -> i32 {
let mut status: i32 = 0;
let ret = io::sceIoDevctl(
b"mscmhc0:\0" as _,
0x02025806,
ptr::null_mut(),
0,
&mut status as *mut _ as _,
mem::size_of::<i32>() as i32,
);
if ret < 0 {
ret
} else if status != 1 {
0
} else {
1
}
}
#[inline(always)]
#[allow(non_snake_case)]
pub unsafe fn MScmRegisterMSInsertEjectCallback(mut cbid: SceUid) -> i32 {
sceIoDevctl(
b"fatms0:\0" as _,
0x02415821,
&mut cbid as *mut _ as _,
mem::size_of::<SceUid>() as i32,
ptr::null_mut(),
0,
)
}
#[inline(always)]
#[allow(non_snake_case)]
pub unsafe fn MScmUnregisterMSInsertEjectCallback(mut cbid: SceUid) -> i32 {
sceIoDevctl(
b"fatms0:\0" as _,
0x02415822,
&mut cbid as *mut _ as _,
mem::size_of::<SceUid>() as i32,
ptr::null_mut(),
0,
)
}