unit dev_dmem; {$mode ObjFPC}{$H+} {$CALLING SysV_ABI_CDecl} interface uses kern_conf; procedure dmemdev_init(); implementation uses errno, vuio, subr_uio, vm, dmem_map, kern_dmem; type PAvailableDirectMemorySize=^TAvailableDirectMemorySize; TAvailableDirectMemorySize=packed record start:QWORD; //in,out __end:QWORD; //in align:QWORD; //in osize:QWORD; //out end; Function dmem_ioctl(dev:p_cdev;cmd:QWORD;data:Pointer;fflag:Integer):Integer; begin Result:=0; Writeln('dmem_ioctl("',dev^.si_name,'",0x',HexStr(cmd,8),',0x',HexStr(fflag,8),')'); case cmd of $4008800A: //sceKernelGetDirectMemorySize begin PQWORD(data)^:=SCE_KERNEL_MAIN_DMEM_SIZE; end; $C0208016: //sceKernelAvailableDirectMemorySize begin with PAvailableDirectMemorySize(data)^ do begin Result:=dmem_map_query_available(@dmem,start,__end,align,start,osize); end; end; else Assert(False); end; end; Function dmem_mmap(dev:p_cdev;offset:vm_ooffset_t;paddr:p_vm_paddr_t;nprot:Integer;memattr:p_vm_memattr_t):Integer; begin Result:=0; Writeln('dmem_mmap("',dev^.si_name,'",0x',HexStr(offset,8),',0x',HexStr(paddr),',',nprot,')'); Assert(False); end; const dmem_cdevsw:t_cdevsw=( d_version :D_VERSION; d_flags :0; d_name :'dmem'; d_open :nil; d_fdopen :nil; d_close :nil; d_read :nil; d_write :nil; d_ioctl :@dmem_ioctl; d_poll :nil; d_mmap :@dmem_mmap; d_strategy :nil; d_dump :nil; d_kqfilter :nil; d_purge :nil; d_mmap_single:nil; ); procedure dmemdev_init(); var i:Integer; begin For i:=0 to 2 do begin make_dev(@dmem_cdevsw,i,0,0,&777,'dmem%d',[i]); end; end; end.