// BOOT_ARGS: amfi=3 cs_enforcement_disable=1 // Create the base kernel collection // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $CP extensions/kernel-export.kext/Info.plist $BUILD_DIR/extensions/kernel-export-kext/Info.plist // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $CC main.c -o $BUILD_DIR/kernel-auxkc-fixups.exe -Wl,-static -mkernel -nostdlib -Wl,-add_split_seg_info -Wl,-e,__start -Wl,-pie -Wl,-pagezero_size,0x0 -Wl,-install_name,/usr/lib/swift/split.seg.v2.hack -fno-stack-protector -fno-builtin -ffreestanding -Wl,-segprot,__HIB,rx,rx -Wl,-image_base,0x8000 -Wl,-segaddr,__HIB,0x4000 -fno-ptrauth-function-pointer-type-discrimination -ftrivial-auto-var-init=uninitialized // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $CC kernel-export.c -o $BUILD_DIR/extensions/kernel-export-kext/kernel-export -Wl,-kext -Wl,-kext_objects_dir,$BUILD_DIR/KextObjects -mkernel -nostdlib -Wl,-add_split_seg_info -Wl,-install_name,/usr/lib/swift/split.seg.v2.hack -fno-ptrauth-function-pointer-type-discrimination // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $APP_CACHE_UTIL -create-kernel-collection $BUILD_DIR/kernel.kc -kernel $BUILD_DIR/kernel-auxkc-fixups.exe -extensions $BUILD_DIR/extensions -bundle-id com.apple.kernel.export $DEPENDS_ON $BUILD_DIR/extensions/kernel-export-kext/Info.plist $DEPENDS_ON $BUILD_DIR/extensions/kernel-export-kext/kernel-export // Create the pageable kernel collection // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $CP extensions/foo.kext/Info.plist $BUILD_DIR/extensions/foo-kext/Info.plist // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $CP extensions/bar.kext/Info.plist $BUILD_DIR/extensions/bar-kext/Info.plist // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $CC foo.c -o $BUILD_DIR/extensions/foo-kext/foo -Wl,-kext -mkernel -Wl,-kext_objects_dir,$BUILD_DIR/KextObjects -nostdlib -Wl,-add_split_seg_info -Wl,-install_name,/usr/lib/swift/split.seg.v2.hack -fno-ptrauth-function-pointer-type-discrimination // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $CC bar.c -o $BUILD_DIR/extensions/bar-kext/bar -Wl,-kext -mkernel -Wl,-kext_objects_dir,$BUILD_DIR/KextObjects -nostdlib -Wl,-add_split_seg_info -Wl,-install_name,/usr/lib/swift/split.seg.v2.hack -fno-ptrauth-function-pointer-type-discrimination // BUILD(macos,ios,tvos,bridgeos|x86_64,arm64,arm64e): $APP_CACHE_UTIL -create-pageable-kernel-collection $BUILD_DIR/pageable.kc -kernel-collection $BUILD_DIR/kernel.kc -extensions $BUILD_DIR/extensions -bundle-id com.apple.foo $DEPENDS_ON $BUILD_DIR/extensions/foo-kext/Info.plist $DEPENDS_ON $BUILD_DIR/extensions/bar-kext/Info.plist $DEPENDS_ON $BUILD_DIR/extensions/foo-kext/foo $DEPENDS_ON $BUILD_DIR/extensions/bar-kext/bar // BUILD(watchos): // RUN_STATIC: $RUN_STATIC $RUN_DIR/kernel.kc $RUN_DIR/pageable.kc - - #include "../kernel-test-runner.h" #include "../kernel-fixups.h" #include "../kernel-classic-relocs.h" #include "../kernel-helpers.h" #define printf(...) funcs->printf(__VA_ARGS__) int x = 1; int *g = &x; #if __x86_64__ __attribute__((section(("__HIB, __text")))) #else __attribute__((section(("__TEXT_EXEC, __text")))) #endif int _start(const TestRunnerFunctions* funcs) { setFuncs(funcs); const void* slideBasePointers[4]; slideBasePointers[0] = funcs->basePointers[0]; slideBasePointers[1] = funcs->basePointers[1]; slideBasePointers[2] = funcs->basePointers[2]; slideBasePointers[3] = funcs->basePointers[3]; int slideReturnCode = slide(funcs->mhs[0], slideBasePointers, funcs->printf); if ( slideReturnCode != 0 ) { FAIL("mhs[0] slide = %d\n", slideReturnCode); return 0; } int slideClassicReturnCode = slideClassic(funcs->mhs[0], funcs->printf); if ( slideClassicReturnCode != 0 ) { FAIL("mhs[0] slide classic = %d\n", slideClassicReturnCode); return 0; } if ( g[0] != x ) { FAIL("g[0] != x, %d != %d\n", g[0], x); return 0; } // First slide the pageableKC using the top level fixups. These handle the branch GOTs slideReturnCode = slide(funcs->mhs[1], slideBasePointers, funcs->printf); if ( slideReturnCode != 0 ) { FAIL("mhs[1] slide = %d\n", slideReturnCode); return 0; } // Then slide pageable using the fixups attached to the kexts own mach headers slideReturnCode = slideKextsInsideKernelCollection(funcs->mhs[1], slideBasePointers, funcs->printf, funcs); if ( slideReturnCode != 0 ) { FAIL("mhs[1] slide = %d\n", slideReturnCode); return 0; } // If we have any mod init funcs, then lets run them now int runModInitFuncs = runAllModInitFunctionsForAppCache(funcs->mhs[1], funcs->printf, funcs); if ( runModInitFuncs != 0 ) { FAIL("runModInitFuncs = %d\n", runModInitFuncs); return 0; } PASS("Success"); return 0; }