1. 19 2月, 2020 9 次提交
    • P
      hw/hppa/dino: Do not accept accesses to registers 0x818 and 0x82c · 90e94c05
      Philippe Mathieu-Daudé 提交于
      Register 0x818 is documented as 'undefined', and register
      0x82c is not documented. Refuse their access.
      Acked-by: NHelge Deller <deller@gmx.de>
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Message-Id: <20200218063355.18577-5-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      90e94c05
    • P
      hw/hppa/dino: Fix bitmask for the PCIROR register · c9cbfebf
      Philippe Mathieu-Daudé 提交于
      Only 24 bits of the PCIROR register are documented
      (see pp. 37 of datasheet referenced in this file header).
      Acked-by: NHelge Deller <deller@gmx.de>
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Message-Id: <20200218063355.18577-4-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      c9cbfebf
    • P
      hw/hppa/dino: Fix reg800_keep_bits overrun (CID 1419387 1419393 1419394) · 6e4ed423
      Philippe Mathieu-Daudé 提交于
      Coverity reports:
      
        *** CID 1419387:  Memory - illegal accesses  (OVERRUN)
        /hw/hppa/dino.c: 267 in dino_chip_read_with_attrs()
        261             val = s->ilr & s->imr & s->icr;
        262             break;
        263         case DINO_TOC_ADDR:
        264             val = s->toc_addr;
        265             break;
        266         case DINO_GMASK ... DINO_TLTIM:
        >>>     CID 1419387:  Memory - illegal accesses  (OVERRUN)
        >>>     Overrunning array "s->reg800" of 12 4-byte elements at element index 12 (byte offset 48) using index "(addr - 2048UL) / 4UL" (which evaluates to 12).
        267             val = s->reg800[(addr - DINO_GMASK) / 4];
        268             if (addr == DINO_PAMR) {
        269                 val &= ~0x01;  /* LSB is hardwired to 0 */
        270             }
        271             if (addr == DINO_MLTIM) {
        272                 val &= ~0x07;  /* 3 LSB are hardwired to 0 */
      
        *** CID 1419393:  Memory - corruptions  (OVERRUN)
        /hw/hppa/dino.c: 363 in dino_chip_write_with_attrs()
        357             /* These registers are read-only.  */
        358             break;
        359
        360         case DINO_GMASK ... DINO_TLTIM:
        361             i = (addr - DINO_GMASK) / 4;
        362             val &= reg800_keep_bits[i];
        >>>     CID 1419393:  Memory - corruptions  (OVERRUN)
        >>>     Overrunning array "s->reg800" of 12 4-byte elements at element index 12 (byte offset 48) using index "i" (which evaluates to 12).
        363             s->reg800[i] = val;
        364             break;
        365
        366         default:
        367             /* Controlled by dino_chip_mem_valid above.  */
        368             g_assert_not_reached();
      
        *** CID 1419394:  Memory - illegal accesses  (OVERRUN)
        /hw/hppa/dino.c: 362 in dino_chip_write_with_attrs()
        356         case DINO_IRR1:
        357             /* These registers are read-only.  */
        358             break;
        359
        360         case DINO_GMASK ... DINO_TLTIM:
        361             i = (addr - DINO_GMASK) / 4;
        >>>     CID 1419394:  Memory - illegal accesses  (OVERRUN)
        >>>     Overrunning array "reg800_keep_bits" of 12 4-byte elements at element index 12 (byte offset 48) using index "i" (which evaluates to 12).
        362             val &= reg800_keep_bits[i];
        363             s->reg800[i] = val;
        364             break;
        365
        366         default:
        367             /* Controlled by dino_chip_mem_valid above.  */
      
      Indeed the array should contain 13 entries, the undocumented
      register 0x82c is missing. Fix by increasing the array size
      and adding the missing register.
      
      CID 1419387 can be verified with:
      
        $ echo x 0xfff80830 | hppa-softmmu/qemu-system-hppa -S -monitor stdio -display none
        QEMU 4.2.50 monitor - type 'help' for more information
        (qemu) x 0xfff80830
        qemu/hw/hppa/dino.c:267:15: runtime error: index 12 out of bounds for type 'uint32_t [12]'
        SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /home/phil/source/qemu/hw/hppa/dino.c:267:15 in
        00000000fff80830: 0x00000000
      
      and CID 1419393/1419394 with:
      
        $ echo writeb 0xfff80830 0x69 \
          | hppa-softmmu/qemu-system-hppa -S -accel qtest -qtest stdio -display none
        [I 1581634452.654113] OPENED
        [R +4.105415] writeb 0xfff80830 0x69
        qemu/hw/hppa/dino.c:362:16: runtime error: index 12 out of bounds for type 'const uint32_t [12]'
        SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior qemu/hw/hppa/dino.c:362:16 in
        =================================================================
        ==29607==ERROR: AddressSanitizer: global-buffer-overflow on address 0x5577dae32f30 at pc 0x5577d93f2463 bp 0x7ffd97ea11b0 sp 0x7ffd97ea11a8
        READ of size 4 at 0x5577dae32f30 thread T0
            #0 0x5577d93f2462 in dino_chip_write_with_attrs qemu/hw/hppa/dino.c:362:16
            #1 0x5577d9025664 in memory_region_write_with_attrs_accessor qemu/memory.c:503:12
            #2 0x5577d9024920 in access_with_adjusted_size qemu/memory.c:539:18
            #3 0x5577d9023608 in memory_region_dispatch_write qemu/memory.c:1482:13
            #4 0x5577d8e3177a in flatview_write_continue qemu/exec.c:3166:23
            #5 0x5577d8e20357 in flatview_write qemu/exec.c:3206:14
            #6 0x5577d8e1fef4 in address_space_write qemu/exec.c:3296:18
            #7 0x5577d8e20693 in address_space_rw qemu/exec.c:3306:16
            #8 0x5577d9011595 in qtest_process_command qemu/qtest.c:432:13
            #9 0x5577d900d19f in qtest_process_inbuf qemu/qtest.c:705:9
            #10 0x5577d900ca22 in qtest_read qemu/qtest.c:717:5
            #11 0x5577da8c4254 in qemu_chr_be_write_impl qemu/chardev/char.c:183:9
            #12 0x5577da8c430c in qemu_chr_be_write qemu/chardev/char.c:195:9
            #13 0x5577da8cf587 in fd_chr_read qemu/chardev/char-fd.c:68:9
            #14 0x5577da9836cd in qio_channel_fd_source_dispatch qemu/io/channel-watch.c:84:12
            #15 0x7faf44509ecc in g_main_context_dispatch (/lib64/libglib-2.0.so.0+0x4fecc)
            #16 0x5577dab75f96 in glib_pollfds_poll qemu/util/main-loop.c:219:9
            #17 0x5577dab74797 in os_host_main_loop_wait qemu/util/main-loop.c:242:5
            #18 0x5577dab7435a in main_loop_wait qemu/util/main-loop.c:518:11
            #19 0x5577d9514eb3 in main_loop qemu/vl.c:1682:9
            #20 0x5577d950699d in main qemu/vl.c:4450:5
            #21 0x7faf41a87f42 in __libc_start_main (/lib64/libc.so.6+0x23f42)
            #22 0x5577d8cd4d4d in _start (qemu/build/sanitizer/hppa-softmmu/qemu-system-hppa+0x1256d4d)
      
        0x5577dae32f30 is located 0 bytes to the right of global variable 'reg800_keep_bits' defined in 'qemu/hw/hppa/dino.c:87:23' (0x5577dae32f00) of size 48
        SUMMARY: AddressSanitizer: global-buffer-overflow qemu/hw/hppa/dino.c:362:16 in dino_chip_write_with_attrs
        Shadow bytes around the buggy address:
          0x0aaf7b5be590: 00 f9 f9 f9 f9 f9 f9 f9 00 02 f9 f9 f9 f9 f9 f9
          0x0aaf7b5be5a0: 07 f9 f9 f9 f9 f9 f9 f9 07 f9 f9 f9 f9 f9 f9 f9
          0x0aaf7b5be5b0: 07 f9 f9 f9 f9 f9 f9 f9 00 00 00 00 00 00 00 00
          0x0aaf7b5be5c0: 00 00 00 02 f9 f9 f9 f9 00 00 00 00 00 00 00 00
          0x0aaf7b5be5d0: 00 00 00 00 00 00 00 00 00 00 00 03 f9 f9 f9 f9
        =>0x0aaf7b5be5e0: 00 00 00 00 00 00[f9]f9 f9 f9 f9 f9 00 00 00 00
          0x0aaf7b5be5f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          0x0aaf7b5be600: 00 00 01 f9 f9 f9 f9 f9 00 00 00 00 07 f9 f9 f9
          0x0aaf7b5be610: f9 f9 f9 f9 00 00 00 00 00 00 00 00 00 00 00 00
          0x0aaf7b5be620: 00 00 00 05 f9 f9 f9 f9 00 00 00 00 07 f9 f9 f9
          0x0aaf7b5be630: f9 f9 f9 f9 00 00 f9 f9 f9 f9 f9 f9 07 f9 f9 f9
        Shadow byte legend (one shadow byte represents 8 application bytes):
          Addressable:           00
          Partially addressable: 01 02 03 04 05 06 07
          Heap left redzone:       fa
          Freed heap region:       fd
          Stack left redzone:      f1
          Stack mid redzone:       f2
          Stack right redzone:     f3
          Stack after return:      f5
          Stack use after scope:   f8
          Global redzone:          f9
          Global init order:       f6
          Poisoned by user:        f7
          Container overflow:      fc
          Array cookie:            ac
          Intra object redzone:    bb
          ASan internal:           fe
          Left alloca redzone:     ca
          Right alloca redzone:    cb
          Shadow gap:              cc
        ==29607==ABORTING
      
      Fixes: Covertiy CID 1419387 / 1419393 / 1419394 (commit 18092598)
      Acked-by: NHelge Deller <deller@gmx.de>
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Message-Id: <20200218063355.18577-3-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      6e4ed423
    • P
      hw/hppa/dino: Add comments with register name · 422a2648
      Philippe Mathieu-Daudé 提交于
      Add a comment with the name of each register in the 0x800-0x8ff range.
      Acked-by: NHelge Deller <deller@gmx.de>
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Message-Id: <20200218063355.18577-2-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      422a2648
    • P
      hw/display/artist: Remove dead code (CID 1419388 & 1419389) · eb9b2ee8
      Philippe Mathieu-Daudé 提交于
      Coverity reports:
      
        *** CID 1419388:  Control flow issues  (DEADCODE)
        /hw/display/artist.c: 739 in draw_line_xy()
        733         if (endy < 0) {
        734             endy = 0;
        735         }
        736
        737
        738         if (endx < 0) {
        >>>     CID 1419388:  Control flow issues  (DEADCODE)
        >>>     Execution cannot reach this statement: "return;".
        739             return;
        740         }
        741
        742         if (endy < 0) {
        743             return;
        744         }
      
        *** CID 1419389:  Control flow issues  (DEADCODE)
        /hw/display/artist.c: 743 in draw_line_xy()
        737
        738         if (endx < 0) {
        739             return;
        740         }
        741
        742         if (endy < 0) {
        >>>     CID 1419389:  Control flow issues  (DEADCODE)
        >>>     Execution cannot reach this statement: "return;".
        743             return;
        744         }
        745
        746         trace_artist_draw_line(startx, starty, endx, endy);
        747         draw_line(s, startx, starty, endx, endy, false, -1, -1);
        748     }
      
      Fixes: Covertiy CID 1419388 and 1419389 (commit 4765384c)
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Acked-by: NSven Schnelle <svens@stackframe.org>
      Message-Id: <20200214001303.12873-6-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      eb9b2ee8
    • P
      hw/display/artist: Avoid drawing line when nothing to display · b0f6455f
      Philippe Mathieu-Daudé 提交于
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Message-Id: <20200214001303.12873-5-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      b0f6455f
    • P
      hw/display/artist: Delay some variables initialization · 0814343c
      Philippe Mathieu-Daudé 提交于
      We want to have an early exit path. Delay some initializations
      before the variables are used.
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Acked-by: NSven Schnelle <svens@stackframe.org>
      Message-Id: <20200214001303.12873-4-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      0814343c
    • P
      hw/display/artist: Remove pointless initialization · 6c69f9c4
      Philippe Mathieu-Daudé 提交于
      We are initializating incy inconditionally:
      
          if (y1 <= y2) {
              incy = 1;
          } else {
              incy = -1;
          }
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Acked-by: NSven Schnelle <svens@stackframe.org>
      Message-Id: <20200214001303.12873-3-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      6c69f9c4
    • P
      hw/display/artist: Move trace event to draw_line() · 5646bca3
      Philippe Mathieu-Daudé 提交于
      Instead of emitting the trace event before each call to
      draw_line(), call it once at draw_line() entrance.
      Signed-off-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Acked-by: NSven Schnelle <svens@stackframe.org>
      Message-Id: <20200214001303.12873-2-f4bug@amsat.org>
      Signed-off-by: NRichard Henderson <richard.henderson@linaro.org>
      5646bca3
  2. 17 2月, 2020 17 次提交
  3. 15 2月, 2020 14 次提交