[S390] Improve address space mode selection.
Introduce user_mode to replace the two variables switch_amode and s390_noexec. There are three valid combinations of the old values: 1) switch_amode == 0 && s390_noexec == 0 2) switch_amode == 1 && s390_noexec == 0 3) switch_amode == 1 && s390_noexec == 1 They get replaced by 1) user_mode == HOME_SPACE_MODE 2) user_mode == PRIMARY_SPACE_MODE 3) user_mode == SECONDARY_SPACE_MODE The new kernel parameter user_mode=[primary,secondary,home] lets you choose the address space mode the user space processes should use. In addition the CONFIG_S390_SWITCH_AMODE config option is removed. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
committed by
Martin Schwidefsky
parent
61365e132e
commit
b11b533427
@@ -305,9 +305,8 @@ static int __init early_parse_mem(char *p)
|
||||
}
|
||||
early_param("mem", early_parse_mem);
|
||||
|
||||
#ifdef CONFIG_S390_SWITCH_AMODE
|
||||
unsigned int switch_amode = 0;
|
||||
EXPORT_SYMBOL_GPL(switch_amode);
|
||||
unsigned int user_mode = HOME_SPACE_MODE;
|
||||
EXPORT_SYMBOL_GPL(user_mode);
|
||||
|
||||
static int set_amode_and_uaccess(unsigned long user_amode,
|
||||
unsigned long user32_amode)
|
||||
@@ -340,23 +339,29 @@ static int set_amode_and_uaccess(unsigned long user_amode,
|
||||
*/
|
||||
static int __init early_parse_switch_amode(char *p)
|
||||
{
|
||||
switch_amode = 1;
|
||||
if (user_mode != SECONDARY_SPACE_MODE)
|
||||
user_mode = PRIMARY_SPACE_MODE;
|
||||
return 0;
|
||||
}
|
||||
early_param("switch_amode", early_parse_switch_amode);
|
||||
|
||||
#else /* CONFIG_S390_SWITCH_AMODE */
|
||||
static inline int set_amode_and_uaccess(unsigned long user_amode,
|
||||
unsigned long user32_amode)
|
||||
static int __init early_parse_user_mode(char *p)
|
||||
{
|
||||
if (p && strcmp(p, "primary") == 0)
|
||||
user_mode = PRIMARY_SPACE_MODE;
|
||||
#ifdef CONFIG_S390_EXEC_PROTECT
|
||||
else if (p && strcmp(p, "secondary") == 0)
|
||||
user_mode = SECONDARY_SPACE_MODE;
|
||||
#endif
|
||||
else if (!p || strcmp(p, "home") == 0)
|
||||
user_mode = HOME_SPACE_MODE;
|
||||
else
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_S390_SWITCH_AMODE */
|
||||
early_param("user_mode", early_parse_user_mode);
|
||||
|
||||
#ifdef CONFIG_S390_EXEC_PROTECT
|
||||
unsigned int s390_noexec = 0;
|
||||
EXPORT_SYMBOL_GPL(s390_noexec);
|
||||
|
||||
/*
|
||||
* Enable execute protection?
|
||||
*/
|
||||
@@ -364,8 +369,7 @@ static int __init early_parse_noexec(char *p)
|
||||
{
|
||||
if (!strncmp(p, "off", 3))
|
||||
return 0;
|
||||
switch_amode = 1;
|
||||
s390_noexec = 1;
|
||||
user_mode = SECONDARY_SPACE_MODE;
|
||||
return 0;
|
||||
}
|
||||
early_param("noexec", early_parse_noexec);
|
||||
@@ -373,7 +377,7 @@ early_param("noexec", early_parse_noexec);
|
||||
|
||||
static void setup_addressing_mode(void)
|
||||
{
|
||||
if (s390_noexec) {
|
||||
if (user_mode == SECONDARY_SPACE_MODE) {
|
||||
if (set_amode_and_uaccess(PSW_ASC_SECONDARY,
|
||||
PSW32_ASC_SECONDARY))
|
||||
pr_info("Execute protection active, "
|
||||
@@ -381,7 +385,7 @@ static void setup_addressing_mode(void)
|
||||
else
|
||||
pr_info("Execute protection active, "
|
||||
"mvcos not available\n");
|
||||
} else if (switch_amode) {
|
||||
} else if (user_mode == PRIMARY_SPACE_MODE) {
|
||||
if (set_amode_and_uaccess(PSW_ASC_PRIMARY, PSW32_ASC_PRIMARY))
|
||||
pr_info("Address spaces switched, "
|
||||
"mvcos available\n");
|
||||
@@ -411,7 +415,7 @@ setup_lowcore(void)
|
||||
lc->restart_psw.mask = PSW_BASE_BITS | PSW_DEFAULT_KEY;
|
||||
lc->restart_psw.addr =
|
||||
PSW_ADDR_AMODE | (unsigned long) restart_int_handler;
|
||||
if (switch_amode)
|
||||
if (user_mode != HOME_SPACE_MODE)
|
||||
lc->restart_psw.mask |= PSW_ASC_HOME;
|
||||
lc->external_new_psw.mask = psw_kernel_bits;
|
||||
lc->external_new_psw.addr =
|
||||
|
Reference in New Issue
Block a user