* improve compatibility for macOS scripts/entitlement.sh (Evan)
* add support for KVM_GUESTDBG_BLOCKIRQ (Maxim) * update linux-headers to Linux 5.16 (myself) * configure cleanups (myself) * lsi53c895a assertion failure fix (Philippe) * fix incorrect description for die-id (Yanan) * support for NUMA in SGX enclave memory (Yang Zhong) -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmG5yEgUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroOFkwf9Glt3tnHfO/gWZectiMAjjM8vg3cR yEsWU0fa0iu8MO8NiOW0b6DT0yosZ8rl2SYSZBQGqwa/Lq2MZLO2v0JG4LblBom7 WVmzNOG4t0OFoE2gwMlZ2J+ppaHV5zN1Yc6lMXOVQcefY0pXoyze+0Fq/cwKf2+p 6WDZTuOpjtxMwt9n71b93kNAHagk422MpNi1xi+o37hNsm/Zh3BTtaSJ7WCkCmWq YmwwQZgyB/V0Ah42wchuf5zxEnQPMbjaQSu8jQU4iyCB7+2biBuh3Cqw5eR8tqC1 cGNINGlo2Orl9ASyEunHyuDj8p0wN8J37wNuBo4kghhrTVsVKQYF0wmsqw== =U1Xy -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging * improve compatibility for macOS scripts/entitlement.sh (Evan) * add support for KVM_GUESTDBG_BLOCKIRQ (Maxim) * update linux-headers to Linux 5.16 (myself) * configure cleanups (myself) * lsi53c895a assertion failure fix (Philippe) * fix incorrect description for die-id (Yanan) * support for NUMA in SGX enclave memory (Yang Zhong) # gpg: Signature made Wed 15 Dec 2021 02:49:44 AM PST # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [unknown] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: configure: remove dead variables doc: Add the SGX numa description numa: Support SGX numa in the monitor and Libvirt interfaces numa: Enable numa for SGX EPC sections kvm: add support for KVM_GUESTDBG_BLOCKIRQ gdbstub, kvm: let KVM report supported singlestep flags gdbstub: reject unsupported flags in handle_set_qemu_sstep linux-headers: update to 5.16-rc1 virtio-gpu: do not byteswap padding scripts/entitlement.sh: Use backward-compatible cp flags qapi/machine.json: Fix incorrect description for die-id tests/qtest: Add fuzz-lsi53c895a-test hw/scsi/lsi53c895a: Do not abort when DMA requested and no data queued Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
29eb5c2c86
@ -1825,6 +1825,7 @@ F: hw/scsi/*
|
|||||||
F: tests/qtest/virtio-scsi-test.c
|
F: tests/qtest/virtio-scsi-test.c
|
||||||
F: tests/qtest/fuzz-virtio-scsi-test.c
|
F: tests/qtest/fuzz-virtio-scsi-test.c
|
||||||
F: tests/qtest/am53c974-test.c
|
F: tests/qtest/am53c974-test.c
|
||||||
|
F: tests/qtest/fuzz-lsi53c895a-test.c
|
||||||
T: git https://github.com/bonzini/qemu.git scsi-next
|
T: git https://github.com/bonzini/qemu.git scsi-next
|
||||||
|
|
||||||
SSI
|
SSI
|
||||||
|
@ -61,6 +61,10 @@
|
|||||||
#endif
|
#endif
|
||||||
#define PAGE_SIZE qemu_real_host_page_size
|
#define PAGE_SIZE qemu_real_host_page_size
|
||||||
|
|
||||||
|
#ifndef KVM_GUESTDBG_BLOCKIRQ
|
||||||
|
#define KVM_GUESTDBG_BLOCKIRQ 0
|
||||||
|
#endif
|
||||||
|
|
||||||
//#define DEBUG_KVM
|
//#define DEBUG_KVM
|
||||||
|
|
||||||
#ifdef DEBUG_KVM
|
#ifdef DEBUG_KVM
|
||||||
@ -168,6 +172,8 @@ bool kvm_vm_attributes_allowed;
|
|||||||
bool kvm_direct_msi_allowed;
|
bool kvm_direct_msi_allowed;
|
||||||
bool kvm_ioeventfd_any_length_allowed;
|
bool kvm_ioeventfd_any_length_allowed;
|
||||||
bool kvm_msi_use_devid;
|
bool kvm_msi_use_devid;
|
||||||
|
bool kvm_has_guest_debug;
|
||||||
|
int kvm_sstep_flags;
|
||||||
static bool kvm_immediate_exit;
|
static bool kvm_immediate_exit;
|
||||||
static hwaddr kvm_max_slot_size = ~0;
|
static hwaddr kvm_max_slot_size = ~0;
|
||||||
|
|
||||||
@ -2564,6 +2570,25 @@ static int kvm_init(MachineState *ms)
|
|||||||
kvm_ioeventfd_any_length_allowed =
|
kvm_ioeventfd_any_length_allowed =
|
||||||
(kvm_check_extension(s, KVM_CAP_IOEVENTFD_ANY_LENGTH) > 0);
|
(kvm_check_extension(s, KVM_CAP_IOEVENTFD_ANY_LENGTH) > 0);
|
||||||
|
|
||||||
|
#ifdef KVM_CAP_SET_GUEST_DEBUG
|
||||||
|
kvm_has_guest_debug =
|
||||||
|
(kvm_check_extension(s, KVM_CAP_SET_GUEST_DEBUG) > 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
kvm_sstep_flags = 0;
|
||||||
|
if (kvm_has_guest_debug) {
|
||||||
|
kvm_sstep_flags = SSTEP_ENABLE;
|
||||||
|
|
||||||
|
#if defined KVM_CAP_SET_GUEST_DEBUG2
|
||||||
|
int guest_debug_flags =
|
||||||
|
kvm_check_extension(s, KVM_CAP_SET_GUEST_DEBUG2);
|
||||||
|
|
||||||
|
if (guest_debug_flags & KVM_GUESTDBG_BLOCKIRQ) {
|
||||||
|
kvm_sstep_flags |= SSTEP_NOIRQ;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
kvm_state = s;
|
kvm_state = s;
|
||||||
|
|
||||||
ret = kvm_arch_init(ms, s);
|
ret = kvm_arch_init(ms, s);
|
||||||
@ -3193,6 +3218,10 @@ int kvm_update_guest_debug(CPUState *cpu, unsigned long reinject_trap)
|
|||||||
|
|
||||||
if (cpu->singlestep_enabled) {
|
if (cpu->singlestep_enabled) {
|
||||||
data.dbg.control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
|
data.dbg.control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP;
|
||||||
|
|
||||||
|
if (cpu->singlestep_enabled & SSTEP_NOIRQ) {
|
||||||
|
data.dbg.control |= KVM_GUESTDBG_BLOCKIRQ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
kvm_arch_update_guest_debug(cpu, &data.dbg);
|
kvm_arch_update_guest_debug(cpu, &data.dbg);
|
||||||
|
|
||||||
|
5
configure
vendored
5
configure
vendored
@ -625,7 +625,6 @@ fi
|
|||||||
case $targetos in
|
case $targetos in
|
||||||
MINGW32*)
|
MINGW32*)
|
||||||
mingw32="yes"
|
mingw32="yes"
|
||||||
supported_os="yes"
|
|
||||||
plugins="no"
|
plugins="no"
|
||||||
pie="no"
|
pie="no"
|
||||||
;;
|
;;
|
||||||
@ -667,7 +666,6 @@ SunOS)
|
|||||||
QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
|
QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
|
||||||
;;
|
;;
|
||||||
Haiku)
|
Haiku)
|
||||||
haiku="yes"
|
|
||||||
pie="no"
|
pie="no"
|
||||||
QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC $QEMU_CFLAGS"
|
QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC $QEMU_CFLAGS"
|
||||||
;;
|
;;
|
||||||
@ -3451,9 +3449,6 @@ fi
|
|||||||
if test "$solaris" = "yes" ; then
|
if test "$solaris" = "yes" ; then
|
||||||
echo "CONFIG_SOLARIS=y" >> $config_host_mak
|
echo "CONFIG_SOLARIS=y" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
if test "$haiku" = "yes" ; then
|
|
||||||
echo "CONFIG_HAIKU=y" >> $config_host_mak
|
|
||||||
fi
|
|
||||||
if test "$static" = "yes" ; then
|
if test "$static" = "yes" ; then
|
||||||
echo "CONFIG_STATIC=y" >> $config_host_mak
|
echo "CONFIG_STATIC=y" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
|
@ -141,8 +141,7 @@ To launch a SGX guest:
|
|||||||
|qemu_system_x86| \\
|
|qemu_system_x86| \\
|
||||||
-cpu host,+sgx-provisionkey \\
|
-cpu host,+sgx-provisionkey \\
|
||||||
-object memory-backend-epc,id=mem1,size=64M,prealloc=on \\
|
-object memory-backend-epc,id=mem1,size=64M,prealloc=on \\
|
||||||
-object memory-backend-epc,id=mem2,size=28M \\
|
-M sgx-epc.0.memdev=mem1,sgx-epc.0.node=0
|
||||||
-M sgx-epc.0.memdev=mem1,sgx-epc.1.memdev=mem2
|
|
||||||
|
|
||||||
Utilizing SGX in the guest requires a kernel/OS with SGX support.
|
Utilizing SGX in the guest requires a kernel/OS with SGX support.
|
||||||
The support can be determined in guest by::
|
The support can be determined in guest by::
|
||||||
@ -152,8 +151,32 @@ The support can be determined in guest by::
|
|||||||
and SGX epc info by::
|
and SGX epc info by::
|
||||||
|
|
||||||
$ dmesg | grep sgx
|
$ dmesg | grep sgx
|
||||||
[ 1.242142] sgx: EPC section 0x180000000-0x181bfffff
|
[ 0.182807] sgx: EPC section 0x140000000-0x143ffffff
|
||||||
[ 1.242319] sgx: EPC section 0x181c00000-0x1837fffff
|
[ 0.183695] sgx: [Firmware Bug]: Unable to map EPC section to online node. Fallback to the NUMA node 0.
|
||||||
|
|
||||||
|
To launch a SGX numa guest:
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
|qemu_system_x86| \\
|
||||||
|
-cpu host,+sgx-provisionkey \\
|
||||||
|
-object memory-backend-ram,size=2G,host-nodes=0,policy=bind,id=node0 \\
|
||||||
|
-object memory-backend-epc,id=mem0,size=64M,prealloc=on,host-nodes=0,policy=bind \\
|
||||||
|
-numa node,nodeid=0,cpus=0-1,memdev=node0 \\
|
||||||
|
-object memory-backend-ram,size=2G,host-nodes=1,policy=bind,id=node1 \\
|
||||||
|
-object memory-backend-epc,id=mem1,size=28M,prealloc=on,host-nodes=1,policy=bind \\
|
||||||
|
-numa node,nodeid=1,cpus=2-3,memdev=node1 \\
|
||||||
|
-M sgx-epc.0.memdev=mem0,sgx-epc.0.node=0,sgx-epc.1.memdev=mem1,sgx-epc.1.node=1
|
||||||
|
|
||||||
|
and SGX epc numa info by::
|
||||||
|
|
||||||
|
$ dmesg | grep sgx
|
||||||
|
[ 0.369937] sgx: EPC section 0x180000000-0x183ffffff
|
||||||
|
[ 0.370259] sgx: EPC section 0x184000000-0x185bfffff
|
||||||
|
|
||||||
|
$ dmesg | grep SRAT
|
||||||
|
[ 0.009981] ACPI: SRAT: Node 0 PXM 0 [mem 0x180000000-0x183ffffff]
|
||||||
|
[ 0.009982] ACPI: SRAT: Node 1 PXM 1 [mem 0x184000000-0x185bfffff]
|
||||||
|
|
||||||
References
|
References
|
||||||
----------
|
----------
|
||||||
|
83
gdbstub.c
83
gdbstub.c
@ -368,27 +368,10 @@ typedef struct GDBState {
|
|||||||
gdb_syscall_complete_cb current_syscall_cb;
|
gdb_syscall_complete_cb current_syscall_cb;
|
||||||
GString *str_buf;
|
GString *str_buf;
|
||||||
GByteArray *mem_buf;
|
GByteArray *mem_buf;
|
||||||
|
int sstep_flags;
|
||||||
|
int supported_sstep_flags;
|
||||||
} GDBState;
|
} GDBState;
|
||||||
|
|
||||||
/* By default use no IRQs and no timers while single stepping so as to
|
|
||||||
* make single stepping like an ICE HW step.
|
|
||||||
*/
|
|
||||||
static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;
|
|
||||||
|
|
||||||
/* Retrieves flags for single step mode. */
|
|
||||||
static int get_sstep_flags(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* In replay mode all events written into the log should be replayed.
|
|
||||||
* That is why NOIRQ flag is removed in this mode.
|
|
||||||
*/
|
|
||||||
if (replay_mode != REPLAY_MODE_NONE) {
|
|
||||||
return SSTEP_ENABLE;
|
|
||||||
} else {
|
|
||||||
return sstep_flags;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GDBState gdbserver_state;
|
static GDBState gdbserver_state;
|
||||||
|
|
||||||
static void init_gdbserver_state(void)
|
static void init_gdbserver_state(void)
|
||||||
@ -399,6 +382,29 @@ static void init_gdbserver_state(void)
|
|||||||
gdbserver_state.str_buf = g_string_new(NULL);
|
gdbserver_state.str_buf = g_string_new(NULL);
|
||||||
gdbserver_state.mem_buf = g_byte_array_sized_new(MAX_PACKET_LENGTH);
|
gdbserver_state.mem_buf = g_byte_array_sized_new(MAX_PACKET_LENGTH);
|
||||||
gdbserver_state.last_packet = g_byte_array_sized_new(MAX_PACKET_LENGTH + 4);
|
gdbserver_state.last_packet = g_byte_array_sized_new(MAX_PACKET_LENGTH + 4);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In replay mode all events will come from the log and can't be
|
||||||
|
* suppressed otherwise we would break determinism. However as those
|
||||||
|
* events are tied to the number of executed instructions we won't see
|
||||||
|
* them occurring every time we single step.
|
||||||
|
*/
|
||||||
|
if (replay_mode != REPLAY_MODE_NONE) {
|
||||||
|
gdbserver_state.supported_sstep_flags = SSTEP_ENABLE;
|
||||||
|
} else if (kvm_enabled()) {
|
||||||
|
gdbserver_state.supported_sstep_flags = kvm_get_supported_sstep_flags();
|
||||||
|
} else {
|
||||||
|
gdbserver_state.supported_sstep_flags =
|
||||||
|
SSTEP_ENABLE | SSTEP_NOIRQ | SSTEP_NOTIMER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* By default use no IRQs and no timers while single stepping so as to
|
||||||
|
* make single stepping like an ICE HW step.
|
||||||
|
*/
|
||||||
|
gdbserver_state.sstep_flags = SSTEP_ENABLE | SSTEP_NOIRQ | SSTEP_NOTIMER;
|
||||||
|
gdbserver_state.sstep_flags &= gdbserver_state.supported_sstep_flags;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
@ -505,7 +511,7 @@ static int gdb_continue_partial(char *newstates)
|
|||||||
CPU_FOREACH(cpu) {
|
CPU_FOREACH(cpu) {
|
||||||
if (newstates[cpu->cpu_index] == 's') {
|
if (newstates[cpu->cpu_index] == 's') {
|
||||||
trace_gdbstub_op_stepping(cpu->cpu_index);
|
trace_gdbstub_op_stepping(cpu->cpu_index);
|
||||||
cpu_single_step(cpu, sstep_flags);
|
cpu_single_step(cpu, gdbserver_state.sstep_flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gdbserver_state.running_state = 1;
|
gdbserver_state.running_state = 1;
|
||||||
@ -524,7 +530,7 @@ static int gdb_continue_partial(char *newstates)
|
|||||||
break; /* nothing to do here */
|
break; /* nothing to do here */
|
||||||
case 's':
|
case 's':
|
||||||
trace_gdbstub_op_stepping(cpu->cpu_index);
|
trace_gdbstub_op_stepping(cpu->cpu_index);
|
||||||
cpu_single_step(cpu, get_sstep_flags());
|
cpu_single_step(cpu, gdbserver_state.sstep_flags);
|
||||||
cpu_resume(cpu);
|
cpu_resume(cpu);
|
||||||
flag = 1;
|
flag = 1;
|
||||||
break;
|
break;
|
||||||
@ -1883,7 +1889,7 @@ static void handle_step(GArray *params, void *user_ctx)
|
|||||||
gdb_set_cpu_pc((target_ulong)get_param(params, 0)->val_ull);
|
gdb_set_cpu_pc((target_ulong)get_param(params, 0)->val_ull);
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu_single_step(gdbserver_state.c_cpu, get_sstep_flags());
|
cpu_single_step(gdbserver_state.c_cpu, gdbserver_state.sstep_flags);
|
||||||
gdb_continue();
|
gdb_continue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2017,24 +2023,44 @@ static void handle_v_commands(GArray *params, void *user_ctx)
|
|||||||
|
|
||||||
static void handle_query_qemu_sstepbits(GArray *params, void *user_ctx)
|
static void handle_query_qemu_sstepbits(GArray *params, void *user_ctx)
|
||||||
{
|
{
|
||||||
g_string_printf(gdbserver_state.str_buf, "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
|
g_string_printf(gdbserver_state.str_buf, "ENABLE=%x", SSTEP_ENABLE);
|
||||||
SSTEP_ENABLE, SSTEP_NOIRQ, SSTEP_NOTIMER);
|
|
||||||
|
if (gdbserver_state.supported_sstep_flags & SSTEP_NOIRQ) {
|
||||||
|
g_string_append_printf(gdbserver_state.str_buf, ",NOIRQ=%x",
|
||||||
|
SSTEP_NOIRQ);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gdbserver_state.supported_sstep_flags & SSTEP_NOTIMER) {
|
||||||
|
g_string_append_printf(gdbserver_state.str_buf, ",NOTIMER=%x",
|
||||||
|
SSTEP_NOTIMER);
|
||||||
|
}
|
||||||
|
|
||||||
put_strbuf();
|
put_strbuf();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_set_qemu_sstep(GArray *params, void *user_ctx)
|
static void handle_set_qemu_sstep(GArray *params, void *user_ctx)
|
||||||
{
|
{
|
||||||
|
int new_sstep_flags;
|
||||||
|
|
||||||
if (!params->len) {
|
if (!params->len) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sstep_flags = get_param(params, 0)->val_ul;
|
new_sstep_flags = get_param(params, 0)->val_ul;
|
||||||
|
|
||||||
|
if (new_sstep_flags & ~gdbserver_state.supported_sstep_flags) {
|
||||||
|
put_packet("E22");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdbserver_state.sstep_flags = new_sstep_flags;
|
||||||
put_packet("OK");
|
put_packet("OK");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_query_qemu_sstep(GArray *params, void *user_ctx)
|
static void handle_query_qemu_sstep(GArray *params, void *user_ctx)
|
||||||
{
|
{
|
||||||
g_string_printf(gdbserver_state.str_buf, "0x%x", sstep_flags);
|
g_string_printf(gdbserver_state.str_buf, "0x%x",
|
||||||
|
gdbserver_state.sstep_flags);
|
||||||
put_strbuf();
|
put_strbuf();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3497,6 +3523,11 @@ int gdbserver_start(const char *device)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kvm_enabled() && !kvm_supports_guest_debug()) {
|
||||||
|
error_report("gdbstub: KVM doesn't support guest debugging");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!device)
|
if (!device)
|
||||||
return -1;
|
return -1;
|
||||||
if (strcmp(device, "none") != 0) {
|
if (strcmp(device, "none") != 0) {
|
||||||
|
@ -784,9 +784,8 @@ static void numa_stat_memory_devices(NumaNodeMem node_mem[])
|
|||||||
break;
|
break;
|
||||||
case MEMORY_DEVICE_INFO_KIND_SGX_EPC:
|
case MEMORY_DEVICE_INFO_KIND_SGX_EPC:
|
||||||
se = value->u.sgx_epc.data;
|
se = value->u.sgx_epc.data;
|
||||||
/* TODO: once we support numa, assign to right node */
|
node_mem[se->node].node_mem += se->size;
|
||||||
node_mem[0].node_mem += se->size;
|
node_mem[se->node].node_plugged_mem = 0;
|
||||||
node_mem[0].node_plugged_mem += se->size;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
|
@ -2068,6 +2068,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
|
|||||||
nvdimm_build_srat(table_data);
|
nvdimm_build_srat(table_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sgx_epc_build_srat(table_data);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: this part is not in ACPI spec and current linux kernel boots fine
|
* TODO: this part is not in ACPI spec and current linux kernel boots fine
|
||||||
* without these entries. But I recall there were issues the last time I
|
* without these entries. But I recall there were issues the last time I
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
static Property sgx_epc_properties[] = {
|
static Property sgx_epc_properties[] = {
|
||||||
DEFINE_PROP_UINT64(SGX_EPC_ADDR_PROP, SGXEPCDevice, addr, 0),
|
DEFINE_PROP_UINT64(SGX_EPC_ADDR_PROP, SGXEPCDevice, addr, 0),
|
||||||
|
DEFINE_PROP_UINT32(SGX_EPC_NUMA_NODE_PROP, SGXEPCDevice, node, 0),
|
||||||
DEFINE_PROP_LINK(SGX_EPC_MEMDEV_PROP, SGXEPCDevice, hostmem,
|
DEFINE_PROP_LINK(SGX_EPC_MEMDEV_PROP, SGXEPCDevice, hostmem,
|
||||||
TYPE_MEMORY_BACKEND_EPC, HostMemoryBackendEpc *),
|
TYPE_MEMORY_BACKEND_EPC, HostMemoryBackendEpc *),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
@ -139,6 +140,8 @@ static void sgx_epc_md_fill_device_info(const MemoryDeviceState *md,
|
|||||||
se->memaddr = epc->addr;
|
se->memaddr = epc->addr;
|
||||||
se->size = object_property_get_uint(OBJECT(epc), SGX_EPC_SIZE_PROP,
|
se->size = object_property_get_uint(OBJECT(epc), SGX_EPC_SIZE_PROP,
|
||||||
NULL);
|
NULL);
|
||||||
|
se->node = object_property_get_uint(OBJECT(epc), SGX_EPC_NUMA_NODE_PROP,
|
||||||
|
NULL);
|
||||||
se->memdev = object_get_canonical_path(OBJECT(epc->hostmem));
|
se->memdev = object_get_canonical_path(OBJECT(epc->hostmem));
|
||||||
|
|
||||||
info->u.sgx_epc.data = se;
|
info->u.sgx_epc.data = se;
|
||||||
|
@ -6,6 +6,10 @@
|
|||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qapi/qapi-commands-misc-target.h"
|
#include "qapi/qapi-commands-misc-target.h"
|
||||||
|
|
||||||
|
void sgx_epc_build_srat(GArray *table_data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
SGXInfo *qmp_query_sgx(Error **errp)
|
SGXInfo *qmp_query_sgx(Error **errp)
|
||||||
{
|
{
|
||||||
error_setg(errp, "SGX support is not compiled in");
|
error_setg(errp, "SGX support is not compiled in");
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "sysemu/hw_accel.h"
|
#include "sysemu/hw_accel.h"
|
||||||
#include "sysemu/reset.h"
|
#include "sysemu/reset.h"
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include "hw/acpi/aml-build.h"
|
||||||
|
|
||||||
#define SGX_MAX_EPC_SECTIONS 8
|
#define SGX_MAX_EPC_SECTIONS 8
|
||||||
#define SGX_CPUID_EPC_INVALID 0x0
|
#define SGX_CPUID_EPC_INVALID 0x0
|
||||||
@ -36,17 +37,59 @@
|
|||||||
|
|
||||||
#define RETRY_NUM 2
|
#define RETRY_NUM 2
|
||||||
|
|
||||||
|
static int sgx_epc_device_list(Object *obj, void *opaque)
|
||||||
|
{
|
||||||
|
GSList **list = opaque;
|
||||||
|
|
||||||
|
if (object_dynamic_cast(obj, TYPE_SGX_EPC)) {
|
||||||
|
*list = g_slist_append(*list, DEVICE(obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
object_child_foreach(obj, sgx_epc_device_list, opaque);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GSList *sgx_epc_get_device_list(void)
|
||||||
|
{
|
||||||
|
GSList *list = NULL;
|
||||||
|
|
||||||
|
object_child_foreach(qdev_get_machine(), sgx_epc_device_list, &list);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sgx_epc_build_srat(GArray *table_data)
|
||||||
|
{
|
||||||
|
GSList *device_list = sgx_epc_get_device_list();
|
||||||
|
|
||||||
|
for (; device_list; device_list = device_list->next) {
|
||||||
|
DeviceState *dev = device_list->data;
|
||||||
|
Object *obj = OBJECT(dev);
|
||||||
|
uint64_t addr, size;
|
||||||
|
int node;
|
||||||
|
|
||||||
|
node = object_property_get_uint(obj, SGX_EPC_NUMA_NODE_PROP,
|
||||||
|
&error_abort);
|
||||||
|
addr = object_property_get_uint(obj, SGX_EPC_ADDR_PROP, &error_abort);
|
||||||
|
size = object_property_get_uint(obj, SGX_EPC_SIZE_PROP, &error_abort);
|
||||||
|
|
||||||
|
build_srat_memory(table_data, addr, size, node, MEM_AFFINITY_ENABLED);
|
||||||
|
}
|
||||||
|
g_slist_free(device_list);
|
||||||
|
}
|
||||||
|
|
||||||
static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
|
static uint64_t sgx_calc_section_metric(uint64_t low, uint64_t high)
|
||||||
{
|
{
|
||||||
return (low & MAKE_64BIT_MASK(12, 20)) +
|
return (low & MAKE_64BIT_MASK(12, 20)) +
|
||||||
((high & MAKE_64BIT_MASK(0, 20)) << 32);
|
((high & MAKE_64BIT_MASK(0, 20)) << 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t sgx_calc_host_epc_section_size(void)
|
static SGXEPCSectionList *sgx_calc_host_epc_sections(void)
|
||||||
{
|
{
|
||||||
|
SGXEPCSectionList *head = NULL, **tail = &head;
|
||||||
|
SGXEPCSection *section;
|
||||||
uint32_t i, type;
|
uint32_t i, type;
|
||||||
uint32_t eax, ebx, ecx, edx;
|
uint32_t eax, ebx, ecx, edx;
|
||||||
uint64_t size = 0;
|
uint32_t j = 0;
|
||||||
|
|
||||||
for (i = 0; i < SGX_MAX_EPC_SECTIONS; i++) {
|
for (i = 0; i < SGX_MAX_EPC_SECTIONS; i++) {
|
||||||
host_cpuid(0x12, i + 2, &eax, &ebx, &ecx, &edx);
|
host_cpuid(0x12, i + 2, &eax, &ebx, &ecx, &edx);
|
||||||
@ -60,10 +103,13 @@ static uint64_t sgx_calc_host_epc_section_size(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
size += sgx_calc_section_metric(ecx, edx);
|
section = g_new0(SGXEPCSection, 1);
|
||||||
|
section->node = j++;
|
||||||
|
section->size = sgx_calc_section_metric(ecx, edx);
|
||||||
|
QAPI_LIST_APPEND(tail, section);
|
||||||
}
|
}
|
||||||
|
|
||||||
return size;
|
return head;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sgx_epc_reset(void *opaque)
|
static void sgx_epc_reset(void *opaque)
|
||||||
@ -127,13 +173,35 @@ SGXInfo *qmp_query_sgx_capabilities(Error **errp)
|
|||||||
info->sgx1 = eax & (1U << 0) ? true : false;
|
info->sgx1 = eax & (1U << 0) ? true : false;
|
||||||
info->sgx2 = eax & (1U << 1) ? true : false;
|
info->sgx2 = eax & (1U << 1) ? true : false;
|
||||||
|
|
||||||
info->section_size = sgx_calc_host_epc_section_size();
|
info->sections = sgx_calc_host_epc_sections();
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SGXEPCSectionList *sgx_get_epc_sections_list(void)
|
||||||
|
{
|
||||||
|
GSList *device_list = sgx_epc_get_device_list();
|
||||||
|
SGXEPCSectionList *head = NULL, **tail = &head;
|
||||||
|
SGXEPCSection *section;
|
||||||
|
|
||||||
|
for (; device_list; device_list = device_list->next) {
|
||||||
|
DeviceState *dev = device_list->data;
|
||||||
|
Object *obj = OBJECT(dev);
|
||||||
|
|
||||||
|
section = g_new0(SGXEPCSection, 1);
|
||||||
|
section->node = object_property_get_uint(obj, SGX_EPC_NUMA_NODE_PROP,
|
||||||
|
&error_abort);
|
||||||
|
section->size = object_property_get_uint(obj, SGX_EPC_SIZE_PROP,
|
||||||
|
&error_abort);
|
||||||
|
QAPI_LIST_APPEND(tail, section);
|
||||||
|
}
|
||||||
|
g_slist_free(device_list);
|
||||||
|
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
SGXInfo *qmp_query_sgx(Error **errp)
|
SGXInfo *qmp_query_sgx(Error **errp)
|
||||||
{
|
{
|
||||||
SGXInfo *info = NULL;
|
SGXInfo *info = NULL;
|
||||||
@ -152,14 +220,13 @@ SGXInfo *qmp_query_sgx(Error **errp)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SGXEPCState *sgx_epc = &pcms->sgx_epc;
|
|
||||||
info = g_new0(SGXInfo, 1);
|
info = g_new0(SGXInfo, 1);
|
||||||
|
|
||||||
info->sgx = true;
|
info->sgx = true;
|
||||||
info->sgx1 = true;
|
info->sgx1 = true;
|
||||||
info->sgx2 = true;
|
info->sgx2 = true;
|
||||||
info->flc = true;
|
info->flc = true;
|
||||||
info->section_size = sgx_epc->size;
|
info->sections = sgx_get_epc_sections_list();
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
@ -167,6 +234,7 @@ SGXInfo *qmp_query_sgx(Error **errp)
|
|||||||
void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
SGXEPCSectionList *section_list, *section;
|
||||||
g_autoptr(SGXInfo) info = qmp_query_sgx(&err);
|
g_autoptr(SGXInfo) info = qmp_query_sgx(&err);
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -181,8 +249,14 @@ void hmp_info_sgx(Monitor *mon, const QDict *qdict)
|
|||||||
info->sgx2 ? "enabled" : "disabled");
|
info->sgx2 ? "enabled" : "disabled");
|
||||||
monitor_printf(mon, "FLC support: %s\n",
|
monitor_printf(mon, "FLC support: %s\n",
|
||||||
info->flc ? "enabled" : "disabled");
|
info->flc ? "enabled" : "disabled");
|
||||||
monitor_printf(mon, "size: %" PRIu64 "\n",
|
|
||||||
info->section_size);
|
section_list = info->sections;
|
||||||
|
for (section = section_list; section; section = section->next) {
|
||||||
|
monitor_printf(mon, "NUMA node #%" PRId64 ": ",
|
||||||
|
section->value->node);
|
||||||
|
monitor_printf(mon, "size=%" PRIu64 "\n",
|
||||||
|
section->value->size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size)
|
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size)
|
||||||
@ -226,6 +300,9 @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
|
|||||||
/* set the memdev link with memory backend */
|
/* set the memdev link with memory backend */
|
||||||
object_property_parse(obj, SGX_EPC_MEMDEV_PROP, list->value->memdev,
|
object_property_parse(obj, SGX_EPC_MEMDEV_PROP, list->value->memdev,
|
||||||
&error_fatal);
|
&error_fatal);
|
||||||
|
/* set the numa node property for sgx epc object */
|
||||||
|
object_property_set_uint(obj, SGX_EPC_NUMA_NODE_PROP, list->value->node,
|
||||||
|
&error_fatal);
|
||||||
object_property_set_bool(obj, "realized", true, &error_fatal);
|
object_property_set_bool(obj, "realized", true, &error_fatal);
|
||||||
object_unref(obj);
|
object_unref(obj);
|
||||||
}
|
}
|
||||||
|
@ -621,8 +621,7 @@ static void lsi_do_dma(LSIState *s, int out)
|
|||||||
dma_addr_t addr;
|
dma_addr_t addr;
|
||||||
SCSIDevice *dev;
|
SCSIDevice *dev;
|
||||||
|
|
||||||
assert(s->current);
|
if (!s->current || !s->current->dma_len) {
|
||||||
if (!s->current->dma_len) {
|
|
||||||
/* Wait until data is available. */
|
/* Wait until data is available. */
|
||||||
trace_lsi_do_dma_unavailable();
|
trace_lsi_do_dma_unavailable();
|
||||||
return;
|
return;
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#define SGX_EPC_ADDR_PROP "addr"
|
#define SGX_EPC_ADDR_PROP "addr"
|
||||||
#define SGX_EPC_SIZE_PROP "size"
|
#define SGX_EPC_SIZE_PROP "size"
|
||||||
#define SGX_EPC_MEMDEV_PROP "memdev"
|
#define SGX_EPC_MEMDEV_PROP "memdev"
|
||||||
|
#define SGX_EPC_NUMA_NODE_PROP "node"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SGXEPCDevice:
|
* SGXEPCDevice:
|
||||||
@ -38,6 +39,7 @@ typedef struct SGXEPCDevice {
|
|||||||
|
|
||||||
/* public */
|
/* public */
|
||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
|
uint32_t node;
|
||||||
HostMemoryBackendEpc *hostmem;
|
HostMemoryBackendEpc *hostmem;
|
||||||
} SGXEPCDevice;
|
} SGXEPCDevice;
|
||||||
|
|
||||||
@ -56,6 +58,7 @@ typedef struct SGXEPCState {
|
|||||||
} SGXEPCState;
|
} SGXEPCState;
|
||||||
|
|
||||||
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size);
|
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size);
|
||||||
|
void sgx_epc_build_srat(GArray *table_data);
|
||||||
|
|
||||||
static inline uint64_t sgx_epc_above_4g_end(SGXEPCState *sgx_epc)
|
static inline uint64_t sgx_epc_above_4g_end(SGXEPCState *sgx_epc)
|
||||||
{
|
{
|
||||||
|
@ -24,7 +24,6 @@ virtio_gpu_ctrl_hdr_bswap(struct virtio_gpu_ctrl_hdr *hdr)
|
|||||||
le32_to_cpus(&hdr->flags);
|
le32_to_cpus(&hdr->flags);
|
||||||
le64_to_cpus(&hdr->fence_id);
|
le64_to_cpus(&hdr->fence_id);
|
||||||
le32_to_cpus(&hdr->ctx_id);
|
le32_to_cpus(&hdr->ctx_id);
|
||||||
le32_to_cpus(&hdr->padding);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -103,6 +103,12 @@ extern "C" {
|
|||||||
/* 8 bpp Red */
|
/* 8 bpp Red */
|
||||||
#define DRM_FORMAT_R8 fourcc_code('R', '8', ' ', ' ') /* [7:0] R */
|
#define DRM_FORMAT_R8 fourcc_code('R', '8', ' ', ' ') /* [7:0] R */
|
||||||
|
|
||||||
|
/* 10 bpp Red */
|
||||||
|
#define DRM_FORMAT_R10 fourcc_code('R', '1', '0', ' ') /* [15:0] x:R 6:10 little endian */
|
||||||
|
|
||||||
|
/* 12 bpp Red */
|
||||||
|
#define DRM_FORMAT_R12 fourcc_code('R', '1', '2', ' ') /* [15:0] x:R 4:12 little endian */
|
||||||
|
|
||||||
/* 16 bpp Red */
|
/* 16 bpp Red */
|
||||||
#define DRM_FORMAT_R16 fourcc_code('R', '1', '6', ' ') /* [15:0] R little endian */
|
#define DRM_FORMAT_R16 fourcc_code('R', '1', '6', ' ') /* [15:0] R little endian */
|
||||||
|
|
||||||
@ -372,6 +378,12 @@ extern "C" {
|
|||||||
|
|
||||||
#define DRM_FORMAT_RESERVED ((1ULL << 56) - 1)
|
#define DRM_FORMAT_RESERVED ((1ULL << 56) - 1)
|
||||||
|
|
||||||
|
#define fourcc_mod_get_vendor(modifier) \
|
||||||
|
(((modifier) >> 56) & 0xff)
|
||||||
|
|
||||||
|
#define fourcc_mod_is_vendor(modifier, vendor) \
|
||||||
|
(fourcc_mod_get_vendor(modifier) == DRM_FORMAT_MOD_VENDOR_## vendor)
|
||||||
|
|
||||||
#define fourcc_mod_code(vendor, val) \
|
#define fourcc_mod_code(vendor, val) \
|
||||||
((((uint64_t)DRM_FORMAT_MOD_VENDOR_## vendor) << 56) | ((val) & 0x00ffffffffffffffULL))
|
((((uint64_t)DRM_FORMAT_MOD_VENDOR_## vendor) << 56) | ((val) & 0x00ffffffffffffffULL))
|
||||||
|
|
||||||
@ -899,9 +911,9 @@ drm_fourcc_canonicalize_nvidia_format_mod(uint64_t modifier)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* The top 4 bits (out of the 56 bits alloted for specifying vendor specific
|
* The top 4 bits (out of the 56 bits alloted for specifying vendor specific
|
||||||
* modifiers) denote the category for modifiers. Currently we have only two
|
* modifiers) denote the category for modifiers. Currently we have three
|
||||||
* categories of modifiers ie AFBC and MISC. We can have a maximum of sixteen
|
* categories of modifiers ie AFBC, MISC and AFRC. We can have a maximum of
|
||||||
* different categories.
|
* sixteen different categories.
|
||||||
*/
|
*/
|
||||||
#define DRM_FORMAT_MOD_ARM_CODE(__type, __val) \
|
#define DRM_FORMAT_MOD_ARM_CODE(__type, __val) \
|
||||||
fourcc_mod_code(ARM, ((uint64_t)(__type) << 52) | ((__val) & 0x000fffffffffffffULL))
|
fourcc_mod_code(ARM, ((uint64_t)(__type) << 52) | ((__val) & 0x000fffffffffffffULL))
|
||||||
@ -1016,6 +1028,109 @@ drm_fourcc_canonicalize_nvidia_format_mod(uint64_t modifier)
|
|||||||
*/
|
*/
|
||||||
#define AFBC_FORMAT_MOD_USM (1ULL << 12)
|
#define AFBC_FORMAT_MOD_USM (1ULL << 12)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Fixed-Rate Compression (AFRC) modifiers
|
||||||
|
*
|
||||||
|
* AFRC is a proprietary fixed rate image compression protocol and format,
|
||||||
|
* designed to provide guaranteed bandwidth and memory footprint
|
||||||
|
* reductions in graphics and media use-cases.
|
||||||
|
*
|
||||||
|
* AFRC buffers consist of one or more planes, with the same components
|
||||||
|
* and meaning as an uncompressed buffer using the same pixel format.
|
||||||
|
*
|
||||||
|
* Within each plane, the pixel/luma/chroma values are grouped into
|
||||||
|
* "coding unit" blocks which are individually compressed to a
|
||||||
|
* fixed size (in bytes). All coding units within a given plane of a buffer
|
||||||
|
* store the same number of values, and have the same compressed size.
|
||||||
|
*
|
||||||
|
* The coding unit size is configurable, allowing different rates of compression.
|
||||||
|
*
|
||||||
|
* The start of each AFRC buffer plane must be aligned to an alignment granule which
|
||||||
|
* depends on the coding unit size.
|
||||||
|
*
|
||||||
|
* Coding Unit Size Plane Alignment
|
||||||
|
* ---------------- ---------------
|
||||||
|
* 16 bytes 1024 bytes
|
||||||
|
* 24 bytes 512 bytes
|
||||||
|
* 32 bytes 2048 bytes
|
||||||
|
*
|
||||||
|
* Coding units are grouped into paging tiles. AFRC buffer dimensions must be aligned
|
||||||
|
* to a multiple of the paging tile dimensions.
|
||||||
|
* The dimensions of each paging tile depend on whether the buffer is optimised for
|
||||||
|
* scanline (SCAN layout) or rotated (ROT layout) access.
|
||||||
|
*
|
||||||
|
* Layout Paging Tile Width Paging Tile Height
|
||||||
|
* ------ ----------------- ------------------
|
||||||
|
* SCAN 16 coding units 4 coding units
|
||||||
|
* ROT 8 coding units 8 coding units
|
||||||
|
*
|
||||||
|
* The dimensions of each coding unit depend on the number of components
|
||||||
|
* in the compressed plane and whether the buffer is optimised for
|
||||||
|
* scanline (SCAN layout) or rotated (ROT layout) access.
|
||||||
|
*
|
||||||
|
* Number of Components in Plane Layout Coding Unit Width Coding Unit Height
|
||||||
|
* ----------------------------- --------- ----------------- ------------------
|
||||||
|
* 1 SCAN 16 samples 4 samples
|
||||||
|
* Example: 16x4 luma samples in a 'Y' plane
|
||||||
|
* 16x4 chroma 'V' values, in the 'V' plane of a fully-planar YUV buffer
|
||||||
|
* ----------------------------- --------- ----------------- ------------------
|
||||||
|
* 1 ROT 8 samples 8 samples
|
||||||
|
* Example: 8x8 luma samples in a 'Y' plane
|
||||||
|
* 8x8 chroma 'V' values, in the 'V' plane of a fully-planar YUV buffer
|
||||||
|
* ----------------------------- --------- ----------------- ------------------
|
||||||
|
* 2 DONT CARE 8 samples 4 samples
|
||||||
|
* Example: 8x4 chroma pairs in the 'UV' plane of a semi-planar YUV buffer
|
||||||
|
* ----------------------------- --------- ----------------- ------------------
|
||||||
|
* 3 DONT CARE 4 samples 4 samples
|
||||||
|
* Example: 4x4 pixels in an RGB buffer without alpha
|
||||||
|
* ----------------------------- --------- ----------------- ------------------
|
||||||
|
* 4 DONT CARE 4 samples 4 samples
|
||||||
|
* Example: 4x4 pixels in an RGB buffer with alpha
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DRM_FORMAT_MOD_ARM_TYPE_AFRC 0x02
|
||||||
|
|
||||||
|
#define DRM_FORMAT_MOD_ARM_AFRC(__afrc_mode) \
|
||||||
|
DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_AFRC, __afrc_mode)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AFRC coding unit size modifier.
|
||||||
|
*
|
||||||
|
* Indicates the number of bytes used to store each compressed coding unit for
|
||||||
|
* one or more planes in an AFRC encoded buffer. The coding unit size for chrominance
|
||||||
|
* is the same for both Cb and Cr, which may be stored in separate planes.
|
||||||
|
*
|
||||||
|
* AFRC_FORMAT_MOD_CU_SIZE_P0 indicates the number of bytes used to store
|
||||||
|
* each compressed coding unit in the first plane of the buffer. For RGBA buffers
|
||||||
|
* this is the only plane, while for semi-planar and fully-planar YUV buffers,
|
||||||
|
* this corresponds to the luma plane.
|
||||||
|
*
|
||||||
|
* AFRC_FORMAT_MOD_CU_SIZE_P12 indicates the number of bytes used to store
|
||||||
|
* each compressed coding unit in the second and third planes in the buffer.
|
||||||
|
* For semi-planar and fully-planar YUV buffers, this corresponds to the chroma plane(s).
|
||||||
|
*
|
||||||
|
* For single-plane buffers, AFRC_FORMAT_MOD_CU_SIZE_P0 must be specified
|
||||||
|
* and AFRC_FORMAT_MOD_CU_SIZE_P12 must be zero.
|
||||||
|
* For semi-planar and fully-planar buffers, both AFRC_FORMAT_MOD_CU_SIZE_P0 and
|
||||||
|
* AFRC_FORMAT_MOD_CU_SIZE_P12 must be specified.
|
||||||
|
*/
|
||||||
|
#define AFRC_FORMAT_MOD_CU_SIZE_MASK 0xf
|
||||||
|
#define AFRC_FORMAT_MOD_CU_SIZE_16 (1ULL)
|
||||||
|
#define AFRC_FORMAT_MOD_CU_SIZE_24 (2ULL)
|
||||||
|
#define AFRC_FORMAT_MOD_CU_SIZE_32 (3ULL)
|
||||||
|
|
||||||
|
#define AFRC_FORMAT_MOD_CU_SIZE_P0(__afrc_cu_size) (__afrc_cu_size)
|
||||||
|
#define AFRC_FORMAT_MOD_CU_SIZE_P12(__afrc_cu_size) ((__afrc_cu_size) << 4)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AFRC scanline memory layout.
|
||||||
|
*
|
||||||
|
* Indicates if the buffer uses the scanline-optimised layout
|
||||||
|
* for an AFRC encoded buffer, otherwise, it uses the rotation-optimised layout.
|
||||||
|
* The memory layout is the same for all planes.
|
||||||
|
*/
|
||||||
|
#define AFRC_FORMAT_MOD_LAYOUT_SCAN (1ULL << 8)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Arm 16x16 Block U-Interleaved modifier
|
* Arm 16x16 Block U-Interleaved modifier
|
||||||
*
|
*
|
||||||
|
@ -603,6 +603,7 @@ enum ethtool_link_ext_state {
|
|||||||
ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE,
|
ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE,
|
||||||
ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED,
|
ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED,
|
||||||
ETHTOOL_LINK_EXT_STATE_OVERHEAT,
|
ETHTOOL_LINK_EXT_STATE_OVERHEAT,
|
||||||
|
ETHTOOL_LINK_EXT_STATE_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* More information in addition to ETHTOOL_LINK_EXT_STATE_AUTONEG. */
|
/* More information in addition to ETHTOOL_LINK_EXT_STATE_AUTONEG. */
|
||||||
@ -639,6 +640,8 @@ enum ethtool_link_ext_substate_link_logical_mismatch {
|
|||||||
enum ethtool_link_ext_substate_bad_signal_integrity {
|
enum ethtool_link_ext_substate_bad_signal_integrity {
|
||||||
ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1,
|
ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1,
|
||||||
ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE,
|
ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE,
|
||||||
|
ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST,
|
||||||
|
ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* More information in addition to ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE. */
|
/* More information in addition to ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE. */
|
||||||
@ -647,6 +650,11 @@ enum ethtool_link_ext_substate_cable_issue {
|
|||||||
ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE,
|
ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* More information in addition to ETHTOOL_LINK_EXT_STATE_MODULE. */
|
||||||
|
enum ethtool_link_ext_substate_module {
|
||||||
|
ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY = 1,
|
||||||
|
};
|
||||||
|
|
||||||
#define ETH_GSTRING_LEN 32
|
#define ETH_GSTRING_LEN 32
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -704,6 +712,29 @@ enum ethtool_stringset {
|
|||||||
ETH_SS_COUNT
|
ETH_SS_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum ethtool_module_power_mode_policy - plug-in module power mode policy
|
||||||
|
* @ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH: Module is always in high power mode.
|
||||||
|
* @ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO: Module is transitioned by the host
|
||||||
|
* to high power mode when the first port using it is put administratively
|
||||||
|
* up and to low power mode when the last port using it is put
|
||||||
|
* administratively down.
|
||||||
|
*/
|
||||||
|
enum ethtool_module_power_mode_policy {
|
||||||
|
ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH = 1,
|
||||||
|
ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum ethtool_module_power_mode - plug-in module power mode
|
||||||
|
* @ETHTOOL_MODULE_POWER_MODE_LOW: Module is in low power mode.
|
||||||
|
* @ETHTOOL_MODULE_POWER_MODE_HIGH: Module is in high power mode.
|
||||||
|
*/
|
||||||
|
enum ethtool_module_power_mode {
|
||||||
|
ETHTOOL_MODULE_POWER_MODE_LOW = 1,
|
||||||
|
ETHTOOL_MODULE_POWER_MODE_HIGH,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct ethtool_gstrings - string set for data tagging
|
* struct ethtool_gstrings - string set for data tagging
|
||||||
* @cmd: Command number = %ETHTOOL_GSTRINGS
|
* @cmd: Command number = %ETHTOOL_GSTRINGS
|
||||||
|
@ -181,6 +181,9 @@
|
|||||||
* - add FUSE_OPEN_KILL_SUIDGID
|
* - add FUSE_OPEN_KILL_SUIDGID
|
||||||
* - extend fuse_setxattr_in, add FUSE_SETXATTR_EXT
|
* - extend fuse_setxattr_in, add FUSE_SETXATTR_EXT
|
||||||
* - add FUSE_SETXATTR_ACL_KILL_SGID
|
* - add FUSE_SETXATTR_ACL_KILL_SGID
|
||||||
|
*
|
||||||
|
* 7.34
|
||||||
|
* - add FUSE_SYNCFS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LINUX_FUSE_H
|
#ifndef _LINUX_FUSE_H
|
||||||
@ -212,7 +215,7 @@
|
|||||||
#define FUSE_KERNEL_VERSION 7
|
#define FUSE_KERNEL_VERSION 7
|
||||||
|
|
||||||
/** Minor version number of this interface */
|
/** Minor version number of this interface */
|
||||||
#define FUSE_KERNEL_MINOR_VERSION 33
|
#define FUSE_KERNEL_MINOR_VERSION 34
|
||||||
|
|
||||||
/** The node ID of the root inode */
|
/** The node ID of the root inode */
|
||||||
#define FUSE_ROOT_ID 1
|
#define FUSE_ROOT_ID 1
|
||||||
@ -505,6 +508,7 @@ enum fuse_opcode {
|
|||||||
FUSE_COPY_FILE_RANGE = 47,
|
FUSE_COPY_FILE_RANGE = 47,
|
||||||
FUSE_SETUPMAPPING = 48,
|
FUSE_SETUPMAPPING = 48,
|
||||||
FUSE_REMOVEMAPPING = 49,
|
FUSE_REMOVEMAPPING = 49,
|
||||||
|
FUSE_SYNCFS = 50,
|
||||||
|
|
||||||
/* CUSE specific operations */
|
/* CUSE specific operations */
|
||||||
CUSE_INIT = 4096,
|
CUSE_INIT = 4096,
|
||||||
@ -967,4 +971,8 @@ struct fuse_removemapping_one {
|
|||||||
#define FUSE_REMOVEMAPPING_MAX_ENTRY \
|
#define FUSE_REMOVEMAPPING_MAX_ENTRY \
|
||||||
(PAGE_SIZE / sizeof(struct fuse_removemapping_one))
|
(PAGE_SIZE / sizeof(struct fuse_removemapping_one))
|
||||||
|
|
||||||
|
struct fuse_syncfs_in {
|
||||||
|
uint64_t padding;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* _LINUX_FUSE_H */
|
#endif /* _LINUX_FUSE_H */
|
||||||
|
@ -504,6 +504,12 @@
|
|||||||
#define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */
|
#define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */
|
||||||
#define PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */
|
#define PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */
|
||||||
#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */
|
#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */
|
||||||
|
#define PCI_EXP_DEVCTL_PAYLOAD_128B 0x0000 /* 128 Bytes */
|
||||||
|
#define PCI_EXP_DEVCTL_PAYLOAD_256B 0x0020 /* 256 Bytes */
|
||||||
|
#define PCI_EXP_DEVCTL_PAYLOAD_512B 0x0040 /* 512 Bytes */
|
||||||
|
#define PCI_EXP_DEVCTL_PAYLOAD_1024B 0x0060 /* 1024 Bytes */
|
||||||
|
#define PCI_EXP_DEVCTL_PAYLOAD_2048B 0x0080 /* 2048 Bytes */
|
||||||
|
#define PCI_EXP_DEVCTL_PAYLOAD_4096B 0x00a0 /* 4096 Bytes */
|
||||||
#define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */
|
#define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */
|
||||||
#define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */
|
#define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */
|
||||||
#define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */
|
#define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */
|
||||||
|
@ -59,6 +59,11 @@
|
|||||||
* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB
|
* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB
|
||||||
*/
|
*/
|
||||||
#define VIRTIO_GPU_F_RESOURCE_BLOB 3
|
#define VIRTIO_GPU_F_RESOURCE_BLOB 3
|
||||||
|
/*
|
||||||
|
* VIRTIO_GPU_CMD_CREATE_CONTEXT with
|
||||||
|
* context_init and multiple timelines
|
||||||
|
*/
|
||||||
|
#define VIRTIO_GPU_F_CONTEXT_INIT 4
|
||||||
|
|
||||||
enum virtio_gpu_ctrl_type {
|
enum virtio_gpu_ctrl_type {
|
||||||
VIRTIO_GPU_UNDEFINED = 0,
|
VIRTIO_GPU_UNDEFINED = 0,
|
||||||
@ -122,14 +127,20 @@ enum virtio_gpu_shm_id {
|
|||||||
VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1
|
VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
#define VIRTIO_GPU_FLAG_FENCE (1 << 0)
|
#define VIRTIO_GPU_FLAG_FENCE (1 << 0)
|
||||||
|
/*
|
||||||
|
* If the following flag is set, then ring_idx contains the index
|
||||||
|
* of the command ring that needs to used when creating the fence
|
||||||
|
*/
|
||||||
|
#define VIRTIO_GPU_FLAG_INFO_RING_IDX (1 << 1)
|
||||||
|
|
||||||
struct virtio_gpu_ctrl_hdr {
|
struct virtio_gpu_ctrl_hdr {
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
uint64_t fence_id;
|
uint64_t fence_id;
|
||||||
uint32_t ctx_id;
|
uint32_t ctx_id;
|
||||||
uint32_t padding;
|
uint8_t ring_idx;
|
||||||
|
uint8_t padding[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* data passed in the cursor vq */
|
/* data passed in the cursor vq */
|
||||||
@ -269,10 +280,11 @@ struct virtio_gpu_resource_create_3d {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* VIRTIO_GPU_CMD_CTX_CREATE */
|
/* VIRTIO_GPU_CMD_CTX_CREATE */
|
||||||
|
#define VIRTIO_GPU_CONTEXT_INIT_CAPSET_ID_MASK 0x000000ff
|
||||||
struct virtio_gpu_ctx_create {
|
struct virtio_gpu_ctx_create {
|
||||||
struct virtio_gpu_ctrl_hdr hdr;
|
struct virtio_gpu_ctrl_hdr hdr;
|
||||||
uint32_t nlen;
|
uint32_t nlen;
|
||||||
uint32_t padding;
|
uint32_t context_init;
|
||||||
char debug_name[64];
|
char debug_name[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -54,7 +54,31 @@
|
|||||||
#define VIRTIO_ID_SOUND 25 /* virtio sound */
|
#define VIRTIO_ID_SOUND 25 /* virtio sound */
|
||||||
#define VIRTIO_ID_FS 26 /* virtio filesystem */
|
#define VIRTIO_ID_FS 26 /* virtio filesystem */
|
||||||
#define VIRTIO_ID_PMEM 27 /* virtio pmem */
|
#define VIRTIO_ID_PMEM 27 /* virtio pmem */
|
||||||
|
#define VIRTIO_ID_RPMB 28 /* virtio rpmb */
|
||||||
#define VIRTIO_ID_MAC80211_HWSIM 29 /* virtio mac80211-hwsim */
|
#define VIRTIO_ID_MAC80211_HWSIM 29 /* virtio mac80211-hwsim */
|
||||||
|
#define VIRTIO_ID_VIDEO_ENCODER 30 /* virtio video encoder */
|
||||||
|
#define VIRTIO_ID_VIDEO_DECODER 31 /* virtio video decoder */
|
||||||
|
#define VIRTIO_ID_SCMI 32 /* virtio SCMI */
|
||||||
|
#define VIRTIO_ID_NITRO_SEC_MOD 33 /* virtio nitro secure module*/
|
||||||
|
#define VIRTIO_ID_I2C_ADAPTER 34 /* virtio i2c adapter */
|
||||||
|
#define VIRTIO_ID_WATCHDOG 35 /* virtio watchdog */
|
||||||
|
#define VIRTIO_ID_CAN 36 /* virtio can */
|
||||||
|
#define VIRTIO_ID_DMABUF 37 /* virtio dmabuf */
|
||||||
|
#define VIRTIO_ID_PARAM_SERV 38 /* virtio parameter server */
|
||||||
|
#define VIRTIO_ID_AUDIO_POLICY 39 /* virtio audio policy */
|
||||||
#define VIRTIO_ID_BT 40 /* virtio bluetooth */
|
#define VIRTIO_ID_BT 40 /* virtio bluetooth */
|
||||||
|
#define VIRTIO_ID_GPIO 41 /* virtio gpio */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Virtio Transitional IDs
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VIRTIO_TRANS_ID_NET 1000 /* transitional virtio net */
|
||||||
|
#define VIRTIO_TRANS_ID_BLOCK 1001 /* transitional virtio block */
|
||||||
|
#define VIRTIO_TRANS_ID_BALLOON 1002 /* transitional virtio balloon */
|
||||||
|
#define VIRTIO_TRANS_ID_CONSOLE 1003 /* transitional virtio console */
|
||||||
|
#define VIRTIO_TRANS_ID_SCSI 1004 /* transitional virtio SCSI */
|
||||||
|
#define VIRTIO_TRANS_ID_RNG 1005 /* transitional virtio rng */
|
||||||
|
#define VIRTIO_TRANS_ID_9P 1009 /* transitional virtio 9p console */
|
||||||
|
|
||||||
#endif /* _LINUX_VIRTIO_IDS_H */
|
#endif /* _LINUX_VIRTIO_IDS_H */
|
||||||
|
@ -97,7 +97,8 @@ enum virtio_vsock_shutdown {
|
|||||||
|
|
||||||
/* VIRTIO_VSOCK_OP_RW flags values */
|
/* VIRTIO_VSOCK_OP_RW flags values */
|
||||||
enum virtio_vsock_rw {
|
enum virtio_vsock_rw {
|
||||||
VIRTIO_VSOCK_SEQ_EOR = 1,
|
VIRTIO_VSOCK_SEQ_EOM = 1,
|
||||||
|
VIRTIO_VSOCK_SEQ_EOR = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _LINUX_VIRTIO_VSOCK_H */
|
#endif /* _LINUX_VIRTIO_VSOCK_H */
|
||||||
|
@ -46,6 +46,8 @@ extern bool kvm_readonly_mem_allowed;
|
|||||||
extern bool kvm_direct_msi_allowed;
|
extern bool kvm_direct_msi_allowed;
|
||||||
extern bool kvm_ioeventfd_any_length_allowed;
|
extern bool kvm_ioeventfd_any_length_allowed;
|
||||||
extern bool kvm_msi_use_devid;
|
extern bool kvm_msi_use_devid;
|
||||||
|
extern bool kvm_has_guest_debug;
|
||||||
|
extern int kvm_sstep_flags;
|
||||||
|
|
||||||
#define kvm_enabled() (kvm_allowed)
|
#define kvm_enabled() (kvm_allowed)
|
||||||
/**
|
/**
|
||||||
@ -167,6 +169,17 @@ extern bool kvm_msi_use_devid;
|
|||||||
*/
|
*/
|
||||||
#define kvm_msi_devid_required() (kvm_msi_use_devid)
|
#define kvm_msi_devid_required() (kvm_msi_use_devid)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Does KVM support guest debugging
|
||||||
|
*/
|
||||||
|
#define kvm_supports_guest_debug() (kvm_has_guest_debug)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* kvm_supported_sstep_flags
|
||||||
|
* Returns: SSTEP_* flags that KVM supports for guest debug
|
||||||
|
*/
|
||||||
|
#define kvm_get_supported_sstep_flags() (kvm_sstep_flags)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define kvm_enabled() (0)
|
#define kvm_enabled() (0)
|
||||||
@ -184,6 +197,8 @@ extern bool kvm_msi_use_devid;
|
|||||||
#define kvm_direct_msi_enabled() (false)
|
#define kvm_direct_msi_enabled() (false)
|
||||||
#define kvm_ioeventfd_any_length_enabled() (false)
|
#define kvm_ioeventfd_any_length_enabled() (false)
|
||||||
#define kvm_msi_devid_required() (false)
|
#define kvm_msi_devid_required() (false)
|
||||||
|
#define kvm_supports_guest_debug() (false)
|
||||||
|
#define kvm_get_supported_sstep_flags() (0)
|
||||||
|
|
||||||
#endif /* CONFIG_KVM_IS_POSSIBLE */
|
#endif /* CONFIG_KVM_IS_POSSIBLE */
|
||||||
|
|
||||||
|
@ -20,5 +20,6 @@
|
|||||||
#define __ARCH_WANT_SET_GET_RLIMIT
|
#define __ARCH_WANT_SET_GET_RLIMIT
|
||||||
#define __ARCH_WANT_TIME32_SYSCALLS
|
#define __ARCH_WANT_TIME32_SYSCALLS
|
||||||
#define __ARCH_WANT_SYS_CLONE3
|
#define __ARCH_WANT_SYS_CLONE3
|
||||||
|
#define __ARCH_WANT_MEMFD_SECRET
|
||||||
|
|
||||||
#include <asm-generic/unistd.h>
|
#include <asm-generic/unistd.h>
|
||||||
|
@ -673,15 +673,15 @@ __SYSCALL(__NR_madvise, sys_madvise)
|
|||||||
#define __NR_remap_file_pages 234
|
#define __NR_remap_file_pages 234
|
||||||
__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages)
|
__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages)
|
||||||
#define __NR_mbind 235
|
#define __NR_mbind 235
|
||||||
__SC_COMP(__NR_mbind, sys_mbind, compat_sys_mbind)
|
__SYSCALL(__NR_mbind, sys_mbind)
|
||||||
#define __NR_get_mempolicy 236
|
#define __NR_get_mempolicy 236
|
||||||
__SC_COMP(__NR_get_mempolicy, sys_get_mempolicy, compat_sys_get_mempolicy)
|
__SYSCALL(__NR_get_mempolicy, sys_get_mempolicy)
|
||||||
#define __NR_set_mempolicy 237
|
#define __NR_set_mempolicy 237
|
||||||
__SC_COMP(__NR_set_mempolicy, sys_set_mempolicy, compat_sys_set_mempolicy)
|
__SYSCALL(__NR_set_mempolicy, sys_set_mempolicy)
|
||||||
#define __NR_migrate_pages 238
|
#define __NR_migrate_pages 238
|
||||||
__SC_COMP(__NR_migrate_pages, sys_migrate_pages, compat_sys_migrate_pages)
|
__SYSCALL(__NR_migrate_pages, sys_migrate_pages)
|
||||||
#define __NR_move_pages 239
|
#define __NR_move_pages 239
|
||||||
__SC_COMP(__NR_move_pages, sys_move_pages, compat_sys_move_pages)
|
__SYSCALL(__NR_move_pages, sys_move_pages)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define __NR_rt_tgsigqueueinfo 240
|
#define __NR_rt_tgsigqueueinfo 240
|
||||||
@ -873,8 +873,18 @@ __SYSCALL(__NR_landlock_add_rule, sys_landlock_add_rule)
|
|||||||
#define __NR_landlock_restrict_self 446
|
#define __NR_landlock_restrict_self 446
|
||||||
__SYSCALL(__NR_landlock_restrict_self, sys_landlock_restrict_self)
|
__SYSCALL(__NR_landlock_restrict_self, sys_landlock_restrict_self)
|
||||||
|
|
||||||
|
#ifdef __ARCH_WANT_MEMFD_SECRET
|
||||||
|
#define __NR_memfd_secret 447
|
||||||
|
__SYSCALL(__NR_memfd_secret, sys_memfd_secret)
|
||||||
|
#endif
|
||||||
|
#define __NR_process_mrelease 448
|
||||||
|
__SYSCALL(__NR_process_mrelease, sys_process_mrelease)
|
||||||
|
|
||||||
|
#define __NR_futex_waitv 449
|
||||||
|
__SYSCALL(__NR_futex_waitv, sys_futex_waitv)
|
||||||
|
|
||||||
#undef __NR_syscalls
|
#undef __NR_syscalls
|
||||||
#define __NR_syscalls 447
|
#define __NR_syscalls 450
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 32 bit systems traditionally used different
|
* 32 bit systems traditionally used different
|
||||||
|
@ -376,5 +376,6 @@
|
|||||||
#define __NR_landlock_create_ruleset (__NR_Linux + 444)
|
#define __NR_landlock_create_ruleset (__NR_Linux + 444)
|
||||||
#define __NR_landlock_add_rule (__NR_Linux + 445)
|
#define __NR_landlock_add_rule (__NR_Linux + 445)
|
||||||
#define __NR_landlock_restrict_self (__NR_Linux + 446)
|
#define __NR_landlock_restrict_self (__NR_Linux + 446)
|
||||||
|
#define __NR_process_mrelease (__NR_Linux + 448)
|
||||||
|
|
||||||
#endif /* _ASM_UNISTD_N32_H */
|
#endif /* _ASM_UNISTD_N32_H */
|
||||||
|
@ -352,5 +352,6 @@
|
|||||||
#define __NR_landlock_create_ruleset (__NR_Linux + 444)
|
#define __NR_landlock_create_ruleset (__NR_Linux + 444)
|
||||||
#define __NR_landlock_add_rule (__NR_Linux + 445)
|
#define __NR_landlock_add_rule (__NR_Linux + 445)
|
||||||
#define __NR_landlock_restrict_self (__NR_Linux + 446)
|
#define __NR_landlock_restrict_self (__NR_Linux + 446)
|
||||||
|
#define __NR_process_mrelease (__NR_Linux + 448)
|
||||||
|
|
||||||
#endif /* _ASM_UNISTD_N64_H */
|
#endif /* _ASM_UNISTD_N64_H */
|
||||||
|
@ -422,5 +422,6 @@
|
|||||||
#define __NR_landlock_create_ruleset (__NR_Linux + 444)
|
#define __NR_landlock_create_ruleset (__NR_Linux + 444)
|
||||||
#define __NR_landlock_add_rule (__NR_Linux + 445)
|
#define __NR_landlock_add_rule (__NR_Linux + 445)
|
||||||
#define __NR_landlock_restrict_self (__NR_Linux + 446)
|
#define __NR_landlock_restrict_self (__NR_Linux + 446)
|
||||||
|
#define __NR_process_mrelease (__NR_Linux + 448)
|
||||||
|
|
||||||
#endif /* _ASM_UNISTD_O32_H */
|
#endif /* _ASM_UNISTD_O32_H */
|
||||||
|
@ -429,6 +429,7 @@
|
|||||||
#define __NR_landlock_create_ruleset 444
|
#define __NR_landlock_create_ruleset 444
|
||||||
#define __NR_landlock_add_rule 445
|
#define __NR_landlock_add_rule 445
|
||||||
#define __NR_landlock_restrict_self 446
|
#define __NR_landlock_restrict_self 446
|
||||||
|
#define __NR_process_mrelease 448
|
||||||
|
|
||||||
|
|
||||||
#endif /* _ASM_UNISTD_32_H */
|
#endif /* _ASM_UNISTD_32_H */
|
||||||
|
@ -401,6 +401,7 @@
|
|||||||
#define __NR_landlock_create_ruleset 444
|
#define __NR_landlock_create_ruleset 444
|
||||||
#define __NR_landlock_add_rule 445
|
#define __NR_landlock_add_rule 445
|
||||||
#define __NR_landlock_restrict_self 446
|
#define __NR_landlock_restrict_self 446
|
||||||
|
#define __NR_process_mrelease 448
|
||||||
|
|
||||||
|
|
||||||
#endif /* _ASM_UNISTD_64_H */
|
#endif /* _ASM_UNISTD_64_H */
|
||||||
|
@ -419,5 +419,6 @@
|
|||||||
#define __NR_landlock_create_ruleset 444
|
#define __NR_landlock_create_ruleset 444
|
||||||
#define __NR_landlock_add_rule 445
|
#define __NR_landlock_add_rule 445
|
||||||
#define __NR_landlock_restrict_self 446
|
#define __NR_landlock_restrict_self 446
|
||||||
|
#define __NR_process_mrelease 448
|
||||||
|
|
||||||
#endif /* _ASM_S390_UNISTD_32_H */
|
#endif /* _ASM_S390_UNISTD_32_H */
|
||||||
|
@ -367,5 +367,6 @@
|
|||||||
#define __NR_landlock_create_ruleset 444
|
#define __NR_landlock_create_ruleset 444
|
||||||
#define __NR_landlock_add_rule 445
|
#define __NR_landlock_add_rule 445
|
||||||
#define __NR_landlock_restrict_self 446
|
#define __NR_landlock_restrict_self 446
|
||||||
|
#define __NR_process_mrelease 448
|
||||||
|
|
||||||
#endif /* _ASM_S390_UNISTD_64_H */
|
#endif /* _ASM_S390_UNISTD_64_H */
|
||||||
|
@ -295,6 +295,7 @@ struct kvm_debug_exit_arch {
|
|||||||
#define KVM_GUESTDBG_USE_HW_BP 0x00020000
|
#define KVM_GUESTDBG_USE_HW_BP 0x00020000
|
||||||
#define KVM_GUESTDBG_INJECT_DB 0x00040000
|
#define KVM_GUESTDBG_INJECT_DB 0x00040000
|
||||||
#define KVM_GUESTDBG_INJECT_BP 0x00080000
|
#define KVM_GUESTDBG_INJECT_BP 0x00080000
|
||||||
|
#define KVM_GUESTDBG_BLOCKIRQ 0x00100000
|
||||||
|
|
||||||
/* for KVM_SET_GUEST_DEBUG */
|
/* for KVM_SET_GUEST_DEBUG */
|
||||||
struct kvm_guest_debug_arch {
|
struct kvm_guest_debug_arch {
|
||||||
@ -503,4 +504,8 @@ struct kvm_pmu_event_filter {
|
|||||||
#define KVM_PMU_EVENT_ALLOW 0
|
#define KVM_PMU_EVENT_ALLOW 0
|
||||||
#define KVM_PMU_EVENT_DENY 1
|
#define KVM_PMU_EVENT_DENY 1
|
||||||
|
|
||||||
|
/* for KVM_{GET,SET,HAS}_DEVICE_ATTR */
|
||||||
|
#define KVM_VCPU_TSC_CTRL 0 /* control group for the timestamp counter (TSC) */
|
||||||
|
#define KVM_VCPU_TSC_OFFSET 0 /* attribute for the TSC offset */
|
||||||
|
|
||||||
#endif /* _ASM_X86_KVM_H */
|
#endif /* _ASM_X86_KVM_H */
|
||||||
|
@ -437,6 +437,9 @@
|
|||||||
#define __NR_landlock_create_ruleset 444
|
#define __NR_landlock_create_ruleset 444
|
||||||
#define __NR_landlock_add_rule 445
|
#define __NR_landlock_add_rule 445
|
||||||
#define __NR_landlock_restrict_self 446
|
#define __NR_landlock_restrict_self 446
|
||||||
|
#define __NR_memfd_secret 447
|
||||||
|
#define __NR_process_mrelease 448
|
||||||
|
#define __NR_futex_waitv 449
|
||||||
|
|
||||||
|
|
||||||
#endif /* _ASM_UNISTD_32_H */
|
#endif /* _ASM_UNISTD_32_H */
|
||||||
|
@ -359,6 +359,9 @@
|
|||||||
#define __NR_landlock_create_ruleset 444
|
#define __NR_landlock_create_ruleset 444
|
||||||
#define __NR_landlock_add_rule 445
|
#define __NR_landlock_add_rule 445
|
||||||
#define __NR_landlock_restrict_self 446
|
#define __NR_landlock_restrict_self 446
|
||||||
|
#define __NR_memfd_secret 447
|
||||||
|
#define __NR_process_mrelease 448
|
||||||
|
#define __NR_futex_waitv 449
|
||||||
|
|
||||||
|
|
||||||
#endif /* _ASM_UNISTD_64_H */
|
#endif /* _ASM_UNISTD_64_H */
|
||||||
|
@ -312,6 +312,9 @@
|
|||||||
#define __NR_landlock_create_ruleset (__X32_SYSCALL_BIT + 444)
|
#define __NR_landlock_create_ruleset (__X32_SYSCALL_BIT + 444)
|
||||||
#define __NR_landlock_add_rule (__X32_SYSCALL_BIT + 445)
|
#define __NR_landlock_add_rule (__X32_SYSCALL_BIT + 445)
|
||||||
#define __NR_landlock_restrict_self (__X32_SYSCALL_BIT + 446)
|
#define __NR_landlock_restrict_self (__X32_SYSCALL_BIT + 446)
|
||||||
|
#define __NR_memfd_secret (__X32_SYSCALL_BIT + 447)
|
||||||
|
#define __NR_process_mrelease (__X32_SYSCALL_BIT + 448)
|
||||||
|
#define __NR_futex_waitv (__X32_SYSCALL_BIT + 449)
|
||||||
#define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512)
|
#define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512)
|
||||||
#define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513)
|
#define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513)
|
||||||
#define __NR_ioctl (__X32_SYSCALL_BIT + 514)
|
#define __NR_ioctl (__X32_SYSCALL_BIT + 514)
|
||||||
|
@ -269,6 +269,7 @@ struct kvm_xen_exit {
|
|||||||
#define KVM_EXIT_AP_RESET_HOLD 32
|
#define KVM_EXIT_AP_RESET_HOLD 32
|
||||||
#define KVM_EXIT_X86_BUS_LOCK 33
|
#define KVM_EXIT_X86_BUS_LOCK 33
|
||||||
#define KVM_EXIT_XEN 34
|
#define KVM_EXIT_XEN 34
|
||||||
|
#define KVM_EXIT_RISCV_SBI 35
|
||||||
|
|
||||||
/* For KVM_EXIT_INTERNAL_ERROR */
|
/* For KVM_EXIT_INTERNAL_ERROR */
|
||||||
/* Emulate instruction failed. */
|
/* Emulate instruction failed. */
|
||||||
@ -397,13 +398,23 @@ struct kvm_run {
|
|||||||
* "ndata" is correct, that new fields are enumerated in "flags",
|
* "ndata" is correct, that new fields are enumerated in "flags",
|
||||||
* and that each flag enumerates fields that are 64-bit aligned
|
* and that each flag enumerates fields that are 64-bit aligned
|
||||||
* and sized (so that ndata+internal.data[] is valid/accurate).
|
* and sized (so that ndata+internal.data[] is valid/accurate).
|
||||||
|
*
|
||||||
|
* Space beyond the defined fields may be used to store arbitrary
|
||||||
|
* debug information relating to the emulation failure. It is
|
||||||
|
* accounted for in "ndata" but the format is unspecified and is
|
||||||
|
* not represented in "flags". Any such information is *not* ABI!
|
||||||
*/
|
*/
|
||||||
struct {
|
struct {
|
||||||
__u32 suberror;
|
__u32 suberror;
|
||||||
__u32 ndata;
|
__u32 ndata;
|
||||||
__u64 flags;
|
__u64 flags;
|
||||||
__u8 insn_size;
|
union {
|
||||||
__u8 insn_bytes[15];
|
struct {
|
||||||
|
__u8 insn_size;
|
||||||
|
__u8 insn_bytes[15];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/* Arbitrary debug data may follow. */
|
||||||
} emulation_failure;
|
} emulation_failure;
|
||||||
/* KVM_EXIT_OSI */
|
/* KVM_EXIT_OSI */
|
||||||
struct {
|
struct {
|
||||||
@ -469,6 +480,13 @@ struct kvm_run {
|
|||||||
} msr;
|
} msr;
|
||||||
/* KVM_EXIT_XEN */
|
/* KVM_EXIT_XEN */
|
||||||
struct kvm_xen_exit xen;
|
struct kvm_xen_exit xen;
|
||||||
|
/* KVM_EXIT_RISCV_SBI */
|
||||||
|
struct {
|
||||||
|
unsigned long extension_id;
|
||||||
|
unsigned long function_id;
|
||||||
|
unsigned long args[6];
|
||||||
|
unsigned long ret[2];
|
||||||
|
} riscv_sbi;
|
||||||
/* Fix the size of the union. */
|
/* Fix the size of the union. */
|
||||||
char padding[256];
|
char padding[256];
|
||||||
};
|
};
|
||||||
@ -1223,11 +1241,16 @@ struct kvm_irqfd {
|
|||||||
|
|
||||||
/* Do not use 1, KVM_CHECK_EXTENSION returned it before we had flags. */
|
/* Do not use 1, KVM_CHECK_EXTENSION returned it before we had flags. */
|
||||||
#define KVM_CLOCK_TSC_STABLE 2
|
#define KVM_CLOCK_TSC_STABLE 2
|
||||||
|
#define KVM_CLOCK_REALTIME (1 << 2)
|
||||||
|
#define KVM_CLOCK_HOST_TSC (1 << 3)
|
||||||
|
|
||||||
struct kvm_clock_data {
|
struct kvm_clock_data {
|
||||||
__u64 clock;
|
__u64 clock;
|
||||||
__u32 flags;
|
__u32 flags;
|
||||||
__u32 pad[9];
|
__u32 pad0;
|
||||||
|
__u64 realtime;
|
||||||
|
__u64 host_tsc;
|
||||||
|
__u32 pad[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* For KVM_CAP_SW_TLB */
|
/* For KVM_CAP_SW_TLB */
|
||||||
@ -1965,7 +1988,9 @@ struct kvm_stats_header {
|
|||||||
#define KVM_STATS_TYPE_CUMULATIVE (0x0 << KVM_STATS_TYPE_SHIFT)
|
#define KVM_STATS_TYPE_CUMULATIVE (0x0 << KVM_STATS_TYPE_SHIFT)
|
||||||
#define KVM_STATS_TYPE_INSTANT (0x1 << KVM_STATS_TYPE_SHIFT)
|
#define KVM_STATS_TYPE_INSTANT (0x1 << KVM_STATS_TYPE_SHIFT)
|
||||||
#define KVM_STATS_TYPE_PEAK (0x2 << KVM_STATS_TYPE_SHIFT)
|
#define KVM_STATS_TYPE_PEAK (0x2 << KVM_STATS_TYPE_SHIFT)
|
||||||
#define KVM_STATS_TYPE_MAX KVM_STATS_TYPE_PEAK
|
#define KVM_STATS_TYPE_LINEAR_HIST (0x3 << KVM_STATS_TYPE_SHIFT)
|
||||||
|
#define KVM_STATS_TYPE_LOG_HIST (0x4 << KVM_STATS_TYPE_SHIFT)
|
||||||
|
#define KVM_STATS_TYPE_MAX KVM_STATS_TYPE_LOG_HIST
|
||||||
|
|
||||||
#define KVM_STATS_UNIT_SHIFT 4
|
#define KVM_STATS_UNIT_SHIFT 4
|
||||||
#define KVM_STATS_UNIT_MASK (0xF << KVM_STATS_UNIT_SHIFT)
|
#define KVM_STATS_UNIT_MASK (0xF << KVM_STATS_UNIT_SHIFT)
|
||||||
@ -1988,8 +2013,9 @@ struct kvm_stats_header {
|
|||||||
* @size: The number of data items for this stats.
|
* @size: The number of data items for this stats.
|
||||||
* Every data item is of type __u64.
|
* Every data item is of type __u64.
|
||||||
* @offset: The offset of the stats to the start of stat structure in
|
* @offset: The offset of the stats to the start of stat structure in
|
||||||
* struture kvm or kvm_vcpu.
|
* structure kvm or kvm_vcpu.
|
||||||
* @unused: Unused field for future usage. Always 0 for now.
|
* @bucket_size: A parameter value used for histogram stats. It is only used
|
||||||
|
* for linear histogram stats, specifying the size of the bucket;
|
||||||
* @name: The name string for the stats. Its size is indicated by the
|
* @name: The name string for the stats. Its size is indicated by the
|
||||||
* &kvm_stats_header->name_size.
|
* &kvm_stats_header->name_size.
|
||||||
*/
|
*/
|
||||||
@ -1998,7 +2024,7 @@ struct kvm_stats_desc {
|
|||||||
__s16 exponent;
|
__s16 exponent;
|
||||||
__u16 size;
|
__u16 size;
|
||||||
__u32 offset;
|
__u32 offset;
|
||||||
__u32 unused;
|
__u32 bucket_size;
|
||||||
char name[];
|
char name[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1810,6 +1810,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
|
|||||||
se->id ? se->id : "");
|
se->id ? se->id : "");
|
||||||
monitor_printf(mon, " memaddr: 0x%" PRIx64 "\n", se->memaddr);
|
monitor_printf(mon, " memaddr: 0x%" PRIx64 "\n", se->memaddr);
|
||||||
monitor_printf(mon, " size: %" PRIu64 "\n", se->size);
|
monitor_printf(mon, " size: %" PRIu64 "\n", se->size);
|
||||||
|
monitor_printf(mon, " node: %" PRId64 "\n", se->node);
|
||||||
monitor_printf(mon, " memdev: %s\n", se->memdev);
|
monitor_printf(mon, " memdev: %s\n", se->memdev);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -867,7 +867,7 @@
|
|||||||
#
|
#
|
||||||
# @node-id: NUMA node ID the CPU belongs to
|
# @node-id: NUMA node ID the CPU belongs to
|
||||||
# @socket-id: socket number within node/board the CPU belongs to
|
# @socket-id: socket number within node/board the CPU belongs to
|
||||||
# @die-id: die number within node/board the CPU belongs to (Since 4.1)
|
# @die-id: die number within socket the CPU belongs to (since 4.1)
|
||||||
# @core-id: core number within die the CPU belongs to
|
# @core-id: core number within die the CPU belongs to
|
||||||
# @thread-id: thread number within core the CPU belongs to
|
# @thread-id: thread number within core the CPU belongs to
|
||||||
#
|
#
|
||||||
@ -1207,12 +1207,15 @@
|
|||||||
#
|
#
|
||||||
# @memdev: memory backend linked with device
|
# @memdev: memory backend linked with device
|
||||||
#
|
#
|
||||||
|
# @node: the numa node
|
||||||
|
#
|
||||||
# Since: 6.2
|
# Since: 6.2
|
||||||
##
|
##
|
||||||
{ 'struct': 'SgxEPCDeviceInfo',
|
{ 'struct': 'SgxEPCDeviceInfo',
|
||||||
'data': { '*id': 'str',
|
'data': { '*id': 'str',
|
||||||
'memaddr': 'size',
|
'memaddr': 'size',
|
||||||
'size': 'size',
|
'size': 'size',
|
||||||
|
'node': 'int',
|
||||||
'memdev': 'str'
|
'memdev': 'str'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1285,10 +1288,15 @@
|
|||||||
#
|
#
|
||||||
# @memdev: memory backend linked with device
|
# @memdev: memory backend linked with device
|
||||||
#
|
#
|
||||||
|
# @node: the numa node
|
||||||
|
#
|
||||||
# Since: 6.2
|
# Since: 6.2
|
||||||
##
|
##
|
||||||
{ 'struct': 'SgxEPC',
|
{ 'struct': 'SgxEPC',
|
||||||
'data': { 'memdev': 'str' } }
|
'data': { 'memdev': 'str',
|
||||||
|
'node': 'int'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
##
|
##
|
||||||
# @SgxEPCProperties:
|
# @SgxEPCProperties:
|
||||||
|
@ -337,6 +337,21 @@
|
|||||||
'if': 'TARGET_ARM' }
|
'if': 'TARGET_ARM' }
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# @SGXEPCSection:
|
||||||
|
#
|
||||||
|
# Information about intel SGX EPC section info
|
||||||
|
#
|
||||||
|
# @node: the numa node
|
||||||
|
#
|
||||||
|
# @size: the size of epc section
|
||||||
|
#
|
||||||
|
# Since: 6.2
|
||||||
|
##
|
||||||
|
{ 'struct': 'SGXEPCSection',
|
||||||
|
'data': { 'node': 'int',
|
||||||
|
'size': 'uint64'}}
|
||||||
|
|
||||||
##
|
##
|
||||||
# @SGXInfo:
|
# @SGXInfo:
|
||||||
#
|
#
|
||||||
@ -350,7 +365,7 @@
|
|||||||
#
|
#
|
||||||
# @flc: true if FLC is supported
|
# @flc: true if FLC is supported
|
||||||
#
|
#
|
||||||
# @section-size: The EPC section size for guest
|
# @sections: The EPC sections info for guest
|
||||||
#
|
#
|
||||||
# Since: 6.2
|
# Since: 6.2
|
||||||
##
|
##
|
||||||
@ -359,7 +374,7 @@
|
|||||||
'sgx1': 'bool',
|
'sgx1': 'bool',
|
||||||
'sgx2': 'bool',
|
'sgx2': 'bool',
|
||||||
'flc': 'bool',
|
'flc': 'bool',
|
||||||
'section-size': 'uint64'},
|
'sections': ['SGXEPCSection']},
|
||||||
'if': 'TARGET_I386' }
|
'if': 'TARGET_I386' }
|
||||||
|
|
||||||
##
|
##
|
||||||
|
@ -127,11 +127,11 @@ SRST
|
|||||||
ERST
|
ERST
|
||||||
|
|
||||||
DEF("M", HAS_ARG, QEMU_OPTION_M,
|
DEF("M", HAS_ARG, QEMU_OPTION_M,
|
||||||
" sgx-epc.0.memdev=memid\n",
|
" sgx-epc.0.memdev=memid,sgx-epc.0.node=numaid\n",
|
||||||
QEMU_ARCH_ALL)
|
QEMU_ARCH_ALL)
|
||||||
|
|
||||||
SRST
|
SRST
|
||||||
``sgx-epc.0.memdev=@var{memid}``
|
``sgx-epc.0.memdev=@var{memid},sgx-epc.0.node=@var{numaid}``
|
||||||
Define an SGX EPC section.
|
Define an SGX EPC section.
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ ENTITLEMENT="$4"
|
|||||||
|
|
||||||
if $in_place; then
|
if $in_place; then
|
||||||
trap 'rm "$DST.tmp"' exit
|
trap 'rm "$DST.tmp"' exit
|
||||||
cp -af "$SRC" "$DST.tmp"
|
cp -pPf "$SRC" "$DST.tmp"
|
||||||
SRC="$DST.tmp"
|
SRC="$DST.tmp"
|
||||||
else
|
else
|
||||||
cd "$MESON_INSTALL_DESTDIR_PREFIX"
|
cd "$MESON_INSTALL_DESTDIR_PREFIX"
|
||||||
|
52
tests/qtest/fuzz-lsi53c895a-test.c
Normal file
52
tests/qtest/fuzz-lsi53c895a-test.c
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
/*
|
||||||
|
* QTest fuzzer-generated testcase for LSI53C895A device
|
||||||
|
*
|
||||||
|
* Copyright (c) Red Hat
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "libqos/libqtest.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This used to trigger the assert in lsi_do_dma()
|
||||||
|
* https://bugs.launchpad.net/qemu/+bug/697510
|
||||||
|
* https://bugs.launchpad.net/qemu/+bug/1905521
|
||||||
|
* https://bugs.launchpad.net/qemu/+bug/1908515
|
||||||
|
*/
|
||||||
|
static void test_lsi_do_dma_empty_queue(void)
|
||||||
|
{
|
||||||
|
QTestState *s;
|
||||||
|
|
||||||
|
s = qtest_init("-M q35 -nographic -monitor none -serial none "
|
||||||
|
"-drive if=none,id=drive0,"
|
||||||
|
"file=null-co://,file.read-zeroes=on,format=raw "
|
||||||
|
"-device lsi53c895a,id=scsi0 "
|
||||||
|
"-device scsi-hd,drive=drive0,"
|
||||||
|
"bus=scsi0.0,channel=0,scsi-id=0,lun=0");
|
||||||
|
qtest_outl(s, 0xcf8, 0x80001814);
|
||||||
|
qtest_outl(s, 0xcfc, 0xe1068000);
|
||||||
|
qtest_outl(s, 0xcf8, 0x80001818);
|
||||||
|
qtest_outl(s, 0xcf8, 0x80001804);
|
||||||
|
qtest_outw(s, 0xcfc, 0x7);
|
||||||
|
qtest_outl(s, 0xcf8, 0x80002010);
|
||||||
|
|
||||||
|
qtest_writeb(s, 0xe106802e, 0xff); /* Fill DSP bits 16-23 */
|
||||||
|
qtest_writeb(s, 0xe106802f, 0xff); /* Fill DSP bits 24-31: trigger SCRIPT */
|
||||||
|
|
||||||
|
qtest_quit(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const char *arch = qtest_get_arch();
|
||||||
|
|
||||||
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
||||||
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
qtest_add_func("fuzz/lsi53c895a/lsi_do_dma_empty_queue",
|
||||||
|
test_lsi_do_dma_empty_queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_test_run();
|
||||||
|
}
|
@ -19,6 +19,7 @@ slow_qtests = {
|
|||||||
|
|
||||||
qtests_generic = \
|
qtests_generic = \
|
||||||
(config_all_devices.has_key('CONFIG_MEGASAS_SCSI_PCI') ? ['fuzz-megasas-test'] : []) + \
|
(config_all_devices.has_key('CONFIG_MEGASAS_SCSI_PCI') ? ['fuzz-megasas-test'] : []) + \
|
||||||
|
(config_all_devices.has_key('CONFIG_LSI_SCSI_PCI') ? ['fuzz-lsi53c895a-test'] : []) + \
|
||||||
(config_all_devices.has_key('CONFIG_VIRTIO_SCSI') ? ['fuzz-virtio-scsi-test'] : []) + \
|
(config_all_devices.has_key('CONFIG_VIRTIO_SCSI') ? ['fuzz-virtio-scsi-test'] : []) + \
|
||||||
(config_all_devices.has_key('CONFIG_SB16') ? ['fuzz-sb16-test'] : []) + \
|
(config_all_devices.has_key('CONFIG_SB16') ? ['fuzz-sb16-test'] : []) + \
|
||||||
(config_all_devices.has_key('CONFIG_SDHCI_PCI') ? ['fuzz-sdcard-test'] : []) + \
|
(config_all_devices.has_key('CONFIG_SDHCI_PCI') ? ['fuzz-sdcard-test'] : []) + \
|
||||||
|
Loading…
Reference in New Issue
Block a user