target/s390x: Factor common s390_ipl_read/write() helpers
Prevent duplication factoring common helpers. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Jared Rossi <jrossi@linux.ibm.com> Message-Id: <20260616020839.19104-5-philmd@oss.qualcomm.com>
Philippe Mathieu-Daudé committed
Oct 1, 2025 at 13:17 UTC
9365fa1b4391eb5524155c96e90842baebb5066b
1 file changed
+23
-18
target/s390x/diag.c
+23
-18
@@ -73,11 +73,30 @@ static int diag308_parm_check(CPUS390XState *env, uint64_t r1, uint64_t addr,
73
return 0;
74
}
75
76
+static void s390_ipl_read(CPUS390XState *env, uint64_t addr,
77
+ IplParameterBlock *iplb, size_t size)
78
+{
79
+ if (s390_is_pv()) {
80
+ s390_cpu_pv_mem_read(env_archcpu(env), 0, iplb, size);
81
+ } else {
82
+ cpu_physical_memory_read(addr, iplb, size);
83
+ }
84
+}
85
+
86
+static void s390_ipl_write(CPUS390XState *env, uint64_t addr,
87
+ IplParameterBlock *iplb, size_t size)
88
+{
89
+ if (s390_is_pv()) {
90
+ s390_cpu_pv_mem_write(env_archcpu(env), 0, iplb, size);
91
+ } else {
92
+ cpu_physical_memory_write(addr, iplb, size);
93
+ }
94
+}
95
+
96
void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
97
{
98
bool valid;
99
CPUState *cs = env_cpu(env);
80
- S390CPU *cpu = env_archcpu(env);
100
uint64_t addr = env->regs[r1];
101
uint64_t subcode = env->regs[r3];
102
IplParameterBlock *iplb;
@@ -114,22 +133,12 @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
133
return;
134
}
135
iplb = g_new0(IplParameterBlock, 1);
117
- if (!s390_is_pv()) {
118
- cpu_physical_memory_read(addr, iplb, sizeof(iplb->len));
119
- } else {
120
- s390_cpu_pv_mem_read(cpu, 0, iplb, sizeof(iplb->len));
121
- }
122
-
136
+ s390_ipl_read(env, addr, iplb, sizeof(iplb->len));
137
if (!iplb_valid_len(iplb)) {
138
env->regs[r1 + 1] = DIAG_308_RC_INVALID;
139
goto out;
140
}
127
-
128
- if (!s390_is_pv()) {
129
- cpu_physical_memory_read(addr, iplb, be32_to_cpu(iplb->len));
130
- } else {
131
- s390_cpu_pv_mem_read(cpu, 0, iplb, be32_to_cpu(iplb->len));
132
- }
141
+ s390_ipl_read(env, addr, iplb, be32_to_cpu(iplb->len));
142
143
valid = subcode == DIAG308_PV_SET ? iplb_valid_pv(iplb) : iplb_valid(iplb);
144
if (!valid) {
@@ -164,11 +173,7 @@ out:
173
return;
174
}
175
167
- if (!s390_is_pv()) {
168
- cpu_physical_memory_write(addr, iplb, be32_to_cpu(iplb->len));
169
- } else {
170
- s390_cpu_pv_mem_write(cpu, 0, iplb, be32_to_cpu(iplb->len));
171
- }
176
+ s390_ipl_write(env, addr, iplb, be32_to_cpu(iplb->len));
177
env->regs[r1 + 1] = DIAG_308_RC_OK;
178
return;
179
case DIAG308_PV_START: