cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

sys_helper.c (2517B)


      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.1 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 "qemu/osdep.h"
     21#include "cpu.h"
     22#include "exec/exec-all.h"
     23#include "exec/helper-proto.h"
     24#include "sysemu/runstate.h"
     25#include "sysemu/sysemu.h"
     26#include "qemu/timer.h"
     27
     28
     29uint64_t helper_load_pcc(CPUAlphaState *env)
     30{
     31#ifndef CONFIG_USER_ONLY
     32    /* In system mode we have access to a decent high-resolution clock.
     33       In order to make OS-level time accounting work with the RPCC,
     34       present it with a well-timed clock fixed at 250MHz.  */
     35    return (((uint64_t)env->pcc_ofs << 32)
     36            | (uint32_t)(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) >> 2));
     37#else
     38    /* In user-mode, QEMU_CLOCK_VIRTUAL doesn't exist.  Just pass through the host cpu
     39       clock ticks.  Also, don't bother taking PCC_OFS into account.  */
     40    return (uint32_t)cpu_get_host_ticks();
     41#endif
     42}
     43
     44/* PALcode support special instructions */
     45#ifndef CONFIG_USER_ONLY
     46void helper_tbia(CPUAlphaState *env)
     47{
     48    tlb_flush(env_cpu(env));
     49}
     50
     51void helper_tbis(CPUAlphaState *env, uint64_t p)
     52{
     53    tlb_flush_page(env_cpu(env), p);
     54}
     55
     56void helper_tb_flush(CPUAlphaState *env)
     57{
     58    tb_flush(env_cpu(env));
     59}
     60
     61void helper_halt(uint64_t restart)
     62{
     63    if (restart) {
     64        qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
     65    } else {
     66        qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
     67    }
     68}
     69
     70uint64_t helper_get_vmtime(void)
     71{
     72    return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
     73}
     74
     75uint64_t helper_get_walltime(void)
     76{
     77    return qemu_clock_get_ns(rtc_clock);
     78}
     79
     80void helper_set_alarm(CPUAlphaState *env, uint64_t expire)
     81{
     82    AlphaCPU *cpu = env_archcpu(env);
     83
     84    if (expire) {
     85        env->alarm_expire = expire;
     86        timer_mod(cpu->alarm_timer, expire);
     87    } else {
     88        timer_del(cpu->alarm_timer);
     89    }
     90}
     91
     92#endif /* CONFIG_USER_ONLY */