This commit is contained in:
Pavel 2023-09-02 04:19:46 +03:00
parent 46d4ec8066
commit d25eeb0f53
5 changed files with 121 additions and 18 deletions

View File

@ -41,11 +41,54 @@ type
arg6 :QWORD;
end;
p_resolution_status=^t_resolution_status;
t_resolution_status=packed record
width :DWORD;
heigth :DWORD;
paneWidth :DWORD;
paneHeight :DWORD;
refreshHz :DWORD;
screenSizeInInch:DWORD;
padding:array[0..19] of Byte;
end;
//SCE_VIDEO_OUT_REFRESH_RATE_UNKNOWN = 0,
//SCE_VIDEO_OUT_REFRESH_RATE_23_98HZ = 1,
//SCE_VIDEO_OUT_REFRESH_RATE_50HZ = 2,
//SCE_VIDEO_OUT_REFRESH_RATE_59_94HZ = 3,
//SCE_VIDEO_OUT_REFRESH_RATE_29_97HZ = 6,
//SCE_VIDEO_OUT_REFRESH_RATE_89_91HZ = 35, 0x23
//SCE_VIDEO_OUT_REFRESH_RATE_119_88HZ = 13, 0xD
//refreshRate = 0 SCE_VIDEO_OUT_REFRESH_RATE_UNKNOWN
//refreshRate = 3; result.refreshHz = 0x426fc28f SCE_VIDEO_OUT_REFRESH_RATE_59_94HZ
//refreshRate = 2, result.refreshHz = 0x42480000 SCE_VIDEO_OUT_REFRESH_RATE_50HZ
//refreshRate = 1, result.refreshHz = 0x41bfd70a SCE_VIDEO_OUT_REFRESH_RATE_23_98HZ
//refreshRate = 4, result.refreshHz = 0x41c00000
//refreshRate = 5, result.refreshHz = 0x41f00000
//refreshRate = 6, result.refreshHz = 0x41efc28f SCE_VIDEO_OUT_REFRESH_RATE_29_97HZ
//refreshRate = 7, result.refreshHz = 0x41c80000
//refreshRate = 9, result.refreshHz = 0x42700000
//refreshRate = 10, result.refreshHz = 0x42400000
//refreshRate = 0xb, result.refreshHz = 0x423fcccd
//refreshRate = 0xc, result.refreshHz = 0x42c80000
//refreshRate = 0xd, result.refreshHz = 0x42efc28f SCE_VIDEO_OUT_REFRESH_RATE_119_88HZ
//refreshRate = 0xe, result.refreshHz = 0x42f00000
//refreshRate = 0xf, result.refreshHz = 0x43480000
//refreshRate = 0x10, result.refreshHz = 0x436fc28f
//refreshRate = 0x11, result.refreshHz = 0x43700000
//refreshRate = 0x14, result.refreshHz = 0x413fd70a
//refreshRate = 0x15, result.refreshHz = 0x41400000
//refreshRate = 0x16, result.refreshHz = 0x416fd70a
//refreshRate = 0x17, result.refreshHz = 0x41700000
//refreshRate = 0x23, result.refreshHz = 0x42b3d1ec SCE_VIDEO_OUT_REFRESH_RATE_89_91HZ
Function dce_flip_control(dev:p_cdev;data:p_flip_control_args):Integer;
var
poff:PQWORD;
plen:PQWORD;
len:QWORD;
status:t_resolution_status;
begin
Result:=0;
@ -54,7 +97,7 @@ begin
case data^.id of
0: //video open
begin
if ((data^.arg6=0) and (data^.arg2=0)) then
if (data^.arg6=0) and (data^.arg2=0) then
begin
plen:=Pointer(data^.arg5);
@ -66,10 +109,26 @@ begin
Exit(EINVAL);
end;
5: //UnregisterBufferAttribute
begin
if (data^.arg4=0) and (data^.arg5=0) and (data^.arg6=0) then
begin
//arg2 -> canary
//arg3 -> fid
Writeln('dce_flip_control(UnregisterBufferAttribute):',data^.arg2,' ',data^.arg3);
Exit(0);
end;
Exit(EINVAL);
end;
9:
begin //get page info
if ((data^.arg5=0) and (data^.arg6=0)) then
if (data^.arg5=0) and (data^.arg6=0) then
begin
//arg2 -> canary
poff:=Pointer(data^.arg3); //output offset //4000..3FFC000
plen:=Pointer(data^.arg4); //output len //4000
@ -89,21 +148,55 @@ begin
12:
begin
if ((data^.arg5=0) and (data^.arg6=0)) then
if (data^.arg5=0) and (data^.arg6=0) then
begin
if (data^.arg4=$30) or (data^.arg4=$40) then
begin
//arg2 -> canary
poff:=Pointer(data^.arg3);
len:=0;
Writeln('dce_flip_control(',data^.id,'):wait?');
Exit(0);
Result:=copyout(@len,poff,data^.arg4);
Exit;
end;
end;
Exit(EINVAL);
end;
19: //sceVideoOutGetResolutionStatus
begin
if (data^.arg4=44) then
begin
//arg2 -> canary
//arg3 = &result;
//arg4 = 44;
plen:=Pointer(data^.arg3);
status:=Default(t_resolution_status);
status.width :=1920;
status.heigth :=1080;
status.paneWidth :=1920;
status.paneHeight :=1080;
status.refreshHz :=$426fc28f;
status.screenSizeInInch:=32;
Result:=copyout(@status,plen,data^.arg4);
Exit;
end;
Exit(EINVAL);
end;
31: //set vaddr
begin
//data^.arg3 <- subtype 0..13
//arg2 -> canary
//arg3 <- subtype 0..13
if (data^.arg3>13) then Exit(EINVAL);

View File

@ -94,7 +94,8 @@ uses
vmparam,
vm_map,
kern_authinfo,
kern_thr;
kern_thr,
trap;
//////////
@ -173,7 +174,7 @@ function kern_mmap_dmem(map :vm_map_t;
length:QWORD;
mtype :DWORD;
prot :DWORD;
align :DWORD;
align :QWORD;
flags :DWORD):Integer;
label
_fixed;
@ -187,6 +188,7 @@ var
err:Integer;
begin
Result:=0;
addr^:=9;
if (((phaddr shr 36) > 4) or ((max_valid - phaddr) < length)) then
begin
@ -226,7 +228,7 @@ begin
if (err=0) then
begin
//
addr^:=vaddr;
end else
begin
vm_map_delete(map,vaddr,v_end);
@ -294,7 +296,7 @@ function sys_mmap_dmem(vaddr :Pointer;
var
td:p_kthread;
addr:vm_offset_t;
align:Integer;
align:QWORD;
begin
td:=curkthread;
if (td=nil) then Exit(Pointer(-1));
@ -355,8 +357,9 @@ begin
addr:=$ff0000000;
end;
align:=flags and MAP_ALIGNMENT_SHIFT;
align:=(flags shr MAP_ALIGNMENT_SHIFT) and $1f;
if (align<PAGE_SHIFT) then align:=1;
align:=1 shl align;
end else
begin
//Address range must be all in user VM space.
@ -433,7 +436,8 @@ procedure dmem_vmo_get_type(map:vm_map_t;
sdk_version_big_4ffffff:Boolean);
var
obj:vm_map_object;
start,relofs:QWORD;
start:QWORD;
relofs:Int64;
d_start,d_start2:QWORD;
d_end,d_end2:QWORD;
@ -471,6 +475,7 @@ begin
begin
start :=entry^.start;
relofs:=entry^.offset - start;
if (addr < start) then
begin
addr:=start;
@ -556,7 +561,8 @@ var
td:p_kthread;
map:vm_map_t;
entry,next:vm_map_entry_t;
rbp,rip:PPointer;
rbp:PPointer;
rip:Pointer;
sdk_version_big_4ffffff:Boolean;
is_libsys_call:Boolean;
qinfo:SceKernelVirtualQueryInfo;
@ -566,6 +572,8 @@ begin
td:=curkthread;
if (td=nil) then Exit(-1);
Writeln('sys_virtual_query:',HexStr(addr),' ',flags);
QWORD(addr):=QWORD(addr) and $ffffffffffffc000;
map:=@g_vmspace.vm_map;
@ -599,7 +607,7 @@ begin
if (p_proc.libkernel_start_addr > rip) or
(p_proc.libkernel___end_addr <= rip) then
begin
if (QWORD(rip) - QWORD($7f0000000) < QWORD($800000000)) then
if ((Int64(rip) - Int64($7f0000000)) < Int64($800000000)) then //ET_DYN_LOAD_ADDR_SYS
begin
sdk_version_big_4ffffff:=true;
is_libsys_call :=true;
@ -724,6 +732,7 @@ begin
end;
Writeln(Sizeof(qinfo));
Result:=copyout(@qinfo,info,size);
end;

View File

@ -125,6 +125,8 @@ begin
Result:=copyinstr(symbol,@fsym,sizeof(fsym),nil);
if (Result<>0) then Exit;
Writeln('sys_dynlib_dlsym:',fsym);
dynlibs_lock;
obj:=find_obj_by_handle(handle);

View File

@ -373,6 +373,7 @@ begin
//argv0:='/app0/basic-sample_debug.elf';
//argv0:='/app0/simple.elf';
argv0:='/app0/videoout_basic.elf';
//argv0:='/app0/videoout_cursor.elf';
err:=_execve(argv0,@argv0,nil);
end;

View File

@ -1156,10 +1156,10 @@ begin
dmem_map_lock(map);
if (dmem_map_lookup_entry(map, offset, @entry)) then
if (dmem_map_lookup_entry(map, OFF_TO_IDX(offset), @entry)) then
begin
pstart^:=entry^.start;
p__end^:=entry^.__end;
pstart^:=IDX_TO_OFF(entry^.start);
p__end^:=IDX_TO_OFF(entry^.__end);
pmtype^:=entry^.m_type;
Result:=0;
@ -1169,8 +1169,6 @@ begin
end;
dmem_map_unlock(map);
Result:=0;
end;