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 ---