| /* |
| * S/390 helpers |
| * |
| * Copyright (c) 2009 Ulrich Hecht |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "cpu.h" |
| #include "exec-all.h" |
| #include "gdbstub.h" |
| #include "qemu-common.h" |
| |
| #include <linux/kvm.h> |
| #include "kvm.h" |
| |
| CPUS390XState *cpu_s390x_init(const char *cpu_model) |
| { |
| CPUS390XState *env; |
| static int inited = 0; |
| |
| env = qemu_mallocz(sizeof(CPUS390XState)); |
| cpu_exec_init(env); |
| if (!inited) { |
| inited = 1; |
| } |
| |
| env->cpu_model_str = cpu_model; |
| cpu_reset(env); |
| qemu_init_vcpu(env); |
| return env; |
| } |
| |
| void cpu_reset(CPUS390XState *env) |
| { |
| if (qemu_loglevel_mask(CPU_LOG_RESET)) { |
| qemu_log("CPU Reset (CPU %d)\n", env->cpu_index); |
| log_cpu_state(env, 0); |
| } |
| |
| memset(env, 0, offsetof(CPUS390XState, breakpoints)); |
| /* FIXME: reset vector? */ |
| tlb_flush(env, 1); |
| } |
| |
| target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr) |
| { |
| return 0; |
| } |
| |
| #ifndef CONFIG_USER_ONLY |
| |
| int cpu_s390x_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
| int mmu_idx, int is_softmmu) |
| { |
| target_ulong phys; |
| int prot; |
| |
| /* XXX: implement mmu */ |
| |
| phys = address; |
| prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; |
| |
| tlb_set_page(env, address & TARGET_PAGE_MASK, |
| phys & TARGET_PAGE_MASK, prot, |
| mmu_idx, TARGET_PAGE_SIZE); |
| return 0; |
| } |
| #endif /* CONFIG_USER_ONLY */ |