mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 12:21:18 +00:00
exosphere: support enabling usermode pmu regs (closes #703)
This commit is contained in:
parent
ea49c2ccd1
commit
7e6ff1f327
9 changed files with 46 additions and 10 deletions
|
@ -12,6 +12,8 @@ debugmode_user = 0
|
||||||
; Note: Disabling usermode exception handlers will cause atmosphere to not fail gracefully under error conditions.
|
; Note: Disabling usermode exception handlers will cause atmosphere to not fail gracefully under error conditions.
|
||||||
; Support will not be provided to users who disable these. If you do not know what you are doing, leave them on.
|
; Support will not be provided to users who disable these. If you do not know what you are doing, leave them on.
|
||||||
disable_user_exception_handlers = 0
|
disable_user_exception_handlers = 0
|
||||||
|
; Note: It's currently unknown what effects enabling the usermode PMU register access may have on official code.
|
||||||
|
enable_user_pmu_access = 0
|
||||||
|
|
||||||
[stratosphere]
|
[stratosphere]
|
||||||
; To force-enable nogc, add nogc = 1
|
; To force-enable nogc, add nogc = 1
|
||||||
|
|
|
@ -47,6 +47,8 @@
|
||||||
+ An extension was added to pm:info to allow querying a process's override status.
|
+ An extension was added to pm:info to allow querying a process's override status.
|
||||||
+ Thanks to process override capture improvements, hbl html behavior has been greatly improved.
|
+ Thanks to process override capture improvements, hbl html behavior has been greatly improved.
|
||||||
+ Web applets launched by hbl will now always see the /atmosphere/hbl_html filesystem
|
+ Web applets launched by hbl will now always see the /atmosphere/hbl_html filesystem
|
||||||
|
+ Support was added to exosphere for enabling usermode access to the PMU registers.
|
||||||
|
+ This can be controlled via exosphere!enable_user_pmu_access in BCT.ini.
|
||||||
+ An enormous number of minor bugs were fixed.
|
+ An enormous number of minor bugs were fixed.
|
||||||
+ dmnt's cheat VM had a fix for an inversion in opcode behavior.
|
+ dmnt's cheat VM had a fix for an inversion in opcode behavior.
|
||||||
+ An issue was fixed in fs.mitm's management of domain object IDs that could lead to system corruption in rare cases.
|
+ An issue was fixed in fs.mitm's management of domain object IDs that could lead to system corruption in rare cases.
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
static bool g_hiz_mode_enabled = false;
|
static bool g_hiz_mode_enabled = false;
|
||||||
static bool g_debugmode_override_user = false, g_debugmode_override_priv = false;
|
static bool g_debugmode_override_user = false, g_debugmode_override_priv = false;
|
||||||
static bool g_enable_usermode_exception_handlers = true;
|
static bool g_enable_usermode_exception_handlers = true;
|
||||||
|
static bool g_enable_usermode_pmu_access = false;
|
||||||
|
|
||||||
uint32_t configitem_set(bool privileged, ConfigItem item, uint64_t value) {
|
uint32_t configitem_set(bool privileged, ConfigItem item, uint64_t value) {
|
||||||
switch (item) {
|
switch (item) {
|
||||||
|
@ -168,6 +169,10 @@ void configitem_disable_usermode_exception_handlers(void) {
|
||||||
g_enable_usermode_exception_handlers = false;
|
g_enable_usermode_exception_handlers = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void configitem_enable_usermode_pmu_access(void) {
|
||||||
|
g_enable_usermode_pmu_access = true;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t configitem_get(bool privileged, ConfigItem item, uint64_t *p_outvalue) {
|
uint32_t configitem_get(bool privileged, ConfigItem item, uint64_t *p_outvalue) {
|
||||||
uint32_t result = 0;
|
uint32_t result = 0;
|
||||||
switch (item) {
|
switch (item) {
|
||||||
|
@ -222,6 +227,10 @@ uint32_t configitem_get(bool privileged, ConfigItem item, uint64_t *p_outvalue)
|
||||||
if (g_enable_usermode_exception_handlers) {
|
if (g_enable_usermode_exception_handlers) {
|
||||||
config |= KERNELCONFIGFLAG_ENABLE_USER_EXCEPTION_HANDLERS;
|
config |= KERNELCONFIGFLAG_ENABLE_USER_EXCEPTION_HANDLERS;
|
||||||
}
|
}
|
||||||
|
/* Allow for enabling usermode pmu access. */
|
||||||
|
if (g_enable_usermode_pmu_access) {
|
||||||
|
config |= KERNELCONFIGFLAG_ENABLE_USER_PMU_ACCESS;
|
||||||
|
}
|
||||||
*p_outvalue = config;
|
*p_outvalue = config;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -61,6 +61,7 @@ bool configitem_is_debugmode_priv(void);
|
||||||
|
|
||||||
void configitem_set_debugmode_override(bool user, bool priv);
|
void configitem_set_debugmode_override(bool user, bool priv);
|
||||||
void configitem_disable_usermode_exception_handlers(void);
|
void configitem_disable_usermode_exception_handlers(void);
|
||||||
|
void configitem_enable_usermode_pmu_access(void);
|
||||||
void configitem_set_hiz_mode_enabled(bool enabled);
|
void configitem_set_hiz_mode_enabled(bool enabled);
|
||||||
|
|
||||||
uint64_t configitem_get_hardware_type(void);
|
uint64_t configitem_get_hardware_type(void);
|
||||||
|
|
|
@ -84,6 +84,14 @@ unsigned int exosphere_should_disable_usermode_exception_handlers(void) {
|
||||||
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS);
|
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int exosphere_should_enable_usermode_pmu_access(void) {
|
||||||
|
if (!g_has_loaded_config) {
|
||||||
|
generic_panic();
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXOSPHERE_CHECK_FLAG(EXOSPHERE_FLAG_ENABLE_USERMODE_PMU_ACCESS);
|
||||||
|
}
|
||||||
|
|
||||||
const exo_emummc_config_t *exosphere_get_emummc_config(void) {
|
const exo_emummc_config_t *exosphere_get_emummc_config(void) {
|
||||||
if (!g_has_loaded_config) {
|
if (!g_has_loaded_config) {
|
||||||
generic_panic();
|
generic_panic();
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#define EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV (1 << 1u)
|
#define EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV (1 << 1u)
|
||||||
#define EXOSPHERE_FLAG_IS_DEBUGMODE_USER (1 << 2u)
|
#define EXOSPHERE_FLAG_IS_DEBUGMODE_USER (1 << 2u)
|
||||||
#define EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS (1 << 3u)
|
#define EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS (1 << 3u)
|
||||||
|
#define EXOSPHERE_FLAG_ENABLE_USERMODE_PMU_ACCESS (1 << 4u)
|
||||||
#define EXOSPHERE_FLAGS_DEFAULT (EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV)
|
#define EXOSPHERE_FLAGS_DEFAULT (EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -58,6 +59,7 @@ unsigned int exosphere_should_perform_620_keygen(void);
|
||||||
unsigned int exosphere_should_override_debugmode_priv(void);
|
unsigned int exosphere_should_override_debugmode_priv(void);
|
||||||
unsigned int exosphere_should_override_debugmode_user(void);
|
unsigned int exosphere_should_override_debugmode_user(void);
|
||||||
unsigned int exosphere_should_disable_usermode_exception_handlers(void);
|
unsigned int exosphere_should_disable_usermode_exception_handlers(void);
|
||||||
|
unsigned int exosphere_should_enable_usermode_pmu_access(void);
|
||||||
|
|
||||||
const exo_emummc_config_t *exosphere_get_emummc_config(void);
|
const exo_emummc_config_t *exosphere_get_emummc_config(void);
|
||||||
|
|
||||||
|
|
|
@ -512,6 +512,9 @@ void load_package2(coldboot_crt0_reloc_list_t *reloc_list) {
|
||||||
if (exosphere_should_disable_usermode_exception_handlers() != 0) {
|
if (exosphere_should_disable_usermode_exception_handlers() != 0) {
|
||||||
configitem_disable_usermode_exception_handlers();
|
configitem_disable_usermode_exception_handlers();
|
||||||
}
|
}
|
||||||
|
if (exosphere_should_enable_usermode_pmu_access()) {
|
||||||
|
configitem_enable_usermode_pmu_access();
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup the Security Engine. */
|
/* Setup the Security Engine. */
|
||||||
setup_se();
|
setup_se();
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#define EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV (1 << 1u)
|
#define EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV (1 << 1u)
|
||||||
#define EXOSPHERE_FLAG_IS_DEBUGMODE_USER (1 << 2u)
|
#define EXOSPHERE_FLAG_IS_DEBUGMODE_USER (1 << 2u)
|
||||||
#define EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS (1 << 3u)
|
#define EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS (1 << 3u)
|
||||||
|
#define EXOSPHERE_FLAG_ENABLE_USERMODE_PMU_ACCESS (1 << 4u)
|
||||||
#define EXOSPHERE_FLAGS_DEFAULT (EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV)
|
#define EXOSPHERE_FLAGS_DEFAULT (EXOSPHERE_FLAG_IS_DEBUGMODE_PRIV)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -48,5 +49,6 @@ _Static_assert(sizeof(exosphere_config_t) == 0x20 + sizeof(exo_emummc_config_t),
|
||||||
#define EXOSPHERE_DEBUGMODE_PRIV_KEY "debugmode"
|
#define EXOSPHERE_DEBUGMODE_PRIV_KEY "debugmode"
|
||||||
#define EXOSPHERE_DEBUGMODE_USER_KEY "debugmode_user"
|
#define EXOSPHERE_DEBUGMODE_USER_KEY "debugmode_user"
|
||||||
#define EXOSPHERE_DISABLE_USERMODE_EXCEPTION_HANDLERS_KEY "disable_user_exception_handlers"
|
#define EXOSPHERE_DISABLE_USERMODE_EXCEPTION_HANDLERS_KEY "disable_user_exception_handlers"
|
||||||
|
#define EXOSPHERE_ENABLE_USERMODE_PMU_ACCESS_KEY "enable_user_pmu_access"
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -158,6 +158,13 @@ static int exosphere_ini_handler(void *user, const char *section, const char *na
|
||||||
} else {
|
} else {
|
||||||
exo_cfg->flags &= ~(EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS);
|
exo_cfg->flags &= ~(EXOSPHERE_FLAG_DISABLE_USERMODE_EXCEPTION_HANDLERS);
|
||||||
}
|
}
|
||||||
|
} else if (strcmp(name, EXOSPHERE_ENABLE_USERMODE_PMU_ACCESS_KEY) == 0) {
|
||||||
|
sscanf(value, "%d", &tmp);
|
||||||
|
if (tmp) {
|
||||||
|
exo_cfg->flags |= EXOSPHERE_FLAG_ENABLE_USERMODE_PMU_ACCESS;
|
||||||
|
} else {
|
||||||
|
exo_cfg->flags &= ~(EXOSPHERE_FLAG_ENABLE_USERMODE_PMU_ACCESS);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue