diff --git a/sys/dev/dev_dce.pas b/sys/dev/dev_dce.pas index d38a950c..8b66f4de 100644 --- a/sys/dev/dev_dce.pas +++ b/sys/dev/dev_dce.pas @@ -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); diff --git a/sys/kern/kern_dmem.pas b/sys/kern/kern_dmem.pas index aea3d1aa..6b05ed09 100644 --- a/sys/kern/kern_dmem.pas +++ b/sys/kern/kern_dmem.pas @@ -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 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; diff --git a/sys/kern/kern_dynlib.pas b/sys/kern/kern_dynlib.pas index 9c16bb1a..928e792b 100644 --- a/sys/kern/kern_dynlib.pas +++ b/sys/kern/kern_dynlib.pas @@ -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); diff --git a/sys/test/project1.lpr b/sys/test/project1.lpr index d3e535d2..75798323 100644 --- a/sys/test/project1.lpr +++ b/sys/test/project1.lpr @@ -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; diff --git a/sys/vm/dmem_map.pas b/sys/vm/dmem_map.pas index b6558c65..891cf63c 100644 --- a/sys/vm/dmem_map.pas +++ b/sys/vm/dmem_map.pas @@ -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;