diff --git a/sys/kern/kern_dmem.pas b/sys/kern/kern_dmem.pas index bd465803..834793d7 100644 --- a/sys/kern/kern_dmem.pas +++ b/sys/kern/kern_dmem.pas @@ -208,16 +208,16 @@ begin rmem_map_unlock(@rmap); end; -function kern_mmap_dmem(map :vm_map_t; - addr :p_vm_offset_t; - phaddr :QWORD; - vaddr :QWORD; - length :QWORD; - mtype :DWORD; - prot :DWORD; - align :QWORD; - flags :DWORD; - stack_addr:Pointer):Integer; +function kern_mmap_dmem(map :vm_map_t; + addr :p_vm_offset_t; + phaddr:QWORD; + vaddr :QWORD; + length:QWORD; + mtype :DWORD; + prot :DWORD; + align :QWORD; + flags :DWORD; + anon :Pointer):Integer; label _fixed, _rmap_insert; @@ -292,7 +292,15 @@ begin vm_object_reference(dmap.vobj); - err:=vm_map_insert(map, dmap.vobj, phaddr, vaddr, v_end, prot, VM_PROT_ALL, cow, ((p_proc.p_dmem_aliasing and 3)<>0)); + err:=vm_map_insert(map, + dmap.vobj, + phaddr, + vaddr, v_end, + prot, VM_PROT_ALL, + cow, + anon, + ((p_proc.p_dmem_aliasing and 3)<>0) + ); if (err=0) then begin @@ -511,7 +519,8 @@ begin td^.td_retval[0]:=addr; - Writeln('sys_mmap_dmem(','0x',HexStr(QWORD(vaddr),10), + Writeln('0x',HexStr(QWORD(stack_addr),10),'->', + 'sys_mmap_dmem(','0x',HexStr(QWORD(vaddr),10), ',0x',HexStr(length,10), ',0x',HexStr(mtype,1), ',0x',HexStr(prot,1), @@ -738,7 +747,7 @@ begin Writeln('sys_virtual_query:',HexStr(addr),' ',flags); - QWORD(addr):=QWORD(addr) and $ffffffffffffc000; + QWORD(addr):=QWORD(addr) and QWORD($ffffffffffffc000); map:=p_proc.p_vmspace; @@ -789,7 +798,10 @@ begin vm_map_lock(map); - if not vm_map_lookup_entry(map,QWORD(addr),@entry) then + if vm_map_lookup_entry(map,QWORD(addr),@entry) then + begin + //Writeln('found:',HexStr(addr),'->',HexStr(entry^.start,16)); + end else begin if ((flags and SCE_KERNEL_VQ_FIND_NEXT)<>0) then begin @@ -898,6 +910,17 @@ begin end; + { + Writeln('[qinfo]:',#13#10' pstart:',HexStr(qinfo.pstart) + ,#13#10' p__end:',HexStr(qinfo.p__end) + ,#13#10' offset:',HexStr(qinfo.offset,16) + ,#13#10' protec:',HexStr(qinfo.protection,2) + ,#13#10' mtypes:',qinfo.memoryType + ,#13#10' name :',qinfo.name + ); + } + + Result:=copyout(@qinfo,info,size); end; diff --git a/sys/kern/subr_dynlib.pas b/sys/kern/subr_dynlib.pas index 2f69302d..45893687 100644 --- a/sys/kern/subr_dynlib.pas +++ b/sys/kern/subr_dynlib.pas @@ -2856,7 +2856,7 @@ begin vm_map_delete(map,vaddr_lo,vaddr_hi,True); - error:=vm_map_insert(map,nil,0,vaddr_lo,vaddr_hi,VM_PROT_RW,VM_PROT_RWX,MAP_COW_NO_BUDGET,false); + error:=vm_map_insert(map,nil,0,vaddr_lo,vaddr_hi,VM_PROT_RW,VM_PROT_RWX,MAP_COW_NO_BUDGET,nil,false); if (error<>0) then begin vm_map_unlock(map); diff --git a/sys/vm/vm_map.pas b/sys/vm/vm_map.pas index b619c6f5..9a19712d 100644 --- a/sys/vm/vm_map.pas +++ b/sys/vm/vm_map.pas @@ -24,6 +24,8 @@ type vm_map_object=vm_object_t; + t_entry_name=array[0..31] of AnsiChar; + p_vm_map_entry_t=^vm_map_entry_t; vm_map_entry_t=^vm_map_entry; vm_map_entry=packed record @@ -43,7 +45,7 @@ type max_protection:vm_prot_t; // maximum protection inheritance :vm_inherit_t; // inheritance budget_id :shortint; // budget/ptype id - name :array[0..31] of Char; // entry name + name :t_entry_name; // entry name anon_addr :Pointer; // source code address entry_id :QWORD; // order id end; @@ -189,6 +191,7 @@ function vm_map_insert( prot :vm_prot_t; max :vm_prot_t; cow :Integer; + anon :Pointer; alias :Boolean):Integer; function vm_map_findspace(map :vm_map_t; @@ -242,7 +245,8 @@ function vm_map_find(map :vm_map_t; find_space:Integer; prot :vm_prot_t; max :vm_prot_t; - cow :Integer):Integer; + cow :Integer; + anon :Pointer):Integer; procedure vm_map_simplify_entry(map:vm_map_t;entry:vm_map_entry_t); @@ -254,14 +258,16 @@ function vm_map_fixed(map :vm_map_t; prot :vm_prot_t; max :vm_prot_t; cow :Integer; - overwr :Integer):Integer; + overwr :Integer; + anon :Pointer):Integer; function vm_map_stack(map :vm_map_t; addrbos :vm_offset_t; max_ssize:vm_size_t; prot :vm_prot_t; max :vm_prot_t; - cow :Integer):Integer; + cow :Integer; + anon :Pointer):Integer; function vm_map_growstack(map:vm_map_t;addr:vm_offset_t):Integer; function vmspace_exec(minuser,maxuser:vm_offset_t):Integer; @@ -275,7 +281,7 @@ function vm_map_remove(map:vm_map_t;start:vm_offset_t;__end:vm_offset_t):Intege procedure vm_map_set_name(map:vm_map_t;start,__end:vm_offset_t;name:PChar); procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar); -procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar;i:vm_inherit_t); +procedure vm_map_set_info_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar;i:vm_inherit_t); procedure vm_map_track_insert(map:vm_map_t;tobj:Pointer); procedure vm_map_track_remove(map:vm_map_t;tobj:Pointer); @@ -406,8 +412,8 @@ begin vm_map_lock(map); For i:=0 to High(pmap_mem)-1 do begin - vm_map_insert (map, nil, 0, pmap_mem[i].__end, pmap_mem[i+1].start, 0, 0, -1, false); - vm_map_set_name_locked(map, pmap_mem[i].__end, pmap_mem[i+1].start, '#hole', VM_INHERIT_HOLE); + vm_map_insert (map, nil, 0, pmap_mem[i].__end, pmap_mem[i+1].start, 0, 0, -1, nil, false); + vm_map_set_info_locked(map, pmap_mem[i].__end, pmap_mem[i+1].start, '#hole', VM_INHERIT_HOLE); end; vm_map_unlock(map); end; @@ -1004,6 +1010,7 @@ function vm_map_insert( prot :vm_prot_t; max :vm_prot_t; cow :Integer; + anon :Pointer; alias :Boolean):Integer; label _budget, @@ -1229,6 +1236,8 @@ charged: new_entry^.entry_id:=map^.entry_id; Inc(map^.entry_id); + new_entry^.anon_addr:=anon; + { * Insert the new entry into the list } @@ -1390,7 +1399,8 @@ function vm_map_fixed(map :vm_map_t; prot :vm_prot_t; max :vm_prot_t; cow :Integer; - overwr :Integer):Integer; + overwr :Integer; + anon :Pointer):Integer; var __end:vm_offset_t; begin @@ -1401,7 +1411,7 @@ begin begin vm_map_delete(map, start, __end, True); end; - Result:=vm_map_insert(map, vm_obj, offset, start, __end, prot, max, cow, false); + Result:=vm_map_insert(map, vm_obj, offset, start, __end, prot, max, cow, anon, false); vm_map_unlock(map); end; @@ -1422,7 +1432,8 @@ function vm_map_find(map :vm_map_t; find_space:Integer; prot :vm_prot_t; max :vm_prot_t; - cow :Integer):Integer; + cow :Integer; + anon :Pointer):Integer; label again; var @@ -1479,7 +1490,7 @@ again: start:=addr^; end; - Result:=vm_map_insert(map, vm_obj, offset, start, start + length, prot, max, cow, false); + Result:=vm_map_insert(map, vm_obj, offset, start, start + length, prot, max, cow, anon, false); until not ((Result=KERN_NO_SPACE) and (find_space<>VMFS_NO_SPACE) and (find_space<>VMFS_ANY_SPACE)); @@ -2584,7 +2595,8 @@ function vm_map_stack(map :vm_map_t; max_ssize:vm_size_t; prot :vm_prot_t; max :vm_prot_t; - cow :Integer):Integer; + cow :Integer; + anon :Pointer):Integer; var new_entry, prev_entry:vm_map_entry_t; bot, top:vm_offset_t; @@ -2677,7 +2689,7 @@ begin end; top:=bot + init_ssize; - rv:=vm_map_insert(map, nil, 0, bot, top, prot, max, cow, false); + rv:=vm_map_insert(map, nil, 0, bot, top, prot, max, cow, anon, false); { Now set the avail_ssize amount. } if (rv=KERN_SUCCESS) then @@ -2902,7 +2914,7 @@ begin end; rv:=vm_map_insert(map, nil, 0, addr, stack_entry^.start, - next_entry^.protection, next_entry^.max_protection, 0, false); + next_entry^.protection, next_entry^.max_protection, 0, next_entry^.anon_addr, false); { Adjust the available stack space by the amount we grew. } if (rv=KERN_SUCCESS) then @@ -3239,6 +3251,7 @@ procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar var current:vm_map_entry_t; entry:vm_map_entry_t; + simpl:vm_map_entry_t; begin if (start=__end) then begin @@ -3258,17 +3271,36 @@ begin current:=entry; while ((current<>@map^.header) and (current^.start<__end)) do begin + + if ((current^.eflags and MAP_ENTRY_IS_SUB_MAP)=0) then + if (current^.vm_obj<>nil) then + if (current^.vm_obj^.otype=OBJT_BLOCKPOOL) then + begin + Assert(false,'TODO'); + current:=current^.next; + Continue; + end; + vm_map_clip_end(map,current,__end); + current^.name:=Default(t_entry_name); MoveChar0(name^,current^.name,32); - vm_map_simplify_entry(map, current); + if (p_proc.p_sdk_version > $6ffffff) then + begin + simpl:=current; + end else + begin + simpl:=entry; + end; + + vm_map_simplify_entry(map, simpl); current:=current^.next; end; end; -procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar;i:vm_inherit_t); +procedure vm_map_set_info_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar;i:vm_inherit_t); var current:vm_map_entry_t; entry:vm_map_entry_t; @@ -3293,6 +3325,7 @@ begin begin vm_map_clip_end(map,current,__end); + current^.name:=Default(t_entry_name); MoveChar0(name^,current^.name,32); current^.inheritance:=i; diff --git a/sys/vm/vm_mmap.pas b/sys/vm/vm_mmap.pas index 96de0446..bbdbeff0 100644 --- a/sys/vm/vm_mmap.pas +++ b/sys/vm/vm_mmap.pas @@ -48,7 +48,7 @@ function vm_mmap2(map :vm_map_t; handle_type:objtype_t; handle :Pointer; foff :vm_ooffset_t; - stack_addr :Pointer):Integer; + anon :Pointer):Integer; function mirror_map (paddr,psize:QWORD):Pointer; procedure mirror_unmap(base:Pointer;size:QWORD); @@ -408,7 +408,7 @@ function vm_mmap2(map :vm_map_t; handle_type:objtype_t; handle :Pointer; foff :vm_ooffset_t; - stack_addr :Pointer):Integer; + anon :Pointer):Integer; var obj:vm_object_t; docow,error,findspace,rv:Integer; @@ -533,7 +533,10 @@ begin if ((flags and MAP_STACK)<>0) then begin - rv:=vm_map_stack(map, addr^, size, prot, maxprot, docow or MAP_STACK_GROWS_DOWN); + rv:=vm_map_stack(map, addr^, size, + prot, maxprot, + docow or MAP_STACK_GROWS_DOWN, + anon); end else if (fitit) then begin @@ -548,11 +551,17 @@ begin begin findspace:=VMFS_OPTIMAL_SPACE; end; - rv:=vm_map_find(map, obj, foff, addr, size, findspace, prot, maxprot, docow); + rv:=vm_map_find(map, obj, foff, addr, size, findspace, + prot, maxprot, + docow, + anon); end else begin - rv:=vm_map_fixed(map, obj, foff, addr^, size, prot, maxprot, docow, - ord((flags and MAP_NO_OVERWRITE)=0)); + rv:=vm_map_fixed(map, obj, foff, addr^, size, + prot, maxprot, + docow, + ord((flags and MAP_NO_OVERWRITE)=0), + anon); end; if (rv=KERN_SUCCESS) then @@ -905,7 +914,8 @@ _map: vm_map_set_name_str(map,addr,size + addr,'anon:'+HexStr(QWORD(stack_addr),10)); end; - Writeln('sys_mmap(','0x',HexStr(QWORD(vaddr),10), + Writeln('0x',HexStr(QWORD(stack_addr),10),'->', + 'sys_mmap(','0x',HexStr(QWORD(vaddr),10), ',0x',HexStr(vlen,10), ',0x',HexStr(prot,1), ',0x',HexStr(flags,6), @@ -953,7 +963,12 @@ begin Exit(EINVAL); end; - vm_map_remove(map, qword(addr), qword(addr) + size); + Result:=vm_map_remove(map, qword(addr), qword(addr) + size); + + Writeln('sys_munmap(','0x',HexStr(QWORD(addr),10), + ',0x',HexStr(len,10), + '):',Integer(Result) + ); // vm_map_remove returns nothing but KERN_SUCCESS anyway Exit(0); @@ -1111,6 +1126,13 @@ begin __end:=round_page(vm_offset_t(addr) + len); vm_map_set_name(map,start,__end,@_name); + + Writeln('sys_mname(','0x',HexStr(QWORD(addr),10), + ',0x',HexStr(len,10), + ',',name, + ')' + ); + end; function sys_query_memory_protection(addr:Pointer;info:Pointer):Integer;