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" 24f08b6170SPaolo Bonzini #include "exec/cpu_ldst.h" 254c9649a9Sj_mayer 26*e7424abcSRichard 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 31*e7424abcSRichard Henderson cpu_restore_state(env_cpu(env), retaddr, true); 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 */ 39*e7424abcSRichard Henderson } 40*e7424abcSRichard Henderson 41*e7424abcSRichard Henderson #ifdef CONFIG_USER_ONLY 42*e7424abcSRichard Henderson void alpha_cpu_record_sigbus(CPUState *cs, vaddr addr, 43*e7424abcSRichard Henderson MMUAccessType access_type, uintptr_t retaddr) 44*e7424abcSRichard Henderson { 45*e7424abcSRichard Henderson AlphaCPU *cpu = ALPHA_CPU(cs); 46*e7424abcSRichard Henderson CPUAlphaState *env = &cpu->env; 47*e7424abcSRichard Henderson 48*e7424abcSRichard Henderson do_unaligned_access(env, addr, retaddr); 49*e7424abcSRichard Henderson } 50*e7424abcSRichard Henderson #else 51*e7424abcSRichard Henderson void alpha_cpu_do_unaligned_access(CPUState *cs, vaddr addr, 52*e7424abcSRichard Henderson MMUAccessType access_type, 53*e7424abcSRichard Henderson int mmu_idx, uintptr_t retaddr) 54*e7424abcSRichard Henderson { 55*e7424abcSRichard Henderson AlphaCPU *cpu = ALPHA_CPU(cs); 56*e7424abcSRichard Henderson CPUAlphaState *env = &cpu->env; 57*e7424abcSRichard Henderson 58*e7424abcSRichard Henderson do_unaligned_access(env, addr, retaddr); 5927103424SAndreas Färber cs->exception_index = EXCP_UNALIGN; 60b9f0923eSRichard Henderson env->error_code = 0; 615638d180SAndreas Färber cpu_loop_exit(cs); 625b450407SRichard Henderson } 635b450407SRichard Henderson 646ad4d7eeSPeter Maydell void alpha_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, 656ad4d7eeSPeter Maydell vaddr addr, unsigned size, 666ad4d7eeSPeter Maydell MMUAccessType access_type, 676ad4d7eeSPeter Maydell int mmu_idx, MemTxAttrs attrs, 686ad4d7eeSPeter Maydell MemTxResult response, uintptr_t retaddr) 695b450407SRichard Henderson { 70c658b94fSAndreas Färber AlphaCPU *cpu = ALPHA_CPU(cs); 71c658b94fSAndreas Färber CPUAlphaState *env = &cpu->env; 72c658b94fSAndreas Färber 735b450407SRichard Henderson env->trap_arg0 = addr; 746ad4d7eeSPeter Maydell env->trap_arg1 = access_type == MMU_DATA_STORE ? 1 : 0; 75ba9c5de5SRichard Henderson cs->exception_index = EXCP_MCHK; 76ba9c5de5SRichard Henderson env->error_code = 0; 77afd46fcaSPavel Dovgalyuk cpu_loop_exit_restore(cs, retaddr); 785b450407SRichard Henderson } 79c3082755SRichard Henderson #endif /* CONFIG_USER_ONLY */ 80