#![allow(unused_imports)]
use core::ffi::{c_char, c_void, VaList};
#[cfg(feature = "kernel")]
use core::ptr::NonNull;
use bitflag_attr::bitflag;
use pspsdk_macros::psp_stub;
use crate::sys::{SceError, SceIntoOkValue, SceIsize, SceResult, SceResultOk, SceSize, SceUid};
#[repr(transparent)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MemoryBlockId(SceUid);
#[repr(transparent)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct HeapId(SceUid);
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[doc(alias("SceSysMemPartitionId"))]
pub enum MemoryPartitionId {
#[default]
#[doc(alias("SCE_KERNEL_UNKNOWN_PARTITION"))]
Unknown = 0,
#[doc(alias("SCE_KERNEL_PRIMARY_KERNEL_PARTITION", "PSP_MEMORY_PARTITION_KERNEL"))]
MainKernel = 1,
#[doc(alias("SCE_KERNEL_PRIMARY_USER_PARTITION", "PSP_MEMORY_PARTITION_USER"))]
MainUser = 2,
#[doc(alias("SCE_KERNEL_OTHER_KERNEL_PARTITION_1"))]
OtherKernel = 3,
#[doc(alias("SCE_KERNEL_OTHER_KERNEL_PARTITION_2"))]
OtherKernel2 = 4,
#[doc(alias("SCE_KERNEL_VSHELL_PARTITION"))]
Vshell = 5,
#[doc(alias("SCE_KERNEL_SC_USER_PARTITION"))]
SysconUser = 6,
#[doc(alias("SCE_KERNEL_ME_USER_PARTITION"))]
MeUser = 7,
#[doc(alias("SCE_KERNEL_EXTENDED_SC_KERNEL_PARTITION"))]
ExtendedSysconKernel = 8,
#[doc(alias("SCE_KERNEL_EXTENDED_SC_2_KERNEL_PARTITION"))]
ExtendedSysconKernel2 = 9,
#[doc(alias("SCE_KERNEL_EXTENDED_ME_KERNEL_PARTITION"))]
ExtendedMeKernel = 10,
#[doc(alias("SCE_KERNEL_VSHELL_KERNEL_PARTITION"))]
ExtendedVshell = 11,
#[doc(alias("SCE_KERNEL_EXTENDED_KERNEL_PARTITION"))]
ExtendedKernel = 12,
}
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum MemoryBlockKind {
#[default]
#[doc(alias("SCE_KERNEL_SMEM_Low", "PSP_SMEM_Low"))]
Low = 0,
#[doc(alias("SCE_KERNEL_SMEM_High", "PSP_SMEM_High"))]
High = 1,
#[doc(alias("SCE_KERNEL_SMEM_Addr", "PSP_SMEM_Addr"))]
Addr = 2,
#[doc(alias("SCE_KERNEL_SMEM_LOWALIGNED"))]
LowAligned = 3,
#[doc(alias("SCE_KERNEL_SMEM_HIGHALIGNED"))]
HighAligned = 4,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[doc(alias("SceSysmemPartInfo"))]
pub struct MemoryPartitionBasicInfo {
pub addr: SceSize,
pub size: SceSize,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[doc(alias("PspSysmemPartitionInfo", "SceSysmemPartitionInfo"))]
pub struct MemoryPartitionInfo {
pub size: SceSize,
pub start_addr: SceSize,
pub mem_size: SceSize,
pub attributes: u32,
}
pub type GeListUpdateStallAddrLazy = unsafe extern "C" fn(i32, *mut c_void) -> i32;
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
#[doc(alias("SceGeLazy"))]
pub struct GeLazy {
pub display_list_id: SceIsize,
pub stall: *mut c_void,
pub count: SceSize,
pub max: SceSize,
}
#[bitflag(u32)]
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum HeapCreateFlag {
#[default]
Unknown = 1 << 0,
Low = 1 << 1,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[doc(alias("SceSysmemHeapAllocOption"))]
pub struct HeapAllocOptions {
pub size: SceSize,
pub align: SceSize,
}
#[repr(C)]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[doc(alias("SceSysmemHeapInfo"))]
pub struct HeapInfo {
pub size: SceSize,
pub name: [u8; 32],
pub permission: i32,
pub attribute: i32,
pub heap_size: SceSize,
pub total_size: SceSize,
pub total_free_size: SceSize,
pub max_free_size: SceSize,
pub num_heaps: SceSize,
pub heap_blocks: *mut HeapBlock,
}
#[repr(C)]
#[derive(Debug, Clone)]
#[doc(alias("SceSysmemHeapBlock"))]
pub struct HeapBlock {
pub next: *mut HeapBlock,
pub previous: *mut HeapBlock,
}
#[repr(C)]
#[derive(Debug, Clone)]
#[doc(alias("SceSysmemLowheapInfo"))]
pub struct LowHeapInfo {
pub size: SceSize,
pub heap_size: SceSize,
pub used_size: SceSize,
pub total_free_size: SceSize,
pub max_free_size: SceSize,
pub block_count: SceSize,
pub info_block: *mut LowheapInfoBlock,
}
#[repr(C)]
#[derive(Debug, Clone)]
#[doc(alias("SceSysmemLowheapInfoBlock"))]
pub struct LowheapInfoBlock {
pub block: *mut LowheapInfoBlock,
pub offset: SceSize,
}
#[repr(C)]
#[derive(Debug, Clone)]
#[doc(alias("SceSysmemLowheapBlock"))]
pub struct LowHeapBlock {
pub next: *mut LowHeapBlock,
pub count: SceSize,
}
#[repr(u32)]
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[doc(alias("ScePspHwModels"))]
pub enum PspHardwareModel {
#[doc(alias("PSP_1000"))]
Psp01g = 0,
#[doc(alias("PSP_2000"))]
Psp02g = 1,
#[doc(alias("PSP_3000"))]
Psp03g = 2,
#[doc(alias("PSP_4000"))]
Psp04g = 3,
#[doc(alias("PSP_GO"))]
Psp05g = 4,
#[doc(alias("PSP_7000"))]
Psp07g = 6,
#[doc(alias("PSP_9000"))]
Psp09g = 8,
#[doc(alias("PSP_11000"))]
Psp11g = 10,
}
#[repr(C)]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[doc(alias("SceSysmemPartTable"))]
pub struct MemoryPartitionTable {
pub mem_size: SceSize,
pub unk0: u32,
pub unk1: u32,
pub other1: MemoryPartitionBasicInfo,
pub other2: MemoryPartitionBasicInfo,
pub vshell: MemoryPartitionBasicInfo,
pub sc_user: MemoryPartitionBasicInfo,
pub me_user: MemoryPartitionBasicInfo,
pub ext_sc_kernel2: MemoryPartitionBasicInfo,
pub ext_sc_kernel1: MemoryPartitionBasicInfo,
pub ext_me_kernel: MemoryPartitionBasicInfo,
pub ext_vshell: MemoryPartitionBasicInfo,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[doc(alias("SceSysmemMemoryBlockAllocOption"))]
pub struct MemoryBlockAllocOptions {
pub size: SceSize,
}
#[repr(C, packed)]
#[derive(Clone)]
#[doc(alias("SceSysmemUidCB"))]
pub struct UidControlBlock {
pub parent0: *mut UidControlBlock,
pub next_child: *mut UidControlBlock,
pub kind: *mut UidControlBlock,
pub uid: SceUid,
pub name: *mut c_char,
pub child_size: u8,
pub size: u8,
pub attribute: u16,
pub next: UidControlBlockNext,
pub parent1: *mut UidControlBlock,
pub function_table: *mut UidLookupFunction,
}
type UidFunction = unsafe extern "C" fn(
uid: *mut UidControlBlock,
uid_with_func: *mut UidControlBlock,
func_id: u32,
ap: VaList,
);
#[repr(C)]
#[derive(Debug, Clone, Copy)]
#[doc(alias("SceSysmemUidLookupFunc"))]
pub struct UidLookupFunction {
pub id: u32,
pub func: UidFunction,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub union UidControlBlockNext {
pub next: *mut UidControlBlock,
pub num_child: i32,
}
#[repr(C)]
#[derive(Debug, Clone)]
#[doc(alias("SceSysmemUidList"))]
pub struct UidList {
pub root: *mut UidControlBlock,
pub root_kind: *mut UidControlBlock,
pub basic: *mut UidControlBlock,
pub count: SceSize,
}
#[repr(C)]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[doc(alias("SceGameInfo"))]
pub struct GameInfo {
pub size: SceSize,
pub flags: GameInfoFlags,
pub umd_param_sfo: [u8; 16],
pub expect_umd_data: [u8; 16],
pub qtgp2: [u8; 8],
pub qtgp3: [u8; 16],
pub allow_replace_umd: u32,
pub title_id: [u8; 16],
pub parental_level: u32,
pub vsh_version: [u8; 8],
pub umd_cache_on: u32,
pub compiled_sdk_version: u32,
pub compiler_version: u32,
pub dnas: u32,
pub utility_location: u32,
pub vsh_bootfilename: [u8; 64],
pub gamedata_id: [u8; 16],
pub app_ver: [u8; 8],
pub subscription_validity: [u8; 8],
pub bootable: u32,
pub opnssmp_ver: u32,
}
#[bitflag(u32)]
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum GameInfoFlags {
UmdParamSfo = 0x00001,
Qtgp2 = 0x00004,
Qtgp3 = 0x00008,
AllowReplaceUmd = 0x00010,
UmdCacheOn = 0x00200,
UtilityLocation = 0x20000,
VshBootfileName = 0x40000,
SubscriptionValidity = 0x80000,
CompiledSdkVersion = 0x01000,
CompilerVersion = 0x02000,
Dnas = 0x10000,
SfoData = 0x00100,
}
#[psp_stub(libname = "SysMemUserForUser", flags = 0x4000, use_crate)]
unsafe extern "C" {
#[eabi(i5)]
#[nid(0x237DBD4F)]
#[cfg(not(feature = "kernel"))]
pub unsafe fn sceKernelAllocPartitionMemory(
partition: MemoryPartitionId, name: *const u8, kind: MemoryBlockKind, size: SceSize,
addr: SceSize,
) -> SceResult<MemoryBlockId>;
#[nid(0x9D9A5BA1)]
#[cfg(not(feature = "kernel"))]
pub safe fn sceKernelGetBlockHeadAddr(block_id: MemoryBlockId) -> *mut c_void;
#[nid(0xB6D61D02)]
#[cfg(not(feature = "kernel"))]
pub unsafe fn sceKernelFreePartitionMemory(block_id: MemoryBlockId) -> SceResult<u32>;
#[nid(0xFE707FDF)]
pub unsafe fn sceKernelAllocMemoryBlock(
name: *const u8,
kind: MemoryBlockKind,
size: SceSize,
options: Option<&MemoryBlockAllocOptions>,
) -> SceResult<MemoryBlockId>;
#[nid(0xDB83A952)]
pub unsafe fn sceKernelGetMemoryBlockAddr(
block_id: MemoryBlockId, addr: &mut *mut c_void,
) -> SceResult<()>;
#[nid(0x50F61D8A)]
pub unsafe fn sceKernelFreeMemoryBlock(block_id: MemoryBlockId) -> SceResult<i32>;
#[nid(0x2A3E5280)]
#[cfg(not(feature = "kernel"))]
pub safe fn sceKernelQueryMemoryInfo(
addr: SceSize, partition_id: &mut SceIsize, block_id: &mut SceIsize,
) -> SceResult<()>;
#[nid(0xACBD88CA)]
pub safe fn sceKernelTotalMemSize() -> SceSize;
#[nid(0xF919F628)]
pub safe fn sceKernelTotalFreeMemSize() -> SceSize;
#[nid(0xA291F107)]
pub safe fn sceKernelMaxFreeMemSize() -> SceSize;
#[nid(0x3FC9AE6A)]
#[cfg(not(feature = "kernel"))]
pub safe fn sceKernelDevkitVersion() -> u32;
#[nid(0x7591C7DB)]
pub safe fn sceKernelSetCompiledSdkVersion(version: u32) -> SceResult<()>;
#[nid(0xFC114573)]
#[cfg(not(feature = "kernel"))]
pub safe fn sceKernelGetCompiledSdkVersion() -> u32;
#[nid(0x13A5ABEF)]
pub unsafe fn sceKernelPrintf(format: *const c_char, ...);
#[nid(0xA6848DF8)]
pub unsafe fn sceKernelSetUsersystemLibWork(
cmd_list: *mut i32, func: GeListUpdateStallAddrLazy, lazy: *mut GeLazy,
) -> SceResult<()>;
}
#[cfg(feature = "kernel")]
#[psp_stub(libname = "SysMemForKernel", flags = 0x0001, use_crate)]
unsafe extern "C" {
#[eabi(i5)]
#[nid(if cfg!(feature = "psp_660") { 0x7158CE7E }
else if cfg!(feature = "psp_630") { 0x4621A9CC }
else if cfg!(feature = "psp_600") { 0xE5E18A99 }
else if cfg!(feature = "psp_570") { 0xEA349DC6 }
else if cfg!(feature = "psp_500") { 0x5630F321 }
else if cfg!(feature = "psp_420") { 0x2349884C }
else if cfg!(feature = "psp_395") { 0xE9E24E73 }
else if cfg!(feature = "psp_380") { 0x135CB831 }
else { 0x237DBD4F }
)]
pub unsafe fn sceKernelAllocPartitionMemory(
partition: MemoryPartitionId, name: *const u8, kind: MemoryBlockKind, size: SceSize,
addr: SceSize,
) -> SceResult<MemoryBlockId>;
#[nid(if cfg!(feature = "psp_660") { 0xF12A62F7 }
else if cfg!(feature = "psp_630") { 0x52B54B93 }
else if cfg!(feature = "psp_600") { 0xFEB5C72B }
else if cfg!(feature = "psp_570") { 0x2BDA1AC9 }
else if cfg!(feature = "psp_500") { 0x950BCB31 }
else if cfg!(feature = "psp_420") { 0x9E55F4DA }
else if cfg!(feature = "psp_395") { 0x5136926D }
else if cfg!(feature = "psp_380") { 0xBC3AFFF2 }
else { 0x9D9A5BA1 }
)]
pub safe fn sceKernelGetBlockHeadAddr(block_id: MemoryBlockId) -> *mut c_void;
#[nid(if cfg!(feature = "psp_660") { 0xC1A26C6F }
else if cfg!(feature = "psp_630") { 0x8FDAFC4C }
else if cfg!(feature = "psp_600") { 0x093DE56A }
else if cfg!(feature = "psp_570") { 0xE8120E5C }
else if cfg!(feature = "psp_500") { 0xAFBE8876 }
else if cfg!(feature = "psp_420") { 0x3B6F05DC }
else if cfg!(feature = "psp_395") { 0x8B356F2A }
else if cfg!(feature = "psp_380") { 0x40C91389 }
else { 0xB6D61D02 }
)]
pub unsafe fn sceKernelFreePartitionMemory(block_id: MemoryBlockId) -> SceResult<u32>;
#[nid(if cfg!(feature = "psp_660") { 0xFAF29F34 }
else if cfg!(feature = "psp_630") { 0xE5799DEE }
else if cfg!(feature = "psp_600") { 0x442F5709 }
else if cfg!(feature = "psp_570") { 0xD8C6965E }
else if cfg!(feature = "psp_500") { 0x22AD1BD6 }
else if cfg!(feature = "psp_420") { 0xB7FB5272 }
else if cfg!(feature = "psp_395") { 0xDB6C07E8 }
else if cfg!(feature = "psp_380") { 0x226C2C30 }
else { 0x2A3E5280 }
)]
pub safe fn sceKernelQueryMemoryInfo(
addr: SceSize, partition_id: &mut SceIsize, block_id: &mut SceIsize,
) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xC886B169 }
else if cfg!(feature = "psp_630") { 0x5E8DCA05 }
else if cfg!(feature = "psp_600") { 0xFE9BC18B }
else if cfg!(feature = "psp_570") { 0xFAD96D1C }
else if cfg!(feature = "psp_500") { 0x7165B995 }
else if cfg!(feature = "psp_420") { 0x8ACC368A }
else if cfg!(feature = "psp_395") { 0x764C9811 }
else if cfg!(feature = "psp_380") { 0xEE1718BC }
else { 0x3FC9AE6A }
)]
pub safe fn sceKernelDevkitVersion() -> u32;
#[nid(if cfg!(feature = "psp_660") { 0xB4F00CB5 }
else if cfg!(feature = "psp_630") { 0xF0E0AB7A }
else if cfg!(feature = "psp_600") { 0xB9796F69 }
else if cfg!(feature = "psp_570") { 0xF3A2E92B }
else if cfg!(feature = "psp_500") { 0x2CFF6F90 }
else if cfg!(feature = "psp_420") { 0x1DFCB40D }
else if cfg!(feature = "psp_395") { 0x12720EDA }
else if cfg!(feature = "psp_380") { 0x9110439F }
else { 0xFC114573 }
)]
pub safe fn sceKernelGetCompiledSdkVersion() -> u32;
#[nid(if cfg!(feature = "psp_660") { 0xC4EEAF20 }
else if cfg!(feature = "psp_630") { 0xF5E82409 }
else if cfg!(feature = "psp_600") { 0xE057A674 }
else if cfg!(feature = "psp_570") { 0x81E4AB5E }
else if cfg!(feature = "psp_500") { 0x940FCB99 }
else if cfg!(feature = "psp_420") { 0x305864CE }
else if cfg!(feature = "psp_395") { 0x78DAF618 }
else if cfg!(feature = "psp_380") { 0xECFE305B }
else { 0x55A40B2C }
)]
pub safe fn sceKernelQueryMemoryPartitionInfo(
partition_id: MemoryPartitionId, info: &mut MemoryPartitionInfo,
) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x0115B0F8 }
else if cfg!(feature = "psp_630") { 0x7BE9653E }
else if cfg!(feature = "psp_600") { 0x35588461 }
else if cfg!(feature = "psp_570") { 0xB2D14F3B }
else if cfg!(feature = "psp_500") { 0x182E3565 }
else if cfg!(feature = "psp_420") { 0x869EBE58 }
else if cfg!(feature = "psp_395") { 0x205AD4BC }
else if cfg!(feature = "psp_380") { 0x40F41273 }
else { 0x9697CD32 }
)]
pub safe fn sceKernelPartitionTotalFreeMemSize(partition_id: MemoryPartitionId) -> SceSize;
#[nid(if cfg!(feature = "psp_660") { 0x13F4A0DE }
else if cfg!(feature = "psp_630") { 0xE10F21CF }
else if cfg!(feature = "psp_600") { 0xA25BF7A1 }
else if cfg!(feature = "psp_570") { 0xBCDA7C0A }
else if cfg!(feature = "psp_500") { 0x7A225A27 }
else if cfg!(feature = "psp_420") { 0xE4E881B1 }
else if cfg!(feature = "psp_395") { 0x651733CE }
else if cfg!(feature = "psp_380") { 0x8C2C0E71 }
else { 0xE6581468 }
)]
pub safe fn sceKernelPartitionMaxFreeMemSize(partition_id: MemoryPartitionId) -> SceSize;
#[nid(if cfg!(feature = "psp_660") { 0xEA1CABF1 }
else if cfg!(feature = "psp_630") { 0x0FCC1DB5 }
else if cfg!(feature = "psp_600") { 0x22CD6BE7 }
else if cfg!(feature = "psp_570") { 0x794ADE01 }
else if cfg!(feature = "psp_500") { 0xC71F5C50 }
else if cfg!(feature = "psp_420") { 0x82130FB4 }
else if cfg!(feature = "psp_395") { 0xEE6084E0 }
else if cfg!(feature = "psp_380") { 0x8C0EEB1A }
else { 0xA2A65F0E }
)]
pub safe fn sceKernelFillFreeBlock(partition_id: MemoryPartitionId, val: u32) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x83B5226D }
else if cfg!(feature = "psp_630") { 0x00E9A04A }
else if cfg!(feature = "psp_600") { 0x31DFE03F }
else if cfg!(feature = "psp_570") { 0xA7743EA4 }
else if cfg!(feature = "psp_500") { 0x73546131 }
else if cfg!(feature = "psp_420") { 0x8B66B075 }
else if cfg!(feature = "psp_395") { 0x6E085C78 }
else if cfg!(feature = "psp_380") { 0xBBD786DD }
else { 0xB2C7AA36 }
)]
pub unsafe fn sceKernelSetDdrMemoryProtection(
addr: SceSize, size: SceSize, prot: u32,
) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x58148F07 }
else if cfg!(feature = "psp_630") { 0xAF85EB1B }
else if cfg!(feature = "psp_600") { 0xC6A782DA }
else if cfg!(feature = "psp_570") { 0x37878371 }
else if cfg!(feature = "psp_500") { 0x4F47A4AD }
else if cfg!(feature = "psp_420") { 0x4F92E72C }
else if cfg!(feature = "psp_395") { 0x226457D6 }
else if cfg!(feature = "psp_380") { 0xFD2A7114 }
else { 0x1C1FBFE7 }
)]
pub unsafe fn sceKernelCreateHeap(
partition_id: MemoryPartitionId, size: SceSize, flags: HeapCreateFlag, name: *const c_char,
) -> SceResult<HeapId>;
#[nid(if cfg!(feature = "psp_660") { 0x23D81675 }
else if cfg!(feature = "psp_630") { 0x6D161EE2 }
else if cfg!(feature = "psp_600") { 0x96BFE779 }
else if cfg!(feature = "psp_570") { 0x6CC6A838 }
else if cfg!(feature = "psp_500") { 0xFDF96599 }
else if cfg!(feature = "psp_420") { 0x17AA94CD }
else if cfg!(feature = "psp_395") { 0xED52C3A2 }
else if cfg!(feature = "psp_380") { 0x6986B4E3 }
else { 0x636C953B }
)]
pub unsafe fn sceKernelAllocHeapMemory(heap_id: HeapId, size: SceSize) -> *mut c_void;
#[nid(if cfg!(feature = "psp_660") { 0xF2284ECC }
else if cfg!(feature = "psp_630") { 0x25C56981 }
else if cfg!(feature = "psp_600") { 0x191C6F98 }
else if cfg!(feature = "psp_570") { 0x0B3AC38F }
else if cfg!(feature = "psp_500") { 0x36960E64 }
else if cfg!(feature = "psp_420") { 0xCFE8F6A1 }
else if cfg!(feature = "psp_395") { 0x8E2EA487 }
else if cfg!(feature = "psp_380") { 0x3B2A4D7F }
else { 0xEB7A74DB }
)]
pub unsafe fn sceKernelAllocHeapMemoryWithOption(
heap_id: HeapId,
size: SceSize,
options: Option<&HeapAllocOptions>,
) -> *mut c_void;
#[nid(if cfg!(feature = "psp_660") { 0x87C2AB85 }
else if cfg!(feature = "psp_630") { 0xDB836ADB }
else if cfg!(feature = "psp_600") { 0xC2A8C491 }
else if cfg!(feature = "psp_570") { 0x253FA9A4 }
else if cfg!(feature = "psp_500") { 0xAB439400 }
else if cfg!(feature = "psp_420") { 0xE3EDC89C }
else if cfg!(feature = "psp_395") { 0x27CDFCC9 }
else if cfg!(feature = "psp_380") { 0xB6082F0D }
else { 0x7B749390 }
)]
pub unsafe fn sceKernelFreeHeapMemory(heap_id: HeapId, mem_block: *mut c_void)
-> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xDD6512D0 }
else if cfg!(feature = "psp_630") { 0xF9475C1A }
else if cfg!(feature = "psp_600") { 0x9BAA857E }
else if cfg!(feature = "psp_570") { 0xCEB7BA62 }
else if cfg!(feature = "psp_500") { 0x386D0EB3 }
else if cfg!(feature = "psp_420") { 0x5450808B }
else if cfg!(feature = "psp_395") { 0x7A5B790E }
else if cfg!(feature = "psp_380") { 0x079C9E14 }
else { 0xC9805775 }
)]
pub unsafe fn sceKernelDeleteHeap(heap_id: HeapId) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x01810023 }
else if cfg!(feature = "psp_630") { 0x61F1BD6F }
else if cfg!(feature = "psp_600") { 0xA60B6316 }
else if cfg!(feature = "psp_570") { 0xFED328EF }
else if cfg!(feature = "psp_500") { 0xC53F4D35 }
else if cfg!(feature = "psp_420") { 0xCE83B972 }
else if cfg!(feature = "psp_395") { 0x2F0022EA }
else if cfg!(feature = "psp_380") { 0x3DBBB447 }
else { 0xA823047E }
)]
pub safe fn sceKernelHeapTotalFreeSize(heap_id: HeapId) -> SceResult<SceSize>;
#[nid(if cfg!(feature = "psp_660") { 0x79BD1975 }
else if cfg!(feature = "psp_630") { 0x54DEFDA7 }
else if cfg!(feature = "psp_600") { 0x6FDEF86F }
else if cfg!(feature = "psp_570") { 0xE9AA9A96 }
else if cfg!(feature = "psp_500") { 0x28CDFAEC }
else if cfg!(feature = "psp_420") { 0x74411250 }
else if cfg!(feature = "psp_395") { 0x655EA559 }
else if cfg!(feature = "psp_380") { 0x7EF4BDCB }
else { 0x002BA296 }
)]
pub safe fn sceKernelQueryHeapInfo(heap_id: HeapId, info: &mut HeapInfo) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x476B244F }
else if cfg!(feature = "psp_630") { 0xD94A5183 }
else if cfg!(feature = "psp_600") { 0x3988900F }
else if cfg!(feature = "psp_570") { 0x9ED920A5 }
else if cfg!(feature = "psp_500") { 0x3221FDE9 }
else if cfg!(feature = "psp_420") { 0xBC733E1C }
else if cfg!(feature = "psp_395") { 0x3443547F }
else if cfg!(feature = "psp_380") { 0x88F6A684 }
else { 0x03808C51 }
)]
pub unsafe fn sceKernelQueryLowheapInfo(
heap_block: *mut HeapBlock, info: &mut LowHeapInfo,
) -> SceResult<SceSize>;
#[nid(if cfg!(feature = "psp_660") { 0x07C586A1 }
else if cfg!(feature = "psp_630") { 0x458A70B5 }
else if cfg!(feature = "psp_600") { 0x864EBFD7 }
else if cfg!(feature = "psp_570") { 0xBD444810 }
else if cfg!(feature = "psp_500") { 0xDA07DC6E }
else if cfg!(feature = "psp_420") { 0x4B666E99 }
else if cfg!(feature = "psp_395") { 0x538068EF }
else if cfg!(feature = "psp_380") { 0xA3B0B6BC }
else { 0x6373995D }
)]
pub safe fn sceKernelGetModel() -> PspHardwareModel;
#[nid(if cfg!(feature = "psp_660") { 0x36C503A9 }
else if cfg!(feature = "psp_630") { 0x6D336C84 }
else if cfg!(feature = "psp_600") { 0x2E0F38E5 }
else if cfg!(feature = "psp_570") { 0xD9B3E1CE }
else if cfg!(feature = "psp_500") { 0xC3EB9D57 }
else if cfg!(feature = "psp_420") { 0x74D7B1BF }
else if cfg!(feature = "psp_395") { 0x4823B9D9 }
else if cfg!(feature = "psp_380") { 0xA48F9782 }
else { 0x452E3696 }
)]
pub safe fn sceKernelGetSystemStatus() -> u32;
#[nid(if cfg!(feature = "psp_660") { 0x521AC5A4 }
else if cfg!(feature = "psp_630") { 0x604C20C4 }
else if cfg!(feature = "psp_600") { 0x98ACDE01 }
else if cfg!(feature = "psp_570") { 0x300BF4A3 }
else if cfg!(feature = "psp_500") { 0x578ED40F }
else if cfg!(feature = "psp_420") { 0x795B57DA }
else if cfg!(feature = "psp_395") { 0x15645B7F }
else if cfg!(feature = "psp_380") { 0xD26FFD63 }
else { 0x95F5E8DA }
)]
pub unsafe fn sceKernelSetSystemStatus(new_status: u32) -> u32;
#[nid(if cfg!(feature = "psp_660") { 0xEF29061C }
else if cfg!(feature = "psp_630") { 0x38F4EBDC }
else if cfg!(feature = "psp_600") { 0x2F15F149 }
else if cfg!(feature = "psp_570") { 0x2694D47F }
else if cfg!(feature = "psp_500") { 0x0D547E7F }
else if cfg!(feature = "psp_420") { 0xB7BB3534 }
else if cfg!(feature = "psp_395") { 0xB3C487AF }
else if cfg!(feature = "psp_380") { 0xB1634112 }
else { 0xCD617A94 }
)]
pub safe fn sceKernelGetGameInfo() -> NonNull<GameInfo>;
#[nid(if cfg!(feature = "psp_660") { 0xB9B7281A }
else if cfg!(feature = "psp_630") { 0xD9B4E550 }
else if cfg!(feature = "psp_600") { 0xCA852144 }
else if cfg!(feature = "psp_570") { 0x4B5A92C7 }
else if cfg!(feature = "psp_500") { 0x9D87D5B3 }
else if cfg!(feature = "psp_420") { 0x0A1A5C1C }
else if cfg!(feature = "psp_395") { 0x8B26A91E }
else if cfg!(feature = "psp_380") { 0xAFDB003A }
else { 0x97B18FA8 }
)]
pub unsafe fn sceKernelCopyGameInfo(info: *mut GameInfo) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xF3BDB718 }
else if cfg!(feature = "psp_630") { 0x9C6BBA4B }
else if cfg!(feature = "psp_600") { 0x1DFFBF56 }
else if cfg!(feature = "psp_570") { 0xD7E47ED6 }
else if cfg!(feature = "psp_500") { 0xC2460DD5 }
else if cfg!(feature = "psp_420") { 0xFD35BB74 }
else if cfg!(feature = "psp_395") { 0xC3A6C02A }
else if cfg!(feature = "psp_380") { 0xB8637A4B }
else { 0xF91FE6AA }
)]
pub unsafe fn sceKernelSetParamSfo(umd_param_sfo: *const [u8; 16]);
#[nid(if cfg!(feature = "psp_660") { 0x474CA24F }
else if cfg!(feature = "psp_630") { 0x5B7174DF }
else if cfg!(feature = "psp_600") { 0x040CDA4C }
else if cfg!(feature = "psp_570") { 0x4FB80176 }
else if cfg!(feature = "psp_500") { 0x0171E32C }
else if cfg!(feature = "psp_420") { 0xF4C378B7 }
else if cfg!(feature = "psp_395") { 0x4C55435B }
else if cfg!(feature = "psp_380") { 0x9AB85DA9 }
else { 0xCE8D3DB3 }
)]
pub safe fn sceKernelGetQTGP2(qtgp2: &mut [u8; 8]) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xA03CB480 }
else if cfg!(feature = "psp_630") { 0x9E5B1ACB }
else if cfg!(feature = "psp_600") { 0xD391637C }
else if cfg!(feature = "psp_570") { 0x1FE5F49C }
else if cfg!(feature = "psp_500") { 0x58911B8B }
else if cfg!(feature = "psp_420") { 0x4DBD3833 }
else if cfg!(feature = "psp_395") { 0x797E7D55 }
else if cfg!(feature = "psp_380") { 0xCDBFF97E }
else { 0x55E4719C }
)]
pub unsafe fn sceKernelSetQTGP2(qtgp2: *mut [u8; 8]) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x43E0A861 }
else if cfg!(feature = "psp_630") { 0x80C7689B }
else if cfg!(feature = "psp_600") { 0x2F756CC8 }
else if cfg!(feature = "psp_570") { 0x193E81C1 }
else if cfg!(feature = "psp_500") { 0x80BD86BE }
else if cfg!(feature = "psp_420") { 0x1EA7EB34 }
else if cfg!(feature = "psp_395") { 0x2C086CA7 }
else if cfg!(feature = "psp_380") { 0xB015F84F }
else { 0x6D8E0CDF }
)]
pub safe fn sceKernelGetQTGP3(qtgp3: &mut [u8; 16]) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xFC639A2B }
else if cfg!(feature = "psp_630") { 0x9F154FA1 }
else if cfg!(feature = "psp_600") { 0xB00D1EC2 }
else if cfg!(feature = "psp_570") { 0x699F8B1A }
else if cfg!(feature = "psp_500") { 0xA7188E84 }
else if cfg!(feature = "psp_420") { 0xCF66F072 }
else if cfg!(feature = "psp_395") { 0x887ED503 }
else if cfg!(feature = "psp_380") { 0x1385A8F2 }
else { 0xC7E57B9C }
)]
pub unsafe fn sceKernelSetQTGP3(qtgp3: *mut [u8; 16]) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x4972F9D1 }
else if cfg!(feature = "psp_630") { 0x966EB2BE }
else if cfg!(feature = "psp_600") { 0x1205AE0C }
else if cfg!(feature = "psp_570") { 0xDB5D4EFB }
else if cfg!(feature = "psp_500") { 0x76DD5020 }
else if cfg!(feature = "psp_420") { 0x78A5301C }
else if cfg!(feature = "psp_395") { 0x39240A0C }
else if cfg!(feature = "psp_380") { 0xEE010E3A }
else { 0xA262FEF0 }
)]
pub safe fn sceKernelGetAllowReplaceUmd(allow_replace_umd: &mut u32) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xF19BA38D }
else if cfg!(feature = "psp_630") { 0x72DB42EC }
else if cfg!(feature = "psp_600") { 0x7EF1DC3C }
else if cfg!(feature = "psp_570") { 0xC8510803 }
else if cfg!(feature = "psp_500") { 0xFE94D4E3 }
else if cfg!(feature = "psp_420") { 0x0112B75F }
else if cfg!(feature = "psp_395") { 0x60B26714 }
else if cfg!(feature = "psp_380") { 0x8B9178EF }
else { 0xCBB05241 }
)]
pub safe fn sceKernelSetAllowReplaceUmd(allow_replace_umd: u32);
#[nid(if cfg!(feature = "psp_660") { 0xBFD53FB7 }
else if cfg!(feature = "psp_630") { 0xF7125FA4 }
else if cfg!(feature = "psp_600") { 0xBD71F23A }
else if cfg!(feature = "psp_570") { 0x88D5CE7E }
else if cfg!(feature = "psp_500") { 0x3E0ED0E3 }
else if cfg!(feature = "psp_420") { 0xE88364A3 }
else if cfg!(feature = "psp_395") { 0xC6FABB66 }
else if cfg!(feature = "psp_380") { 0xDB9BE041 }
else { 0x7ECBDBD9 }
)]
pub safe fn sceKernelGetDNAS() -> u32;
#[nid(if cfg!(feature = "psp_660") { 0x982A4779 }
else if cfg!(feature = "psp_630") { 0xED6B1D87 }
else if cfg!(feature = "psp_600") { 0xDCFF8AE5 }
else if cfg!(feature = "psp_570") { 0x16470B81 }
else if cfg!(feature = "psp_500") { 0x674A325B }
else if cfg!(feature = "psp_420") { 0xF46AD7A3 }
else if cfg!(feature = "psp_395") { 0xC5894250 }
else if cfg!(feature = "psp_380") { 0x06BB6385 }
else { 0x9C304ED7 }
)]
pub safe fn sceKernelSetDNAS(dnas: u32);
#[nid(0x1404C1AA)]
#[cfg(feature = "psp_660")]
pub safe fn sceKernelSetUmdCacheOn(umd_cache_on: u32);
#[nid(if cfg!(feature = "psp_660") { 0xC90B0992 }
else if cfg!(feature = "psp_630") { 0x3DE3C6DF }
else if cfg!(feature = "psp_600") { 0xF5780DAA }
else if cfg!(feature = "psp_570") { 0x9FA23D35 }
else if cfg!(feature = "psp_500") { 0xD7E24299 }
else if cfg!(feature = "psp_420") { 0x97337E44 }
else if cfg!(feature = "psp_395") { 0x523E300A }
else if cfg!(feature = "psp_380") { 0xE151223E }
else { 0xCF4DE78C }
)]
pub unsafe fn sceKernelGetUIDcontrolBlock(
id: SceUid, uid_control_block: NonNull<*mut UidControlBlock>,
) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x44BDF332 }
else if cfg!(feature = "psp_630") { 0xCB9582C4 }
else if cfg!(feature = "psp_600") { 0xD17C6005 }
else if cfg!(feature = "psp_570") { 0x7CE7BB12 }
else if cfg!(feature = "psp_500") { 0x18DE11D5 }
else if cfg!(feature = "psp_420") { 0x22F01719 }
else if cfg!(feature = "psp_395") { 0x8BA095E5 }
else if cfg!(feature = "psp_380") { 0x120433CF }
else { 0x41FFC7F9 }
)]
pub unsafe fn sceKernelGetUIDcontrolBlockWithType(
id: SceUid, kind: NonNull<UidControlBlock>,
uid_control_block: NonNull<*mut UidControlBlock>,
) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xAC12F678 }
else if cfg!(feature = "psp_630") { 0x41E50FA6 }
else if cfg!(feature = "psp_600") { 0xCCD58B8B }
else if cfg!(feature = "psp_570") { 0x28FCE6A4 }
else if cfg!(feature = "psp_500") { 0x213C3E27 }
else if cfg!(feature = "psp_420") { 0x0899FBF8 }
else if cfg!(feature = "psp_395") { 0x2A2E7057 }
else if cfg!(feature = "psp_380") { 0x54247DD8 }
else { 0x536AD5E1 }
)]
pub safe fn sceKernelGetUidmanCB() -> NonNull<UidList>;
#[nid(if cfg!(feature = "psp_660") { 0x361F0F88 }
else if cfg!(feature = "psp_630") { 0x5E58B140 }
else if cfg!(feature = "psp_600") { 0x6C00F0CC }
else if cfg!(feature = "psp_570") { 0x283B0E0A }
else if cfg!(feature = "psp_500") { 0xF8F2B3A6 }
else if cfg!(feature = "psp_420") { 0xA6471B40 }
else if cfg!(feature = "psp_395") { 0xCDE08426 }
else if cfg!(feature = "psp_380") { 0xC80E5BE1 }
else { 0x8F20C4C0 }
)]
pub unsafe fn sceKernelDeleteUID(id: SceUid) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x4A325AA0 }
else if cfg!(feature = "psp_630") { 0x48F77207 }
else if cfg!(feature = "psp_600") { 0x3B560EE6 }
else if cfg!(feature = "psp_570") { 0x7528C8B1 }
else if cfg!(feature = "psp_500") { 0xC40E2333 }
else if cfg!(feature = "psp_420") { 0x643160C0 }
else if cfg!(feature = "psp_395") { 0x23D6BCB6 }
else if cfg!(feature = "psp_380") { 0x9E7265D9 }
else { 0x38495D84 }
)]
pub safe fn sceKernelGetInitialRandomValue() -> u32;
#[nid(if cfg!(feature = "psp_660") { 0x96A3CE2C }
else if cfg!(feature = "psp_630") { 0xE0A74F2D }
else if cfg!(feature = "psp_600") { 0xC5485286 }
else if cfg!(feature = "psp_570") { 0x5BD1775C }
else if cfg!(feature = "psp_500") { 0x1D849D0E }
else if cfg!(feature = "psp_420") { 0x1FF2AF70 }
else if cfg!(feature = "psp_395") { 0x63182EBF }
else if cfg!(feature = "psp_380") { 0xFD347C2B }
else { 0x29A5899B }
)]
pub unsafe fn sceKernelSetRebootKernel(
reboot_kernel_fn: unsafe extern "C" fn(_: *mut c_void) -> i32,
) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xE73FBC0B }
else if cfg!(feature = "psp_630") { 0xA51E2C33 }
else if cfg!(feature = "psp_600") { 0xB0ED0CCD }
else if cfg!(feature = "psp_570") { 0x1DDEFF98 }
else if cfg!(feature = "psp_500") { 0xA9EDD556 }
else if cfg!(feature = "psp_420") { 0x253141AD }
else if cfg!(feature = "psp_395") { 0x9BE6AF16 }
else if cfg!(feature = "psp_380") { 0x5782A1A2 }
else { 0xF4390489 }
)]
pub unsafe fn sceKernelRebootKernel(args: *mut c_void) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0x310802A9 }
else if cfg!(feature = "psp_630") { 0x25A760F0 }
else if cfg!(feature = "psp_600") { 0x02AEA33F }
else if cfg!(feature = "psp_570") { 0xE2FAB093 }
else if cfg!(feature = "psp_500") { 0x4803B7F1 }
else if cfg!(feature = "psp_420") { 0x80E8C038 }
else if cfg!(feature = "psp_395") { 0x4CCDD642 }
else if cfg!(feature = "psp_380") { 0xAB1F7C42 }
else { 0x419DB8F4 }
)]
pub unsafe fn sceKernelRegisterGetIdFunc(
func: unsafe extern "C" fn(path: *const c_char, id: *mut c_char) -> SceResult<i32>,
) -> SceResult<()>;
#[nid(if cfg!(feature = "psp_660") { 0xD0C1460D }
else if cfg!(feature = "psp_630") { 0x288B090A }
else if cfg!(feature = "psp_600") { 0xC10C3C26 }
else if cfg!(feature = "psp_570") { 0xD25644E1 }
else if cfg!(feature = "psp_500") { 0x636CD5CF }
else if cfg!(feature = "psp_420") { 0x667303DD }
else if cfg!(feature = "psp_395") { 0xD7FCE447 }
else if cfg!(feature = "psp_380") { 0x88021868 }
else { 0xA1ACEA31 }
)]
pub unsafe fn sceKernelGetId(path: *const c_char, id: *mut c_char) -> SceResult<i32>;
#[nid(0x26F96157)]
pub safe fn sceKernelSysMemDump();
#[nid(0x6D6200DD)]
pub safe fn sceKernelSysMemDumpBlock();
#[nid(0x621037F5)]
pub safe fn sceKernelSysMemDumpTail();
}
impl MemoryBlockId {
pub const fn from_raw(raw: u32) -> Option<Self> {
if let 0..=0x7FFFFFFF = raw {
Some(unsafe { Self::from_raw_unchecked(raw) })
} else {
None
}
}
#[inline]
pub const unsafe fn from_raw_unchecked(raw: u32) -> Self {
Self(unsafe { SceUid::from_raw_unchecked(raw) })
}
#[inline]
pub const fn to_inner(self) -> u32 {
unsafe { core::mem::transmute(self) }
}
}
impl crate::private::Sealed for MemoryBlockId {}
unsafe impl SceResultOk for MemoryBlockId {
unsafe fn handle_ok_value(ok_value: u32) -> Result<Self, SceError> {
unsafe { SceUid::handle_ok_value(ok_value).map(Self) }
}
}
unsafe impl SceIntoOkValue for MemoryBlockId {
fn into_ok_value(self) -> u32 {
self.to_inner()
}
}
impl HeapId {
pub const fn from_raw(raw: u32) -> Option<Self> {
if let 0..=0x7FFFFFFF = raw {
Some(unsafe { Self::from_raw_unchecked(raw) })
} else {
None
}
}
#[inline]
pub const unsafe fn from_raw_unchecked(raw: u32) -> Self {
Self(unsafe { SceUid::from_raw_unchecked(raw) })
}
#[inline]
pub const fn to_inner(self) -> u32 {
unsafe { core::mem::transmute(self) }
}
}
impl crate::private::Sealed for HeapId {}
unsafe impl SceResultOk for HeapId {
unsafe fn handle_ok_value(ok_value: u32) -> Result<Self, SceError> {
unsafe { SceUid::handle_ok_value(ok_value).map(Self) }
}
}
unsafe impl SceIntoOkValue for HeapId {
fn into_ok_value(self) -> u32 {
self.to_inner()
}
}
impl crate::private::Sealed for HeapCreateFlag {}
unsafe impl SceResultOk for HeapCreateFlag {
unsafe fn handle_ok_value(ok_value: u32) -> Result<Self, SceError> {
Ok(Self::from_bits_retain(ok_value))
}
}
unsafe impl SceIntoOkValue for HeapCreateFlag {
fn into_ok_value(self) -> u32 {
self.bits()
}
}
impl Default for MemoryPartitionInfo {
fn default() -> Self {
Self {
size: size_of::<Self>(),
start_addr: Default::default(),
mem_size: Default::default(),
attributes: Default::default(),
}
}
}
impl Default for HeapInfo {
fn default() -> Self {
Self {
size: size_of::<Self>(),
name: Default::default(),
permission: Default::default(),
attribute: Default::default(),
heap_size: Default::default(),
total_size: Default::default(),
total_free_size: Default::default(),
max_free_size: Default::default(),
num_heaps: Default::default(),
heap_blocks: Default::default(),
}
}
}
impl Default for LowHeapInfo {
fn default() -> Self {
Self {
size: size_of::<Self>(),
heap_size: Default::default(),
used_size: Default::default(),
total_free_size: Default::default(),
max_free_size: Default::default(),
block_count: Default::default(),
info_block: Default::default(),
}
}
}
impl Default for MemoryBlockAllocOptions {
fn default() -> Self {
Self {
size: size_of::<Self>(),
}
}
}
impl Default for HeapAllocOptions {
fn default() -> Self {
Self {
size: size_of::<Self>(),
align: 1,
}
}
}
impl Default for GameInfo {
fn default() -> Self {
Self {
size: size_of::<Self>(),
flags: Default::default(),
umd_param_sfo: Default::default(),
expect_umd_data: Default::default(),
qtgp2: Default::default(),
qtgp3: Default::default(),
allow_replace_umd: Default::default(),
title_id: Default::default(),
parental_level: Default::default(),
vsh_version: Default::default(),
umd_cache_on: Default::default(),
compiled_sdk_version: Default::default(),
compiler_version: Default::default(),
dnas: Default::default(),
utility_location: Default::default(),
vsh_bootfilename: [0; 64],
gamedata_id: Default::default(),
app_ver: Default::default(),
subscription_validity: Default::default(),
bootable: Default::default(),
opnssmp_ver: Default::default(),
}
}
}