169163fbbSRichard Henderson /* 269163fbbSRichard Henderson * Helpers for system instructions. 369163fbbSRichard Henderson * 469163fbbSRichard Henderson * Copyright (c) 2007 Jocelyn Mayer 569163fbbSRichard Henderson * 669163fbbSRichard Henderson * This library is free software; you can redistribute it and/or 769163fbbSRichard Henderson * modify it under the terms of the GNU Lesser General Public 869163fbbSRichard Henderson * License as published by the Free Software Foundation; either 9d6ea4236SChetan Pant * version 2.1 of the License, or (at your option) any later version. 1069163fbbSRichard Henderson * 1169163fbbSRichard Henderson * This library is distributed in the hope that it will be useful, 1269163fbbSRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of 1369163fbbSRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1469163fbbSRichard Henderson * Lesser General Public License for more details. 1569163fbbSRichard Henderson * 1669163fbbSRichard Henderson * You should have received a copy of the GNU Lesser General Public 1769163fbbSRichard Henderson * License along with this library; if not, see <http://www.gnu.org/licenses/>. 1869163fbbSRichard Henderson */ 1969163fbbSRichard Henderson 20e2e5e114SPeter Maydell #include "qemu/osdep.h" 2169163fbbSRichard Henderson #include "cpu.h" 2263c91552SPaolo Bonzini #include "exec/exec-all.h" 23*548c9609SAlex Bennée #include "exec/tb-flush.h" 242ef6175aSRichard Henderson #include "exec/helper-proto.h" 2554d31236SMarkus Armbruster #include "sysemu/runstate.h" 269c17d615SPaolo Bonzini #include "sysemu/sysemu.h" 271de7afc9SPaolo Bonzini #include "qemu/timer.h" 2869163fbbSRichard Henderson 2969163fbbSRichard Henderson 3069163fbbSRichard Henderson uint64_t helper_load_pcc(CPUAlphaState *env) 3169163fbbSRichard Henderson { 3269163fbbSRichard Henderson #ifndef CONFIG_USER_ONLY 3369163fbbSRichard Henderson /* In system mode we have access to a decent high-resolution clock. 3469163fbbSRichard Henderson In order to make OS-level time accounting work with the RPCC, 3569163fbbSRichard Henderson present it with a well-timed clock fixed at 250MHz. */ 3669163fbbSRichard Henderson return (((uint64_t)env->pcc_ofs << 32) 37bc72ad67SAlex Bligh | (uint32_t)(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) >> 2)); 3869163fbbSRichard Henderson #else 39bc72ad67SAlex Bligh /* In user-mode, QEMU_CLOCK_VIRTUAL doesn't exist. Just pass through the host cpu 4069163fbbSRichard Henderson clock ticks. Also, don't bother taking PCC_OFS into account. */ 414a7428c5SChristopher Covington return (uint32_t)cpu_get_host_ticks(); 4269163fbbSRichard Henderson #endif 4369163fbbSRichard Henderson } 4469163fbbSRichard Henderson 4569163fbbSRichard Henderson /* PALcode support special instructions */ 4669163fbbSRichard Henderson #ifndef CONFIG_USER_ONLY 4769163fbbSRichard Henderson void helper_tbia(CPUAlphaState *env) 4869163fbbSRichard Henderson { 491c7ad260SRichard Henderson tlb_flush(env_cpu(env)); 5069163fbbSRichard Henderson } 5169163fbbSRichard Henderson 5269163fbbSRichard Henderson void helper_tbis(CPUAlphaState *env, uint64_t p) 5369163fbbSRichard Henderson { 541c7ad260SRichard Henderson tlb_flush_page(env_cpu(env), p); 5569163fbbSRichard Henderson } 5669163fbbSRichard Henderson 57a9ead832SRichard Henderson void helper_tb_flush(CPUAlphaState *env) 58a9ead832SRichard Henderson { 591c7ad260SRichard Henderson tb_flush(env_cpu(env)); 60a9ead832SRichard Henderson } 61a9ead832SRichard Henderson 6269163fbbSRichard Henderson void helper_halt(uint64_t restart) 6369163fbbSRichard Henderson { 6469163fbbSRichard Henderson if (restart) { 65cf83f140SEric Blake qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); 6669163fbbSRichard Henderson } else { 67cf83f140SEric Blake qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); 6869163fbbSRichard Henderson } 6969163fbbSRichard Henderson } 7069163fbbSRichard Henderson 7119e0cbb8SRichard Henderson uint64_t helper_get_vmtime(void) 7219e0cbb8SRichard Henderson { 73bc72ad67SAlex Bligh return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); 7419e0cbb8SRichard Henderson } 7519e0cbb8SRichard Henderson 7619e0cbb8SRichard Henderson uint64_t helper_get_walltime(void) 7769163fbbSRichard Henderson { 78884f17c2SAlex Bligh return qemu_clock_get_ns(rtc_clock); 7969163fbbSRichard Henderson } 8069163fbbSRichard Henderson 8169163fbbSRichard Henderson void helper_set_alarm(CPUAlphaState *env, uint64_t expire) 8269163fbbSRichard Henderson { 831c7ad260SRichard Henderson AlphaCPU *cpu = env_archcpu(env); 84c9245853SAndreas Färber 8569163fbbSRichard Henderson if (expire) { 8669163fbbSRichard Henderson env->alarm_expire = expire; 87bc72ad67SAlex Bligh timer_mod(cpu->alarm_timer, expire); 8869163fbbSRichard Henderson } else { 89bc72ad67SAlex Bligh timer_del(cpu->alarm_timer); 9069163fbbSRichard Henderson } 9169163fbbSRichard Henderson } 92ba96394eSRichard Henderson 9369163fbbSRichard Henderson #endif /* CONFIG_USER_ONLY */ 94