1/* 2 * Helpers for system instructions. 3 * 4 * Copyright (c) 2007 Jocelyn Mayer 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18 */ 19 20#include "cpu.h" 21#include "helper.h" 22#include "sysemu/sysemu.h" 23#include "qemu/timer.h" 24 25 26uint64_t helper_load_pcc(CPUAlphaState *env) 27{ 28#ifndef CONFIG_USER_ONLY 29 /* In system mode we have access to a decent high-resolution clock. 30 In order to make OS-level time accounting work with the RPCC, 31 present it with a well-timed clock fixed at 250MHz. */ 32 return (((uint64_t)env->pcc_ofs << 32) 33 | (uint32_t)(qemu_get_clock_ns(vm_clock) >> 2)); 34#else 35 /* In user-mode, vm_clock doesn't exist. Just pass through the host cpu 36 clock ticks. Also, don't bother taking PCC_OFS into account. */ 37 return (uint32_t)cpu_get_real_ticks(); 38#endif 39} 40 41/* PALcode support special instructions */ 42#ifndef CONFIG_USER_ONLY 43void helper_hw_ret(CPUAlphaState *env, uint64_t a) 44{ 45 env->pc = a & ~3; 46 env->intr_flag = 0; 47 env->lock_addr = -1; 48 if ((a & 1) == 0) { 49 env->pal_mode = 0; 50 swap_shadow_regs(env); 51 } 52} 53 54void helper_tbia(CPUAlphaState *env) 55{ 56 tlb_flush(env, 1); 57} 58 59void helper_tbis(CPUAlphaState *env, uint64_t p) 60{ 61 tlb_flush_page(env, p); 62} 63 64void helper_halt(uint64_t restart) 65{ 66 if (restart) { 67 qemu_system_reset_request(); 68 } else { 69 qemu_system_shutdown_request(); 70 } 71} 72 73uint64_t helper_get_vmtime(void) 74{ 75 return qemu_get_clock_ns(vm_clock); 76} 77 78uint64_t helper_get_walltime(void) 79{ 80 return qemu_get_clock_ns(rtc_clock); 81} 82 83void helper_set_alarm(CPUAlphaState *env, uint64_t expire) 84{ 85 AlphaCPU *cpu = alpha_env_get_cpu(env); 86 87 if (expire) { 88 env->alarm_expire = expire; 89 qemu_mod_timer(cpu->alarm_timer, expire); 90 } else { 91 qemu_del_timer(cpu->alarm_timer); 92 } 93} 94#endif /* CONFIG_USER_ONLY */ 95