| OLD | NEW |
| (Empty) | |
| 1 diff --git a/third_party/mach_override/README.chromium b/third_party/mach_overri
de/README.chromium |
| 2 index 8a7c3fd79e0b..d83803a2bf63 100644 |
| 3 --- a/third_party/mach_override/README.chromium |
| 4 +++ b/third_party/mach_override/README.chromium |
| 5 @@ -1,6 +1,7 @@ |
| 6 Name: mach_override |
| 7 Short Name: mach_override |
| 8 -Version: Newer than 1.2. HEAD from branch semver-1.x. |
| 9 +Version: 0 |
| 10 +Newer than 1.2. HEAD from branch semver-1.x. |
| 11 URL: https://github.com/rentzsch/mach_override |
| 12 Date: 2014-05-11 |
| 13 Revision: 919148f94db54fc04d287eb6a42c0c36b166bbfa |
| 14 @@ -16,4 +17,5 @@ mach_override includes a copy of libudis86 1.7.1, available se
parately from |
| 15 http://udis86.sourceforge.net/ and https://github.com/vmt/udis86 . |
| 16 |
| 17 |
| 18 -Local Modifications: None. |
| 19 +Local Modifications: Sped up allocation of branch island memory via usage of |
| 20 + vm_region to skip already allocated pages. |
| 21 diff --git a/third_party/mach_override/chromium.patch b/third_party/mach_overrid
e/chromium.patch |
| 22 new file mode 100644 |
| 23 index 000000000000..e69de29bb2d1 |
| 24 diff --git a/third_party/mach_override/mach_override.c b/third_party/mach_overri
de/mach_override.c |
| 25 index 85a75e5c2067..ba2b1de2d598 100644 |
| 26 --- a/third_party/mach_override/mach_override.c |
| 27 +++ b/third_party/mach_override/mach_override.c |
| 28 @@ -41,7 +41,7 @@ long kIslandTemplate[] = { |
| 29 #define kInstructionHi 10 |
| 30 #define kInstructionLo 11 |
| 31 |
| 32 -#elif defined(__i386__) |
| 33 +#elif defined(__i386__) |
| 34 |
| 35 #define kOriginalInstructionsSize 16 |
| 36 |
| 37 @@ -61,6 +61,7 @@ char kIslandTemplate[] = { |
| 38 #define kOriginalInstructionsSize 32 |
| 39 |
| 40 #define kJumpAddress kOriginalInstructionsSize + 6 |
| 41 +#define kMaxJumpOffset (0x7fffffffUL) |
| 42 |
| 43 char kIslandTemplate[] = { |
| 44 // kOriginalInstructionsSize nop instructions so that we |
| 45 @@ -267,7 +268,13 @@ mach_override_ptr( |
| 46 |
| 47 #if defined(__i386__) || defined(__x86_64__) |
| 48 if (!err) { |
| 49 - uint32_t addressOffset = ((char*)escapeIsland - (char*)originalF
unctionPtr - 5); |
| 50 + // TODO: On 64-bit, move to opcode FF/4 (jmp 64-bit absolute) in
stead of |
| 51 + // E9 (jmp 32-bit relative to RIP). Then we should update the |
| 52 + // allocateBranchIsland to simply allocate any page in the addre
ss space. |
| 53 + // See the 64-bit version of kIslandTemplate array. |
| 54 + int64_t addressOffset64 = ((char*)escapeIsland - (char*)original
FunctionPtr - 5); |
| 55 + int32_t addressOffset = ((char*)escapeIsland - (char*)originalFu
nctionPtr - 5); |
| 56 + assert(addressOffset64 == addressOffset); |
| 57 addressOffset = OSSwapInt32(addressOffset); |
| 58 |
| 59 jumpRelativeInstruction |= 0xE900000000000000LL; |
| 60 @@ -385,7 +392,7 @@ allocateBranchIsland( |
| 61 void *originalFunctionAddress) |
| 62 { |
| 63 assert( island ); |
| 64 - |
| 65 + |
| 66 mach_error_t err = err_none; |
| 67 |
| 68 if( allocateHigh ) { |
| 69 @@ -401,23 +408,44 @@ allocateBranchIsland( |
| 70 vm_address_t first = 0xfeffffff; |
| 71 vm_address_t last = 0xfe000000 + PAGE_SIZE; |
| 72 #elif defined(__x86_64__) |
| 73 - // 64-bit ASLR is in bits 13-28 |
| 74 - vm_address_t first = ((uint64_t)originalFunctionAddress & ~( (0x
FUL << 28) | (PAGE_SIZE - 1) ) ) | (0x1UL << 31); |
| 75 - vm_address_t last = (uint64_t)originalFunctionAddress & ~((0x1UL
<< 32) - 1); |
| 76 + // This logic is more complex due to the 32-bit limit of the jum
p out |
| 77 + // of the original function. Once that limitation is removed, we
can |
| 78 + // use vm_allocate with VM_FLAGS_ANYWHERE as in the i386 code ab
ove. |
| 79 + const uint64_t kPageMask = ~(PAGE_SIZE - 1); |
| 80 + vm_address_t first = (uint64_t)originalFunctionAddress - kMaxJum
pOffset; |
| 81 + first = (first & kPageMask) + PAGE_SIZE; // Align up to the next
page start |
| 82 + if (first > (uint64_t)originalFunctionAddress) first = 0; |
| 83 + vm_address_t last = (uint64_t)originalFunctionAddress + kMaxJump
Offset; |
| 84 + if (last < (uint64_t)originalFunctionAddress) last = ULONG_MAX; |
| 85 #endif |
| 86 |
| 87 page = first; |
| 88 int allocated = 0; |
| 89 vm_map_t task_self = mach_task_self(); |
| 90 |
| 91 - while( !err && !allocated && page != last ) { |
| 92 + while( !err && !allocated && page < last ) { |
| 93 |
| 94 err = vm_allocate( task_self, &page, PAGE_SIZE, 0 ); |
| 95 if( err == err_none ) |
| 96 allocated = 1; |
| 97 else if( err == KERN_NO_SPACE ) { |
| 98 #if defined(__x86_64__) |
| 99 - page -= PAGE_SIZE; |
| 100 + // This memory region is not suitable, skip it: |
| 101 + vm_address_t region_start = page; |
| 102 + vm_size_t region_size; |
| 103 + mach_msg_type_number_t int_count = VM_REGION_BAS
IC_INFO_COUNT_64; |
| 104 + vm_region_basic_info_data_64_t vm_region_info; |
| 105 + mach_port_t object_name; |
| 106 + kern_return_t region_result = |
| 107 + vm_region_64(task_self, ®ion_
start, ®ion_size, |
| 108 + VM_REGION_BASIC_INFO_64,
(vm_region_info_t)&vm_region_info, |
| 109 + &int_count, &object_name
); |
| 110 + if (region_result == KERN_SUCCESS) { |
| 111 + page = region_start + region_size; |
| 112 + } else { |
| 113 + err = region_result; |
| 114 + break; |
| 115 + } |
| 116 #else |
| 117 page += PAGE_SIZE; |
| 118 #endif |
| 119 @@ -438,7 +466,7 @@ allocateBranchIsland( |
| 120 } |
| 121 if( !err ) |
| 122 (**island).allocatedHigh = allocateHigh; |
| 123 - |
| 124 + |
| 125 return err; |
| 126 } |
| 127 |
| OLD | NEW |