14c9649a9Sj_mayer /* 2c3082755SRichard Henderson * Helpers for loads and stores 34c9649a9Sj_mayer * 44c9649a9Sj_mayer * Copyright (c) 2007 Jocelyn Mayer 54c9649a9Sj_mayer * 64c9649a9Sj_mayer * This library is free software; you can redistribute it and/or 74c9649a9Sj_mayer * modify it under the terms of the GNU Lesser General Public 84c9649a9Sj_mayer * License as published by the Free Software Foundation; either 9d6ea4236SChetan Pant * version 2.1 of the License, or (at your option) any later version. 104c9649a9Sj_mayer * 114c9649a9Sj_mayer * This library is distributed in the hope that it will be useful, 124c9649a9Sj_mayer * but WITHOUT ANY WARRANTY; without even the implied warranty of 134c9649a9Sj_mayer * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 144c9649a9Sj_mayer * Lesser General Public License for more details. 154c9649a9Sj_mayer * 164c9649a9Sj_mayer * You should have received a copy of the GNU Lesser General Public 178167ee88SBlue Swirl * License along with this library; if not, see <http://www.gnu.org/licenses/>. 184c9649a9Sj_mayer */ 194c9649a9Sj_mayer 20e2e5e114SPeter Maydell #include "qemu/osdep.h" 213e457172SBlue Swirl #include "cpu.h" 222ef6175aSRichard Henderson #include "exec/helper-proto.h" 2363c91552SPaolo Bonzini #include "exec/exec-all.h" 24*42fa9665SPhilippe Mathieu-Daudé #include "accel/tcg/cpu-ldst.h" 254c9649a9Sj_mayer 26e7424abcSRichard Henderson static void do_unaligned_access(CPUAlphaState *env, vaddr addr, uintptr_t retaddr) 275b450407SRichard Henderson { 285b450407SRichard Henderson uint64_t pc; 295b450407SRichard Henderson uint32_t insn; 305b450407SRichard Henderson 313d419a4dSRichard Henderson cpu_restore_state(env_cpu(env), retaddr); 325b450407SRichard Henderson 335b450407SRichard Henderson pc = env->pc; 34c3082755SRichard Henderson insn = cpu_ldl_code(env, pc); 355b450407SRichard Henderson 365b450407SRichard Henderson env->trap_arg0 = addr; 375b450407SRichard Henderson env->trap_arg1 = insn >> 26; /* opcode */ 385b450407SRichard Henderson env->trap_arg2 = (insn >> 21) & 31; /* dest regno */ 39e7424abcSRichard Henderson } 40e7424abcSRichard Henderson 41e7424abcSRichard Henderson #ifdef CONFIG_USER_ONLY 42e7424abcSRichard Henderson void alpha_cpu_record_sigbus(CPUState *cs, vaddr addr, 43e7424abcSRichard Henderson MMUAccessType access_type, uintptr_t retaddr) 44e7424abcSRichard Henderson { 4550cb36ceSPhilippe Mathieu-Daudé do_unaligned_access(cpu_env(cs), addr, retaddr); 46e7424abcSRichard Henderson } 47e7424abcSRichard Henderson #else 48e7424abcSRichard Henderson void alpha_cpu_do_unaligned_access(CPUState *cs, vaddr addr, 49e7424abcSRichard Henderson MMUAccessType access_type, 50e7424abcSRichard Henderson int mmu_idx, uintptr_t retaddr) 51e7424abcSRichard Henderson { 5250cb36ceSPhilippe Mathieu-Daudé CPUAlphaState *env = cpu_env(cs); 53e7424abcSRichard Henderson 54e7424abcSRichard Henderson do_unaligned_access(env, addr, retaddr); 5527103424SAndreas Färber cs->exception_index = EXCP_UNALIGN; 56b9f0923eSRichard Henderson env->error_code = 0; 575638d180SAndreas Färber cpu_loop_exit(cs); 585b450407SRichard Henderson } 595b450407SRichard Henderson 606ad4d7eeSPeter Maydell void alpha_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, 616ad4d7eeSPeter Maydell vaddr addr, unsigned size, 626ad4d7eeSPeter Maydell MMUAccessType access_type, 636ad4d7eeSPeter Maydell int mmu_idx, MemTxAttrs attrs, 646ad4d7eeSPeter Maydell MemTxResult response, uintptr_t retaddr) 655b450407SRichard Henderson { 6650cb36ceSPhilippe Mathieu-Daudé CPUAlphaState *env = cpu_env(cs); 67c658b94fSAndreas Färber 685b450407SRichard Henderson env->trap_arg0 = addr; 696ad4d7eeSPeter Maydell env->trap_arg1 = access_type == MMU_DATA_STORE ? 1 : 0; 70ba9c5de5SRichard Henderson cs->exception_index = EXCP_MCHK; 71ba9c5de5SRichard Henderson env->error_code = 0; 72afd46fcaSPavel Dovgalyuk cpu_loop_exit_restore(cs, retaddr); 735b450407SRichard Henderson } 74c3082755SRichard Henderson #endif /* CONFIG_USER_ONLY */ 75