unicorn/qemu
Peter Maydell 1a3abaa81a target/i386: Check privilege level for protected mode 'int N' task gate
When the 'int N' instruction is executed in protected mode, the
pseudocode in the architecture manual specifies that we need to check:

* vector number within IDT limits
* selected IDT descriptor is a valid type (interrupt, trap or task gate)
* if this was a software interrupt then gate DPL < CPL

The way we had structured the code meant that the privilege check for
software interrupts ended up not in the code path taken for task gate
handling, because all of the task gate handling code was in the 'case 5'
of the switch which was checking "is this descriptor a valid type".

Move the task gate handling code out of that switch (so that it is now
purely doing the "valid type?" check) and below the software interrupt
privilege check.

The effect of this missing check was that in a guest userspace binary
executing 'int 8' would cause a guest kernel panic rather than the
userspace binary being handed a SEGV.

This is essentially the same bug fixed in VirtualBox in 2012:
https://www.halfdog.net/Security/2012/VirtualBoxSoftwareInterrupt0x8GuestCrash/

Note that for QEMU this is not a security issue because it is only
present when using TCG.

Backports 3df1a3d070575419859cbbab1083fafa7ec2669a
2021-03-03 19:32:10 -05:00
..
accel tcg: Use memset for large vector byte replication 2021-03-03 19:28:15 -05:00
crypto crypto: Clean up includes 2018-02-19 00:47:40 -05:00
default-configs target/riscv: Initial introduction of the RISC-V target 2019-03-08 21:46:10 -05:00
docs docs/devel/memory.txt: Document _with_attrs accessors 2018-10-04 04:46:26 -04:00
fpu softfloat: Define misc operations for bfloat16 2021-02-27 16:41:46 -05:00
hw target/arm: Set instance_align on CPUARM TypeInfo 2021-03-01 18:58:44 -05:00
include tcg: Use memset for large vector byte replication 2021-03-03 19:28:15 -05:00
qapi qapi: Rewrite string-input-visitor's integer and list parsing 2018-12-18 04:57:25 -05:00
qobject qstring: Move qstring_from_substr()'s @end one to the right 2018-08-02 21:24:19 -04:00
qom target/arm: Set instance_align on CPUARM TypeInfo 2021-03-01 18:58:44 -05:00
scripts decodetree: Fix codegen for non-overlapping group inside overlapping group 2021-03-01 20:14:19 -05:00
target target/i386: Check privilege level for protected mode 'int N' task gate 2021-03-03 19:32:10 -05:00
tcg tcg: Add tcg_gen_bswap_tl alias 2021-03-03 19:30:11 -05:00
util util/cutils: Turn FIXME comment into QEMU_BUILD_BUG_ON() 2020-01-14 08:04:30 -05:00
aarch64.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
aarch64eb.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
accel.c target/arm: Set instance_align on CPUARM TypeInfo 2021-03-01 18:58:44 -05:00
arm.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
armeb.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
CODING_STYLE.rst docs: split the CODING_STYLE doc into distinct groups 2019-11-28 02:54:44 -05:00
configure configure: Support -static-pie if requested 2020-04-30 07:09:34 -04:00
COPYING
COPYING.LIB import 2015-08-21 15:04:50 +08:00
cpus.c Include qapi/error.h exactly where needed 2018-03-07 12:26:38 -05:00
exec.c Memory: Enable writeback for given memory region 2020-01-14 07:44:24 -05:00
gen_all_header.sh
glib_compat.c target/arm: Add VHE system register redirection and aliasing 2020-03-21 15:57:03 -04:00
header_gen.py target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
ioport.c hw: remove pio_addr_t 2018-02-24 02:43:16 -05:00
LICENSE
m68k.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
Makefile Makefile: Rename targets for make recursion 2019-08-08 17:26:49 -04:00
Makefile.objs qapi: Move qapi-schema.json to qapi/, rename generated files 2018-03-09 11:35:11 -05:00
Makefile.target configure: Remove old -fno-gcse workaround for GCC 4.6.x and 4.7.[012] 2018-12-18 03:52:36 -05:00
memory.c target/arm: Set instance_align on CPUARM TypeInfo 2021-03-01 18:58:44 -05:00
memory_ldst.inc.c memory: Single byte swap along the I/O path 2020-01-07 19:12:04 -05:00
memory_mapping.c include/qemu/osdep.h: Don't include qapi/error.h 2018-02-21 23:08:18 -05:00
mips.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
mips64.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
mips64el.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
mipsel.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
powerpc.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
qemu-timer.c timer/cpus: fix some typos and update some comments 2018-02-25 23:21:57 -05:00
riscv32.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
riscv64.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
rules.mak build-sys: silence make by default or V=0 2018-03-06 08:58:03 -05:00
sparc.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
sparc64.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00
unicorn_common.h tcg: Move sorted_args into TCGArgConstraint.sort_index 2021-03-01 19:33:45 -05:00
VERSION Open 6.0 development tree 2021-03-02 13:39:05 -05:00
vl.c Use cpu_create(type) instead of cpu_init(cpu_model) 2018-03-20 14:20:30 -04:00
vl.h
x86_64.h target/arm: AArch32 VCVT fixed-point to float is always round-to-nearest 2021-03-01 20:04:31 -05:00