diff --git a/sys/dev/dev_dce.pas b/sys/dev/dev_dce.pas index 166c3ad0..949235e0 100644 --- a/sys/dev/dev_dce.pas +++ b/sys/dev/dev_dce.pas @@ -414,7 +414,7 @@ var begin Result:=0; - //Writeln('dce_flip_control(',data^.id,')'); + Writeln('dce_flip_control(',data^.id,')'); //id -> 0..0x24 @@ -1145,7 +1145,7 @@ Function dce_ioctl(dev:p_cdev;cmd:QWORD;data:Pointer;fflag:Integer):Integer; begin Result:=0; - Writeln('dce_ioctl(0x',HexStr(cmd,8),')'); + //Writeln('dce_ioctl(0x',HexStr(cmd,8),')'); case cmd of $C0308203:Result:=dce_flip_control (dev,data); //SCE_SYS_DCE_IOCTL_FLIP_CONTROL diff --git a/sys/dev/dev_dmem.pas b/sys/dev/dev_dmem.pas index d965d9be..029695fa 100644 --- a/sys/dev/dev_dmem.pas +++ b/sys/dev/dev_dmem.pas @@ -42,6 +42,7 @@ type len :QWORD; //in align:QWORD; //in mtype:DWORD; + _alig:DWORD; end; PReleaseDirectMemory=^TReleaseDirectMemory; @@ -129,6 +130,11 @@ begin end; end; + $C0208004: //sceKernelGetDirectMemoryType + begin + Result:=dmem_map_get_memory_type(dmap^.dmem,data); + end; + else begin print_error_td('dmem_ioctl(0x'+HexStr(cmd,8)+')'); diff --git a/sys/kern/kern_rtld.pas b/sys/kern/kern_rtld.pas index 7f51b8b0..26f5d9d5 100644 --- a/sys/kern/kern_rtld.pas +++ b/sys/kern/kern_rtld.pas @@ -341,8 +341,15 @@ begin if (self_hdr^.File_size>obj_size) then begin - FreeMem(self_hdr); - Exit(EFAULT); + //resize + self_hdr:=ReAllocMem(self_hdr,self_hdr^.File_size); + //fill zeros + FillChar(PBYTE(self_hdr)[obj_size],self_hdr^.File_size-obj_size,0); + //new size + obj_size:=self_hdr^.File_size; + + //FreeMem(self_hdr); + //Exit(EFAULT); end; count:=self_hdr^.Num_Segments; diff --git a/sys/vm/dmem_map.pas b/sys/vm/dmem_map.pas index b700d4ec..1480b205 100644 --- a/sys/vm/dmem_map.pas +++ b/sys/vm/dmem_map.pas @@ -80,13 +80,13 @@ function dmem_map_lookup_entry( function dmem_map_insert( map :p_dmem_map; - vaddr :DWORD; start :DWORD; __end :DWORD; m_type:DWORD):Integer; Function dmem_map_query_available(map:p_dmem_map;start,__end,align:QWORD;var oaddr,osize:QWORD):Integer; Function dmem_map_query(map:p_dmem_map;offset:QWORD;flags,id:Integer;info:Pointer;size:QWORD):Integer; +Function dmem_map_get_memory_type(map:p_dmem_map;info:Pointer):Integer; Function dmem_map_alloc(map:p_dmem_map;start,__end,len,align:QWORD;mtype:DWORD;var oaddr:QWORD):Integer; Function dmem_map_release(map:p_dmem_map;start,len:QWORD;check:Boolean):Integer; @@ -514,7 +514,6 @@ end; function dmem_map_insert( map :p_dmem_map; - vaddr :DWORD; start :DWORD; __end :DWORD; m_type:DWORD):Integer; @@ -674,8 +673,8 @@ begin end; type - pSceKernelDirectMemoryQueryInfo=^SceKernelDirectMemoryQueryInfo; - SceKernelDirectMemoryQueryInfo=packed record + pSceKernelDirectMemoryQueryInfo=^TSceKernelDirectMemoryQueryInfo; + TSceKernelDirectMemoryQueryInfo=packed record start:QWORD; __end:QWORD; mtype:Integer; @@ -684,8 +683,9 @@ type Function dmem_map_query(map:p_dmem_map;offset:QWORD;flags,id:Integer;info:Pointer;size:QWORD):Integer; var - data:SceKernelDirectMemoryQueryInfo; + data:TSceKernelDirectMemoryQueryInfo; entry:p_dmem_map_entry; + index:DWORD; begin Result:=0; @@ -696,7 +696,7 @@ begin Assert(id=0,'dmem_map_query (id<>0)'); - data:=Default(SceKernelDirectMemoryQueryInfo); + data:=Default(TSceKernelDirectMemoryQueryInfo); Result:=EACCES; @@ -705,14 +705,16 @@ begin if (map^.root<>nil) then begin - map^.root:=dmem_map_entry_splay(OFF_TO_IDX(offset), map^.root); + index:=OFF_TO_IDX(offset); + + map^.root:=dmem_map_entry_splay(index, map^.root); entry:=map^.root; if ((flags and 1)=0) then begin if (entry<>nil) then - if (entry^.start<=offset) and - (entry^.__end>offset) then + if (entry^.start<=index) and + (entry^.__end>index) then begin Result:=0; end; @@ -721,7 +723,7 @@ begin while (entry<>nil) and (entry<>@map^.header) do begin if (entry^.m_type<>DWORD(-1)) and - (entry^.__end>offset) then + (entry^.__end>index) then begin Result:=0; Break; @@ -732,8 +734,8 @@ begin if (Result=0) then begin - data.start:=entry^.start; - data.__end:=entry^.__end; + data.start:=IDX_TO_OFF(entry^.start); + data.__end:=IDX_TO_OFF(entry^.__end); data.mtype:=entry^.m_type; end; @@ -743,14 +745,63 @@ begin if (Result<>0) then Exit; - if (size>sizeof(SceKernelDirectMemoryQueryInfo)) then + if (size>sizeof(TSceKernelDirectMemoryQueryInfo)) then begin - size:=sizeof(SceKernelDirectMemoryQueryInfo); + size:=sizeof(TSceKernelDirectMemoryQueryInfo); end; Result:=copyout(@data,info,size); end; +type + PGetDirectMemoryType=^TGetDirectMemoryType; + TGetDirectMemoryType=packed record + start :QWORD; //in + start_out:QWORD; //out + __end_out:QWORD; //out + mtype_out:DWORD; //out + align :Integer; + end; + +Function dmem_map_get_memory_type(map:p_dmem_map;info:Pointer):Integer; +var + data:PGetDirectMemoryType; + entry:p_dmem_map_entry; + index:DWORD; +begin + data:=info; + + Result:=ENOENT; + + dmem_map_lock(map); + + if (map^.root<>nil) then + begin + + index:=OFF_TO_IDX(data^.start); + + map^.root:=dmem_map_entry_splay(index, map^.root); + entry:=map^.root; + + if (entry<>nil) then + if (entry^.start<=index) and + (entry^.__end>index) then + begin + Result:=0; + end; + + if (Result=0) then + begin + data^.start_out:=IDX_TO_OFF(entry^.start); + data^.__end_out:=IDX_TO_OFF(entry^.__end); + data^.mtype_out:=entry^.m_type; + end; + + end; + + dmem_map_unlock(map); +end; + Function dmem_map_alloc(map:p_dmem_map;start,__end,len,align:QWORD;mtype:DWORD;var oaddr:QWORD):Integer; var adr_dw:DWORD; @@ -835,7 +886,7 @@ begin Exit(EAGAIN); end; - Result:=dmem_map_insert(map,0,OFF_TO_IDX(start),OFF_TO_IDX(start+len),mtype); + Result:=dmem_map_insert(map,OFF_TO_IDX(start),OFF_TO_IDX(start+len),mtype); until (Result<>EAGAIN); dmem_map_unlock(map); @@ -1118,7 +1169,7 @@ begin begin dmem_map_delete(map, start, __end); end; - Result:=dmem_map_insert(map, 0, start, __end, m_type); + Result:=dmem_map_insert(map, start, __end, m_type); dmem_map_unlock(map); end;