| Index: third_party/mach_override/mach_override.h
|
| diff --git a/third_party/mach_override/mach_override.h b/third_party/mach_override/mach_override.h
|
| index 76fdb1bbdfc633507b1c8109ae3f4982c69f3df9..ecd319c1cd7a899032e084fc34f32f93cd1d39f7 100644
|
| --- a/third_party/mach_override/mach_override.h
|
| +++ b/third_party/mach_override/mach_override.h
|
| @@ -1,46 +1,7 @@
|
| -/*******************************************************************************
|
| - mach_override.h
|
| - Copyright (c) 2003-2009 Jonathan 'Wolf' Rentzsch: <http://rentzsch.com>
|
| - Some rights reserved: <http://opensource.org/licenses/mit-license.php>
|
| -
|
| - ***************************************************************************/
|
| -
|
| -/***************************************************************************//**
|
| - @mainpage mach_override
|
| - @author Jonathan 'Wolf' Rentzsch: <http://rentzsch.com>
|
| -
|
| - This package, coded in C to the Mach API, allows you to override ("patch")
|
| - program- and system-supplied functions at runtime. You can fully replace
|
| - functions with your implementations, or merely head- or tail-patch the
|
| - original implementations.
|
| -
|
| - Use it by #include'ing mach_override.h from your .c, .m or .mm file(s).
|
| -
|
| - @todo Discontinue use of Carbon's MakeDataExecutable() and
|
| - CompareAndSwap() calls and start using the Mach equivalents, if they
|
| - exist. If they don't, write them and roll them in. That way, this
|
| - code will be pure Mach, which will make it easier to use everywhere.
|
| - Update: MakeDataExecutable() has been replaced by
|
| - msync(MS_INVALIDATE). There is an OSCompareAndSwap in libkern, but
|
| - I'm currently unsure if I can link against it. May have to roll in
|
| - my own version...
|
| - @todo Stop using an entire 4K high-allocated VM page per 28-byte escape
|
| - branch island. Done right, this will dramatically speed up escape
|
| - island allocations when they number over 250. Then again, if you're
|
| - overriding more than 250 functions, maybe speed isn't your main
|
| - concern...
|
| - @todo Add detection of: b, bl, bla, bc, bcl, bcla, bcctrl, bclrl
|
| - first-instructions. Initially, we should refuse to override
|
| - functions beginning with these instructions. Eventually, we should
|
| - dynamically rewrite them to make them position-independent.
|
| - @todo Write mach_unoverride(), which would remove an override placed on a
|
| - function. Must be multiple-override aware, which means an almost
|
| - complete rewrite under the covers, because the target address can't
|
| - be spread across two load instructions like it is now since it will
|
| - need to be atomically updatable.
|
| - @todo Add non-rentry variants of overrides to test_mach_override.
|
| -
|
| - ***************************************************************************/
|
| +// mach_override.h semver:1.2.0
|
| +// Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com
|
| +// Some rights reserved: http://opensource.org/licenses/mit
|
| +// https://github.com/rentzsch/mach_override
|
|
|
| #ifndef _mach_override_
|
| #define _mach_override_
|
| @@ -48,16 +9,11 @@
|
| #include <sys/types.h>
|
| #include <mach/error.h>
|
|
|
| -#ifdef __cplusplus
|
| - extern "C" {
|
| -#endif
|
| -
|
| -/**
|
| - Returned if the function to be overrided begins with a 'mfctr' instruction.
|
| -*/
|
| #define err_cannot_override (err_local|1)
|
|
|
| -/************************************************************************************//**
|
| +__BEGIN_DECLS
|
| +
|
| +/****************************************************************************************
|
| Dynamically overrides the function implementation referenced by
|
| originalFunctionAddress with the implentation pointed to by overrideFunctionAddress.
|
| Optionally returns a pointer to a "reentry island" which, if jumped to, will resume
|
| @@ -81,41 +37,40 @@ mach_override_ptr(
|
| const void *overrideFunctionAddress,
|
| void **originalFunctionReentryIsland );
|
|
|
| -/************************************************************************************//**
|
| -
|
| +__END_DECLS
|
| +
|
| +/****************************************************************************************
|
| + If you're using C++ this macro will ease the tedium of typedef'ing, naming, keeping
|
| + track of reentry islands and defining your override code. See test_mach_override.cp
|
| + for example usage.
|
|
|
| ************************************************************************************/
|
|
|
| #ifdef __cplusplus
|
| +#define MACH_OVERRIDE( ORIGINAL_FUNCTION_RETURN_TYPE, ORIGINAL_FUNCTION_NAME, ORIGINAL_FUNCTION_ARGS, ERR ) \
|
| +{ \
|
| + static ORIGINAL_FUNCTION_RETURN_TYPE (*ORIGINAL_FUNCTION_NAME##_reenter)ORIGINAL_FUNCTION_ARGS; \
|
| + static bool ORIGINAL_FUNCTION_NAME##_overriden = false; \
|
| + class mach_override_class__##ORIGINAL_FUNCTION_NAME { \
|
| + public: \
|
| + static kern_return_t override(void *originalFunctionPtr) { \
|
| + kern_return_t result = err_none; \
|
| + if (!ORIGINAL_FUNCTION_NAME##_overriden) { \
|
| + ORIGINAL_FUNCTION_NAME##_overriden = true; \
|
| + result = mach_override_ptr( (void*)originalFunctionPtr, \
|
| + (void*)mach_override_class__##ORIGINAL_FUNCTION_NAME::replacement, \
|
| + (void**)&ORIGINAL_FUNCTION_NAME##_reenter ); \
|
| + } \
|
| + return result; \
|
| + } \
|
| + static ORIGINAL_FUNCTION_RETURN_TYPE replacement ORIGINAL_FUNCTION_ARGS {
|
|
|
| -#define MACH_OVERRIDE( ORIGINAL_FUNCTION_RETURN_TYPE, ORIGINAL_FUNCTION_NAME, ORIGINAL_FUNCTION_ARGS, ERR ) \
|
| - { \
|
| - static ORIGINAL_FUNCTION_RETURN_TYPE (*ORIGINAL_FUNCTION_NAME##_reenter)ORIGINAL_FUNCTION_ARGS; \
|
| - static bool ORIGINAL_FUNCTION_NAME##_overriden = false; \
|
| - class mach_override_class__##ORIGINAL_FUNCTION_NAME { \
|
| - public: \
|
| - static kern_return_t override(void *originalFunctionPtr) { \
|
| - kern_return_t result = err_none; \
|
| - if (!ORIGINAL_FUNCTION_NAME##_overriden) { \
|
| - ORIGINAL_FUNCTION_NAME##_overriden = true; \
|
| - result = mach_override_ptr( (void*)originalFunctionPtr, \
|
| - (void*)mach_override_class__##ORIGINAL_FUNCTION_NAME::replacement, \
|
| - (void**)&ORIGINAL_FUNCTION_NAME##_reenter ); \
|
| - } \
|
| - return result; \
|
| - } \
|
| - static ORIGINAL_FUNCTION_RETURN_TYPE replacement ORIGINAL_FUNCTION_ARGS {
|
| -
|
| -#define END_MACH_OVERRIDE( ORIGINAL_FUNCTION_NAME ) \
|
| - } \
|
| - }; \
|
| - \
|
| - err = mach_override_class__##ORIGINAL_FUNCTION_NAME::override((void*)ORIGINAL_FUNCTION_NAME); \
|
| - }
|
| -
|
| +#define END_MACH_OVERRIDE( ORIGINAL_FUNCTION_NAME ) \
|
| + } \
|
| + }; \
|
| + \
|
| + err = mach_override_class__##ORIGINAL_FUNCTION_NAME::override((void*)ORIGINAL_FUNCTION_NAME); \
|
| +}
|
| #endif
|
|
|
| -#ifdef __cplusplus
|
| - }
|
| -#endif
|
| #endif // _mach_override_
|
|
|