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 969163fbbSRichard Henderson * version 2 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" 232ef6175aSRichard Henderson #include "exec/helper-proto.h" 249c17d615SPaolo Bonzini #include "sysemu/sysemu.h" 251de7afc9SPaolo Bonzini #include "qemu/timer.h" 2669163fbbSRichard Henderson 2769163fbbSRichard Henderson 2869163fbbSRichard Henderson uint64_t helper_load_pcc(CPUAlphaState *env) 2969163fbbSRichard Henderson { 3069163fbbSRichard Henderson #ifndef CONFIG_USER_ONLY 3169163fbbSRichard Henderson /* In system mode we have access to a decent high-resolution clock. 3269163fbbSRichard Henderson In order to make OS-level time accounting work with the RPCC, 3369163fbbSRichard Henderson present it with a well-timed clock fixed at 250MHz. */ 3469163fbbSRichard Henderson return (((uint64_t)env->pcc_ofs << 32) 35bc72ad67SAlex Bligh | (uint32_t)(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) >> 2)); 3669163fbbSRichard Henderson #else 37bc72ad67SAlex Bligh /* In user-mode, QEMU_CLOCK_VIRTUAL doesn't exist. Just pass through the host cpu 3869163fbbSRichard Henderson clock ticks. Also, don't bother taking PCC_OFS into account. */ 394a7428c5SChristopher Covington return (uint32_t)cpu_get_host_ticks(); 4069163fbbSRichard Henderson #endif 4169163fbbSRichard Henderson } 4269163fbbSRichard Henderson 4369163fbbSRichard Henderson /* PALcode support special instructions */ 4469163fbbSRichard Henderson #ifndef CONFIG_USER_ONLY 4569163fbbSRichard Henderson void helper_tbia(CPUAlphaState *env) 4669163fbbSRichard Henderson { 47d10eb08fSAlex Bennée tlb_flush(CPU(alpha_env_get_cpu(env))); 4869163fbbSRichard Henderson } 4969163fbbSRichard Henderson 5069163fbbSRichard Henderson void helper_tbis(CPUAlphaState *env, uint64_t p) 5169163fbbSRichard Henderson { 5231b030d4SAndreas Färber tlb_flush_page(CPU(alpha_env_get_cpu(env)), p); 5369163fbbSRichard Henderson } 5469163fbbSRichard Henderson 55a9ead832SRichard Henderson void helper_tb_flush(CPUAlphaState *env) 56a9ead832SRichard Henderson { 57bbd77c18SPeter Crosthwaite tb_flush(CPU(alpha_env_get_cpu(env))); 58a9ead832SRichard Henderson } 59a9ead832SRichard Henderson 6069163fbbSRichard Henderson void helper_halt(uint64_t restart) 6169163fbbSRichard Henderson { 6269163fbbSRichard Henderson if (restart) { 63*cf83f140SEric Blake qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); 6469163fbbSRichard Henderson } else { 65*cf83f140SEric Blake qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); 6669163fbbSRichard Henderson } 6769163fbbSRichard Henderson } 6869163fbbSRichard Henderson 6919e0cbb8SRichard Henderson uint64_t helper_get_vmtime(void) 7019e0cbb8SRichard Henderson { 71bc72ad67SAlex Bligh return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); 7219e0cbb8SRichard Henderson } 7319e0cbb8SRichard Henderson 7419e0cbb8SRichard Henderson uint64_t helper_get_walltime(void) 7569163fbbSRichard Henderson { 76884f17c2SAlex Bligh return qemu_clock_get_ns(rtc_clock); 7769163fbbSRichard Henderson } 7869163fbbSRichard Henderson 7969163fbbSRichard Henderson void helper_set_alarm(CPUAlphaState *env, uint64_t expire) 8069163fbbSRichard Henderson { 81c9245853SAndreas Färber AlphaCPU *cpu = alpha_env_get_cpu(env); 82c9245853SAndreas Färber 8369163fbbSRichard Henderson if (expire) { 8469163fbbSRichard Henderson env->alarm_expire = expire; 85bc72ad67SAlex Bligh timer_mod(cpu->alarm_timer, expire); 8669163fbbSRichard Henderson } else { 87bc72ad67SAlex Bligh timer_del(cpu->alarm_timer); 8869163fbbSRichard Henderson } 8969163fbbSRichard Henderson } 90ba96394eSRichard Henderson 9169163fbbSRichard Henderson #endif /* CONFIG_USER_ONLY */ 92