Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:FrontRunner
qemu.18973
0198-sm501-Log-unimplemented-raster-oper.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0198-sm501-Log-unimplemented-raster-oper.patch of Package qemu.18973
From: Sebastian Bauer <mail@sebastianbauer.info> Date: Wed, 4 Jul 2018 11:40:58 +0200 Subject: sm501: Log unimplemented raster operation modes Git-commit: 06cb926aaa51970fc009245bb5e15700c19a56f8 References: bsc#1172385, CVE-2020-12829 The sm501 currently implements only a very limited set of raster operation modes. After this change, unknown raster operation modes are logged so these can be easily spotted. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Bruce Rogers <brogers@suse.com> --- hw/display/sm501.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/hw/display/sm501.c b/hw/display/sm501.c index 48b5b1afd94283471ce74333e9c0..165ec8d31f54d98d4d8bc2214b3a 100644 --- a/hw/display/sm501.c +++ b/hw/display/sm501.c @@ -688,6 +688,8 @@ static void sm501_2d_operation(SM501State *s) int format_flags = (s->twoD_stretch >> 20) & 0x3; int addressing = (s->twoD_stretch >> 16) & 0xF; int rop_mode = (s->twoD_control >> 15) & 0x1; /* 1 for rop2, else rop3 */ + /* 1 if rop2 source is the pattern, otherwise the source is the bitmap */ + int rop2_source_is_pattern = (s->twoD_control >> 14) & 0x1; int rop = s->twoD_control & 0xFF; /* get frame buffer info */ @@ -701,6 +703,27 @@ static void sm501_2d_operation(SM501State *s) abort(); } + if (rop_mode == 0) { + if (rop != 0xcc) { + /* Anything other than plain copies are not supported */ + qemu_log_mask(LOG_UNIMP, "sm501: rop3 mode with rop %x is not " + "supported.\n", rop); + } + } else { + if (rop2_source_is_pattern && rop != 0x5) { + /* For pattern source, we support only inverse dest */ + qemu_log_mask(LOG_UNIMP, "sm501: rop2 source being the pattern and " + "rop %x is not supported.\n", rop); + } else { + if (rop != 0x5 && rop != 0xc) { + /* Anything other than plain copies or inverse dest is not + * supported */ + qemu_log_mask(LOG_UNIMP, "sm501: rop mode %x is not " + "supported.\n", rop); + } + } + } + if ((s->twoD_source_base & 0x08000000) || (s->twoD_destination_base & 0x08000000)) { printf("%s: only local memory is supported.\n", __func__);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor