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 94c9649a9Sj_mayer * version 2 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 264c9649a9Sj_mayer /* Softmmu support */ 27c3082755SRichard Henderson #ifndef CONFIG_USER_ONLY 2893e22326SPaolo Bonzini void alpha_cpu_do_unaligned_access(CPUState *cs, vaddr addr, 29b35399bbSSergey Sorokin MMUAccessType access_type, 30b35399bbSSergey Sorokin int mmu_idx, uintptr_t retaddr) 315b450407SRichard Henderson { 3293e22326SPaolo Bonzini AlphaCPU *cpu = ALPHA_CPU(cs); 3393e22326SPaolo Bonzini CPUAlphaState *env = &cpu->env; 345b450407SRichard Henderson uint64_t pc; 355b450407SRichard Henderson uint32_t insn; 365b450407SRichard Henderson 373f38f309SAndreas Färber cpu_restore_state(cs, retaddr); 385b450407SRichard Henderson 395b450407SRichard Henderson pc = env->pc; 40c3082755SRichard Henderson insn = cpu_ldl_code(env, pc); 415b450407SRichard Henderson 425b450407SRichard Henderson env->trap_arg0 = addr; 435b450407SRichard Henderson env->trap_arg1 = insn >> 26; /* opcode */ 445b450407SRichard Henderson env->trap_arg2 = (insn >> 21) & 31; /* dest regno */ 4527103424SAndreas Färber cs->exception_index = EXCP_UNALIGN; 46b9f0923eSRichard Henderson env->error_code = 0; 475638d180SAndreas Färber cpu_loop_exit(cs); 485b450407SRichard Henderson } 495b450407SRichard Henderson 506ad4d7eeSPeter Maydell void alpha_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, 516ad4d7eeSPeter Maydell vaddr addr, unsigned size, 526ad4d7eeSPeter Maydell MMUAccessType access_type, 536ad4d7eeSPeter Maydell int mmu_idx, MemTxAttrs attrs, 546ad4d7eeSPeter Maydell MemTxResult response, uintptr_t retaddr) 555b450407SRichard Henderson { 56c658b94fSAndreas Färber AlphaCPU *cpu = ALPHA_CPU(cs); 57c658b94fSAndreas Färber CPUAlphaState *env = &cpu->env; 58c658b94fSAndreas Färber 596ad4d7eeSPeter Maydell cpu_restore_state(cs, retaddr); 606ad4d7eeSPeter Maydell 615b450407SRichard Henderson env->trap_arg0 = addr; 626ad4d7eeSPeter Maydell env->trap_arg1 = access_type == MMU_DATA_STORE ? 1 : 0; 63ba9c5de5SRichard Henderson cs->exception_index = EXCP_MCHK; 64ba9c5de5SRichard Henderson env->error_code = 0; 65ba9c5de5SRichard Henderson cpu_loop_exit(cs); 665b450407SRichard Henderson } 675b450407SRichard Henderson 684c9649a9Sj_mayer /* try to fill the TLB and return an exception if error. If retaddr is 694c9649a9Sj_mayer NULL, it means that the function was called in C code (i.e. not 704c9649a9Sj_mayer from generated code or from helper.c) */ 714c9649a9Sj_mayer /* XXX: fix it to restore all registers */ 72b35399bbSSergey Sorokin void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type, 7320503968SBlue Swirl int mmu_idx, uintptr_t retaddr) 744c9649a9Sj_mayer { 754c9649a9Sj_mayer int ret; 764c9649a9Sj_mayer 77b35399bbSSergey Sorokin ret = alpha_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx); 782d9671d3SRichard Henderson if (unlikely(ret != 0)) { 794c9649a9Sj_mayer /* Exception index and error code are already set */ 80*65255e8eSAlex Bennée cpu_loop_exit_restore(cs, retaddr); 814c9649a9Sj_mayer } 824c9649a9Sj_mayer } 83c3082755SRichard Henderson #endif /* CONFIG_USER_ONLY */ 84