Skip to content

Commit e7cff9c

Browse files
kevmwdagrh
authored andcommitted
hmp: Pass monitor to mon_get_cpu_env()
mon_get_cpu_env() is indirectly called monitor_parse_arguments() where the current monitor isn't set yet. Instead of using monitor_cur_env(), explicitly pass the Monitor pointer to the function. Without this fix, an HMP command like "x $pc" crashes like this: #0 0x0000555555caa01f in mon_get_cpu_sync (mon=0x0, synchronize=true) at ../monitor/misc.c:270 #1 0x0000555555caa141 in mon_get_cpu (mon=0x0) at ../monitor/misc.c:294 #2 0x0000555555caa158 in mon_get_cpu_env () at ../monitor/misc.c:299 #3 0x0000555555b19739 in monitor_get_pc (mon=0x555556ad2de0, md=0x5555565d2d40 <monitor_defs+1152>, val=0) at ../target/i386/monitor.c:607 #4 0x0000555555cadbec in get_monitor_def (mon=0x555556ad2de0, pval=0x7fffffffc208, name=0x7fffffffc220 "pc") at ../monitor/misc.c:1681 #5 0x000055555582ec4f in expr_unary (mon=0x555556ad2de0) at ../monitor/hmp.c:387 #6 0x000055555582edbb in expr_prod (mon=0x555556ad2de0) at ../monitor/hmp.c:421 #7 0x000055555582ee79 in expr_logic (mon=0x555556ad2de0) at ../monitor/hmp.c:455 #8 0x000055555582eefe in expr_sum (mon=0x555556ad2de0) at ../monitor/hmp.c:484 #9 0x000055555582efe8 in get_expr (mon=0x555556ad2de0, pval=0x7fffffffc418, pp=0x7fffffffc408) at ../monitor/hmp.c:511 #10 0x000055555582fcd4 in monitor_parse_arguments (mon=0x555556ad2de0, endp=0x7fffffffc890, cmd=0x555556675b50 <hmp_cmds+7920>) at ../monitor/hmp.c:876 #11 0x00005555558306a8 in handle_hmp_command (mon=0x555556ad2de0, cmdline=0x555556ada452 "$pc") at ../monitor/hmp.c:1087 #12 0x000055555582df14 in monitor_command_cb (opaque=0x555556ad2de0, cmdline=0x555556ada450 "x $pc", readline_opaque=0x0) at ../monitor/hmp.c:47 After this fix, nothing is left in monitor_parse_arguments() that can indirectly call monitor_cur(), so the fix is complete. Fixes: ff04108 Reported-by: lichun <[email protected]> Signed-off-by: Kevin Wolf <[email protected]> Message-Id: <[email protected]> Reviewed-by: Dr. David Alan Gilbert <[email protected]> Signed-off-by: Dr. David Alan Gilbert <[email protected]>
1 parent 43cf067 commit e7cff9c

File tree

10 files changed

+20
-20
lines changed

10 files changed

+20
-20
lines changed

include/monitor/hmp-target.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ struct MonitorDef {
4141
const MonitorDef *target_monitor_defs(void);
4242
int target_get_monitor_def(CPUState *cs, const char *name, uint64_t *pval);
4343

44-
CPUArchState *mon_get_cpu_env(void);
44+
CPUArchState *mon_get_cpu_env(Monitor *mon);
4545
CPUState *mon_get_cpu(Monitor *mon);
4646

4747
void hmp_info_mem(Monitor *mon, const QDict *qdict);

monitor/misc.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -294,9 +294,9 @@ CPUState *mon_get_cpu(Monitor *mon)
294294
return mon_get_cpu_sync(mon, true);
295295
}
296296

297-
CPUArchState *mon_get_cpu_env(void)
297+
CPUArchState *mon_get_cpu_env(Monitor *mon)
298298
{
299-
CPUState *cs = mon_get_cpu(monitor_cur());
299+
CPUState *cs = mon_get_cpu(mon);
300300

301301
return cs ? cs->env_ptr : NULL;
302302
}
@@ -1680,7 +1680,7 @@ int get_monitor_def(Monitor *mon, int64_t *pval, const char *name)
16801680
if (md->get_value) {
16811681
*pval = md->get_value(mon, md, md->offset);
16821682
} else {
1683-
CPUArchState *env = mon_get_cpu_env();
1683+
CPUArchState *env = mon_get_cpu_env(mon);
16841684
ptr = (uint8_t *)env + md->offset;
16851685
switch(md->type) {
16861686
case MD_I32:

target/i386/monitor.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ void hmp_info_tlb(Monitor *mon, const QDict *qdict)
222222
{
223223
CPUArchState *env;
224224

225-
env = mon_get_cpu_env();
225+
env = mon_get_cpu_env(mon);
226226
if (!env) {
227227
monitor_printf(mon, "No CPU available\n");
228228
return;
@@ -550,7 +550,7 @@ void hmp_info_mem(Monitor *mon, const QDict *qdict)
550550
{
551551
CPUArchState *env;
552552

553-
env = mon_get_cpu_env();
553+
env = mon_get_cpu_env(mon);
554554
if (!env) {
555555
monitor_printf(mon, "No CPU available\n");
556556
return;
@@ -604,7 +604,7 @@ void hmp_mce(Monitor *mon, const QDict *qdict)
604604
static target_long monitor_get_pc(Monitor *mon, const struct MonitorDef *md,
605605
int val)
606606
{
607-
CPUArchState *env = mon_get_cpu_env();
607+
CPUArchState *env = mon_get_cpu_env(mon);
608608
return env->eip + env->segs[R_CS].base;
609609
}
610610

target/m68k/monitor.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
void hmp_info_tlb(Monitor *mon, const QDict *qdict)
1414
{
15-
CPUArchState *env1 = mon_get_cpu_env();
15+
CPUArchState *env1 = mon_get_cpu_env(mon);
1616

1717
if (!env1) {
1818
monitor_printf(mon, "No CPU available\n");

target/nios2/monitor.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
void hmp_info_tlb(Monitor *mon, const QDict *qdict)
3131
{
32-
CPUArchState *env1 = mon_get_cpu_env();
32+
CPUArchState *env1 = mon_get_cpu_env(mon);
3333

3434
dump_mmu(env1);
3535
}

target/ppc/monitor.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
static target_long monitor_get_ccr(Monitor *mon, const struct MonitorDef *md,
3333
int val)
3434
{
35-
CPUArchState *env = mon_get_cpu_env();
35+
CPUArchState *env = mon_get_cpu_env(mon);
3636
unsigned int u;
3737
int i;
3838

@@ -47,27 +47,27 @@ static target_long monitor_get_ccr(Monitor *mon, const struct MonitorDef *md,
4747
static target_long monitor_get_decr(Monitor *mon, const struct MonitorDef *md,
4848
int val)
4949
{
50-
CPUArchState *env = mon_get_cpu_env();
50+
CPUArchState *env = mon_get_cpu_env(mon);
5151
return cpu_ppc_load_decr(env);
5252
}
5353

5454
static target_long monitor_get_tbu(Monitor *mon, const struct MonitorDef *md,
5555
int val)
5656
{
57-
CPUArchState *env = mon_get_cpu_env();
57+
CPUArchState *env = mon_get_cpu_env(mon);
5858
return cpu_ppc_load_tbu(env);
5959
}
6060

6161
static target_long monitor_get_tbl(Monitor *mon, const struct MonitorDef *md,
6262
int val)
6363
{
64-
CPUArchState *env = mon_get_cpu_env();
64+
CPUArchState *env = mon_get_cpu_env(mon);
6565
return cpu_ppc_load_tbl(env);
6666
}
6767

6868
void hmp_info_tlb(Monitor *mon, const QDict *qdict)
6969
{
70-
CPUArchState *env1 = mon_get_cpu_env();
70+
CPUArchState *env1 = mon_get_cpu_env(mon);
7171

7272
if (!env1) {
7373
monitor_printf(mon, "No CPU available\n");

target/riscv/monitor.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ void hmp_info_mem(Monitor *mon, const QDict *qdict)
204204
{
205205
CPUArchState *env;
206206

207-
env = mon_get_cpu_env();
207+
env = mon_get_cpu_env(mon);
208208
if (!env) {
209209
monitor_printf(mon, "No CPU available\n");
210210
return;

target/sh4/monitor.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
4141

4242
void hmp_info_tlb(Monitor *mon, const QDict *qdict)
4343
{
44-
CPUArchState *env = mon_get_cpu_env();
44+
CPUArchState *env = mon_get_cpu_env(mon);
4545
int i;
4646

4747
if (!env) {

target/sparc/monitor.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
void hmp_info_tlb(Monitor *mon, const QDict *qdict)
3232
{
33-
CPUArchState *env1 = mon_get_cpu_env();
33+
CPUArchState *env1 = mon_get_cpu_env(mon);
3434

3535
if (!env1) {
3636
monitor_printf(mon, "No CPU available\n");
@@ -43,7 +43,7 @@ void hmp_info_tlb(Monitor *mon, const QDict *qdict)
4343
static target_long monitor_get_psr(Monitor *mon, const struct MonitorDef *md,
4444
int val)
4545
{
46-
CPUArchState *env = mon_get_cpu_env();
46+
CPUArchState *env = mon_get_cpu_env(mon);
4747

4848
return cpu_get_psr(env);
4949
}
@@ -52,7 +52,7 @@ static target_long monitor_get_psr(Monitor *mon, const struct MonitorDef *md,
5252
static target_long monitor_get_reg(Monitor *mon, const struct MonitorDef *md,
5353
int val)
5454
{
55-
CPUArchState *env = mon_get_cpu_env();
55+
CPUArchState *env = mon_get_cpu_env(mon);
5656
return env->regwptr[val];
5757
}
5858

target/xtensa/monitor.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
void hmp_info_tlb(Monitor *mon, const QDict *qdict)
3131
{
32-
CPUArchState *env1 = mon_get_cpu_env();
32+
CPUArchState *env1 = mon_get_cpu_env(mon);
3333

3434
if (!env1) {
3535
monitor_printf(mon, "No CPU available\n");

0 commit comments

Comments
 (0)