mirror of
https://github.com/DKJone/DKWechatHelper.git
synced 2026-07-29 06:12:07 +08:00
init project
添加初始项目
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* OCMethodTrace.h
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// 方法跟踪条件block
|
||||
// @param sel 方法名
|
||||
typedef BOOL (^OMTConditionBlock)(SEL sel);
|
||||
|
||||
// 方法调用前会调用该block
|
||||
// @param target 跟踪目标对象
|
||||
// @param cls 调用方法所在的类(可以是target所在的类,也可以是target的父类)
|
||||
// @param sel 方法名
|
||||
// @param args 参数列表
|
||||
// @param deep 调用层次
|
||||
typedef void (^OMTBeforeBlock)(id target, Class cls, SEL sel, NSArray *args, int deep);
|
||||
|
||||
// 方法调用后会调用该block
|
||||
// @param target 跟踪目标对象
|
||||
// @param cls 调用方法所在的类(可以是target所在的类,也可以是target的父类)
|
||||
// @param sel 方法名
|
||||
// @param ret 返回值
|
||||
// @param deep 调用层次
|
||||
// @param interval 执行方法的ms耗时
|
||||
typedef void (^OMTAfterBlock)(id target, Class cls, SEL sel, id ret, int deep, NSTimeInterval interval);
|
||||
|
||||
// target位置
|
||||
typedef NS_ENUM(NSUInteger, OMTTargetPosition) {
|
||||
OMTTargetPositionBeforeSelf = 0, // before-调用者self
|
||||
OMTTargetPositionBeforeArgument, // before-参数
|
||||
OMTTargetPositionAfterSelf, // after-调用者self
|
||||
OMTTargetPositionAfterReturnValue, // after-返回值
|
||||
OMTTargetPositionMax,
|
||||
};
|
||||
|
||||
// 日志级别
|
||||
typedef NS_ENUM(NSUInteger, OMTLogLevel) {
|
||||
OMTLogLevelError = 0,
|
||||
OMTLogLevelDebug,
|
||||
OMTLogLevelMax,
|
||||
};
|
||||
|
||||
@protocol OCMethodTraceDelegate <NSObject>
|
||||
|
||||
@optional
|
||||
// 获取target的description回调
|
||||
- (NSString *)descriptionWithTarget:(id)target class:(Class)cls selector:(SEL)sel targetPosition:(OMTTargetPosition)targetPosition;
|
||||
// 日志回调
|
||||
- (void)log:(OMTLogLevel)level format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3);
|
||||
|
||||
@end
|
||||
|
||||
@interface OCMethodTrace : NSObject
|
||||
|
||||
@property (nonatomic, assign) BOOL disableTrace; // 屏蔽before和after调用,hook完成后默认打开
|
||||
@property (nonatomic, weak) id<OCMethodTraceDelegate> delegate; // 回调
|
||||
@property (nonatomic, assign) OMTLogLevel logLevel; // 日志级别,默认OMTLogLevelDebug
|
||||
|
||||
+ (OCMethodTrace *)sharedInstance;
|
||||
|
||||
// 跟踪打印目标(实例或类)方法调用
|
||||
// @param cls 跟踪打印目标类
|
||||
// @param condition 判断是否跟踪方法的block
|
||||
// @param before 被跟踪的方法调用前会调用该block
|
||||
// @param after 被跟踪的方法调用后会调用该block
|
||||
- (void)traceMethodWithClass:(Class)cls
|
||||
condition:(OMTConditionBlock)condition
|
||||
before:(OMTBeforeBlock)before
|
||||
after:(OMTAfterBlock)after;
|
||||
|
||||
@end
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* OCSelectorTrampolines.mm
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
FOUNDATION_EXTERN IMP imp_implementationWithSelector(SEL aSel, const char *signature);
|
||||
FOUNDATION_EXTERN SEL imp_getSelector(IMP anImp);
|
||||
FOUNDATION_EXTERN BOOL imp_removeSelector(IMP anImp);
|
||||
@@ -0,0 +1,449 @@
|
||||
/*
|
||||
* OCSelectorTrampolines.mm
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "OCSelectorTrampolines.h"
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
#import <mach/mach.h>
|
||||
#import <pthread.h>
|
||||
|
||||
// Define SUPPORT_STRET on architectures that need separate struct-return ABI.
|
||||
#if defined(__arm64__)
|
||||
# define SUPPORT_STRET 0
|
||||
#else
|
||||
# define SUPPORT_STRET 1
|
||||
#endif
|
||||
|
||||
#define _ost_fatal(fmt, ...) [NSException raise:@"OCSelectorTrampolines" format:fmt, ##__VA_ARGS__]
|
||||
|
||||
// symbols defined in assembly files
|
||||
// Don't use the symbols directly; they're thumb-biased on some ARM archs.
|
||||
#define TRAMP(tramp) \
|
||||
static inline __unused uintptr_t tramp(void) { \
|
||||
extern void *_##tramp; \
|
||||
return ((uintptr_t)&_##tramp) & ~1UL; \
|
||||
}
|
||||
// Scalar return
|
||||
TRAMP(a1a2_selectorTrampHead); // trampoline header code
|
||||
TRAMP(a1a2_firstSelectorTramp); // first trampoline
|
||||
TRAMP(a1a2_selectorTrampEnd); // after the last trampoline
|
||||
|
||||
#if SUPPORT_STRET
|
||||
// Struct return
|
||||
TRAMP(a2a3_selectorTrampHead);
|
||||
TRAMP(a2a3_firstSelectorTramp);
|
||||
TRAMP(a2a3_selectorTrampEnd);
|
||||
#endif
|
||||
|
||||
// argument mode identifier
|
||||
typedef enum {
|
||||
ReturnValueInRegisterArgumentMode,
|
||||
#if SUPPORT_STRET
|
||||
ReturnValueOnStackArgumentMode,
|
||||
#endif
|
||||
|
||||
ArgumentModeCount
|
||||
} ArgumentMode;
|
||||
|
||||
|
||||
// We must take care with our data layout on architectures that support
|
||||
// multiple page sizes.
|
||||
//
|
||||
// The trampoline template in __TEXT is sized and aligned with PAGE_MAX_SIZE.
|
||||
// On some platforms this requires additional linker flags.
|
||||
//
|
||||
// When we allocate a page pair, we use PAGE_MAX_SIZE size.
|
||||
// This allows trampoline code to find its data by subtracting PAGE_MAX_SIZE.
|
||||
//
|
||||
// When we allocate a page pair, we use the process's page alignment.
|
||||
// This simplifies allocation because we don't need to force greater than
|
||||
// default alignment when running with small pages, but it also means
|
||||
// the trampoline code MUST NOT look for its data by masking with PAGE_MAX_MASK.
|
||||
|
||||
struct TrampolineSelectorPagePair
|
||||
{
|
||||
IMP msgSend; // msg send hander
|
||||
|
||||
TrampolineSelectorPagePair *nextPagePair; // linked list of all pages
|
||||
TrampolineSelectorPagePair *nextAvailablePage; // linked list of pages with available slots
|
||||
|
||||
uintptr_t nextAvailable; // index of next available slot, endIndex() if no more available
|
||||
|
||||
// Payload data: selector and free list.
|
||||
// Bytes parallel with trampoline header code are the fields above or unused
|
||||
// uint8_t selectors[ PAGE_MAX_SIZE - sizeof(TrampolineSelectorPagePair) ]
|
||||
|
||||
// Code: trampoline header followed by trampolines.
|
||||
// uint8_t trampolines[PAGE_MAX_SIZE];
|
||||
|
||||
// Per-trampoline selector data format:
|
||||
// initial value is 0 while page data is filled sequentially
|
||||
// when filled, value is reference to selector
|
||||
// when empty, value is index of next available slot OR 0 if never used yet
|
||||
|
||||
union Payload {
|
||||
SEL selector;
|
||||
uintptr_t nextAvailable; // free list
|
||||
};
|
||||
|
||||
static uintptr_t headerSize() {
|
||||
return (uintptr_t) (a1a2_firstSelectorTramp() - a1a2_selectorTrampHead());
|
||||
}
|
||||
|
||||
static uintptr_t slotSize() {
|
||||
return 8;
|
||||
}
|
||||
|
||||
static uintptr_t startIndex() {
|
||||
// headerSize is assumed to be slot-aligned
|
||||
return headerSize() / slotSize();
|
||||
}
|
||||
|
||||
static uintptr_t endIndex() {
|
||||
return (uintptr_t)PAGE_MAX_SIZE / slotSize();
|
||||
}
|
||||
|
||||
static bool validIndex(uintptr_t index) {
|
||||
return (index >= startIndex() && index < endIndex());
|
||||
}
|
||||
|
||||
Payload *payload(uintptr_t index) {
|
||||
assert(validIndex(index));
|
||||
return (Payload *)((char *)this + index*slotSize());
|
||||
}
|
||||
|
||||
IMP trampoline(uintptr_t index) {
|
||||
assert(validIndex(index));
|
||||
char *imp = (char *)this + index*slotSize() + PAGE_MAX_SIZE;
|
||||
#if __arm__
|
||||
imp++; // trampoline is Thumb instructions
|
||||
#endif
|
||||
return (IMP)imp;
|
||||
}
|
||||
|
||||
uintptr_t indexForTrampoline(IMP tramp) {
|
||||
uintptr_t tramp0 = (uintptr_t)this + PAGE_MAX_SIZE;
|
||||
uintptr_t start = tramp0 + headerSize();
|
||||
uintptr_t end = tramp0 + PAGE_MAX_SIZE;
|
||||
uintptr_t address = (uintptr_t)tramp;
|
||||
if (address >= start && address < end) {
|
||||
return (uintptr_t)(address - tramp0) / slotSize();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void check() {
|
||||
assert(TrampolineSelectorPagePair::slotSize() == 8);
|
||||
assert(TrampolineSelectorPagePair::headerSize() >= sizeof(TrampolineSelectorPagePair));
|
||||
assert(TrampolineSelectorPagePair::headerSize() % TrampolineSelectorPagePair::slotSize() == 0);
|
||||
|
||||
// _objc_inform("%p %p %p", a1a2_selectorTrampHead(), a1a2_firstSelectorTramp(),
|
||||
// a1a2_selectorTrampEnd());
|
||||
assert(a1a2_selectorTrampHead() % PAGE_SIZE == 0); // not PAGE_MAX_SIZE
|
||||
assert(a1a2_selectorTrampHead() + PAGE_MAX_SIZE == a1a2_selectorTrampEnd());
|
||||
#if SUPPORT_STRET
|
||||
// _objc_inform("%p %p %p", a2a3_selectorTrampHead(), a2a3_firstSelectorTramp(),
|
||||
// a2a3_selectorTrampEnd());
|
||||
assert(a2a3_selectorTrampHead() % PAGE_SIZE == 0); // not PAGE_MAX_SIZE
|
||||
assert(a2a3_selectorTrampHead() + PAGE_MAX_SIZE == a2a3_selectorTrampEnd());
|
||||
#endif
|
||||
|
||||
#if __arm__
|
||||
// make sure trampolines are Thumb
|
||||
extern void *_a1a2_firstSelectorTramp;
|
||||
extern void *_a2a3_firstSelectorTramp;
|
||||
assert(((uintptr_t)&_a1a2_firstSelectorTramp) % 2 == 1);
|
||||
assert(((uintptr_t)&_a2a3_firstSelectorTramp) % 2 == 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// two sets of trampoline pages; one for stack returns and one for register returns
|
||||
static TrampolineSelectorPagePair *headPagePairs[ArgumentModeCount];
|
||||
|
||||
#pragma mark Utility Functions
|
||||
|
||||
static pthread_rwlock_t trampolinesLock = PTHREAD_RWLOCK_INITIALIZER;
|
||||
|
||||
static inline void _lock() {
|
||||
int err = pthread_rwlock_wrlock(&trampolinesLock);
|
||||
if (err) _ost_fatal(@"pthread_rwlock_wrlock failed (%d)", err);
|
||||
}
|
||||
|
||||
static inline void _unlock() {
|
||||
int err = pthread_rwlock_unlock(&trampolinesLock);
|
||||
if (err) _ost_fatal(@"pthread_rwlock_unlock failed (%d)", err);
|
||||
}
|
||||
|
||||
static inline void _assert_locked() {
|
||||
}
|
||||
|
||||
#pragma mark Trampoline Management Functions
|
||||
static TrampolineSelectorPagePair *_allocateTrampolinesAndData(ArgumentMode aMode)
|
||||
{
|
||||
_assert_locked();
|
||||
|
||||
vm_address_t dataAddress;
|
||||
|
||||
TrampolineSelectorPagePair::check();
|
||||
|
||||
TrampolineSelectorPagePair *headPagePair = headPagePairs[aMode];
|
||||
|
||||
assert(headPagePair == nil || headPagePair->nextAvailablePage == nil);
|
||||
|
||||
kern_return_t result;
|
||||
result = vm_allocate(mach_task_self(), &dataAddress, PAGE_MAX_SIZE * 2,
|
||||
VM_FLAGS_ANYWHERE | VM_MAKE_TAG(VM_MEMORY_FOUNDATION));
|
||||
if (result != KERN_SUCCESS) {
|
||||
_ost_fatal(@"vm_allocate trampolines failed (%d)", result);
|
||||
}
|
||||
|
||||
vm_address_t codeAddress = dataAddress + PAGE_MAX_SIZE;
|
||||
|
||||
uintptr_t codePage = NULL;
|
||||
IMP sendImp = NULL;
|
||||
switch(aMode) {
|
||||
case ReturnValueInRegisterArgumentMode:
|
||||
codePage = a1a2_selectorTrampHead();
|
||||
sendImp = objc_msgSend;
|
||||
break;
|
||||
#if SUPPORT_STRET
|
||||
case ReturnValueOnStackArgumentMode:
|
||||
codePage = a2a3_selectorTrampHead();
|
||||
sendImp = objc_msgSend_stret;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
_ost_fatal(@"unknown return mode %d", (int)aMode);
|
||||
break;
|
||||
}
|
||||
|
||||
vm_prot_t currentProtection, maxProtection;
|
||||
result = vm_remap(mach_task_self(), &codeAddress, PAGE_MAX_SIZE,
|
||||
0, VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
|
||||
mach_task_self(), codePage, TRUE,
|
||||
¤tProtection, &maxProtection, VM_INHERIT_SHARE);
|
||||
if (result != KERN_SUCCESS) {
|
||||
// vm_deallocate(mach_task_self(), dataAddress, PAGE_MAX_SIZE * 2);
|
||||
_ost_fatal(@"vm_remap trampolines failed (%d)", result);
|
||||
}
|
||||
|
||||
TrampolineSelectorPagePair *pagePair = (TrampolineSelectorPagePair *) dataAddress;
|
||||
pagePair->nextAvailable = pagePair->startIndex();
|
||||
pagePair->nextPagePair = nil;
|
||||
pagePair->nextAvailablePage = nil;
|
||||
pagePair->msgSend = sendImp;
|
||||
|
||||
if (headPagePair) {
|
||||
TrampolineSelectorPagePair *lastPagePair = headPagePair;
|
||||
while(lastPagePair->nextPagePair) {
|
||||
lastPagePair = lastPagePair->nextPagePair;
|
||||
}
|
||||
lastPagePair->nextPagePair = pagePair;
|
||||
headPagePairs[aMode]->nextAvailablePage = pagePair;
|
||||
} else {
|
||||
headPagePairs[aMode] = pagePair;
|
||||
}
|
||||
|
||||
return pagePair;
|
||||
}
|
||||
|
||||
static TrampolineSelectorPagePair *
|
||||
_getOrAllocatePagePairWithNextAvailable(ArgumentMode aMode)
|
||||
{
|
||||
_assert_locked();
|
||||
|
||||
TrampolineSelectorPagePair *headPagePair = headPagePairs[aMode];
|
||||
|
||||
if (!headPagePair)
|
||||
return _allocateTrampolinesAndData(aMode);
|
||||
|
||||
// make sure head page is filled first
|
||||
if (headPagePair->nextAvailable != headPagePair->endIndex())
|
||||
return headPagePair;
|
||||
|
||||
if (headPagePair->nextAvailablePage) // check if there is a page w/a hole
|
||||
return headPagePair->nextAvailablePage;
|
||||
|
||||
return _allocateTrampolinesAndData(aMode); // tack on a new one
|
||||
}
|
||||
|
||||
static TrampolineSelectorPagePair *
|
||||
_pageAndIndexContainingIMP(IMP anImp, uintptr_t *outIndex,
|
||||
TrampolineSelectorPagePair **outHeadPagePair)
|
||||
{
|
||||
_assert_locked();
|
||||
|
||||
for (int arg = 0; arg < ArgumentModeCount; arg++) {
|
||||
for (TrampolineSelectorPagePair *pagePair = headPagePairs[arg];
|
||||
pagePair;
|
||||
pagePair = pagePair->nextPagePair)
|
||||
{
|
||||
uintptr_t index = pagePair->indexForTrampoline(anImp);
|
||||
if (index) {
|
||||
if (outIndex) *outIndex = index;
|
||||
if (outHeadPagePair) *outHeadPagePair = headPagePairs[arg];
|
||||
return pagePair;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static ArgumentMode
|
||||
_argumentModeForSignature(const char *signature)
|
||||
{
|
||||
ArgumentMode aMode = ReturnValueInRegisterArgumentMode;
|
||||
|
||||
#if SUPPORT_STRET
|
||||
if (signature && signature[0] == '{') {
|
||||
@try {
|
||||
// In some cases that returns struct, we should use the '_stret' API:
|
||||
// http://sealiesoftware.com/blog/archive/2008/10/30/objc_explain_objc_msgSend_stret.html
|
||||
// NSMethodSignature knows the detail but has no API to return, we can only get the info from debugDescription.
|
||||
NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:signature];
|
||||
if ([methodSignature.debugDescription rangeOfString:@"is special struct return? YES"].location != NSNotFound) {
|
||||
aMode = ReturnValueOnStackArgumentMode;
|
||||
}
|
||||
} @catch (__unused NSException *e) {}
|
||||
}
|
||||
#endif
|
||||
|
||||
return aMode;
|
||||
}
|
||||
|
||||
#pragma mark Public API
|
||||
IMP imp_implementationWithSelector(SEL aSel, const char *signature)
|
||||
{
|
||||
IMP returnIMP;
|
||||
|
||||
_lock();
|
||||
|
||||
ArgumentMode aMode = _argumentModeForSignature(signature);
|
||||
|
||||
TrampolineSelectorPagePair *pagePair =
|
||||
_getOrAllocatePagePairWithNextAvailable(aMode);
|
||||
if (!headPagePairs[aMode])
|
||||
headPagePairs[aMode] = pagePair;
|
||||
|
||||
uintptr_t index = pagePair->nextAvailable;
|
||||
assert(index >= pagePair->startIndex() && index < pagePair->endIndex());
|
||||
TrampolineSelectorPagePair::Payload *payload = pagePair->payload(index);
|
||||
|
||||
uintptr_t nextAvailableIndex = payload->nextAvailable;
|
||||
if (nextAvailableIndex == 0) {
|
||||
// First time through (unused slots are zero). Fill sequentially.
|
||||
// If the page is now full this will now be endIndex(), handled below.
|
||||
nextAvailableIndex = index + 1;
|
||||
}
|
||||
pagePair->nextAvailable = nextAvailableIndex;
|
||||
if (nextAvailableIndex == pagePair->endIndex()) {
|
||||
// PagePair is now full (free list or wilderness exhausted)
|
||||
// Remove from available page linked list
|
||||
TrampolineSelectorPagePair *iterator = headPagePairs[aMode];
|
||||
while(iterator && (iterator->nextAvailablePage != pagePair)) {
|
||||
iterator = iterator->nextAvailablePage;
|
||||
}
|
||||
if (iterator) {
|
||||
iterator->nextAvailablePage = pagePair->nextAvailablePage;
|
||||
pagePair->nextAvailablePage = nil;
|
||||
}
|
||||
}
|
||||
|
||||
payload->selector = aSel;
|
||||
returnIMP = pagePair->trampoline(index);
|
||||
|
||||
_unlock();
|
||||
|
||||
return returnIMP;
|
||||
}
|
||||
|
||||
SEL imp_getSelector(IMP anImp) {
|
||||
uintptr_t index;
|
||||
TrampolineSelectorPagePair *pagePair;
|
||||
|
||||
if (!anImp) return nil;
|
||||
|
||||
_lock();
|
||||
|
||||
pagePair = _pageAndIndexContainingIMP(anImp, &index, nil);
|
||||
|
||||
if (!pagePair) {
|
||||
_unlock();
|
||||
return nil;
|
||||
}
|
||||
|
||||
TrampolineSelectorPagePair::Payload *payload = pagePair->payload(index);
|
||||
|
||||
if (payload->nextAvailable <= TrampolineSelectorPagePair::endIndex()) {
|
||||
// unallocated
|
||||
_unlock();
|
||||
return nil;
|
||||
}
|
||||
|
||||
_unlock();
|
||||
|
||||
return payload->selector;
|
||||
}
|
||||
|
||||
BOOL imp_removeSelector(IMP anImp) {
|
||||
TrampolineSelectorPagePair *pagePair;
|
||||
TrampolineSelectorPagePair *headPagePair;
|
||||
uintptr_t index;
|
||||
|
||||
if (!anImp) return NO;
|
||||
|
||||
_lock();
|
||||
pagePair = _pageAndIndexContainingIMP(anImp, &index, &headPagePair);
|
||||
|
||||
if (!pagePair) {
|
||||
_unlock();
|
||||
return NO;
|
||||
}
|
||||
|
||||
TrampolineSelectorPagePair::Payload *payload = pagePair->payload(index);
|
||||
|
||||
payload->nextAvailable = pagePair->nextAvailable;
|
||||
pagePair->nextAvailable = index;
|
||||
|
||||
// make sure this page is on available linked list
|
||||
TrampolineSelectorPagePair *pagePairIterator = headPagePair;
|
||||
|
||||
// see if page is the next available page for any existing pages
|
||||
while (pagePairIterator->nextAvailablePage &&
|
||||
pagePairIterator->nextAvailablePage != pagePair)
|
||||
{
|
||||
pagePairIterator = pagePairIterator->nextAvailablePage;
|
||||
}
|
||||
|
||||
if (! pagePairIterator->nextAvailablePage) {
|
||||
// if iteration stopped because nextAvail was nil
|
||||
// add to end of list.
|
||||
pagePairIterator->nextAvailablePage = pagePair;
|
||||
pagePair->nextAvailablePage = nil;
|
||||
}
|
||||
|
||||
_unlock();
|
||||
|
||||
return YES;
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
* a1a2-selectortramps-arm.s
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if __arm__
|
||||
|
||||
#include <arm/arch.h>
|
||||
#include <mach/vm_param.h>
|
||||
|
||||
.syntax unified
|
||||
|
||||
.text
|
||||
|
||||
.private_extern __a1a2_selectorTrampHead
|
||||
.private_extern __a1a2_firstSelectorTramp
|
||||
.private_extern __a1a2_selectorTrampEnd
|
||||
|
||||
// Trampoline machinery assumes the trampolines are Thumb function pointers
|
||||
#if !__thumb2__
|
||||
# error sorry
|
||||
#endif
|
||||
|
||||
.thumb
|
||||
.thumb_func __a1a2_selectorTrampHead
|
||||
.thumb_func __a1a2_firstSelectorTramp
|
||||
.thumb_func __a1a2_selectorTrampEnd
|
||||
|
||||
.align PAGE_MAX_SHIFT
|
||||
__a1a2_selectorTrampHead:
|
||||
// Trampoline's data is one page before the trampoline text.
|
||||
// Also correct PC bias of 4 bytes.
|
||||
// 1. selector
|
||||
sub r12, #PAGE_MAX_SIZE
|
||||
ldr r1, [r12, #-4] // selector -> _cmd
|
||||
// 2. msgSend
|
||||
mov r12, pc
|
||||
sub r12, #PAGE_MAX_SIZE
|
||||
ldr pc, [r12, #-12] // tail call msgSend
|
||||
// not reached
|
||||
nop
|
||||
|
||||
// Align trampolines to 8 bytes
|
||||
.align 3
|
||||
|
||||
.macro TrampolineEntry
|
||||
mov r12, pc
|
||||
b __a1a2_selectorTrampHead
|
||||
.align 3
|
||||
.endmacro
|
||||
|
||||
.macro TrampolineEntryX16
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
.endmacro
|
||||
|
||||
.macro TrampolineEntryX256
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
.endmacro
|
||||
|
||||
.private_extern __a1a2_firstSelectorTramp
|
||||
__a1a2_firstSelectorTramp:
|
||||
// 2048-3 trampolines to fill 16K page
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
|
||||
.private_extern __a1a2_selectorTrampEnd
|
||||
__a1a2_selectorTrampEnd:
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
* a1a2-selectortramps-arm64.s
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if __arm64__
|
||||
|
||||
#include <mach/vm_param.h>
|
||||
|
||||
.text
|
||||
|
||||
.private_extern __a1a2_selectorTrampHead
|
||||
.private_extern __a1a2_firstSelectorTramp
|
||||
.private_extern __a1a2_selectorTrampEnd
|
||||
|
||||
msgSend:
|
||||
.quad 0
|
||||
|
||||
.align PAGE_MAX_SHIFT
|
||||
__a1a2_selectorTrampHead:
|
||||
L_a1a2_selectorTrampHead:
|
||||
// 1. selector
|
||||
ldr x1, [x17] // selector -> _cmd
|
||||
// 2. msgSend
|
||||
adr x17, L_a1a2_selectorTrampHead
|
||||
sub x17, x17, #PAGE_MAX_SIZE
|
||||
ldr x16, [x17]
|
||||
br x16 // tail call msgSend
|
||||
|
||||
// pad up to TrampolineSelectorPagePair header size
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
.macro TrampolineEntry
|
||||
// load address of trampoline data (one page before this instruction)
|
||||
adr x17, -PAGE_MAX_SIZE
|
||||
b L_a1a2_selectorTrampHead
|
||||
.endmacro
|
||||
|
||||
.macro TrampolineEntryX16
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
.endmacro
|
||||
|
||||
.macro TrampolineEntryX256
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
.endmacro
|
||||
|
||||
.align 3
|
||||
.private_extern __a1a2_firstSelectorTramp
|
||||
__a1a2_firstSelectorTramp:
|
||||
// 2048-4 trampolines to fill 16K page
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
|
||||
.private_extern __a1a2_selectorTrampEnd
|
||||
__a1a2_selectorTrampEnd:
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,569 @@
|
||||
/*
|
||||
* a1a2-selectortramps-i386.s
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
#include <mach/mach.h>
|
||||
#include "selectortramps.mac"
|
||||
|
||||
.text
|
||||
.private_extern __a1a2_selectorTrampHead
|
||||
.private_extern __a1a2_firstSelectorTramp
|
||||
.private_extern __a1a2_nextSelectorTramp
|
||||
.private_extern __a1a2_selectorTrampEnd
|
||||
|
||||
.align PAGE_SHIFT
|
||||
__a1a2_selectorTrampHead:
|
||||
// 1. selector
|
||||
popl %eax
|
||||
andl $0xFFFFFFF8, %eax
|
||||
subl $ PAGE_SIZE, %eax
|
||||
movl (%eax), %ecx // selectorPtr -> ecx
|
||||
movl %ecx, 8(%esp) // ecx -> _cmd
|
||||
// 2. msgSend
|
||||
INIT_PIC(__a1a2_selectorTrampHead)
|
||||
PRELOAD(__a1a2_selectorTrampHead, __a1a2_selectorTrampHead)
|
||||
subl $ PAGE_SIZE, LABEL_ADDR(__a1a2_selectorTrampHead, __a1a2_selectorTrampHead)
|
||||
END_PIC()
|
||||
jmp *0(%eax) // tail call msgSend
|
||||
|
||||
.macro TrampolineEntry
|
||||
call __a1a2_selectorTrampHead
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
.endmacro
|
||||
|
||||
.align 5
|
||||
__a1a2_firstSelectorTramp:
|
||||
TrampolineEntry
|
||||
__a1a2_nextSelectorTramp: // used to calculate size of each trampoline
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
|
||||
__a1a2_selectorTrampEnd:
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,568 @@
|
||||
/*
|
||||
* a1a2-selectortramps-x86_64.s
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifdef __x86_64__
|
||||
|
||||
#include <mach/mach.h>
|
||||
#include "selectortramps.mac"
|
||||
|
||||
.text
|
||||
.private_extern __a1a2_selectorTrampHead
|
||||
.private_extern __a1a2_firstSelectorTramp
|
||||
.private_extern __a1a2_nextSelectorTramp
|
||||
.private_extern __a1a2_selectorTrampEnd
|
||||
|
||||
.align PAGE_SHIFT
|
||||
__a1a2_selectorTrampHead:
|
||||
// 1. selector
|
||||
popq %r10
|
||||
andq $0xFFFFFFFFFFFFFFF8, %r10
|
||||
subq $ PAGE_SIZE, %r10
|
||||
movq (%r10), %rsi // selector -> _cmd
|
||||
// 2. msgSend
|
||||
INIT_PIC(__a1a2_selectorTrampHead)
|
||||
PRELOAD(__a1a2_selectorTrampHead, __a1a2_selectorTrampHead)
|
||||
subq $ PAGE_SIZE, LABEL_ADDR(__a1a2_selectorTrampHead, __a1a2_selectorTrampHead)
|
||||
END_PIC()
|
||||
jmp *0(%r10) // tail call msgSend
|
||||
|
||||
.macro TrampolineEntry
|
||||
callq __a1a2_selectorTrampHead
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
.endmacro
|
||||
|
||||
.align 5
|
||||
__a1a2_firstSelectorTramp:
|
||||
TrampolineEntry
|
||||
__a1a2_nextSelectorTramp:
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
|
||||
__a1a2_selectorTrampEnd:
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
* a2a3-selectortramps-arm.s
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if __arm__
|
||||
|
||||
#include <arm/arch.h>
|
||||
#include <mach/vm_param.h>
|
||||
|
||||
.syntax unified
|
||||
|
||||
.text
|
||||
|
||||
.private_extern __a2a3_selectorTrampHead
|
||||
.private_extern __a2a3_firstSelectorTramp
|
||||
.private_extern __a2a3_selectorTrampEnd
|
||||
|
||||
// Trampoline machinery assumes the trampolines are Thumb function pointers
|
||||
#if !__thumb2__
|
||||
# error sorry
|
||||
#endif
|
||||
|
||||
.thumb
|
||||
.thumb_func __a2a3_selectorTrampHead
|
||||
.thumb_func __a2a3_firstSelectorTramp
|
||||
.thumb_func __a2a3_selectorTrampEnd
|
||||
|
||||
.align PAGE_MAX_SHIFT
|
||||
__a2a3_selectorTrampHead:
|
||||
// Trampoline's data is one page before the trampoline text.
|
||||
// Also correct PC bias of 4 bytes.
|
||||
// 1. selector
|
||||
sub r12, #PAGE_MAX_SIZE
|
||||
ldr r2, [r12, #-4] // _cmd = selector
|
||||
// 2. msgSend. Can't "ldr r12, msgSend", error: out of range pc-relative fixup value
|
||||
mov r12, pc
|
||||
sub r12, #PAGE_MAX_SIZE
|
||||
ldr pc, [r12, #-12]
|
||||
// not reached
|
||||
nop
|
||||
|
||||
// Align trampolines to 8 bytes
|
||||
.align 3
|
||||
|
||||
.macro TrampolineEntry
|
||||
mov r12, pc
|
||||
b __a2a3_selectorTrampHead
|
||||
.align 3
|
||||
.endmacro
|
||||
|
||||
.macro TrampolineEntryX16
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
.endmacro
|
||||
|
||||
.macro TrampolineEntryX256
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
.endmacro
|
||||
|
||||
.private_extern __a2a3_firstSelectorTramp
|
||||
__a2a3_firstSelectorTramp:
|
||||
// 2048-2 trampolines to fill 16K page
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
TrampolineEntryX256
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
TrampolineEntryX16
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
|
||||
TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
|
||||
.private_extern __a2a3_selectorTrampEnd
|
||||
__a2a3_selectorTrampEnd:
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,569 @@
|
||||
/*
|
||||
* a2a3-selectortramps-i386.s
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
#include <mach/mach.h>
|
||||
#include "selectortramps.mac"
|
||||
|
||||
.text
|
||||
.private_extern __a2a3_selectorTrampHead
|
||||
.private_extern __a2a3_firstSelectorTramp
|
||||
.private_extern __a2a3_nextSelectorTramp
|
||||
.private_extern __a2a3_selectorTrampEnd
|
||||
|
||||
.align PAGE_SHIFT
|
||||
__a2a3_selectorTrampHead:
|
||||
// 1. selector
|
||||
popl %eax
|
||||
andl $0xFFFFFFF8, %eax
|
||||
subl $ PAGE_SIZE, %eax
|
||||
movl (%eax), %ecx // selectorPtr -> ecx
|
||||
movl %ecx, 12(%esp) // ecx -> _cmd
|
||||
// 2. msgSend
|
||||
INIT_PIC(__a2a3_selectorTrampHead)
|
||||
PRELOAD(__a2a3_selectorTrampHead, __a2a3_selectorTrampHead)
|
||||
subl $ PAGE_SIZE, LABEL_ADDR(__a2a3_selectorTrampHead, __a2a3_selectorTrampHead)
|
||||
END_PIC()
|
||||
jmp *0(%eax) // tail call msgSend
|
||||
|
||||
.macro TrampolineEntry
|
||||
call __a2a3_selectorTrampHead
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
.endmacro
|
||||
|
||||
.align 5
|
||||
__a2a3_firstSelectorTramp:
|
||||
TrampolineEntry
|
||||
__a2a3_nextSelectorTramp:
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
|
||||
__a2a3_selectorTrampEnd:
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,568 @@
|
||||
/*
|
||||
* a2a3-selectortramps-x86_64.s
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifdef __x86_64__
|
||||
|
||||
#include <mach/mach.h>
|
||||
#include "selectortramps.mac"
|
||||
|
||||
.text
|
||||
.private_extern __a2a3_selectorTrampHead
|
||||
.private_extern __a2a3_firstSelectorTramp
|
||||
.private_extern __a2a3_nextSelectorTramp
|
||||
.private_extern __a2a3_selectorTrampEnd
|
||||
|
||||
.align PAGE_SHIFT
|
||||
__a2a3_selectorTrampHead:
|
||||
// 1. selector
|
||||
popq %r10
|
||||
andq $0xFFFFFFFFFFFFFFF8, %r10
|
||||
subq $ PAGE_SIZE, %r10
|
||||
movq (%r10), %rdx // selector -> _cmd
|
||||
// 2. msgSend
|
||||
INIT_PIC(__a2a3_selectorTrampHead)
|
||||
PRELOAD(__a2a3_selectorTrampHead, __a2a3_selectorTrampHead)
|
||||
subq $ PAGE_SIZE, LABEL_ADDR(__a2a3_selectorTrampHead, __a2a3_selectorTrampHead)
|
||||
END_PIC()
|
||||
jmp *0(%r10) // tail call msgSend
|
||||
|
||||
.macro TrampolineEntry
|
||||
callq __a2a3_selectorTrampHead
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
.endmacro
|
||||
|
||||
.align 5
|
||||
__a2a3_firstSelectorTramp:
|
||||
TrampolineEntry
|
||||
__a2a3_nextSelectorTramp:
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
// TrampolineEntry
|
||||
|
||||
__a2a3_selectorTrampEnd:
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* selectortramps.mac
|
||||
* OCMethodTrace
|
||||
*
|
||||
* https://github.com/omxcodec/OCMethodTrace.git
|
||||
*
|
||||
* Copyright (C) 2018 Michael Chen <omxcodec@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifdef __x86_64__
|
||||
#define PRELOAD(x,f) movq x@GOTPCREL(%rip), %r10;
|
||||
#define LABEL_ADDR(x,f) %r10
|
||||
#define LABEL_VALUE(x,f) (%r10)
|
||||
#define INIT_PIC(f)
|
||||
#define END_PIC(f)
|
||||
#elif __i386__
|
||||
#define PRELOAD(x,f) leal x-L0## f ##$pb(%ebx), %eax;
|
||||
#define LABEL_ADDR(x,f) %eax
|
||||
#define LABEL_VALUE(x,f) (%eax)
|
||||
#define INIT_PIC(x) \
|
||||
push %ebx; \
|
||||
call L0## x ##$pb; \
|
||||
L0## x ##$pb:; \
|
||||
pop %ebx;
|
||||
#define END_PIC(x) pop %ebx
|
||||
#endif
|
||||
Reference in New Issue
Block a user