4 #include "qemu/host-utils.h"
6 #include "hw/lm32/lm32_pic.h"
7 #include "hw/char/lm32_juart.h"
9 #include "exec/softmmu_exec.h"
11 #ifndef CONFIG_USER_ONLY
12 #include "sysemu/sysemu.h"
15 #if !defined(CONFIG_USER_ONLY)
16 #define MMUSUFFIX _mmu
18 #include "exec/softmmu_template.h"
20 #include "exec/softmmu_template.h"
22 #include "exec/softmmu_template.h"
24 #include "exec/softmmu_template.h"
26 void raise_exception(CPULM32State
*env
, int index
)
28 env
->exception_index
= index
;
32 void HELPER(raise_exception
)(CPULM32State
*env
, uint32_t index
)
34 raise_exception(env
, index
);
37 void HELPER(hlt
)(CPULM32State
*env
)
39 CPUState
*cs
= CPU(lm32_env_get_cpu(env
));
42 env
->exception_index
= EXCP_HLT
;
46 void HELPER(ill
)(CPULM32State
*env
)
48 #ifndef CONFIG_USER_ONLY
49 CPUState
*cs
= CPU(lm32_env_get_cpu(env
));
50 fprintf(stderr
, "VM paused due to illegal instruction. "
51 "Connect a debugger or switch to the monitor console "
52 "to find out more.\n");
53 qemu_system_vmstop_request(RUN_STATE_PAUSED
);
55 raise_exception(env
, EXCP_HALTED
);
59 void HELPER(wcsr_bp
)(CPULM32State
*env
, uint32_t bp
, uint32_t idx
)
61 uint32_t addr
= bp
& ~1;
66 lm32_breakpoint_remove(env
, idx
);
68 lm32_breakpoint_insert(env
, idx
, addr
);
72 void HELPER(wcsr_wp
)(CPULM32State
*env
, uint32_t wp
, uint32_t idx
)
80 wp_type
= lm32_wp_type(env
->dc
, idx
);
81 lm32_watchpoint_remove(env
, idx
);
82 if (wp_type
!= LM32_WP_DISABLED
) {
83 lm32_watchpoint_insert(env
, idx
, wp
, wp_type
);
87 void HELPER(wcsr_dc
)(CPULM32State
*env
, uint32_t dc
)
97 for (i
= 0; i
< 4; i
++) {
98 old_type
= lm32_wp_type(old_dc
, i
);
99 new_type
= lm32_wp_type(dc
, i
);
101 if (old_type
!= new_type
) {
102 lm32_watchpoint_remove(env
, i
);
103 if (new_type
!= LM32_WP_DISABLED
) {
104 lm32_watchpoint_insert(env
, i
, env
->wp
[i
], new_type
);
110 void HELPER(wcsr_im
)(CPULM32State
*env
, uint32_t im
)
112 lm32_pic_set_im(env
->pic_state
, im
);
115 void HELPER(wcsr_ip
)(CPULM32State
*env
, uint32_t im
)
117 lm32_pic_set_ip(env
->pic_state
, im
);
120 void HELPER(wcsr_jtx
)(CPULM32State
*env
, uint32_t jtx
)
122 lm32_juart_set_jtx(env
->juart_state
, jtx
);
125 void HELPER(wcsr_jrx
)(CPULM32State
*env
, uint32_t jrx
)
127 lm32_juart_set_jrx(env
->juart_state
, jrx
);
130 uint32_t HELPER(rcsr_im
)(CPULM32State
*env
)
132 return lm32_pic_get_im(env
->pic_state
);
135 uint32_t HELPER(rcsr_ip
)(CPULM32State
*env
)
137 return lm32_pic_get_ip(env
->pic_state
);
140 uint32_t HELPER(rcsr_jtx
)(CPULM32State
*env
)
142 return lm32_juart_get_jtx(env
->juart_state
);
145 uint32_t HELPER(rcsr_jrx
)(CPULM32State
*env
)
147 return lm32_juart_get_jrx(env
->juart_state
);
150 /* Try to fill the TLB and return an exception if error. If retaddr is
151 NULL, it means that the function was called in C code (i.e. not
152 from generated code or from helper.c) */
153 void tlb_fill(CPULM32State
*env
, target_ulong addr
, int is_write
, int mmu_idx
,
158 ret
= cpu_lm32_handle_mmu_fault(env
, addr
, is_write
, mmu_idx
);
161 /* now we have a real cpu fault */
162 cpu_restore_state(env
, retaddr
);