kern: Support older SVC ABIs
This commit is contained in:
@@ -2,19 +2,8 @@
|
||||
import sys, os
|
||||
from struct import pack as pk, unpack as up
|
||||
|
||||
ATMOSPHERE_TARGET_FIRMWARE_100 = 1
|
||||
ATMOSPHERE_TARGET_FIRMWARE_200 = 2
|
||||
ATMOSPHERE_TARGET_FIRMWARE_300 = 3
|
||||
ATMOSPHERE_TARGET_FIRMWARE_400 = 4
|
||||
ATMOSPHERE_TARGET_FIRMWARE_500 = 5
|
||||
ATMOSPHERE_TARGET_FIRMWARE_600 = 6
|
||||
ATMOSPHERE_TARGET_FIRMWARE_620 = 7
|
||||
ATMOSPHERE_TARGET_FIRMWARE_700 = 8
|
||||
ATMOSPHERE_TARGET_FIRMWARE_800 = 9
|
||||
ATMOSPHERE_TARGET_FIRMWARE_810 = 10
|
||||
ATMOSPHERE_TARGET_FIRMWARE_900 = 11
|
||||
ATMOSPHERE_TARGET_FIRMWARE_910 = 12
|
||||
ATMOSPHERE_TARGET_FIRMWARE_1000 = 13
|
||||
def atmosphere_target_firmware(major, minor, micro, rev = 0):
|
||||
return (major << 24) | (minor << 16) | (micro << 8) | rev
|
||||
|
||||
def align_up(val, algn):
|
||||
val += algn - 1
|
||||
@@ -50,7 +39,7 @@ def main(argc, argv):
|
||||
|
||||
with open('mesosphere.bin', 'wb') as f:
|
||||
f.write(kernel[:kernel_metadata_offset + 4])
|
||||
f.write(pk('<QQI', embedded_ini_offset, kernel_ldr_offset, ATMOSPHERE_TARGET_FIRMWARE_1000))
|
||||
f.write(pk('<QQI', embedded_ini_offset, kernel_ldr_offset, atmosphere_target_firmware(10, 1, 0)))
|
||||
f.write(kernel[kernel_metadata_offset + 0x18:])
|
||||
f.seek(embedded_ini_offset)
|
||||
f.write(embedded_ini)
|
||||
|
||||
@@ -318,6 +318,8 @@ namespace ams::kern::init::loader {
|
||||
Elf::ApplyRelocations(GetInteger(virtual_base_address), kernel_dynamic);
|
||||
|
||||
/* Call the kernel's init array functions. */
|
||||
/* NOTE: The kernel does this after reprotecting .rodata, but we do it before. */
|
||||
/* This allows our global constructors to edit .rodata, which is valuable for editing the SVC tables to support older firmwares' ABIs. */
|
||||
Elf::CallInitArrayFuncs(GetInteger(virtual_base_address) + init_array_offset, GetInteger(virtual_base_address) + init_array_end_offset);
|
||||
|
||||
/* Reprotect .rodata as R-- */
|
||||
|
||||
Reference in New Issue
Block a user