diff --git a/makerom/exheader.c b/makerom/exheader.c index ac90276..d18c1ac 100644 --- a/makerom/exheader.c +++ b/makerom/exheader.c @@ -11,23 +11,25 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * int get_ExHeaderSettingsFromRsf(exheader_settings *exhdrset); int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *rsf); -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *rsf); -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *rsf); -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf, bool useAccessDescPreset); +int get_ExHeaderDependencyList(u8 *depList, rsf_settings *rsf); +int get_ExHeaderSystemInfo(exhdr_SystemInfo *systemInfo, rsf_settings *rsf); +int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int get_ExHeaderARM11SystemLocalInfoLimited(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); -int GetAppType(int *AppType, rsf_settings *rsf); +int GetAppType(rsf_settings *rsf); int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +void SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +int SetARM11StorageInfoFsAccessInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +void SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +void SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *rsf); -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); +void SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf); int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *rsf); int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); -void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); +void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int sysCall); void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall); int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); @@ -37,17 +39,17 @@ int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); bool IsEndAddress(u32 Address); bool IsStartAddress(u32 Address); -u32 GetIOMappingDesc(u32 Address); -u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly); -u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO); +u32 GetIOMappingDesc(u32 address); +u32 GetStaticMappingDesc(u32 address, bool IsReadOnly); +u32 GetMappingDesc(u32 address, u32 prefixVal, s32 numPrefixBits, bool IsRO); int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf); -void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value); -void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask); -void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num); +void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 index, u32 value); +void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 bitmask); +void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 num); u32 GetDescPrefixMask(int numPrefixBits); -u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal); +u32 GetDescPrefixBits(int numPrefixBits, u32 prefixVal); int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *rsf); /* ExHeader Signature Functions */ @@ -146,7 +148,7 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * exhdrset->exHdr->codeSetInfo.flag |= infoflag_COMPRESS_EXEFS_0; if(ncchset->options.UseOnSD) exhdrset->exHdr->codeSetInfo.flag |= infoflag_SD_APPLICATION; - if(!ncchset->options.UseRomFS) // Move this later + if(!ncchset->options.UseRomFS) exhdrset->exHdr->arm11SystemLocalCapabilities.storageInfo.otherAttributes |= attribute_NOT_USE_ROMFS; return 0; @@ -155,26 +157,30 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * int get_ExHeaderSettingsFromRsf(exheader_settings *exhdrset) { int result = 0; - result = get_ExHeaderCodeSetInfo(&exhdrset->exHdr->codeSetInfo, exhdrset->rsf); - if(result) goto finish; - if(!exhdrset->useAccessDescPreset){ - result = get_ExHeaderDependencyList((u8*)&exhdrset->exHdr->dependencyList[0], exhdrset->rsf); - if(result) goto finish; + if((result = get_ExHeaderCodeSetInfo(&exhdrset->exHdr->codeSetInfo, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderDependencyList((u8*)exhdrset->exHdr->dependencyList, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderSystemInfo(&exhdrset->exHdr->systemInfo, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM11SystemLocalInfo(&exhdrset->exHdr->arm11SystemLocalCapabilities, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM11KernelInfo(&exhdrset->exHdr->arm11KernelCapabilities, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM9AccessControlInfo(&exhdrset->exHdr->arm9AccessControlInfo, exhdrset->rsf))) + goto finish; } - - result = get_ExHeaderSystemInfo(&exhdrset->exHdr->systemInfo, exhdrset->rsf); - if(result) goto finish; - - result = get_ExHeaderARM11SystemLocalInfo(&exhdrset->exHdr->arm11SystemLocalCapabilities, exhdrset->rsf, exhdrset->useAccessDescPreset); - if(result) goto finish; - - if(!exhdrset->useAccessDescPreset){ - result = get_ExHeaderARM11KernelInfo(&exhdrset->exHdr->arm11KernelCapabilities, exhdrset->rsf); - if(result) goto finish; + else{ + if((result = get_ExHeaderCodeSetInfo(&exhdrset->exHdr->codeSetInfo, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderSystemInfo(&exhdrset->exHdr->systemInfo, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM11SystemLocalInfoLimited(&exhdrset->exHdr->arm11SystemLocalCapabilities, exhdrset->rsf))) + goto finish; + if((result = get_ExHeaderARM9AccessControlInfo(&exhdrset->exHdr->arm9AccessControlInfo, exhdrset->rsf))) + goto finish; } - result = get_ExHeaderARM9AccessControlInfo(&exhdrset->exHdr->arm9AccessControlInfo, exhdrset->rsf); - if(result) goto finish; finish: return result; @@ -186,109 +192,117 @@ int get_ExHeaderCodeSetInfo(exhdr_CodeSetInfo *CodeSetInfo, rsf_settings *rsf) if(rsf->BasicInfo.Title){ //if(strlen(rsf->BasicInfo.Title) > 8){ // fprintf(stderr,"[EXHEADER ERROR] Parameter Too Long \"BasicInfo/Title\"\n"); - // return EXHDR_BAD_YAML_OPT; + // return EXHDR_BAD_RSF_OPT; //} strncpy((char*)CodeSetInfo->name,rsf->BasicInfo.Title,8); } else{ ErrorParamNotFound("BasicInfo/Title"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } + /* Stack Size */ - if(rsf->SystemControlInfo.StackSize){ - u32 StackSize = strtoul(rsf->SystemControlInfo.StackSize,NULL,0); - u32_to_u8(CodeSetInfo->stackSize,StackSize,LE); - } + if(rsf->SystemControlInfo.StackSize) + u32_to_u8(CodeSetInfo->stackSize, strtoul(rsf->SystemControlInfo.StackSize,NULL,0), LE); else{ ErrorParamNotFound("SystemControlInfo/StackSize"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } /* Remaster Version */ - if(rsf->SystemControlInfo.RemasterVersion){ - u16 RemasterVersion = strtol(rsf->SystemControlInfo.RemasterVersion,NULL,0); - u16_to_u8(CodeSetInfo->remasterVersion,RemasterVersion,LE); - } - else{ - u16_to_u8(CodeSetInfo->remasterVersion,0,LE); - } + if(rsf->SystemControlInfo.RemasterVersion) + u16_to_u8(CodeSetInfo->remasterVersion, strtol(rsf->SystemControlInfo.RemasterVersion,NULL,0), LE); + else + u16_to_u8(CodeSetInfo->remasterVersion, 0, LE); + return 0; } -int get_ExHeaderDependencyList(u8 *DependencyList, rsf_settings *rsf) +int get_ExHeaderDependencyList(u8 *depList, rsf_settings *rsf) { if(rsf->SystemControlInfo.DependencyNum > 0x30){ fprintf(stderr,"[EXHEADER ERROR] Too Many Dependency IDs\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } for(int i = 0; i < rsf->SystemControlInfo.DependencyNum; i++){ - u8 *pos = (DependencyList + 0x8*i); - u64 TitleID = strtoull(rsf->SystemControlInfo.Dependency[i],NULL,0); - u64_to_u8(pos,TitleID,LE); + u8 *pos = (depList + 0x8*i); + u64_to_u8(pos, strtoull(rsf->SystemControlInfo.Dependency[i],NULL,0), LE); } return 0; } -int get_ExHeaderSystemInfo(exhdr_SystemInfo *SystemInfo, rsf_settings *rsf) +int get_ExHeaderSystemInfo(exhdr_SystemInfo *systemInfo, rsf_settings *rsf) { /* SaveDataSize */ if(rsf->SystemControlInfo.SaveDataSize){ - u64 SaveDataSize = 0; - int ret = GetSaveDataSizeFromString(&SaveDataSize,rsf->SystemControlInfo.SaveDataSize,"EXHEADER"); - if(ret) return ret; - u64_to_u8(SystemInfo->savedataSize,SaveDataSize,LE); - } - else{ - u64_to_u8(SystemInfo->savedataSize,0,LE); + u64 saveSize = 0; + if(GetSaveDataSizeFromString(&saveSize,rsf->SystemControlInfo.SaveDataSize,"EXHEADER")) + return EXHDR_BAD_RSF_OPT; + u64_to_u8(systemInfo->savedataSize, saveSize, LE); } + else + u64_to_u8(systemInfo->savedataSize,0,LE); + /* Jump Id */ - if(rsf->SystemControlInfo.JumpId){ - u64 JumpId = strtoull(rsf->SystemControlInfo.JumpId,NULL,0); - u64_to_u8(SystemInfo->jumpId,JumpId,LE); - } + if(rsf->SystemControlInfo.JumpId) + u64_to_u8(systemInfo->jumpId, strtoull(rsf->SystemControlInfo.JumpId,NULL,0), LE); + else{ - u64 JumpId = 0; - int result = GetProgramID(&JumpId,rsf,false); - if(result) return result; - u64_to_u8(SystemInfo->jumpId,JumpId,LE); + u64 jumpId = 0; + if(GetProgramID(&jumpId,rsf,false)) + return EXHDR_BAD_RSF_OPT; + u64_to_u8(systemInfo->jumpId,jumpId,LE); } return 0; } -int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf, bool useAccessDescPreset) +int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { /* Program Id */ - u64 ProgramId = 0; - int result = GetProgramID(&ProgramId,rsf,true); - if(result) return result; - u64_to_u8(arm11->programId,ProgramId,LE); + u64 programId = 0; + if(GetProgramID(&programId,rsf,true)) + return EXHDR_BAD_RSF_OPT; + u64_to_u8(arm11->programId,programId,LE); - if(!useAccessDescPreset){ - /* Flags */ - result = SetARM11SystemLocalInfoFlags(arm11, rsf); - if(result) return result; + /* Flags */ + if(SetARM11SystemLocalInfoFlags(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; - /* Resource Limit Descriptors */ - result = SetARM11ResLimitDesc(arm11, rsf); - if(result) return result; - } + /* Resource Limit Descriptors */ + if(SetARM11ResLimitDesc(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; /* Storage Info */ - result = SetARM11StorageInfo(arm11, rsf); - if(result) return result; + if(SetARM11StorageInfo(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; - if(!useAccessDescPreset){ - /* Service Access Control */ - result = SetARM11ServiceAccessControl(arm11, rsf); - if(result) return result; + /* Service Access Control */ + if(SetARM11ServiceAccessControl(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; - /* Resource Limit Category */ - if(rsf->AccessControlInfo.ResourceLimitCategory){ - if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"application") == 0) arm11->resourceLimitCategory = resrc_limit_APPLICATION; - else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"sysapplet") == 0) arm11->resourceLimitCategory = resrc_limit_SYS_APPLET; - else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"libapplet") == 0) arm11->resourceLimitCategory = resrc_limit_LIB_APPLET; - else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"other") == 0) arm11->resourceLimitCategory = resrc_limit_OTHER; - } + /* Resource Limit Category */ + if(rsf->AccessControlInfo.ResourceLimitCategory){ + if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"application") == 0) arm11->resourceLimitCategory = resrc_limit_APPLICATION; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"sysapplet") == 0) arm11->resourceLimitCategory = resrc_limit_SYS_APPLET; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"libapplet") == 0) arm11->resourceLimitCategory = resrc_limit_LIB_APPLET; + else if(strcasecmp(rsf->AccessControlInfo.ResourceLimitCategory,"other") == 0) arm11->resourceLimitCategory = resrc_limit_OTHER; } + + /* Finish */ + return 0; +} + +int get_ExHeaderARM11SystemLocalInfoLimited(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +{ + /* Program Id */ + u64 programId = 0; + if(GetProgramID(&programId,rsf,true)) + return EXHDR_BAD_RSF_OPT; + u64_to_u8(arm11->programId,programId,LE); + + /* Storage Info */ + if(SetARM11StorageInfo(arm11, rsf)) + return EXHDR_BAD_RSF_OPT; + /* Finish */ return 0; } @@ -296,72 +310,69 @@ int get_ExHeaderARM11SystemLocalInfo(exhdr_ARM11SystemLocalCapabilities *arm11, int SetARM11SystemLocalInfoFlags(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { /* Core Version */ - if(rsf->AccessControlInfo.CoreVersion){ - u32 Version = strtoul(rsf->AccessControlInfo.CoreVersion,NULL,0); - u32_to_u8(arm11->coreVersion,Version,LE); - } + if(rsf->AccessControlInfo.CoreVersion) + u32_to_u8(arm11->coreVersion,strtoul(rsf->AccessControlInfo.CoreVersion,NULL,0),LE); else{ ErrorParamNotFound("AccessControlInfo/CoreVersion"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } /* Flag */ - u8 AffinityMask = 0; - u8 IdealProcessor = 0; - u8 SystemMode = 0; + u8 affinityMask = 0; + u8 idealProcessor = 0; + u8 systemMode = 0; + if(rsf->AccessControlInfo.AffinityMask){ - AffinityMask = strtol(rsf->AccessControlInfo.AffinityMask,NULL,0); - if(AffinityMask > 1){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected AffinityMask: %d. Expected range: 0x0 - 0x1\n",AffinityMask); - return EXHDR_BAD_YAML_OPT; + affinityMask = strtol(rsf->AccessControlInfo.AffinityMask,NULL,0); + if(affinityMask > 1){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected AffinityMask: %d. Expected range: 0x0 - 0x1\n",affinityMask); + return EXHDR_BAD_RSF_OPT; } } if(rsf->AccessControlInfo.IdealProcessor){ - IdealProcessor = strtol(rsf->AccessControlInfo.IdealProcessor,NULL,0); - if(IdealProcessor > 1){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected IdealProcessor: %d. Expected range: 0x0 - 0x1\n",IdealProcessor); - return EXHDR_BAD_YAML_OPT; + idealProcessor = strtol(rsf->AccessControlInfo.IdealProcessor,NULL,0); + if(idealProcessor > 1){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected IdealProcessor: %d. Expected range: 0x0 - 0x1\n",idealProcessor); + return EXHDR_BAD_RSF_OPT; } } if(rsf->AccessControlInfo.SystemMode){ - SystemMode = strtol(rsf->AccessControlInfo.SystemMode,NULL,0); - if(SystemMode > 15){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected SystemMode: 0x%x. Expected range: 0x0 - 0xf\n",SystemMode); - return EXHDR_BAD_YAML_OPT; + systemMode = strtol(rsf->AccessControlInfo.SystemMode,NULL,0); + if(systemMode > 15){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected SystemMode: 0x%x. Expected range: 0x0 - 0xf\n",systemMode); + return EXHDR_BAD_RSF_OPT; } } - arm11->flag = (u8)(SystemMode << 4 | AffinityMask << 2 | IdealProcessor); + arm11->flag = (u8)(systemMode << 4 | affinityMask << 2 | idealProcessor); /* Thread Priority */ if(rsf->AccessControlInfo.Priority){ - u8 Priority = strtoul(rsf->AccessControlInfo.Priority,NULL,0); - int ProccessType = 0; - GetAppType(&ProccessType,rsf); - if(ProccessType == processtype_APPLICATION || ProccessType == processtype_DEFAULT){ - Priority += 32; + u8 priority = strtoul(rsf->AccessControlInfo.Priority,NULL,0); + if(GetAppType(rsf) == processtype_APPLICATION) + priority += 32; + if(priority > 127){ + fprintf(stderr,"[EXHEADER ERROR] Invalid Priority: %d\n",priority); + return EXHDR_BAD_RSF_OPT; } - if(Priority > 127){ - fprintf(stderr,"[EXHEADER ERROR] Invalid Priority: %d\n",Priority); - return EXHDR_BAD_YAML_OPT; - } - arm11->priority = Priority; + arm11->priority = priority; } else{ ErrorParamNotFound("AccessControlInfo/Priority"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } return 0; } -int GetAppType(int *AppType, rsf_settings *rsf) -{ - *AppType = processtype_DEFAULT; +int GetAppType(rsf_settings *rsf) +{ if(rsf->SystemControlInfo.AppType){ - if(strcasecmp(rsf->SystemControlInfo.AppType,"application") == 0) *AppType = processtype_APPLICATION; - else if(strcasecmp(rsf->SystemControlInfo.AppType,"system") == 0) *AppType = processtype_SYSTEM; + if(strcasecmp(rsf->SystemControlInfo.AppType,"application") == 0) + return processtype_APPLICATION; + else if(strcasecmp(rsf->SystemControlInfo.AppType,"system") == 0) + return processtype_SYSTEM; } - return 0; + return processtype_APPLICATION; } int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) @@ -381,16 +392,15 @@ int SetARM11ResLimitDesc(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(rsf->AccessControlInfo.UseExtendedSaveDataAccessControl || rsf->AccessControlInfo.AccessibleSaveDataIds){ + if(rsf->AccessControlInfo.AccessibleSaveDataIds){ /* Accessible SaveData IDs */ if(!CheckCondiditionsForNewAccessibleSaveDataIds(rsf)) - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; SetARM11StorageInfoAccessibleSaveDataIds(arm11,rsf); } else{ /* Extdata Id */ - int ret = SetARM11StorageInfoExtSaveDataId(arm11,rsf); - if(ret) return ret; + SetARM11StorageInfoExtSaveDataId(arm11,rsf); /* OtherUserSaveData */ SetARM11StorageInfoOtherUserSaveData(arm11,rsf); } @@ -399,172 +409,142 @@ int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings SetARM11StorageInfoSystemSaveDataId(arm11,rsf); /* FileSystem Access Info */ - u32 AccessInfo = 0; + return SetARM11StorageInfoFsAccessInfo(arm11,rsf); +} + +int SetARM11StorageInfoFsAccessInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +{ + u32 accessInfo = 0; for(int i = 0; i < rsf->AccessControlInfo.FileSystemAccessNum; i++){ if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategorySystemApplication") == 0) - AccessInfo |= fsaccess_CATEGORY_SYSTEM_APPLICATION; + accessInfo |= fsaccess_CATEGORY_SYSTEM_APPLICATION; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryHardwareCheck") == 0) - AccessInfo |= fsaccess_CATEGORY_HARDWARE_CHECK; + accessInfo |= fsaccess_CATEGORY_HARDWARE_CHECK; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryFileSystemTool") == 0) - AccessInfo |= fsaccess_CATEGORY_FILE_SYSTEM_TOOL; + accessInfo |= fsaccess_CATEGORY_FILE_SYSTEM_TOOL; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Debug") == 0) - AccessInfo |= fsaccess_DEBUG; + accessInfo |= fsaccess_DEBUG; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"TwlCardBackup") == 0) - AccessInfo |= fsaccess_TWL_CARD_BACKUP; + accessInfo |= fsaccess_TWL_CARD_BACKUP; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"TwlNandData") == 0) - AccessInfo |= fsaccess_TWL_NAND_DATA; + accessInfo |= fsaccess_TWL_NAND_DATA; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Boss") == 0) - AccessInfo |= fsaccess_BOSS; + accessInfo |= fsaccess_BOSS; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - AccessInfo |= fsaccess_DIRECT_SDMC; + accessInfo |= fsaccess_DIRECT_SDMC; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Core") == 0) - AccessInfo |= fsaccess_CORE; + accessInfo |= fsaccess_CORE; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRo") == 0) - AccessInfo |= fsaccess_CTR_NAND_RO; + accessInfo |= fsaccess_CTR_NAND_RO; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRw") == 0) - AccessInfo |= fsaccess_CTR_NAND_RW; + accessInfo |= fsaccess_CTR_NAND_RW; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CtrNandRoWrite") == 0) - AccessInfo |= fsaccess_CTR_NAND_RO_WRITE; + accessInfo |= fsaccess_CTR_NAND_RO_WRITE; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategorySystemSettings") == 0) - AccessInfo |= fsaccess_CATEGORY_SYSTEM_SETTINGS; + accessInfo |= fsaccess_CATEGORY_SYSTEM_SETTINGS; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CardBoard") == 0) - AccessInfo |= fsaccess_CARD_BOARD; + accessInfo |= fsaccess_CARD_BOARD; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"ExportImportIvs") == 0) - AccessInfo |= fsaccess_EXPORT_IMPORT_IVS; + accessInfo |= fsaccess_EXPORT_IMPORT_IVS; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmcWrite") == 0) - AccessInfo |= fsaccess_DIRECT_SDMC_WRITE; + accessInfo |= fsaccess_DIRECT_SDMC_WRITE; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"SwitchCleanup") == 0) - AccessInfo |= fsaccess_SWITCH_CLEANUP; + accessInfo |= fsaccess_SWITCH_CLEANUP; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"SaveDataMove") == 0) - AccessInfo |= fsaccess_SAVE_DATA_MOVE; + accessInfo |= fsaccess_SAVE_DATA_MOVE; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Shop") == 0) - AccessInfo |= fsaccess_SHOP; + accessInfo |= fsaccess_SHOP; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"Shell") == 0) - AccessInfo |= fsaccess_SHELL; + accessInfo |= fsaccess_SHELL; else if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"CategoryHomeMenu") == 0) - AccessInfo |= fsaccess_CATEGORY_HOME_MENU; + accessInfo |= fsaccess_CATEGORY_HOME_MENU; else{ fprintf(stderr,"[EXHEADER ERROR] Invalid FileSystemAccess Name: \"%s\"\n",rsf->AccessControlInfo.FileSystemAccess[i]); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } } - u32_to_u8(arm11->storageInfo.accessInfo,AccessInfo,LE); + u32_to_u8(arm11->storageInfo.accessInfo,accessInfo,LE); + return 0; } -int SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +void SetARM11StorageInfoSystemSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(rsf->AccessControlInfo.SystemSaveDataId1){ - u32 SaveId = strtoul(rsf->AccessControlInfo.SystemSaveDataId1,NULL,0); - u32_to_u8(arm11->storageInfo.systemSavedataId,SaveId,LE); - } - if(rsf->AccessControlInfo.SystemSaveDataId2){ - u32 SaveId = strtoul(rsf->AccessControlInfo.SystemSaveDataId2,NULL,0); - u32_to_u8(&arm11->storageInfo.systemSavedataId[4],SaveId,LE); - } - return 0; + if(rsf->AccessControlInfo.SystemSaveDataId1) + u32_to_u8(arm11->storageInfo.systemSavedataId[0], strtoul(rsf->AccessControlInfo.SystemSaveDataId1,NULL,0), LE); + + if(rsf->AccessControlInfo.SystemSaveDataId2) + u32_to_u8(arm11->storageInfo.systemSavedataId[1], strtoul(rsf->AccessControlInfo.SystemSaveDataId2,NULL,0), LE); } -int SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +void SetARM11StorageInfoExtSaveDataId(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - if(rsf->AccessControlInfo.ExtSaveDataId){ - if(!rsf->AccessControlInfo.UseExtSaveData){ - fprintf(stderr,"[EXHEADER ERROR] Failed to set ExtSaveDataId. UseExtSaveData must be true.\n"); - return EXHDR_BAD_YAML_OPT; - } - u64 ExtdataId = strtoull(rsf->AccessControlInfo.ExtSaveDataId,NULL,0); - u64_to_u8(arm11->storageInfo.extSavedataId,ExtdataId,LE); - } - return 0; + if(rsf->AccessControlInfo.ExtSaveDataId) + u64_to_u8(arm11->storageInfo.extSavedataId, strtoull(rsf->AccessControlInfo.ExtSaveDataId,NULL,0), LE); } -int SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +void SetARM11StorageInfoOtherUserSaveData(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - u64 Value = 0; + u64 value = 0; if(rsf->AccessControlInfo.OtherUserSaveDataId1) - Value = 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0); - Value = Value << 20; + value = 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0); + value = value << 20; if(rsf->AccessControlInfo.OtherUserSaveDataId2) - Value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0); - Value = Value << 20; + value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0); + value = value << 20; if(rsf->AccessControlInfo.OtherUserSaveDataId3) - Value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0); + value |= 0xffffff & strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0); /* UseOtherVariationSaveData Flag */ if(rsf->AccessControlInfo.UseOtherVariationSaveData) - Value |= 0x1000000000000000; + value |= 0x1000000000000000; - u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,Value,LE); - return 0; + u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,value,LE); } bool CheckCondiditionsForNewAccessibleSaveDataIds(rsf_settings *rsf) { - if(!rsf->AccessControlInfo.UseExtendedSaveDataAccessControl){ - if(rsf->AccessControlInfo.AccessibleSaveDataIds) - fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds is unavailable if UseExtendedSaveDataAccessControl is false.\n"); - return false; - } - - /* - if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum == 0){ - fprintf(stderr,"[EXHEADER ERROR] AccessibleSaveDataIds must be specified if UseExtendedSaveDataAccessControl is true.\n"); - return false; - } - */ - if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 6){ fprintf(stderr,"[EXHEADER ERROR] Too many UniqueId in \"AccessibleSaveDataIds\".\n"); return false; } - - if(rsf->AccessControlInfo.UseExtSaveData){ - fprintf(stderr,"[EXHEADER ERROR] UseExtSaveData must be false if AccessibleSaveDataIds is specified.\n"); - return false; - } if (rsf->AccessControlInfo.ExtSaveDataId){ fprintf(stderr,"[EXHEADER ERROR] ExtSaveDataId is unavailable if AccessibleSaveDataIds is specified.\n"); return false; } - if (rsf->AccessControlInfo.OtherUserSaveDataId1){ - if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId1 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } + if (rsf->AccessControlInfo.OtherUserSaveDataId1 && strtoul(rsf->AccessControlInfo.OtherUserSaveDataId1,NULL,0) > 0){ + fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId1 must be 0 if AccessibleSaveDataIds is specified.\n"); + return false; } - if (rsf->AccessControlInfo.OtherUserSaveDataId2){ - if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId2 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } + if (rsf->AccessControlInfo.OtherUserSaveDataId2 && strtoul(rsf->AccessControlInfo.OtherUserSaveDataId2,NULL,0) > 0){ + fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId2 must be 0 if AccessibleSaveDataIds is specified.\n"); + return false; } - if (rsf->AccessControlInfo.OtherUserSaveDataId3){ - if(strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0) > 0){ - fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId3 must be 0 if AccessibleSaveDataIds is specified.\n"); - return false; - } + if (rsf->AccessControlInfo.OtherUserSaveDataId3 && strtoul(rsf->AccessControlInfo.OtherUserSaveDataId3,NULL,0) > 0){ + fprintf(stderr,"[EXHEADER ERROR] OtherUserSaveDataId3 must be 0 if AccessibleSaveDataIds is specified.\n"); + return false; } return true; } -int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) +void SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) { - u64 RegionExtSaveDataId = 0; - u64 RegionOtherUseSaveData = 0; + u64 region_ExtSaveDataId = 0; + u64 region_OtherUseSaveData = 0; if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 0){ - u32 Max = rsf->AccessControlInfo.AccessibleSaveDataIdsNum < 3 ? rsf->AccessControlInfo.AccessibleSaveDataIdsNum : 3; - for(int i = 0; i < Max; i++){ - u32 UniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); - RegionOtherUseSaveData = RegionOtherUseSaveData << 20; - RegionOtherUseSaveData |= UniqueID; + u32 max = rsf->AccessControlInfo.AccessibleSaveDataIdsNum < 3 ? rsf->AccessControlInfo.AccessibleSaveDataIdsNum : 3; + for(int i = 0; i < max; i++){ + u32 uniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); + region_OtherUseSaveData = region_OtherUseSaveData << 20; + region_OtherUseSaveData |= uniqueID; } } if(rsf->AccessControlInfo.AccessibleSaveDataIdsNum > 3){ for(int i = 3; i < rsf->AccessControlInfo.AccessibleSaveDataIdsNum; i++){ - u32 UniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); - RegionExtSaveDataId = RegionExtSaveDataId << 20; - RegionExtSaveDataId |= UniqueID; + u32 uniqueID = 0xffffff & strtoul(rsf->AccessControlInfo.AccessibleSaveDataIds[i],NULL,0); + region_ExtSaveDataId = region_ExtSaveDataId << 20; + region_ExtSaveDataId |= uniqueID; } } @@ -572,11 +552,10 @@ int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities /* UseOtherVariationSaveData Flag */ if(rsf->AccessControlInfo.UseOtherVariationSaveData) - RegionOtherUseSaveData |= 0x1000000000000000; + region_OtherUseSaveData |= 0x1000000000000000; - u64_to_u8(arm11->storageInfo.extSavedataId,RegionExtSaveDataId,LE); - u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,RegionOtherUseSaveData,LE); - return 0; + u64_to_u8(arm11->storageInfo.extSavedataId,region_ExtSaveDataId,LE); + u64_to_u8(arm11->storageInfo.storageAccessableUniqueIds,region_OtherUseSaveData,LE); } int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings *rsf) @@ -584,20 +563,19 @@ int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_ if(rsf->AccessControlInfo.ServiceAccessControl){ if(rsf->AccessControlInfo.ServiceAccessControlNum > 32){ fprintf(stderr,"[EXHEADER ERROR] Too Many Service Names, maximum is 32\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } for(int i = 0; i < rsf->AccessControlInfo.ServiceAccessControlNum; i++){ - int svc_handle_len = strlen(rsf->AccessControlInfo.ServiceAccessControl[i]); - if(svc_handle_len > 8){ + if(strlen(rsf->AccessControlInfo.ServiceAccessControl[i]) > 8){ fprintf(stderr,"[EXHEADER ERROR] Service Name: \"%s\" is too long\n",rsf->AccessControlInfo.ServiceAccessControl[i]); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } - memcpy(arm11->serviceAccessControl[i],rsf->AccessControlInfo.ServiceAccessControl[i],svc_handle_len); + strncpy((char*)arm11->serviceAccessControl[i],rsf->AccessControlInfo.ServiceAccessControl[i],8); } } else{ ErrorParamNotFound("AccessControlInfo/ServiceAccessControl"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } return 0; } @@ -605,87 +583,89 @@ int SetARM11ServiceAccessControl(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_ int get_ExHeaderARM11KernelInfo(exhdr_ARM11KernelCapabilities *arm11, rsf_settings *rsf) { int result = 0; + u16 totalDesc, descIndex; ARM11KernelCapabilityDescriptor desc[6]; - memset(&desc,0,sizeof(ARM11KernelCapabilityDescriptor)*6); + clrmem(&desc,sizeof(ARM11KernelCapabilityDescriptor)*6); /* Get Descriptors */ - result = SetARM11KernelDescSysCallControl(&desc[0],rsf); - if(result) goto finish; - result = SetARM11KernelDescInteruptNumList(&desc[1],rsf); - if(result) goto finish; - result = SetARM11KernelDescAddressMapping(&desc[2],rsf); - if(result) goto finish; - result = SetARM11KernelDescOtherCapabilities(&desc[3],rsf); - if(result) goto finish; - result = SetARM11KernelDescHandleTableSize(&desc[4],rsf); - if(result) goto finish; - result = SetARM11KernelDescReleaseKernelVersion(&desc[5],rsf); + if((result = SetARM11KernelDescSysCallControl(&desc[0],rsf))) + goto finish; + if((result = SetARM11KernelDescInteruptNumList(&desc[1],rsf))) + goto finish; + if((result = SetARM11KernelDescAddressMapping(&desc[2],rsf))) + goto finish; + if((result = SetARM11KernelDescOtherCapabilities(&desc[3],rsf))) + goto finish; + if((result = SetARM11KernelDescHandleTableSize(&desc[4],rsf))) + goto finish; + if((result = SetARM11KernelDescReleaseKernelVersion(&desc[5],rsf))) + goto finish; /* Write Descriptors To Exheader */ - u16 TotalDesc = 0; - for(int i = 0; i < 6; i++){ - TotalDesc += desc[i].num; - } - if(TotalDesc >= 28){ + totalDesc = 0; + for(int i = 0; i < 6; i++) + totalDesc += desc[i].num; + + if(totalDesc >= 28){ fprintf(stderr,"[EXHEADER ERROR] Too many Kernel Capabilities.\n"); - result = EXHDR_BAD_YAML_OPT; + result = EXHDR_BAD_RSF_OPT; goto finish; } - u16 DescIndex = 0; + + descIndex = 0; for(int i = 0; i < 6; i++){ for(int j = 0; j < desc[i].num; j++){ - u32_to_u8(arm11->descriptors[DescIndex],desc[i].Data[j],LE); - DescIndex++; + u32_to_u8(arm11->descriptors[descIndex],desc[i].data[j],LE); + descIndex++; } } /* Fill Remaining Descriptors with 0xffffffff */ - for(int i = DescIndex; i < 28; i++){ + for(int i = descIndex; i < 28; i++) u32_to_u8(arm11->descriptors[i],0xffffffff,LE); - } finish: - for(int i = 0; i < 6; i++){ - free(desc[i].Data); - } + for(int i = 0; i < 6; i++) + free(desc[i].data); return result; } int SetARM11KernelDescSysCallControl(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; + u16 activeSysCallDesc, sysCallDescPos; // Create Temporary Descriptor ARM11KernelCapabilityDescriptor tmp; - memset(&tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); + clrmem(&tmp,sizeof(ARM11KernelCapabilityDescriptor)); AllocateARM11KernelDescMemory(&tmp,8); for(int i = 0; i < 8; i++) SetARM11KernelDescValue(&tmp,i,desc_SysCallControl | (i << 24)); // Get SysCalls - ret = GetARM11SysCalls(&tmp,rsf); - if(ret) goto finish; + if((ret = GetARM11SysCalls(&tmp,rsf))) + goto finish; // Count Active Syscall Descs - u16 ActiveSysCallDesc = 0; + activeSysCallDesc = 0; for(int i = 0; i < 8; i++) - if((tmp.Data[i] & 0x00ffffff) != 0) - ActiveSysCallDesc++; + if((tmp.data[i] & 0x00ffffff) != 0) + activeSysCallDesc++; // Transfer Active Syscall Descs to out Descriptor - AllocateARM11KernelDescMemory(desc,ActiveSysCallDesc); - u16 SysCallDescPos = 0; + AllocateARM11KernelDescMemory(desc,activeSysCallDesc); + sysCallDescPos = 0; for(int i = 0; i < 8; i++){ - if((tmp.Data[i] & 0x00ffffff) != 0) { - SetARM11KernelDescValue(desc,SysCallDescPos,tmp.Data[i]); - SysCallDescPos++; + if((tmp.data[i] & 0x00ffffff) != 0) { + SetARM11KernelDescValue(desc,sysCallDescPos,tmp.data[i]); + sysCallDescPos++; } } finish: // Free data in Temporary Descriptor - free(tmp.Data); + free(tmp.data); return ret; } @@ -693,38 +673,39 @@ int GetARM11SysCalls(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { if(!rsf->AccessControlInfo.SystemCallAccess){ ErrorParamNotFound("AccessControlInfo/SystemCallAccess"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } for(int i = 0; i < rsf->AccessControlInfo.SystemCallAccessNum; i++){ - int SysCall = strtoul(rsf->AccessControlInfo.SystemCallAccess[i],NULL,0); - if(SysCall > 184){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected Syscall: 0x%02x. Expected Range: 0x00 - 0xB8\n",SysCall); - return EXHDR_BAD_YAML_OPT; + int sysCall = strtoul(rsf->AccessControlInfo.SystemCallAccess[i],NULL,0); + if(sysCall > 184){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected Syscall: 0x%02x. Expected Range: 0x00 - 0xB8\n",sysCall); + return EXHDR_BAD_RSF_OPT; } - EnableSystemCall(desc,SysCall); + EnableSystemCall(desc,sysCall); } return 0; } -void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) +void EnableSystemCall(ARM11KernelCapabilityDescriptor *desc, int sysCall) { - int num = SysCall / 24; - int num1 = SysCall % 24; - desc->Data[num] |= 1 << (num1 & 31); + int num = sysCall / 24; + int num1 = sysCall % 24; + desc->data[num] |= 1 << (num1 & 31); } -void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int SysCall) +void DisableSystemCall(ARM11KernelCapabilityDescriptor *desc, int sysCall) { - int num = SysCall / 24; - int num1 = SysCall % 24; - desc->Data[num] = desc->Data[num] & ~(1 << (num1 & 31)); + int num = sysCall / 24; + int num1 = sysCall % 24; + desc->data[num] = desc->data[num] & ~(1 << (num1 & 31)); } int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; - + u16 activeInteruptDesc, interuptDescPos; + // Create Temporary Descriptor ARM11KernelCapabilityDescriptor tmp; memset(&tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); @@ -736,43 +717,43 @@ int SetARM11KernelDescInteruptNumList(ARM11KernelCapabilityDescriptor *desc, rsf if(ret) goto finish; // Count Active Interupt Descs - u16 ActiveInteruptDesc = 0; + activeInteruptDesc = 0; for(int i = 0; i < 8; i++) - if(tmp.Data[i]) - ActiveInteruptDesc++; + if(tmp.data[i]) + activeInteruptDesc++; // Transfer Active Interupt Descs to output Descriptor - AllocateARM11KernelDescMemory(desc,ActiveInteruptDesc); - u16 InteruptDescPos = 0; + AllocateARM11KernelDescMemory(desc,activeInteruptDesc); + interuptDescPos = 0; for(int i = 0; i < 8; i++){ - if(tmp.Data[i]) { - SetARM11KernelDescValue(desc,InteruptDescPos,(tmp.Data[i] & 0x0fffffff) | desc_InteruptNumList); - InteruptDescPos++; + if(tmp.data[i]) { + SetARM11KernelDescValue(desc,interuptDescPos,(tmp.data[i] & 0x0fffffff) | desc_InteruptNumList); + interuptDescPos++; } } finish: // Free data in Temporary Descriptor - free(tmp.Data); + free(tmp.data); return ret; } int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - if(!rsf->AccessControlInfo.InterruptNumbers){ + if(!rsf->AccessControlInfo.InterruptNumbers) return 0; - } + if(rsf->AccessControlInfo.InterruptNumbersNum > 32){ fprintf(stderr,"[EXHEADER ERROR] Too many Interupts. Maximum is 32\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } for(int i = 0; i < rsf->AccessControlInfo.InterruptNumbersNum; i++){ - int Interrupt = strtoul(rsf->AccessControlInfo.InterruptNumbers[i],NULL,0); - if(Interrupt > 0x7f){ - fprintf(stderr,"[EXHEADER ERROR] Unexpected Interupt: 0x%02x. Expected Range: 0x00 - 0x7f\n",Interrupt); - return EXHDR_BAD_YAML_OPT; + int interrupt = strtoul(rsf->AccessControlInfo.InterruptNumbers[i],NULL,0); + if(interrupt > 0x7f){ + fprintf(stderr,"[EXHEADER ERROR] Unexpected Interupt: 0x%02x. Expected Range: 0x00 - 0x7f\n",interrupt); + return EXHDR_BAD_RSF_OPT; } - EnableInterupt(desc,Interrupt,i); + EnableInterupt(desc,interrupt,i); } return 0; @@ -781,44 +762,46 @@ int GetARM11Interupts(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) void EnableInterupt(ARM11KernelCapabilityDescriptor *desc, int Interrupt, int i) { int num = i / 4; - if(num*4 == i) desc->Data[num] |= 0xffffffff; - desc->Data[num] = desc->Data[num] << 7; - desc->Data[num] |= Interrupt; + if(num*4 == i) desc->data[num] |= 0xffffffff; + desc->data[num] = desc->data[num] << 7; + desc->data[num] |= Interrupt; } int SetARM11KernelDescAddressMapping(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { int ret = 0; + u16 memMapDescPos; + // Create Temporary Descriptors ARM11KernelCapabilityDescriptor io_tmp; - memset(&io_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); + clrmem(&io_tmp,sizeof(ARM11KernelCapabilityDescriptor)); ARM11KernelCapabilityDescriptor static_tmp; - memset(&static_tmp,0,sizeof(ARM11KernelCapabilityDescriptor)); + clrmem(&static_tmp,sizeof(ARM11KernelCapabilityDescriptor)); // Getting IO Mapping - ret = GetARM11IOMappings(&io_tmp,rsf); - if(ret) goto finish; + if((ret = GetARM11IOMappings(&io_tmp,rsf))) + goto finish; // Getting Static Mapping - ret = GetARM11StaticMappings(&static_tmp,rsf); - if(ret) goto finish; + if((ret = GetARM11StaticMappings(&static_tmp,rsf))) + goto finish; // Creating Output Descriptor and Combining the two MemMap Descriptors AllocateARM11KernelDescMemory(desc,io_tmp.num+static_tmp.num); - u16 MemMapDescPos = 0; + memMapDescPos = 0; for(int i = 0; i < io_tmp.num; i++){ - SetARM11KernelDescValue(desc,MemMapDescPos,io_tmp.Data[i]); - MemMapDescPos++; + SetARM11KernelDescValue(desc,memMapDescPos,io_tmp.data[i]); + memMapDescPos++; } for(int i = 0; i < static_tmp.num; i++){ - SetARM11KernelDescValue(desc,MemMapDescPos,static_tmp.Data[i]); - MemMapDescPos++; + SetARM11KernelDescValue(desc,memMapDescPos,static_tmp.data[i]); + memMapDescPos++; } finish: - free(io_tmp.Data); - free(static_tmp.Data); + free(io_tmp.data); + free(static_tmp.data); return ret; } @@ -826,9 +809,10 @@ int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { if(!rsf->AccessControlInfo.IORegisterMapping) return 0; - + AllocateARM11KernelDescMemory(desc,rsf->AccessControlInfo.IORegisterMappingNum*2); - u16 DescUsed = 0; + u16 descUsed = 0; + for(int i = 0; i < rsf->AccessControlInfo.IORegisterMappingNum; i++){ if(strlen(rsf->AccessControlInfo.IORegisterMapping[i])){ // Parse Address String @@ -845,38 +829,36 @@ int GetARM11IOMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) u32 AddressStart = strtoul(AddressStartStr,NULL,16); if(!IsStartAddress(AddressStart)){ fprintf(stderr,"[EXHEADER ERROR] Address 0x%x is not valid mapping start address.\n",AddressStart); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } if(!AddressEndStr){ // No End Addr Was Specified - SetARM11KernelDescValue(desc,DescUsed,GetIOMappingDesc(AddressStart)); - DescUsed++; - goto skip; + SetARM11KernelDescValue(desc,descUsed,GetIOMappingDesc(AddressStart)); + descUsed++; + continue; } u32 AddressEnd = strtoul(AddressEndStr,NULL,16); if(!IsEndAddress(AddressEnd)){ fprintf(stderr,"[EXHEADER ERROR] Address 0x%x is not valid mapping end address.\n",AddressEnd); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } u32 DescStartAddr = GetStaticMappingDesc(AddressStart,false); u32 DescEndAddr = GetStaticMappingDesc(AddressEnd+0x1000,false); if(DescStartAddr != DescEndAddr){ - SetARM11KernelDescValue(desc,DescUsed,DescStartAddr); - SetARM11KernelDescValue(desc,DescUsed+1,DescEndAddr); - DescUsed += 2; - goto skip; + SetARM11KernelDescValue(desc,descUsed,DescStartAddr); + SetARM11KernelDescValue(desc,descUsed+1,DescEndAddr); + descUsed += 2; + continue; } else{ - SetARM11KernelDescValue(desc,DescUsed,GetIOMappingDesc(AddressStart)); - DescUsed++; - goto skip; + SetARM11KernelDescValue(desc,descUsed,GetIOMappingDesc(AddressStart)); + descUsed++; + continue; } } - - skip: ; } - desc->num = DescUsed; + desc->num = descUsed; return 0; } @@ -886,7 +868,7 @@ int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings * return 0; AllocateARM11KernelDescMemory(desc,rsf->AccessControlInfo.MemoryMappingNum*2); - u16 DescUsed = 0; + u16 descUsed = 0; for(int i = 0; i < rsf->AccessControlInfo.MemoryMappingNum; i++){ if(strlen(rsf->AccessControlInfo.MemoryMapping[i])){ char *AddressStartStr = rsf->AccessControlInfo.MemoryMapping[i]; @@ -908,115 +890,113 @@ int GetARM11StaticMappings(ARM11KernelCapabilityDescriptor *desc, rsf_settings * u32 AddressStart = strtoul(AddressStartStr,NULL,16); if(!IsStartAddress(AddressStart)){ fprintf(stderr,"[EXHEADER ERROR] Address 0x%x (%s) is not valid mapping start address.\n",AddressStart,AddressStartStr); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } if(!AddressEndStr){ // No End Addr Was Specified - SetARM11KernelDescValue(desc,DescUsed,GetStaticMappingDesc(AddressStart,IsRO)); - SetARM11KernelDescValue(desc,DescUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); - DescUsed += 2; - goto skip; + SetARM11KernelDescValue(desc,descUsed,GetStaticMappingDesc(AddressStart,IsRO)); + SetARM11KernelDescValue(desc,descUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); + descUsed += 2; + continue; } u32 AddressEnd = strtoul(AddressEndStr,NULL,16); if(!IsEndAddress(AddressEnd)){ fprintf(stderr,"[EXHEADER ERROR] Address 0x%x (%s) is not valid mapping end address.\n",AddressEnd,AddressEndStr); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } u32 DescStartAddr = GetStaticMappingDesc(AddressStart,IsRO); u32 DescEndAddr = GetStaticMappingDesc(AddressEnd+0x1000,true); if(DescStartAddr != DescEndAddr){ - SetARM11KernelDescValue(desc,DescUsed,DescStartAddr); - SetARM11KernelDescValue(desc,DescUsed+1,DescEndAddr); - DescUsed += 2; - goto skip; + SetARM11KernelDescValue(desc,descUsed,DescStartAddr); + SetARM11KernelDescValue(desc,descUsed+1,DescEndAddr); + descUsed += 2; + continue; } else{ - SetARM11KernelDescValue(desc,DescUsed,GetStaticMappingDesc(AddressStart,IsRO)); - SetARM11KernelDescValue(desc,DescUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); - DescUsed += 2; - goto skip; + SetARM11KernelDescValue(desc,descUsed,GetStaticMappingDesc(AddressStart,IsRO)); + SetARM11KernelDescValue(desc,descUsed+1,GetStaticMappingDesc(AddressStart+0x1000, true)); + descUsed += 2; + continue; } } - - skip: ; } - desc->num = DescUsed; + desc->num = descUsed; return 0; } -bool IsEndAddress(u32 Address) +bool IsEndAddress(u32 address) { - return (Address & 0x0fff) == 0x0fff; + return (address & 0x0fff) == 0x0fff; } -bool IsStartAddress(u32 Address) +bool IsStartAddress(u32 address) { - return (Address & 0x0fff) == 0; + return (address & 0x0fff) == 0; } -u32 GetIOMappingDesc(u32 Address) +u32 GetIOMappingDesc(u32 address) { - return GetMappingDesc(Address,0xFFE,0xC,false); + return GetMappingDesc(address,0xFFE,0xC,false); } -u32 GetStaticMappingDesc(u32 Address, bool IsReadOnly) +u32 GetStaticMappingDesc(u32 address, bool IsReadOnly) { - return GetMappingDesc(Address,0x7FC,0xB,IsReadOnly); + return GetMappingDesc(address,0x7FC,0xB,IsReadOnly); } -u32 GetMappingDesc(u32 Address, u32 PrefixVal, s32 numPrefixBits, bool IsRO) +u32 GetMappingDesc(u32 address, u32 prefixVal, s32 numPrefixBits, bool IsRO) { - u32 PrefixMask = GetDescPrefixMask(numPrefixBits); - u32 PrefixBits = GetDescPrefixBits(numPrefixBits,PrefixVal); - u32 Desc = (Address >> 12 & ~PrefixMask) | PrefixBits; + u32 prefixMask = GetDescPrefixMask(numPrefixBits); + u32 prefixBits = GetDescPrefixBits(numPrefixBits,prefixVal); + u32 desc = (address >> 12 & ~prefixMask) | prefixBits; if (IsRO) - Desc |= 0x100000; - return Desc; + desc |= 0x100000; + return desc; } int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { - u32 OtherCapabilities = 0; + u32 otherCapabilities = 0; + u32 memType = 0; if(!rsf->AccessControlInfo.DisableDebug) - OtherCapabilities |= othcap_PERMIT_DEBUG; + otherCapabilities |= othcap_PERMIT_DEBUG; if(rsf->AccessControlInfo.EnableForceDebug) - OtherCapabilities |= othcap_FORCE_DEBUG; + otherCapabilities |= othcap_FORCE_DEBUG; if(rsf->AccessControlInfo.CanUseNonAlphabetAndNumber) - OtherCapabilities |= othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; + otherCapabilities |= othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; if(rsf->AccessControlInfo.CanWriteSharedPage) - OtherCapabilities |= othcap_CAN_WRITE_SHARED_PAGE; + otherCapabilities |= othcap_CAN_WRITE_SHARED_PAGE; if(rsf->AccessControlInfo.CanUsePrivilegedPriority) - OtherCapabilities |= othcap_CAN_USE_PRIVILEGE_PRIORITY; + otherCapabilities |= othcap_CAN_USE_PRIVILEGE_PRIORITY; if(rsf->AccessControlInfo.PermitMainFunctionArgument) - OtherCapabilities |= othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; + otherCapabilities |= othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; if(rsf->AccessControlInfo.CanShareDeviceMemory) - OtherCapabilities |= othcap_CAN_SHARE_DEVICE_MEMORY; + otherCapabilities |= othcap_CAN_SHARE_DEVICE_MEMORY; if(rsf->AccessControlInfo.RunnableOnSleep) - OtherCapabilities |= othcap_RUNNABLE_ON_SLEEP; + otherCapabilities |= othcap_RUNNABLE_ON_SLEEP; if(rsf->AccessControlInfo.SpecialMemoryArrange) - OtherCapabilities |= othcap_SPECIAL_MEMORY_ARRANGE; + otherCapabilities |= othcap_SPECIAL_MEMORY_ARRANGE; if(rsf->AccessControlInfo.MemoryType){ - u32 MemType = 0; if(strcasecmp(rsf->AccessControlInfo.MemoryType,"application") == 0) - MemType = memtype_APPLICATION; + memType = memtype_APPLICATION; else if(strcasecmp(rsf->AccessControlInfo.MemoryType,"system") == 0) - MemType = memtype_SYSTEM; + memType = memtype_SYSTEM; else if(strcasecmp(rsf->AccessControlInfo.MemoryType,"base") == 0) - MemType = memtype_BASE; + memType = memtype_BASE; else{ fprintf(stderr,"[EXHEADER ERROR] Invalid memory type: \"%s\"\n",rsf->AccessControlInfo.MemoryType); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } - OtherCapabilities = (OtherCapabilities & 0xffffff0f) | MemType << 8; + otherCapabilities = (otherCapabilities & 0xffffff0f) | memType << 8; } - if(OtherCapabilities){ + if(otherCapabilities){ AllocateARM11KernelDescMemory(desc,1); SetARM11KernelDescBitmask(desc,desc_OtherCapabilities); - SetARM11KernelDescValue(desc,0,OtherCapabilities); + SetARM11KernelDescValue(desc,0,otherCapabilities); } return 0; } @@ -1024,18 +1004,18 @@ int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, r int SetARM11KernelDescHandleTableSize(ARM11KernelCapabilityDescriptor *desc, rsf_settings *rsf) { if(rsf->AccessControlInfo.HandleTableSize){ - u16 HandleTableSize = strtoul(rsf->AccessControlInfo.HandleTableSize,NULL,0); - if(HandleTableSize > 1023){ + u16 handleTableSize = strtoul(rsf->AccessControlInfo.HandleTableSize,NULL,0); + if(handleTableSize > 1023){ fprintf(stderr,"[EXHEADER ERROR] Too large handle table size\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } AllocateARM11KernelDescMemory(desc,1); SetARM11KernelDescBitmask(desc,desc_HandleTableSize); - SetARM11KernelDescValue(desc,0,HandleTableSize); + SetARM11KernelDescValue(desc,0,handleTableSize); } else{ ErrorParamNotFound("AccessControlInfo/HandleTableSize"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } return 0; } @@ -1055,24 +1035,24 @@ int SetARM11KernelDescReleaseKernelVersion(ARM11KernelCapabilityDescriptor *desc return 0; } -void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 Index, u32 Value) +void SetARM11KernelDescValue(ARM11KernelCapabilityDescriptor *desc, u16 index, u32 value) { - if(Index >= desc->num) return; - desc->Data[Index] |= Value; + if(index >= desc->num) return; + desc->data[index] |= value; } -void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 Bitmask) +void SetARM11KernelDescBitmask(ARM11KernelCapabilityDescriptor *desc, u32 bitmask) { for(int i = 0; i < desc->num; i++) - SetARM11KernelDescValue(desc,i,Bitmask); + SetARM11KernelDescValue(desc,i,bitmask); } -void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 Num) +void AllocateARM11KernelDescMemory(ARM11KernelCapabilityDescriptor *desc, u16 num) { - if(Num == 0) return; - desc->num = Num; - desc->Data = malloc(sizeof(u32)*Num); - memset(desc->Data,0,sizeof(u32)*Num); + if(num == 0) return; + desc->num = num; + desc->data = malloc(sizeof(u32)*num); + clrmem(desc->data,sizeof(u32)*num); return; } @@ -1081,63 +1061,58 @@ u32 GetDescPrefixMask(int numPrefixBits) return (u32)(~((1 << (32 - (numPrefixBits & 31))) - 1)); } -u32 GetDescPrefixBits(int numPrefixBits, u32 PrefixVal) +u32 GetDescPrefixBits(int numPrefixBits, u32 prefixVal) { - return PrefixVal << (32 - (numPrefixBits & 31)); + return prefixVal << (32 - (numPrefixBits & 31)); } int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_settings *rsf) { - u32 Arm9AccessControl = 0; + u32 arm9AccessControl = 0; for(int i = 0; i < rsf->AccessControlInfo.IoAccessControlNum; i++){ if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountNand") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_NAND; + arm9AccessControl |= arm9cap_FS_MOUNT_NAND; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountNandRoWrite") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_NAND_RO_WRITE; + arm9AccessControl |= arm9cap_FS_MOUNT_NAND_RO_WRITE; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountTwln") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_TWLN; + arm9AccessControl |= arm9cap_FS_MOUNT_TWLN; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountWnand") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_WNAND; + arm9AccessControl |= arm9cap_FS_MOUNT_WNAND; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"FsMountCardSpi") == 0) - Arm9AccessControl |= arm9cap_FS_MOUNT_CARD_SPI; + arm9AccessControl |= arm9cap_FS_MOUNT_CARD_SPI; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"UseSdif3") == 0) - Arm9AccessControl |= arm9cap_USE_SDIF3; + arm9AccessControl |= arm9cap_USE_SDIF3; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"CreateSeed") == 0) - Arm9AccessControl |= arm9cap_CREATE_SEED; + arm9AccessControl |= arm9cap_CREATE_SEED; else if(strcmp(rsf->AccessControlInfo.IoAccessControl[i],"UseCardSpi") == 0) - Arm9AccessControl |= arm9cap_USE_CARD_SPI; + arm9AccessControl |= arm9cap_USE_CARD_SPI; else{ fprintf(stderr,"[EXHEADER ERROR] Invalid IoAccessControl Name: \"%s\"\n",rsf->AccessControlInfo.IoAccessControl[i]); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } } for(int i = 0; i < rsf->AccessControlInfo.FileSystemAccessNum; i++){ if(strcmp(rsf->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - Arm9AccessControl |= arm9cap_USE_DIRECT_SDMC; + arm9AccessControl |= arm9cap_USE_DIRECT_SDMC; } if(rsf->Option.UseOnSD) - Arm9AccessControl |= arm9cap_SD_APPLICATION; + arm9AccessControl |= arm9cap_SD_APPLICATION; - u32_to_u8(arm9->descriptors,Arm9AccessControl,LE); + u32_to_u8(arm9->descriptors,arm9AccessControl,LE); - if(rsf->AccessControlInfo.DescVersion){ + if(rsf->AccessControlInfo.DescVersion) arm9->descriptors[15] = strtol(rsf->AccessControlInfo.DescVersion,NULL,0); - } else{ //ErrorParamNotFound("AccessControlInfo/DescVersion"); - //return EXHDR_BAD_YAML_OPT; + //return EXHDR_BAD_RSF_OPT; arm9->descriptors[15] = 2; // Makerom generates a desc version 2 anyway, so if not specified, it will be set to 2 } return 0; } - - - - /* Generic Exheader Errors */ void ErrorParamNotFound(char *string) { @@ -1222,14 +1197,14 @@ int GetSaveDataSizeFromString(u64 *out, char *string, char *moduleName) fprintf(stderr,"[%s ERROR] Invalid save data size format.\n",moduleName); else fprintf(stderr,"[ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } if((SaveDataSize & 65536) != 0){ if(moduleName) fprintf(stderr,"[%s ERROR] Save data size must be aligned to 64K.\n",moduleName); else fprintf(stderr,"[ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } *out = SaveDataSize; return 0; @@ -1260,11 +1235,11 @@ int GetSaveDataSize_rsf(u64 *SaveDataSize, user_settings *usrset) } else{ fprintf(stderr,"[EXHEADER ERROR] Invalid save data size format.\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } if((*SaveDataSize & 65536) != 0){ fprintf(stderr,"[EXHEADER ERROR] Save data size must be aligned to 64K.\n"); - return EXHDR_BAD_YAML_OPT; + return EXHDR_BAD_RSF_OPT; } } else{ diff --git a/makerom/exheader.h b/makerom/exheader.h index ee1e2d4..d33639c 100644 --- a/makerom/exheader.h +++ b/makerom/exheader.h @@ -117,7 +117,7 @@ typedef struct typedef struct { u8 extSavedataId[8]; - u8 systemSavedataId[8]; + u8 systemSavedataId[2][4]; u8 storageAccessableUniqueIds[8]; u8 accessInfo[7]; u8 otherAttributes; @@ -140,7 +140,7 @@ typedef struct typedef struct { u16 num; - u32 *Data; + u32 *data; } ARM11KernelCapabilityDescriptor; typedef enum diff --git a/makerom/exheader_build.h b/makerom/exheader_build.h index f7fd894..4645c07 100644 --- a/makerom/exheader_build.h +++ b/makerom/exheader_build.h @@ -4,7 +4,7 @@ typedef enum { COMMON_HEADER_KEY_NOT_FOUND = -10, - EXHDR_BAD_YAML_OPT = -11, + EXHDR_BAD_RSF_OPT = -11, CANNOT_SIGN_ACCESSDESC = -12 } exheader_errors; diff --git a/makerom/rsf_settings.c b/makerom/rsf_settings.c index c0cdbb2..fdfa291 100644 --- a/makerom/rsf_settings.c +++ b/makerom/rsf_settings.c @@ -64,13 +64,11 @@ void GET_Option(ctr_yaml_context *ctx, rsf_settings *rsf) // Handle childs if(cmpYamlValue("AllowUnalignedSection",ctx)) SetBoolYAMLValue(&rsf->Option.AllowUnalignedSection,"AllowUnalignedSection",ctx); else if(cmpYamlValue("MediaFootPadding",ctx)) SetBoolYAMLValue(&rsf->Option.MediaFootPadding,"MediaFootPadding",ctx); - //else if(cmpYamlValue("NoPadding",ctx)) SetBoolYAMLValue(&rsf->Option.NoPadding,"NoPadding",ctx); else if(cmpYamlValue("EnableCrypt",ctx)) SetBoolYAMLValue(&rsf->Option.EnableCrypt,"EnableCrypt",ctx); else if(cmpYamlValue("EnableCompress",ctx)) SetBoolYAMLValue(&rsf->Option.EnableCompress,"EnableCompress",ctx); else if(cmpYamlValue("FreeProductCode",ctx)) SetBoolYAMLValue(&rsf->Option.FreeProductCode,"FreeProductCode",ctx); else if(cmpYamlValue("UseOnSD",ctx)) SetBoolYAMLValue(&rsf->Option.UseOnSD,"UseOnSD",ctx); else if(cmpYamlValue("PageSize",ctx)) SetSimpleYAMLValue(&rsf->Option.PageSize,"PageSize",ctx,0); - //else if(cmpYamlValue("AppendSystemCall",ctx)) rsf->Option.AppendSystemCallNum = SetYAMLSequence(&rsf->Option.AppendSystemCall,"AppendSystemCall",ctx); else{ fprintf(stderr,"[RSF ERROR] Unrecognised key '%s'\n",GetYamlString(ctx)); ctx->error = YAML_UNKNOWN_KEY; @@ -102,13 +100,10 @@ void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) else if(cmpYamlValue("PermitMainFunctionArgument",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.PermitMainFunctionArgument,"PermitMainFunctionArgument",ctx); else if(cmpYamlValue("CanShareDeviceMemory",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.CanShareDeviceMemory,"CanShareDeviceMemory",ctx); else if(cmpYamlValue("UseOtherVariationSaveData",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.UseOtherVariationSaveData,"UseOtherVariationSaveData",ctx); - else if(cmpYamlValue("UseExtSaveData",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.UseExtSaveData,"UseExtSaveData",ctx); - else if(cmpYamlValue("UseExtendedSaveDataAccessControl",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.UseExtendedSaveDataAccessControl,"UseExtendedSaveDataAccessControl",ctx); else if(cmpYamlValue("RunnableOnSleep",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.RunnableOnSleep,"RunnableOnSleep",ctx); else if(cmpYamlValue("SpecialMemoryArrange",ctx)) SetBoolYAMLValue(&rsf->AccessControlInfo.SpecialMemoryArrange,"SpecialMemoryArrange",ctx); - //else if(cmpYamlValue("ProgramId",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ProgramId,"ProgramId",ctx,0); else if(cmpYamlValue("IdealProcessor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.IdealProcessor,"IdealProcessor",ctx,0); else if(cmpYamlValue("Priority",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.Priority,"Priority",ctx,0); else if(cmpYamlValue("MemoryType",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.MemoryType,"MemoryType",ctx,0); @@ -123,7 +118,6 @@ void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) else if(cmpYamlValue("ExtSaveDataId",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ExtSaveDataId,"ExtSaveDataId",ctx,0); else if(cmpYamlValue("AffinityMask",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.AffinityMask,"AffinityMask",ctx,0); else if(cmpYamlValue("DescVersion",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.DescVersion,"DescVersion",ctx,0); - //else if(cmpYamlValue("CryptoKey",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.CryptoKey,"CryptoKey",ctx,0); else if(cmpYamlValue("ResourceLimitCategory",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ResourceLimitCategory,"ResourceLimitCategory",ctx,0); else if(cmpYamlValue("ReleaseKernelMajor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ReleaseKernelMajor,"ReleaseKernelMajor",ctx,0); else if(cmpYamlValue("ReleaseKernelMinor",ctx)) SetSimpleYAMLValue(&rsf->AccessControlInfo.ReleaseKernelMinor,"ReleaseKernelMinor",ctx,0); @@ -137,7 +131,6 @@ void GET_AccessControlInfo(ctr_yaml_context *ctx, rsf_settings *rsf) else if(cmpYamlValue("InterruptNumbers",ctx)) rsf->AccessControlInfo.InterruptNumbersNum = SetYAMLSequence(&rsf->AccessControlInfo.InterruptNumbers,"InterruptNumbers",ctx); else if(cmpYamlValue("SystemCallAccess",ctx)) rsf->AccessControlInfo.SystemCallAccessNum = SetYAMLSequenceFromMapping(&rsf->AccessControlInfo.SystemCallAccess,"SystemCallAccess",ctx,false); else if(cmpYamlValue("ServiceAccessControl",ctx)) rsf->AccessControlInfo.ServiceAccessControlNum = SetYAMLSequence(&rsf->AccessControlInfo.ServiceAccessControl,"ServiceAccessControl",ctx); - //else if(cmpYamlValue("StorageId",ctx)) rsf->AccessControlInfo.StorageIdNum = SetYAMLSequence(&rsf->AccessControlInfo.StorageId,"StorageId",ctx); else if(cmpYamlValue("AccessibleSaveDataIds",ctx)) rsf->AccessControlInfo.AccessibleSaveDataIdsNum = SetYAMLSequence(&rsf->AccessControlInfo.AccessibleSaveDataIds,"AccessibleSaveDataIds",ctx); else{ @@ -198,8 +191,6 @@ void GET_BasicInfo(ctr_yaml_context *ctx, rsf_settings *rsf) else if(cmpYamlValue("ProductCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.ProductCode,"ProductCode",ctx,0); else if(cmpYamlValue("ContentType",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.ContentType,"ContentType",ctx,0); else if(cmpYamlValue("Logo",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.Logo,"Logo",ctx,0); - //else if(cmpYamlValue("BackupMemoryType",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.BackupMemoryType,"BackupMemoryType",ctx,0); - //else if(cmpYamlValue("InitialCode",ctx)) SetSimpleYAMLValue(&rsf->BasicInfo.InitialCode,"InitialCode",ctx,0); else{ fprintf(stderr,"[RSF ERROR] Unrecognised key '%s'\n",GetYamlString(ctx)); ctx->error = YAML_UNKNOWN_KEY; diff --git a/makerom/user_settings.h b/makerom/user_settings.h index 92838a0..561429a 100644 --- a/makerom/user_settings.h +++ b/makerom/user_settings.h @@ -84,8 +84,6 @@ typedef struct bool PermitMainFunctionArgument; bool CanShareDeviceMemory; bool UseOtherVariationSaveData; - bool UseExtSaveData; - bool UseExtendedSaveDataAccessControl; bool RunnableOnSleep; bool SpecialMemoryArrange;