diff options
Diffstat (limited to 'kernel_call/parameters.c')
-rwxr-xr-x | kernel_call/parameters.c | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/kernel_call/parameters.c b/kernel_call/parameters.c new file mode 100755 index 0000000..5a5c715 --- /dev/null +++ b/kernel_call/parameters.c @@ -0,0 +1,212 @@ +/* + * parameters.c + * Brandon Azad + */ +#define PARAMETERS_EXTERN +#include "parameters.h" + +#include <assert.h> +#include <stdbool.h> +#include <string.h> +#include <sys/sysctl.h> +#include <sys/utsname.h> + +#include "log.h" +#include "platform.h" +#include "platform_match.h" + +// ---- Initialization routines ------------------------------------------------------------------- + +// A struct describing an initialization. +struct initialization { + const char *devices; + const char *builds; + void (*init)(void); +}; + +// Run initializations matching this platform. +static size_t +run_initializations(struct initialization *inits, size_t count) { + size_t match_count = 0; + for (size_t i = 0; i < count; i++) { + struct initialization *init = &inits[i]; + if (platform_matches(init->devices, init->builds)) { + init->init(); + match_count++; + } + } + return match_count; +} + +// A helper macro to get the number of elements in a static array. +#define ARRAY_COUNT(x) (sizeof(x) / sizeof((x)[0])) + +// ---- General system parameters ----------------------------------------------------------------- + +// Initialization for general system parameters. +static void +init__system_parameters() { + STATIC_ADDRESS(kernel_base) = 0xFFFFFFF007004000; + kernel_slide_step = 0x200000; + message_size_for_kmsg_zone = 76; + kmsg_zone_size = 256; + max_ool_ports_per_message = 16382; + gc_step = 2 * MB; +} + +// A list of general system parameter initializations by platform. +static struct initialization system_parameters[] = { + { "*", "*", init__system_parameters }, +}; + +// ---- Offset initialization --------------------------------------------------------------------- + +// Initialization for iPhone11,8 16C50 (and similar devices). +static void +offsets__iphone11_8__16C50() { + SIZE(ipc_entry) = 0x18; + OFFSET(ipc_entry, ie_object) = 0; + OFFSET(ipc_entry, ie_bits) = 8; + OFFSET(ipc_entry, ie_request) = 16; + + SIZE(ipc_port) = 0xa8; + BLOCK_SIZE(ipc_port) = 0x4000; + OFFSET(ipc_port, ip_bits) = 0; + OFFSET(ipc_port, ip_references) = 4; + OFFSET(ipc_port, waitq_flags) = 24; + OFFSET(ipc_port, imq_messages) = 64; + OFFSET(ipc_port, imq_msgcount) = 80; + OFFSET(ipc_port, imq_qlimit) = 82; + OFFSET(ipc_port, ip_receiver) = 96; + OFFSET(ipc_port, ip_kobject) = 104; + OFFSET(ipc_port, ip_nsrequest) = 112; + OFFSET(ipc_port, ip_requests) = 128; + OFFSET(ipc_port, ip_mscount) = 156; + OFFSET(ipc_port, ip_srights) = 160; + + SIZE(ipc_port_request) = 0x10; + OFFSET(ipc_port_request, ipr_soright) = 0; + + OFFSET(ipc_space, is_table_size) = 0x14; + OFFSET(ipc_space, is_table) = 0x20; + + SIZE(ipc_voucher) = 0x50; + BLOCK_SIZE(ipc_voucher) = 0x4000; + + OFFSET(proc, p_pid) = 0x60; + OFFSET(proc, p_ucred) = 0xf8; + OFFSET(proc, task) = 0x10; + OFFSET(proc, p_list) = 0x8; + + SIZE(sysctl_oid) = 0x50; + OFFSET(sysctl_oid, oid_parent) = 0x0; + OFFSET(sysctl_oid, oid_link) = 0x8; + OFFSET(sysctl_oid, oid_kind) = 0x14; + OFFSET(sysctl_oid, oid_handler) = 0x30; + OFFSET(sysctl_oid, oid_version) = 0x48; + OFFSET(sysctl_oid, oid_refcnt) = 0x4c; + + OFFSET(task, lck_mtx_type) = 0xb; + OFFSET(task, ref_count) = 0x10; + OFFSET(task, active) = 0x14; + OFFSET(task, map) = 0x20; + OFFSET(task, itk_space) = 0x300; + OFFSET(task, bsd_info) = 0x368; +} + +// Initialization for iPhone10,1 16B92 (and similar devices). +static void +offsets__iphone10_1__16B92() { + offsets__iphone11_8__16C50(); + + OFFSET(task, bsd_info) = 0x358; +} + +// Initialization for iPhone10,1 16B92 (and similar devices). +static void +offsets__iphone9_3__15E302() { + SIZE(ipc_entry) = 0x18; + OFFSET(ipc_entry, ie_object) = 0; + OFFSET(ipc_entry, ie_bits) = 8; + OFFSET(ipc_entry, ie_request) = 16; + + SIZE(ipc_port) = 0xa8; + BLOCK_SIZE(ipc_port) = 0x4000; + OFFSET(ipc_port, ip_bits) = 0; + OFFSET(ipc_port, ip_references) = 4; + OFFSET(ipc_port, waitq_flags) = 24; + OFFSET(ipc_port, imq_messages) = 0x40; + OFFSET(ipc_port, imq_msgcount) = 0x50; + OFFSET(ipc_port, imq_qlimit) = 0x52; + OFFSET(ipc_port, ip_receiver) = 0x60; + OFFSET(ipc_port, ip_kobject) = 0x68; + OFFSET(ipc_port, ip_nsrequest) = 0x70; + OFFSET(ipc_port, ip_requests) = 0x80; + OFFSET(ipc_port, ip_mscount) = 0x9c; + OFFSET(ipc_port, ip_srights) = 0xa0; + + SIZE(ipc_port_request) = 0x10; + OFFSET(ipc_port_request, ipr_soright) = 0; + + OFFSET(ipc_space, is_table_size) = 0x14; + OFFSET(ipc_space, is_table) = 0x20; + + SIZE(ipc_voucher) = 0x50; + BLOCK_SIZE(ipc_voucher) = 0x4000; + + OFFSET(proc, p_pid) = 0x10; + OFFSET(proc, p_ucred) = 0x100; + OFFSET(proc, task) = 0x18; + OFFSET(proc, p_list) = 0x8; + + SIZE(sysctl_oid) = 0x50; + OFFSET(sysctl_oid, oid_parent) = 0x0; + OFFSET(sysctl_oid, oid_link) = 0x8; + OFFSET(sysctl_oid, oid_kind) = 0x14; + OFFSET(sysctl_oid, oid_handler) = 0x30; + OFFSET(sysctl_oid, oid_version) = 0x48; + OFFSET(sysctl_oid, oid_refcnt) = 0x4c; + + OFFSET(task, lck_mtx_type) = 0xb; + OFFSET(task, ref_count) = 0x10; + OFFSET(task, active) = 0x14; + OFFSET(task, map) = 0x20; + OFFSET(task, itk_space) = 0x308; + OFFSET(task, bsd_info) = 0x368; +} + +// Initialize offset parameters whose values are computed from other parameters. +static void +initialize_computed_offsets() { + COUNT_PER_BLOCK(ipc_port) = BLOCK_SIZE(ipc_port) / SIZE(ipc_port); + COUNT_PER_BLOCK(ipc_voucher) = BLOCK_SIZE(ipc_voucher) / SIZE(ipc_voucher); +} + +// A list of offset initializations by platform. +static struct initialization offsets[] = { + { "*", "15A5278f-15G77", offsets__iphone9_3__15E302 }, + { "*", "16A366-16D5024a", offsets__iphone10_1__16B92 }, + { "iPhone11,*", "16A366-16D5024a", offsets__iphone11_8__16C50 }, + { "iPad8,*", "16A366-16D5024a", offsets__iphone11_8__16C50 }, + { "*", "*", initialize_computed_offsets }, +}; + +// The minimum number of offsets that must match in order to declare a platform initialized. +static const size_t min_offsets = 2; + +// ---- Public API -------------------------------------------------------------------------------- + +bool +parameters_init() { + // Get general platform info. + platform_init(); + // Initialize general system parameters. + run_initializations(system_parameters, ARRAY_COUNT(system_parameters)); + // Initialize offsets. + size_t count = run_initializations(offsets, ARRAY_COUNT(offsets)); + if (count < min_offsets) { + ERROR("no offsets for %s %s", platform.machine, platform.osversion); + return false; + } + return true; +} |