kern: Support older SVC ABIs

This commit is contained in:
Michael Scire
2020-07-13 18:50:37 -07:00
committed by SciresM
parent 3d2eb8e903
commit ff022115ca
7 changed files with 94 additions and 21 deletions

View File

@@ -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)

View File

@@ -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-- */