syscall_emul.hh (12032:d218c2fe9440) | syscall_emul.hh (12206:dd72486d1dbc) |
---|---|
1/* 2 * Copyright (c) 2012-2013, 2015 ARM Limited 3 * Copyright (c) 2015 Advanced Micro Devices, Inc. 4 * All rights reserved 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating --- 918 unchanged lines hidden (view full) --- 927 new_length = roundUp(new_length, TheISA::PageBytes); 928 929 if (new_length > old_length) { 930 std::shared_ptr<MemState> mem_state = process->memState; 931 Addr mmap_end = mem_state->getMmapEnd(); 932 933 if ((start + old_length) == mmap_end && 934 (!use_provided_address || provided_address == start)) { | 1/* 2 * Copyright (c) 2012-2013, 2015 ARM Limited 3 * Copyright (c) 2015 Advanced Micro Devices, Inc. 4 * All rights reserved 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating --- 918 unchanged lines hidden (view full) --- 927 new_length = roundUp(new_length, TheISA::PageBytes); 928 929 if (new_length > old_length) { 930 std::shared_ptr<MemState> mem_state = process->memState; 931 Addr mmap_end = mem_state->getMmapEnd(); 932 933 if ((start + old_length) == mmap_end && 934 (!use_provided_address || provided_address == start)) { |
935 // This case cannot occur when growing downward, as 936 // start is greater than or equal to mmap_end. |
|
935 uint64_t diff = new_length - old_length; 936 process->allocateMem(mmap_end, diff); 937 mem_state->setMmapEnd(mmap_end + diff); 938 return start; 939 } else { 940 if (!use_provided_address && !(flags & OS::TGT_MREMAP_MAYMOVE)) { 941 warn("can't remap here and MREMAP_MAYMOVE flag not set\n"); 942 return -ENOMEM; 943 } else { | 937 uint64_t diff = new_length - old_length; 938 process->allocateMem(mmap_end, diff); 939 mem_state->setMmapEnd(mmap_end + diff); 940 return start; 941 } else { 942 if (!use_provided_address && !(flags & OS::TGT_MREMAP_MAYMOVE)) { 943 warn("can't remap here and MREMAP_MAYMOVE flag not set\n"); 944 return -ENOMEM; 945 } else { |
944 uint64_t new_start = use_provided_address ? 945 provided_address : mmap_end; | 946 uint64_t new_start = provided_address; 947 if (!use_provided_address) { 948 new_start = process->mmapGrowsDown() ? 949 mmap_end - new_length : mmap_end; 950 mmap_end = process->mmapGrowsDown() ? 951 new_start : mmap_end + new_length; 952 mem_state->setMmapEnd(mmap_end); 953 } 954 |
946 process->pTable->remap(start, old_length, new_start); 947 warn("mremapping to new vaddr %08p-%08p, adding %d\n", 948 new_start, new_start + new_length, 949 new_length - old_length); 950 // add on the remaining unallocated pages 951 process->allocateMem(new_start + old_length, 952 new_length - old_length, 953 use_provided_address /* clobber */); | 955 process->pTable->remap(start, old_length, new_start); 956 warn("mremapping to new vaddr %08p-%08p, adding %d\n", 957 new_start, new_start + new_length, 958 new_length - old_length); 959 // add on the remaining unallocated pages 960 process->allocateMem(new_start + old_length, 961 new_length - old_length, 962 use_provided_address /* clobber */); |
954 if (!use_provided_address) 955 mem_state->setMmapEnd(mmap_end + new_length); | |
956 if (use_provided_address && | 963 if (use_provided_address && |
957 new_start + new_length > mem_state->getMmapEnd()) { | 964 ((new_start + new_length > mem_state->getMmapEnd() && 965 !process->mmapGrowsDown()) || 966 (new_start < mem_state->getMmapEnd() && 967 process->mmapGrowsDown()))) { |
958 // something fishy going on here, at least notify the user 959 // @todo: increase mmap_end? 960 warn("mmap region limit exceeded with MREMAP_FIXED\n"); 961 } 962 warn("returning %08p as start\n", new_start); 963 return new_start; 964 } 965 } --- 1046 unchanged lines hidden --- | 968 // something fishy going on here, at least notify the user 969 // @todo: increase mmap_end? 970 warn("mmap region limit exceeded with MREMAP_FIXED\n"); 971 } 972 warn("returning %08p as start\n", new_start); 973 return new_start; 974 } 975 } --- 1046 unchanged lines hidden --- |