#include "exec/exec-all.h"
#include "exec/helper-proto.h"
#include "exec/cpu_ldst.h"
+#include "sysemu/sysemu.h"
#include "qemu/timer.h"
-
+#include "fpu/softfloat.h"
void QEMU_NORETURN HELPER(excp)(CPUHPPAState *env, int excp)
{
do_stby_e(env, addr, val, true);
}
-target_ureg HELPER(probe_r)(target_ulong addr)
+target_ureg HELPER(probe)(CPUHPPAState *env, target_ulong addr,
+ uint32_t level, uint32_t want)
{
#ifdef CONFIG_USER_ONLY
- return page_check_range(addr, 1, PAGE_READ);
+ return page_check_range(addr, 1, want);
#else
- return 1; /* FIXME */
-#endif
-}
+ int prot, excp;
+ hwaddr phys;
-target_ureg HELPER(probe_w)(target_ulong addr)
-{
-#ifdef CONFIG_USER_ONLY
- return page_check_range(addr, 1, PAGE_WRITE);
-#else
- return 1; /* FIXME */
+ /* Fail if the requested privilege level is higher than current. */
+ if (level < (env->iaoq_f & 3)) {
+ return 0;
+ }
+
+ excp = hppa_get_physical_address(env, addr, level, 0, &phys, &prot);
+ if (excp >= 0) {
+ if (env->psw & PSW_Q) {
+ /* ??? Needs tweaking for hppa64. */
+ env->cr[CR_IOR] = addr;
+ env->cr[CR_ISR] = addr >> 32;
+ }
+ if (excp == EXCP_DTLB_MISS) {
+ excp = EXCP_NA_DTLB_MISS;
+ }
+ hppa_dynamic_excp(env, excp, GETPC());
+ }
+ return (want & prot) != 0;
#endif
}
timer_mod(cpu->alarm_timer, timeout);
}
+void HELPER(halt)(CPUHPPAState *env)
+{
+ qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
+ helper_excp(env, EXCP_HLT);
+}
+
+void HELPER(reset)(CPUHPPAState *env)
+{
+ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
+ helper_excp(env, EXCP_HLT);
+}
+
target_ureg HELPER(swap_system_mask)(CPUHPPAState *env, target_ureg nsm)
{
target_ulong psw = env->psw;