571 changes: 571 additions & 0 deletions bsd-user/freebsd/os-sys.c

Large diffs are not rendered by default.

17 changes: 16 additions & 1 deletion bsd-user/freebsd/os-syscall.c
Expand Up @@ -491,6 +491,21 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
ret = do_bsd_undelete(arg1);
break;

/*
* sys{ctl, arch, call}
*/
case TARGET_FREEBSD_NR___sysctl: /* sysctl(3) */
ret = do_freebsd_sysctl(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
break;

case TARGET_FREEBSD_NR___sysctlbyname: /* sysctlbyname(2) */
ret = do_freebsd_sysctlbyname(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
break;

case TARGET_FREEBSD_NR_sysarch: /* sysarch(2) */
ret = do_freebsd_sysarch(cpu_env, arg1, arg2);
break;

default:
qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num);
ret = -TARGET_ENOSYS;
Expand All @@ -512,7 +527,7 @@ abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
abi_long arg8)
{
CPUState *cpu = env_cpu(cpu_env);
int ret;
abi_long ret;

trace_guest_user_syscall(cpu, num, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
if (do_strace) {
Expand Down
5 changes: 5 additions & 0 deletions bsd-user/qemu.h
Expand Up @@ -253,6 +253,11 @@ bool is_error(abi_long ret);
int host_to_target_errno(int err);

/* os-sys.c */
abi_long do_freebsd_sysctl(CPUArchState *env, abi_ulong namep, int32_t namelen,
abi_ulong oldp, abi_ulong oldlenp, abi_ulong newp, abi_ulong newlen);
abi_long do_freebsd_sysctlbyname(CPUArchState *env, abi_ulong namep,
int32_t namelen, abi_ulong oldp, abi_ulong oldlenp, abi_ulong newp,
abi_ulong newlen);
abi_long do_freebsd_sysarch(void *cpu_env, abi_long arg1, abi_long arg2);

/* user access */
Expand Down
2 changes: 1 addition & 1 deletion configure
Expand Up @@ -1347,7 +1347,7 @@ if test "$static" = "yes"; then
error_exit "-static-pie not available due to missing toolchain support"
else
pie="no"
QEMU_CFLAGS="-fno-pie -no-pie $QEMU_CFLAGS"
QEMU_CFLAGS="-fno-pie $QEMU_CFLAGS"
fi
elif test "$pie" = "no"; then
if compile_prog "-Werror -fno-pie" "-no-pie"; then
Expand Down
8 changes: 2 additions & 6 deletions monitor/hmp.c
Expand Up @@ -1189,9 +1189,7 @@ static void cmd_completion(MonitorHMP *mon, const char *name, const char *list)
}
memcpy(cmd, pstart, len);
cmd[len] = '\0';
if (name[0] == '\0') {
readline_add_completion_of(mon->rs, name, cmd);
}
readline_add_completion_of(mon->rs, name, cmd);
if (*p == '\0') {
break;
}
Expand Down Expand Up @@ -1335,9 +1333,7 @@ static void monitor_find_completion_by_table(MonitorHMP *mon,
/* block device name completion */
readline_set_completion_index(mon->rs, strlen(str));
while ((blk = blk_next(blk)) != NULL) {
if (str[0] == '\0') {
readline_add_completion_of(mon->rs, str, blk_name(blk));
}
readline_add_completion_of(mon->rs, str, blk_name(blk));
}
break;
case 's':
Expand Down
28 changes: 28 additions & 0 deletions target/arm/monitor.c → target/arm/arm-qmp-cmds.c
Expand Up @@ -227,3 +227,31 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,

return expansion_info;
}

static void arm_cpu_add_definition(gpointer data, gpointer user_data)
{
ObjectClass *oc = data;
CpuDefinitionInfoList **cpu_list = user_data;
CpuDefinitionInfo *info;
const char *typename;

typename = object_class_get_name(oc);
info = g_malloc0(sizeof(*info));
info->name = g_strndup(typename,
strlen(typename) - strlen("-" TYPE_ARM_CPU));
info->q_typename = g_strdup(typename);

QAPI_LIST_PREPEND(*cpu_list, info);
}

CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
{
CpuDefinitionInfoList *cpu_list = NULL;
GSList *list;

list = object_class_get_list(TYPE_ARM_CPU, false);
g_slist_foreach(list, arm_cpu_add_definition, &cpu_list);
g_slist_free(list);

return cpu_list;
}
29 changes: 0 additions & 29 deletions target/arm/helper.c
Expand Up @@ -23,7 +23,6 @@
#include "sysemu/cpu-timers.h"
#include "sysemu/kvm.h"
#include "sysemu/tcg.h"
#include "qapi/qapi-commands-machine-target.h"
#include "qapi/error.h"
#include "qemu/guest-random.h"
#ifdef CONFIG_TCG
Expand Down Expand Up @@ -9188,34 +9187,6 @@ void arm_cpu_list(void)
g_slist_free(list);
}

static void arm_cpu_add_definition(gpointer data, gpointer user_data)
{
ObjectClass *oc = data;
CpuDefinitionInfoList **cpu_list = user_data;
CpuDefinitionInfo *info;
const char *typename;

typename = object_class_get_name(oc);
info = g_malloc0(sizeof(*info));
info->name = g_strndup(typename,
strlen(typename) - strlen("-" TYPE_ARM_CPU));
info->q_typename = g_strdup(typename);

QAPI_LIST_PREPEND(*cpu_list, info);
}

CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
{
CpuDefinitionInfoList *cpu_list = NULL;
GSList *list;

list = object_class_get_list(TYPE_ARM_CPU, false);
g_slist_foreach(list, arm_cpu_add_definition, &cpu_list);
g_slist_free(list);

return cpu_list;
}

/*
* Private utility function for define_one_arm_cp_reg_with_opaque():
* add a single reginfo struct to the hash table.
Expand Down
2 changes: 1 addition & 1 deletion target/arm/meson.build
Expand Up @@ -20,8 +20,8 @@ arm_softmmu_ss = ss.source_set()
arm_softmmu_ss.add(files(
'arch_dump.c',
'arm-powerctl.c',
'arm-qmp-cmds.c',
'machine.c',
'monitor.c',
'ptw.c',
))

Expand Down
74 changes: 39 additions & 35 deletions target/i386/cpu.c
Expand Up @@ -31,11 +31,11 @@
#include "qapi/error.h"
#include "qapi/qapi-visit-machine.h"
#include "qapi/qmp/qerror.h"
#include "qapi/qapi-commands-machine-target.h"
#include "standard-headers/asm-x86/kvm_para.h"
#include "hw/qdev-properties.h"
#include "hw/i386/topology.h"
#ifndef CONFIG_USER_ONLY
#include "qapi/qapi-commands-machine-target.h"
#include "exec/address-spaces.h"
#include "hw/boards.h"
#include "hw/i386/sgx-epc.h"
Expand Down Expand Up @@ -4843,40 +4843,6 @@ static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
visit_type_strList(v, "unavailable-features", &result, errp);
}

/* Check for missing features that may prevent the CPU class from
* running using the current machine and accelerator.
*/
static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
strList **list)
{
strList **tail = list;
X86CPU *xc;
Error *err = NULL;

if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
QAPI_LIST_APPEND(tail, g_strdup("kvm"));
return;
}

xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));

x86_cpu_expand_features(xc, &err);
if (err) {
/* Errors at x86_cpu_expand_features should never happen,
* but in case it does, just report the model as not
* runnable at all using the "type" property.
*/
QAPI_LIST_APPEND(tail, g_strdup("type"));
error_free(err);
}

x86_cpu_filter_features(xc, false);

x86_cpu_list_feature_names(xc->filtered_features, tail);

object_unref(OBJECT(xc));
}

/* Print all cpuid feature names in featureset
*/
static void listflags(GList *features)
Expand Down Expand Up @@ -5005,6 +4971,42 @@ void x86_cpu_list(void)
g_list_free(names);
}

#ifndef CONFIG_USER_ONLY

/* Check for missing features that may prevent the CPU class from
* running using the current machine and accelerator.
*/
static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
strList **list)
{
strList **tail = list;
X86CPU *xc;
Error *err = NULL;

if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
QAPI_LIST_APPEND(tail, g_strdup("kvm"));
return;
}

xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));

x86_cpu_expand_features(xc, &err);
if (err) {
/* Errors at x86_cpu_expand_features should never happen,
* but in case it does, just report the model as not
* runnable at all using the "type" property.
*/
QAPI_LIST_APPEND(tail, g_strdup("type"));
error_free(err);
}

x86_cpu_filter_features(xc, false);

x86_cpu_list_feature_names(xc->filtered_features, tail);

object_unref(OBJECT(xc));
}

static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
{
ObjectClass *oc = data;
Expand Down Expand Up @@ -5045,6 +5047,8 @@ CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
return cpu_list;
}

#endif /* !CONFIG_USER_ONLY */

uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
bool migratable_only)
{
Expand Down
27 changes: 0 additions & 27 deletions target/loongarch/cpu.c
Expand Up @@ -12,7 +12,6 @@
#include "qemu/module.h"
#include "sysemu/qtest.h"
#include "exec/exec-all.h"
#include "qapi/qapi-commands-machine-target.h"
#include "cpu.h"
#include "internals.h"
#include "fpu/softfloat-helpers.h"
Expand Down Expand Up @@ -750,29 +749,3 @@ static const TypeInfo loongarch_cpu_type_infos[] = {
};

DEFINE_TYPES(loongarch_cpu_type_infos)

static void loongarch_cpu_add_definition(gpointer data, gpointer user_data)
{
ObjectClass *oc = data;
CpuDefinitionInfoList **cpu_list = user_data;
CpuDefinitionInfo *info = g_new0(CpuDefinitionInfo, 1);
const char *typename = object_class_get_name(oc);

info->name = g_strndup(typename,
strlen(typename) - strlen("-" TYPE_LOONGARCH_CPU));
info->q_typename = g_strdup(typename);

QAPI_LIST_PREPEND(*cpu_list, info);
}

CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
{
CpuDefinitionInfoList *cpu_list = NULL;
GSList *list;

list = object_class_get_list(TYPE_LOONGARCH_CPU, false);
g_slist_foreach(list, loongarch_cpu_add_definition, &cpu_list);
g_slist_free(list);

return cpu_list;
}
37 changes: 37 additions & 0 deletions target/loongarch/loongarch-qmp-cmds.c
@@ -0,0 +1,37 @@
/*
* QEMU LoongArch CPU (monitor definitions)
*
* SPDX-FileCopyrightText: 2021 Loongson Technology Corporation Limited
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/

#include "qemu/osdep.h"
#include "qapi/qapi-commands-machine-target.h"
#include "cpu.h"

static void loongarch_cpu_add_definition(gpointer data, gpointer user_data)
{
ObjectClass *oc = data;
CpuDefinitionInfoList **cpu_list = user_data;
CpuDefinitionInfo *info = g_new0(CpuDefinitionInfo, 1);
const char *typename = object_class_get_name(oc);

info->name = g_strndup(typename,
strlen(typename) - strlen("-" TYPE_LOONGARCH_CPU));
info->q_typename = g_strdup(typename);

QAPI_LIST_PREPEND(*cpu_list, info);
}

CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
{
CpuDefinitionInfoList *cpu_list = NULL;
GSList *list;

list = object_class_get_list(TYPE_LOONGARCH_CPU, false);
g_slist_foreach(list, loongarch_cpu_add_definition, &cpu_list);
g_slist_free(list);

return cpu_list;
}
1 change: 1 addition & 0 deletions target/loongarch/meson.build
Expand Up @@ -16,6 +16,7 @@ loongarch_tcg_ss.add(zlib)

loongarch_softmmu_ss = ss.source_set()
loongarch_softmmu_ss.add(files(
'loongarch-qmp-cmds.c',
'machine.c',
'tlb_helper.c',
'constant_timer.c',
Expand Down
2 changes: 2 additions & 0 deletions target/ppc/cpu-qom.h
Expand Up @@ -31,6 +31,8 @@

OBJECT_DECLARE_CPU_TYPE(PowerPCCPU, PowerPCCPUClass, POWERPC_CPU)

ObjectClass *ppc_cpu_class_by_name(const char *name);

typedef struct CPUArchState CPUPPCState;
typedef struct ppc_tb_t ppc_tb_t;
typedef struct ppc_dcr_t ppc_dcr_t;
Expand Down
48 changes: 1 addition & 47 deletions target/ppc/cpu_init.c
Expand Up @@ -40,7 +40,6 @@
#include "qemu/cutils.h"
#include "disas/capstone.h"
#include "fpu/softfloat.h"
#include "qapi/qapi-commands-machine-target.h"

#include "helper_regs.h"
#include "internal.h"
Expand Down Expand Up @@ -6841,7 +6840,7 @@ static const char *ppc_cpu_lookup_alias(const char *alias)
return NULL;
}

static ObjectClass *ppc_cpu_class_by_name(const char *name)
ObjectClass *ppc_cpu_class_by_name(const char *name)
{
char *cpu_model, *typename;
ObjectClass *oc;
Expand Down Expand Up @@ -6981,51 +6980,6 @@ void ppc_cpu_list(void)
#endif
}

static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
{
ObjectClass *oc = data;
CpuDefinitionInfoList **first = user_data;
const char *typename;
CpuDefinitionInfo *info;

typename = object_class_get_name(oc);
info = g_malloc0(sizeof(*info));
info->name = g_strndup(typename,
strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));

QAPI_LIST_PREPEND(*first, info);
}

CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
{
CpuDefinitionInfoList *cpu_list = NULL;
GSList *list;
int i;

list = object_class_get_list(TYPE_POWERPC_CPU, false);
g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list);
g_slist_free(list);

for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
ObjectClass *oc;
CpuDefinitionInfo *info;

oc = ppc_cpu_class_by_name(alias->model);
if (oc == NULL) {
continue;
}

info = g_malloc0(sizeof(*info));
info->name = g_strdup(alias->alias);
info->q_typename = g_strdup(object_class_get_name(oc));

QAPI_LIST_PREPEND(cpu_list, info);
}

return cpu_list;
}

static void ppc_cpu_set_pc(CPUState *cs, vaddr value)
{
PowerPCCPU *cpu = POWERPC_CPU(cs);
Expand Down
2 changes: 1 addition & 1 deletion target/ppc/meson.build
Expand Up @@ -39,7 +39,7 @@ ppc_softmmu_ss.add(files(
'machine.c',
'mmu-hash32.c',
'mmu_common.c',
'monitor.c',
'ppc-qmp-cmds.c',
))
ppc_softmmu_ss.add(when: 'CONFIG_TCG', if_true: files(
'mmu_helper.c',
Expand Down
50 changes: 49 additions & 1 deletion target/ppc/monitor.c → target/ppc/ppc-qmp-cmds.c
@@ -1,5 +1,5 @@
/*
* QEMU monitor
* QEMU PPC (monitor definitions)
*
* Copyright (c) 2003-2004 Fabrice Bellard
*
Expand Down Expand Up @@ -28,6 +28,9 @@
#include "qemu/ctype.h"
#include "monitor/hmp-target.h"
#include "monitor/hmp.h"
#include "qapi/qapi-commands-machine-target.h"
#include "cpu-models.h"
#include "cpu-qom.h"

static target_long monitor_get_ccr(Monitor *mon, const struct MonitorDef *md,
int val)
Expand Down Expand Up @@ -172,3 +175,48 @@ int target_get_monitor_def(CPUState *cs, const char *name, uint64_t *pval)

return -EINVAL;
}

static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
{
ObjectClass *oc = data;
CpuDefinitionInfoList **first = user_data;
const char *typename;
CpuDefinitionInfo *info;

typename = object_class_get_name(oc);
info = g_malloc0(sizeof(*info));
info->name = g_strndup(typename,
strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));

QAPI_LIST_PREPEND(*first, info);
}

CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
{
CpuDefinitionInfoList *cpu_list = NULL;
GSList *list;
int i;

list = object_class_get_list(TYPE_POWERPC_CPU, false);
g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list);
g_slist_free(list);

for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
ObjectClass *oc;
CpuDefinitionInfo *info;

oc = ppc_cpu_class_by_name(alias->model);
if (oc == NULL) {
continue;
}

info = g_malloc0(sizeof(*info));
info->name = g_strdup(alias->alias);
info->q_typename = g_strdup(object_class_get_name(oc));

QAPI_LIST_PREPEND(cpu_list, info);
}

return cpu_list;
}