mirror of https://gitee.com/openkylin/qemu.git
s390x: Beautify diag308 handling
Let's improve readability by: * Using constants for the subcodes * Moving parameter checking into a function * Removing subcode > 6 check as the default case catches that Signed-off-by: Janosch Frank <frankja@linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: David Hildenbrand <david@redhat.com> Message-Id: <20191127175046.4911-6-frankja@linux.ibm.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
eb8adcc3e9
commit
0b7fd817e0
|
@ -53,6 +53,29 @@ int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
|
||||||
#define DIAG_308_RC_NO_CONF 0x0102
|
#define DIAG_308_RC_NO_CONF 0x0102
|
||||||
#define DIAG_308_RC_INVALID 0x0402
|
#define DIAG_308_RC_INVALID 0x0402
|
||||||
|
|
||||||
|
#define DIAG308_RESET_MOD_CLR 0
|
||||||
|
#define DIAG308_RESET_LOAD_NORM 1
|
||||||
|
#define DIAG308_LOAD_CLEAR 3
|
||||||
|
#define DIAG308_LOAD_NORMAL_DUMP 4
|
||||||
|
#define DIAG308_SET 5
|
||||||
|
#define DIAG308_STORE 6
|
||||||
|
|
||||||
|
static int diag308_parm_check(CPUS390XState *env, uint64_t r1, uint64_t addr,
|
||||||
|
uintptr_t ra, bool write)
|
||||||
|
{
|
||||||
|
if ((r1 & 1) || (addr & ~TARGET_PAGE_MASK)) {
|
||||||
|
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!address_space_access_valid(&address_space_memory, addr,
|
||||||
|
sizeof(IplParameterBlock), write,
|
||||||
|
MEMTXATTRS_UNSPECIFIED)) {
|
||||||
|
s390_program_interrupt(env, PGM_ADDRESSING, ra);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
|
void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
|
||||||
{
|
{
|
||||||
CPUState *cs = env_cpu(env);
|
CPUState *cs = env_cpu(env);
|
||||||
|
@ -65,30 +88,24 @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((subcode & ~0x0ffffULL) || (subcode > 6)) {
|
if (subcode & ~0x0ffffULL) {
|
||||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (subcode) {
|
switch (subcode) {
|
||||||
case 0:
|
case DIAG308_RESET_MOD_CLR:
|
||||||
s390_ipl_reset_request(cs, S390_RESET_MODIFIED_CLEAR);
|
s390_ipl_reset_request(cs, S390_RESET_MODIFIED_CLEAR);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case DIAG308_RESET_LOAD_NORM:
|
||||||
s390_ipl_reset_request(cs, S390_RESET_LOAD_NORMAL);
|
s390_ipl_reset_request(cs, S390_RESET_LOAD_NORMAL);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case DIAG308_LOAD_CLEAR:
|
||||||
|
/* Well we still lack the clearing bit... */
|
||||||
s390_ipl_reset_request(cs, S390_RESET_REIPL);
|
s390_ipl_reset_request(cs, S390_RESET_REIPL);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case DIAG308_SET:
|
||||||
if ((r1 & 1) || (addr & 0x0fffULL)) {
|
if (diag308_parm_check(env, r1, addr, ra, false)) {
|
||||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!address_space_access_valid(&address_space_memory, addr,
|
|
||||||
sizeof(IplParameterBlock), false,
|
|
||||||
MEMTXATTRS_UNSPECIFIED)) {
|
|
||||||
s390_program_interrupt(env, PGM_ADDRESSING, ra);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
iplb = g_new0(IplParameterBlock, 1);
|
iplb = g_new0(IplParameterBlock, 1);
|
||||||
|
@ -110,15 +127,8 @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
|
||||||
out:
|
out:
|
||||||
g_free(iplb);
|
g_free(iplb);
|
||||||
return;
|
return;
|
||||||
case 6:
|
case DIAG308_STORE:
|
||||||
if ((r1 & 1) || (addr & 0x0fffULL)) {
|
if (diag308_parm_check(env, r1, addr, ra, true)) {
|
||||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!address_space_access_valid(&address_space_memory, addr,
|
|
||||||
sizeof(IplParameterBlock), true,
|
|
||||||
MEMTXATTRS_UNSPECIFIED)) {
|
|
||||||
s390_program_interrupt(env, PGM_ADDRESSING, ra);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
iplb = s390_ipl_get_iplb();
|
iplb = s390_ipl_get_iplb();
|
||||||
|
|
Loading…
Reference in New Issue