blob: a5b92863509e3543de2d4dcf301bc49be6d6266f [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Functions to retrieve VM-specific information
*
* Copyright (c) 2020 Red Hat Inc
*
* Authors:
* Thomas Huth <thuth@redhat.com>
*/
#include <libcflat.h>
#include <alloc_page.h>
#include <asm/arch_def.h>
#include "vm.h"
/**
* Detect whether we are running with TCG (instead of KVM)
*/
bool vm_is_tcg(void)
{
const char qemu_ebcdic[] = { 0xd8, 0xc5, 0xd4, 0xe4 };
static bool initialized = false;
static bool is_tcg = false;
uint8_t *buf;
if (initialized)
return is_tcg;
buf = alloc_page();
if (!buf)
return false;
if (stsi(buf, 1, 1, 1))
goto out;
/*
* If the manufacturer string is "QEMU" in EBCDIC, then we
* are on TCG (otherwise the string is "IBM" in EBCDIC)
*/
is_tcg = !memcmp(&buf[32], qemu_ebcdic, sizeof(qemu_ebcdic));
initialized = true;
out:
free_page(buf);
return is_tcg;
}