1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 664 unchanged lines hidden (view full) --- 673 (new_length % TheISA::VMPageSize != 0)) { 674 warn("mremap failing: arguments not page aligned"); 675 return -EINVAL; 676 } 677 678 if (new_length > old_length) { 679 if ((start + old_length) == process->mmap_end) { 680 uint64_t diff = new_length - old_length; |
681 process->allocateMem(process->mmap_end, diff); |
682 process->mmap_end += diff; 683 return start; 684 } else { 685 // sys/mman.h defined MREMAP_MAYMOVE 686 if (!(flags & 1)) { 687 warn("can't remap here and MREMAP_MAYMOVE flag not set\n"); 688 return -ENOMEM; 689 } else { 690 process->pTable->remap(start, old_length, process->mmap_end); 691 warn("mremapping to totally new vaddr %08p-%08p, adding %d\n", 692 process->mmap_end, process->mmap_end + new_length, new_length); 693 start = process->mmap_end; 694 // add on the remaining unallocated pages |
695 process->allocateMem(start + old_length, 696 new_length - old_length); |
697 process->mmap_end += new_length; 698 warn("returning %08p as start\n", start); 699 return start; 700 } 701 } 702 } else { |
703 process->pTable->unmap(start + new_length, old_length - new_length); |
704 return start; 705 } 706} 707 708/// Target stat() handler. 709template <class OS> 710SyscallReturn 711statFunc(SyscallDesc *desc, int callnum, LiveProcess *process, --- 311 unchanged lines hidden (view full) --- 1023 if ((start % TheISA::VMPageSize) != 0 || 1024 (length % TheISA::VMPageSize) != 0) { 1025 warn("mmap failing: arguments not page-aligned: " 1026 "start 0x%x length 0x%x", 1027 start, length); 1028 return -EINVAL; 1029 } 1030 |
1031 // are we ok with clobbering existing mappings? only set this to 1032 // true if the user has been warned. 1033 bool clobber = false; 1034 1035 // try to use the caller-provided address if there is one 1036 bool use_provided_address = (start != 0); 1037 1038 if (use_provided_address) { 1039 // check to see if the desired address is already in use 1040 if (!p->pTable->isUnmapped(start, length)) { 1041 // there are existing mappings in the desired range 1042 // whether we clobber them or not depends on whether the caller 1043 // specified MAP_FIXED 1044 if (flags & OS::TGT_MAP_FIXED) { 1045 // MAP_FIXED specified: clobber existing mappings 1046 warn("mmap: MAP_FIXED at 0x%x overwrites existing mappings\n", 1047 start); 1048 clobber = true; 1049 } else { 1050 // MAP_FIXED not specified: ignore suggested start address 1051 warn("mmap: ignoring suggested map address 0x%x\n", start); 1052 use_provided_address = false; 1053 } 1054 } |
1055 } 1056 |
1057 if (!use_provided_address) { 1058 // no address provided, or provided address unusable: 1059 // pick next address from our "mmap region" 1060 if (OS::mmapGrowsDown()) { 1061 start = p->mmap_end - length; 1062 p->mmap_end = start; 1063 } else { 1064 start = p->mmap_end; 1065 p->mmap_end += length; 1066 } |
1067 } |
1068 |
1069 p->allocateMem(start, length, clobber); 1070 |
1071 return start; 1072} 1073 1074/// Target getrlimit() handler. 1075template <class OS> 1076SyscallReturn 1077getrlimitFunc(SyscallDesc *desc, int callnum, LiveProcess *process, 1078 ThreadContext *tc) --- 187 unchanged lines hidden --- |