From fabe39dc968dc9a98f87f94d26993c57478e8bb4 Mon Sep 17 00:00:00 2001 From: Roman Vyalov Date: Thu, 7 Nov 2013 13:16:25 +0400 Subject: [PATCH] add files in repository from qemu-1.2.0-24.el6.src.rpm --- ...a-convert-host-errno-values-to-guest.patch | 183 + 0002-target-cris-Fix-buffer-overflow.patch | 35 + ...-fix-missing-errno-codes-for-mingw32.patch | 64 + ...-fcmp-s-d-q-instructions-wrt-excepti.patch | 133 + 0005-target-s390x-fix-style.patch | 1603 +++++ 0006-target-s390x-split-FPU-ops.patch | 1756 +++++ ...t-s390x-split-condition-code-helpers.patch | 1158 +++ 0008-target-s390x-split-integer-helpers.patch | 444 ++ ...et-s390x-split-memory-access-helpers.patch | 2424 +++++++ ...-rename-op_helper.c-to-misc_helper.c.patch | 924 +++ ...et-s390x-avoid-AREG0-for-FPU-helpers.patch | 1218 ++++ ...390x-avoid-AREG0-for-integer-helpers.patch | 202 + ...oid-AREG0-for-condition-code-helpers.patch | 190 + ...t-s390x-avoid-AREG0-for-misc-helpers.patch | 411 ++ ...rget-s390x-switch-to-AREG0-free-mode.patch | 1584 +++++ ...fix-ld-st-with-CONFIG_TCG_PASS_AREG0.patch | 64 + ...et-arm-Fix-potential-buffer-overflow.patch | 47 + ...mize-split-expression-simplification.patch | 57 + ...optimize-simplify-or-xor-r-a-0-cases.patch | 30 + ...cg-optimize-simplify-and-r-a-0-cases.patch | 29 + ...plify-shift-rot-r-0-a-movi-r-0-cases.patch | 48 + ...p-brcond-setcond-arguments-when-poss.patch | 49 + ...ize-add-constant-folding-for-setcond.patch | 114 + ...mize-add-constant-folding-for-brcond.patch | 60 + ...imize-fix-if-else-break-coding-style.patch | 144 + 0026-target-s390x-avoid-cpu_single_env.patch | 1337 ++++ ...arget-lm32-switch-to-AREG0-free-mode.patch | 282 + ...arget-m68k-switch-to-AREG0-free-mode.patch | 502 ++ ...rget-m68k-avoid-using-cpu_single_env.patch | 901 +++ ...-unicore32-switch-to-AREG0-free-mode.patch | 437 ++ 0031-target-arm-convert-void-helpers.patch | 181 + ...target-arm-convert-remaining-helpers.patch | 821 +++ ...-final-conversion-to-AREG0-free-mode.patch | 179 + ...microblaze-switch-to-AREG0-free-mode.patch | 715 ++ ...-target-cris-Avoid-AREG0-for-helpers.patch | 523 ++ ...arget-cris-Switch-to-AREG0-free-mode.patch | 1538 ++++ ...target-sh4-switch-to-AREG0-free-mode.patch | 1060 +++ ...arget-mips-switch-to-AREG0-free-mode.patch | 6336 +++++++++++++++++ ...-CONFIG_TCG_PASS_AREG0-and-dead-code.patch | 1683 +++++ ...86-allow-constants-in-load-store-ops.patch | 114 + ...k-set_label-with-TCG_OPF_BB_END-flag.patch | 53 + 0042-revert-TCG-fix-copy-propagation.patch | 85 + ...et-mips-Set-opn-in-gen_ldst_multiple.patch | 55 + 0044-target-mips-Fix-MIPS_DEBUG.patch | 288 + ...ys-evaluate-debugging-macro-argument.patch | 70 + ...ize-fix-end-of-basic-block-detection.patch | 62 + ...target-xtensa-fix-extui-shift-amount.patch | 57 + ...nsa-don-t-emit-extra-tcg_gen_goto_tb.patch | 35 + 0049-tcg-Introduce-movcond.patch | 333 + 0050-target-alpha-Use-movcond.patch | 160 + 0051-tcg-i386-Implement-movcond.patch | 118 + ...ize-movcond-for-constant-comparisons.patch | 73 + ...e-two-address-commutative-operations.patch | 57 + ...build-with-USE_SOFTFLOAT_STRUCT_TYPE.patch | 192 + 0055-tcg-Fix-USE_DIRECT_JUMP.patch | 35 + 0056-tcg-hppa-Fix-brcond2-and-setcond2.patch | 108 + ...g-hppa-Fix-broken-load-store-helpers.patch | 249 + ...mips-fix-wrong-usage-of-Z-constraint.patch | 65 + ...-tcg-mips-kill-warnings-in-user-mode.patch | 166 + ...-use-TCGArg-or-TCGReg-instead-of-int.patch | 246 + 0061-tcg-mips-don-t-use-global-pointer.patch | 37 + 0062-tcg-mips-use-stack-for-TCG-temps.patch | 47 + 0063-tcg-mips-optimize-brcond-arg-0.patch | 99 + ...optimize-bswap-16-16s-32-on-MIPS32R2.patch | 161 + ...-implement-rotl-rotr-ops-on-MIPS32R2.patch | 92 + ...ips-implement-deposit-op-on-MIPS32R2.patch | 77 + ...ips-implement-movcond-op-on-MIPS32R2.patch | 140 + 0068-tcg-optimize-remove-TCG_TEMP_ANY.patch | 62 + ...mize-check-types-in-copy-propagation.patch | 78 + ...tcg-optimize-rework-copy-progagation.patch | 377 + ...-copy-propagation-for-all-operations.patch | 42 + ...g-optimize-optimize-op-r-a-a-mov-r-a.patch | 31 + ...-optimize-optimize-op-r-a-a-movi-r-0.patch | 46 + ...ther-optimize-brcond-movcond-setcond.patch | 192 + ...fer-the-op-a-a-b-form-for-commutativ.patch | 38 + ...e-ifdef-endif-around-TCGOpcode-tests.patch | 68 + ...ize-add-constant-folding-for-deposit.patch | 46 + ...ocument-tcg_gen_goto_tb-restrictions.patch | 33 + ...CG-helper-functions-with-5-arguments.patch | 57 + 0080-tcg-ppc32-Implement-movcond32.patch | 137 + ...parc-Hack-in-qemu_ld-st64-for-32-bit.patch | 30 + 0082-tcg-sparc-Fix-ADDX-opcode.patch | 27 + ...on-t-MAP_FIXED-on-top-of-the-program.patch | 45 + ...-v9-cpu-always-i.e.-force-v8plus-in-.patch | 286 + ...Fix-qemu_ld-st-to-handle-32-bit-host.patch | 967 +++ 0086-tcg-sparc-Support-GUEST_BASE.patch | 113 + ...Change-AREG0-in-generated-code-to-i0.patch | 51 + ...up-cruft-stemming-from-attempts-to-u.patch | 203 + ...hift-immediates-to-avoid-illegal-ins.patch | 62 + ...cg-sparc-Use-defines-for-temporaries.patch | 275 + ...arc-Add-g-o-registers-to-alloc_order.patch | 44 + ...rc-Fix-and-enable-direct-TB-chaining.patch | 79 + ...ve-branch-destinations-during-retran.patch | 60 + ...t-alpha-Initialize-env-cpu_model_str.patch | 33 + 0095-tcg-mips-fix-MIPS32-R2-detection.patch | 93 + ...-Adjust-descriptions-of-cond-opcodes.patch | 67 + 0097-tcg-i386-fix-build-with-march-i686.patch | 34 + 0098-tcg-Fix-MAX_OPC_PARAM_IARGS.patch | 52 + 0099-tci-Fix-for-AREG0-free-mode.patch | 119 + ...-on-invalid-streaming-cmdline-params.patch | 41 + ...notify-spice-server-on-vm-start-stop.patch | 55 + ...vm-state-change-only-via-spice_serve.patch | 173 + ...n-add-QEVENT_SPICE_MIGRATE_COMPLETED.patch | 93 + ...pice-add-migrated-flag-to-spice-info.patch | 97 + ...mless-migration-option-to-the-comman.patch | 79 + ...he-verbosity-of-spice-section-in-qem.patch | 50 + ...a_io-guest_bug-on-invalid-parameters.patch | 40 + ...qxl-add-QXL_IO_MONITORS_CONFIG_ASYNC.patch | 327 + ...spice-protocol-and-spice-server-vers.patch | 39 + ...doc-of-using-raw-values-with-sendkey.patch | 42 + ...-Fix-potential-NULL-pointer-segfault.patch | 38 + ...-Fix-potential-NULL-pointer-segfault.patch | 40 + ...-version_id-field-for-live-migration.patch | 79 + ...mask-for-Advanced-Error-Interrupt-Me.patch | 40 + ...r-for-ELF-kernels-loaded-with-kernel.patch | 42 + 0116-lan9118-fix-multicast-filtering.patch | 37 + ...r-Fix-reset-CPU-state-initialization.patch | 196 + 0118-Add-MAINTAINERS-entry-for-leon3.patch | 34 + 0119-musicpal-Fix-flash-mapping.patch | 42 + ...d-annotations-to-mark-kvm-guest-memo.patch | 84 + ...wm8750-Fix-potential-buffer-overflow.patch | 43 + ...-buffer-overflow-for-MBAR-read-write.patch | 87 + ...nstead-of-ignoring-it-first-and-rein.patch | 94 + ...empt-to-reconnect-a-TCP-socket-in-se.patch | 43 + ...-force-enable-disable-of-tools-build.patch | 83 + ...do-not-need-to-check-for-babble-them.patch | 58 + ...et-packet-state-to-complete-on-a-nak.patch | 37 + ...sb_ep_find_packet_by_id-helper-funct.patch | 54 + ...he-first-packet-of-a-pipelined-ep-to.patch | 35 + ...-don-t-flush-cache-on-doorbell-rings.patch | 124 + ...-is-not-changed-unexpectedly-by-the-.patch | 86 + ...right-headers-to-reflect-recent-work.patch | 35 + ...i-Properly-cleanup-packets-on-cancel.patch | 29 + ...port-completed-but-not-yet-processed.patch | 52 + ...HCI_ASYNC_FINISHED-first-in-ehci_fre.patch | 50 + 0136-ehci-trace-guest-bugs.patch | 109 + 0137-ehci-add-doorbell-trace-events.patch | 51 + ...dditional-ehci_trace_guest_bug-calls.patch | 88 + ...y-leak-in-handling-of-NAK-ed-packets.patch | 120 + ...e-USB_RET_PROCERR-in-ehci_fill_queue.patch | 57 + ...omment-in-fetchqtd-packet-processing.patch | 37 + ...return-USB_RET_NAK-for-async-handled.patch | 47 + ...delay-handling-of-open-events-to-a-b.patch | 184 + ...r-Get-rid-of-async-struct-get-member.patch | 76 + ...d-of-local-shadow-copy-of-packet-hea.patch | 109 + ...id-of-unused-async-struct-dev-member.patch | 41 + ...to-core-packet-id-and-queue-handling.patch | 502 ++ ...-babble-when-getting-more-bulk-data-.patch | 37 + 0149-Better-name-usb-braille-device.patch | 33 + 0150-usb-audio-fix-usb-version.patch | 32 + ...hci-rip-out-background-transfer-code.patch | 327 + 0152-xhci-drop-buffering.patch | 386 + 0153-xhci-fix-runtime-write-tracepoint.patch | 29 + ...w-bytewise-capability-register-reads.patch | 39 + 0155-qxl-dont-update-invalid-area.patch | 44 + ...mulated-non-async-control-requests-w.patch | 40 + ...l-better-cleanup-for-surface-destroy.patch | 35 + ...-ehci-switch-to-new-style-memory-ops.patch | 370 + ...pts-stopping-when-Interrupt-Threshol.patch | 38 + ...ss-too-much-frames-in-1-timer-tick-v.patch | 60 + 0161-sheepdog-fix-savevm-and-loadvm.patch | 41 + ...ssages-from-static-code-analysis-no-.patch | 67 + ...-block-curl-Fix-wrong-free-statement.patch | 37 + 0164-vdi-Fix-warning-from-clang.patch | 75 + 0165-block-fix-block-tray-status.patch | 36 + ...ci-properly-reset-PxCMD-on-HBA-reset.patch | 64 + ...cryption-password-for-qemu-img-info-.patch | 121 + ...on-t-forget-to-delete-temporary-file.patch | 36 + 0169-hw-qxl-tracing-fixes.patch | 99 + 0170-configure-usbredir-fixes.patch | 36 + ...een-to-0-when-removing-unseen-queue-.patch | 104 + ...-schedule-before-and-after-migration.patch | 70 + ...rt-usb-redir-part-of-commit-93bfef4c.patch | 63 + ...-up-packets-after-one-with-the-SPD-f.patch | 47 + ...rong-type-casts-ins-debug-statements.patch | 37 + ...ror-reported-by-static-code-analysis.patch | 37 + 0177-slirp-improve-TFTP-performance.patch | 106 + ...e-than-65535-blocks-in-TFTP-transfer.patch | 121 + ...lirp-Implement-TFTP-Blocksize-option.patch | 123 + ...MU_PACKED-for-single-elements-of-a-s.patch | 63 + ...-fixes-in-comments-and-documentation.patch | 183 + ...Clean-up-bytes-per-pixel-calculation.patch | 51 + 0183-qapi-Fix-enumeration-typo-error.patch | 54 + ...ix-warning-from-static-code-analysis.patch | 49 + ...missing-symbols-before-PRIu64-in-deb.patch | 54 + ...notify-iothread-after-flushing-queue.patch | 105 + ...e-whenever-can_receive-can-go-from-f.patch | 51 + ...en-flush-queue-when-getting-an-event.patch | 37 + ...network-hang-when-rx-buffers-run-out.patch | 72 + ..._disabled-logic-to-iov-delivery-path.patch | 65 + ...do-not-report-queued-packets-as-sent.patch | 103 + 0192-net-add-netdev-options-to-man-page.patch | 81 + 0193-net-clean-up-usbnet_receive.patch | 80 + ...-net-fix-usbnet_receive-packet-drops.patch | 81 + ...b-packets-if-at-least-one-port-can-r.patch | 51 + ...-send-receive-infrastructure-for-net.patch | 133 + ...EAGAIN-handling-for-net-socket.c-UDP.patch | 45 + ...EAGAIN-handling-for-net-socket.c-TCP.patch | 97 + 0199-configure-fix-seccomp-check.patch | 45 + ...operly-check-if-lrt-and-lm-is-needed.patch | 80 + 0201-Revert-455aa1e08-and-c3767ed0eb.patch | 51 + ...-don-t-call-FD_ISSET-with-negative-f.patch | 59 + ...ory_write_rom-needs-to-do-TB-invalid.patch | 52 + ...ove-soundhw-help-for-non-HAS_AUDIO_C.patch | 43 + ...x_timer-Removed-comma-in-device-name.patch | 54 + ...r-Send-dbg-msgs-to-stderr-not-stdout.patch | 56 + ...inx.h-Error-check-when-setting-links.patch | 54 + ...Fix-a-compile-error-if-debug-enabled.patch | 41 + ...1-fix-vendor-specific-extended-query.patch | 49 + 0210-MAINTAINERS-Add-entry-for-QOM-CPU.patch | 36 + ...-support-SG_IO-also-from-iscsi_ioctl.patch | 59 + ...ed-to-explicitely-call-qemu_notify_e.patch | 39 + ...-scsi-disk-introduce-check_lba_range.patch | 82 + ...-disk-fix-check-for-out-of-range-LBA.patch | 38 + ...QUIRY-data-should-report-HiSup-flag-.patch | 43 + ...ix-warning-from-static-code-analysis.patch | 47 + ...emove-unreachable-code-after-g_error.patch | 40 + ...mu-sockets-Fix-potential-memory-leak.patch | 32 + 0219-cadence_uart-Fix-buffer-overflow.patch | 35 + 0220-lm4549-Fix-buffer-overflow.patch | 47 + 0221-ioh3420-Remove-unreachable-code.patch | 33 + ...x-warning-caused-by-unreachable-code.patch | 65 + ...tialize-curses-when-qemu-is-daemoniz.patch | 90 + ...rate-escape-parameter-in-TTY_STATE_C.patch | 36 + ...e-redundant-null-check-and-replace-f.patch | 42 + ...ompiler-warning-regression-for-MinGW.patch | 68 + ...tandard-instead-of-native-format-str.patch | 52 + ...plementation-of-gmtime_r-localtime_r.patch | 81 + ...e-readonly-and-snapshot-states-acros.patch | 37 + ...orrectly-set-the-keep_read_only-flag.patch | 104 + ...builds-without-any-system-or-user-em.patch | 59 + ...-Refactor-inet_connect_opts-function.patch | 207 + ...nnect-into-inet_connect-blocking-and.patch | 188 + ...handling-in-inet_nonblocking_connect.patch | 369 + 0235-Clear-handler-only-for-valid-fd.patch | 32 + 0236-pl190-fix-read-of-VECTADDR.patch | 51 + ...orrectly-register-GIC-region-when-se.patch | 40 + ...s-Fix-NOR-flash-0-address-and-remove.patch | 56 + ...-of-CPUID-8000_0001-.EDX-is-reserved.patch | 36 + ...Return-correctly-signed-values-from-.patch | 44 + ...st-for-MSR_PR-for-hypercalls-under-K.patch | 66 + 0242-update-VERSION-for-v1.2.1.patch | 20 + ...cp-socket-close-code-in-a-separate-f.patch | 57 + ...hrHandlers-struct-to-initialise-char.patch | 962 +++ ...nable-disable_write_fd_handler-funct.patch | 77 + ...ework-for-a-write-unblocked-callback.patch | 62 + ..._all-to-handle-nonblocking-chardev-w.patch | 173 + ...nix-tcp-backend-to-handle-nonblockin.patch | 82 + ...hrottle-when-host-connection-is-down.patch | 57 + ...nable-port-throttling-when-chardev-i.patch | 50 + 0408-spice-qemu-char.c-add-throttling.patch | 135 + ...mu-char.c-remove-intermediate-buffer.patch | 73 + 0410-usb-redir-Add-flow-control-support.patch | 62 + ...te-callback-if-throttled-chardev-is-.patch | 37 + ...-bus-post_load-send_event-when-vm-is.patch | 130 + ...-bus-replay-guest-open-on-destinatio.patch | 54 + 0500-qxl-disallow-unknown-revisions.patch | 31 + ...ber-of-surfaces-runtime-configurable.patch | 201 + ...nt_capabilities-interface-to-QXLInte.patch | 64 + ...-ifdef-QXL_COMMAND_FLAG_COMPAT_16BPP.patch | 32 + ...switch-to-queue-for-vga-mode-updates.patch | 138 + ...spice-split-qemu_spice_create_update.patch | 94 + 0506-spice-add-screen-mirror.patch | 98 + ...ates-only-for-changed-screen-content.patch | 93 + ...client_capabilities-pre-post-migrate.patch | 41 + 0509-qxl-add-trace-event-for-QXL_IO_LOG.patch | 39 + ...lient-monitor-configuration-via-devi.patch | 181 + ...ways-update-displaysurface-on-resize.patch | 44 + ...io-cleanup-invalid-parameters-handli.patch | 48 + ...fix-range-check-for-rev3-io-commands.patch | 29 + ...on-failure-to-register-qxl-interface.patch | 35 + ...-fix-condition-for-exiting-guest_bug.patch | 29 + ...qxl-qxl_dirty_surfaces-use-uintptr_t.patch | 38 + 0517-spice-raise-requirement-to-0.12.patch | 465 ++ 0518-qxl-set-default-revision-to-4.patch | 33 + ...ert-to-new-libusbredirparser-0.5-API.patch | 232 + ...-Set-ep-max_packet_size-if-available.patch | 39 + ...usbredir_reject_device-helper-functi.patch | 58 + ...-our-peer-has-the-necessary-caps-whe.patch | 43 + ...Enable-pipelining-for-bulk-endpoints.patch | 28 + ...device-lookup-into-xhci_setup_packet.patch | 154 + 0606-xhci-implement-mfindex.patch | 142 + 0607-xhci-iso-xfer-support.patch | 238 + 0608-xhci-trace-cc-codes-in-cleartext.patch | 100 + ...ci-add-trace_usb_xhci_ep_set_dequeue.patch | 39 + 0610-xhci-update-register-layout.patch | 63 + 0611-xhci-update-port-handling.patch | 352 + 0612-usb3-superspeed-descriptors.patch | 64 + 0613-usb3-superspeed-endpoint-companion.patch | 248 + 0614-usb3-bos-decriptor.patch | 215 + 0615-usb-storage-usb3-support.patch | 94 + 0616-xhci-fix-cleanup-msi.patch | 96 + 0617-xhci-rework-interrupt-handling.patch | 117 + 0618-xhci-add-msix-support.patch | 156 + ...register-update-into-xhci_intr_raise.patch | 55 + 0620-xhci-add-XHCIInterrupter.patch | 642 ++ ...i_runtime_-read-write-for-multiple-i.patch | 159 + 0622-xhci-pick-target-interrupter.patch | 93 + 0623-xhci-support-multiple-interrupters.patch | 40 + ...mem_-read-write-dispatcher-functions.patch | 280 + ...-cancelled-packet-code-into-a-generi.patch | 184 + ...an-already_in_flight-packet-id-queue.patch | 119 + ...r-Store-max_packet_size-in-endp_data.patch | 38 + ...-usb-redir-Add-support-for-migration.patch | 429 ++ ...Add-chardev-open-close-debug-logging.patch | 54 + ...rt-usb-redir-part-of-commit-93bfef4c.patch | 35 + ...i-Fix-interrupt-packet-MULT-handling.patch | 131 + ...-pkg-config-check-for-usbredirparser.patch | 49 + ...-usbredir_open_chardev-into-usbredir.patch | 49 + ...make-migration-fail-in-none-seamless.patch | 42 + ...ps-Fix-link-error-with-piix4_pm_init.patch | 30 + 0801-configure-Add-disable-kvm-options.patch | 72 + ...initrd-load-address-to-halfway-throu.patch | 138 + ...ckend-add-function-to-reserved-words.patch | 27 + ...w-qxl-inject-interrupts-in-any-state.patch | 24 + ...Fix-CONFIG_QEMU_HELPERDIR-generation.patch | 31 + 80-kvm.rules | 1 + 99-qemu-guest-agent.rules | 2 + bridge.conf | 1 + ksm.service | 13 + ksm.sysconfig | 4 + ksmctl.c | 77 + ksmtuned | 137 + ksmtuned.conf | 21 + ksmtuned.service | 12 + kvm.modules | 30 + qemu-guest-agent.service | 11 + qemu-kvm-1.2.0.tar.gz | Bin 0 -> 7101344 bytes qemu.binfmt | 17 + qemu.spec | 2660 +++++++ 330 files changed, 59618 insertions(+) create mode 100644 0001-target-xtensa-convert-host-errno-values-to-guest.patch create mode 100644 0002-target-cris-Fix-buffer-overflow.patch create mode 100644 0003-target-xtensa-fix-missing-errno-codes-for-mingw32.patch create mode 100644 0004-target-sparc-fix-fcmp-s-d-q-instructions-wrt-excepti.patch create mode 100644 0005-target-s390x-fix-style.patch create mode 100644 0006-target-s390x-split-FPU-ops.patch create mode 100644 0007-target-s390x-split-condition-code-helpers.patch create mode 100644 0008-target-s390x-split-integer-helpers.patch create mode 100644 0009-target-s390x-split-memory-access-helpers.patch create mode 100644 0010-target-s390x-rename-op_helper.c-to-misc_helper.c.patch create mode 100644 0011-target-s390x-avoid-AREG0-for-FPU-helpers.patch create mode 100644 0012-target-s390x-avoid-AREG0-for-integer-helpers.patch create mode 100644 0013-target-s390x-avoid-AREG0-for-condition-code-helpers.patch create mode 100644 0014-target-s390x-avoid-AREG0-for-misc-helpers.patch create mode 100644 0015-target-s390x-switch-to-AREG0-free-mode.patch create mode 100644 0016-tcg-s390-fix-ld-st-with-CONFIG_TCG_PASS_AREG0.patch create mode 100644 0017-target-arm-Fix-potential-buffer-overflow.patch create mode 100644 0018-tcg-optimize-split-expression-simplification.patch create mode 100644 0019-tcg-optimize-simplify-or-xor-r-a-0-cases.patch create mode 100644 0020-tcg-optimize-simplify-and-r-a-0-cases.patch create mode 100644 0021-tcg-optimize-simplify-shift-rot-r-0-a-movi-r-0-cases.patch create mode 100644 0022-tcg-optimize-swap-brcond-setcond-arguments-when-poss.patch create mode 100644 0023-tcg-optimize-add-constant-folding-for-setcond.patch create mode 100644 0024-tcg-optimize-add-constant-folding-for-brcond.patch create mode 100644 0025-tcg-optimize-fix-if-else-break-coding-style.patch create mode 100644 0026-target-s390x-avoid-cpu_single_env.patch create mode 100644 0027-target-lm32-switch-to-AREG0-free-mode.patch create mode 100644 0028-target-m68k-switch-to-AREG0-free-mode.patch create mode 100644 0029-target-m68k-avoid-using-cpu_single_env.patch create mode 100644 0030-target-unicore32-switch-to-AREG0-free-mode.patch create mode 100644 0031-target-arm-convert-void-helpers.patch create mode 100644 0032-target-arm-convert-remaining-helpers.patch create mode 100644 0033-target-arm-final-conversion-to-AREG0-free-mode.patch create mode 100644 0034-target-microblaze-switch-to-AREG0-free-mode.patch create mode 100644 0035-target-cris-Avoid-AREG0-for-helpers.patch create mode 100644 0036-target-cris-Switch-to-AREG0-free-mode.patch create mode 100644 0037-target-sh4-switch-to-AREG0-free-mode.patch create mode 100644 0038-target-mips-switch-to-AREG0-free-mode.patch create mode 100644 0039-Remove-unused-CONFIG_TCG_PASS_AREG0-and-dead-code.patch create mode 100644 0040-tcg-i386-allow-constants-in-load-store-ops.patch create mode 100644 0041-tcg-mark-set_label-with-TCG_OPF_BB_END-flag.patch create mode 100644 0042-revert-TCG-fix-copy-propagation.patch create mode 100644 0043-target-mips-Set-opn-in-gen_ldst_multiple.patch create mode 100644 0044-target-mips-Fix-MIPS_DEBUG.patch create mode 100644 0045-target-mips-Always-evaluate-debugging-macro-argument.patch create mode 100644 0046-tcg-optimize-fix-end-of-basic-block-detection.patch create mode 100644 0047-target-xtensa-fix-extui-shift-amount.patch create mode 100644 0048-target-xtensa-don-t-emit-extra-tcg_gen_goto_tb.patch create mode 100644 0049-tcg-Introduce-movcond.patch create mode 100644 0050-target-alpha-Use-movcond.patch create mode 100644 0051-tcg-i386-Implement-movcond.patch create mode 100644 0052-tcg-Optimize-movcond-for-constant-comparisons.patch create mode 100644 0053-tcg-Optimize-two-address-commutative-operations.patch create mode 100644 0054-gdbstub-sh4-fix-build-with-USE_SOFTFLOAT_STRUCT_TYPE.patch create mode 100644 0055-tcg-Fix-USE_DIRECT_JUMP.patch create mode 100644 0056-tcg-hppa-Fix-brcond2-and-setcond2.patch create mode 100644 0057-tcg-hppa-Fix-broken-load-store-helpers.patch create mode 100644 0058-tcg-mips-fix-wrong-usage-of-Z-constraint.patch create mode 100644 0059-tcg-mips-kill-warnings-in-user-mode.patch create mode 100644 0060-tcg-mips-use-TCGArg-or-TCGReg-instead-of-int.patch create mode 100644 0061-tcg-mips-don-t-use-global-pointer.patch create mode 100644 0062-tcg-mips-use-stack-for-TCG-temps.patch create mode 100644 0063-tcg-mips-optimize-brcond-arg-0.patch create mode 100644 0064-tcg-mips-optimize-bswap-16-16s-32-on-MIPS32R2.patch create mode 100644 0065-tcg-mips-implement-rotl-rotr-ops-on-MIPS32R2.patch create mode 100644 0066-tcg-mips-implement-deposit-op-on-MIPS32R2.patch create mode 100644 0067-tcg-mips-implement-movcond-op-on-MIPS32R2.patch create mode 100644 0068-tcg-optimize-remove-TCG_TEMP_ANY.patch create mode 100644 0069-tcg-optimize-check-types-in-copy-propagation.patch create mode 100644 0070-tcg-optimize-rework-copy-progagation.patch create mode 100644 0071-tcg-optimize-do-copy-propagation-for-all-operations.patch create mode 100644 0072-tcg-optimize-optimize-op-r-a-a-mov-r-a.patch create mode 100644 0073-tcg-optimize-optimize-op-r-a-a-movi-r-0.patch create mode 100644 0074-tcg-optimize-further-optimize-brcond-movcond-setcond.patch create mode 100644 0075-tcg-optimize-prefer-the-op-a-a-b-form-for-commutativ.patch create mode 100644 0076-tcg-remove-ifdef-endif-around-TCGOpcode-tests.patch create mode 100644 0077-tcg-optimize-add-constant-folding-for-deposit.patch create mode 100644 0078-tcg-README-document-tcg_gen_goto_tb-restrictions.patch create mode 100644 0079-w64-Fix-TCG-helper-functions-with-5-arguments.patch create mode 100644 0080-tcg-ppc32-Implement-movcond32.patch create mode 100644 0081-tcg-sparc-Hack-in-qemu_ld-st64-for-32-bit.patch create mode 100644 0082-tcg-sparc-Fix-ADDX-opcode.patch create mode 100644 0083-tcg-sparc-Don-t-MAP_FIXED-on-top-of-the-program.patch create mode 100644 0084-tcg-sparc-Assume-v9-cpu-always-i.e.-force-v8plus-in-.patch create mode 100644 0085-tcg-sparc-Fix-qemu_ld-st-to-handle-32-bit-host.patch create mode 100644 0086-tcg-sparc-Support-GUEST_BASE.patch create mode 100644 0087-tcg-sparc-Change-AREG0-in-generated-code-to-i0.patch create mode 100644 0088-tcg-sparc-Clean-up-cruft-stemming-from-attempts-to-u.patch create mode 100644 0089-tcg-sparc-Mask-shift-immediates-to-avoid-illegal-ins.patch create mode 100644 0090-tcg-sparc-Use-defines-for-temporaries.patch create mode 100644 0091-tcg-sparc-Add-g-o-registers-to-alloc_order.patch create mode 100644 0092-tcg-sparc-Fix-and-enable-direct-TB-chaining.patch create mode 100644 0093-tcg-sparc-Preserve-branch-destinations-during-retran.patch create mode 100644 0094-target-alpha-Initialize-env-cpu_model_str.patch create mode 100644 0095-tcg-mips-fix-MIPS32-R2-detection.patch create mode 100644 0096-tcg-Adjust-descriptions-of-cond-opcodes.patch create mode 100644 0097-tcg-i386-fix-build-with-march-i686.patch create mode 100644 0098-tcg-Fix-MAX_OPC_PARAM_IARGS.patch create mode 100644 0099-tci-Fix-for-AREG0-free-mode.patch create mode 100644 0100-spice-abort-on-invalid-streaming-cmdline-params.patch create mode 100644 0101-spice-notify-spice-server-on-vm-start-stop.patch create mode 100644 0102-spice-notify-on-vm-state-change-only-via-spice_serve.patch create mode 100644 0103-spice-migration-add-QEVENT_SPICE_MIGRATE_COMPLETED.patch create mode 100644 0104-spice-add-migrated-flag-to-spice-info.patch create mode 100644 0105-spice-adding-seamless-migration-option-to-the-comman.patch create mode 100644 0106-spice-increase-the-verbosity-of-spice-section-in-qem.patch create mode 100644 0107-qxl-update_area_io-guest_bug-on-invalid-parameters.patch create mode 100644 0108-qxl-add-QXL_IO_MONITORS_CONFIG_ASYNC.patch create mode 100644 0109-configure-print-spice-protocol-and-spice-server-vers.patch create mode 100644 0110-fix-doc-of-using-raw-values-with-sendkey.patch create mode 100644 0111-qapi-Fix-potential-NULL-pointer-segfault.patch create mode 100644 0112-json-parser-Fix-potential-NULL-pointer-segfault.patch create mode 100644 0113-pcie-drop-version_id-field-for-live-migration.patch create mode 100644 0114-pcie_aer-clear-cmask-for-Advanced-Error-Interrupt-Me.patch create mode 100644 0115-fix-entry-pointer-for-ELF-kernels-loaded-with-kernel.patch create mode 100644 0116-lan9118-fix-multicast-filtering.patch create mode 100644 0117-MIPS-user-Fix-reset-CPU-state-initialization.patch create mode 100644 0118-Add-MAINTAINERS-entry-for-leon3.patch create mode 100644 0119-musicpal-Fix-flash-mapping.patch create mode 100644 0120-qemu-Use-valgrind-annotations-to-mark-kvm-guest-memo.patch create mode 100644 0121-hw-wm8750-Fix-potential-buffer-overflow.patch create mode 100644 0122-hw-mcf5206-Fix-buffer-overflow-for-MBAR-read-write.patch create mode 100644 0123-use-libexecdir-instead-of-ignoring-it-first-and-rein.patch create mode 100644 0124-socket-don-t-attempt-to-reconnect-a-TCP-socket-in-se.patch create mode 100644 0125-Add-ability-to-force-enable-disable-of-tools-build.patch create mode 100644 0126-usb-controllers-do-not-need-to-check-for-babble-them.patch create mode 100644 0127-usb-core-Don-t-set-packet-state-to-complete-on-a-nak.patch create mode 100644 0128-usb-core-Add-a-usb_ep_find_packet_by_id-helper-funct.patch create mode 100644 0129-usb-core-Allow-the-first-packet-of-a-pipelined-ep-to.patch create mode 100644 0130-Revert-ehci-don-t-flush-cache-on-doorbell-rings.patch create mode 100644 0131-ehci-Validate-qh-is-not-changed-unexpectedly-by-the-.patch create mode 100644 0132-ehci-Update-copyright-headers-to-reflect-recent-work.patch create mode 100644 0133-ehci-Properly-cleanup-packets-on-cancel.patch create mode 100644 0134-ehci-Properly-report-completed-but-not-yet-processed.patch create mode 100644 0135-ehci-check-for-EHCI_ASYNC_FINISHED-first-in-ehci_fre.patch create mode 100644 0136-ehci-trace-guest-bugs.patch create mode 100644 0137-ehci-add-doorbell-trace-events.patch create mode 100644 0138-ehci-Add-some-additional-ehci_trace_guest_bug-calls.patch create mode 100644 0139-ehci-Fix-memory-leak-in-handling-of-NAK-ed-packets.patch create mode 100644 0140-ehci-Handle-USB_RET_PROCERR-in-ehci_fill_queue.patch create mode 100644 0141-ehci-Correct-a-comment-in-fetchqtd-packet-processing.patch create mode 100644 0142-usb-redir-Never-return-USB_RET_NAK-for-async-handled.patch create mode 100644 0143-usb-redir-Don-t-delay-handling-of-open-events-to-a-b.patch create mode 100644 0144-usb-redir-Get-rid-of-async-struct-get-member.patch create mode 100644 0145-usb-redir-Get-rid-of-local-shadow-copy-of-packet-hea.patch create mode 100644 0146-usb-redir-Get-rid-of-unused-async-struct-dev-member.patch create mode 100644 0147-usb-redir-Move-to-core-packet-id-and-queue-handling.patch create mode 100644 0148-usb-redir-Return-babble-when-getting-more-bulk-data-.patch create mode 100644 0149-Better-name-usb-braille-device.patch create mode 100644 0150-usb-audio-fix-usb-version.patch create mode 100644 0151-xhci-rip-out-background-transfer-code.patch create mode 100644 0152-xhci-drop-buffering.patch create mode 100644 0153-xhci-fix-runtime-write-tracepoint.patch create mode 100644 0154-xhci-allow-bytewise-capability-register-reads.patch create mode 100644 0155-qxl-dont-update-invalid-area.patch create mode 100644 0156-usb-host-allow-emulated-non-async-control-requests-w.patch create mode 100644 0157-qxl-better-cleanup-for-surface-destroy.patch create mode 100644 0158-ehci-switch-to-new-style-memory-ops.patch create mode 100644 0159-ehci-Fix-interrupts-stopping-when-Interrupt-Threshol.patch create mode 100644 0160-ehci-Don-t-process-too-much-frames-in-1-timer-tick-v.patch create mode 100644 0161-sheepdog-fix-savevm-and-loadvm.patch create mode 100644 0162-ide-Fix-error-messages-from-static-code-analysis-no-.patch create mode 100644 0163-block-curl-Fix-wrong-free-statement.patch create mode 100644 0164-vdi-Fix-warning-from-clang.patch create mode 100644 0165-block-fix-block-tray-status.patch create mode 100644 0166-ahci-properly-reset-PxCMD-on-HBA-reset.patch create mode 100644 0167-Don-t-require-encryption-password-for-qemu-img-info-.patch create mode 100644 0168-block-Don-t-forget-to-delete-temporary-file.patch create mode 100644 0169-hw-qxl-tracing-fixes.patch create mode 100644 0170-configure-usbredir-fixes.patch create mode 100644 0171-ehci-Don-t-set-seen-to-0-when-removing-unseen-queue-.patch create mode 100644 0172-ehci-Walk-async-schedule-before-and-after-migration.patch create mode 100644 0173-usb-redir-Revert-usb-redir-part-of-commit-93bfef4c.patch create mode 100644 0174-uhci-Don-t-queue-up-packets-after-one-with-the-SPD-f.patch create mode 100644 0175-slirp-Remove-wrong-type-casts-ins-debug-statements.patch create mode 100644 0176-slirp-Fix-error-reported-by-static-code-analysis.patch create mode 100644 0177-slirp-improve-TFTP-performance.patch create mode 100644 0178-slirp-Handle-more-than-65535-blocks-in-TFTP-transfer.patch create mode 100644 0179-slirp-Implement-TFTP-Blocksize-option.patch create mode 100644 0180-srp-Don-t-use-QEMU_PACKED-for-single-elements-of-a-s.patch create mode 100644 0181-Spelling-fixes-in-comments-and-documentation.patch create mode 100644 0182-console-Clean-up-bytes-per-pixel-calculation.patch create mode 100644 0183-qapi-Fix-enumeration-typo-error.patch create mode 100644 0184-kvm-Fix-warning-from-static-code-analysis.patch create mode 100644 0185-arch_init.c-add-missing-symbols-before-PRIu64-in-deb.patch create mode 100644 0186-net-notify-iothread-after-flushing-queue.patch create mode 100644 0187-e1000-flush-queue-whenever-can_receive-can-go-from-f.patch create mode 100644 0188-xen-flush-queue-when-getting-an-event.patch create mode 100644 0189-eepro100-Fix-network-hang-when-rx-buffers-run-out.patch create mode 100644 0190-net-add-receive_disabled-logic-to-iov-delivery-path.patch create mode 100644 0191-net-do-not-report-queued-packets-as-sent.patch create mode 100644 0192-net-add-netdev-options-to-man-page.patch create mode 100644 0193-net-clean-up-usbnet_receive.patch create mode 100644 0194-net-fix-usbnet_receive-packet-drops.patch create mode 100644 0195-net-broadcast-hub-packets-if-at-least-one-port-can-r.patch create mode 100644 0196-net-asynchronous-send-receive-infrastructure-for-net.patch create mode 100644 0197-net-EAGAIN-handling-for-net-socket.c-UDP.patch create mode 100644 0198-net-EAGAIN-handling-for-net-socket.c-TCP.patch create mode 100644 0199-configure-fix-seccomp-check.patch create mode 100644 0200-configure-properly-check-if-lrt-and-lm-is-needed.patch create mode 100644 0201-Revert-455aa1e08-and-c3767ed0eb.patch create mode 100644 0202-qemu-char-BUGFIX-don-t-call-FD_ISSET-with-negative-f.patch create mode 100644 0203-cpu_physical_memory_write_rom-needs-to-do-TB-invalid.patch create mode 100644 0204-arch_init.c-Improve-soundhw-help-for-non-HAS_AUDIO_C.patch create mode 100644 0205-xilinx_timer-Removed-comma-in-device-name.patch create mode 100644 0206-xilinx_timer-Send-dbg-msgs-to-stderr-not-stdout.patch create mode 100644 0207-xilinx.h-Error-check-when-setting-links.patch create mode 100644 0208-xilinx_timer-Fix-a-compile-error-if-debug-enabled.patch create mode 100644 0209-pflash_cfi01-fix-vendor-specific-extended-query.patch create mode 100644 0210-MAINTAINERS-Add-entry-for-QOM-CPU.patch create mode 100644 0211-iSCSI-We-need-to-support-SG_IO-also-from-iscsi_ioctl.patch create mode 100644 0212-iSCSI-We-dont-need-to-explicitely-call-qemu_notify_e.patch create mode 100644 0213-scsi-disk-introduce-check_lba_range.patch create mode 100644 0214-scsi-disk-fix-check-for-out-of-range-LBA.patch create mode 100644 0215-SCSI-Standard-INQUIRY-data-should-report-HiSup-flag-.patch create mode 100644 0216-audio-Fix-warning-from-static-code-analysis.patch create mode 100644 0217-qemu-ga-Remove-unreachable-code-after-g_error.patch create mode 100644 0218-qemu-sockets-Fix-potential-memory-leak.patch create mode 100644 0219-cadence_uart-Fix-buffer-overflow.patch create mode 100644 0220-lm4549-Fix-buffer-overflow.patch create mode 100644 0221-ioh3420-Remove-unreachable-code.patch create mode 100644 0222-pflash_cfi01-Fix-warning-caused-by-unreachable-code.patch create mode 100644 0223-curses-don-t-initialize-curses-when-qemu-is-daemoniz.patch create mode 100644 0224-TextConsole-saturate-escape-parameter-in-TTY_STATE_C.patch create mode 100644 0225-linux-user-Remove-redundant-null-check-and-replace-f.patch create mode 100644 0226-net-socket-Fix-compiler-warning-regression-for-MinGW.patch create mode 100644 0227-w32-Always-use-standard-instead-of-native-format-str.patch create mode 100644 0228-w32-Add-implementation-of-gmtime_r-localtime_r.patch create mode 100644 0229-blockdev-preserve-readonly-and-snapshot-states-acros.patch create mode 100644 0230-block-correctly-set-the-keep_read_only-flag.patch create mode 100644 0231-configure-Allow-builds-without-any-system-or-user-em.patch create mode 100644 0232-Refactor-inet_connect_opts-function.patch create mode 100644 0233-Separate-inet_connect-into-inet_connect-blocking-and.patch create mode 100644 0234-Fix-address-handling-in-inet_nonblocking_connect.patch create mode 100644 0235-Clear-handler-only-for-valid-fd.patch create mode 100644 0236-pl190-fix-read-of-VECTADDR.patch create mode 100644 0237-hw-armv7m_nvic-Correctly-register-GIC-region-when-se.patch create mode 100644 0238-Versatile-Express-Fix-NOR-flash-0-address-and-remove.patch create mode 100644 0239-i386-kvm-bit-10-of-CPUID-8000_0001-.EDX-is-reserved.patch create mode 100644 0240-fpu-softfloat.c-Return-correctly-signed-values-from-.patch create mode 100644 0241-pseries-Don-t-test-for-MSR_PR-for-hypercalls-under-K.patch create mode 100644 0242-update-VERSION-for-v1.2.1.patch create mode 100644 0400-char-Split-out-tcp-socket-close-code-in-a-separate-f.patch create mode 100644 0401-char-Add-a-QemuChrHandlers-struct-to-initialise-char.patch create mode 100644 0402-iohandlers-Add-enable-disable_write_fd_handler-funct.patch create mode 100644 0403-char-Add-framework-for-a-write-unblocked-callback.patch create mode 100644 0404-char-Update-send_all-to-handle-nonblocking-chardev-w.patch create mode 100644 0405-char-Equip-the-unix-tcp-backend-to-handle-nonblockin.patch create mode 100644 0406-char-Throttle-when-host-connection-is-down.patch create mode 100644 0407-virtio-console-Enable-port-throttling-when-chardev-i.patch create mode 100644 0408-spice-qemu-char.c-add-throttling.patch create mode 100644 0409-spice-qemu-char.c-remove-intermediate-buffer.patch create mode 100644 0410-usb-redir-Add-flow-control-support.patch create mode 100644 0412-char-Disable-write-callback-if-throttled-chardev-is-.patch create mode 100644 0413-hw-virtio-serial-bus-post_load-send_event-when-vm-is.patch create mode 100644 0414-hw-virtio-serial-bus-replay-guest-open-on-destinatio.patch create mode 100644 0500-qxl-disallow-unknown-revisions.patch create mode 100644 0501-spice-make-number-of-surfaces-runtime-configurable.patch create mode 100644 0502-qxl-Add-set_client_capabilities-interface-to-QXLInte.patch create mode 100644 0503-Remove-ifdef-QXL_COMMAND_FLAG_COMPAT_16BPP.patch create mode 100644 0504-spice-switch-to-queue-for-vga-mode-updates.patch create mode 100644 0505-spice-split-qemu_spice_create_update.patch create mode 100644 0506-spice-add-screen-mirror.patch create mode 100644 0507-spice-send-updates-only-for-changed-screen-content.patch create mode 100644 0508-qxl-Ignore-set_client_capabilities-pre-post-migrate.patch create mode 100644 0509-qxl-add-trace-event-for-QXL_IO_LOG.patch create mode 100644 0510-hw-qxl-support-client-monitor-configuration-via-devi.patch create mode 100644 0511-qxl-always-update-displaysurface-on-resize.patch create mode 100644 0512-qxl-update_area_io-cleanup-invalid-parameters-handli.patch create mode 100644 0513-qxl-fix-range-check-for-rev3-io-commands.patch create mode 100644 0514-hw-qxl-exit-on-failure-to-register-qxl-interface.patch create mode 100644 0515-hw-qxl-fix-condition-for-exiting-guest_bug.patch create mode 100644 0516-hw-qxl-qxl_dirty_surfaces-use-uintptr_t.patch create mode 100644 0517-spice-raise-requirement-to-0.12.patch create mode 100644 0518-qxl-set-default-revision-to-4.patch create mode 100644 0600-usb-redir-Convert-to-new-libusbredirparser-0.5-API.patch create mode 100644 0601-usb-redir-Set-ep-max_packet_size-if-available.patch create mode 100644 0602-usb-redir-Add-a-usbredir_reject_device-helper-functi.patch create mode 100644 0603-usb-redir-Ensure-our-peer-has-the-necessary-caps-whe.patch create mode 100644 0604-usb-redir-Enable-pipelining-for-bulk-endpoints.patch create mode 100644 0605-xhci-move-device-lookup-into-xhci_setup_packet.patch create mode 100644 0606-xhci-implement-mfindex.patch create mode 100644 0607-xhci-iso-xfer-support.patch create mode 100644 0608-xhci-trace-cc-codes-in-cleartext.patch create mode 100644 0609-xhci-add-trace_usb_xhci_ep_set_dequeue.patch create mode 100644 0610-xhci-update-register-layout.patch create mode 100644 0611-xhci-update-port-handling.patch create mode 100644 0612-usb3-superspeed-descriptors.patch create mode 100644 0613-usb3-superspeed-endpoint-companion.patch create mode 100644 0614-usb3-bos-decriptor.patch create mode 100644 0615-usb-storage-usb3-support.patch create mode 100644 0616-xhci-fix-cleanup-msi.patch create mode 100644 0617-xhci-rework-interrupt-handling.patch create mode 100644 0618-xhci-add-msix-support.patch create mode 100644 0619-xhci-move-register-update-into-xhci_intr_raise.patch create mode 100644 0620-xhci-add-XHCIInterrupter.patch create mode 100644 0621-xhci-prepare-xhci_runtime_-read-write-for-multiple-i.patch create mode 100644 0622-xhci-pick-target-interrupter.patch create mode 100644 0623-xhci-support-multiple-interrupters.patch create mode 100644 0624-xhci-kill-xhci_mem_-read-write-dispatcher-functions.patch create mode 100644 0625-usb-redir-Change-cancelled-packet-code-into-a-generi.patch create mode 100644 0626-usb-redir-Add-an-already_in_flight-packet-id-queue.patch create mode 100644 0627-usb-redir-Store-max_packet_size-in-endp_data.patch create mode 100644 0628-usb-redir-Add-support-for-migration.patch create mode 100644 0629-usb-redir-Add-chardev-open-close-debug-logging.patch create mode 100644 0630-usb-redir-Revert-usb-redir-part-of-commit-93bfef4c.patch create mode 100644 0631-ehci-Fix-interrupt-packet-MULT-handling.patch create mode 100644 0632-usb-redir-Adjust-pkg-config-check-for-usbredirparser.patch create mode 100644 0633-usb-redir-Change-usbredir_open_chardev-into-usbredir.patch create mode 100644 0634-usb-redir-Don-t-make-migration-fail-in-none-seamless.patch create mode 100644 0800-mips-Fix-link-error-with-piix4_pm_init.patch create mode 100644 0801-configure-Add-disable-kvm-options.patch create mode 100644 0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch create mode 100644 0803-dtrace-backend-add-function-to-reserved-words.patch create mode 100644 0804-wip-hw-qxl-inject-interrupts-in-any-state.patch create mode 100644 0805-configure-Fix-CONFIG_QEMU_HELPERDIR-generation.patch create mode 100644 80-kvm.rules create mode 100644 99-qemu-guest-agent.rules create mode 100644 bridge.conf create mode 100644 ksm.service create mode 100644 ksm.sysconfig create mode 100644 ksmctl.c create mode 100644 ksmtuned create mode 100644 ksmtuned.conf create mode 100644 ksmtuned.service create mode 100644 kvm.modules create mode 100644 qemu-guest-agent.service create mode 100644 qemu-kvm-1.2.0.tar.gz create mode 100644 qemu.binfmt create mode 100644 qemu.spec diff --git a/0001-target-xtensa-convert-host-errno-values-to-guest.patch b/0001-target-xtensa-convert-host-errno-values-to-guest.patch new file mode 100644 index 0000000..7eb51fe --- /dev/null +++ b/0001-target-xtensa-convert-host-errno-values-to-guest.patch @@ -0,0 +1,183 @@ +From 707f294ca28977968fb85bf36f10c6b37b16f557 Mon Sep 17 00:00:00 2001 +From: Max Filippov +Date: Wed, 29 Aug 2012 23:54:25 +0400 +Subject: [PATCH] target-xtensa: convert host errno values to guest + +Guest errno values are taken from the newlib. Convert only those errno +values that can be returned from used system calls. + +Signed-off-by: Max Filippov +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + target-xtensa/xtensa-semi.c | 106 ++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 98 insertions(+), 8 deletions(-) + +diff --git a/target-xtensa/xtensa-semi.c b/target-xtensa/xtensa-semi.c +index 6d001c2..e745bef 100644 +--- a/target-xtensa/xtensa-semi.c ++++ b/target-xtensa/xtensa-semi.c +@@ -54,6 +54,96 @@ enum { + SELECT_ONE_EXCEPT = 3, + }; + ++enum { ++ TARGET_EPERM = 1, ++ TARGET_ENOENT = 2, ++ TARGET_ESRCH = 3, ++ TARGET_EINTR = 4, ++ TARGET_EIO = 5, ++ TARGET_ENXIO = 6, ++ TARGET_E2BIG = 7, ++ TARGET_ENOEXEC = 8, ++ TARGET_EBADF = 9, ++ TARGET_ECHILD = 10, ++ TARGET_EAGAIN = 11, ++ TARGET_ENOMEM = 12, ++ TARGET_EACCES = 13, ++ TARGET_EFAULT = 14, ++ TARGET_ENOTBLK = 15, ++ TARGET_EBUSY = 16, ++ TARGET_EEXIST = 17, ++ TARGET_EXDEV = 18, ++ TARGET_ENODEV = 19, ++ TARGET_ENOTDIR = 20, ++ TARGET_EISDIR = 21, ++ TARGET_EINVAL = 22, ++ TARGET_ENFILE = 23, ++ TARGET_EMFILE = 24, ++ TARGET_ENOTTY = 25, ++ TARGET_ETXTBSY = 26, ++ TARGET_EFBIG = 27, ++ TARGET_ENOSPC = 28, ++ TARGET_ESPIPE = 29, ++ TARGET_EROFS = 30, ++ TARGET_EMLINK = 31, ++ TARGET_EPIPE = 32, ++ TARGET_EDOM = 33, ++ TARGET_ERANGE = 34, ++ TARGET_ENOSYS = 88, ++ TARGET_ELOOP = 92, ++}; ++ ++static uint32_t errno_h2g(int host_errno) ++{ ++ static const uint32_t guest_errno[] = { ++ [EPERM] = TARGET_EPERM, ++ [ENOENT] = TARGET_ENOENT, ++ [ESRCH] = TARGET_ESRCH, ++ [EINTR] = TARGET_EINTR, ++ [EIO] = TARGET_EIO, ++ [ENXIO] = TARGET_ENXIO, ++ [E2BIG] = TARGET_E2BIG, ++ [ENOEXEC] = TARGET_ENOEXEC, ++ [EBADF] = TARGET_EBADF, ++ [ECHILD] = TARGET_ECHILD, ++ [EAGAIN] = TARGET_EAGAIN, ++ [ENOMEM] = TARGET_ENOMEM, ++ [EACCES] = TARGET_EACCES, ++ [EFAULT] = TARGET_EFAULT, ++ [ENOTBLK] = TARGET_ENOTBLK, ++ [EBUSY] = TARGET_EBUSY, ++ [EEXIST] = TARGET_EEXIST, ++ [EXDEV] = TARGET_EXDEV, ++ [ENODEV] = TARGET_ENODEV, ++ [ENOTDIR] = TARGET_ENOTDIR, ++ [EISDIR] = TARGET_EISDIR, ++ [EINVAL] = TARGET_EINVAL, ++ [ENFILE] = TARGET_ENFILE, ++ [EMFILE] = TARGET_EMFILE, ++ [ENOTTY] = TARGET_ENOTTY, ++ [ETXTBSY] = TARGET_ETXTBSY, ++ [EFBIG] = TARGET_EFBIG, ++ [ENOSPC] = TARGET_ENOSPC, ++ [ESPIPE] = TARGET_ESPIPE, ++ [EROFS] = TARGET_EROFS, ++ [EMLINK] = TARGET_EMLINK, ++ [EPIPE] = TARGET_EPIPE, ++ [EDOM] = TARGET_EDOM, ++ [ERANGE] = TARGET_ERANGE, ++ [ENOSYS] = TARGET_ENOSYS, ++ [ELOOP] = TARGET_ELOOP, ++ }; ++ ++ if (host_errno == 0) { ++ return 0; ++ } else if (host_errno > 0 && host_errno < ARRAY_SIZE(guest_errno) && ++ guest_errno[host_errno]) { ++ return guest_errno[host_errno]; ++ } else { ++ return TARGET_EINVAL; ++ } ++} ++ + void HELPER(simcall)(CPUXtensaState *env) + { + uint32_t *regs = env->regs; +@@ -87,14 +177,14 @@ void HELPER(simcall)(CPUXtensaState *env) + regs[2] = is_write ? + write(fd, buf, io_sz) : + read(fd, buf, io_sz); +- regs[3] = errno; ++ regs[3] = errno_h2g(errno); + cpu_physical_memory_unmap(buf, sz, is_write, sz); + if (regs[2] == -1) { + break; + } + } else { + regs[2] = -1; +- regs[3] = EINVAL; ++ regs[3] = TARGET_EINVAL; + break; + } + } +@@ -117,10 +207,10 @@ void HELPER(simcall)(CPUXtensaState *env) + + if (rc == 0 && i < ARRAY_SIZE(name)) { + regs[2] = open(name, regs[4], regs[5]); +- regs[3] = errno; ++ regs[3] = errno_h2g(errno); + } else { + regs[2] = -1; +- regs[3] = EINVAL; ++ regs[3] = TARGET_EINVAL; + } + } + break; +@@ -130,13 +220,13 @@ void HELPER(simcall)(CPUXtensaState *env) + regs[2] = regs[3] = 0; + } else { + regs[2] = close(regs[3]); +- regs[3] = errno; ++ regs[3] = errno_h2g(errno); + } + break; + + case TARGET_SYS_lseek: + regs[2] = lseek(regs[3], (off_t)(int32_t)regs[4], regs[5]); +- regs[3] = errno; ++ regs[3] = errno_h2g(errno); + break; + + case TARGET_SYS_select_one: +@@ -163,7 +253,7 @@ void HELPER(simcall)(CPUXtensaState *env) + rq == SELECT_ONE_WRITE ? &fdset : NULL, + rq == SELECT_ONE_EXCEPT ? &fdset : NULL, + target_tv ? &tv : NULL); +- regs[3] = errno; ++ regs[3] = errno_h2g(errno); + } + break; + +@@ -219,7 +309,7 @@ void HELPER(simcall)(CPUXtensaState *env) + default: + qemu_log("%s(%d): not implemented\n", __func__, regs[2]); + regs[2] = -1; +- regs[3] = ENOSYS; ++ regs[3] = TARGET_ENOSYS; + break; + } + } +-- +1.7.12.1 + diff --git a/0002-target-cris-Fix-buffer-overflow.patch b/0002-target-cris-Fix-buffer-overflow.patch new file mode 100644 index 0000000..79640b1 --- /dev/null +++ b/0002-target-cris-Fix-buffer-overflow.patch @@ -0,0 +1,35 @@ +From 8057ac10e8cba3acb89c11c94f04967306e55a9f Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Fri, 7 Sep 2012 22:36:08 +0200 +Subject: [PATCH] target-cris: Fix buffer overflow + +Report from smatch: + +target-cris/translate.c:3464 cpu_dump_state(32) error: + buffer overflow 'env->sregs' 4 <= 255 + +sregs is declared 'uint32_t sregs[4][16]', so the first index must be +less than 4 or ARRAY_SIZE(env->sregs). + +Signed-off-by: Stefan Weil +Signed-off-by: Michael Roth +--- + target-cris/translate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/target-cris/translate.c b/target-cris/translate.c +index 1ad9ec7..ad31877 100644 +--- a/target-cris/translate.c ++++ b/target-cris/translate.c +@@ -3458,7 +3458,7 @@ void cpu_dump_state (CPUCRISState *env, FILE *f, fprintf_function cpu_fprintf, + } + srs = env->pregs[PR_SRS]; + cpu_fprintf(f, "\nsupport function regs bank %x:\n", srs); +- if (srs < 256) { ++ if (srs < ARRAY_SIZE(env->sregs)) { + for (i = 0; i < 16; i++) { + cpu_fprintf(f, "s%2.2d=%8.8x ", + i, env->sregs[srs][i]); +-- +1.7.12.1 + diff --git a/0003-target-xtensa-fix-missing-errno-codes-for-mingw32.patch b/0003-target-xtensa-fix-missing-errno-codes-for-mingw32.patch new file mode 100644 index 0000000..b5fdd18 --- /dev/null +++ b/0003-target-xtensa-fix-missing-errno-codes-for-mingw32.patch @@ -0,0 +1,64 @@ +From 33e25a4a6c6dc7632b15ee50637d33b4c3cf729e Mon Sep 17 00:00:00 2001 +From: Max Filippov +Date: Thu, 6 Sep 2012 04:36:46 +0400 +Subject: [PATCH] target-xtensa: fix missing errno codes for mingw32 + +Put the following errno value mappings under #ifdef: + +xtensa-semi.c: In function 'errno_h2g': +xtensa-semi.c:113: error: 'ENOTBLK' undeclared (first use in this function) +xtensa-semi.c:113: error: (Each undeclared identifier is reported only once +xtensa-semi.c:113: error: for each function it appears in.) +xtensa-semi.c:113: error: array index in initializer not of integer type +xtensa-semi.c:113: error: (near initialization for 'guest_errno') +xtensa-semi.c:124: error: 'ETXTBSY' undeclared (first use in this function) +xtensa-semi.c:124: error: array index in initializer not of integer type +xtensa-semi.c:124: error: (near initialization for 'guest_errno') +xtensa-semi.c:134: error: 'ELOOP' undeclared (first use in this function) +xtensa-semi.c:134: error: array index in initializer not of integer type +xtensa-semi.c:134: error: (near initialization for 'guest_errno') + +Signed-off-by: Max Filippov +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + target-xtensa/xtensa-semi.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/target-xtensa/xtensa-semi.c b/target-xtensa/xtensa-semi.c +index e745bef..52be07a 100644 +--- a/target-xtensa/xtensa-semi.c ++++ b/target-xtensa/xtensa-semi.c +@@ -110,7 +110,9 @@ static uint32_t errno_h2g(int host_errno) + [ENOMEM] = TARGET_ENOMEM, + [EACCES] = TARGET_EACCES, + [EFAULT] = TARGET_EFAULT, ++#ifdef ENOTBLK + [ENOTBLK] = TARGET_ENOTBLK, ++#endif + [EBUSY] = TARGET_EBUSY, + [EEXIST] = TARGET_EEXIST, + [EXDEV] = TARGET_EXDEV, +@@ -121,7 +123,9 @@ static uint32_t errno_h2g(int host_errno) + [ENFILE] = TARGET_ENFILE, + [EMFILE] = TARGET_EMFILE, + [ENOTTY] = TARGET_ENOTTY, ++#ifdef ETXTBSY + [ETXTBSY] = TARGET_ETXTBSY, ++#endif + [EFBIG] = TARGET_EFBIG, + [ENOSPC] = TARGET_ENOSPC, + [ESPIPE] = TARGET_ESPIPE, +@@ -131,7 +135,9 @@ static uint32_t errno_h2g(int host_errno) + [EDOM] = TARGET_EDOM, + [ERANGE] = TARGET_ERANGE, + [ENOSYS] = TARGET_ENOSYS, ++#ifdef ELOOP + [ELOOP] = TARGET_ELOOP, ++#endif + }; + + if (host_errno == 0) { +-- +1.7.12.1 + diff --git a/0004-target-sparc-fix-fcmp-s-d-q-instructions-wrt-excepti.patch b/0004-target-sparc-fix-fcmp-s-d-q-instructions-wrt-excepti.patch new file mode 100644 index 0000000..e6095aa --- /dev/null +++ b/0004-target-sparc-fix-fcmp-s-d-q-instructions-wrt-excepti.patch @@ -0,0 +1,133 @@ +From 5e955b895d4a92cdc49c7b4e76284483d49aa4b8 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 7 Sep 2012 17:13:28 +0200 +Subject: [PATCH] target-sparc: fix fcmp{s,d,q} instructions wrt exception + +fcmp{s,d,q} instructions are supposed to ignore quiet NaN (contrary to +the fcmpe{s,d,q} instructions), but the current code is wrongly setting +the NV exception in that case. Moreover the current code is duplicated: +first the arguments are checked for NaN to generate an exception, and +later in case the comparison is unordered (which can only happens if one +of the argument is a NaN), the same check is done to generate an +exception. + +Fix that by calling clear_float_exceptions() followed by +check_ieee_exceptions() as for the other floating point instructions. +Use the _compare_quiet functions for fcmp{s,d,q} and the _compare ones +for fcmpe{s,d,q}. Simplify the flag setting by not clearing a flag that +is set the line just below. + +This fix allows the math glibc testsuite to pass. + +Cc: Blue Swirl +Signed-off-by: Aurelien Jarno +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + target-sparc/fop_helper.c | 67 +++++++++++++++++++---------------------------- + 1 file changed, 27 insertions(+), 40 deletions(-) + +diff --git a/target-sparc/fop_helper.c b/target-sparc/fop_helper.c +index 9c64ef8..f4b62a5 100644 +--- a/target-sparc/fop_helper.c ++++ b/target-sparc/fop_helper.c +@@ -334,34 +334,28 @@ void helper_fsqrtq(CPUSPARCState *env) + } + + #define GEN_FCMP(name, size, reg1, reg2, FS, E) \ +- void glue(helper_, name) (CPUSPARCState *env) \ ++ void glue(helper_, name) (CPUSPARCState *env) \ + { \ +- env->fsr &= FSR_FTT_NMASK; \ +- if (E && (glue(size, _is_any_nan)(reg1) || \ +- glue(size, _is_any_nan)(reg2)) && \ +- (env->fsr & FSR_NVM)) { \ +- env->fsr |= FSR_NVC; \ +- env->fsr |= FSR_FTT_IEEE_EXCP; \ +- helper_raise_exception(env, TT_FP_EXCP); \ ++ int ret; \ ++ clear_float_exceptions(env); \ ++ if (E) { \ ++ ret = glue(size, _compare)(reg1, reg2, &env->fp_status); \ ++ } else { \ ++ ret = glue(size, _compare_quiet)(reg1, reg2, \ ++ &env->fp_status); \ + } \ +- switch (glue(size, _compare) (reg1, reg2, &env->fp_status)) { \ ++ check_ieee_exceptions(env); \ ++ switch (ret) { \ + case float_relation_unordered: \ +- if ((env->fsr & FSR_NVM)) { \ +- env->fsr |= FSR_NVC; \ +- env->fsr |= FSR_FTT_IEEE_EXCP; \ +- helper_raise_exception(env, TT_FP_EXCP); \ +- } else { \ +- env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ +- env->fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \ +- env->fsr |= FSR_NVA; \ +- } \ ++ env->fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \ ++ env->fsr |= FSR_NVA; \ + break; \ + case float_relation_less: \ +- env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ ++ env->fsr &= ~(FSR_FCC1) << FS; \ + env->fsr |= FSR_FCC0 << FS; \ + break; \ + case float_relation_greater: \ +- env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ ++ env->fsr &= ~(FSR_FCC0) << FS; \ + env->fsr |= FSR_FCC1 << FS; \ + break; \ + default: \ +@@ -370,34 +364,27 @@ void helper_fsqrtq(CPUSPARCState *env) + } \ + } + #define GEN_FCMP_T(name, size, FS, E) \ +- void glue(helper_, name)(CPUSPARCState *env, size src1, size src2) \ ++ void glue(helper_, name)(CPUSPARCState *env, size src1, size src2) \ + { \ +- env->fsr &= FSR_FTT_NMASK; \ +- if (E && (glue(size, _is_any_nan)(src1) || \ +- glue(size, _is_any_nan)(src2)) && \ +- (env->fsr & FSR_NVM)) { \ +- env->fsr |= FSR_NVC; \ +- env->fsr |= FSR_FTT_IEEE_EXCP; \ +- helper_raise_exception(env, TT_FP_EXCP); \ ++ int ret; \ ++ clear_float_exceptions(env); \ ++ if (E) { \ ++ ret = glue(size, _compare)(src1, src2, &env->fp_status); \ ++ } else { \ ++ ret = glue(size, _compare_quiet)(src1, src2, \ ++ &env->fp_status); \ + } \ +- switch (glue(size, _compare) (src1, src2, &env->fp_status)) { \ ++ check_ieee_exceptions(env); \ ++ switch (ret) { \ + case float_relation_unordered: \ +- if ((env->fsr & FSR_NVM)) { \ +- env->fsr |= FSR_NVC; \ +- env->fsr |= FSR_FTT_IEEE_EXCP; \ +- helper_raise_exception(env, TT_FP_EXCP); \ +- } else { \ +- env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ +- env->fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \ +- env->fsr |= FSR_NVA; \ +- } \ ++ env->fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \ + break; \ + case float_relation_less: \ +- env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ ++ env->fsr &= ~(FSR_FCC1 << FS); \ + env->fsr |= FSR_FCC0 << FS; \ + break; \ + case float_relation_greater: \ +- env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ ++ env->fsr &= ~(FSR_FCC0 << FS); \ + env->fsr |= FSR_FCC1 << FS; \ + break; \ + default: \ +-- +1.7.12.1 + diff --git a/0005-target-s390x-fix-style.patch b/0005-target-s390x-fix-style.patch new file mode 100644 index 0000000..0f0a63e --- /dev/null +++ b/0005-target-s390x-fix-style.patch @@ -0,0 +1,1603 @@ +From 985b8342244b5f76ed1df75eb8757d6feff30316 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:30 +0000 +Subject: [PATCH] target-s390x: fix style + +Before splitting op_helper.c and helper.c in the next patches, +fix style issues. No functional changes. + +Replace also GCC specific __FUNCTION__ with +standard __func__. + +Don't init static variable (cpu_s390x_init:inited) with 0. + +Signed-off-by: Blue Swirl +Signed-off-by: Alexander Graf +Signed-off-by: Michael Roth +--- + target-s390x/helper.c | 96 ++++++----- + target-s390x/op_helper.c | 438 +++++++++++++++++++++++++++-------------------- + 2 files changed, 297 insertions(+), 237 deletions(-) + +diff --git a/target-s390x/helper.c b/target-s390x/helper.c +index d0a1180..d98e6d9 100644 +--- a/target-s390x/helper.c ++++ b/target-s390x/helper.c +@@ -74,7 +74,7 @@ S390CPU *cpu_s390x_init(const char *cpu_model) + { + S390CPU *cpu; + CPUS390XState *env; +- static int inited = 0; ++ static int inited; + + cpu = S390_CPU(object_new(TYPE_S390_CPU)); + env = &cpu->env; +@@ -91,25 +91,27 @@ S390CPU *cpu_s390x_init(const char *cpu_model) + + #if defined(CONFIG_USER_ONLY) + +-void do_interrupt (CPUS390XState *env) ++void do_interrupt(CPUS390XState *env) + { + env->exception_index = -1; + } + +-int cpu_s390x_handle_mmu_fault (CPUS390XState *env, target_ulong address, int rw, +- int mmu_idx) ++int cpu_s390x_handle_mmu_fault(CPUS390XState *env, target_ulong address, ++ int rw, int mmu_idx) + { +- /* fprintf(stderr,"%s: address 0x%lx rw %d mmu_idx %d\n", +- __FUNCTION__, address, rw, mmu_idx); */ ++ /* fprintf(stderr, "%s: address 0x%lx rw %d mmu_idx %d\n", ++ __func__, address, rw, mmu_idx); */ + env->exception_index = EXCP_ADDR; +- env->__excp_addr = address; /* FIXME: find out how this works on a real machine */ ++ /* FIXME: find out how this works on a real machine */ ++ env->__excp_addr = address; + return 1; + } + + #else /* !CONFIG_USER_ONLY */ + + /* Ensure to exit the TB after this call! */ +-static void trigger_pgm_exception(CPUS390XState *env, uint32_t code, uint32_t ilc) ++static void trigger_pgm_exception(CPUS390XState *env, uint32_t code, ++ uint32_t ilc) + { + env->exception_index = EXCP_PGM; + env->int_pgm_code = code; +@@ -138,19 +140,20 @@ static int trans_bits(CPUS390XState *env, uint64_t mode) + return bits; + } + +-static void trigger_prot_fault(CPUS390XState *env, target_ulong vaddr, uint64_t mode) ++static void trigger_prot_fault(CPUS390XState *env, target_ulong vaddr, ++ uint64_t mode) + { + int ilc = ILC_LATER_INC_2; + int bits = trans_bits(env, mode) | 4; + +- DPRINTF("%s: vaddr=%016" PRIx64 " bits=%d\n", __FUNCTION__, vaddr, bits); ++ DPRINTF("%s: vaddr=%016" PRIx64 " bits=%d\n", __func__, vaddr, bits); + + stq_phys(env->psa + offsetof(LowCore, trans_exc_code), vaddr | bits); + trigger_pgm_exception(env, PGM_PROTECTION, ilc); + } + +-static void trigger_page_fault(CPUS390XState *env, target_ulong vaddr, uint32_t type, +- uint64_t asc, int rw) ++static void trigger_page_fault(CPUS390XState *env, target_ulong vaddr, ++ uint32_t type, uint64_t asc, int rw) + { + int ilc = ILC_LATER; + int bits = trans_bits(env, asc); +@@ -160,26 +163,26 @@ static void trigger_page_fault(CPUS390XState *env, target_ulong vaddr, uint32_t + ilc = 2; + } + +- DPRINTF("%s: vaddr=%016" PRIx64 " bits=%d\n", __FUNCTION__, vaddr, bits); ++ DPRINTF("%s: vaddr=%016" PRIx64 " bits=%d\n", __func__, vaddr, bits); + + stq_phys(env->psa + offsetof(LowCore, trans_exc_code), vaddr | bits); + trigger_pgm_exception(env, type, ilc); + } + +-static int mmu_translate_asce(CPUS390XState *env, target_ulong vaddr, uint64_t asc, +- uint64_t asce, int level, target_ulong *raddr, +- int *flags, int rw) ++static int mmu_translate_asce(CPUS390XState *env, target_ulong vaddr, ++ uint64_t asc, uint64_t asce, int level, ++ target_ulong *raddr, int *flags, int rw) + { + uint64_t offs = 0; + uint64_t origin; + uint64_t new_asce; + +- PTE_DPRINTF("%s: 0x%" PRIx64 "\n", __FUNCTION__, asce); ++ PTE_DPRINTF("%s: 0x%" PRIx64 "\n", __func__, asce); + + if (((level != _ASCE_TYPE_SEGMENT) && (asce & _REGION_ENTRY_INV)) || + ((level == _ASCE_TYPE_SEGMENT) && (asce & _SEGMENT_ENTRY_INV))) { + /* XXX different regions have different faults */ +- DPRINTF("%s: invalid region\n", __FUNCTION__); ++ DPRINTF("%s: invalid region\n", __func__); + trigger_page_fault(env, vaddr, PGM_SEGMENT_TRANS, asc, rw); + return -1; + } +@@ -222,7 +225,7 @@ static int mmu_translate_asce(CPUS390XState *env, target_ulong vaddr, uint64_t a + + new_asce = ldq_phys(origin + offs); + PTE_DPRINTF("%s: 0x%" PRIx64 " + 0x%" PRIx64 " => 0x%016" PRIx64 "\n", +- __FUNCTION__, origin, offs, new_asce); ++ __func__, origin, offs, new_asce); + + if (level != _ASCE_TYPE_SEGMENT) { + /* yet another region */ +@@ -232,7 +235,7 @@ static int mmu_translate_asce(CPUS390XState *env, target_ulong vaddr, uint64_t a + + /* PTE */ + if (new_asce & _PAGE_INVALID) { +- DPRINTF("%s: PTE=0x%" PRIx64 " invalid\n", __FUNCTION__, new_asce); ++ DPRINTF("%s: PTE=0x%" PRIx64 " invalid\n", __func__, new_asce); + trigger_page_fault(env, vaddr, PGM_PAGE_TRANS, asc, rw); + return -1; + } +@@ -243,13 +246,14 @@ static int mmu_translate_asce(CPUS390XState *env, target_ulong vaddr, uint64_t a + + *raddr = new_asce & _ASCE_ORIGIN; + +- PTE_DPRINTF("%s: PTE=0x%" PRIx64 "\n", __FUNCTION__, new_asce); ++ PTE_DPRINTF("%s: PTE=0x%" PRIx64 "\n", __func__, new_asce); + + return 0; + } + +-static int mmu_translate_asc(CPUS390XState *env, target_ulong vaddr, uint64_t asc, +- target_ulong *raddr, int *flags, int rw) ++static int mmu_translate_asc(CPUS390XState *env, target_ulong vaddr, ++ uint64_t asc, target_ulong *raddr, int *flags, ++ int rw) + { + uint64_t asce = 0; + int level, new_level; +@@ -257,15 +261,15 @@ static int mmu_translate_asc(CPUS390XState *env, target_ulong vaddr, uint64_t as + + switch (asc) { + case PSW_ASC_PRIMARY: +- PTE_DPRINTF("%s: asc=primary\n", __FUNCTION__); ++ PTE_DPRINTF("%s: asc=primary\n", __func__); + asce = env->cregs[1]; + break; + case PSW_ASC_SECONDARY: +- PTE_DPRINTF("%s: asc=secondary\n", __FUNCTION__); ++ PTE_DPRINTF("%s: asc=secondary\n", __func__); + asce = env->cregs[7]; + break; + case PSW_ASC_HOME: +- PTE_DPRINTF("%s: asc=home\n", __FUNCTION__); ++ PTE_DPRINTF("%s: asc=home\n", __func__); + asce = env->cregs[13]; + break; + } +@@ -276,8 +280,7 @@ static int mmu_translate_asc(CPUS390XState *env, target_ulong vaddr, uint64_t as + case _ASCE_TYPE_REGION2: + if (vaddr & 0xffe0000000000000ULL) { + DPRINTF("%s: vaddr doesn't fit 0x%16" PRIx64 +- " 0xffe0000000000000ULL\n", __FUNCTION__, +- vaddr); ++ " 0xffe0000000000000ULL\n", __func__, vaddr); + trigger_page_fault(env, vaddr, PGM_TRANS_SPEC, asc, rw); + return -1; + } +@@ -285,8 +288,7 @@ static int mmu_translate_asc(CPUS390XState *env, target_ulong vaddr, uint64_t as + case _ASCE_TYPE_REGION3: + if (vaddr & 0xfffffc0000000000ULL) { + DPRINTF("%s: vaddr doesn't fit 0x%16" PRIx64 +- " 0xfffffc0000000000ULL\n", __FUNCTION__, +- vaddr); ++ " 0xfffffc0000000000ULL\n", __func__, vaddr); + trigger_page_fault(env, vaddr, PGM_TRANS_SPEC, asc, rw); + return -1; + } +@@ -294,8 +296,7 @@ static int mmu_translate_asc(CPUS390XState *env, target_ulong vaddr, uint64_t as + case _ASCE_TYPE_SEGMENT: + if (vaddr & 0xffffffff80000000ULL) { + DPRINTF("%s: vaddr doesn't fit 0x%16" PRIx64 +- " 0xffffffff80000000ULL\n", __FUNCTION__, +- vaddr); ++ " 0xffffffff80000000ULL\n", __func__, vaddr); + trigger_page_fault(env, vaddr, PGM_TRANS_SPEC, asc, rw); + return -1; + } +@@ -358,7 +359,7 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc, + break; + } + +-out: ++ out: + /* Convert real address -> absolute address */ + if (*raddr < 0x2000) { + *raddr = *raddr + env->psa; +@@ -378,18 +379,18 @@ out: + return r; + } + +-int cpu_s390x_handle_mmu_fault (CPUS390XState *env, target_ulong _vaddr, int rw, +- int mmu_idx) ++int cpu_s390x_handle_mmu_fault(CPUS390XState *env, target_ulong orig_vaddr, ++ int rw, int mmu_idx) + { + uint64_t asc = env->psw.mask & PSW_MASK_ASC; + target_ulong vaddr, raddr; + int prot; + + DPRINTF("%s: address 0x%" PRIx64 " rw %d mmu_idx %d\n", +- __FUNCTION__, _vaddr, rw, mmu_idx); ++ __func__, _vaddr, rw, mmu_idx); + +- _vaddr &= TARGET_PAGE_MASK; +- vaddr = _vaddr; ++ orig_vaddr &= TARGET_PAGE_MASK; ++ vaddr = orig_vaddr; + + /* 31-Bit mode */ + if (!(env->psw.mask & PSW_MASK_64)) { +@@ -403,22 +404,23 @@ int cpu_s390x_handle_mmu_fault (CPUS390XState *env, target_ulong _vaddr, int rw, + + /* check out of RAM access */ + if (raddr > (ram_size + virtio_size)) { +- DPRINTF("%s: aaddr %" PRIx64 " > ram_size %" PRIx64 "\n", __FUNCTION__, ++ DPRINTF("%s: aaddr %" PRIx64 " > ram_size %" PRIx64 "\n", __func__, + (uint64_t)aaddr, (uint64_t)ram_size); + trigger_pgm_exception(env, PGM_ADDRESSING, ILC_LATER); + return 1; + } + +- DPRINTF("%s: set tlb %" PRIx64 " -> %" PRIx64 " (%x)\n", __FUNCTION__, ++ DPRINTF("%s: set tlb %" PRIx64 " -> %" PRIx64 " (%x)\n", __func__, + (uint64_t)vaddr, (uint64_t)raddr, prot); + +- tlb_set_page(env, _vaddr, raddr, prot, ++ tlb_set_page(env, orig_vaddr, raddr, prot, + mmu_idx, TARGET_PAGE_SIZE); + + return 0; + } + +-target_phys_addr_t cpu_get_phys_page_debug(CPUS390XState *env, target_ulong vaddr) ++target_phys_addr_t cpu_get_phys_page_debug(CPUS390XState *env, ++ target_ulong vaddr) + { + target_ulong raddr; + int prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; +@@ -509,7 +511,7 @@ static void do_program_interrupt(CPUS390XState *env) + break; + } + +- qemu_log("%s: code=0x%x ilc=%d\n", __FUNCTION__, env->int_pgm_code, ilc); ++ qemu_log("%s: code=0x%x ilc=%d\n", __func__, env->int_pgm_code, ilc); + + lowcore = cpu_physical_memory_map(env->psa, &len, 1); + +@@ -522,7 +524,7 @@ static void do_program_interrupt(CPUS390XState *env) + + cpu_physical_memory_unmap(lowcore, len, 1, len); + +- DPRINTF("%s: %x %x %" PRIx64 " %" PRIx64 "\n", __FUNCTION__, ++ DPRINTF("%s: %x %x %" PRIx64 " %" PRIx64 "\n", __func__, + env->int_pgm_code, ilc, env->psw.mask, + env->psw.addr); + +@@ -565,15 +567,15 @@ static void do_ext_interrupt(CPUS390XState *env) + env->pending_int &= ~INTERRUPT_EXT; + } + +- DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __FUNCTION__, ++ DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __func__, + env->psw.mask, env->psw.addr); + + load_psw(env, mask, addr); + } + +-void do_interrupt (CPUS390XState *env) ++void do_interrupt(CPUS390XState *env) + { +- qemu_log("%s: %d at pc=%" PRIx64 "\n", __FUNCTION__, env->exception_index, ++ qemu_log("%s: %d at pc=%" PRIx64 "\n", __func__, env->exception_index, + env->psw.addr); + + s390_add_running_cpu(env); +diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c +index abc35dd..195e93e 100644 +--- a/target-s390x/op_helper.c ++++ b/target-s390x/op_helper.c +@@ -31,13 +31,13 @@ + #include + #endif + +-#if !defined (CONFIG_USER_ONLY) ++#if !defined(CONFIG_USER_ONLY) + #include "sysemu.h" + #endif + + /*****************************************************************************/ + /* Softmmu support */ +-#if !defined (CONFIG_USER_ONLY) ++#if !defined(CONFIG_USER_ONLY) + #include "softmmu_exec.h" + + #define MMUSUFFIX _mmu +@@ -95,7 +95,7 @@ void tlb_fill(CPUS390XState *env1, target_ulong addr, int is_write, int mmu_idx, + /* raise an exception */ + void HELPER(exception)(uint32_t excp) + { +- HELPER_LOG("%s: exception %d\n", __FUNCTION__, excp); ++ HELPER_LOG("%s: exception %d\n", __func__, excp); + env->exception_index = excp; + cpu_loop_exit(env); + } +@@ -164,7 +164,7 @@ uint32_t HELPER(nc)(uint32_t l, uint64_t dest, uint64_t src) + uint32_t cc = 0; + + HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", +- __FUNCTION__, l, dest, src); ++ __func__, l, dest, src); + for (i = 0; i <= l; i++) { + x = ldub(dest + i) & ldub(src + i); + if (x) { +@@ -183,7 +183,7 @@ uint32_t HELPER(xc)(uint32_t l, uint64_t dest, uint64_t src) + uint32_t cc = 0; + + HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", +- __FUNCTION__, l, dest, src); ++ __func__, l, dest, src); + + #ifndef CONFIG_USER_ONLY + /* xor with itself is the same as memset(0) */ +@@ -217,7 +217,7 @@ uint32_t HELPER(oc)(uint32_t l, uint64_t dest, uint64_t src) + uint32_t cc = 0; + + HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", +- __FUNCTION__, l, dest, src); ++ __func__, l, dest, src); + for (i = 0; i <= l; i++) { + x = ldub(dest + i) | ldub(src + i); + if (x) { +@@ -236,7 +236,7 @@ void HELPER(mvc)(uint32_t l, uint64_t dest, uint64_t src) + uint32_t l_64 = (l + 1) / 8; + + HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", +- __FUNCTION__, l, dest, src); ++ __func__, l, dest, src); + + #ifndef CONFIG_USER_ONLY + if ((l > 32) && +@@ -278,10 +278,11 @@ void HELPER(mvc)(uint32_t l, uint64_t dest, uint64_t src) + uint32_t HELPER(clc)(uint32_t l, uint64_t s1, uint64_t s2) + { + int i; +- unsigned char x,y; ++ unsigned char x, y; + uint32_t cc; ++ + HELPER_LOG("%s l %d s1 %" PRIx64 " s2 %" PRIx64 "\n", +- __FUNCTION__, l, s1, s2); ++ __func__, l, s1, s2); + for (i = 0; i <= l; i++) { + x = ldub(s1 + i); + y = ldub(s2 + i); +@@ -295,7 +296,7 @@ uint32_t HELPER(clc)(uint32_t l, uint64_t s1, uint64_t s2) + } + } + cc = 0; +-done: ++ done: + HELPER_LOG("\n"); + return cc; + } +@@ -303,9 +304,10 @@ done: + /* compare logical under mask */ + uint32_t HELPER(clm)(uint32_t r1, uint32_t mask, uint64_t addr) + { +- uint8_t r,d; ++ uint8_t r, d; + uint32_t cc; +- HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%" PRIx64 "\n", __FUNCTION__, r1, ++ ++ HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%" PRIx64 "\n", __func__, r1, + mask, addr); + cc = 0; + while (mask) { +@@ -313,7 +315,7 @@ uint32_t HELPER(clm)(uint32_t r1, uint32_t mask, uint64_t addr) + d = ldub(addr); + r = (r1 & 0xff000000UL) >> 24; + HELPER_LOG("mask 0x%x %02x/%02x (0x%" PRIx64 ") ", mask, r, d, +- addr); ++ addr); + if (r < d) { + cc = 1; + break; +@@ -334,7 +336,8 @@ uint32_t HELPER(clm)(uint32_t r1, uint32_t mask, uint64_t addr) + void HELPER(stcm)(uint32_t r1, uint32_t mask, uint64_t addr) + { + uint8_t r; +- HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%lx\n", __FUNCTION__, r1, mask, ++ ++ HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%lx\n", __func__, r1, mask, + addr); + while (mask) { + if (mask & 8) { +@@ -355,6 +358,7 @@ void HELPER(mlg)(uint32_t r1, uint64_t v2) + #if HOST_LONG_BITS == 64 && defined(__GNUC__) + /* assuming 64-bit hosts have __uint128_t */ + __uint128_t res = (__uint128_t)env->regs[r1 + 1]; ++ + res *= (__uint128_t)v2; + env->regs[r1] = (uint64_t)(res >> 64); + env->regs[r1 + 1] = (uint64_t)res; +@@ -370,18 +374,18 @@ void HELPER(dlg)(uint32_t r1, uint64_t v2) + + if (!env->regs[r1]) { + /* 64 -> 64/64 case */ +- env->regs[r1] = env->regs[r1+1] % divisor; +- env->regs[r1+1] = env->regs[r1+1] / divisor; ++ env->regs[r1] = env->regs[r1 + 1] % divisor; ++ env->regs[r1 + 1] = env->regs[r1 + 1] / divisor; + return; + } else { +- + #if HOST_LONG_BITS == 64 && defined(__GNUC__) + /* assuming 64-bit hosts have __uint128_t */ + __uint128_t dividend = (((__uint128_t)env->regs[r1]) << 64) | +- (env->regs[r1+1]); ++ (env->regs[r1 + 1]); + __uint128_t quotient = dividend / divisor; +- env->regs[r1+1] = quotient; + __uint128_t remainder = dividend % divisor; ++ ++ env->regs[r1 + 1] = quotient; + env->regs[r1] = remainder; + #else + /* 32-bit hosts would need special wrapper functionality - just abort if +@@ -431,7 +435,7 @@ uint32_t HELPER(srst)(uint32_t c, uint32_t r1, uint32_t r2) + uint64_t str = get_address_31fix(r2); + uint64_t end = get_address_31fix(r1); + +- HELPER_LOG("%s: c %d *r1 0x%" PRIx64 " *r2 0x%" PRIx64 "\n", __FUNCTION__, ++ HELPER_LOG("%s: c %d *r1 0x%" PRIx64 " *r2 0x%" PRIx64 "\n", __func__, + c, env->regs[r1], env->regs[r2]); + + for (i = str; i != end; i++) { +@@ -452,11 +456,12 @@ uint32_t HELPER(clst)(uint32_t c, uint32_t r1, uint32_t r2) + uint64_t s2 = get_address_31fix(r2); + uint8_t v1, v2; + uint32_t cc; ++ + c = c & 0xff; + #ifdef CONFIG_USER_ONLY + if (!c) { + HELPER_LOG("%s: comparing '%s' and '%s'\n", +- __FUNCTION__, (char*)g2h(s1), (char*)g2h(s2)); ++ __func__, (char *)g2h(s1), (char *)g2h(s2)); + } + #endif + for (;;) { +@@ -501,10 +506,11 @@ void HELPER(mvst)(uint32_t c, uint32_t r1, uint32_t r2) + uint64_t dest = get_address_31fix(r1); + uint64_t src = get_address_31fix(r2); + uint8_t v; ++ + c = c & 0xff; + #ifdef CONFIG_USER_ONLY + if (!c) { +- HELPER_LOG("%s: copy '%s' to 0x%lx\n", __FUNCTION__, (char*)g2h(src), ++ HELPER_LOG("%s: copy '%s' to 0x%lx\n", __func__, (char *)g2h(src), + dest); + } + #endif +@@ -526,6 +532,7 @@ uint32_t HELPER(csg)(uint32_t r1, uint64_t a2, uint32_t r3) + /* FIXME: locking? */ + uint32_t cc; + uint64_t v2 = ldq(a2); ++ + if (env->regs[r1] == v2) { + cc = 0; + stq(a2, env->regs[r3]); +@@ -564,8 +571,9 @@ uint32_t HELPER(cs)(uint32_t r1, uint64_t a2, uint32_t r3) + { + /* FIXME: locking? */ + uint32_t cc; +- HELPER_LOG("%s: r1 %d a2 0x%lx r3 %d\n", __FUNCTION__, r1, a2, r3); + uint32_t v2 = ldl(a2); ++ ++ HELPER_LOG("%s: r1 %d a2 0x%lx r3 %d\n", __func__, r1, a2, r3); + if (((uint32_t)env->regs[r1]) == v2) { + cc = 0; + stl(a2, (uint32_t)env->regs[r3]); +@@ -612,14 +620,16 @@ static uint32_t helper_icm(uint32_t r1, uint64_t address, uint32_t mask) + it does not change the program counter + in other words: tricky... + currently implemented by interpreting the cases it is most commonly used in +- */ ++*/ + uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) + { + uint16_t insn = lduw_code(addr); +- HELPER_LOG("%s: v1 0x%lx addr 0x%lx insn 0x%x\n", __FUNCTION__, v1, addr, +- insn); ++ ++ HELPER_LOG("%s: v1 0x%lx addr 0x%lx insn 0x%x\n", __func__, v1, addr, ++ insn); + if ((insn & 0xf0ff) == 0xd000) { + uint32_t l, insn2, b1, b2, d1, d2; ++ + l = v1 & 0xff; + insn2 = ldl_code(addr + 2); + b1 = (insn2 >> 28) & 0xf; +@@ -645,13 +655,14 @@ uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) + } + } else if ((insn & 0xff00) == 0x0a00) { + /* supervisor call */ +- HELPER_LOG("%s: svc %ld via execute\n", __FUNCTION__, (insn|v1) & 0xff); ++ HELPER_LOG("%s: svc %ld via execute\n", __func__, (insn | v1) & 0xff); + env->psw.addr = ret - 4; +- env->int_svc_code = (insn|v1) & 0xff; ++ env->int_svc_code = (insn | v1) & 0xff; + env->int_svc_ilc = 4; + helper_exception(EXCP_SVC); + } else if ((insn & 0xff00) == 0xbf00) { + uint32_t insn2, r1, r3, b2, d2; ++ + insn2 = ldl_code(addr + 2); + r1 = (insn2 >> 20) & 0xf; + r3 = (insn2 >> 16) & 0xf; +@@ -659,7 +670,7 @@ uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) + d2 = insn2 & 0xfff; + cc = helper_icm(r1, get_address(0, b2, d2), r3); + } else { +-abort: ++ abort: + cpu_abort(env, "EXECUTE on instruction prefix 0x%x not implemented\n", + insn); + } +@@ -689,7 +700,7 @@ int32_t HELPER(nabs_i32)(int32_t val) + /* absolute value 64-bit */ + uint64_t HELPER(abs_i64)(int64_t val) + { +- HELPER_LOG("%s: val 0x%" PRIx64 "\n", __FUNCTION__, val); ++ HELPER_LOG("%s: val 0x%" PRIx64 "\n", __func__, val); + + if (val < 0) { + return -val; +@@ -774,9 +785,9 @@ void HELPER(ipm)(uint32_t cc, uint32_t r1) + uint64_t r = env->regs[r1]; + + r &= 0xffffffff00ffffffULL; +- r |= (cc << 28) | ( (env->psw.mask >> 40) & 0xf ); ++ r |= (cc << 28) | ((env->psw.mask >> 40) & 0xf); + env->regs[r1] = r; +- HELPER_LOG("%s: cc %d psw.mask 0x%lx r1 0x%lx\n", __FUNCTION__, ++ HELPER_LOG("%s: cc %d psw.mask 0x%lx r1 0x%lx\n", __func__, + cc, env->psw.mask, r); + } + +@@ -908,7 +919,7 @@ uint32_t HELPER(clcle)(uint32_t r1, uint64_t a2, uint32_t r3) + uint64_t srclen = env->regs[r3 + 1]; + uint64_t src = get_address_31fix(r3); + uint8_t pad = a2 & 0xff; +- uint8_t v1 = 0,v2 = 0; ++ uint8_t v1 = 0, v2 = 0; + uint32_t cc = 0; + + if (!(destlen || srclen)) { +@@ -1036,7 +1047,7 @@ static uint32_t set_cc_nz_f128(float128 v) + /* convert 32-bit int to 64-bit float */ + void HELPER(cdfbr)(uint32_t f1, int32_t v2) + { +- HELPER_LOG("%s: converting %d to f%d\n", __FUNCTION__, v2, f1); ++ HELPER_LOG("%s: converting %d to f%d\n", __func__, v2, f1); + env->fregs[f1].d = int32_to_float64(v2, &env->fpu_status); + } + +@@ -1044,6 +1055,7 @@ void HELPER(cdfbr)(uint32_t f1, int32_t v2) + void HELPER(cxfbr)(uint32_t f1, int32_t v2) + { + CPU_QuadU v1; ++ + v1.q = int32_to_float128(v2, &env->fpu_status); + env->fregs[f1].ll = v1.ll.upper; + env->fregs[f1 + 2].ll = v1.ll.lower; +@@ -1052,14 +1064,14 @@ void HELPER(cxfbr)(uint32_t f1, int32_t v2) + /* convert 64-bit int to 32-bit float */ + void HELPER(cegbr)(uint32_t f1, int64_t v2) + { +- HELPER_LOG("%s: converting %ld to f%d\n", __FUNCTION__, v2, f1); ++ HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1); + env->fregs[f1].l.upper = int64_to_float32(v2, &env->fpu_status); + } + + /* convert 64-bit int to 64-bit float */ + void HELPER(cdgbr)(uint32_t f1, int64_t v2) + { +- HELPER_LOG("%s: converting %ld to f%d\n", __FUNCTION__, v2, f1); ++ HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1); + env->fregs[f1].d = int64_to_float64(v2, &env->fpu_status); + } + +@@ -1067,8 +1079,9 @@ void HELPER(cdgbr)(uint32_t f1, int64_t v2) + void HELPER(cxgbr)(uint32_t f1, int64_t v2) + { + CPU_QuadU x1; ++ + x1.q = int64_to_float128(v2, &env->fpu_status); +- HELPER_LOG("%s: converted %ld to 0x%lx and 0x%lx\n", __FUNCTION__, v2, ++ HELPER_LOG("%s: converted %ld to 0x%lx and 0x%lx\n", __func__, v2, + x1.ll.upper, x1.ll.lower); + env->fregs[f1].ll = x1.ll.upper; + env->fregs[f1 + 2].ll = x1.ll.lower; +@@ -1078,7 +1091,7 @@ void HELPER(cxgbr)(uint32_t f1, int64_t v2) + void HELPER(cefbr)(uint32_t f1, int32_t v2) + { + env->fregs[f1].l.upper = int32_to_float32(v2, &env->fpu_status); +- HELPER_LOG("%s: converting %d to 0x%d in f%d\n", __FUNCTION__, v2, ++ HELPER_LOG("%s: converting %d to 0x%d in f%d\n", __func__, v2, + env->fregs[f1].l.upper, f1); + } + +@@ -1088,7 +1101,7 @@ uint32_t HELPER(aebr)(uint32_t f1, uint32_t f2) + env->fregs[f1].l.upper = float32_add(env->fregs[f1].l.upper, + env->fregs[f2].l.upper, + &env->fpu_status); +- HELPER_LOG("%s: adding 0x%d resulting in 0x%d in f%d\n", __FUNCTION__, ++ HELPER_LOG("%s: adding 0x%d resulting in 0x%d in f%d\n", __func__, + env->fregs[f2].l.upper, env->fregs[f1].l.upper, f1); + + return set_cc_nz_f32(env->fregs[f1].l.upper); +@@ -1099,7 +1112,7 @@ uint32_t HELPER(adbr)(uint32_t f1, uint32_t f2) + { + env->fregs[f1].d = float64_add(env->fregs[f1].d, env->fregs[f2].d, + &env->fpu_status); +- HELPER_LOG("%s: adding 0x%ld resulting in 0x%ld in f%d\n", __FUNCTION__, ++ HELPER_LOG("%s: adding 0x%ld resulting in 0x%ld in f%d\n", __func__, + env->fregs[f2].d, env->fregs[f1].d, f1); + + return set_cc_nz_f64(env->fregs[f1].d); +@@ -1111,7 +1124,7 @@ uint32_t HELPER(sebr)(uint32_t f1, uint32_t f2) + env->fregs[f1].l.upper = float32_sub(env->fregs[f1].l.upper, + env->fregs[f2].l.upper, + &env->fpu_status); +- HELPER_LOG("%s: adding 0x%d resulting in 0x%d in f%d\n", __FUNCTION__, ++ HELPER_LOG("%s: adding 0x%d resulting in 0x%d in f%d\n", __func__, + env->fregs[f2].l.upper, env->fregs[f1].l.upper, f1); + + return set_cc_nz_f32(env->fregs[f1].l.upper); +@@ -1123,7 +1136,7 @@ uint32_t HELPER(sdbr)(uint32_t f1, uint32_t f2) + env->fregs[f1].d = float64_sub(env->fregs[f1].d, env->fregs[f2].d, + &env->fpu_status); + HELPER_LOG("%s: subtracting 0x%ld resulting in 0x%ld in f%d\n", +- __FUNCTION__, env->fregs[f2].d, env->fregs[f1].d, f1); ++ __func__, env->fregs[f2].d, env->fregs[f1].d, f1); + + return set_cc_nz_f64(env->fregs[f1].d); + } +@@ -1140,12 +1153,13 @@ void HELPER(debr)(uint32_t f1, uint32_t f2) + void HELPER(dxbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; ++ CPU_QuadU v2; ++ CPU_QuadU res; ++ + v1.ll.upper = env->fregs[f1].ll; + v1.ll.lower = env->fregs[f1 + 2].ll; +- CPU_QuadU v2; + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; +- CPU_QuadU res; + res.q = float128_div(v1.q, v2.q, &env->fpu_status); + env->fregs[f1].ll = res.ll.upper; + env->fregs[f1 + 2].ll = res.ll.lower; +@@ -1162,12 +1176,13 @@ void HELPER(mdbr)(uint32_t f1, uint32_t f2) + void HELPER(mxbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; ++ CPU_QuadU v2; ++ CPU_QuadU res; ++ + v1.ll.upper = env->fregs[f1].ll; + v1.ll.lower = env->fregs[f1 + 2].ll; +- CPU_QuadU v2; + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; +- CPU_QuadU res; + res.q = float128_mul(v1.q, v2.q, &env->fpu_status); + env->fregs[f1].ll = res.ll.upper; + env->fregs[f1 + 2].ll = res.ll.lower; +@@ -1184,16 +1199,18 @@ void HELPER(ldebr)(uint32_t r1, uint32_t r2) + void HELPER(ldxbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU x2; ++ + x2.ll.upper = env->fregs[f2].ll; + x2.ll.lower = env->fregs[f2 + 2].ll; + env->fregs[f1].d = float128_to_float64(x2.q, &env->fpu_status); +- HELPER_LOG("%s: to 0x%ld\n", __FUNCTION__, env->fregs[f1].d); ++ HELPER_LOG("%s: to 0x%ld\n", __func__, env->fregs[f1].d); + } + + /* convert 64-bit float to 128-bit float */ + void HELPER(lxdbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU res; ++ + res.q = float64_to_float128(env->fregs[f2].d, &env->fpu_status); + env->fregs[f1].ll = res.ll.upper; + env->fregs[f1 + 2].ll = res.ll.lower; +@@ -1203,6 +1220,7 @@ void HELPER(lxdbr)(uint32_t f1, uint32_t f2) + void HELPER(ledbr)(uint32_t f1, uint32_t f2) + { + float64 d2 = env->fregs[f2].d; ++ + env->fregs[f1].l.upper = float64_to_float32(d2, &env->fpu_status); + } + +@@ -1210,10 +1228,11 @@ void HELPER(ledbr)(uint32_t f1, uint32_t f2) + void HELPER(lexbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU x2; ++ + x2.ll.upper = env->fregs[f2].ll; + x2.ll.lower = env->fregs[f2 + 2].ll; + env->fregs[f1].l.upper = float128_to_float32(x2.q, &env->fpu_status); +- HELPER_LOG("%s: to 0x%d\n", __FUNCTION__, env->fregs[f1].l.upper); ++ HELPER_LOG("%s: to 0x%d\n", __func__, env->fregs[f1].l.upper); + } + + /* absolute value of 32-bit float */ +@@ -1221,6 +1240,7 @@ uint32_t HELPER(lpebr)(uint32_t f1, uint32_t f2) + { + float32 v1; + float32 v2 = env->fregs[f2].d; ++ + v1 = float32_abs(v2); + env->fregs[f1].d = v1; + return set_cc_nz_f32(v1); +@@ -1231,6 +1251,7 @@ uint32_t HELPER(lpdbr)(uint32_t f1, uint32_t f2) + { + float64 v1; + float64 v2 = env->fregs[f2].d; ++ + v1 = float64_abs(v2); + env->fregs[f1].d = v1; + return set_cc_nz_f64(v1); +@@ -1241,6 +1262,7 @@ uint32_t HELPER(lpxbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; + CPU_QuadU v2; ++ + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; + v1.q = float128_abs(v2.q); +@@ -1267,6 +1289,7 @@ uint32_t HELPER(ltebr)(uint32_t f1, uint32_t f2) + uint32_t HELPER(ltxbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU x; ++ + x.ll.upper = env->fregs[f2].ll; + x.ll.lower = env->fregs[f2 + 2].ll; + env->fregs[f1].ll = x.ll.upper; +@@ -1294,6 +1317,7 @@ uint32_t HELPER(lcdbr)(uint32_t f1, uint32_t f2) + uint32_t HELPER(lcxbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU x1, x2; ++ + x2.ll.upper = env->fregs[f2].ll; + x2.ll.lower = env->fregs[f2 + 2].ll; + x1.q = float128_chs(x2.q); +@@ -1307,8 +1331,9 @@ void HELPER(aeb)(uint32_t f1, uint32_t val) + { + float32 v1 = env->fregs[f1].l.upper; + CPU_FloatU v2; ++ + v2.l = val; +- HELPER_LOG("%s: adding 0x%d from f%d and 0x%d\n", __FUNCTION__, ++ HELPER_LOG("%s: adding 0x%d from f%d and 0x%d\n", __func__, + v1, f1, v2.f); + env->fregs[f1].l.upper = float32_add(v1, v2.f, &env->fpu_status); + } +@@ -1318,8 +1343,9 @@ void HELPER(deb)(uint32_t f1, uint32_t val) + { + float32 v1 = env->fregs[f1].l.upper; + CPU_FloatU v2; ++ + v2.l = val; +- HELPER_LOG("%s: dividing 0x%d from f%d by 0x%d\n", __FUNCTION__, ++ HELPER_LOG("%s: dividing 0x%d from f%d by 0x%d\n", __func__, + v1, f1, v2.f); + env->fregs[f1].l.upper = float32_div(v1, v2.f, &env->fpu_status); + } +@@ -1329,8 +1355,9 @@ void HELPER(meeb)(uint32_t f1, uint32_t val) + { + float32 v1 = env->fregs[f1].l.upper; + CPU_FloatU v2; ++ + v2.l = val; +- HELPER_LOG("%s: multiplying 0x%d from f%d and 0x%d\n", __FUNCTION__, ++ HELPER_LOG("%s: multiplying 0x%d from f%d and 0x%d\n", __func__, + v1, f1, v2.f); + env->fregs[f1].l.upper = float32_mul(v1, v2.f, &env->fpu_status); + } +@@ -1340,7 +1367,8 @@ uint32_t HELPER(cebr)(uint32_t f1, uint32_t f2) + { + float32 v1 = env->fregs[f1].l.upper; + float32 v2 = env->fregs[f2].l.upper; +- HELPER_LOG("%s: comparing 0x%d from f%d and 0x%d\n", __FUNCTION__, ++ ++ HELPER_LOG("%s: comparing 0x%d from f%d and 0x%d\n", __func__, + v1, f1, v2); + return set_cc_f32(v1, v2); + } +@@ -1350,7 +1378,8 @@ uint32_t HELPER(cdbr)(uint32_t f1, uint32_t f2) + { + float64 v1 = env->fregs[f1].d; + float64 v2 = env->fregs[f2].d; +- HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%ld\n", __FUNCTION__, ++ ++ HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%ld\n", __func__, + v1, f1, v2); + return set_cc_f64(v1, v2); + } +@@ -1359,14 +1388,15 @@ uint32_t HELPER(cdbr)(uint32_t f1, uint32_t f2) + uint32_t HELPER(cxbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; ++ CPU_QuadU v2; ++ + v1.ll.upper = env->fregs[f1].ll; + v1.ll.lower = env->fregs[f1 + 2].ll; +- CPU_QuadU v2; + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; + + return float_comp_to_cc(float128_compare_quiet(v1.q, v2.q, +- &env->fpu_status)); ++ &env->fpu_status)); + } + + /* 64-bit FP compare RM */ +@@ -1374,8 +1404,9 @@ uint32_t HELPER(cdb)(uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; ++ + v2.ll = ldq(a2); +- HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%lx\n", __FUNCTION__, v1, ++ HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%lx\n", __func__, v1, + f1, v2.d); + return set_cc_f64(v1, v2.d); + } +@@ -1385,8 +1416,9 @@ uint32_t HELPER(adb)(uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; ++ + v2.ll = ldq(a2); +- HELPER_LOG("%s: adding 0x%lx from f%d and 0x%lx\n", __FUNCTION__, ++ HELPER_LOG("%s: adding 0x%lx from f%d and 0x%lx\n", __func__, + v1, f1, v2.d); + env->fregs[f1].d = v1 = float64_add(v1, v2.d, &env->fpu_status); + return set_cc_nz_f64(v1); +@@ -1397,6 +1429,7 @@ void HELPER(seb)(uint32_t f1, uint32_t val) + { + float32 v1 = env->fregs[f1].l.upper; + CPU_FloatU v2; ++ + v2.l = val; + env->fregs[f1].l.upper = float32_sub(v1, v2.f, &env->fpu_status); + } +@@ -1406,6 +1439,7 @@ uint32_t HELPER(sdb)(uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; ++ + v2.ll = ldq(a2); + env->fregs[f1].d = v1 = float64_sub(v1, v2.d, &env->fpu_status); + return set_cc_nz_f64(v1); +@@ -1416,8 +1450,9 @@ void HELPER(mdb)(uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; ++ + v2.ll = ldq(a2); +- HELPER_LOG("%s: multiplying 0x%lx from f%d and 0x%ld\n", __FUNCTION__, ++ HELPER_LOG("%s: multiplying 0x%lx from f%d and 0x%ld\n", __func__, + v1, f1, v2.d); + env->fregs[f1].d = float64_mul(v1, v2.d, &env->fpu_status); + } +@@ -1427,8 +1462,9 @@ void HELPER(ddb)(uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; ++ + v2.ll = ldq(a2); +- HELPER_LOG("%s: dividing 0x%lx from f%d by 0x%ld\n", __FUNCTION__, ++ HELPER_LOG("%s: dividing 0x%lx from f%d by 0x%ld\n", __func__, + v1, f1, v2.d); + env->fregs[f1].d = float64_div(v1, v2.d, &env->fpu_status); + } +@@ -1464,6 +1500,7 @@ static void set_round_mode(int m3) + uint32_t HELPER(cgebr)(uint32_t r1, uint32_t f2, uint32_t m3) + { + float32 v2 = env->fregs[f2].l.upper; ++ + set_round_mode(m3); + env->regs[r1] = float32_to_int64(v2, &env->fpu_status); + return set_cc_nz_f32(v2); +@@ -1473,6 +1510,7 @@ uint32_t HELPER(cgebr)(uint32_t r1, uint32_t f2, uint32_t m3) + uint32_t HELPER(cgdbr)(uint32_t r1, uint32_t f2, uint32_t m3) + { + float64 v2 = env->fregs[f2].d; ++ + set_round_mode(m3); + env->regs[r1] = float64_to_int64(v2, &env->fpu_status); + return set_cc_nz_f64(v2); +@@ -1482,6 +1520,7 @@ uint32_t HELPER(cgdbr)(uint32_t r1, uint32_t f2, uint32_t m3) + uint32_t HELPER(cgxbr)(uint32_t r1, uint32_t f2, uint32_t m3) + { + CPU_QuadU v2; ++ + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; + set_round_mode(m3); +@@ -1501,9 +1540,10 @@ uint32_t HELPER(cgxbr)(uint32_t r1, uint32_t f2, uint32_t m3) + uint32_t HELPER(cfebr)(uint32_t r1, uint32_t f2, uint32_t m3) + { + float32 v2 = env->fregs[f2].l.upper; ++ + set_round_mode(m3); + env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- float32_to_int32(v2, &env->fpu_status); ++ float32_to_int32(v2, &env->fpu_status); + return set_cc_nz_f32(v2); + } + +@@ -1511,9 +1551,10 @@ uint32_t HELPER(cfebr)(uint32_t r1, uint32_t f2, uint32_t m3) + uint32_t HELPER(cfdbr)(uint32_t r1, uint32_t f2, uint32_t m3) + { + float64 v2 = env->fregs[f2].d; ++ + set_round_mode(m3); + env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- float64_to_int32(v2, &env->fpu_status); ++ float64_to_int32(v2, &env->fpu_status); + return set_cc_nz_f64(v2); + } + +@@ -1521,10 +1562,11 @@ uint32_t HELPER(cfdbr)(uint32_t r1, uint32_t f2, uint32_t m3) + uint32_t HELPER(cfxbr)(uint32_t r1, uint32_t f2, uint32_t m3) + { + CPU_QuadU v2; ++ + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; + env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- float128_to_int32(v2.q, &env->fpu_status); ++ float128_to_int32(v2.q, &env->fpu_status); + return set_cc_nz_f128(v2.q); + } + +@@ -1544,6 +1586,7 @@ void HELPER(lzdr)(uint32_t f1) + void HELPER(lzxr)(uint32_t f1) + { + CPU_QuadU x; ++ + x.q = float64_to_float128(float64_zero, &env->fpu_status); + env->fregs[f1].ll = x.ll.upper; + env->fregs[f1 + 1].ll = x.ll.lower; +@@ -1553,12 +1596,13 @@ void HELPER(lzxr)(uint32_t f1) + uint32_t HELPER(sxbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; ++ CPU_QuadU v2; ++ CPU_QuadU res; ++ + v1.ll.upper = env->fregs[f1].ll; + v1.ll.lower = env->fregs[f1 + 2].ll; +- CPU_QuadU v2; + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; +- CPU_QuadU res; + res.q = float128_sub(v1.q, v2.q, &env->fpu_status); + env->fregs[f1].ll = res.ll.upper; + env->fregs[f1 + 2].ll = res.ll.lower; +@@ -1569,12 +1613,13 @@ uint32_t HELPER(sxbr)(uint32_t f1, uint32_t f2) + uint32_t HELPER(axbr)(uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; ++ CPU_QuadU v2; ++ CPU_QuadU res; ++ + v1.ll.upper = env->fregs[f1].ll; + v1.ll.lower = env->fregs[f1 + 2].ll; +- CPU_QuadU v2; + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; +- CPU_QuadU res; + res.q = float128_add(v1.q, v2.q, &env->fpu_status); + env->fregs[f1].ll = res.ll.upper; + env->fregs[f1 + 2].ll = res.ll.lower; +@@ -1599,8 +1644,9 @@ void HELPER(ddbr)(uint32_t f1, uint32_t f2) + /* 64-bit FP multiply and add RM */ + void HELPER(madb)(uint32_t f1, uint64_t a2, uint32_t f3) + { +- HELPER_LOG("%s: f1 %d a2 0x%lx f3 %d\n", __FUNCTION__, f1, a2, f3); + CPU_DoubleU v2; ++ ++ HELPER_LOG("%s: f1 %d a2 0x%lx f3 %d\n", __func__, f1, a2, f3); + v2.ll = ldq(a2); + env->fregs[f1].d = float64_add(env->fregs[f1].d, + float64_mul(v2.d, env->fregs[f3].d, +@@ -1611,7 +1657,7 @@ void HELPER(madb)(uint32_t f1, uint64_t a2, uint32_t f3) + /* 64-bit FP multiply and add RR */ + void HELPER(madbr)(uint32_t f1, uint32_t f3, uint32_t f2) + { +- HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __FUNCTION__, f1, f2, f3); ++ HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __func__, f1, f2, f3); + env->fregs[f1].d = float64_add(float64_mul(env->fregs[f2].d, + env->fregs[f3].d, + &env->fpu_status), +@@ -1621,7 +1667,7 @@ void HELPER(madbr)(uint32_t f1, uint32_t f3, uint32_t f2) + /* 64-bit FP multiply and subtract RR */ + void HELPER(msdbr)(uint32_t f1, uint32_t f3, uint32_t f2) + { +- HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __FUNCTION__, f1, f2, f3); ++ HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __func__, f1, f2, f3); + env->fregs[f1].d = float64_sub(float64_mul(env->fregs[f2].d, + env->fregs[f3].d, + &env->fpu_status), +@@ -1642,6 +1688,7 @@ void HELPER(maebr)(uint32_t f1, uint32_t f3, uint32_t f2) + void HELPER(ldeb)(uint32_t f1, uint64_t a2) + { + uint32_t v2; ++ + v2 = ldl(a2); + env->fregs[f1].d = float32_to_float64(v2, + &env->fpu_status); +@@ -1651,8 +1698,9 @@ void HELPER(ldeb)(uint32_t f1, uint64_t a2) + void HELPER(lxdb)(uint32_t f1, uint64_t a2) + { + CPU_DoubleU v2; +- v2.ll = ldq(a2); + CPU_QuadU v1; ++ ++ v2.ll = ldq(a2); + v1.q = float64_to_float128(v2.d, &env->fpu_status); + env->fregs[f1].ll = v1.ll.upper; + env->fregs[f1 + 2].ll = v1.ll.lower; +@@ -1665,7 +1713,7 @@ uint32_t HELPER(tceb)(uint32_t f1, uint64_t m2) + int neg = float32_is_neg(v1); + uint32_t cc = 0; + +- HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __FUNCTION__, (long)v1, m2, neg); ++ HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __func__, (long)v1, m2, neg); + if ((float32_is_zero(v1) && (m2 & (1 << (11-neg)))) || + (float32_is_infinity(v1) && (m2 & (1 << (5-neg)))) || + (float32_is_any_nan(v1) && (m2 & (1 << (3-neg)))) || +@@ -1687,7 +1735,7 @@ uint32_t HELPER(tcdb)(uint32_t f1, uint64_t m2) + int neg = float64_is_neg(v1); + uint32_t cc = 0; + +- HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __FUNCTION__, v1, m2, neg); ++ HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __func__, v1, m2, neg); + if ((float64_is_zero(v1) && (m2 & (1 << (11-neg)))) || + (float64_is_infinity(v1) && (m2 & (1 << (5-neg)))) || + (float64_is_any_nan(v1) && (m2 & (1 << (3-neg)))) || +@@ -1706,10 +1754,12 @@ uint32_t HELPER(tcxb)(uint32_t f1, uint64_t m2) + { + CPU_QuadU v1; + uint32_t cc = 0; ++ int neg; ++ + v1.ll.upper = env->fregs[f1].ll; + v1.ll.lower = env->fregs[f1 + 2].ll; + +- int neg = float128_is_neg(v1.q); ++ neg = float128_is_neg(v1.q); + if ((float128_is_zero(v1.q) && (m2 & (1 << (11-neg)))) || + (float128_is_infinity(v1.q) && (m2 & (1 << (5-neg)))) || + (float128_is_any_nan(v1.q) && (m2 & (1 << (3-neg)))) || +@@ -1787,7 +1837,7 @@ void HELPER(cksm)(uint32_t r1, uint32_t r2) + + /* store result */ + env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- ((uint32_t)cksm + (cksm >> 32)); ++ ((uint32_t)cksm + (cksm >> 32)); + } + + static inline uint32_t cc_calc_ltgt_32(CPUS390XState *env, int32_t src, +@@ -1848,10 +1898,12 @@ static inline uint32_t cc_calc_ltugtu_64(CPUS390XState *env, uint64_t src, + } + } + +-static inline uint32_t cc_calc_tm_32(CPUS390XState *env, uint32_t val, uint32_t mask) ++static inline uint32_t cc_calc_tm_32(CPUS390XState *env, uint32_t val, ++ uint32_t mask) + { +- HELPER_LOG("%s: val 0x%x mask 0x%x\n", __FUNCTION__, val, mask); + uint16_t r = val & mask; ++ ++ HELPER_LOG("%s: val 0x%x mask 0x%x\n", __func__, val, mask); + if (r == 0 || mask == 0) { + return 0; + } else if (r == mask) { +@@ -1862,10 +1914,12 @@ static inline uint32_t cc_calc_tm_32(CPUS390XState *env, uint32_t val, uint32_t + } + + /* set condition code for test under mask */ +-static inline uint32_t cc_calc_tm_64(CPUS390XState *env, uint64_t val, uint32_t mask) ++static inline uint32_t cc_calc_tm_64(CPUS390XState *env, uint64_t val, ++ uint32_t mask) + { + uint16_t r = val & mask; +- HELPER_LOG("%s: val 0x%lx mask 0x%x r 0x%x\n", __FUNCTION__, val, mask, r); ++ ++ HELPER_LOG("%s: val 0x%lx mask 0x%x r 0x%x\n", __func__, val, mask, r); + if (r == 0 || mask == 0) { + return 0; + } else if (r == mask) { +@@ -1888,8 +1942,8 @@ static inline uint32_t cc_calc_nz(CPUS390XState *env, uint64_t dst) + return !!dst; + } + +-static inline uint32_t cc_calc_add_64(CPUS390XState *env, int64_t a1, int64_t a2, +- int64_t ar) ++static inline uint32_t cc_calc_add_64(CPUS390XState *env, int64_t a1, ++ int64_t a2, int64_t ar) + { + if ((a1 > 0 && a2 > 0 && ar < 0) || (a1 < 0 && a2 < 0 && ar > 0)) { + return 3; /* overflow */ +@@ -1904,8 +1958,8 @@ static inline uint32_t cc_calc_add_64(CPUS390XState *env, int64_t a1, int64_t a2 + } + } + +-static inline uint32_t cc_calc_addu_64(CPUS390XState *env, uint64_t a1, uint64_t a2, +- uint64_t ar) ++static inline uint32_t cc_calc_addu_64(CPUS390XState *env, uint64_t a1, ++ uint64_t a2, uint64_t ar) + { + if (ar == 0) { + if (a1) { +@@ -1915,15 +1969,15 @@ static inline uint32_t cc_calc_addu_64(CPUS390XState *env, uint64_t a1, uint64_t + } + } else { + if (ar < a1 || ar < a2) { +- return 3; ++ return 3; + } else { +- return 1; ++ return 1; + } + } + } + +-static inline uint32_t cc_calc_sub_64(CPUS390XState *env, int64_t a1, int64_t a2, +- int64_t ar) ++static inline uint32_t cc_calc_sub_64(CPUS390XState *env, int64_t a1, ++ int64_t a2, int64_t ar) + { + if ((a1 > 0 && a2 < 0 && ar < 0) || (a1 < 0 && a2 > 0 && ar > 0)) { + return 3; /* overflow */ +@@ -1938,8 +1992,8 @@ static inline uint32_t cc_calc_sub_64(CPUS390XState *env, int64_t a1, int64_t a2 + } + } + +-static inline uint32_t cc_calc_subu_64(CPUS390XState *env, uint64_t a1, uint64_t a2, +- uint64_t ar) ++static inline uint32_t cc_calc_subu_64(CPUS390XState *env, uint64_t a1, ++ uint64_t a2, uint64_t ar) + { + if (ar == 0) { + return 2; +@@ -1982,8 +2036,8 @@ static inline uint32_t cc_calc_comp_64(CPUS390XState *env, int64_t dst) + } + + +-static inline uint32_t cc_calc_add_32(CPUS390XState *env, int32_t a1, int32_t a2, +- int32_t ar) ++static inline uint32_t cc_calc_add_32(CPUS390XState *env, int32_t a1, ++ int32_t a2, int32_t ar) + { + if ((a1 > 0 && a2 > 0 && ar < 0) || (a1 < 0 && a2 < 0 && ar > 0)) { + return 3; /* overflow */ +@@ -1998,26 +2052,26 @@ static inline uint32_t cc_calc_add_32(CPUS390XState *env, int32_t a1, int32_t a2 + } + } + +-static inline uint32_t cc_calc_addu_32(CPUS390XState *env, uint32_t a1, uint32_t a2, +- uint32_t ar) ++static inline uint32_t cc_calc_addu_32(CPUS390XState *env, uint32_t a1, ++ uint32_t a2, uint32_t ar) + { + if (ar == 0) { + if (a1) { +- return 2; ++ return 2; + } else { +- return 0; ++ return 0; + } + } else { + if (ar < a1 || ar < a2) { +- return 3; ++ return 3; + } else { +- return 1; ++ return 1; + } + } + } + +-static inline uint32_t cc_calc_sub_32(CPUS390XState *env, int32_t a1, int32_t a2, +- int32_t ar) ++static inline uint32_t cc_calc_sub_32(CPUS390XState *env, int32_t a1, ++ int32_t a2, int32_t ar) + { + if ((a1 > 0 && a2 < 0 && ar < 0) || (a1 < 0 && a2 > 0 && ar > 0)) { + return 3; /* overflow */ +@@ -2032,8 +2086,8 @@ static inline uint32_t cc_calc_sub_32(CPUS390XState *env, int32_t a1, int32_t a2 + } + } + +-static inline uint32_t cc_calc_subu_32(CPUS390XState *env, uint32_t a1, uint32_t a2, +- uint32_t ar) ++static inline uint32_t cc_calc_subu_32(CPUS390XState *env, uint32_t a1, ++ uint32_t a2, uint32_t ar) + { + if (ar == 0) { + return 2; +@@ -2076,11 +2130,12 @@ static inline uint32_t cc_calc_comp_32(CPUS390XState *env, int32_t dst) + } + + /* calculate condition code for insert character under mask insn */ +-static inline uint32_t cc_calc_icm_32(CPUS390XState *env, uint32_t mask, uint32_t val) ++static inline uint32_t cc_calc_icm_32(CPUS390XState *env, uint32_t mask, ++ uint32_t val) + { +- HELPER_LOG("%s: mask 0x%x val %d\n", __FUNCTION__, mask, val); + uint32_t cc; + ++ HELPER_LOG("%s: mask 0x%x val %d\n", __func__, mask, val); + if (mask == 0xf) { + if (!val) { + return 0; +@@ -2107,7 +2162,8 @@ static inline uint32_t cc_calc_icm_32(CPUS390XState *env, uint32_t mask, uint32_ + return cc; + } + +-static inline uint32_t cc_calc_slag(CPUS390XState *env, uint64_t src, uint64_t shift) ++static inline uint32_t cc_calc_slag(CPUS390XState *env, uint64_t src, ++ uint64_t shift) + { + uint64_t mask = ((1ULL << shift) - 1ULL) << (64 - shift); + uint64_t match, r; +@@ -2136,8 +2192,8 @@ static inline uint32_t cc_calc_slag(CPUS390XState *env, uint64_t src, uint64_t s + } + + +-static inline uint32_t do_calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, +- uint64_t dst, uint64_t vr) ++static inline uint32_t do_calc_cc(CPUS390XState *env, uint32_t cc_op, ++ uint64_t src, uint64_t dst, uint64_t vr) + { + uint32_t r = 0; + +@@ -2244,7 +2300,7 @@ static inline uint32_t do_calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t s + cpu_abort(env, "Unknown CC operation: %s\n", cc_name(cc_op)); + } + +- HELPER_LOG("%s: %15s 0x%016lx 0x%016lx 0x%016lx = %d\n", __FUNCTION__, ++ HELPER_LOG("%s: %15s 0x%016lx 0x%016lx 0x%016lx = %d\n", __func__, + cc_name(cc_op), src, dst, vr, r); + return r; + } +@@ -2334,6 +2390,7 @@ void HELPER(tr)(uint32_t len, uint64_t array, uint64_t trans) + for (i = 0; i <= len; i++) { + uint8_t byte = ldub(array + i); + uint8_t new_byte = ldub(trans + byte); ++ + stb(array + i, new_byte); + } + } +@@ -2363,7 +2420,7 @@ static void program_interrupt(CPUS390XState *env, uint32_t code, int ilc) + } + + /* +- * ret < 0 indicates program check, ret = 0,1,2,3 -> cc ++ * ret < 0 indicates program check, ret = 0, 1, 2, 3 -> cc + */ + int sclp_service_call(CPUS390XState *env, uint32_t sccb, uint64_t code) + { +@@ -2382,24 +2439,24 @@ int sclp_service_call(CPUS390XState *env, uint32_t sccb, uint64_t code) + return -PGM_SPECIFICATION; + } + +- switch(code) { +- case SCLP_CMDW_READ_SCP_INFO: +- case SCLP_CMDW_READ_SCP_INFO_FORCED: +- while ((ram_size >> (20 + shift)) > 65535) { +- shift++; +- } +- stw_phys(sccb + SCP_MEM_CODE, ram_size >> (20 + shift)); +- stb_phys(sccb + SCP_INCREMENT, 1 << shift); +- stw_phys(sccb + SCP_RESPONSE_CODE, 0x10); ++ switch (code) { ++ case SCLP_CMDW_READ_SCP_INFO: ++ case SCLP_CMDW_READ_SCP_INFO_FORCED: ++ while ((ram_size >> (20 + shift)) > 65535) { ++ shift++; ++ } ++ stw_phys(sccb + SCP_MEM_CODE, ram_size >> (20 + shift)); ++ stb_phys(sccb + SCP_INCREMENT, 1 << shift); ++ stw_phys(sccb + SCP_RESPONSE_CODE, 0x10); + +- s390_sclp_extint(sccb & ~3); +- break; +- default: ++ s390_sclp_extint(sccb & ~3); ++ break; ++ default: + #ifdef DEBUG_HELPER +- printf("KVM: invalid sclp call 0x%x / 0x%" PRIx64 "x\n", sccb, code); ++ printf("KVM: invalid sclp call 0x%x / 0x%" PRIx64 "x\n", sccb, code); + #endif +- r = 3; +- break; ++ r = 3; ++ break; + } + + return r; +@@ -2479,7 +2536,7 @@ static inline uint64_t clock_value(CPUS390XState *env) + uint64_t time; + + time = env->tod_offset + +- time2tod(qemu_get_clock_ns(vm_clock) - env->tod_basetime); ++ time2tod(qemu_get_clock_ns(vm_clock) - env->tod_basetime); + + return time; + } +@@ -2503,7 +2560,6 @@ uint32_t HELPER(stcke)(uint64_t a1) + /* XXX programmable fields */ + stw(a1 + 17, 0); + +- + return 0; + } + +@@ -2584,7 +2640,7 @@ uint32_t HELPER(stsi)(uint64_t a0, uint32_t r0, uint32_t r1) + ebcdic_put(sysib.model, "QEMU ", 16); + ebcdic_put(sysib.sequence, "QEMU ", 16); + ebcdic_put(sysib.plant, "QEMU", 4); +- cpu_physical_memory_rw(a0, (uint8_t*)&sysib, sizeof(sysib), 1); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); + } else if ((sel1 == 2) && (sel2 == 1)) { + /* Basic Machine CPU */ + struct sysib_121 sysib; +@@ -2594,7 +2650,7 @@ uint32_t HELPER(stsi)(uint64_t a0, uint32_t r0, uint32_t r1) + ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16); + ebcdic_put(sysib.plant, "QEMU", 4); + stw_p(&sysib.cpu_addr, env->cpu_num); +- cpu_physical_memory_rw(a0, (uint8_t*)&sysib, sizeof(sysib), 1); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); + } else if ((sel1 == 2) && (sel2 == 2)) { + /* Basic Machine CPUs */ + struct sysib_122 sysib; +@@ -2606,68 +2662,68 @@ uint32_t HELPER(stsi)(uint64_t a0, uint32_t r0, uint32_t r1) + stw_p(&sysib.active_cpus, 1); + stw_p(&sysib.standby_cpus, 0); + stw_p(&sysib.reserved_cpus, 0); +- cpu_physical_memory_rw(a0, (uint8_t*)&sysib, sizeof(sysib), 1); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); + } else { + cc = 3; + } + break; + case STSI_LEVEL_2: +- { +- if ((sel1 == 2) && (sel2 == 1)) { +- /* LPAR CPU */ +- struct sysib_221 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- /* XXX make different for different CPUs? */ +- ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16); +- ebcdic_put(sysib.plant, "QEMU", 4); +- stw_p(&sysib.cpu_addr, env->cpu_num); +- stw_p(&sysib.cpu_id, 0); +- cpu_physical_memory_rw(a0, (uint8_t*)&sysib, sizeof(sysib), 1); +- } else if ((sel1 == 2) && (sel2 == 2)) { +- /* LPAR CPUs */ +- struct sysib_222 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- stw_p(&sysib.lpar_num, 0); +- sysib.lcpuc = 0; +- /* XXX change when SMP comes */ +- stw_p(&sysib.total_cpus, 1); +- stw_p(&sysib.conf_cpus, 1); +- stw_p(&sysib.standby_cpus, 0); +- stw_p(&sysib.reserved_cpus, 0); +- ebcdic_put(sysib.name, "QEMU ", 8); +- stl_p(&sysib.caf, 1000); +- stw_p(&sysib.dedicated_cpus, 0); +- stw_p(&sysib.shared_cpus, 0); +- cpu_physical_memory_rw(a0, (uint8_t*)&sysib, sizeof(sysib), 1); +- } else { +- cc = 3; ++ { ++ if ((sel1 == 2) && (sel2 == 1)) { ++ /* LPAR CPU */ ++ struct sysib_221 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ /* XXX make different for different CPUs? */ ++ ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16); ++ ebcdic_put(sysib.plant, "QEMU", 4); ++ stw_p(&sysib.cpu_addr, env->cpu_num); ++ stw_p(&sysib.cpu_id, 0); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else if ((sel1 == 2) && (sel2 == 2)) { ++ /* LPAR CPUs */ ++ struct sysib_222 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ stw_p(&sysib.lpar_num, 0); ++ sysib.lcpuc = 0; ++ /* XXX change when SMP comes */ ++ stw_p(&sysib.total_cpus, 1); ++ stw_p(&sysib.conf_cpus, 1); ++ stw_p(&sysib.standby_cpus, 0); ++ stw_p(&sysib.reserved_cpus, 0); ++ ebcdic_put(sysib.name, "QEMU ", 8); ++ stl_p(&sysib.caf, 1000); ++ stw_p(&sysib.dedicated_cpus, 0); ++ stw_p(&sysib.shared_cpus, 0); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else { ++ cc = 3; ++ } ++ break; + } +- break; +- } + case STSI_LEVEL_3: +- { +- if ((sel1 == 2) && (sel2 == 2)) { +- /* VM CPUs */ +- struct sysib_322 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- sysib.count = 1; +- /* XXX change when SMP comes */ +- stw_p(&sysib.vm[0].total_cpus, 1); +- stw_p(&sysib.vm[0].conf_cpus, 1); +- stw_p(&sysib.vm[0].standby_cpus, 0); +- stw_p(&sysib.vm[0].reserved_cpus, 0); +- ebcdic_put(sysib.vm[0].name, "KVMguest", 8); +- stl_p(&sysib.vm[0].caf, 1000); +- ebcdic_put(sysib.vm[0].cpi, "KVM/Linux ", 16); +- cpu_physical_memory_rw(a0, (uint8_t*)&sysib, sizeof(sysib), 1); +- } else { +- cc = 3; ++ { ++ if ((sel1 == 2) && (sel2 == 2)) { ++ /* VM CPUs */ ++ struct sysib_322 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ sysib.count = 1; ++ /* XXX change when SMP comes */ ++ stw_p(&sysib.vm[0].total_cpus, 1); ++ stw_p(&sysib.vm[0].conf_cpus, 1); ++ stw_p(&sysib.vm[0].standby_cpus, 0); ++ stw_p(&sysib.vm[0].reserved_cpus, 0); ++ ebcdic_put(sysib.vm[0].name, "KVMguest", 8); ++ stl_p(&sysib.vm[0].caf, 1000); ++ ebcdic_put(sysib.vm[0].cpi, "KVM/Linux ", 16); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else { ++ cc = 3; ++ } ++ break; + } +- break; +- } + case STSI_LEVEL_CURRENT: + env->regs[0] = STSI_LEVEL_3; + break; +@@ -2781,6 +2837,7 @@ uint32_t HELPER(rrbe)(uint32_t r1, uint64_t r2) + { + uint8_t re; + uint8_t key; ++ + if (r2 > ram_size) { + return 0; + } +@@ -2865,7 +2922,7 @@ static uint32_t mvc_asc(int64_t l, uint64_t a1, uint64_t mode1, uint64_t a2, + uint32_t HELPER(mvcs)(uint64_t l, uint64_t a1, uint64_t a2) + { + HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n", +- __FUNCTION__, l, a1, a2); ++ __func__, l, a1, a2); + + return mvc_asc(l, a1, PSW_ASC_SECONDARY, a2, PSW_ASC_PRIMARY); + } +@@ -2873,7 +2930,7 @@ uint32_t HELPER(mvcs)(uint64_t l, uint64_t a1, uint64_t a2) + uint32_t HELPER(mvcp)(uint64_t l, uint64_t a1, uint64_t a2) + { + HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n", +- __FUNCTION__, l, a1, a2); ++ __func__, l, a1, a2); + + return mvc_asc(l, a1, PSW_ASC_PRIMARY, a2, PSW_ASC_SECONDARY); + } +@@ -2883,9 +2940,9 @@ uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) + int cc = 0; + + HELPER_LOG("%s: %016" PRIx64 " %08x %016" PRIx64 "\n", +- __FUNCTION__, order_code, r1, cpu_addr); ++ __func__, order_code, r1, cpu_addr); + +- /* Remember: Use "R1 or R1+1, whichever is the odd-numbered register" ++ /* Remember: Use "R1 or R1 + 1, whichever is the odd-numbered register" + as parameter (input). Status (output) is always R1. */ + + switch (order_code) { +@@ -2901,7 +2958,7 @@ uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) + env->regs[r1] &= 0xffffffff00000000ULL; + cc = 1; + break; +-#if !defined (CONFIG_USER_ONLY) ++#if !defined(CONFIG_USER_ONLY) + case SIGP_RESTART: + qemu_system_reset_request(); + cpu_loop_exit(env); +@@ -2922,7 +2979,7 @@ uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) + + void HELPER(sacf)(uint64_t a1) + { +- HELPER_LOG("%s: %16" PRIx64 "\n", __FUNCTION__, a1); ++ HELPER_LOG("%s: %16" PRIx64 "\n", __func__, a1); + + switch (a1 & 0xf00) { + case 0x000: +@@ -2953,13 +3010,13 @@ void HELPER(ipte)(uint64_t pte_addr, uint64_t vaddr) + /* XXX broadcast to other CPUs */ + + /* XXX Linux is nice enough to give us the exact pte address. +- According to spec we'd have to find it out ourselves */ ++ According to spec we'd have to find it out ourselves */ + /* XXX Linux is fine with overwriting the pte, the spec requires +- us to only set the invalid bit */ ++ us to only set the invalid bit */ + stq_phys(pte_addr, pte | _PAGE_INVALID); + + /* XXX we exploit the fact that Linux passes the exact virtual +- address here - it's not obliged to! */ ++ address here - it's not obliged to! */ + tlb_flush_page(env, page); + + /* XXX 31-bit hack */ +@@ -3008,7 +3065,8 @@ uint32_t HELPER(lra)(uint64_t addr, uint32_t r1) + env->exception_index = old_exc; + + if (!(env->psw.mask & PSW_MASK_64)) { +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | (ret & 0xffffffffULL); ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | ++ (ret & 0xffffffffULL); + } else { + env->regs[r1] = ret; + } +-- +1.7.12.1 + diff --git a/0006-target-s390x-split-FPU-ops.patch b/0006-target-s390x-split-FPU-ops.patch new file mode 100644 index 0000000..5aabf6f --- /dev/null +++ b/0006-target-s390x-split-FPU-ops.patch @@ -0,0 +1,1756 @@ +From 3eb9b25ae5d2bcc024646c5a04f28899661ab14c Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:31 +0000 +Subject: [PATCH] target-s390x: split FPU ops + +Move floating point instructions to fpu_helper.c. + +While exporting some condition code helpers, +avoid duplicate identifier conflict with translate.c. + +Remove unused set_cc_nz_f64() in translate.c. + +Signed-off-by: Blue Swirl +Signed-off-by: Alexander Graf +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 2 + + target-s390x/cpu.h | 6 + + target-s390x/fpu_helper.c | 836 +++++++++++++++++++++++++++++++++++++++++++++ + target-s390x/op_helper.c | 802 ------------------------------------------- + target-s390x/translate.c | 11 +- + 5 files changed, 847 insertions(+), 810 deletions(-) + create mode 100644 target-s390x/fpu_helper.c + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index 80be3bb..23b3bd9 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -1,5 +1,7 @@ + obj-y += translate.o op_helper.o helper.o cpu.o interrupt.o ++obj-y += fpu_helper.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + + $(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) ++$(obj)/fpu_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h +index 18ac6e3..b4620c5 100644 +--- a/target-s390x/cpu.h ++++ b/target-s390x/cpu.h +@@ -999,4 +999,10 @@ static inline void cpu_pc_from_tb(CPUS390XState *env, TranslationBlock* tb) + env->psw.addr = tb->pc; + } + ++/* fpu_helper.c */ ++uint32_t set_cc_f32(float32 v1, float32 v2); ++uint32_t set_cc_f64(float64 v1, float64 v2); ++uint32_t set_cc_nz_f32(float32 v); ++uint32_t set_cc_nz_f64(float64 v); ++ + #endif +diff --git a/target-s390x/fpu_helper.c b/target-s390x/fpu_helper.c +new file mode 100644 +index 0000000..1389052 +--- /dev/null ++++ b/target-s390x/fpu_helper.c +@@ -0,0 +1,836 @@ ++/* ++ * S/390 FPU helper routines ++ * ++ * Copyright (c) 2009 Ulrich Hecht ++ * Copyright (c) 2009 Alexander Graf ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, see . ++ */ ++ ++#include "cpu.h" ++#include "dyngen-exec.h" ++#include "helper.h" ++ ++#if !defined(CONFIG_USER_ONLY) ++#include "softmmu_exec.h" ++#endif ++ ++/* #define DEBUG_HELPER */ ++#ifdef DEBUG_HELPER ++#define HELPER_LOG(x...) qemu_log(x) ++#else ++#define HELPER_LOG(x...) ++#endif ++ ++static inline int float_comp_to_cc(int float_compare) ++{ ++ switch (float_compare) { ++ case float_relation_equal: ++ return 0; ++ case float_relation_less: ++ return 1; ++ case float_relation_greater: ++ return 2; ++ case float_relation_unordered: ++ return 3; ++ default: ++ cpu_abort(env, "unknown return value for float compare\n"); ++ } ++} ++ ++/* condition codes for binary FP ops */ ++uint32_t set_cc_f32(float32 v1, float32 v2) ++{ ++ return float_comp_to_cc(float32_compare_quiet(v1, v2, &env->fpu_status)); ++} ++ ++uint32_t set_cc_f64(float64 v1, float64 v2) ++{ ++ return float_comp_to_cc(float64_compare_quiet(v1, v2, &env->fpu_status)); ++} ++ ++/* condition codes for unary FP ops */ ++uint32_t set_cc_nz_f32(float32 v) ++{ ++ if (float32_is_any_nan(v)) { ++ return 3; ++ } else if (float32_is_zero(v)) { ++ return 0; ++ } else if (float32_is_neg(v)) { ++ return 1; ++ } else { ++ return 2; ++ } ++} ++ ++uint32_t set_cc_nz_f64(float64 v) ++{ ++ if (float64_is_any_nan(v)) { ++ return 3; ++ } else if (float64_is_zero(v)) { ++ return 0; ++ } else if (float64_is_neg(v)) { ++ return 1; ++ } else { ++ return 2; ++ } ++} ++ ++static uint32_t set_cc_nz_f128(float128 v) ++{ ++ if (float128_is_any_nan(v)) { ++ return 3; ++ } else if (float128_is_zero(v)) { ++ return 0; ++ } else if (float128_is_neg(v)) { ++ return 1; ++ } else { ++ return 2; ++ } ++} ++ ++/* convert 32-bit int to 64-bit float */ ++void HELPER(cdfbr)(uint32_t f1, int32_t v2) ++{ ++ HELPER_LOG("%s: converting %d to f%d\n", __func__, v2, f1); ++ env->fregs[f1].d = int32_to_float64(v2, &env->fpu_status); ++} ++ ++/* convert 32-bit int to 128-bit float */ ++void HELPER(cxfbr)(uint32_t f1, int32_t v2) ++{ ++ CPU_QuadU v1; ++ ++ v1.q = int32_to_float128(v2, &env->fpu_status); ++ env->fregs[f1].ll = v1.ll.upper; ++ env->fregs[f1 + 2].ll = v1.ll.lower; ++} ++ ++/* convert 64-bit int to 32-bit float */ ++void HELPER(cegbr)(uint32_t f1, int64_t v2) ++{ ++ HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1); ++ env->fregs[f1].l.upper = int64_to_float32(v2, &env->fpu_status); ++} ++ ++/* convert 64-bit int to 64-bit float */ ++void HELPER(cdgbr)(uint32_t f1, int64_t v2) ++{ ++ HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1); ++ env->fregs[f1].d = int64_to_float64(v2, &env->fpu_status); ++} ++ ++/* convert 64-bit int to 128-bit float */ ++void HELPER(cxgbr)(uint32_t f1, int64_t v2) ++{ ++ CPU_QuadU x1; ++ ++ x1.q = int64_to_float128(v2, &env->fpu_status); ++ HELPER_LOG("%s: converted %ld to 0x%lx and 0x%lx\n", __func__, v2, ++ x1.ll.upper, x1.ll.lower); ++ env->fregs[f1].ll = x1.ll.upper; ++ env->fregs[f1 + 2].ll = x1.ll.lower; ++} ++ ++/* convert 32-bit int to 32-bit float */ ++void HELPER(cefbr)(uint32_t f1, int32_t v2) ++{ ++ env->fregs[f1].l.upper = int32_to_float32(v2, &env->fpu_status); ++ HELPER_LOG("%s: converting %d to 0x%d in f%d\n", __func__, v2, ++ env->fregs[f1].l.upper, f1); ++} ++ ++/* 32-bit FP addition RR */ ++uint32_t HELPER(aebr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].l.upper = float32_add(env->fregs[f1].l.upper, ++ env->fregs[f2].l.upper, ++ &env->fpu_status); ++ HELPER_LOG("%s: adding 0x%d resulting in 0x%d in f%d\n", __func__, ++ env->fregs[f2].l.upper, env->fregs[f1].l.upper, f1); ++ ++ return set_cc_nz_f32(env->fregs[f1].l.upper); ++} ++ ++/* 64-bit FP addition RR */ ++uint32_t HELPER(adbr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].d = float64_add(env->fregs[f1].d, env->fregs[f2].d, ++ &env->fpu_status); ++ HELPER_LOG("%s: adding 0x%ld resulting in 0x%ld in f%d\n", __func__, ++ env->fregs[f2].d, env->fregs[f1].d, f1); ++ ++ return set_cc_nz_f64(env->fregs[f1].d); ++} ++ ++/* 32-bit FP subtraction RR */ ++uint32_t HELPER(sebr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].l.upper = float32_sub(env->fregs[f1].l.upper, ++ env->fregs[f2].l.upper, ++ &env->fpu_status); ++ HELPER_LOG("%s: adding 0x%d resulting in 0x%d in f%d\n", __func__, ++ env->fregs[f2].l.upper, env->fregs[f1].l.upper, f1); ++ ++ return set_cc_nz_f32(env->fregs[f1].l.upper); ++} ++ ++/* 64-bit FP subtraction RR */ ++uint32_t HELPER(sdbr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].d = float64_sub(env->fregs[f1].d, env->fregs[f2].d, ++ &env->fpu_status); ++ HELPER_LOG("%s: subtracting 0x%ld resulting in 0x%ld in f%d\n", ++ __func__, env->fregs[f2].d, env->fregs[f1].d, f1); ++ ++ return set_cc_nz_f64(env->fregs[f1].d); ++} ++ ++/* 32-bit FP division RR */ ++void HELPER(debr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].l.upper = float32_div(env->fregs[f1].l.upper, ++ env->fregs[f2].l.upper, ++ &env->fpu_status); ++} ++ ++/* 128-bit FP division RR */ ++void HELPER(dxbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU v1; ++ CPU_QuadU v2; ++ CPU_QuadU res; ++ ++ v1.ll.upper = env->fregs[f1].ll; ++ v1.ll.lower = env->fregs[f1 + 2].ll; ++ v2.ll.upper = env->fregs[f2].ll; ++ v2.ll.lower = env->fregs[f2 + 2].ll; ++ res.q = float128_div(v1.q, v2.q, &env->fpu_status); ++ env->fregs[f1].ll = res.ll.upper; ++ env->fregs[f1 + 2].ll = res.ll.lower; ++} ++ ++/* 64-bit FP multiplication RR */ ++void HELPER(mdbr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].d = float64_mul(env->fregs[f1].d, env->fregs[f2].d, ++ &env->fpu_status); ++} ++ ++/* 128-bit FP multiplication RR */ ++void HELPER(mxbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU v1; ++ CPU_QuadU v2; ++ CPU_QuadU res; ++ ++ v1.ll.upper = env->fregs[f1].ll; ++ v1.ll.lower = env->fregs[f1 + 2].ll; ++ v2.ll.upper = env->fregs[f2].ll; ++ v2.ll.lower = env->fregs[f2 + 2].ll; ++ res.q = float128_mul(v1.q, v2.q, &env->fpu_status); ++ env->fregs[f1].ll = res.ll.upper; ++ env->fregs[f1 + 2].ll = res.ll.lower; ++} ++ ++/* convert 32-bit float to 64-bit float */ ++void HELPER(ldebr)(uint32_t r1, uint32_t r2) ++{ ++ env->fregs[r1].d = float32_to_float64(env->fregs[r2].l.upper, ++ &env->fpu_status); ++} ++ ++/* convert 128-bit float to 64-bit float */ ++void HELPER(ldxbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU x2; ++ ++ x2.ll.upper = env->fregs[f2].ll; ++ x2.ll.lower = env->fregs[f2 + 2].ll; ++ env->fregs[f1].d = float128_to_float64(x2.q, &env->fpu_status); ++ HELPER_LOG("%s: to 0x%ld\n", __func__, env->fregs[f1].d); ++} ++ ++/* convert 64-bit float to 128-bit float */ ++void HELPER(lxdbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU res; ++ ++ res.q = float64_to_float128(env->fregs[f2].d, &env->fpu_status); ++ env->fregs[f1].ll = res.ll.upper; ++ env->fregs[f1 + 2].ll = res.ll.lower; ++} ++ ++/* convert 64-bit float to 32-bit float */ ++void HELPER(ledbr)(uint32_t f1, uint32_t f2) ++{ ++ float64 d2 = env->fregs[f2].d; ++ ++ env->fregs[f1].l.upper = float64_to_float32(d2, &env->fpu_status); ++} ++ ++/* convert 128-bit float to 32-bit float */ ++void HELPER(lexbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU x2; ++ ++ x2.ll.upper = env->fregs[f2].ll; ++ x2.ll.lower = env->fregs[f2 + 2].ll; ++ env->fregs[f1].l.upper = float128_to_float32(x2.q, &env->fpu_status); ++ HELPER_LOG("%s: to 0x%d\n", __func__, env->fregs[f1].l.upper); ++} ++ ++/* absolute value of 32-bit float */ ++uint32_t HELPER(lpebr)(uint32_t f1, uint32_t f2) ++{ ++ float32 v1; ++ float32 v2 = env->fregs[f2].d; ++ ++ v1 = float32_abs(v2); ++ env->fregs[f1].d = v1; ++ return set_cc_nz_f32(v1); ++} ++ ++/* absolute value of 64-bit float */ ++uint32_t HELPER(lpdbr)(uint32_t f1, uint32_t f2) ++{ ++ float64 v1; ++ float64 v2 = env->fregs[f2].d; ++ ++ v1 = float64_abs(v2); ++ env->fregs[f1].d = v1; ++ return set_cc_nz_f64(v1); ++} ++ ++/* absolute value of 128-bit float */ ++uint32_t HELPER(lpxbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU v1; ++ CPU_QuadU v2; ++ ++ v2.ll.upper = env->fregs[f2].ll; ++ v2.ll.lower = env->fregs[f2 + 2].ll; ++ v1.q = float128_abs(v2.q); ++ env->fregs[f1].ll = v1.ll.upper; ++ env->fregs[f1 + 2].ll = v1.ll.lower; ++ return set_cc_nz_f128(v1.q); ++} ++ ++/* load and test 64-bit float */ ++uint32_t HELPER(ltdbr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].d = env->fregs[f2].d; ++ return set_cc_nz_f64(env->fregs[f1].d); ++} ++ ++/* load and test 32-bit float */ ++uint32_t HELPER(ltebr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].l.upper = env->fregs[f2].l.upper; ++ return set_cc_nz_f32(env->fregs[f1].l.upper); ++} ++ ++/* load and test 128-bit float */ ++uint32_t HELPER(ltxbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU x; ++ ++ x.ll.upper = env->fregs[f2].ll; ++ x.ll.lower = env->fregs[f2 + 2].ll; ++ env->fregs[f1].ll = x.ll.upper; ++ env->fregs[f1 + 2].ll = x.ll.lower; ++ return set_cc_nz_f128(x.q); ++} ++ ++/* load complement of 32-bit float */ ++uint32_t HELPER(lcebr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].l.upper = float32_chs(env->fregs[f2].l.upper); ++ ++ return set_cc_nz_f32(env->fregs[f1].l.upper); ++} ++ ++/* load complement of 64-bit float */ ++uint32_t HELPER(lcdbr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].d = float64_chs(env->fregs[f2].d); ++ ++ return set_cc_nz_f64(env->fregs[f1].d); ++} ++ ++/* load complement of 128-bit float */ ++uint32_t HELPER(lcxbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU x1, x2; ++ ++ x2.ll.upper = env->fregs[f2].ll; ++ x2.ll.lower = env->fregs[f2 + 2].ll; ++ x1.q = float128_chs(x2.q); ++ env->fregs[f1].ll = x1.ll.upper; ++ env->fregs[f1 + 2].ll = x1.ll.lower; ++ return set_cc_nz_f128(x1.q); ++} ++ ++/* 32-bit FP addition RM */ ++void HELPER(aeb)(uint32_t f1, uint32_t val) ++{ ++ float32 v1 = env->fregs[f1].l.upper; ++ CPU_FloatU v2; ++ ++ v2.l = val; ++ HELPER_LOG("%s: adding 0x%d from f%d and 0x%d\n", __func__, ++ v1, f1, v2.f); ++ env->fregs[f1].l.upper = float32_add(v1, v2.f, &env->fpu_status); ++} ++ ++/* 32-bit FP division RM */ ++void HELPER(deb)(uint32_t f1, uint32_t val) ++{ ++ float32 v1 = env->fregs[f1].l.upper; ++ CPU_FloatU v2; ++ ++ v2.l = val; ++ HELPER_LOG("%s: dividing 0x%d from f%d by 0x%d\n", __func__, ++ v1, f1, v2.f); ++ env->fregs[f1].l.upper = float32_div(v1, v2.f, &env->fpu_status); ++} ++ ++/* 32-bit FP multiplication RM */ ++void HELPER(meeb)(uint32_t f1, uint32_t val) ++{ ++ float32 v1 = env->fregs[f1].l.upper; ++ CPU_FloatU v2; ++ ++ v2.l = val; ++ HELPER_LOG("%s: multiplying 0x%d from f%d and 0x%d\n", __func__, ++ v1, f1, v2.f); ++ env->fregs[f1].l.upper = float32_mul(v1, v2.f, &env->fpu_status); ++} ++ ++/* 32-bit FP compare RR */ ++uint32_t HELPER(cebr)(uint32_t f1, uint32_t f2) ++{ ++ float32 v1 = env->fregs[f1].l.upper; ++ float32 v2 = env->fregs[f2].l.upper; ++ ++ HELPER_LOG("%s: comparing 0x%d from f%d and 0x%d\n", __func__, ++ v1, f1, v2); ++ return set_cc_f32(v1, v2); ++} ++ ++/* 64-bit FP compare RR */ ++uint32_t HELPER(cdbr)(uint32_t f1, uint32_t f2) ++{ ++ float64 v1 = env->fregs[f1].d; ++ float64 v2 = env->fregs[f2].d; ++ ++ HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%ld\n", __func__, ++ v1, f1, v2); ++ return set_cc_f64(v1, v2); ++} ++ ++/* 128-bit FP compare RR */ ++uint32_t HELPER(cxbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU v1; ++ CPU_QuadU v2; ++ ++ v1.ll.upper = env->fregs[f1].ll; ++ v1.ll.lower = env->fregs[f1 + 2].ll; ++ v2.ll.upper = env->fregs[f2].ll; ++ v2.ll.lower = env->fregs[f2 + 2].ll; ++ ++ return float_comp_to_cc(float128_compare_quiet(v1.q, v2.q, ++ &env->fpu_status)); ++} ++ ++/* 64-bit FP compare RM */ ++uint32_t HELPER(cdb)(uint32_t f1, uint64_t a2) ++{ ++ float64 v1 = env->fregs[f1].d; ++ CPU_DoubleU v2; ++ ++ v2.ll = ldq(a2); ++ HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%lx\n", __func__, v1, ++ f1, v2.d); ++ return set_cc_f64(v1, v2.d); ++} ++ ++/* 64-bit FP addition RM */ ++uint32_t HELPER(adb)(uint32_t f1, uint64_t a2) ++{ ++ float64 v1 = env->fregs[f1].d; ++ CPU_DoubleU v2; ++ ++ v2.ll = ldq(a2); ++ HELPER_LOG("%s: adding 0x%lx from f%d and 0x%lx\n", __func__, ++ v1, f1, v2.d); ++ env->fregs[f1].d = v1 = float64_add(v1, v2.d, &env->fpu_status); ++ return set_cc_nz_f64(v1); ++} ++ ++/* 32-bit FP subtraction RM */ ++void HELPER(seb)(uint32_t f1, uint32_t val) ++{ ++ float32 v1 = env->fregs[f1].l.upper; ++ CPU_FloatU v2; ++ ++ v2.l = val; ++ env->fregs[f1].l.upper = float32_sub(v1, v2.f, &env->fpu_status); ++} ++ ++/* 64-bit FP subtraction RM */ ++uint32_t HELPER(sdb)(uint32_t f1, uint64_t a2) ++{ ++ float64 v1 = env->fregs[f1].d; ++ CPU_DoubleU v2; ++ ++ v2.ll = ldq(a2); ++ env->fregs[f1].d = v1 = float64_sub(v1, v2.d, &env->fpu_status); ++ return set_cc_nz_f64(v1); ++} ++ ++/* 64-bit FP multiplication RM */ ++void HELPER(mdb)(uint32_t f1, uint64_t a2) ++{ ++ float64 v1 = env->fregs[f1].d; ++ CPU_DoubleU v2; ++ ++ v2.ll = ldq(a2); ++ HELPER_LOG("%s: multiplying 0x%lx from f%d and 0x%ld\n", __func__, ++ v1, f1, v2.d); ++ env->fregs[f1].d = float64_mul(v1, v2.d, &env->fpu_status); ++} ++ ++/* 64-bit FP division RM */ ++void HELPER(ddb)(uint32_t f1, uint64_t a2) ++{ ++ float64 v1 = env->fregs[f1].d; ++ CPU_DoubleU v2; ++ ++ v2.ll = ldq(a2); ++ HELPER_LOG("%s: dividing 0x%lx from f%d by 0x%ld\n", __func__, ++ v1, f1, v2.d); ++ env->fregs[f1].d = float64_div(v1, v2.d, &env->fpu_status); ++} ++ ++static void set_round_mode(int m3) ++{ ++ switch (m3) { ++ case 0: ++ /* current mode */ ++ break; ++ case 1: ++ /* biased round no nearest */ ++ case 4: ++ /* round to nearest */ ++ set_float_rounding_mode(float_round_nearest_even, &env->fpu_status); ++ break; ++ case 5: ++ /* round to zero */ ++ set_float_rounding_mode(float_round_to_zero, &env->fpu_status); ++ break; ++ case 6: ++ /* round to +inf */ ++ set_float_rounding_mode(float_round_up, &env->fpu_status); ++ break; ++ case 7: ++ /* round to -inf */ ++ set_float_rounding_mode(float_round_down, &env->fpu_status); ++ break; ++ } ++} ++ ++/* convert 32-bit float to 64-bit int */ ++uint32_t HELPER(cgebr)(uint32_t r1, uint32_t f2, uint32_t m3) ++{ ++ float32 v2 = env->fregs[f2].l.upper; ++ ++ set_round_mode(m3); ++ env->regs[r1] = float32_to_int64(v2, &env->fpu_status); ++ return set_cc_nz_f32(v2); ++} ++ ++/* convert 64-bit float to 64-bit int */ ++uint32_t HELPER(cgdbr)(uint32_t r1, uint32_t f2, uint32_t m3) ++{ ++ float64 v2 = env->fregs[f2].d; ++ ++ set_round_mode(m3); ++ env->regs[r1] = float64_to_int64(v2, &env->fpu_status); ++ return set_cc_nz_f64(v2); ++} ++ ++/* convert 128-bit float to 64-bit int */ ++uint32_t HELPER(cgxbr)(uint32_t r1, uint32_t f2, uint32_t m3) ++{ ++ CPU_QuadU v2; ++ ++ v2.ll.upper = env->fregs[f2].ll; ++ v2.ll.lower = env->fregs[f2 + 2].ll; ++ set_round_mode(m3); ++ env->regs[r1] = float128_to_int64(v2.q, &env->fpu_status); ++ if (float128_is_any_nan(v2.q)) { ++ return 3; ++ } else if (float128_is_zero(v2.q)) { ++ return 0; ++ } else if (float128_is_neg(v2.q)) { ++ return 1; ++ } else { ++ return 2; ++ } ++} ++ ++/* convert 32-bit float to 32-bit int */ ++uint32_t HELPER(cfebr)(uint32_t r1, uint32_t f2, uint32_t m3) ++{ ++ float32 v2 = env->fregs[f2].l.upper; ++ ++ set_round_mode(m3); ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | ++ float32_to_int32(v2, &env->fpu_status); ++ return set_cc_nz_f32(v2); ++} ++ ++/* convert 64-bit float to 32-bit int */ ++uint32_t HELPER(cfdbr)(uint32_t r1, uint32_t f2, uint32_t m3) ++{ ++ float64 v2 = env->fregs[f2].d; ++ ++ set_round_mode(m3); ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | ++ float64_to_int32(v2, &env->fpu_status); ++ return set_cc_nz_f64(v2); ++} ++ ++/* convert 128-bit float to 32-bit int */ ++uint32_t HELPER(cfxbr)(uint32_t r1, uint32_t f2, uint32_t m3) ++{ ++ CPU_QuadU v2; ++ ++ v2.ll.upper = env->fregs[f2].ll; ++ v2.ll.lower = env->fregs[f2 + 2].ll; ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | ++ float128_to_int32(v2.q, &env->fpu_status); ++ return set_cc_nz_f128(v2.q); ++} ++ ++/* load 32-bit FP zero */ ++void HELPER(lzer)(uint32_t f1) ++{ ++ env->fregs[f1].l.upper = float32_zero; ++} ++ ++/* load 64-bit FP zero */ ++void HELPER(lzdr)(uint32_t f1) ++{ ++ env->fregs[f1].d = float64_zero; ++} ++ ++/* load 128-bit FP zero */ ++void HELPER(lzxr)(uint32_t f1) ++{ ++ CPU_QuadU x; ++ ++ x.q = float64_to_float128(float64_zero, &env->fpu_status); ++ env->fregs[f1].ll = x.ll.upper; ++ env->fregs[f1 + 1].ll = x.ll.lower; ++} ++ ++/* 128-bit FP subtraction RR */ ++uint32_t HELPER(sxbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU v1; ++ CPU_QuadU v2; ++ CPU_QuadU res; ++ ++ v1.ll.upper = env->fregs[f1].ll; ++ v1.ll.lower = env->fregs[f1 + 2].ll; ++ v2.ll.upper = env->fregs[f2].ll; ++ v2.ll.lower = env->fregs[f2 + 2].ll; ++ res.q = float128_sub(v1.q, v2.q, &env->fpu_status); ++ env->fregs[f1].ll = res.ll.upper; ++ env->fregs[f1 + 2].ll = res.ll.lower; ++ return set_cc_nz_f128(res.q); ++} ++ ++/* 128-bit FP addition RR */ ++uint32_t HELPER(axbr)(uint32_t f1, uint32_t f2) ++{ ++ CPU_QuadU v1; ++ CPU_QuadU v2; ++ CPU_QuadU res; ++ ++ v1.ll.upper = env->fregs[f1].ll; ++ v1.ll.lower = env->fregs[f1 + 2].ll; ++ v2.ll.upper = env->fregs[f2].ll; ++ v2.ll.lower = env->fregs[f2 + 2].ll; ++ res.q = float128_add(v1.q, v2.q, &env->fpu_status); ++ env->fregs[f1].ll = res.ll.upper; ++ env->fregs[f1 + 2].ll = res.ll.lower; ++ return set_cc_nz_f128(res.q); ++} ++ ++/* 32-bit FP multiplication RR */ ++void HELPER(meebr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].l.upper = float32_mul(env->fregs[f1].l.upper, ++ env->fregs[f2].l.upper, ++ &env->fpu_status); ++} ++ ++/* 64-bit FP division RR */ ++void HELPER(ddbr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].d = float64_div(env->fregs[f1].d, env->fregs[f2].d, ++ &env->fpu_status); ++} ++ ++/* 64-bit FP multiply and add RM */ ++void HELPER(madb)(uint32_t f1, uint64_t a2, uint32_t f3) ++{ ++ CPU_DoubleU v2; ++ ++ HELPER_LOG("%s: f1 %d a2 0x%lx f3 %d\n", __func__, f1, a2, f3); ++ v2.ll = ldq(a2); ++ env->fregs[f1].d = float64_add(env->fregs[f1].d, ++ float64_mul(v2.d, env->fregs[f3].d, ++ &env->fpu_status), ++ &env->fpu_status); ++} ++ ++/* 64-bit FP multiply and add RR */ ++void HELPER(madbr)(uint32_t f1, uint32_t f3, uint32_t f2) ++{ ++ HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __func__, f1, f2, f3); ++ env->fregs[f1].d = float64_add(float64_mul(env->fregs[f2].d, ++ env->fregs[f3].d, ++ &env->fpu_status), ++ env->fregs[f1].d, &env->fpu_status); ++} ++ ++/* 64-bit FP multiply and subtract RR */ ++void HELPER(msdbr)(uint32_t f1, uint32_t f3, uint32_t f2) ++{ ++ HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __func__, f1, f2, f3); ++ env->fregs[f1].d = float64_sub(float64_mul(env->fregs[f2].d, ++ env->fregs[f3].d, ++ &env->fpu_status), ++ env->fregs[f1].d, &env->fpu_status); ++} ++ ++/* 32-bit FP multiply and add RR */ ++void HELPER(maebr)(uint32_t f1, uint32_t f3, uint32_t f2) ++{ ++ env->fregs[f1].l.upper = float32_add(env->fregs[f1].l.upper, ++ float32_mul(env->fregs[f2].l.upper, ++ env->fregs[f3].l.upper, ++ &env->fpu_status), ++ &env->fpu_status); ++} ++ ++/* convert 32-bit float to 64-bit float */ ++void HELPER(ldeb)(uint32_t f1, uint64_t a2) ++{ ++ uint32_t v2; ++ ++ v2 = ldl(a2); ++ env->fregs[f1].d = float32_to_float64(v2, ++ &env->fpu_status); ++} ++ ++/* convert 64-bit float to 128-bit float */ ++void HELPER(lxdb)(uint32_t f1, uint64_t a2) ++{ ++ CPU_DoubleU v2; ++ CPU_QuadU v1; ++ ++ v2.ll = ldq(a2); ++ v1.q = float64_to_float128(v2.d, &env->fpu_status); ++ env->fregs[f1].ll = v1.ll.upper; ++ env->fregs[f1 + 2].ll = v1.ll.lower; ++} ++ ++/* test data class 32-bit */ ++uint32_t HELPER(tceb)(uint32_t f1, uint64_t m2) ++{ ++ float32 v1 = env->fregs[f1].l.upper; ++ int neg = float32_is_neg(v1); ++ uint32_t cc = 0; ++ ++ HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __func__, (long)v1, m2, neg); ++ if ((float32_is_zero(v1) && (m2 & (1 << (11-neg)))) || ++ (float32_is_infinity(v1) && (m2 & (1 << (5-neg)))) || ++ (float32_is_any_nan(v1) && (m2 & (1 << (3-neg)))) || ++ (float32_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) { ++ cc = 1; ++ } else if (m2 & (1 << (9-neg))) { ++ /* assume normalized number */ ++ cc = 1; ++ } ++ ++ /* FIXME: denormalized? */ ++ return cc; ++} ++ ++/* test data class 64-bit */ ++uint32_t HELPER(tcdb)(uint32_t f1, uint64_t m2) ++{ ++ float64 v1 = env->fregs[f1].d; ++ int neg = float64_is_neg(v1); ++ uint32_t cc = 0; ++ ++ HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __func__, v1, m2, neg); ++ if ((float64_is_zero(v1) && (m2 & (1 << (11-neg)))) || ++ (float64_is_infinity(v1) && (m2 & (1 << (5-neg)))) || ++ (float64_is_any_nan(v1) && (m2 & (1 << (3-neg)))) || ++ (float64_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) { ++ cc = 1; ++ } else if (m2 & (1 << (9-neg))) { ++ /* assume normalized number */ ++ cc = 1; ++ } ++ /* FIXME: denormalized? */ ++ return cc; ++} ++ ++/* test data class 128-bit */ ++uint32_t HELPER(tcxb)(uint32_t f1, uint64_t m2) ++{ ++ CPU_QuadU v1; ++ uint32_t cc = 0; ++ int neg; ++ ++ v1.ll.upper = env->fregs[f1].ll; ++ v1.ll.lower = env->fregs[f1 + 2].ll; ++ ++ neg = float128_is_neg(v1.q); ++ if ((float128_is_zero(v1.q) && (m2 & (1 << (11-neg)))) || ++ (float128_is_infinity(v1.q) && (m2 & (1 << (5-neg)))) || ++ (float128_is_any_nan(v1.q) && (m2 & (1 << (3-neg)))) || ++ (float128_is_signaling_nan(v1.q) && (m2 & (1 << (1-neg))))) { ++ cc = 1; ++ } else if (m2 & (1 << (9-neg))) { ++ /* assume normalized number */ ++ cc = 1; ++ } ++ /* FIXME: denormalized? */ ++ return cc; ++} ++ ++/* square root 64-bit RR */ ++void HELPER(sqdbr)(uint32_t f1, uint32_t f2) ++{ ++ env->fregs[f1].d = float64_sqrt(env->fregs[f2].d, &env->fpu_status); ++} +diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c +index 195e93e..270bf14 100644 +--- a/target-s390x/op_helper.c ++++ b/target-s390x/op_helper.c +@@ -977,802 +977,6 @@ uint32_t HELPER(slbg)(uint32_t cc, uint32_t r1, uint64_t v1, uint64_t v2) + } + } + +-static inline int float_comp_to_cc(int float_compare) +-{ +- switch (float_compare) { +- case float_relation_equal: +- return 0; +- case float_relation_less: +- return 1; +- case float_relation_greater: +- return 2; +- case float_relation_unordered: +- return 3; +- default: +- cpu_abort(env, "unknown return value for float compare\n"); +- } +-} +- +-/* condition codes for binary FP ops */ +-static uint32_t set_cc_f32(float32 v1, float32 v2) +-{ +- return float_comp_to_cc(float32_compare_quiet(v1, v2, &env->fpu_status)); +-} +- +-static uint32_t set_cc_f64(float64 v1, float64 v2) +-{ +- return float_comp_to_cc(float64_compare_quiet(v1, v2, &env->fpu_status)); +-} +- +-/* condition codes for unary FP ops */ +-static uint32_t set_cc_nz_f32(float32 v) +-{ +- if (float32_is_any_nan(v)) { +- return 3; +- } else if (float32_is_zero(v)) { +- return 0; +- } else if (float32_is_neg(v)) { +- return 1; +- } else { +- return 2; +- } +-} +- +-static uint32_t set_cc_nz_f64(float64 v) +-{ +- if (float64_is_any_nan(v)) { +- return 3; +- } else if (float64_is_zero(v)) { +- return 0; +- } else if (float64_is_neg(v)) { +- return 1; +- } else { +- return 2; +- } +-} +- +-static uint32_t set_cc_nz_f128(float128 v) +-{ +- if (float128_is_any_nan(v)) { +- return 3; +- } else if (float128_is_zero(v)) { +- return 0; +- } else if (float128_is_neg(v)) { +- return 1; +- } else { +- return 2; +- } +-} +- +-/* convert 32-bit int to 64-bit float */ +-void HELPER(cdfbr)(uint32_t f1, int32_t v2) +-{ +- HELPER_LOG("%s: converting %d to f%d\n", __func__, v2, f1); +- env->fregs[f1].d = int32_to_float64(v2, &env->fpu_status); +-} +- +-/* convert 32-bit int to 128-bit float */ +-void HELPER(cxfbr)(uint32_t f1, int32_t v2) +-{ +- CPU_QuadU v1; +- +- v1.q = int32_to_float128(v2, &env->fpu_status); +- env->fregs[f1].ll = v1.ll.upper; +- env->fregs[f1 + 2].ll = v1.ll.lower; +-} +- +-/* convert 64-bit int to 32-bit float */ +-void HELPER(cegbr)(uint32_t f1, int64_t v2) +-{ +- HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1); +- env->fregs[f1].l.upper = int64_to_float32(v2, &env->fpu_status); +-} +- +-/* convert 64-bit int to 64-bit float */ +-void HELPER(cdgbr)(uint32_t f1, int64_t v2) +-{ +- HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1); +- env->fregs[f1].d = int64_to_float64(v2, &env->fpu_status); +-} +- +-/* convert 64-bit int to 128-bit float */ +-void HELPER(cxgbr)(uint32_t f1, int64_t v2) +-{ +- CPU_QuadU x1; +- +- x1.q = int64_to_float128(v2, &env->fpu_status); +- HELPER_LOG("%s: converted %ld to 0x%lx and 0x%lx\n", __func__, v2, +- x1.ll.upper, x1.ll.lower); +- env->fregs[f1].ll = x1.ll.upper; +- env->fregs[f1 + 2].ll = x1.ll.lower; +-} +- +-/* convert 32-bit int to 32-bit float */ +-void HELPER(cefbr)(uint32_t f1, int32_t v2) +-{ +- env->fregs[f1].l.upper = int32_to_float32(v2, &env->fpu_status); +- HELPER_LOG("%s: converting %d to 0x%d in f%d\n", __func__, v2, +- env->fregs[f1].l.upper, f1); +-} +- +-/* 32-bit FP addition RR */ +-uint32_t HELPER(aebr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].l.upper = float32_add(env->fregs[f1].l.upper, +- env->fregs[f2].l.upper, +- &env->fpu_status); +- HELPER_LOG("%s: adding 0x%d resulting in 0x%d in f%d\n", __func__, +- env->fregs[f2].l.upper, env->fregs[f1].l.upper, f1); +- +- return set_cc_nz_f32(env->fregs[f1].l.upper); +-} +- +-/* 64-bit FP addition RR */ +-uint32_t HELPER(adbr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].d = float64_add(env->fregs[f1].d, env->fregs[f2].d, +- &env->fpu_status); +- HELPER_LOG("%s: adding 0x%ld resulting in 0x%ld in f%d\n", __func__, +- env->fregs[f2].d, env->fregs[f1].d, f1); +- +- return set_cc_nz_f64(env->fregs[f1].d); +-} +- +-/* 32-bit FP subtraction RR */ +-uint32_t HELPER(sebr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].l.upper = float32_sub(env->fregs[f1].l.upper, +- env->fregs[f2].l.upper, +- &env->fpu_status); +- HELPER_LOG("%s: adding 0x%d resulting in 0x%d in f%d\n", __func__, +- env->fregs[f2].l.upper, env->fregs[f1].l.upper, f1); +- +- return set_cc_nz_f32(env->fregs[f1].l.upper); +-} +- +-/* 64-bit FP subtraction RR */ +-uint32_t HELPER(sdbr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].d = float64_sub(env->fregs[f1].d, env->fregs[f2].d, +- &env->fpu_status); +- HELPER_LOG("%s: subtracting 0x%ld resulting in 0x%ld in f%d\n", +- __func__, env->fregs[f2].d, env->fregs[f1].d, f1); +- +- return set_cc_nz_f64(env->fregs[f1].d); +-} +- +-/* 32-bit FP division RR */ +-void HELPER(debr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].l.upper = float32_div(env->fregs[f1].l.upper, +- env->fregs[f2].l.upper, +- &env->fpu_status); +-} +- +-/* 128-bit FP division RR */ +-void HELPER(dxbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU v1; +- CPU_QuadU v2; +- CPU_QuadU res; +- +- v1.ll.upper = env->fregs[f1].ll; +- v1.ll.lower = env->fregs[f1 + 2].ll; +- v2.ll.upper = env->fregs[f2].ll; +- v2.ll.lower = env->fregs[f2 + 2].ll; +- res.q = float128_div(v1.q, v2.q, &env->fpu_status); +- env->fregs[f1].ll = res.ll.upper; +- env->fregs[f1 + 2].ll = res.ll.lower; +-} +- +-/* 64-bit FP multiplication RR */ +-void HELPER(mdbr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].d = float64_mul(env->fregs[f1].d, env->fregs[f2].d, +- &env->fpu_status); +-} +- +-/* 128-bit FP multiplication RR */ +-void HELPER(mxbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU v1; +- CPU_QuadU v2; +- CPU_QuadU res; +- +- v1.ll.upper = env->fregs[f1].ll; +- v1.ll.lower = env->fregs[f1 + 2].ll; +- v2.ll.upper = env->fregs[f2].ll; +- v2.ll.lower = env->fregs[f2 + 2].ll; +- res.q = float128_mul(v1.q, v2.q, &env->fpu_status); +- env->fregs[f1].ll = res.ll.upper; +- env->fregs[f1 + 2].ll = res.ll.lower; +-} +- +-/* convert 32-bit float to 64-bit float */ +-void HELPER(ldebr)(uint32_t r1, uint32_t r2) +-{ +- env->fregs[r1].d = float32_to_float64(env->fregs[r2].l.upper, +- &env->fpu_status); +-} +- +-/* convert 128-bit float to 64-bit float */ +-void HELPER(ldxbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU x2; +- +- x2.ll.upper = env->fregs[f2].ll; +- x2.ll.lower = env->fregs[f2 + 2].ll; +- env->fregs[f1].d = float128_to_float64(x2.q, &env->fpu_status); +- HELPER_LOG("%s: to 0x%ld\n", __func__, env->fregs[f1].d); +-} +- +-/* convert 64-bit float to 128-bit float */ +-void HELPER(lxdbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU res; +- +- res.q = float64_to_float128(env->fregs[f2].d, &env->fpu_status); +- env->fregs[f1].ll = res.ll.upper; +- env->fregs[f1 + 2].ll = res.ll.lower; +-} +- +-/* convert 64-bit float to 32-bit float */ +-void HELPER(ledbr)(uint32_t f1, uint32_t f2) +-{ +- float64 d2 = env->fregs[f2].d; +- +- env->fregs[f1].l.upper = float64_to_float32(d2, &env->fpu_status); +-} +- +-/* convert 128-bit float to 32-bit float */ +-void HELPER(lexbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU x2; +- +- x2.ll.upper = env->fregs[f2].ll; +- x2.ll.lower = env->fregs[f2 + 2].ll; +- env->fregs[f1].l.upper = float128_to_float32(x2.q, &env->fpu_status); +- HELPER_LOG("%s: to 0x%d\n", __func__, env->fregs[f1].l.upper); +-} +- +-/* absolute value of 32-bit float */ +-uint32_t HELPER(lpebr)(uint32_t f1, uint32_t f2) +-{ +- float32 v1; +- float32 v2 = env->fregs[f2].d; +- +- v1 = float32_abs(v2); +- env->fregs[f1].d = v1; +- return set_cc_nz_f32(v1); +-} +- +-/* absolute value of 64-bit float */ +-uint32_t HELPER(lpdbr)(uint32_t f1, uint32_t f2) +-{ +- float64 v1; +- float64 v2 = env->fregs[f2].d; +- +- v1 = float64_abs(v2); +- env->fregs[f1].d = v1; +- return set_cc_nz_f64(v1); +-} +- +-/* absolute value of 128-bit float */ +-uint32_t HELPER(lpxbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU v1; +- CPU_QuadU v2; +- +- v2.ll.upper = env->fregs[f2].ll; +- v2.ll.lower = env->fregs[f2 + 2].ll; +- v1.q = float128_abs(v2.q); +- env->fregs[f1].ll = v1.ll.upper; +- env->fregs[f1 + 2].ll = v1.ll.lower; +- return set_cc_nz_f128(v1.q); +-} +- +-/* load and test 64-bit float */ +-uint32_t HELPER(ltdbr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].d = env->fregs[f2].d; +- return set_cc_nz_f64(env->fregs[f1].d); +-} +- +-/* load and test 32-bit float */ +-uint32_t HELPER(ltebr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].l.upper = env->fregs[f2].l.upper; +- return set_cc_nz_f32(env->fregs[f1].l.upper); +-} +- +-/* load and test 128-bit float */ +-uint32_t HELPER(ltxbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU x; +- +- x.ll.upper = env->fregs[f2].ll; +- x.ll.lower = env->fregs[f2 + 2].ll; +- env->fregs[f1].ll = x.ll.upper; +- env->fregs[f1 + 2].ll = x.ll.lower; +- return set_cc_nz_f128(x.q); +-} +- +-/* load complement of 32-bit float */ +-uint32_t HELPER(lcebr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].l.upper = float32_chs(env->fregs[f2].l.upper); +- +- return set_cc_nz_f32(env->fregs[f1].l.upper); +-} +- +-/* load complement of 64-bit float */ +-uint32_t HELPER(lcdbr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].d = float64_chs(env->fregs[f2].d); +- +- return set_cc_nz_f64(env->fregs[f1].d); +-} +- +-/* load complement of 128-bit float */ +-uint32_t HELPER(lcxbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU x1, x2; +- +- x2.ll.upper = env->fregs[f2].ll; +- x2.ll.lower = env->fregs[f2 + 2].ll; +- x1.q = float128_chs(x2.q); +- env->fregs[f1].ll = x1.ll.upper; +- env->fregs[f1 + 2].ll = x1.ll.lower; +- return set_cc_nz_f128(x1.q); +-} +- +-/* 32-bit FP addition RM */ +-void HELPER(aeb)(uint32_t f1, uint32_t val) +-{ +- float32 v1 = env->fregs[f1].l.upper; +- CPU_FloatU v2; +- +- v2.l = val; +- HELPER_LOG("%s: adding 0x%d from f%d and 0x%d\n", __func__, +- v1, f1, v2.f); +- env->fregs[f1].l.upper = float32_add(v1, v2.f, &env->fpu_status); +-} +- +-/* 32-bit FP division RM */ +-void HELPER(deb)(uint32_t f1, uint32_t val) +-{ +- float32 v1 = env->fregs[f1].l.upper; +- CPU_FloatU v2; +- +- v2.l = val; +- HELPER_LOG("%s: dividing 0x%d from f%d by 0x%d\n", __func__, +- v1, f1, v2.f); +- env->fregs[f1].l.upper = float32_div(v1, v2.f, &env->fpu_status); +-} +- +-/* 32-bit FP multiplication RM */ +-void HELPER(meeb)(uint32_t f1, uint32_t val) +-{ +- float32 v1 = env->fregs[f1].l.upper; +- CPU_FloatU v2; +- +- v2.l = val; +- HELPER_LOG("%s: multiplying 0x%d from f%d and 0x%d\n", __func__, +- v1, f1, v2.f); +- env->fregs[f1].l.upper = float32_mul(v1, v2.f, &env->fpu_status); +-} +- +-/* 32-bit FP compare RR */ +-uint32_t HELPER(cebr)(uint32_t f1, uint32_t f2) +-{ +- float32 v1 = env->fregs[f1].l.upper; +- float32 v2 = env->fregs[f2].l.upper; +- +- HELPER_LOG("%s: comparing 0x%d from f%d and 0x%d\n", __func__, +- v1, f1, v2); +- return set_cc_f32(v1, v2); +-} +- +-/* 64-bit FP compare RR */ +-uint32_t HELPER(cdbr)(uint32_t f1, uint32_t f2) +-{ +- float64 v1 = env->fregs[f1].d; +- float64 v2 = env->fregs[f2].d; +- +- HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%ld\n", __func__, +- v1, f1, v2); +- return set_cc_f64(v1, v2); +-} +- +-/* 128-bit FP compare RR */ +-uint32_t HELPER(cxbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU v1; +- CPU_QuadU v2; +- +- v1.ll.upper = env->fregs[f1].ll; +- v1.ll.lower = env->fregs[f1 + 2].ll; +- v2.ll.upper = env->fregs[f2].ll; +- v2.ll.lower = env->fregs[f2 + 2].ll; +- +- return float_comp_to_cc(float128_compare_quiet(v1.q, v2.q, +- &env->fpu_status)); +-} +- +-/* 64-bit FP compare RM */ +-uint32_t HELPER(cdb)(uint32_t f1, uint64_t a2) +-{ +- float64 v1 = env->fregs[f1].d; +- CPU_DoubleU v2; +- +- v2.ll = ldq(a2); +- HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%lx\n", __func__, v1, +- f1, v2.d); +- return set_cc_f64(v1, v2.d); +-} +- +-/* 64-bit FP addition RM */ +-uint32_t HELPER(adb)(uint32_t f1, uint64_t a2) +-{ +- float64 v1 = env->fregs[f1].d; +- CPU_DoubleU v2; +- +- v2.ll = ldq(a2); +- HELPER_LOG("%s: adding 0x%lx from f%d and 0x%lx\n", __func__, +- v1, f1, v2.d); +- env->fregs[f1].d = v1 = float64_add(v1, v2.d, &env->fpu_status); +- return set_cc_nz_f64(v1); +-} +- +-/* 32-bit FP subtraction RM */ +-void HELPER(seb)(uint32_t f1, uint32_t val) +-{ +- float32 v1 = env->fregs[f1].l.upper; +- CPU_FloatU v2; +- +- v2.l = val; +- env->fregs[f1].l.upper = float32_sub(v1, v2.f, &env->fpu_status); +-} +- +-/* 64-bit FP subtraction RM */ +-uint32_t HELPER(sdb)(uint32_t f1, uint64_t a2) +-{ +- float64 v1 = env->fregs[f1].d; +- CPU_DoubleU v2; +- +- v2.ll = ldq(a2); +- env->fregs[f1].d = v1 = float64_sub(v1, v2.d, &env->fpu_status); +- return set_cc_nz_f64(v1); +-} +- +-/* 64-bit FP multiplication RM */ +-void HELPER(mdb)(uint32_t f1, uint64_t a2) +-{ +- float64 v1 = env->fregs[f1].d; +- CPU_DoubleU v2; +- +- v2.ll = ldq(a2); +- HELPER_LOG("%s: multiplying 0x%lx from f%d and 0x%ld\n", __func__, +- v1, f1, v2.d); +- env->fregs[f1].d = float64_mul(v1, v2.d, &env->fpu_status); +-} +- +-/* 64-bit FP division RM */ +-void HELPER(ddb)(uint32_t f1, uint64_t a2) +-{ +- float64 v1 = env->fregs[f1].d; +- CPU_DoubleU v2; +- +- v2.ll = ldq(a2); +- HELPER_LOG("%s: dividing 0x%lx from f%d by 0x%ld\n", __func__, +- v1, f1, v2.d); +- env->fregs[f1].d = float64_div(v1, v2.d, &env->fpu_status); +-} +- +-static void set_round_mode(int m3) +-{ +- switch (m3) { +- case 0: +- /* current mode */ +- break; +- case 1: +- /* biased round no nearest */ +- case 4: +- /* round to nearest */ +- set_float_rounding_mode(float_round_nearest_even, &env->fpu_status); +- break; +- case 5: +- /* round to zero */ +- set_float_rounding_mode(float_round_to_zero, &env->fpu_status); +- break; +- case 6: +- /* round to +inf */ +- set_float_rounding_mode(float_round_up, &env->fpu_status); +- break; +- case 7: +- /* round to -inf */ +- set_float_rounding_mode(float_round_down, &env->fpu_status); +- break; +- } +-} +- +-/* convert 32-bit float to 64-bit int */ +-uint32_t HELPER(cgebr)(uint32_t r1, uint32_t f2, uint32_t m3) +-{ +- float32 v2 = env->fregs[f2].l.upper; +- +- set_round_mode(m3); +- env->regs[r1] = float32_to_int64(v2, &env->fpu_status); +- return set_cc_nz_f32(v2); +-} +- +-/* convert 64-bit float to 64-bit int */ +-uint32_t HELPER(cgdbr)(uint32_t r1, uint32_t f2, uint32_t m3) +-{ +- float64 v2 = env->fregs[f2].d; +- +- set_round_mode(m3); +- env->regs[r1] = float64_to_int64(v2, &env->fpu_status); +- return set_cc_nz_f64(v2); +-} +- +-/* convert 128-bit float to 64-bit int */ +-uint32_t HELPER(cgxbr)(uint32_t r1, uint32_t f2, uint32_t m3) +-{ +- CPU_QuadU v2; +- +- v2.ll.upper = env->fregs[f2].ll; +- v2.ll.lower = env->fregs[f2 + 2].ll; +- set_round_mode(m3); +- env->regs[r1] = float128_to_int64(v2.q, &env->fpu_status); +- if (float128_is_any_nan(v2.q)) { +- return 3; +- } else if (float128_is_zero(v2.q)) { +- return 0; +- } else if (float128_is_neg(v2.q)) { +- return 1; +- } else { +- return 2; +- } +-} +- +-/* convert 32-bit float to 32-bit int */ +-uint32_t HELPER(cfebr)(uint32_t r1, uint32_t f2, uint32_t m3) +-{ +- float32 v2 = env->fregs[f2].l.upper; +- +- set_round_mode(m3); +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- float32_to_int32(v2, &env->fpu_status); +- return set_cc_nz_f32(v2); +-} +- +-/* convert 64-bit float to 32-bit int */ +-uint32_t HELPER(cfdbr)(uint32_t r1, uint32_t f2, uint32_t m3) +-{ +- float64 v2 = env->fregs[f2].d; +- +- set_round_mode(m3); +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- float64_to_int32(v2, &env->fpu_status); +- return set_cc_nz_f64(v2); +-} +- +-/* convert 128-bit float to 32-bit int */ +-uint32_t HELPER(cfxbr)(uint32_t r1, uint32_t f2, uint32_t m3) +-{ +- CPU_QuadU v2; +- +- v2.ll.upper = env->fregs[f2].ll; +- v2.ll.lower = env->fregs[f2 + 2].ll; +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- float128_to_int32(v2.q, &env->fpu_status); +- return set_cc_nz_f128(v2.q); +-} +- +-/* load 32-bit FP zero */ +-void HELPER(lzer)(uint32_t f1) +-{ +- env->fregs[f1].l.upper = float32_zero; +-} +- +-/* load 64-bit FP zero */ +-void HELPER(lzdr)(uint32_t f1) +-{ +- env->fregs[f1].d = float64_zero; +-} +- +-/* load 128-bit FP zero */ +-void HELPER(lzxr)(uint32_t f1) +-{ +- CPU_QuadU x; +- +- x.q = float64_to_float128(float64_zero, &env->fpu_status); +- env->fregs[f1].ll = x.ll.upper; +- env->fregs[f1 + 1].ll = x.ll.lower; +-} +- +-/* 128-bit FP subtraction RR */ +-uint32_t HELPER(sxbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU v1; +- CPU_QuadU v2; +- CPU_QuadU res; +- +- v1.ll.upper = env->fregs[f1].ll; +- v1.ll.lower = env->fregs[f1 + 2].ll; +- v2.ll.upper = env->fregs[f2].ll; +- v2.ll.lower = env->fregs[f2 + 2].ll; +- res.q = float128_sub(v1.q, v2.q, &env->fpu_status); +- env->fregs[f1].ll = res.ll.upper; +- env->fregs[f1 + 2].ll = res.ll.lower; +- return set_cc_nz_f128(res.q); +-} +- +-/* 128-bit FP addition RR */ +-uint32_t HELPER(axbr)(uint32_t f1, uint32_t f2) +-{ +- CPU_QuadU v1; +- CPU_QuadU v2; +- CPU_QuadU res; +- +- v1.ll.upper = env->fregs[f1].ll; +- v1.ll.lower = env->fregs[f1 + 2].ll; +- v2.ll.upper = env->fregs[f2].ll; +- v2.ll.lower = env->fregs[f2 + 2].ll; +- res.q = float128_add(v1.q, v2.q, &env->fpu_status); +- env->fregs[f1].ll = res.ll.upper; +- env->fregs[f1 + 2].ll = res.ll.lower; +- return set_cc_nz_f128(res.q); +-} +- +-/* 32-bit FP multiplication RR */ +-void HELPER(meebr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].l.upper = float32_mul(env->fregs[f1].l.upper, +- env->fregs[f2].l.upper, +- &env->fpu_status); +-} +- +-/* 64-bit FP division RR */ +-void HELPER(ddbr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].d = float64_div(env->fregs[f1].d, env->fregs[f2].d, +- &env->fpu_status); +-} +- +-/* 64-bit FP multiply and add RM */ +-void HELPER(madb)(uint32_t f1, uint64_t a2, uint32_t f3) +-{ +- CPU_DoubleU v2; +- +- HELPER_LOG("%s: f1 %d a2 0x%lx f3 %d\n", __func__, f1, a2, f3); +- v2.ll = ldq(a2); +- env->fregs[f1].d = float64_add(env->fregs[f1].d, +- float64_mul(v2.d, env->fregs[f3].d, +- &env->fpu_status), +- &env->fpu_status); +-} +- +-/* 64-bit FP multiply and add RR */ +-void HELPER(madbr)(uint32_t f1, uint32_t f3, uint32_t f2) +-{ +- HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __func__, f1, f2, f3); +- env->fregs[f1].d = float64_add(float64_mul(env->fregs[f2].d, +- env->fregs[f3].d, +- &env->fpu_status), +- env->fregs[f1].d, &env->fpu_status); +-} +- +-/* 64-bit FP multiply and subtract RR */ +-void HELPER(msdbr)(uint32_t f1, uint32_t f3, uint32_t f2) +-{ +- HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __func__, f1, f2, f3); +- env->fregs[f1].d = float64_sub(float64_mul(env->fregs[f2].d, +- env->fregs[f3].d, +- &env->fpu_status), +- env->fregs[f1].d, &env->fpu_status); +-} +- +-/* 32-bit FP multiply and add RR */ +-void HELPER(maebr)(uint32_t f1, uint32_t f3, uint32_t f2) +-{ +- env->fregs[f1].l.upper = float32_add(env->fregs[f1].l.upper, +- float32_mul(env->fregs[f2].l.upper, +- env->fregs[f3].l.upper, +- &env->fpu_status), +- &env->fpu_status); +-} +- +-/* convert 32-bit float to 64-bit float */ +-void HELPER(ldeb)(uint32_t f1, uint64_t a2) +-{ +- uint32_t v2; +- +- v2 = ldl(a2); +- env->fregs[f1].d = float32_to_float64(v2, +- &env->fpu_status); +-} +- +-/* convert 64-bit float to 128-bit float */ +-void HELPER(lxdb)(uint32_t f1, uint64_t a2) +-{ +- CPU_DoubleU v2; +- CPU_QuadU v1; +- +- v2.ll = ldq(a2); +- v1.q = float64_to_float128(v2.d, &env->fpu_status); +- env->fregs[f1].ll = v1.ll.upper; +- env->fregs[f1 + 2].ll = v1.ll.lower; +-} +- +-/* test data class 32-bit */ +-uint32_t HELPER(tceb)(uint32_t f1, uint64_t m2) +-{ +- float32 v1 = env->fregs[f1].l.upper; +- int neg = float32_is_neg(v1); +- uint32_t cc = 0; +- +- HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __func__, (long)v1, m2, neg); +- if ((float32_is_zero(v1) && (m2 & (1 << (11-neg)))) || +- (float32_is_infinity(v1) && (m2 & (1 << (5-neg)))) || +- (float32_is_any_nan(v1) && (m2 & (1 << (3-neg)))) || +- (float32_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) { +- cc = 1; +- } else if (m2 & (1 << (9-neg))) { +- /* assume normalized number */ +- cc = 1; +- } +- +- /* FIXME: denormalized? */ +- return cc; +-} +- +-/* test data class 64-bit */ +-uint32_t HELPER(tcdb)(uint32_t f1, uint64_t m2) +-{ +- float64 v1 = env->fregs[f1].d; +- int neg = float64_is_neg(v1); +- uint32_t cc = 0; +- +- HELPER_LOG("%s: v1 0x%lx m2 0x%lx neg %d\n", __func__, v1, m2, neg); +- if ((float64_is_zero(v1) && (m2 & (1 << (11-neg)))) || +- (float64_is_infinity(v1) && (m2 & (1 << (5-neg)))) || +- (float64_is_any_nan(v1) && (m2 & (1 << (3-neg)))) || +- (float64_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) { +- cc = 1; +- } else if (m2 & (1 << (9-neg))) { +- /* assume normalized number */ +- cc = 1; +- } +- /* FIXME: denormalized? */ +- return cc; +-} +- +-/* test data class 128-bit */ +-uint32_t HELPER(tcxb)(uint32_t f1, uint64_t m2) +-{ +- CPU_QuadU v1; +- uint32_t cc = 0; +- int neg; +- +- v1.ll.upper = env->fregs[f1].ll; +- v1.ll.lower = env->fregs[f1 + 2].ll; +- +- neg = float128_is_neg(v1.q); +- if ((float128_is_zero(v1.q) && (m2 & (1 << (11-neg)))) || +- (float128_is_infinity(v1.q) && (m2 & (1 << (5-neg)))) || +- (float128_is_any_nan(v1.q) && (m2 & (1 << (3-neg)))) || +- (float128_is_signaling_nan(v1.q) && (m2 & (1 << (1-neg))))) { +- cc = 1; +- } else if (m2 & (1 << (9-neg))) { +- /* assume normalized number */ +- cc = 1; +- } +- /* FIXME: denormalized? */ +- return cc; +-} +- + /* find leftmost one */ + uint32_t HELPER(flogr)(uint32_t r1, uint64_t v2) + { +@@ -1795,12 +999,6 @@ uint32_t HELPER(flogr)(uint32_t r1, uint64_t v2) + } + } + +-/* square root 64-bit RR */ +-void HELPER(sqdbr)(uint32_t f1, uint32_t f2) +-{ +- env->fregs[f1].d = float64_sqrt(env->fregs[f2].d, &env->fpu_status); +-} +- + /* checksum */ + void HELPER(cksm)(uint32_t r1, uint32_t r2) + { +diff --git a/target-s390x/translate.c b/target-s390x/translate.c +index 1c1baf5..c370df3 100644 +--- a/target-s390x/translate.c ++++ b/target-s390x/translate.c +@@ -667,16 +667,11 @@ static void set_cc_cmp_f32_i64(DisasContext *s, TCGv_i32 v1, TCGv_i64 v2) + s->cc_op = CC_OP_LTGT_F32; + } + +-static void set_cc_nz_f32(DisasContext *s, TCGv_i32 v1) ++static void gen_set_cc_nz_f32(DisasContext *s, TCGv_i32 v1) + { + gen_op_update1_cc_i32(s, CC_OP_NZ_F32, v1); + } + +-static inline void set_cc_nz_f64(DisasContext *s, TCGv_i64 v1) +-{ +- gen_op_update1_cc_i64(s, CC_OP_NZ_F64, v1); +-} +- + /* CC value is in env->cc_op */ + static inline void set_cc_static(DisasContext *s) + { +@@ -2235,7 +2230,7 @@ static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, + tcg_temp_free_i32(tmp32); + + tmp32 = load_freg32(r1); +- set_cc_nz_f32(s, tmp32); ++ gen_set_cc_nz_f32(s, tmp32); + tcg_temp_free_i32(tmp32); + break; + case 0xb: /* SEB R1,D2(X2,B2) [RXE] */ +@@ -2248,7 +2243,7 @@ static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, + tcg_temp_free_i32(tmp32); + + tmp32 = load_freg32(r1); +- set_cc_nz_f32(s, tmp32); ++ gen_set_cc_nz_f32(s, tmp32); + tcg_temp_free_i32(tmp32); + break; + case 0xd: /* DEB R1,D2(X2,B2) [RXE] */ +-- +1.7.12.1 + diff --git a/0007-target-s390x-split-condition-code-helpers.patch b/0007-target-s390x-split-condition-code-helpers.patch new file mode 100644 index 0000000..33ddc67 --- /dev/null +++ b/0007-target-s390x-split-condition-code-helpers.patch @@ -0,0 +1,1158 @@ +From f642126aece222f6ff87d26c29f00e1b6c47e10a Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:32 +0000 +Subject: [PATCH] target-s390x: split condition code helpers + +Move condition code helpers to cc_helper.c. + +Signed-off-by: Blue Swirl +Signed-off-by: Alexander Graf +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 3 +- + target-s390x/cc_helper.c | 551 +++++++++++++++++++++++++++++++++++++++++++++ + target-s390x/cpu.h | 3 + + target-s390x/op_helper.c | 522 +----------------------------------------- + 4 files changed, 557 insertions(+), 522 deletions(-) + create mode 100644 target-s390x/cc_helper.c + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index 23b3bd9..f9437d6 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -1,7 +1,8 @@ + obj-y += translate.o op_helper.o helper.o cpu.o interrupt.o +-obj-y += fpu_helper.o ++obj-y += fpu_helper.o cc_helper.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + + $(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/fpu_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) ++$(obj)/cc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/cc_helper.c b/target-s390x/cc_helper.c +new file mode 100644 +index 0000000..2ac1659 +--- /dev/null ++++ b/target-s390x/cc_helper.c +@@ -0,0 +1,551 @@ ++/* ++ * S/390 condition code helper routines ++ * ++ * Copyright (c) 2009 Ulrich Hecht ++ * Copyright (c) 2009 Alexander Graf ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, see . ++ */ ++ ++#include "cpu.h" ++#include "dyngen-exec.h" ++#include "helper.h" ++ ++/* #define DEBUG_HELPER */ ++#ifdef DEBUG_HELPER ++#define HELPER_LOG(x...) qemu_log(x) ++#else ++#define HELPER_LOG(x...) ++#endif ++ ++static inline uint32_t cc_calc_ltgt_32(CPUS390XState *env, int32_t src, ++ int32_t dst) ++{ ++ if (src == dst) { ++ return 0; ++ } else if (src < dst) { ++ return 1; ++ } else { ++ return 2; ++ } ++} ++ ++static inline uint32_t cc_calc_ltgt0_32(CPUS390XState *env, int32_t dst) ++{ ++ return cc_calc_ltgt_32(env, dst, 0); ++} ++ ++static inline uint32_t cc_calc_ltgt_64(CPUS390XState *env, int64_t src, ++ int64_t dst) ++{ ++ if (src == dst) { ++ return 0; ++ } else if (src < dst) { ++ return 1; ++ } else { ++ return 2; ++ } ++} ++ ++static inline uint32_t cc_calc_ltgt0_64(CPUS390XState *env, int64_t dst) ++{ ++ return cc_calc_ltgt_64(env, dst, 0); ++} ++ ++static inline uint32_t cc_calc_ltugtu_32(CPUS390XState *env, uint32_t src, ++ uint32_t dst) ++{ ++ if (src == dst) { ++ return 0; ++ } else if (src < dst) { ++ return 1; ++ } else { ++ return 2; ++ } ++} ++ ++static inline uint32_t cc_calc_ltugtu_64(CPUS390XState *env, uint64_t src, ++ uint64_t dst) ++{ ++ if (src == dst) { ++ return 0; ++ } else if (src < dst) { ++ return 1; ++ } else { ++ return 2; ++ } ++} ++ ++static inline uint32_t cc_calc_tm_32(CPUS390XState *env, uint32_t val, ++ uint32_t mask) ++{ ++ uint16_t r = val & mask; ++ ++ HELPER_LOG("%s: val 0x%x mask 0x%x\n", __func__, val, mask); ++ if (r == 0 || mask == 0) { ++ return 0; ++ } else if (r == mask) { ++ return 3; ++ } else { ++ return 1; ++ } ++} ++ ++/* set condition code for test under mask */ ++static inline uint32_t cc_calc_tm_64(CPUS390XState *env, uint64_t val, ++ uint32_t mask) ++{ ++ uint16_t r = val & mask; ++ ++ HELPER_LOG("%s: val 0x%lx mask 0x%x r 0x%x\n", __func__, val, mask, r); ++ if (r == 0 || mask == 0) { ++ return 0; ++ } else if (r == mask) { ++ return 3; ++ } else { ++ while (!(mask & 0x8000)) { ++ mask <<= 1; ++ val <<= 1; ++ } ++ if (val & 0x8000) { ++ return 2; ++ } else { ++ return 1; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_nz(CPUS390XState *env, uint64_t dst) ++{ ++ return !!dst; ++} ++ ++static inline uint32_t cc_calc_add_64(CPUS390XState *env, int64_t a1, ++ int64_t a2, int64_t ar) ++{ ++ if ((a1 > 0 && a2 > 0 && ar < 0) || (a1 < 0 && a2 < 0 && ar > 0)) { ++ return 3; /* overflow */ ++ } else { ++ if (ar < 0) { ++ return 1; ++ } else if (ar > 0) { ++ return 2; ++ } else { ++ return 0; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_addu_64(CPUS390XState *env, uint64_t a1, ++ uint64_t a2, uint64_t ar) ++{ ++ if (ar == 0) { ++ if (a1) { ++ return 2; ++ } else { ++ return 0; ++ } ++ } else { ++ if (ar < a1 || ar < a2) { ++ return 3; ++ } else { ++ return 1; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_sub_64(CPUS390XState *env, int64_t a1, ++ int64_t a2, int64_t ar) ++{ ++ if ((a1 > 0 && a2 < 0 && ar < 0) || (a1 < 0 && a2 > 0 && ar > 0)) { ++ return 3; /* overflow */ ++ } else { ++ if (ar < 0) { ++ return 1; ++ } else if (ar > 0) { ++ return 2; ++ } else { ++ return 0; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_subu_64(CPUS390XState *env, uint64_t a1, ++ uint64_t a2, uint64_t ar) ++{ ++ if (ar == 0) { ++ return 2; ++ } else { ++ if (a2 > a1) { ++ return 1; ++ } else { ++ return 3; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_abs_64(CPUS390XState *env, int64_t dst) ++{ ++ if ((uint64_t)dst == 0x8000000000000000ULL) { ++ return 3; ++ } else if (dst) { ++ return 1; ++ } else { ++ return 0; ++ } ++} ++ ++static inline uint32_t cc_calc_nabs_64(CPUS390XState *env, int64_t dst) ++{ ++ return !!dst; ++} ++ ++static inline uint32_t cc_calc_comp_64(CPUS390XState *env, int64_t dst) ++{ ++ if ((uint64_t)dst == 0x8000000000000000ULL) { ++ return 3; ++ } else if (dst < 0) { ++ return 1; ++ } else if (dst > 0) { ++ return 2; ++ } else { ++ return 0; ++ } ++} ++ ++ ++static inline uint32_t cc_calc_add_32(CPUS390XState *env, int32_t a1, ++ int32_t a2, int32_t ar) ++{ ++ if ((a1 > 0 && a2 > 0 && ar < 0) || (a1 < 0 && a2 < 0 && ar > 0)) { ++ return 3; /* overflow */ ++ } else { ++ if (ar < 0) { ++ return 1; ++ } else if (ar > 0) { ++ return 2; ++ } else { ++ return 0; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_addu_32(CPUS390XState *env, uint32_t a1, ++ uint32_t a2, uint32_t ar) ++{ ++ if (ar == 0) { ++ if (a1) { ++ return 2; ++ } else { ++ return 0; ++ } ++ } else { ++ if (ar < a1 || ar < a2) { ++ return 3; ++ } else { ++ return 1; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_sub_32(CPUS390XState *env, int32_t a1, ++ int32_t a2, int32_t ar) ++{ ++ if ((a1 > 0 && a2 < 0 && ar < 0) || (a1 < 0 && a2 > 0 && ar > 0)) { ++ return 3; /* overflow */ ++ } else { ++ if (ar < 0) { ++ return 1; ++ } else if (ar > 0) { ++ return 2; ++ } else { ++ return 0; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_subu_32(CPUS390XState *env, uint32_t a1, ++ uint32_t a2, uint32_t ar) ++{ ++ if (ar == 0) { ++ return 2; ++ } else { ++ if (a2 > a1) { ++ return 1; ++ } else { ++ return 3; ++ } ++ } ++} ++ ++static inline uint32_t cc_calc_abs_32(CPUS390XState *env, int32_t dst) ++{ ++ if ((uint32_t)dst == 0x80000000UL) { ++ return 3; ++ } else if (dst) { ++ return 1; ++ } else { ++ return 0; ++ } ++} ++ ++static inline uint32_t cc_calc_nabs_32(CPUS390XState *env, int32_t dst) ++{ ++ return !!dst; ++} ++ ++static inline uint32_t cc_calc_comp_32(CPUS390XState *env, int32_t dst) ++{ ++ if ((uint32_t)dst == 0x80000000UL) { ++ return 3; ++ } else if (dst < 0) { ++ return 1; ++ } else if (dst > 0) { ++ return 2; ++ } else { ++ return 0; ++ } ++} ++ ++/* calculate condition code for insert character under mask insn */ ++static inline uint32_t cc_calc_icm_32(CPUS390XState *env, uint32_t mask, ++ uint32_t val) ++{ ++ uint32_t cc; ++ ++ HELPER_LOG("%s: mask 0x%x val %d\n", __func__, mask, val); ++ if (mask == 0xf) { ++ if (!val) { ++ return 0; ++ } else if (val & 0x80000000) { ++ return 1; ++ } else { ++ return 2; ++ } ++ } ++ ++ if (!val || !mask) { ++ cc = 0; ++ } else { ++ while (mask != 1) { ++ mask >>= 1; ++ val >>= 8; ++ } ++ if (val & 0x80) { ++ cc = 1; ++ } else { ++ cc = 2; ++ } ++ } ++ return cc; ++} ++ ++static inline uint32_t cc_calc_slag(CPUS390XState *env, uint64_t src, ++ uint64_t shift) ++{ ++ uint64_t mask = ((1ULL << shift) - 1ULL) << (64 - shift); ++ uint64_t match, r; ++ ++ /* check if the sign bit stays the same */ ++ if (src & (1ULL << 63)) { ++ match = mask; ++ } else { ++ match = 0; ++ } ++ ++ if ((src & mask) != match) { ++ /* overflow */ ++ return 3; ++ } ++ ++ r = ((src << shift) & ((1ULL << 63) - 1)) | (src & (1ULL << 63)); ++ ++ if ((int64_t)r == 0) { ++ return 0; ++ } else if ((int64_t)r < 0) { ++ return 1; ++ } ++ ++ return 2; ++} ++ ++ ++static inline uint32_t do_calc_cc(CPUS390XState *env, uint32_t cc_op, ++ uint64_t src, uint64_t dst, uint64_t vr) ++{ ++ uint32_t r = 0; ++ ++ switch (cc_op) { ++ case CC_OP_CONST0: ++ case CC_OP_CONST1: ++ case CC_OP_CONST2: ++ case CC_OP_CONST3: ++ /* cc_op value _is_ cc */ ++ r = cc_op; ++ break; ++ case CC_OP_LTGT0_32: ++ r = cc_calc_ltgt0_32(env, dst); ++ break; ++ case CC_OP_LTGT0_64: ++ r = cc_calc_ltgt0_64(env, dst); ++ break; ++ case CC_OP_LTGT_32: ++ r = cc_calc_ltgt_32(env, src, dst); ++ break; ++ case CC_OP_LTGT_64: ++ r = cc_calc_ltgt_64(env, src, dst); ++ break; ++ case CC_OP_LTUGTU_32: ++ r = cc_calc_ltugtu_32(env, src, dst); ++ break; ++ case CC_OP_LTUGTU_64: ++ r = cc_calc_ltugtu_64(env, src, dst); ++ break; ++ case CC_OP_TM_32: ++ r = cc_calc_tm_32(env, src, dst); ++ break; ++ case CC_OP_TM_64: ++ r = cc_calc_tm_64(env, src, dst); ++ break; ++ case CC_OP_NZ: ++ r = cc_calc_nz(env, dst); ++ break; ++ case CC_OP_ADD_64: ++ r = cc_calc_add_64(env, src, dst, vr); ++ break; ++ case CC_OP_ADDU_64: ++ r = cc_calc_addu_64(env, src, dst, vr); ++ break; ++ case CC_OP_SUB_64: ++ r = cc_calc_sub_64(env, src, dst, vr); ++ break; ++ case CC_OP_SUBU_64: ++ r = cc_calc_subu_64(env, src, dst, vr); ++ break; ++ case CC_OP_ABS_64: ++ r = cc_calc_abs_64(env, dst); ++ break; ++ case CC_OP_NABS_64: ++ r = cc_calc_nabs_64(env, dst); ++ break; ++ case CC_OP_COMP_64: ++ r = cc_calc_comp_64(env, dst); ++ break; ++ ++ case CC_OP_ADD_32: ++ r = cc_calc_add_32(env, src, dst, vr); ++ break; ++ case CC_OP_ADDU_32: ++ r = cc_calc_addu_32(env, src, dst, vr); ++ break; ++ case CC_OP_SUB_32: ++ r = cc_calc_sub_32(env, src, dst, vr); ++ break; ++ case CC_OP_SUBU_32: ++ r = cc_calc_subu_32(env, src, dst, vr); ++ break; ++ case CC_OP_ABS_32: ++ r = cc_calc_abs_64(env, dst); ++ break; ++ case CC_OP_NABS_32: ++ r = cc_calc_nabs_64(env, dst); ++ break; ++ case CC_OP_COMP_32: ++ r = cc_calc_comp_32(env, dst); ++ break; ++ ++ case CC_OP_ICM: ++ r = cc_calc_icm_32(env, src, dst); ++ break; ++ case CC_OP_SLAG: ++ r = cc_calc_slag(env, src, dst); ++ break; ++ ++ case CC_OP_LTGT_F32: ++ r = set_cc_f32(src, dst); ++ break; ++ case CC_OP_LTGT_F64: ++ r = set_cc_f64(src, dst); ++ break; ++ case CC_OP_NZ_F32: ++ r = set_cc_nz_f32(dst); ++ break; ++ case CC_OP_NZ_F64: ++ r = set_cc_nz_f64(dst); ++ break; ++ ++ default: ++ cpu_abort(env, "Unknown CC operation: %s\n", cc_name(cc_op)); ++ } ++ ++ HELPER_LOG("%s: %15s 0x%016lx 0x%016lx 0x%016lx = %d\n", __func__, ++ cc_name(cc_op), src, dst, vr, r); ++ return r; ++} ++ ++uint32_t calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst, ++ uint64_t vr) ++{ ++ return do_calc_cc(env, cc_op, src, dst, vr); ++} ++ ++uint32_t HELPER(calc_cc)(uint32_t cc_op, uint64_t src, uint64_t dst, ++ uint64_t vr) ++{ ++ return do_calc_cc(env, cc_op, src, dst, vr); ++} ++ ++/* insert psw mask and condition code into r1 */ ++void HELPER(ipm)(uint32_t cc, uint32_t r1) ++{ ++ uint64_t r = env->regs[r1]; ++ ++ r &= 0xffffffff00ffffffULL; ++ r |= (cc << 28) | ((env->psw.mask >> 40) & 0xf); ++ env->regs[r1] = r; ++ HELPER_LOG("%s: cc %d psw.mask 0x%lx r1 0x%lx\n", __func__, ++ cc, env->psw.mask, r); ++} ++ ++#ifndef CONFIG_USER_ONLY ++void HELPER(load_psw)(uint64_t mask, uint64_t addr) ++{ ++ load_psw(env, mask, addr); ++ cpu_loop_exit(env); ++} ++ ++void HELPER(sacf)(uint64_t a1) ++{ ++ HELPER_LOG("%s: %16" PRIx64 "\n", __func__, a1); ++ ++ switch (a1 & 0xf00) { ++ case 0x000: ++ env->psw.mask &= ~PSW_MASK_ASC; ++ env->psw.mask |= PSW_ASC_PRIMARY; ++ break; ++ case 0x100: ++ env->psw.mask &= ~PSW_MASK_ASC; ++ env->psw.mask |= PSW_ASC_SECONDARY; ++ break; ++ case 0x300: ++ env->psw.mask &= ~PSW_MASK_ASC; ++ env->psw.mask |= PSW_ASC_HOME; ++ break; ++ default: ++ qemu_log("unknown sacf mode: %" PRIx64 "\n", a1); ++ program_interrupt(env, PGM_SPECIFICATION, 2); ++ break; ++ } ++} ++#endif +diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h +index b4620c5..97fde5e 100644 +--- a/target-s390x/cpu.h ++++ b/target-s390x/cpu.h +@@ -1005,4 +1005,7 @@ uint32_t set_cc_f64(float64 v1, float64 v2); + uint32_t set_cc_nz_f32(float32 v); + uint32_t set_cc_nz_f64(float64 v); + ++/* op_helper.c */ ++void program_interrupt(CPUS390XState *env, uint32_t code, int ilc); ++ + #endif +diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c +index 270bf14..eced890 100644 +--- a/target-s390x/op_helper.c ++++ b/target-s390x/op_helper.c +@@ -779,18 +779,6 @@ uint32_t HELPER(icmh)(uint32_t r1, uint64_t address, uint32_t mask) + return cc; + } + +-/* insert psw mask and condition code into r1 */ +-void HELPER(ipm)(uint32_t cc, uint32_t r1) +-{ +- uint64_t r = env->regs[r1]; +- +- r &= 0xffffffff00ffffffULL; +- r |= (cc << 28) | ((env->psw.mask >> 40) & 0xf); +- env->regs[r1] = r; +- HELPER_LOG("%s: cc %d psw.mask 0x%lx r1 0x%lx\n", __func__, +- cc, env->psw.mask, r); +-} +- + /* load access registers r1 to r3 from memory at a2 */ + void HELPER(lam)(uint32_t r1, uint64_t a2, uint32_t r3) + { +@@ -1038,483 +1026,6 @@ void HELPER(cksm)(uint32_t r1, uint32_t r2) + ((uint32_t)cksm + (cksm >> 32)); + } + +-static inline uint32_t cc_calc_ltgt_32(CPUS390XState *env, int32_t src, +- int32_t dst) +-{ +- if (src == dst) { +- return 0; +- } else if (src < dst) { +- return 1; +- } else { +- return 2; +- } +-} +- +-static inline uint32_t cc_calc_ltgt0_32(CPUS390XState *env, int32_t dst) +-{ +- return cc_calc_ltgt_32(env, dst, 0); +-} +- +-static inline uint32_t cc_calc_ltgt_64(CPUS390XState *env, int64_t src, +- int64_t dst) +-{ +- if (src == dst) { +- return 0; +- } else if (src < dst) { +- return 1; +- } else { +- return 2; +- } +-} +- +-static inline uint32_t cc_calc_ltgt0_64(CPUS390XState *env, int64_t dst) +-{ +- return cc_calc_ltgt_64(env, dst, 0); +-} +- +-static inline uint32_t cc_calc_ltugtu_32(CPUS390XState *env, uint32_t src, +- uint32_t dst) +-{ +- if (src == dst) { +- return 0; +- } else if (src < dst) { +- return 1; +- } else { +- return 2; +- } +-} +- +-static inline uint32_t cc_calc_ltugtu_64(CPUS390XState *env, uint64_t src, +- uint64_t dst) +-{ +- if (src == dst) { +- return 0; +- } else if (src < dst) { +- return 1; +- } else { +- return 2; +- } +-} +- +-static inline uint32_t cc_calc_tm_32(CPUS390XState *env, uint32_t val, +- uint32_t mask) +-{ +- uint16_t r = val & mask; +- +- HELPER_LOG("%s: val 0x%x mask 0x%x\n", __func__, val, mask); +- if (r == 0 || mask == 0) { +- return 0; +- } else if (r == mask) { +- return 3; +- } else { +- return 1; +- } +-} +- +-/* set condition code for test under mask */ +-static inline uint32_t cc_calc_tm_64(CPUS390XState *env, uint64_t val, +- uint32_t mask) +-{ +- uint16_t r = val & mask; +- +- HELPER_LOG("%s: val 0x%lx mask 0x%x r 0x%x\n", __func__, val, mask, r); +- if (r == 0 || mask == 0) { +- return 0; +- } else if (r == mask) { +- return 3; +- } else { +- while (!(mask & 0x8000)) { +- mask <<= 1; +- val <<= 1; +- } +- if (val & 0x8000) { +- return 2; +- } else { +- return 1; +- } +- } +-} +- +-static inline uint32_t cc_calc_nz(CPUS390XState *env, uint64_t dst) +-{ +- return !!dst; +-} +- +-static inline uint32_t cc_calc_add_64(CPUS390XState *env, int64_t a1, +- int64_t a2, int64_t ar) +-{ +- if ((a1 > 0 && a2 > 0 && ar < 0) || (a1 < 0 && a2 < 0 && ar > 0)) { +- return 3; /* overflow */ +- } else { +- if (ar < 0) { +- return 1; +- } else if (ar > 0) { +- return 2; +- } else { +- return 0; +- } +- } +-} +- +-static inline uint32_t cc_calc_addu_64(CPUS390XState *env, uint64_t a1, +- uint64_t a2, uint64_t ar) +-{ +- if (ar == 0) { +- if (a1) { +- return 2; +- } else { +- return 0; +- } +- } else { +- if (ar < a1 || ar < a2) { +- return 3; +- } else { +- return 1; +- } +- } +-} +- +-static inline uint32_t cc_calc_sub_64(CPUS390XState *env, int64_t a1, +- int64_t a2, int64_t ar) +-{ +- if ((a1 > 0 && a2 < 0 && ar < 0) || (a1 < 0 && a2 > 0 && ar > 0)) { +- return 3; /* overflow */ +- } else { +- if (ar < 0) { +- return 1; +- } else if (ar > 0) { +- return 2; +- } else { +- return 0; +- } +- } +-} +- +-static inline uint32_t cc_calc_subu_64(CPUS390XState *env, uint64_t a1, +- uint64_t a2, uint64_t ar) +-{ +- if (ar == 0) { +- return 2; +- } else { +- if (a2 > a1) { +- return 1; +- } else { +- return 3; +- } +- } +-} +- +-static inline uint32_t cc_calc_abs_64(CPUS390XState *env, int64_t dst) +-{ +- if ((uint64_t)dst == 0x8000000000000000ULL) { +- return 3; +- } else if (dst) { +- return 1; +- } else { +- return 0; +- } +-} +- +-static inline uint32_t cc_calc_nabs_64(CPUS390XState *env, int64_t dst) +-{ +- return !!dst; +-} +- +-static inline uint32_t cc_calc_comp_64(CPUS390XState *env, int64_t dst) +-{ +- if ((uint64_t)dst == 0x8000000000000000ULL) { +- return 3; +- } else if (dst < 0) { +- return 1; +- } else if (dst > 0) { +- return 2; +- } else { +- return 0; +- } +-} +- +- +-static inline uint32_t cc_calc_add_32(CPUS390XState *env, int32_t a1, +- int32_t a2, int32_t ar) +-{ +- if ((a1 > 0 && a2 > 0 && ar < 0) || (a1 < 0 && a2 < 0 && ar > 0)) { +- return 3; /* overflow */ +- } else { +- if (ar < 0) { +- return 1; +- } else if (ar > 0) { +- return 2; +- } else { +- return 0; +- } +- } +-} +- +-static inline uint32_t cc_calc_addu_32(CPUS390XState *env, uint32_t a1, +- uint32_t a2, uint32_t ar) +-{ +- if (ar == 0) { +- if (a1) { +- return 2; +- } else { +- return 0; +- } +- } else { +- if (ar < a1 || ar < a2) { +- return 3; +- } else { +- return 1; +- } +- } +-} +- +-static inline uint32_t cc_calc_sub_32(CPUS390XState *env, int32_t a1, +- int32_t a2, int32_t ar) +-{ +- if ((a1 > 0 && a2 < 0 && ar < 0) || (a1 < 0 && a2 > 0 && ar > 0)) { +- return 3; /* overflow */ +- } else { +- if (ar < 0) { +- return 1; +- } else if (ar > 0) { +- return 2; +- } else { +- return 0; +- } +- } +-} +- +-static inline uint32_t cc_calc_subu_32(CPUS390XState *env, uint32_t a1, +- uint32_t a2, uint32_t ar) +-{ +- if (ar == 0) { +- return 2; +- } else { +- if (a2 > a1) { +- return 1; +- } else { +- return 3; +- } +- } +-} +- +-static inline uint32_t cc_calc_abs_32(CPUS390XState *env, int32_t dst) +-{ +- if ((uint32_t)dst == 0x80000000UL) { +- return 3; +- } else if (dst) { +- return 1; +- } else { +- return 0; +- } +-} +- +-static inline uint32_t cc_calc_nabs_32(CPUS390XState *env, int32_t dst) +-{ +- return !!dst; +-} +- +-static inline uint32_t cc_calc_comp_32(CPUS390XState *env, int32_t dst) +-{ +- if ((uint32_t)dst == 0x80000000UL) { +- return 3; +- } else if (dst < 0) { +- return 1; +- } else if (dst > 0) { +- return 2; +- } else { +- return 0; +- } +-} +- +-/* calculate condition code for insert character under mask insn */ +-static inline uint32_t cc_calc_icm_32(CPUS390XState *env, uint32_t mask, +- uint32_t val) +-{ +- uint32_t cc; +- +- HELPER_LOG("%s: mask 0x%x val %d\n", __func__, mask, val); +- if (mask == 0xf) { +- if (!val) { +- return 0; +- } else if (val & 0x80000000) { +- return 1; +- } else { +- return 2; +- } +- } +- +- if (!val || !mask) { +- cc = 0; +- } else { +- while (mask != 1) { +- mask >>= 1; +- val >>= 8; +- } +- if (val & 0x80) { +- cc = 1; +- } else { +- cc = 2; +- } +- } +- return cc; +-} +- +-static inline uint32_t cc_calc_slag(CPUS390XState *env, uint64_t src, +- uint64_t shift) +-{ +- uint64_t mask = ((1ULL << shift) - 1ULL) << (64 - shift); +- uint64_t match, r; +- +- /* check if the sign bit stays the same */ +- if (src & (1ULL << 63)) { +- match = mask; +- } else { +- match = 0; +- } +- +- if ((src & mask) != match) { +- /* overflow */ +- return 3; +- } +- +- r = ((src << shift) & ((1ULL << 63) - 1)) | (src & (1ULL << 63)); +- +- if ((int64_t)r == 0) { +- return 0; +- } else if ((int64_t)r < 0) { +- return 1; +- } +- +- return 2; +-} +- +- +-static inline uint32_t do_calc_cc(CPUS390XState *env, uint32_t cc_op, +- uint64_t src, uint64_t dst, uint64_t vr) +-{ +- uint32_t r = 0; +- +- switch (cc_op) { +- case CC_OP_CONST0: +- case CC_OP_CONST1: +- case CC_OP_CONST2: +- case CC_OP_CONST3: +- /* cc_op value _is_ cc */ +- r = cc_op; +- break; +- case CC_OP_LTGT0_32: +- r = cc_calc_ltgt0_32(env, dst); +- break; +- case CC_OP_LTGT0_64: +- r = cc_calc_ltgt0_64(env, dst); +- break; +- case CC_OP_LTGT_32: +- r = cc_calc_ltgt_32(env, src, dst); +- break; +- case CC_OP_LTGT_64: +- r = cc_calc_ltgt_64(env, src, dst); +- break; +- case CC_OP_LTUGTU_32: +- r = cc_calc_ltugtu_32(env, src, dst); +- break; +- case CC_OP_LTUGTU_64: +- r = cc_calc_ltugtu_64(env, src, dst); +- break; +- case CC_OP_TM_32: +- r = cc_calc_tm_32(env, src, dst); +- break; +- case CC_OP_TM_64: +- r = cc_calc_tm_64(env, src, dst); +- break; +- case CC_OP_NZ: +- r = cc_calc_nz(env, dst); +- break; +- case CC_OP_ADD_64: +- r = cc_calc_add_64(env, src, dst, vr); +- break; +- case CC_OP_ADDU_64: +- r = cc_calc_addu_64(env, src, dst, vr); +- break; +- case CC_OP_SUB_64: +- r = cc_calc_sub_64(env, src, dst, vr); +- break; +- case CC_OP_SUBU_64: +- r = cc_calc_subu_64(env, src, dst, vr); +- break; +- case CC_OP_ABS_64: +- r = cc_calc_abs_64(env, dst); +- break; +- case CC_OP_NABS_64: +- r = cc_calc_nabs_64(env, dst); +- break; +- case CC_OP_COMP_64: +- r = cc_calc_comp_64(env, dst); +- break; +- +- case CC_OP_ADD_32: +- r = cc_calc_add_32(env, src, dst, vr); +- break; +- case CC_OP_ADDU_32: +- r = cc_calc_addu_32(env, src, dst, vr); +- break; +- case CC_OP_SUB_32: +- r = cc_calc_sub_32(env, src, dst, vr); +- break; +- case CC_OP_SUBU_32: +- r = cc_calc_subu_32(env, src, dst, vr); +- break; +- case CC_OP_ABS_32: +- r = cc_calc_abs_64(env, dst); +- break; +- case CC_OP_NABS_32: +- r = cc_calc_nabs_64(env, dst); +- break; +- case CC_OP_COMP_32: +- r = cc_calc_comp_32(env, dst); +- break; +- +- case CC_OP_ICM: +- r = cc_calc_icm_32(env, src, dst); +- break; +- case CC_OP_SLAG: +- r = cc_calc_slag(env, src, dst); +- break; +- +- case CC_OP_LTGT_F32: +- r = set_cc_f32(src, dst); +- break; +- case CC_OP_LTGT_F64: +- r = set_cc_f64(src, dst); +- break; +- case CC_OP_NZ_F32: +- r = set_cc_nz_f32(dst); +- break; +- case CC_OP_NZ_F64: +- r = set_cc_nz_f64(dst); +- break; +- +- default: +- cpu_abort(env, "Unknown CC operation: %s\n", cc_name(cc_op)); +- } +- +- HELPER_LOG("%s: %15s 0x%016lx 0x%016lx 0x%016lx = %d\n", __func__, +- cc_name(cc_op), src, dst, vr, r); +- return r; +-} +- +-uint32_t calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst, +- uint64_t vr) +-{ +- return do_calc_cc(env, cc_op, src, dst, vr); +-} +- +-uint32_t HELPER(calc_cc)(uint32_t cc_op, uint64_t src, uint64_t dst, +- uint64_t vr) +-{ +- return do_calc_cc(env, cc_op, src, dst, vr); +-} +- + uint64_t HELPER(cvd)(int32_t bin) + { + /* positive 0 */ +@@ -1594,14 +1105,7 @@ void HELPER(tr)(uint32_t len, uint64_t array, uint64_t trans) + } + + #ifndef CONFIG_USER_ONLY +- +-void HELPER(load_psw)(uint64_t mask, uint64_t addr) +-{ +- load_psw(env, mask, addr); +- cpu_loop_exit(env); +-} +- +-static void program_interrupt(CPUS390XState *env, uint32_t code, int ilc) ++void program_interrupt(CPUS390XState *env, uint32_t code, int ilc) + { + qemu_log("program interrupt at %#" PRIx64 "\n", env->psw.addr); + +@@ -2175,30 +1679,6 @@ uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) + return cc; + } + +-void HELPER(sacf)(uint64_t a1) +-{ +- HELPER_LOG("%s: %16" PRIx64 "\n", __func__, a1); +- +- switch (a1 & 0xf00) { +- case 0x000: +- env->psw.mask &= ~PSW_MASK_ASC; +- env->psw.mask |= PSW_ASC_PRIMARY; +- break; +- case 0x100: +- env->psw.mask &= ~PSW_MASK_ASC; +- env->psw.mask |= PSW_ASC_SECONDARY; +- break; +- case 0x300: +- env->psw.mask &= ~PSW_MASK_ASC; +- env->psw.mask |= PSW_ASC_HOME; +- break; +- default: +- qemu_log("unknown sacf mode: %" PRIx64 "\n", a1); +- program_interrupt(env, PGM_SPECIFICATION, 2); +- break; +- } +-} +- + /* invalidate pte */ + void HELPER(ipte)(uint64_t pte_addr, uint64_t vaddr) + { +-- +1.7.12.1 + diff --git a/0008-target-s390x-split-integer-helpers.patch b/0008-target-s390x-split-integer-helpers.patch new file mode 100644 index 0000000..5610e6d --- /dev/null +++ b/0008-target-s390x-split-integer-helpers.patch @@ -0,0 +1,444 @@ +From e9f67c1f326a995ff0000a08a223435386867d8f Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:33 +0000 +Subject: [PATCH] target-s390x: split integer helpers + +Move integer helpers to int_helper.c. + +Signed-off-by: Blue Swirl +Signed-off-by: Alexander Graf +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 3 +- + target-s390x/int_helper.c | 201 +++++++++++++++++++++++++++++++++++++++++++++ + target-s390x/op_helper.c | 170 -------------------------------------- + 3 files changed, 203 insertions(+), 171 deletions(-) + create mode 100644 target-s390x/int_helper.c + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index f9437d6..e8f66e9 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -1,8 +1,9 @@ + obj-y += translate.o op_helper.o helper.o cpu.o interrupt.o +-obj-y += fpu_helper.o cc_helper.o ++obj-y += int_helper.o fpu_helper.o cc_helper.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + + $(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) ++$(obj)/int_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/fpu_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/cc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/int_helper.c b/target-s390x/int_helper.c +new file mode 100644 +index 0000000..e2eeb07 +--- /dev/null ++++ b/target-s390x/int_helper.c +@@ -0,0 +1,201 @@ ++/* ++ * S/390 integer helper routines ++ * ++ * Copyright (c) 2009 Ulrich Hecht ++ * Copyright (c) 2009 Alexander Graf ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, see . ++ */ ++ ++#include "cpu.h" ++#include "dyngen-exec.h" ++#include "host-utils.h" ++#include "helper.h" ++ ++/* #define DEBUG_HELPER */ ++#ifdef DEBUG_HELPER ++#define HELPER_LOG(x...) qemu_log(x) ++#else ++#define HELPER_LOG(x...) ++#endif ++ ++/* 64/64 -> 128 unsigned multiplication */ ++void HELPER(mlg)(uint32_t r1, uint64_t v2) ++{ ++#if HOST_LONG_BITS == 64 && defined(__GNUC__) ++ /* assuming 64-bit hosts have __uint128_t */ ++ __uint128_t res = (__uint128_t)env->regs[r1 + 1]; ++ ++ res *= (__uint128_t)v2; ++ env->regs[r1] = (uint64_t)(res >> 64); ++ env->regs[r1 + 1] = (uint64_t)res; ++#else ++ mulu64(&env->regs[r1 + 1], &env->regs[r1], env->regs[r1 + 1], v2); ++#endif ++} ++ ++/* 128 -> 64/64 unsigned division */ ++void HELPER(dlg)(uint32_t r1, uint64_t v2) ++{ ++ uint64_t divisor = v2; ++ ++ if (!env->regs[r1]) { ++ /* 64 -> 64/64 case */ ++ env->regs[r1] = env->regs[r1 + 1] % divisor; ++ env->regs[r1 + 1] = env->regs[r1 + 1] / divisor; ++ return; ++ } else { ++#if HOST_LONG_BITS == 64 && defined(__GNUC__) ++ /* assuming 64-bit hosts have __uint128_t */ ++ __uint128_t dividend = (((__uint128_t)env->regs[r1]) << 64) | ++ (env->regs[r1 + 1]); ++ __uint128_t quotient = dividend / divisor; ++ __uint128_t remainder = dividend % divisor; ++ ++ env->regs[r1 + 1] = quotient; ++ env->regs[r1] = remainder; ++#else ++ /* 32-bit hosts would need special wrapper functionality - just abort if ++ we encounter such a case; it's very unlikely anyways. */ ++ cpu_abort(env, "128 -> 64/64 division not implemented\n"); ++#endif ++ } ++} ++ ++/* absolute value 32-bit */ ++uint32_t HELPER(abs_i32)(int32_t val) ++{ ++ if (val < 0) { ++ return -val; ++ } else { ++ return val; ++ } ++} ++ ++/* negative absolute value 32-bit */ ++int32_t HELPER(nabs_i32)(int32_t val) ++{ ++ if (val < 0) { ++ return val; ++ } else { ++ return -val; ++ } ++} ++ ++/* absolute value 64-bit */ ++uint64_t HELPER(abs_i64)(int64_t val) ++{ ++ HELPER_LOG("%s: val 0x%" PRIx64 "\n", __func__, val); ++ ++ if (val < 0) { ++ return -val; ++ } else { ++ return val; ++ } ++} ++ ++/* negative absolute value 64-bit */ ++int64_t HELPER(nabs_i64)(int64_t val) ++{ ++ if (val < 0) { ++ return val; ++ } else { ++ return -val; ++ } ++} ++ ++/* add with carry 32-bit unsigned */ ++uint32_t HELPER(addc_u32)(uint32_t cc, uint32_t v1, uint32_t v2) ++{ ++ uint32_t res; ++ ++ res = v1 + v2; ++ if (cc & 2) { ++ res++; ++ } ++ ++ return res; ++} ++ ++/* subtract unsigned v2 from v1 with borrow */ ++uint32_t HELPER(slb)(uint32_t cc, uint32_t r1, uint32_t v2) ++{ ++ uint32_t v1 = env->regs[r1]; ++ uint32_t res = v1 + (~v2) + (cc >> 1); ++ ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | res; ++ if (cc & 2) { ++ /* borrow */ ++ return v1 ? 1 : 0; ++ } else { ++ return v1 ? 3 : 2; ++ } ++} ++ ++/* subtract unsigned v2 from v1 with borrow */ ++uint32_t HELPER(slbg)(uint32_t cc, uint32_t r1, uint64_t v1, uint64_t v2) ++{ ++ uint64_t res = v1 + (~v2) + (cc >> 1); ++ ++ env->regs[r1] = res; ++ if (cc & 2) { ++ /* borrow */ ++ return v1 ? 1 : 0; ++ } else { ++ return v1 ? 3 : 2; ++ } ++} ++ ++/* find leftmost one */ ++uint32_t HELPER(flogr)(uint32_t r1, uint64_t v2) ++{ ++ uint64_t res = 0; ++ uint64_t ov2 = v2; ++ ++ while (!(v2 & 0x8000000000000000ULL) && v2) { ++ v2 <<= 1; ++ res++; ++ } ++ ++ if (!v2) { ++ env->regs[r1] = 64; ++ env->regs[r1 + 1] = 0; ++ return 0; ++ } else { ++ env->regs[r1] = res; ++ env->regs[r1 + 1] = ov2 & ~(0x8000000000000000ULL >> res); ++ return 2; ++ } ++} ++ ++uint64_t HELPER(cvd)(int32_t bin) ++{ ++ /* positive 0 */ ++ uint64_t dec = 0x0c; ++ int shift = 4; ++ ++ if (bin < 0) { ++ bin = -bin; ++ dec = 0x0d; ++ } ++ ++ for (shift = 4; (shift < 64) && bin; shift += 4) { ++ int current_number = bin % 10; ++ ++ dec |= (current_number) << shift; ++ bin /= 10; ++ } ++ ++ return dec; ++} +diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c +index eced890..3b8b997 100644 +--- a/target-s390x/op_helper.c ++++ b/target-s390x/op_helper.c +@@ -352,49 +352,6 @@ void HELPER(stcm)(uint32_t r1, uint32_t mask, uint64_t addr) + HELPER_LOG("\n"); + } + +-/* 64/64 -> 128 unsigned multiplication */ +-void HELPER(mlg)(uint32_t r1, uint64_t v2) +-{ +-#if HOST_LONG_BITS == 64 && defined(__GNUC__) +- /* assuming 64-bit hosts have __uint128_t */ +- __uint128_t res = (__uint128_t)env->regs[r1 + 1]; +- +- res *= (__uint128_t)v2; +- env->regs[r1] = (uint64_t)(res >> 64); +- env->regs[r1 + 1] = (uint64_t)res; +-#else +- mulu64(&env->regs[r1 + 1], &env->regs[r1], env->regs[r1 + 1], v2); +-#endif +-} +- +-/* 128 -> 64/64 unsigned division */ +-void HELPER(dlg)(uint32_t r1, uint64_t v2) +-{ +- uint64_t divisor = v2; +- +- if (!env->regs[r1]) { +- /* 64 -> 64/64 case */ +- env->regs[r1] = env->regs[r1 + 1] % divisor; +- env->regs[r1 + 1] = env->regs[r1 + 1] / divisor; +- return; +- } else { +-#if HOST_LONG_BITS == 64 && defined(__GNUC__) +- /* assuming 64-bit hosts have __uint128_t */ +- __uint128_t dividend = (((__uint128_t)env->regs[r1]) << 64) | +- (env->regs[r1 + 1]); +- __uint128_t quotient = dividend / divisor; +- __uint128_t remainder = dividend % divisor; +- +- env->regs[r1 + 1] = quotient; +- env->regs[r1] = remainder; +-#else +- /* 32-bit hosts would need special wrapper functionality - just abort if +- we encounter such a case; it's very unlikely anyways. */ +- cpu_abort(env, "128 -> 64/64 division not implemented\n"); +-#endif +- } +-} +- + static inline uint64_t get_address(int x2, int b2, int d2) + { + uint64_t r = d2; +@@ -677,61 +634,6 @@ uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) + return cc; + } + +-/* absolute value 32-bit */ +-uint32_t HELPER(abs_i32)(int32_t val) +-{ +- if (val < 0) { +- return -val; +- } else { +- return val; +- } +-} +- +-/* negative absolute value 32-bit */ +-int32_t HELPER(nabs_i32)(int32_t val) +-{ +- if (val < 0) { +- return val; +- } else { +- return -val; +- } +-} +- +-/* absolute value 64-bit */ +-uint64_t HELPER(abs_i64)(int64_t val) +-{ +- HELPER_LOG("%s: val 0x%" PRIx64 "\n", __func__, val); +- +- if (val < 0) { +- return -val; +- } else { +- return val; +- } +-} +- +-/* negative absolute value 64-bit */ +-int64_t HELPER(nabs_i64)(int64_t val) +-{ +- if (val < 0) { +- return val; +- } else { +- return -val; +- } +-} +- +-/* add with carry 32-bit unsigned */ +-uint32_t HELPER(addc_u32)(uint32_t cc, uint32_t v1, uint32_t v2) +-{ +- uint32_t res; +- +- res = v1 + v2; +- if (cc & 2) { +- res++; +- } +- +- return res; +-} +- + /* store character under mask high operates on the upper half of r1 */ + void HELPER(stcmh)(uint32_t r1, uint64_t address, uint32_t mask) + { +@@ -936,57 +838,6 @@ uint32_t HELPER(clcle)(uint32_t r1, uint64_t a2, uint32_t r3) + return cc; + } + +-/* subtract unsigned v2 from v1 with borrow */ +-uint32_t HELPER(slb)(uint32_t cc, uint32_t r1, uint32_t v2) +-{ +- uint32_t v1 = env->regs[r1]; +- uint32_t res = v1 + (~v2) + (cc >> 1); +- +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | res; +- if (cc & 2) { +- /* borrow */ +- return v1 ? 1 : 0; +- } else { +- return v1 ? 3 : 2; +- } +-} +- +-/* subtract unsigned v2 from v1 with borrow */ +-uint32_t HELPER(slbg)(uint32_t cc, uint32_t r1, uint64_t v1, uint64_t v2) +-{ +- uint64_t res = v1 + (~v2) + (cc >> 1); +- +- env->regs[r1] = res; +- if (cc & 2) { +- /* borrow */ +- return v1 ? 1 : 0; +- } else { +- return v1 ? 3 : 2; +- } +-} +- +-/* find leftmost one */ +-uint32_t HELPER(flogr)(uint32_t r1, uint64_t v2) +-{ +- uint64_t res = 0; +- uint64_t ov2 = v2; +- +- while (!(v2 & 0x8000000000000000ULL) && v2) { +- v2 <<= 1; +- res++; +- } +- +- if (!v2) { +- env->regs[r1] = 64; +- env->regs[r1 + 1] = 0; +- return 0; +- } else { +- env->regs[r1] = res; +- env->regs[r1 + 1] = ov2 & ~(0x8000000000000000ULL >> res); +- return 2; +- } +-} +- + /* checksum */ + void HELPER(cksm)(uint32_t r1, uint32_t r2) + { +@@ -1026,27 +877,6 @@ void HELPER(cksm)(uint32_t r1, uint32_t r2) + ((uint32_t)cksm + (cksm >> 32)); + } + +-uint64_t HELPER(cvd)(int32_t bin) +-{ +- /* positive 0 */ +- uint64_t dec = 0x0c; +- int shift = 4; +- +- if (bin < 0) { +- bin = -bin; +- dec = 0x0d; +- } +- +- for (shift = 4; (shift < 64) && bin; shift += 4) { +- int current_number = bin % 10; +- +- dec |= (current_number) << shift; +- bin /= 10; +- } +- +- return dec; +-} +- + void HELPER(unpk)(uint32_t len, uint64_t dest, uint64_t src) + { + int len_dest = len >> 4; +-- +1.7.12.1 + diff --git a/0009-target-s390x-split-memory-access-helpers.patch b/0009-target-s390x-split-memory-access-helpers.patch new file mode 100644 index 0000000..0e87180 --- /dev/null +++ b/0009-target-s390x-split-memory-access-helpers.patch @@ -0,0 +1,2424 @@ +From a44aee2570031bfcf99098d278c53ab39a582ba6 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:34 +0000 +Subject: [PATCH] target-s390x: split memory access helpers + +Move memory access helpers to mem_helper.c. + +Signed-off-by: Blue Swirl +[agraf: fold softmmu include ifdefs together] +Signed-off-by: Alexander Graf + +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 3 +- + target-s390x/mem_helper.c | 1190 ++++++++++++++++++++++++++++++++++++++++++++ + target-s390x/op_helper.c | 1159 +----------------------------------------- + 3 files changed, 1193 insertions(+), 1159 deletions(-) + create mode 100644 target-s390x/mem_helper.c + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index e8f66e9..b9b3061 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -1,5 +1,5 @@ + obj-y += translate.o op_helper.o helper.o cpu.o interrupt.o +-obj-y += int_helper.o fpu_helper.o cc_helper.o ++obj-y += int_helper.o fpu_helper.o cc_helper.o mem_helper.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + +@@ -7,3 +7,4 @@ $(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/int_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/fpu_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/cc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) ++$(obj)/mem_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c +new file mode 100644 +index 0000000..ba05e65 +--- /dev/null ++++ b/target-s390x/mem_helper.c +@@ -0,0 +1,1190 @@ ++/* ++ * S/390 memory access helper routines ++ * ++ * Copyright (c) 2009 Ulrich Hecht ++ * Copyright (c) 2009 Alexander Graf ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, see . ++ */ ++ ++#include "cpu.h" ++#include "dyngen-exec.h" ++#include "helper.h" ++ ++/*****************************************************************************/ ++/* Softmmu support */ ++#if !defined(CONFIG_USER_ONLY) ++#include "softmmu_exec.h" ++ ++#define MMUSUFFIX _mmu ++ ++#define SHIFT 0 ++#include "softmmu_template.h" ++ ++#define SHIFT 1 ++#include "softmmu_template.h" ++ ++#define SHIFT 2 ++#include "softmmu_template.h" ++ ++#define SHIFT 3 ++#include "softmmu_template.h" ++ ++/* try to fill the TLB and return an exception if error. If retaddr is ++ NULL, it means that the function was called in C code (i.e. not ++ from generated code or from helper.c) */ ++/* XXX: fix it to restore all registers */ ++void tlb_fill(CPUS390XState *env1, target_ulong addr, int is_write, int mmu_idx, ++ uintptr_t retaddr) ++{ ++ TranslationBlock *tb; ++ CPUS390XState *saved_env; ++ int ret; ++ ++ saved_env = env; ++ env = env1; ++ ret = cpu_s390x_handle_mmu_fault(env, addr, is_write, mmu_idx); ++ if (unlikely(ret != 0)) { ++ if (likely(retaddr)) { ++ /* now we have a real cpu fault */ ++ tb = tb_find_pc(retaddr); ++ if (likely(tb)) { ++ /* the PC is inside the translated code. It means that we have ++ a virtual CPU fault */ ++ cpu_restore_state(tb, env, retaddr); ++ } ++ } ++ cpu_loop_exit(env); ++ } ++ env = saved_env; ++} ++ ++#endif ++ ++/* #define DEBUG_HELPER */ ++#ifdef DEBUG_HELPER ++#define HELPER_LOG(x...) qemu_log(x) ++#else ++#define HELPER_LOG(x...) ++#endif ++ ++#ifndef CONFIG_USER_ONLY ++static void mvc_fast_memset(CPUS390XState *env, uint32_t l, uint64_t dest, ++ uint8_t byte) ++{ ++ target_phys_addr_t dest_phys; ++ target_phys_addr_t len = l; ++ void *dest_p; ++ uint64_t asc = env->psw.mask & PSW_MASK_ASC; ++ int flags; ++ ++ if (mmu_translate(env, dest, 1, asc, &dest_phys, &flags)) { ++ stb(dest, byte); ++ cpu_abort(env, "should never reach here"); ++ } ++ dest_phys |= dest & ~TARGET_PAGE_MASK; ++ ++ dest_p = cpu_physical_memory_map(dest_phys, &len, 1); ++ ++ memset(dest_p, byte, len); ++ ++ cpu_physical_memory_unmap(dest_p, 1, len, len); ++} ++ ++static void mvc_fast_memmove(CPUS390XState *env, uint32_t l, uint64_t dest, ++ uint64_t src) ++{ ++ target_phys_addr_t dest_phys; ++ target_phys_addr_t src_phys; ++ target_phys_addr_t len = l; ++ void *dest_p; ++ void *src_p; ++ uint64_t asc = env->psw.mask & PSW_MASK_ASC; ++ int flags; ++ ++ if (mmu_translate(env, dest, 1, asc, &dest_phys, &flags)) { ++ stb(dest, 0); ++ cpu_abort(env, "should never reach here"); ++ } ++ dest_phys |= dest & ~TARGET_PAGE_MASK; ++ ++ if (mmu_translate(env, src, 0, asc, &src_phys, &flags)) { ++ ldub(src); ++ cpu_abort(env, "should never reach here"); ++ } ++ src_phys |= src & ~TARGET_PAGE_MASK; ++ ++ dest_p = cpu_physical_memory_map(dest_phys, &len, 1); ++ src_p = cpu_physical_memory_map(src_phys, &len, 0); ++ ++ memmove(dest_p, src_p, len); ++ ++ cpu_physical_memory_unmap(dest_p, 1, len, len); ++ cpu_physical_memory_unmap(src_p, 0, len, len); ++} ++#endif ++ ++/* and on array */ ++uint32_t HELPER(nc)(uint32_t l, uint64_t dest, uint64_t src) ++{ ++ int i; ++ unsigned char x; ++ uint32_t cc = 0; ++ ++ HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", ++ __func__, l, dest, src); ++ for (i = 0; i <= l; i++) { ++ x = ldub(dest + i) & ldub(src + i); ++ if (x) { ++ cc = 1; ++ } ++ stb(dest + i, x); ++ } ++ return cc; ++} ++ ++/* xor on array */ ++uint32_t HELPER(xc)(uint32_t l, uint64_t dest, uint64_t src) ++{ ++ int i; ++ unsigned char x; ++ uint32_t cc = 0; ++ ++ HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", ++ __func__, l, dest, src); ++ ++#ifndef CONFIG_USER_ONLY ++ /* xor with itself is the same as memset(0) */ ++ if ((l > 32) && (src == dest) && ++ (src & TARGET_PAGE_MASK) == ((src + l) & TARGET_PAGE_MASK)) { ++ mvc_fast_memset(env, l + 1, dest, 0); ++ return 0; ++ } ++#else ++ if (src == dest) { ++ memset(g2h(dest), 0, l + 1); ++ return 0; ++ } ++#endif ++ ++ for (i = 0; i <= l; i++) { ++ x = ldub(dest + i) ^ ldub(src + i); ++ if (x) { ++ cc = 1; ++ } ++ stb(dest + i, x); ++ } ++ return cc; ++} ++ ++/* or on array */ ++uint32_t HELPER(oc)(uint32_t l, uint64_t dest, uint64_t src) ++{ ++ int i; ++ unsigned char x; ++ uint32_t cc = 0; ++ ++ HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", ++ __func__, l, dest, src); ++ for (i = 0; i <= l; i++) { ++ x = ldub(dest + i) | ldub(src + i); ++ if (x) { ++ cc = 1; ++ } ++ stb(dest + i, x); ++ } ++ return cc; ++} ++ ++/* memmove */ ++void HELPER(mvc)(uint32_t l, uint64_t dest, uint64_t src) ++{ ++ int i = 0; ++ int x = 0; ++ uint32_t l_64 = (l + 1) / 8; ++ ++ HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", ++ __func__, l, dest, src); ++ ++#ifndef CONFIG_USER_ONLY ++ if ((l > 32) && ++ (src & TARGET_PAGE_MASK) == ((src + l) & TARGET_PAGE_MASK) && ++ (dest & TARGET_PAGE_MASK) == ((dest + l) & TARGET_PAGE_MASK)) { ++ if (dest == (src + 1)) { ++ mvc_fast_memset(env, l + 1, dest, ldub(src)); ++ return; ++ } else if ((src & TARGET_PAGE_MASK) != (dest & TARGET_PAGE_MASK)) { ++ mvc_fast_memmove(env, l + 1, dest, src); ++ return; ++ } ++ } ++#else ++ if (dest == (src + 1)) { ++ memset(g2h(dest), ldub(src), l + 1); ++ return; ++ } else { ++ memmove(g2h(dest), g2h(src), l + 1); ++ return; ++ } ++#endif ++ ++ /* handle the parts that fit into 8-byte loads/stores */ ++ if (dest != (src + 1)) { ++ for (i = 0; i < l_64; i++) { ++ stq(dest + x, ldq(src + x)); ++ x += 8; ++ } ++ } ++ ++ /* slow version crossing pages with byte accesses */ ++ for (i = x; i <= l; i++) { ++ stb(dest + i, ldub(src + i)); ++ } ++} ++ ++/* compare unsigned byte arrays */ ++uint32_t HELPER(clc)(uint32_t l, uint64_t s1, uint64_t s2) ++{ ++ int i; ++ unsigned char x, y; ++ uint32_t cc; ++ ++ HELPER_LOG("%s l %d s1 %" PRIx64 " s2 %" PRIx64 "\n", ++ __func__, l, s1, s2); ++ for (i = 0; i <= l; i++) { ++ x = ldub(s1 + i); ++ y = ldub(s2 + i); ++ HELPER_LOG("%02x (%c)/%02x (%c) ", x, x, y, y); ++ if (x < y) { ++ cc = 1; ++ goto done; ++ } else if (x > y) { ++ cc = 2; ++ goto done; ++ } ++ } ++ cc = 0; ++ done: ++ HELPER_LOG("\n"); ++ return cc; ++} ++ ++/* compare logical under mask */ ++uint32_t HELPER(clm)(uint32_t r1, uint32_t mask, uint64_t addr) ++{ ++ uint8_t r, d; ++ uint32_t cc; ++ ++ HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%" PRIx64 "\n", __func__, r1, ++ mask, addr); ++ cc = 0; ++ while (mask) { ++ if (mask & 8) { ++ d = ldub(addr); ++ r = (r1 & 0xff000000UL) >> 24; ++ HELPER_LOG("mask 0x%x %02x/%02x (0x%" PRIx64 ") ", mask, r, d, ++ addr); ++ if (r < d) { ++ cc = 1; ++ break; ++ } else if (r > d) { ++ cc = 2; ++ break; ++ } ++ addr++; ++ } ++ mask = (mask << 1) & 0xf; ++ r1 <<= 8; ++ } ++ HELPER_LOG("\n"); ++ return cc; ++} ++ ++/* store character under mask */ ++void HELPER(stcm)(uint32_t r1, uint32_t mask, uint64_t addr) ++{ ++ uint8_t r; ++ ++ HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%lx\n", __func__, r1, mask, ++ addr); ++ while (mask) { ++ if (mask & 8) { ++ r = (r1 & 0xff000000UL) >> 24; ++ stb(addr, r); ++ HELPER_LOG("mask 0x%x %02x (0x%lx) ", mask, r, addr); ++ addr++; ++ } ++ mask = (mask << 1) & 0xf; ++ r1 <<= 8; ++ } ++ HELPER_LOG("\n"); ++} ++ ++static inline uint64_t get_address(int x2, int b2, int d2) ++{ ++ uint64_t r = d2; ++ ++ if (x2) { ++ r += env->regs[x2]; ++ } ++ ++ if (b2) { ++ r += env->regs[b2]; ++ } ++ ++ /* 31-Bit mode */ ++ if (!(env->psw.mask & PSW_MASK_64)) { ++ r &= 0x7fffffff; ++ } ++ ++ return r; ++} ++ ++static inline uint64_t get_address_31fix(int reg) ++{ ++ uint64_t r = env->regs[reg]; ++ ++ /* 31-Bit mode */ ++ if (!(env->psw.mask & PSW_MASK_64)) { ++ r &= 0x7fffffff; ++ } ++ ++ return r; ++} ++ ++/* search string (c is byte to search, r2 is string, r1 end of string) */ ++uint32_t HELPER(srst)(uint32_t c, uint32_t r1, uint32_t r2) ++{ ++ uint64_t i; ++ uint32_t cc = 2; ++ uint64_t str = get_address_31fix(r2); ++ uint64_t end = get_address_31fix(r1); ++ ++ HELPER_LOG("%s: c %d *r1 0x%" PRIx64 " *r2 0x%" PRIx64 "\n", __func__, ++ c, env->regs[r1], env->regs[r2]); ++ ++ for (i = str; i != end; i++) { ++ if (ldub(i) == c) { ++ env->regs[r1] = i; ++ cc = 1; ++ break; ++ } ++ } ++ ++ return cc; ++} ++ ++/* unsigned string compare (c is string terminator) */ ++uint32_t HELPER(clst)(uint32_t c, uint32_t r1, uint32_t r2) ++{ ++ uint64_t s1 = get_address_31fix(r1); ++ uint64_t s2 = get_address_31fix(r2); ++ uint8_t v1, v2; ++ uint32_t cc; ++ ++ c = c & 0xff; ++#ifdef CONFIG_USER_ONLY ++ if (!c) { ++ HELPER_LOG("%s: comparing '%s' and '%s'\n", ++ __func__, (char *)g2h(s1), (char *)g2h(s2)); ++ } ++#endif ++ for (;;) { ++ v1 = ldub(s1); ++ v2 = ldub(s2); ++ if ((v1 == c || v2 == c) || (v1 != v2)) { ++ break; ++ } ++ s1++; ++ s2++; ++ } ++ ++ if (v1 == v2) { ++ cc = 0; ++ } else { ++ cc = (v1 < v2) ? 1 : 2; ++ /* FIXME: 31-bit mode! */ ++ env->regs[r1] = s1; ++ env->regs[r2] = s2; ++ } ++ return cc; ++} ++ ++/* move page */ ++void HELPER(mvpg)(uint64_t r0, uint64_t r1, uint64_t r2) ++{ ++ /* XXX missing r0 handling */ ++#ifdef CONFIG_USER_ONLY ++ int i; ++ ++ for (i = 0; i < TARGET_PAGE_SIZE; i++) { ++ stb(r1 + i, ldub(r2 + i)); ++ } ++#else ++ mvc_fast_memmove(env, TARGET_PAGE_SIZE, r1, r2); ++#endif ++} ++ ++/* string copy (c is string terminator) */ ++void HELPER(mvst)(uint32_t c, uint32_t r1, uint32_t r2) ++{ ++ uint64_t dest = get_address_31fix(r1); ++ uint64_t src = get_address_31fix(r2); ++ uint8_t v; ++ ++ c = c & 0xff; ++#ifdef CONFIG_USER_ONLY ++ if (!c) { ++ HELPER_LOG("%s: copy '%s' to 0x%lx\n", __func__, (char *)g2h(src), ++ dest); ++ } ++#endif ++ for (;;) { ++ v = ldub(src); ++ stb(dest, v); ++ if (v == c) { ++ break; ++ } ++ src++; ++ dest++; ++ } ++ env->regs[r1] = dest; /* FIXME: 31-bit mode! */ ++} ++ ++/* compare and swap 64-bit */ ++uint32_t HELPER(csg)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ /* FIXME: locking? */ ++ uint32_t cc; ++ uint64_t v2 = ldq(a2); ++ ++ if (env->regs[r1] == v2) { ++ cc = 0; ++ stq(a2, env->regs[r3]); ++ } else { ++ cc = 1; ++ env->regs[r1] = v2; ++ } ++ return cc; ++} ++ ++/* compare double and swap 64-bit */ ++uint32_t HELPER(cdsg)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ /* FIXME: locking? */ ++ uint32_t cc; ++ uint64_t v2_hi = ldq(a2); ++ uint64_t v2_lo = ldq(a2 + 8); ++ uint64_t v1_hi = env->regs[r1]; ++ uint64_t v1_lo = env->regs[r1 + 1]; ++ ++ if ((v1_hi == v2_hi) && (v1_lo == v2_lo)) { ++ cc = 0; ++ stq(a2, env->regs[r3]); ++ stq(a2 + 8, env->regs[r3 + 1]); ++ } else { ++ cc = 1; ++ env->regs[r1] = v2_hi; ++ env->regs[r1 + 1] = v2_lo; ++ } ++ ++ return cc; ++} ++ ++/* compare and swap 32-bit */ ++uint32_t HELPER(cs)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ /* FIXME: locking? */ ++ uint32_t cc; ++ uint32_t v2 = ldl(a2); ++ ++ HELPER_LOG("%s: r1 %d a2 0x%lx r3 %d\n", __func__, r1, a2, r3); ++ if (((uint32_t)env->regs[r1]) == v2) { ++ cc = 0; ++ stl(a2, (uint32_t)env->regs[r3]); ++ } else { ++ cc = 1; ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | v2; ++ } ++ return cc; ++} ++ ++static uint32_t helper_icm(uint32_t r1, uint64_t address, uint32_t mask) ++{ ++ int pos = 24; /* top of the lower half of r1 */ ++ uint64_t rmask = 0xff000000ULL; ++ uint8_t val = 0; ++ int ccd = 0; ++ uint32_t cc = 0; ++ ++ while (mask) { ++ if (mask & 8) { ++ env->regs[r1] &= ~rmask; ++ val = ldub(address); ++ if ((val & 0x80) && !ccd) { ++ cc = 1; ++ } ++ ccd = 1; ++ if (val && cc == 0) { ++ cc = 2; ++ } ++ env->regs[r1] |= (uint64_t)val << pos; ++ address++; ++ } ++ mask = (mask << 1) & 0xf; ++ pos -= 8; ++ rmask >>= 8; ++ } ++ ++ return cc; ++} ++ ++/* execute instruction ++ this instruction executes an insn modified with the contents of r1 ++ it does not change the executed instruction in memory ++ it does not change the program counter ++ in other words: tricky... ++ currently implemented by interpreting the cases it is most commonly used in ++*/ ++uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) ++{ ++ uint16_t insn = lduw_code(addr); ++ ++ HELPER_LOG("%s: v1 0x%lx addr 0x%lx insn 0x%x\n", __func__, v1, addr, ++ insn); ++ if ((insn & 0xf0ff) == 0xd000) { ++ uint32_t l, insn2, b1, b2, d1, d2; ++ ++ l = v1 & 0xff; ++ insn2 = ldl_code(addr + 2); ++ b1 = (insn2 >> 28) & 0xf; ++ b2 = (insn2 >> 12) & 0xf; ++ d1 = (insn2 >> 16) & 0xfff; ++ d2 = insn2 & 0xfff; ++ switch (insn & 0xf00) { ++ case 0x200: ++ helper_mvc(l, get_address(0, b1, d1), get_address(0, b2, d2)); ++ break; ++ case 0x500: ++ cc = helper_clc(l, get_address(0, b1, d1), get_address(0, b2, d2)); ++ break; ++ case 0x700: ++ cc = helper_xc(l, get_address(0, b1, d1), get_address(0, b2, d2)); ++ break; ++ case 0xc00: ++ helper_tr(l, get_address(0, b1, d1), get_address(0, b2, d2)); ++ break; ++ default: ++ goto abort; ++ break; ++ } ++ } else if ((insn & 0xff00) == 0x0a00) { ++ /* supervisor call */ ++ HELPER_LOG("%s: svc %ld via execute\n", __func__, (insn | v1) & 0xff); ++ env->psw.addr = ret - 4; ++ env->int_svc_code = (insn | v1) & 0xff; ++ env->int_svc_ilc = 4; ++ helper_exception(EXCP_SVC); ++ } else if ((insn & 0xff00) == 0xbf00) { ++ uint32_t insn2, r1, r3, b2, d2; ++ ++ insn2 = ldl_code(addr + 2); ++ r1 = (insn2 >> 20) & 0xf; ++ r3 = (insn2 >> 16) & 0xf; ++ b2 = (insn2 >> 12) & 0xf; ++ d2 = insn2 & 0xfff; ++ cc = helper_icm(r1, get_address(0, b2, d2), r3); ++ } else { ++ abort: ++ cpu_abort(env, "EXECUTE on instruction prefix 0x%x not implemented\n", ++ insn); ++ } ++ return cc; ++} ++ ++/* store character under mask high operates on the upper half of r1 */ ++void HELPER(stcmh)(uint32_t r1, uint64_t address, uint32_t mask) ++{ ++ int pos = 56; /* top of the upper half of r1 */ ++ ++ while (mask) { ++ if (mask & 8) { ++ stb(address, (env->regs[r1] >> pos) & 0xff); ++ address++; ++ } ++ mask = (mask << 1) & 0xf; ++ pos -= 8; ++ } ++} ++ ++/* insert character under mask high; same as icm, but operates on the ++ upper half of r1 */ ++uint32_t HELPER(icmh)(uint32_t r1, uint64_t address, uint32_t mask) ++{ ++ int pos = 56; /* top of the upper half of r1 */ ++ uint64_t rmask = 0xff00000000000000ULL; ++ uint8_t val = 0; ++ int ccd = 0; ++ uint32_t cc = 0; ++ ++ while (mask) { ++ if (mask & 8) { ++ env->regs[r1] &= ~rmask; ++ val = ldub(address); ++ if ((val & 0x80) && !ccd) { ++ cc = 1; ++ } ++ ccd = 1; ++ if (val && cc == 0) { ++ cc = 2; ++ } ++ env->regs[r1] |= (uint64_t)val << pos; ++ address++; ++ } ++ mask = (mask << 1) & 0xf; ++ pos -= 8; ++ rmask >>= 8; ++ } ++ ++ return cc; ++} ++ ++/* load access registers r1 to r3 from memory at a2 */ ++void HELPER(lam)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ int i; ++ ++ for (i = r1;; i = (i + 1) % 16) { ++ env->aregs[i] = ldl(a2); ++ a2 += 4; ++ ++ if (i == r3) { ++ break; ++ } ++ } ++} ++ ++/* store access registers r1 to r3 in memory at a2 */ ++void HELPER(stam)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ int i; ++ ++ for (i = r1;; i = (i + 1) % 16) { ++ stl(a2, env->aregs[i]); ++ a2 += 4; ++ ++ if (i == r3) { ++ break; ++ } ++ } ++} ++ ++/* move long */ ++uint32_t HELPER(mvcl)(uint32_t r1, uint32_t r2) ++{ ++ uint64_t destlen = env->regs[r1 + 1] & 0xffffff; ++ uint64_t dest = get_address_31fix(r1); ++ uint64_t srclen = env->regs[r2 + 1] & 0xffffff; ++ uint64_t src = get_address_31fix(r2); ++ uint8_t pad = src >> 24; ++ uint8_t v; ++ uint32_t cc; ++ ++ if (destlen == srclen) { ++ cc = 0; ++ } else if (destlen < srclen) { ++ cc = 1; ++ } else { ++ cc = 2; ++ } ++ ++ if (srclen > destlen) { ++ srclen = destlen; ++ } ++ ++ for (; destlen && srclen; src++, dest++, destlen--, srclen--) { ++ v = ldub(src); ++ stb(dest, v); ++ } ++ ++ for (; destlen; dest++, destlen--) { ++ stb(dest, pad); ++ } ++ ++ env->regs[r1 + 1] = destlen; ++ /* can't use srclen here, we trunc'ed it */ ++ env->regs[r2 + 1] -= src - env->regs[r2]; ++ env->regs[r1] = dest; ++ env->regs[r2] = src; ++ ++ return cc; ++} ++ ++/* move long extended another memcopy insn with more bells and whistles */ ++uint32_t HELPER(mvcle)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ uint64_t destlen = env->regs[r1 + 1]; ++ uint64_t dest = env->regs[r1]; ++ uint64_t srclen = env->regs[r3 + 1]; ++ uint64_t src = env->regs[r3]; ++ uint8_t pad = a2 & 0xff; ++ uint8_t v; ++ uint32_t cc; ++ ++ if (!(env->psw.mask & PSW_MASK_64)) { ++ destlen = (uint32_t)destlen; ++ srclen = (uint32_t)srclen; ++ dest &= 0x7fffffff; ++ src &= 0x7fffffff; ++ } ++ ++ if (destlen == srclen) { ++ cc = 0; ++ } else if (destlen < srclen) { ++ cc = 1; ++ } else { ++ cc = 2; ++ } ++ ++ if (srclen > destlen) { ++ srclen = destlen; ++ } ++ ++ for (; destlen && srclen; src++, dest++, destlen--, srclen--) { ++ v = ldub(src); ++ stb(dest, v); ++ } ++ ++ for (; destlen; dest++, destlen--) { ++ stb(dest, pad); ++ } ++ ++ env->regs[r1 + 1] = destlen; ++ /* can't use srclen here, we trunc'ed it */ ++ /* FIXME: 31-bit mode! */ ++ env->regs[r3 + 1] -= src - env->regs[r3]; ++ env->regs[r1] = dest; ++ env->regs[r3] = src; ++ ++ return cc; ++} ++ ++/* compare logical long extended memcompare insn with padding */ ++uint32_t HELPER(clcle)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ uint64_t destlen = env->regs[r1 + 1]; ++ uint64_t dest = get_address_31fix(r1); ++ uint64_t srclen = env->regs[r3 + 1]; ++ uint64_t src = get_address_31fix(r3); ++ uint8_t pad = a2 & 0xff; ++ uint8_t v1 = 0, v2 = 0; ++ uint32_t cc = 0; ++ ++ if (!(destlen || srclen)) { ++ return cc; ++ } ++ ++ if (srclen > destlen) { ++ srclen = destlen; ++ } ++ ++ for (; destlen || srclen; src++, dest++, destlen--, srclen--) { ++ v1 = srclen ? ldub(src) : pad; ++ v2 = destlen ? ldub(dest) : pad; ++ if (v1 != v2) { ++ cc = (v1 < v2) ? 1 : 2; ++ break; ++ } ++ } ++ ++ env->regs[r1 + 1] = destlen; ++ /* can't use srclen here, we trunc'ed it */ ++ env->regs[r3 + 1] -= src - env->regs[r3]; ++ env->regs[r1] = dest; ++ env->regs[r3] = src; ++ ++ return cc; ++} ++ ++/* checksum */ ++void HELPER(cksm)(uint32_t r1, uint32_t r2) ++{ ++ uint64_t src = get_address_31fix(r2); ++ uint64_t src_len = env->regs[(r2 + 1) & 15]; ++ uint64_t cksm = (uint32_t)env->regs[r1]; ++ ++ while (src_len >= 4) { ++ cksm += ldl(src); ++ ++ /* move to next word */ ++ src_len -= 4; ++ src += 4; ++ } ++ ++ switch (src_len) { ++ case 0: ++ break; ++ case 1: ++ cksm += ldub(src) << 24; ++ break; ++ case 2: ++ cksm += lduw(src) << 16; ++ break; ++ case 3: ++ cksm += lduw(src) << 16; ++ cksm += ldub(src + 2) << 8; ++ break; ++ } ++ ++ /* indicate we've processed everything */ ++ env->regs[r2] = src + src_len; ++ env->regs[(r2 + 1) & 15] = 0; ++ ++ /* store result */ ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | ++ ((uint32_t)cksm + (cksm >> 32)); ++} ++ ++void HELPER(unpk)(uint32_t len, uint64_t dest, uint64_t src) ++{ ++ int len_dest = len >> 4; ++ int len_src = len & 0xf; ++ uint8_t b; ++ int second_nibble = 0; ++ ++ dest += len_dest; ++ src += len_src; ++ ++ /* last byte is special, it only flips the nibbles */ ++ b = ldub(src); ++ stb(dest, (b << 4) | (b >> 4)); ++ src--; ++ len_src--; ++ ++ /* now pad every nibble with 0xf0 */ ++ ++ while (len_dest > 0) { ++ uint8_t cur_byte = 0; ++ ++ if (len_src > 0) { ++ cur_byte = ldub(src); ++ } ++ ++ len_dest--; ++ dest--; ++ ++ /* only advance one nibble at a time */ ++ if (second_nibble) { ++ cur_byte >>= 4; ++ len_src--; ++ src--; ++ } ++ second_nibble = !second_nibble; ++ ++ /* digit */ ++ cur_byte = (cur_byte & 0xf); ++ /* zone bits */ ++ cur_byte |= 0xf0; ++ ++ stb(dest, cur_byte); ++ } ++} ++ ++void HELPER(tr)(uint32_t len, uint64_t array, uint64_t trans) ++{ ++ int i; ++ ++ for (i = 0; i <= len; i++) { ++ uint8_t byte = ldub(array + i); ++ uint8_t new_byte = ldub(trans + byte); ++ ++ stb(array + i, new_byte); ++ } ++} ++ ++#if !defined(CONFIG_USER_ONLY) ++void HELPER(lctlg)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ int i; ++ uint64_t src = a2; ++ ++ for (i = r1;; i = (i + 1) % 16) { ++ env->cregs[i] = ldq(src); ++ HELPER_LOG("load ctl %d from 0x%" PRIx64 " == 0x%" PRIx64 "\n", ++ i, src, env->cregs[i]); ++ src += sizeof(uint64_t); ++ ++ if (i == r3) { ++ break; ++ } ++ } ++ ++ tlb_flush(env, 1); ++} ++ ++void HELPER(lctl)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ int i; ++ uint64_t src = a2; ++ ++ for (i = r1;; i = (i + 1) % 16) { ++ env->cregs[i] = (env->cregs[i] & 0xFFFFFFFF00000000ULL) | ldl(src); ++ src += sizeof(uint32_t); ++ ++ if (i == r3) { ++ break; ++ } ++ } ++ ++ tlb_flush(env, 1); ++} ++ ++void HELPER(stctg)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ int i; ++ uint64_t dest = a2; ++ ++ for (i = r1;; i = (i + 1) % 16) { ++ stq(dest, env->cregs[i]); ++ dest += sizeof(uint64_t); ++ ++ if (i == r3) { ++ break; ++ } ++ } ++} ++ ++void HELPER(stctl)(uint32_t r1, uint64_t a2, uint32_t r3) ++{ ++ int i; ++ uint64_t dest = a2; ++ ++ for (i = r1;; i = (i + 1) % 16) { ++ stl(dest, env->cregs[i]); ++ dest += sizeof(uint32_t); ++ ++ if (i == r3) { ++ break; ++ } ++ } ++} ++ ++uint32_t HELPER(tprot)(uint64_t a1, uint64_t a2) ++{ ++ /* XXX implement */ ++ ++ return 0; ++} ++ ++/* insert storage key extended */ ++uint64_t HELPER(iske)(uint64_t r2) ++{ ++ uint64_t addr = get_address(0, 0, r2); ++ ++ if (addr > ram_size) { ++ return 0; ++ } ++ ++ return env->storage_keys[addr / TARGET_PAGE_SIZE]; ++} ++ ++/* set storage key extended */ ++void HELPER(sske)(uint32_t r1, uint64_t r2) ++{ ++ uint64_t addr = get_address(0, 0, r2); ++ ++ if (addr > ram_size) { ++ return; ++ } ++ ++ env->storage_keys[addr / TARGET_PAGE_SIZE] = r1; ++} ++ ++/* reset reference bit extended */ ++uint32_t HELPER(rrbe)(uint32_t r1, uint64_t r2) ++{ ++ uint8_t re; ++ uint8_t key; ++ ++ if (r2 > ram_size) { ++ return 0; ++ } ++ ++ key = env->storage_keys[r2 / TARGET_PAGE_SIZE]; ++ re = key & (SK_R | SK_C); ++ env->storage_keys[r2 / TARGET_PAGE_SIZE] = (key & ~SK_R); ++ ++ /* ++ * cc ++ * ++ * 0 Reference bit zero; change bit zero ++ * 1 Reference bit zero; change bit one ++ * 2 Reference bit one; change bit zero ++ * 3 Reference bit one; change bit one ++ */ ++ ++ return re >> 1; ++} ++ ++/* compare and swap and purge */ ++uint32_t HELPER(csp)(uint32_t r1, uint32_t r2) ++{ ++ uint32_t cc; ++ uint32_t o1 = env->regs[r1]; ++ uint64_t a2 = get_address_31fix(r2) & ~3ULL; ++ uint32_t o2 = ldl(a2); ++ ++ if (o1 == o2) { ++ stl(a2, env->regs[(r1 + 1) & 15]); ++ if (env->regs[r2] & 0x3) { ++ /* flush TLB / ALB */ ++ tlb_flush(env, 1); ++ } ++ cc = 0; ++ } else { ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | o2; ++ cc = 1; ++ } ++ ++ return cc; ++} ++ ++static uint32_t mvc_asc(int64_t l, uint64_t a1, uint64_t mode1, uint64_t a2, ++ uint64_t mode2) ++{ ++ target_ulong src, dest; ++ int flags, cc = 0, i; ++ ++ if (!l) { ++ return 0; ++ } else if (l > 256) { ++ /* max 256 */ ++ l = 256; ++ cc = 3; ++ } ++ ++ if (mmu_translate(env, a1 & TARGET_PAGE_MASK, 1, mode1, &dest, &flags)) { ++ cpu_loop_exit(env); ++ } ++ dest |= a1 & ~TARGET_PAGE_MASK; ++ ++ if (mmu_translate(env, a2 & TARGET_PAGE_MASK, 0, mode2, &src, &flags)) { ++ cpu_loop_exit(env); ++ } ++ src |= a2 & ~TARGET_PAGE_MASK; ++ ++ /* XXX replace w/ memcpy */ ++ for (i = 0; i < l; i++) { ++ /* XXX be more clever */ ++ if ((((dest + i) & TARGET_PAGE_MASK) != (dest & TARGET_PAGE_MASK)) || ++ (((src + i) & TARGET_PAGE_MASK) != (src & TARGET_PAGE_MASK))) { ++ mvc_asc(l - i, a1 + i, mode1, a2 + i, mode2); ++ break; ++ } ++ stb_phys(dest + i, ldub_phys(src + i)); ++ } ++ ++ return cc; ++} ++ ++uint32_t HELPER(mvcs)(uint64_t l, uint64_t a1, uint64_t a2) ++{ ++ HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n", ++ __func__, l, a1, a2); ++ ++ return mvc_asc(l, a1, PSW_ASC_SECONDARY, a2, PSW_ASC_PRIMARY); ++} ++ ++uint32_t HELPER(mvcp)(uint64_t l, uint64_t a1, uint64_t a2) ++{ ++ HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n", ++ __func__, l, a1, a2); ++ ++ return mvc_asc(l, a1, PSW_ASC_PRIMARY, a2, PSW_ASC_SECONDARY); ++} ++ ++/* invalidate pte */ ++void HELPER(ipte)(uint64_t pte_addr, uint64_t vaddr) ++{ ++ uint64_t page = vaddr & TARGET_PAGE_MASK; ++ uint64_t pte = 0; ++ ++ /* XXX broadcast to other CPUs */ ++ ++ /* XXX Linux is nice enough to give us the exact pte address. ++ According to spec we'd have to find it out ourselves */ ++ /* XXX Linux is fine with overwriting the pte, the spec requires ++ us to only set the invalid bit */ ++ stq_phys(pte_addr, pte | _PAGE_INVALID); ++ ++ /* XXX we exploit the fact that Linux passes the exact virtual ++ address here - it's not obliged to! */ ++ tlb_flush_page(env, page); ++ ++ /* XXX 31-bit hack */ ++ if (page & 0x80000000) { ++ tlb_flush_page(env, page & ~0x80000000); ++ } else { ++ tlb_flush_page(env, page | 0x80000000); ++ } ++} ++ ++/* flush local tlb */ ++void HELPER(ptlb)(void) ++{ ++ tlb_flush(env, 1); ++} ++ ++/* store using real address */ ++void HELPER(stura)(uint64_t addr, uint32_t v1) ++{ ++ stw_phys(get_address(0, 0, addr), v1); ++} ++ ++/* load real address */ ++uint32_t HELPER(lra)(uint64_t addr, uint32_t r1) ++{ ++ uint32_t cc = 0; ++ int old_exc = env->exception_index; ++ uint64_t asc = env->psw.mask & PSW_MASK_ASC; ++ uint64_t ret; ++ int flags; ++ ++ /* XXX incomplete - has more corner cases */ ++ if (!(env->psw.mask & PSW_MASK_64) && (addr >> 32)) { ++ program_interrupt(env, PGM_SPECIAL_OP, 2); ++ } ++ ++ env->exception_index = old_exc; ++ if (mmu_translate(env, addr, 0, asc, &ret, &flags)) { ++ cc = 3; ++ } ++ if (env->exception_index == EXCP_PGM) { ++ ret = env->int_pgm_code | 0x80000000; ++ } else { ++ ret |= addr & ~TARGET_PAGE_MASK; ++ } ++ env->exception_index = old_exc; ++ ++ if (!(env->psw.mask & PSW_MASK_64)) { ++ env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | ++ (ret & 0xffffffffULL); ++ } else { ++ env->regs[r1] = ret; ++ } ++ ++ return cc; ++} ++ ++#endif +diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c +index 3b8b997..bb8dbf5 100644 +--- a/target-s390x/op_helper.c ++++ b/target-s390x/op_helper.c +@@ -32,57 +32,8 @@ + #endif + + #if !defined(CONFIG_USER_ONLY) +-#include "sysemu.h" +-#endif +- +-/*****************************************************************************/ +-/* Softmmu support */ +-#if !defined(CONFIG_USER_ONLY) + #include "softmmu_exec.h" +- +-#define MMUSUFFIX _mmu +- +-#define SHIFT 0 +-#include "softmmu_template.h" +- +-#define SHIFT 1 +-#include "softmmu_template.h" +- +-#define SHIFT 2 +-#include "softmmu_template.h" +- +-#define SHIFT 3 +-#include "softmmu_template.h" +- +-/* try to fill the TLB and return an exception if error. If retaddr is +- NULL, it means that the function was called in C code (i.e. not +- from generated code or from helper.c) */ +-/* XXX: fix it to restore all registers */ +-void tlb_fill(CPUS390XState *env1, target_ulong addr, int is_write, int mmu_idx, +- uintptr_t retaddr) +-{ +- TranslationBlock *tb; +- CPUS390XState *saved_env; +- int ret; +- +- saved_env = env; +- env = env1; +- ret = cpu_s390x_handle_mmu_fault(env, addr, is_write, mmu_idx); +- if (unlikely(ret != 0)) { +- if (likely(retaddr)) { +- /* now we have a real cpu fault */ +- tb = tb_find_pc(retaddr); +- if (likely(tb)) { +- /* the PC is inside the translated code. It means that we have +- a virtual CPU fault */ +- cpu_restore_state(tb, env, retaddr); +- } +- } +- cpu_loop_exit(env); +- } +- env = saved_env; +-} +- ++#include "sysemu.h" + #endif + + /* #define DEBUG_HELPER */ +@@ -101,840 +52,6 @@ void HELPER(exception)(uint32_t excp) + } + + #ifndef CONFIG_USER_ONLY +-static void mvc_fast_memset(CPUS390XState *env, uint32_t l, uint64_t dest, +- uint8_t byte) +-{ +- target_phys_addr_t dest_phys; +- target_phys_addr_t len = l; +- void *dest_p; +- uint64_t asc = env->psw.mask & PSW_MASK_ASC; +- int flags; +- +- if (mmu_translate(env, dest, 1, asc, &dest_phys, &flags)) { +- stb(dest, byte); +- cpu_abort(env, "should never reach here"); +- } +- dest_phys |= dest & ~TARGET_PAGE_MASK; +- +- dest_p = cpu_physical_memory_map(dest_phys, &len, 1); +- +- memset(dest_p, byte, len); +- +- cpu_physical_memory_unmap(dest_p, 1, len, len); +-} +- +-static void mvc_fast_memmove(CPUS390XState *env, uint32_t l, uint64_t dest, +- uint64_t src) +-{ +- target_phys_addr_t dest_phys; +- target_phys_addr_t src_phys; +- target_phys_addr_t len = l; +- void *dest_p; +- void *src_p; +- uint64_t asc = env->psw.mask & PSW_MASK_ASC; +- int flags; +- +- if (mmu_translate(env, dest, 1, asc, &dest_phys, &flags)) { +- stb(dest, 0); +- cpu_abort(env, "should never reach here"); +- } +- dest_phys |= dest & ~TARGET_PAGE_MASK; +- +- if (mmu_translate(env, src, 0, asc, &src_phys, &flags)) { +- ldub(src); +- cpu_abort(env, "should never reach here"); +- } +- src_phys |= src & ~TARGET_PAGE_MASK; +- +- dest_p = cpu_physical_memory_map(dest_phys, &len, 1); +- src_p = cpu_physical_memory_map(src_phys, &len, 0); +- +- memmove(dest_p, src_p, len); +- +- cpu_physical_memory_unmap(dest_p, 1, len, len); +- cpu_physical_memory_unmap(src_p, 0, len, len); +-} +-#endif +- +-/* and on array */ +-uint32_t HELPER(nc)(uint32_t l, uint64_t dest, uint64_t src) +-{ +- int i; +- unsigned char x; +- uint32_t cc = 0; +- +- HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", +- __func__, l, dest, src); +- for (i = 0; i <= l; i++) { +- x = ldub(dest + i) & ldub(src + i); +- if (x) { +- cc = 1; +- } +- stb(dest + i, x); +- } +- return cc; +-} +- +-/* xor on array */ +-uint32_t HELPER(xc)(uint32_t l, uint64_t dest, uint64_t src) +-{ +- int i; +- unsigned char x; +- uint32_t cc = 0; +- +- HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", +- __func__, l, dest, src); +- +-#ifndef CONFIG_USER_ONLY +- /* xor with itself is the same as memset(0) */ +- if ((l > 32) && (src == dest) && +- (src & TARGET_PAGE_MASK) == ((src + l) & TARGET_PAGE_MASK)) { +- mvc_fast_memset(env, l + 1, dest, 0); +- return 0; +- } +-#else +- if (src == dest) { +- memset(g2h(dest), 0, l + 1); +- return 0; +- } +-#endif +- +- for (i = 0; i <= l; i++) { +- x = ldub(dest + i) ^ ldub(src + i); +- if (x) { +- cc = 1; +- } +- stb(dest + i, x); +- } +- return cc; +-} +- +-/* or on array */ +-uint32_t HELPER(oc)(uint32_t l, uint64_t dest, uint64_t src) +-{ +- int i; +- unsigned char x; +- uint32_t cc = 0; +- +- HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", +- __func__, l, dest, src); +- for (i = 0; i <= l; i++) { +- x = ldub(dest + i) | ldub(src + i); +- if (x) { +- cc = 1; +- } +- stb(dest + i, x); +- } +- return cc; +-} +- +-/* memmove */ +-void HELPER(mvc)(uint32_t l, uint64_t dest, uint64_t src) +-{ +- int i = 0; +- int x = 0; +- uint32_t l_64 = (l + 1) / 8; +- +- HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", +- __func__, l, dest, src); +- +-#ifndef CONFIG_USER_ONLY +- if ((l > 32) && +- (src & TARGET_PAGE_MASK) == ((src + l) & TARGET_PAGE_MASK) && +- (dest & TARGET_PAGE_MASK) == ((dest + l) & TARGET_PAGE_MASK)) { +- if (dest == (src + 1)) { +- mvc_fast_memset(env, l + 1, dest, ldub(src)); +- return; +- } else if ((src & TARGET_PAGE_MASK) != (dest & TARGET_PAGE_MASK)) { +- mvc_fast_memmove(env, l + 1, dest, src); +- return; +- } +- } +-#else +- if (dest == (src + 1)) { +- memset(g2h(dest), ldub(src), l + 1); +- return; +- } else { +- memmove(g2h(dest), g2h(src), l + 1); +- return; +- } +-#endif +- +- /* handle the parts that fit into 8-byte loads/stores */ +- if (dest != (src + 1)) { +- for (i = 0; i < l_64; i++) { +- stq(dest + x, ldq(src + x)); +- x += 8; +- } +- } +- +- /* slow version crossing pages with byte accesses */ +- for (i = x; i <= l; i++) { +- stb(dest + i, ldub(src + i)); +- } +-} +- +-/* compare unsigned byte arrays */ +-uint32_t HELPER(clc)(uint32_t l, uint64_t s1, uint64_t s2) +-{ +- int i; +- unsigned char x, y; +- uint32_t cc; +- +- HELPER_LOG("%s l %d s1 %" PRIx64 " s2 %" PRIx64 "\n", +- __func__, l, s1, s2); +- for (i = 0; i <= l; i++) { +- x = ldub(s1 + i); +- y = ldub(s2 + i); +- HELPER_LOG("%02x (%c)/%02x (%c) ", x, x, y, y); +- if (x < y) { +- cc = 1; +- goto done; +- } else if (x > y) { +- cc = 2; +- goto done; +- } +- } +- cc = 0; +- done: +- HELPER_LOG("\n"); +- return cc; +-} +- +-/* compare logical under mask */ +-uint32_t HELPER(clm)(uint32_t r1, uint32_t mask, uint64_t addr) +-{ +- uint8_t r, d; +- uint32_t cc; +- +- HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%" PRIx64 "\n", __func__, r1, +- mask, addr); +- cc = 0; +- while (mask) { +- if (mask & 8) { +- d = ldub(addr); +- r = (r1 & 0xff000000UL) >> 24; +- HELPER_LOG("mask 0x%x %02x/%02x (0x%" PRIx64 ") ", mask, r, d, +- addr); +- if (r < d) { +- cc = 1; +- break; +- } else if (r > d) { +- cc = 2; +- break; +- } +- addr++; +- } +- mask = (mask << 1) & 0xf; +- r1 <<= 8; +- } +- HELPER_LOG("\n"); +- return cc; +-} +- +-/* store character under mask */ +-void HELPER(stcm)(uint32_t r1, uint32_t mask, uint64_t addr) +-{ +- uint8_t r; +- +- HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%lx\n", __func__, r1, mask, +- addr); +- while (mask) { +- if (mask & 8) { +- r = (r1 & 0xff000000UL) >> 24; +- stb(addr, r); +- HELPER_LOG("mask 0x%x %02x (0x%lx) ", mask, r, addr); +- addr++; +- } +- mask = (mask << 1) & 0xf; +- r1 <<= 8; +- } +- HELPER_LOG("\n"); +-} +- +-static inline uint64_t get_address(int x2, int b2, int d2) +-{ +- uint64_t r = d2; +- +- if (x2) { +- r += env->regs[x2]; +- } +- +- if (b2) { +- r += env->regs[b2]; +- } +- +- /* 31-Bit mode */ +- if (!(env->psw.mask & PSW_MASK_64)) { +- r &= 0x7fffffff; +- } +- +- return r; +-} +- +-static inline uint64_t get_address_31fix(int reg) +-{ +- uint64_t r = env->regs[reg]; +- +- /* 31-Bit mode */ +- if (!(env->psw.mask & PSW_MASK_64)) { +- r &= 0x7fffffff; +- } +- +- return r; +-} +- +-/* search string (c is byte to search, r2 is string, r1 end of string) */ +-uint32_t HELPER(srst)(uint32_t c, uint32_t r1, uint32_t r2) +-{ +- uint64_t i; +- uint32_t cc = 2; +- uint64_t str = get_address_31fix(r2); +- uint64_t end = get_address_31fix(r1); +- +- HELPER_LOG("%s: c %d *r1 0x%" PRIx64 " *r2 0x%" PRIx64 "\n", __func__, +- c, env->regs[r1], env->regs[r2]); +- +- for (i = str; i != end; i++) { +- if (ldub(i) == c) { +- env->regs[r1] = i; +- cc = 1; +- break; +- } +- } +- +- return cc; +-} +- +-/* unsigned string compare (c is string terminator) */ +-uint32_t HELPER(clst)(uint32_t c, uint32_t r1, uint32_t r2) +-{ +- uint64_t s1 = get_address_31fix(r1); +- uint64_t s2 = get_address_31fix(r2); +- uint8_t v1, v2; +- uint32_t cc; +- +- c = c & 0xff; +-#ifdef CONFIG_USER_ONLY +- if (!c) { +- HELPER_LOG("%s: comparing '%s' and '%s'\n", +- __func__, (char *)g2h(s1), (char *)g2h(s2)); +- } +-#endif +- for (;;) { +- v1 = ldub(s1); +- v2 = ldub(s2); +- if ((v1 == c || v2 == c) || (v1 != v2)) { +- break; +- } +- s1++; +- s2++; +- } +- +- if (v1 == v2) { +- cc = 0; +- } else { +- cc = (v1 < v2) ? 1 : 2; +- /* FIXME: 31-bit mode! */ +- env->regs[r1] = s1; +- env->regs[r2] = s2; +- } +- return cc; +-} +- +-/* move page */ +-void HELPER(mvpg)(uint64_t r0, uint64_t r1, uint64_t r2) +-{ +- /* XXX missing r0 handling */ +-#ifdef CONFIG_USER_ONLY +- int i; +- +- for (i = 0; i < TARGET_PAGE_SIZE; i++) { +- stb(r1 + i, ldub(r2 + i)); +- } +-#else +- mvc_fast_memmove(env, TARGET_PAGE_SIZE, r1, r2); +-#endif +-} +- +-/* string copy (c is string terminator) */ +-void HELPER(mvst)(uint32_t c, uint32_t r1, uint32_t r2) +-{ +- uint64_t dest = get_address_31fix(r1); +- uint64_t src = get_address_31fix(r2); +- uint8_t v; +- +- c = c & 0xff; +-#ifdef CONFIG_USER_ONLY +- if (!c) { +- HELPER_LOG("%s: copy '%s' to 0x%lx\n", __func__, (char *)g2h(src), +- dest); +- } +-#endif +- for (;;) { +- v = ldub(src); +- stb(dest, v); +- if (v == c) { +- break; +- } +- src++; +- dest++; +- } +- env->regs[r1] = dest; /* FIXME: 31-bit mode! */ +-} +- +-/* compare and swap 64-bit */ +-uint32_t HELPER(csg)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- /* FIXME: locking? */ +- uint32_t cc; +- uint64_t v2 = ldq(a2); +- +- if (env->regs[r1] == v2) { +- cc = 0; +- stq(a2, env->regs[r3]); +- } else { +- cc = 1; +- env->regs[r1] = v2; +- } +- return cc; +-} +- +-/* compare double and swap 64-bit */ +-uint32_t HELPER(cdsg)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- /* FIXME: locking? */ +- uint32_t cc; +- uint64_t v2_hi = ldq(a2); +- uint64_t v2_lo = ldq(a2 + 8); +- uint64_t v1_hi = env->regs[r1]; +- uint64_t v1_lo = env->regs[r1 + 1]; +- +- if ((v1_hi == v2_hi) && (v1_lo == v2_lo)) { +- cc = 0; +- stq(a2, env->regs[r3]); +- stq(a2 + 8, env->regs[r3 + 1]); +- } else { +- cc = 1; +- env->regs[r1] = v2_hi; +- env->regs[r1 + 1] = v2_lo; +- } +- +- return cc; +-} +- +-/* compare and swap 32-bit */ +-uint32_t HELPER(cs)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- /* FIXME: locking? */ +- uint32_t cc; +- uint32_t v2 = ldl(a2); +- +- HELPER_LOG("%s: r1 %d a2 0x%lx r3 %d\n", __func__, r1, a2, r3); +- if (((uint32_t)env->regs[r1]) == v2) { +- cc = 0; +- stl(a2, (uint32_t)env->regs[r3]); +- } else { +- cc = 1; +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | v2; +- } +- return cc; +-} +- +-static uint32_t helper_icm(uint32_t r1, uint64_t address, uint32_t mask) +-{ +- int pos = 24; /* top of the lower half of r1 */ +- uint64_t rmask = 0xff000000ULL; +- uint8_t val = 0; +- int ccd = 0; +- uint32_t cc = 0; +- +- while (mask) { +- if (mask & 8) { +- env->regs[r1] &= ~rmask; +- val = ldub(address); +- if ((val & 0x80) && !ccd) { +- cc = 1; +- } +- ccd = 1; +- if (val && cc == 0) { +- cc = 2; +- } +- env->regs[r1] |= (uint64_t)val << pos; +- address++; +- } +- mask = (mask << 1) & 0xf; +- pos -= 8; +- rmask >>= 8; +- } +- +- return cc; +-} +- +-/* execute instruction +- this instruction executes an insn modified with the contents of r1 +- it does not change the executed instruction in memory +- it does not change the program counter +- in other words: tricky... +- currently implemented by interpreting the cases it is most commonly used in +-*/ +-uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) +-{ +- uint16_t insn = lduw_code(addr); +- +- HELPER_LOG("%s: v1 0x%lx addr 0x%lx insn 0x%x\n", __func__, v1, addr, +- insn); +- if ((insn & 0xf0ff) == 0xd000) { +- uint32_t l, insn2, b1, b2, d1, d2; +- +- l = v1 & 0xff; +- insn2 = ldl_code(addr + 2); +- b1 = (insn2 >> 28) & 0xf; +- b2 = (insn2 >> 12) & 0xf; +- d1 = (insn2 >> 16) & 0xfff; +- d2 = insn2 & 0xfff; +- switch (insn & 0xf00) { +- case 0x200: +- helper_mvc(l, get_address(0, b1, d1), get_address(0, b2, d2)); +- break; +- case 0x500: +- cc = helper_clc(l, get_address(0, b1, d1), get_address(0, b2, d2)); +- break; +- case 0x700: +- cc = helper_xc(l, get_address(0, b1, d1), get_address(0, b2, d2)); +- break; +- case 0xc00: +- helper_tr(l, get_address(0, b1, d1), get_address(0, b2, d2)); +- break; +- default: +- goto abort; +- break; +- } +- } else if ((insn & 0xff00) == 0x0a00) { +- /* supervisor call */ +- HELPER_LOG("%s: svc %ld via execute\n", __func__, (insn | v1) & 0xff); +- env->psw.addr = ret - 4; +- env->int_svc_code = (insn | v1) & 0xff; +- env->int_svc_ilc = 4; +- helper_exception(EXCP_SVC); +- } else if ((insn & 0xff00) == 0xbf00) { +- uint32_t insn2, r1, r3, b2, d2; +- +- insn2 = ldl_code(addr + 2); +- r1 = (insn2 >> 20) & 0xf; +- r3 = (insn2 >> 16) & 0xf; +- b2 = (insn2 >> 12) & 0xf; +- d2 = insn2 & 0xfff; +- cc = helper_icm(r1, get_address(0, b2, d2), r3); +- } else { +- abort: +- cpu_abort(env, "EXECUTE on instruction prefix 0x%x not implemented\n", +- insn); +- } +- return cc; +-} +- +-/* store character under mask high operates on the upper half of r1 */ +-void HELPER(stcmh)(uint32_t r1, uint64_t address, uint32_t mask) +-{ +- int pos = 56; /* top of the upper half of r1 */ +- +- while (mask) { +- if (mask & 8) { +- stb(address, (env->regs[r1] >> pos) & 0xff); +- address++; +- } +- mask = (mask << 1) & 0xf; +- pos -= 8; +- } +-} +- +-/* insert character under mask high; same as icm, but operates on the +- upper half of r1 */ +-uint32_t HELPER(icmh)(uint32_t r1, uint64_t address, uint32_t mask) +-{ +- int pos = 56; /* top of the upper half of r1 */ +- uint64_t rmask = 0xff00000000000000ULL; +- uint8_t val = 0; +- int ccd = 0; +- uint32_t cc = 0; +- +- while (mask) { +- if (mask & 8) { +- env->regs[r1] &= ~rmask; +- val = ldub(address); +- if ((val & 0x80) && !ccd) { +- cc = 1; +- } +- ccd = 1; +- if (val && cc == 0) { +- cc = 2; +- } +- env->regs[r1] |= (uint64_t)val << pos; +- address++; +- } +- mask = (mask << 1) & 0xf; +- pos -= 8; +- rmask >>= 8; +- } +- +- return cc; +-} +- +-/* load access registers r1 to r3 from memory at a2 */ +-void HELPER(lam)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- int i; +- +- for (i = r1;; i = (i + 1) % 16) { +- env->aregs[i] = ldl(a2); +- a2 += 4; +- +- if (i == r3) { +- break; +- } +- } +-} +- +-/* store access registers r1 to r3 in memory at a2 */ +-void HELPER(stam)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- int i; +- +- for (i = r1;; i = (i + 1) % 16) { +- stl(a2, env->aregs[i]); +- a2 += 4; +- +- if (i == r3) { +- break; +- } +- } +-} +- +-/* move long */ +-uint32_t HELPER(mvcl)(uint32_t r1, uint32_t r2) +-{ +- uint64_t destlen = env->regs[r1 + 1] & 0xffffff; +- uint64_t dest = get_address_31fix(r1); +- uint64_t srclen = env->regs[r2 + 1] & 0xffffff; +- uint64_t src = get_address_31fix(r2); +- uint8_t pad = src >> 24; +- uint8_t v; +- uint32_t cc; +- +- if (destlen == srclen) { +- cc = 0; +- } else if (destlen < srclen) { +- cc = 1; +- } else { +- cc = 2; +- } +- +- if (srclen > destlen) { +- srclen = destlen; +- } +- +- for (; destlen && srclen; src++, dest++, destlen--, srclen--) { +- v = ldub(src); +- stb(dest, v); +- } +- +- for (; destlen; dest++, destlen--) { +- stb(dest, pad); +- } +- +- env->regs[r1 + 1] = destlen; +- /* can't use srclen here, we trunc'ed it */ +- env->regs[r2 + 1] -= src - env->regs[r2]; +- env->regs[r1] = dest; +- env->regs[r2] = src; +- +- return cc; +-} +- +-/* move long extended another memcopy insn with more bells and whistles */ +-uint32_t HELPER(mvcle)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- uint64_t destlen = env->regs[r1 + 1]; +- uint64_t dest = env->regs[r1]; +- uint64_t srclen = env->regs[r3 + 1]; +- uint64_t src = env->regs[r3]; +- uint8_t pad = a2 & 0xff; +- uint8_t v; +- uint32_t cc; +- +- if (!(env->psw.mask & PSW_MASK_64)) { +- destlen = (uint32_t)destlen; +- srclen = (uint32_t)srclen; +- dest &= 0x7fffffff; +- src &= 0x7fffffff; +- } +- +- if (destlen == srclen) { +- cc = 0; +- } else if (destlen < srclen) { +- cc = 1; +- } else { +- cc = 2; +- } +- +- if (srclen > destlen) { +- srclen = destlen; +- } +- +- for (; destlen && srclen; src++, dest++, destlen--, srclen--) { +- v = ldub(src); +- stb(dest, v); +- } +- +- for (; destlen; dest++, destlen--) { +- stb(dest, pad); +- } +- +- env->regs[r1 + 1] = destlen; +- /* can't use srclen here, we trunc'ed it */ +- /* FIXME: 31-bit mode! */ +- env->regs[r3 + 1] -= src - env->regs[r3]; +- env->regs[r1] = dest; +- env->regs[r3] = src; +- +- return cc; +-} +- +-/* compare logical long extended memcompare insn with padding */ +-uint32_t HELPER(clcle)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- uint64_t destlen = env->regs[r1 + 1]; +- uint64_t dest = get_address_31fix(r1); +- uint64_t srclen = env->regs[r3 + 1]; +- uint64_t src = get_address_31fix(r3); +- uint8_t pad = a2 & 0xff; +- uint8_t v1 = 0, v2 = 0; +- uint32_t cc = 0; +- +- if (!(destlen || srclen)) { +- return cc; +- } +- +- if (srclen > destlen) { +- srclen = destlen; +- } +- +- for (; destlen || srclen; src++, dest++, destlen--, srclen--) { +- v1 = srclen ? ldub(src) : pad; +- v2 = destlen ? ldub(dest) : pad; +- if (v1 != v2) { +- cc = (v1 < v2) ? 1 : 2; +- break; +- } +- } +- +- env->regs[r1 + 1] = destlen; +- /* can't use srclen here, we trunc'ed it */ +- env->regs[r3 + 1] -= src - env->regs[r3]; +- env->regs[r1] = dest; +- env->regs[r3] = src; +- +- return cc; +-} +- +-/* checksum */ +-void HELPER(cksm)(uint32_t r1, uint32_t r2) +-{ +- uint64_t src = get_address_31fix(r2); +- uint64_t src_len = env->regs[(r2 + 1) & 15]; +- uint64_t cksm = (uint32_t)env->regs[r1]; +- +- while (src_len >= 4) { +- cksm += ldl(src); +- +- /* move to next word */ +- src_len -= 4; +- src += 4; +- } +- +- switch (src_len) { +- case 0: +- break; +- case 1: +- cksm += ldub(src) << 24; +- break; +- case 2: +- cksm += lduw(src) << 16; +- break; +- case 3: +- cksm += lduw(src) << 16; +- cksm += ldub(src + 2) << 8; +- break; +- } +- +- /* indicate we've processed everything */ +- env->regs[r2] = src + src_len; +- env->regs[(r2 + 1) & 15] = 0; +- +- /* store result */ +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- ((uint32_t)cksm + (cksm >> 32)); +-} +- +-void HELPER(unpk)(uint32_t len, uint64_t dest, uint64_t src) +-{ +- int len_dest = len >> 4; +- int len_src = len & 0xf; +- uint8_t b; +- int second_nibble = 0; +- +- dest += len_dest; +- src += len_src; +- +- /* last byte is special, it only flips the nibbles */ +- b = ldub(src); +- stb(dest, (b << 4) | (b >> 4)); +- src--; +- len_src--; +- +- /* now pad every nibble with 0xf0 */ +- +- while (len_dest > 0) { +- uint8_t cur_byte = 0; +- +- if (len_src > 0) { +- cur_byte = ldub(src); +- } +- +- len_dest--; +- dest--; +- +- /* only advance one nibble at a time */ +- if (second_nibble) { +- cur_byte >>= 4; +- len_src--; +- src--; +- } +- second_nibble = !second_nibble; +- +- /* digit */ +- cur_byte = (cur_byte & 0xf); +- /* zone bits */ +- cur_byte |= 0xf0; +- +- stb(dest, cur_byte); +- } +-} +- +-void HELPER(tr)(uint32_t len, uint64_t array, uint64_t trans) +-{ +- int i; +- +- for (i = 0; i <= len; i++) { +- uint8_t byte = ldub(array + i); +- uint8_t new_byte = ldub(trans + byte); +- +- stb(array + i, new_byte); +- } +-} +- +-#ifndef CONFIG_USER_ONLY + void program_interrupt(CPUS390XState *env, uint32_t code, int ilc) + { + qemu_log("program interrupt at %#" PRIx64 "\n", env->psw.addr); +@@ -1267,206 +384,6 @@ uint32_t HELPER(stsi)(uint64_t a0, uint32_t r0, uint32_t r1) + return cc; + } + +-void HELPER(lctlg)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- int i; +- uint64_t src = a2; +- +- for (i = r1;; i = (i + 1) % 16) { +- env->cregs[i] = ldq(src); +- HELPER_LOG("load ctl %d from 0x%" PRIx64 " == 0x%" PRIx64 "\n", +- i, src, env->cregs[i]); +- src += sizeof(uint64_t); +- +- if (i == r3) { +- break; +- } +- } +- +- tlb_flush(env, 1); +-} +- +-void HELPER(lctl)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- int i; +- uint64_t src = a2; +- +- for (i = r1;; i = (i + 1) % 16) { +- env->cregs[i] = (env->cregs[i] & 0xFFFFFFFF00000000ULL) | ldl(src); +- src += sizeof(uint32_t); +- +- if (i == r3) { +- break; +- } +- } +- +- tlb_flush(env, 1); +-} +- +-void HELPER(stctg)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- int i; +- uint64_t dest = a2; +- +- for (i = r1;; i = (i + 1) % 16) { +- stq(dest, env->cregs[i]); +- dest += sizeof(uint64_t); +- +- if (i == r3) { +- break; +- } +- } +-} +- +-void HELPER(stctl)(uint32_t r1, uint64_t a2, uint32_t r3) +-{ +- int i; +- uint64_t dest = a2; +- +- for (i = r1;; i = (i + 1) % 16) { +- stl(dest, env->cregs[i]); +- dest += sizeof(uint32_t); +- +- if (i == r3) { +- break; +- } +- } +-} +- +-uint32_t HELPER(tprot)(uint64_t a1, uint64_t a2) +-{ +- /* XXX implement */ +- +- return 0; +-} +- +-/* insert storage key extended */ +-uint64_t HELPER(iske)(uint64_t r2) +-{ +- uint64_t addr = get_address(0, 0, r2); +- +- if (addr > ram_size) { +- return 0; +- } +- +- return env->storage_keys[addr / TARGET_PAGE_SIZE]; +-} +- +-/* set storage key extended */ +-void HELPER(sske)(uint32_t r1, uint64_t r2) +-{ +- uint64_t addr = get_address(0, 0, r2); +- +- if (addr > ram_size) { +- return; +- } +- +- env->storage_keys[addr / TARGET_PAGE_SIZE] = r1; +-} +- +-/* reset reference bit extended */ +-uint32_t HELPER(rrbe)(uint32_t r1, uint64_t r2) +-{ +- uint8_t re; +- uint8_t key; +- +- if (r2 > ram_size) { +- return 0; +- } +- +- key = env->storage_keys[r2 / TARGET_PAGE_SIZE]; +- re = key & (SK_R | SK_C); +- env->storage_keys[r2 / TARGET_PAGE_SIZE] = (key & ~SK_R); +- +- /* +- * cc +- * +- * 0 Reference bit zero; change bit zero +- * 1 Reference bit zero; change bit one +- * 2 Reference bit one; change bit zero +- * 3 Reference bit one; change bit one +- */ +- +- return re >> 1; +-} +- +-/* compare and swap and purge */ +-uint32_t HELPER(csp)(uint32_t r1, uint32_t r2) +-{ +- uint32_t cc; +- uint32_t o1 = env->regs[r1]; +- uint64_t a2 = get_address_31fix(r2) & ~3ULL; +- uint32_t o2 = ldl(a2); +- +- if (o1 == o2) { +- stl(a2, env->regs[(r1 + 1) & 15]); +- if (env->regs[r2] & 0x3) { +- /* flush TLB / ALB */ +- tlb_flush(env, 1); +- } +- cc = 0; +- } else { +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | o2; +- cc = 1; +- } +- +- return cc; +-} +- +-static uint32_t mvc_asc(int64_t l, uint64_t a1, uint64_t mode1, uint64_t a2, +- uint64_t mode2) +-{ +- target_ulong src, dest; +- int flags, cc = 0, i; +- +- if (!l) { +- return 0; +- } else if (l > 256) { +- /* max 256 */ +- l = 256; +- cc = 3; +- } +- +- if (mmu_translate(env, a1 & TARGET_PAGE_MASK, 1, mode1, &dest, &flags)) { +- cpu_loop_exit(env); +- } +- dest |= a1 & ~TARGET_PAGE_MASK; +- +- if (mmu_translate(env, a2 & TARGET_PAGE_MASK, 0, mode2, &src, &flags)) { +- cpu_loop_exit(env); +- } +- src |= a2 & ~TARGET_PAGE_MASK; +- +- /* XXX replace w/ memcpy */ +- for (i = 0; i < l; i++) { +- /* XXX be more clever */ +- if ((((dest + i) & TARGET_PAGE_MASK) != (dest & TARGET_PAGE_MASK)) || +- (((src + i) & TARGET_PAGE_MASK) != (src & TARGET_PAGE_MASK))) { +- mvc_asc(l - i, a1 + i, mode1, a2 + i, mode2); +- break; +- } +- stb_phys(dest + i, ldub_phys(src + i)); +- } +- +- return cc; +-} +- +-uint32_t HELPER(mvcs)(uint64_t l, uint64_t a1, uint64_t a2) +-{ +- HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n", +- __func__, l, a1, a2); +- +- return mvc_asc(l, a1, PSW_ASC_SECONDARY, a2, PSW_ASC_PRIMARY); +-} +- +-uint32_t HELPER(mvcp)(uint64_t l, uint64_t a1, uint64_t a2) +-{ +- HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n", +- __func__, l, a1, a2); +- +- return mvc_asc(l, a1, PSW_ASC_PRIMARY, a2, PSW_ASC_SECONDARY); +-} +- + uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) + { + int cc = 0; +@@ -1508,78 +425,4 @@ uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) + + return cc; + } +- +-/* invalidate pte */ +-void HELPER(ipte)(uint64_t pte_addr, uint64_t vaddr) +-{ +- uint64_t page = vaddr & TARGET_PAGE_MASK; +- uint64_t pte = 0; +- +- /* XXX broadcast to other CPUs */ +- +- /* XXX Linux is nice enough to give us the exact pte address. +- According to spec we'd have to find it out ourselves */ +- /* XXX Linux is fine with overwriting the pte, the spec requires +- us to only set the invalid bit */ +- stq_phys(pte_addr, pte | _PAGE_INVALID); +- +- /* XXX we exploit the fact that Linux passes the exact virtual +- address here - it's not obliged to! */ +- tlb_flush_page(env, page); +- +- /* XXX 31-bit hack */ +- if (page & 0x80000000) { +- tlb_flush_page(env, page & ~0x80000000); +- } else { +- tlb_flush_page(env, page | 0x80000000); +- } +-} +- +-/* flush local tlb */ +-void HELPER(ptlb)(void) +-{ +- tlb_flush(env, 1); +-} +- +-/* store using real address */ +-void HELPER(stura)(uint64_t addr, uint32_t v1) +-{ +- stw_phys(get_address(0, 0, addr), v1); +-} +- +-/* load real address */ +-uint32_t HELPER(lra)(uint64_t addr, uint32_t r1) +-{ +- uint32_t cc = 0; +- int old_exc = env->exception_index; +- uint64_t asc = env->psw.mask & PSW_MASK_ASC; +- uint64_t ret; +- int flags; +- +- /* XXX incomplete - has more corner cases */ +- if (!(env->psw.mask & PSW_MASK_64) && (addr >> 32)) { +- program_interrupt(env, PGM_SPECIAL_OP, 2); +- } +- +- env->exception_index = old_exc; +- if (mmu_translate(env, addr, 0, asc, &ret, &flags)) { +- cc = 3; +- } +- if (env->exception_index == EXCP_PGM) { +- ret = env->int_pgm_code | 0x80000000; +- } else { +- ret |= addr & ~TARGET_PAGE_MASK; +- } +- env->exception_index = old_exc; +- +- if (!(env->psw.mask & PSW_MASK_64)) { +- env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | +- (ret & 0xffffffffULL); +- } else { +- env->regs[r1] = ret; +- } +- +- return cc; +-} +- + #endif +-- +1.7.12.1 + diff --git a/0010-target-s390x-rename-op_helper.c-to-misc_helper.c.patch b/0010-target-s390x-rename-op_helper.c-to-misc_helper.c.patch new file mode 100644 index 0000000..e96aa52 --- /dev/null +++ b/0010-target-s390x-rename-op_helper.c-to-misc_helper.c.patch @@ -0,0 +1,924 @@ +From 56018228deac6e704a7ec8befd9e9dc69f2fe73f Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:35 +0000 +Subject: [PATCH] target-s390x: rename op_helper.c to misc_helper.c + +Now op_helper.c contains miscellaneous helpers, rename +it to misc_helper.c. + +Signed-off-by: Blue Swirl +[agraf: fix conflict] +Signed-off-by: Alexander Graf + +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 6 +- + target-s390x/cpu.h | 2 +- + target-s390x/misc_helper.c | 428 +++++++++++++++++++++++++++++++++++++++++++++ + target-s390x/op_helper.c | 428 --------------------------------------------- + 4 files changed, 432 insertions(+), 432 deletions(-) + create mode 100644 target-s390x/misc_helper.c + delete mode 100644 target-s390x/op_helper.c + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index b9b3061..a87d26f 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -1,10 +1,10 @@ +-obj-y += translate.o op_helper.o helper.o cpu.o interrupt.o +-obj-y += int_helper.o fpu_helper.o cc_helper.o mem_helper.o ++obj-y += translate.o helper.o cpu.o interrupt.o ++obj-y += int_helper.o fpu_helper.o cc_helper.o mem_helper.o misc_helper.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/int_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/fpu_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/cc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/mem_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) ++$(obj)/misc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h +index 97fde5e..0ccb551 100644 +--- a/target-s390x/cpu.h ++++ b/target-s390x/cpu.h +@@ -1005,7 +1005,7 @@ uint32_t set_cc_f64(float64 v1, float64 v2); + uint32_t set_cc_nz_f32(float32 v); + uint32_t set_cc_nz_f64(float64 v); + +-/* op_helper.c */ ++/* misc_helper.c */ + void program_interrupt(CPUS390XState *env, uint32_t code, int ilc); + + #endif +diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c +new file mode 100644 +index 0000000..1d5137f +--- /dev/null ++++ b/target-s390x/misc_helper.c +@@ -0,0 +1,428 @@ ++/* ++ * S/390 misc helper routines ++ * ++ * Copyright (c) 2009 Ulrich Hecht ++ * Copyright (c) 2009 Alexander Graf ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, see . ++ */ ++ ++#include "cpu.h" ++#include "memory.h" ++#include "cputlb.h" ++#include "dyngen-exec.h" ++#include "host-utils.h" ++#include "helper.h" ++#include ++#include "kvm.h" ++#include "qemu-timer.h" ++#ifdef CONFIG_KVM ++#include ++#endif ++ ++#if !defined(CONFIG_USER_ONLY) ++#include "softmmu_exec.h" ++#include "sysemu.h" ++#endif ++ ++/* #define DEBUG_HELPER */ ++#ifdef DEBUG_HELPER ++#define HELPER_LOG(x...) qemu_log(x) ++#else ++#define HELPER_LOG(x...) ++#endif ++ ++/* raise an exception */ ++void HELPER(exception)(uint32_t excp) ++{ ++ HELPER_LOG("%s: exception %d\n", __func__, excp); ++ env->exception_index = excp; ++ cpu_loop_exit(env); ++} ++ ++#ifndef CONFIG_USER_ONLY ++void program_interrupt(CPUS390XState *env, uint32_t code, int ilc) ++{ ++ qemu_log("program interrupt at %#" PRIx64 "\n", env->psw.addr); ++ ++ if (kvm_enabled()) { ++#ifdef CONFIG_KVM ++ kvm_s390_interrupt(env, KVM_S390_PROGRAM_INT, code); ++#endif ++ } else { ++ env->int_pgm_code = code; ++ env->int_pgm_ilc = ilc; ++ env->exception_index = EXCP_PGM; ++ cpu_loop_exit(env); ++ } ++} ++ ++/* ++ * ret < 0 indicates program check, ret = 0, 1, 2, 3 -> cc ++ */ ++int sclp_service_call(CPUS390XState *env, uint32_t sccb, uint64_t code) ++{ ++ int r = 0; ++ int shift = 0; ++ ++#ifdef DEBUG_HELPER ++ printf("sclp(0x%x, 0x%" PRIx64 ")\n", sccb, code); ++#endif ++ ++ /* basic checks */ ++ if (!memory_region_is_ram(phys_page_find(sccb >> TARGET_PAGE_BITS)->mr)) { ++ return -PGM_ADDRESSING; ++ } ++ if (sccb & ~0x7ffffff8ul) { ++ return -PGM_SPECIFICATION; ++ } ++ ++ switch (code) { ++ case SCLP_CMDW_READ_SCP_INFO: ++ case SCLP_CMDW_READ_SCP_INFO_FORCED: ++ while ((ram_size >> (20 + shift)) > 65535) { ++ shift++; ++ } ++ stw_phys(sccb + SCP_MEM_CODE, ram_size >> (20 + shift)); ++ stb_phys(sccb + SCP_INCREMENT, 1 << shift); ++ stw_phys(sccb + SCP_RESPONSE_CODE, 0x10); ++ ++ s390_sclp_extint(sccb & ~3); ++ break; ++ default: ++#ifdef DEBUG_HELPER ++ printf("KVM: invalid sclp call 0x%x / 0x%" PRIx64 "x\n", sccb, code); ++#endif ++ r = 3; ++ break; ++ } ++ ++ return r; ++} ++ ++/* SCLP service call */ ++uint32_t HELPER(servc)(uint32_t r1, uint64_t r2) ++{ ++ int r; ++ ++ r = sclp_service_call(env, r1, r2); ++ if (r < 0) { ++ program_interrupt(env, -r, 4); ++ return 0; ++ } ++ return r; ++} ++ ++/* DIAG */ ++uint64_t HELPER(diag)(uint32_t num, uint64_t mem, uint64_t code) ++{ ++ uint64_t r; ++ ++ switch (num) { ++ case 0x500: ++ /* KVM hypercall */ ++ r = s390_virtio_hypercall(env, mem, code); ++ break; ++ case 0x44: ++ /* yield */ ++ r = 0; ++ break; ++ case 0x308: ++ /* ipl */ ++ r = 0; ++ break; ++ default: ++ r = -1; ++ break; ++ } ++ ++ if (r) { ++ program_interrupt(env, PGM_OPERATION, ILC_LATER_INC); ++ } ++ ++ return r; ++} ++ ++/* Store CPU ID */ ++void HELPER(stidp)(uint64_t a1) ++{ ++ stq(a1, env->cpu_num); ++} ++ ++/* Set Prefix */ ++void HELPER(spx)(uint64_t a1) ++{ ++ uint32_t prefix; ++ ++ prefix = ldl(a1); ++ env->psa = prefix & 0xfffff000; ++ qemu_log("prefix: %#x\n", prefix); ++ tlb_flush_page(env, 0); ++ tlb_flush_page(env, TARGET_PAGE_SIZE); ++} ++ ++/* Set Clock */ ++uint32_t HELPER(sck)(uint64_t a1) ++{ ++ /* XXX not implemented - is it necessary? */ ++ ++ return 0; ++} ++ ++static inline uint64_t clock_value(CPUS390XState *env) ++{ ++ uint64_t time; ++ ++ time = env->tod_offset + ++ time2tod(qemu_get_clock_ns(vm_clock) - env->tod_basetime); ++ ++ return time; ++} ++ ++/* Store Clock */ ++uint32_t HELPER(stck)(uint64_t a1) ++{ ++ stq(a1, clock_value(env)); ++ ++ return 0; ++} ++ ++/* Store Clock Extended */ ++uint32_t HELPER(stcke)(uint64_t a1) ++{ ++ stb(a1, 0); ++ /* basically the same value as stck */ ++ stq(a1 + 1, clock_value(env) | env->cpu_num); ++ /* more fine grained than stck */ ++ stq(a1 + 9, 0); ++ /* XXX programmable fields */ ++ stw(a1 + 17, 0); ++ ++ return 0; ++} ++ ++/* Set Clock Comparator */ ++void HELPER(sckc)(uint64_t a1) ++{ ++ uint64_t time = ldq(a1); ++ ++ if (time == -1ULL) { ++ return; ++ } ++ ++ /* difference between now and then */ ++ time -= clock_value(env); ++ /* nanoseconds */ ++ time = (time * 125) >> 9; ++ ++ qemu_mod_timer(env->tod_timer, qemu_get_clock_ns(vm_clock) + time); ++} ++ ++/* Store Clock Comparator */ ++void HELPER(stckc)(uint64_t a1) ++{ ++ /* XXX implement */ ++ stq(a1, 0); ++} ++ ++/* Set CPU Timer */ ++void HELPER(spt)(uint64_t a1) ++{ ++ uint64_t time = ldq(a1); ++ ++ if (time == -1ULL) { ++ return; ++ } ++ ++ /* nanoseconds */ ++ time = (time * 125) >> 9; ++ ++ qemu_mod_timer(env->cpu_timer, qemu_get_clock_ns(vm_clock) + time); ++} ++ ++/* Store CPU Timer */ ++void HELPER(stpt)(uint64_t a1) ++{ ++ /* XXX implement */ ++ stq(a1, 0); ++} ++ ++/* Store System Information */ ++uint32_t HELPER(stsi)(uint64_t a0, uint32_t r0, uint32_t r1) ++{ ++ int cc = 0; ++ int sel1, sel2; ++ ++ if ((r0 & STSI_LEVEL_MASK) <= STSI_LEVEL_3 && ++ ((r0 & STSI_R0_RESERVED_MASK) || (r1 & STSI_R1_RESERVED_MASK))) { ++ /* valid function code, invalid reserved bits */ ++ program_interrupt(env, PGM_SPECIFICATION, 2); ++ } ++ ++ sel1 = r0 & STSI_R0_SEL1_MASK; ++ sel2 = r1 & STSI_R1_SEL2_MASK; ++ ++ /* XXX: spec exception if sysib is not 4k-aligned */ ++ ++ switch (r0 & STSI_LEVEL_MASK) { ++ case STSI_LEVEL_1: ++ if ((sel1 == 1) && (sel2 == 1)) { ++ /* Basic Machine Configuration */ ++ struct sysib_111 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ ebcdic_put(sysib.manuf, "QEMU ", 16); ++ /* same as machine type number in STORE CPU ID */ ++ ebcdic_put(sysib.type, "QEMU", 4); ++ /* same as model number in STORE CPU ID */ ++ ebcdic_put(sysib.model, "QEMU ", 16); ++ ebcdic_put(sysib.sequence, "QEMU ", 16); ++ ebcdic_put(sysib.plant, "QEMU", 4); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else if ((sel1 == 2) && (sel2 == 1)) { ++ /* Basic Machine CPU */ ++ struct sysib_121 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ /* XXX make different for different CPUs? */ ++ ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16); ++ ebcdic_put(sysib.plant, "QEMU", 4); ++ stw_p(&sysib.cpu_addr, env->cpu_num); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else if ((sel1 == 2) && (sel2 == 2)) { ++ /* Basic Machine CPUs */ ++ struct sysib_122 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ stl_p(&sysib.capability, 0x443afc29); ++ /* XXX change when SMP comes */ ++ stw_p(&sysib.total_cpus, 1); ++ stw_p(&sysib.active_cpus, 1); ++ stw_p(&sysib.standby_cpus, 0); ++ stw_p(&sysib.reserved_cpus, 0); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else { ++ cc = 3; ++ } ++ break; ++ case STSI_LEVEL_2: ++ { ++ if ((sel1 == 2) && (sel2 == 1)) { ++ /* LPAR CPU */ ++ struct sysib_221 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ /* XXX make different for different CPUs? */ ++ ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16); ++ ebcdic_put(sysib.plant, "QEMU", 4); ++ stw_p(&sysib.cpu_addr, env->cpu_num); ++ stw_p(&sysib.cpu_id, 0); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else if ((sel1 == 2) && (sel2 == 2)) { ++ /* LPAR CPUs */ ++ struct sysib_222 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ stw_p(&sysib.lpar_num, 0); ++ sysib.lcpuc = 0; ++ /* XXX change when SMP comes */ ++ stw_p(&sysib.total_cpus, 1); ++ stw_p(&sysib.conf_cpus, 1); ++ stw_p(&sysib.standby_cpus, 0); ++ stw_p(&sysib.reserved_cpus, 0); ++ ebcdic_put(sysib.name, "QEMU ", 8); ++ stl_p(&sysib.caf, 1000); ++ stw_p(&sysib.dedicated_cpus, 0); ++ stw_p(&sysib.shared_cpus, 0); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else { ++ cc = 3; ++ } ++ break; ++ } ++ case STSI_LEVEL_3: ++ { ++ if ((sel1 == 2) && (sel2 == 2)) { ++ /* VM CPUs */ ++ struct sysib_322 sysib; ++ ++ memset(&sysib, 0, sizeof(sysib)); ++ sysib.count = 1; ++ /* XXX change when SMP comes */ ++ stw_p(&sysib.vm[0].total_cpus, 1); ++ stw_p(&sysib.vm[0].conf_cpus, 1); ++ stw_p(&sysib.vm[0].standby_cpus, 0); ++ stw_p(&sysib.vm[0].reserved_cpus, 0); ++ ebcdic_put(sysib.vm[0].name, "KVMguest", 8); ++ stl_p(&sysib.vm[0].caf, 1000); ++ ebcdic_put(sysib.vm[0].cpi, "KVM/Linux ", 16); ++ cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); ++ } else { ++ cc = 3; ++ } ++ break; ++ } ++ case STSI_LEVEL_CURRENT: ++ env->regs[0] = STSI_LEVEL_3; ++ break; ++ default: ++ cc = 3; ++ break; ++ } ++ ++ return cc; ++} ++ ++uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) ++{ ++ int cc = 0; ++ ++ HELPER_LOG("%s: %016" PRIx64 " %08x %016" PRIx64 "\n", ++ __func__, order_code, r1, cpu_addr); ++ ++ /* Remember: Use "R1 or R1 + 1, whichever is the odd-numbered register" ++ as parameter (input). Status (output) is always R1. */ ++ ++ switch (order_code) { ++ case SIGP_SET_ARCH: ++ /* switch arch */ ++ break; ++ case SIGP_SENSE: ++ /* enumerate CPU status */ ++ if (cpu_addr) { ++ /* XXX implement when SMP comes */ ++ return 3; ++ } ++ env->regs[r1] &= 0xffffffff00000000ULL; ++ cc = 1; ++ break; ++#if !defined(CONFIG_USER_ONLY) ++ case SIGP_RESTART: ++ qemu_system_reset_request(); ++ cpu_loop_exit(env); ++ break; ++ case SIGP_STOP: ++ qemu_system_shutdown_request(); ++ cpu_loop_exit(env); ++ break; ++#endif ++ default: ++ /* unknown sigp */ ++ fprintf(stderr, "XXX unknown sigp: 0x%" PRIx64 "\n", order_code); ++ cc = 3; ++ } ++ ++ return cc; ++} ++#endif +diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c +deleted file mode 100644 +index bb8dbf5..0000000 +--- a/target-s390x/op_helper.c ++++ /dev/null +@@ -1,428 +0,0 @@ +-/* +- * S/390 helper routines +- * +- * Copyright (c) 2009 Ulrich Hecht +- * Copyright (c) 2009 Alexander Graf +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2 of the License, or (at your option) any later version. +- * +- * This library is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, see . +- */ +- +-#include "cpu.h" +-#include "memory.h" +-#include "cputlb.h" +-#include "dyngen-exec.h" +-#include "host-utils.h" +-#include "helper.h" +-#include +-#include "kvm.h" +-#include "qemu-timer.h" +-#ifdef CONFIG_KVM +-#include +-#endif +- +-#if !defined(CONFIG_USER_ONLY) +-#include "softmmu_exec.h" +-#include "sysemu.h" +-#endif +- +-/* #define DEBUG_HELPER */ +-#ifdef DEBUG_HELPER +-#define HELPER_LOG(x...) qemu_log(x) +-#else +-#define HELPER_LOG(x...) +-#endif +- +-/* raise an exception */ +-void HELPER(exception)(uint32_t excp) +-{ +- HELPER_LOG("%s: exception %d\n", __func__, excp); +- env->exception_index = excp; +- cpu_loop_exit(env); +-} +- +-#ifndef CONFIG_USER_ONLY +-void program_interrupt(CPUS390XState *env, uint32_t code, int ilc) +-{ +- qemu_log("program interrupt at %#" PRIx64 "\n", env->psw.addr); +- +- if (kvm_enabled()) { +-#ifdef CONFIG_KVM +- kvm_s390_interrupt(env, KVM_S390_PROGRAM_INT, code); +-#endif +- } else { +- env->int_pgm_code = code; +- env->int_pgm_ilc = ilc; +- env->exception_index = EXCP_PGM; +- cpu_loop_exit(env); +- } +-} +- +-/* +- * ret < 0 indicates program check, ret = 0, 1, 2, 3 -> cc +- */ +-int sclp_service_call(CPUS390XState *env, uint32_t sccb, uint64_t code) +-{ +- int r = 0; +- int shift = 0; +- +-#ifdef DEBUG_HELPER +- printf("sclp(0x%x, 0x%" PRIx64 ")\n", sccb, code); +-#endif +- +- /* basic checks */ +- if (!memory_region_is_ram(phys_page_find(sccb >> TARGET_PAGE_BITS)->mr)) { +- return -PGM_ADDRESSING; +- } +- if (sccb & ~0x7ffffff8ul) { +- return -PGM_SPECIFICATION; +- } +- +- switch (code) { +- case SCLP_CMDW_READ_SCP_INFO: +- case SCLP_CMDW_READ_SCP_INFO_FORCED: +- while ((ram_size >> (20 + shift)) > 65535) { +- shift++; +- } +- stw_phys(sccb + SCP_MEM_CODE, ram_size >> (20 + shift)); +- stb_phys(sccb + SCP_INCREMENT, 1 << shift); +- stw_phys(sccb + SCP_RESPONSE_CODE, 0x10); +- +- s390_sclp_extint(sccb & ~3); +- break; +- default: +-#ifdef DEBUG_HELPER +- printf("KVM: invalid sclp call 0x%x / 0x%" PRIx64 "x\n", sccb, code); +-#endif +- r = 3; +- break; +- } +- +- return r; +-} +- +-/* SCLP service call */ +-uint32_t HELPER(servc)(uint32_t r1, uint64_t r2) +-{ +- int r; +- +- r = sclp_service_call(env, r1, r2); +- if (r < 0) { +- program_interrupt(env, -r, 4); +- return 0; +- } +- return r; +-} +- +-/* DIAG */ +-uint64_t HELPER(diag)(uint32_t num, uint64_t mem, uint64_t code) +-{ +- uint64_t r; +- +- switch (num) { +- case 0x500: +- /* KVM hypercall */ +- r = s390_virtio_hypercall(env, mem, code); +- break; +- case 0x44: +- /* yield */ +- r = 0; +- break; +- case 0x308: +- /* ipl */ +- r = 0; +- break; +- default: +- r = -1; +- break; +- } +- +- if (r) { +- program_interrupt(env, PGM_OPERATION, ILC_LATER_INC); +- } +- +- return r; +-} +- +-/* Store CPU ID */ +-void HELPER(stidp)(uint64_t a1) +-{ +- stq(a1, env->cpu_num); +-} +- +-/* Set Prefix */ +-void HELPER(spx)(uint64_t a1) +-{ +- uint32_t prefix; +- +- prefix = ldl(a1); +- env->psa = prefix & 0xfffff000; +- qemu_log("prefix: %#x\n", prefix); +- tlb_flush_page(env, 0); +- tlb_flush_page(env, TARGET_PAGE_SIZE); +-} +- +-/* Set Clock */ +-uint32_t HELPER(sck)(uint64_t a1) +-{ +- /* XXX not implemented - is it necessary? */ +- +- return 0; +-} +- +-static inline uint64_t clock_value(CPUS390XState *env) +-{ +- uint64_t time; +- +- time = env->tod_offset + +- time2tod(qemu_get_clock_ns(vm_clock) - env->tod_basetime); +- +- return time; +-} +- +-/* Store Clock */ +-uint32_t HELPER(stck)(uint64_t a1) +-{ +- stq(a1, clock_value(env)); +- +- return 0; +-} +- +-/* Store Clock Extended */ +-uint32_t HELPER(stcke)(uint64_t a1) +-{ +- stb(a1, 0); +- /* basically the same value as stck */ +- stq(a1 + 1, clock_value(env) | env->cpu_num); +- /* more fine grained than stck */ +- stq(a1 + 9, 0); +- /* XXX programmable fields */ +- stw(a1 + 17, 0); +- +- return 0; +-} +- +-/* Set Clock Comparator */ +-void HELPER(sckc)(uint64_t a1) +-{ +- uint64_t time = ldq(a1); +- +- if (time == -1ULL) { +- return; +- } +- +- /* difference between now and then */ +- time -= clock_value(env); +- /* nanoseconds */ +- time = (time * 125) >> 9; +- +- qemu_mod_timer(env->tod_timer, qemu_get_clock_ns(vm_clock) + time); +-} +- +-/* Store Clock Comparator */ +-void HELPER(stckc)(uint64_t a1) +-{ +- /* XXX implement */ +- stq(a1, 0); +-} +- +-/* Set CPU Timer */ +-void HELPER(spt)(uint64_t a1) +-{ +- uint64_t time = ldq(a1); +- +- if (time == -1ULL) { +- return; +- } +- +- /* nanoseconds */ +- time = (time * 125) >> 9; +- +- qemu_mod_timer(env->cpu_timer, qemu_get_clock_ns(vm_clock) + time); +-} +- +-/* Store CPU Timer */ +-void HELPER(stpt)(uint64_t a1) +-{ +- /* XXX implement */ +- stq(a1, 0); +-} +- +-/* Store System Information */ +-uint32_t HELPER(stsi)(uint64_t a0, uint32_t r0, uint32_t r1) +-{ +- int cc = 0; +- int sel1, sel2; +- +- if ((r0 & STSI_LEVEL_MASK) <= STSI_LEVEL_3 && +- ((r0 & STSI_R0_RESERVED_MASK) || (r1 & STSI_R1_RESERVED_MASK))) { +- /* valid function code, invalid reserved bits */ +- program_interrupt(env, PGM_SPECIFICATION, 2); +- } +- +- sel1 = r0 & STSI_R0_SEL1_MASK; +- sel2 = r1 & STSI_R1_SEL2_MASK; +- +- /* XXX: spec exception if sysib is not 4k-aligned */ +- +- switch (r0 & STSI_LEVEL_MASK) { +- case STSI_LEVEL_1: +- if ((sel1 == 1) && (sel2 == 1)) { +- /* Basic Machine Configuration */ +- struct sysib_111 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- ebcdic_put(sysib.manuf, "QEMU ", 16); +- /* same as machine type number in STORE CPU ID */ +- ebcdic_put(sysib.type, "QEMU", 4); +- /* same as model number in STORE CPU ID */ +- ebcdic_put(sysib.model, "QEMU ", 16); +- ebcdic_put(sysib.sequence, "QEMU ", 16); +- ebcdic_put(sysib.plant, "QEMU", 4); +- cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); +- } else if ((sel1 == 2) && (sel2 == 1)) { +- /* Basic Machine CPU */ +- struct sysib_121 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- /* XXX make different for different CPUs? */ +- ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16); +- ebcdic_put(sysib.plant, "QEMU", 4); +- stw_p(&sysib.cpu_addr, env->cpu_num); +- cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); +- } else if ((sel1 == 2) && (sel2 == 2)) { +- /* Basic Machine CPUs */ +- struct sysib_122 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- stl_p(&sysib.capability, 0x443afc29); +- /* XXX change when SMP comes */ +- stw_p(&sysib.total_cpus, 1); +- stw_p(&sysib.active_cpus, 1); +- stw_p(&sysib.standby_cpus, 0); +- stw_p(&sysib.reserved_cpus, 0); +- cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); +- } else { +- cc = 3; +- } +- break; +- case STSI_LEVEL_2: +- { +- if ((sel1 == 2) && (sel2 == 1)) { +- /* LPAR CPU */ +- struct sysib_221 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- /* XXX make different for different CPUs? */ +- ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16); +- ebcdic_put(sysib.plant, "QEMU", 4); +- stw_p(&sysib.cpu_addr, env->cpu_num); +- stw_p(&sysib.cpu_id, 0); +- cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); +- } else if ((sel1 == 2) && (sel2 == 2)) { +- /* LPAR CPUs */ +- struct sysib_222 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- stw_p(&sysib.lpar_num, 0); +- sysib.lcpuc = 0; +- /* XXX change when SMP comes */ +- stw_p(&sysib.total_cpus, 1); +- stw_p(&sysib.conf_cpus, 1); +- stw_p(&sysib.standby_cpus, 0); +- stw_p(&sysib.reserved_cpus, 0); +- ebcdic_put(sysib.name, "QEMU ", 8); +- stl_p(&sysib.caf, 1000); +- stw_p(&sysib.dedicated_cpus, 0); +- stw_p(&sysib.shared_cpus, 0); +- cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); +- } else { +- cc = 3; +- } +- break; +- } +- case STSI_LEVEL_3: +- { +- if ((sel1 == 2) && (sel2 == 2)) { +- /* VM CPUs */ +- struct sysib_322 sysib; +- +- memset(&sysib, 0, sizeof(sysib)); +- sysib.count = 1; +- /* XXX change when SMP comes */ +- stw_p(&sysib.vm[0].total_cpus, 1); +- stw_p(&sysib.vm[0].conf_cpus, 1); +- stw_p(&sysib.vm[0].standby_cpus, 0); +- stw_p(&sysib.vm[0].reserved_cpus, 0); +- ebcdic_put(sysib.vm[0].name, "KVMguest", 8); +- stl_p(&sysib.vm[0].caf, 1000); +- ebcdic_put(sysib.vm[0].cpi, "KVM/Linux ", 16); +- cpu_physical_memory_rw(a0, (uint8_t *)&sysib, sizeof(sysib), 1); +- } else { +- cc = 3; +- } +- break; +- } +- case STSI_LEVEL_CURRENT: +- env->regs[0] = STSI_LEVEL_3; +- break; +- default: +- cc = 3; +- break; +- } +- +- return cc; +-} +- +-uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) +-{ +- int cc = 0; +- +- HELPER_LOG("%s: %016" PRIx64 " %08x %016" PRIx64 "\n", +- __func__, order_code, r1, cpu_addr); +- +- /* Remember: Use "R1 or R1 + 1, whichever is the odd-numbered register" +- as parameter (input). Status (output) is always R1. */ +- +- switch (order_code) { +- case SIGP_SET_ARCH: +- /* switch arch */ +- break; +- case SIGP_SENSE: +- /* enumerate CPU status */ +- if (cpu_addr) { +- /* XXX implement when SMP comes */ +- return 3; +- } +- env->regs[r1] &= 0xffffffff00000000ULL; +- cc = 1; +- break; +-#if !defined(CONFIG_USER_ONLY) +- case SIGP_RESTART: +- qemu_system_reset_request(); +- cpu_loop_exit(env); +- break; +- case SIGP_STOP: +- qemu_system_shutdown_request(); +- cpu_loop_exit(env); +- break; +-#endif +- default: +- /* unknown sigp */ +- fprintf(stderr, "XXX unknown sigp: 0x%" PRIx64 "\n", order_code); +- cc = 3; +- } +- +- return cc; +-} +-#endif +-- +1.7.12.1 + diff --git a/0011-target-s390x-avoid-AREG0-for-FPU-helpers.patch b/0011-target-s390x-avoid-AREG0-for-FPU-helpers.patch new file mode 100644 index 0000000..597face --- /dev/null +++ b/0011-target-s390x-avoid-AREG0-for-FPU-helpers.patch @@ -0,0 +1,1218 @@ +From 5d38110b1e23c963302f13f5917001a9298445a7 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:36 +0000 +Subject: [PATCH] target-s390x: avoid AREG0 for FPU helpers + +Make FPU helpers take a parameter for CPUState instead +of relying on global env. + +Introduce temporary wrappers for FPU load and store ops. + +Signed-off-by: Blue Swirl +Signed-off-by: Alexander Graf +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 1 - + target-s390x/cc_helper.c | 4 +- + target-s390x/cpu.h | 14 +++- + target-s390x/fpu_helper.c | 184 +++++++++++++++++++++++---------------------- + target-s390x/helper.h | 126 +++++++++++++++---------------- + target-s390x/mem_helper.c | 49 ++++++++++++ + target-s390x/translate.c | 70 ++++++++--------- + 7 files changed, 257 insertions(+), 191 deletions(-) + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index a87d26f..7d965e9 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -4,7 +4,6 @@ obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + + $(obj)/int_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +-$(obj)/fpu_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/cc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/mem_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/misc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/cc_helper.c b/target-s390x/cc_helper.c +index 2ac1659..9c3a2c4 100644 +--- a/target-s390x/cc_helper.c ++++ b/target-s390x/cc_helper.c +@@ -473,10 +473,10 @@ static inline uint32_t do_calc_cc(CPUS390XState *env, uint32_t cc_op, + break; + + case CC_OP_LTGT_F32: +- r = set_cc_f32(src, dst); ++ r = set_cc_f32(env, src, dst); + break; + case CC_OP_LTGT_F64: +- r = set_cc_f64(src, dst); ++ r = set_cc_f64(env, src, dst); + break; + case CC_OP_NZ_F32: + r = set_cc_nz_f32(dst); +diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h +index 0ccb551..9b7a2e3 100644 +--- a/target-s390x/cpu.h ++++ b/target-s390x/cpu.h +@@ -1000,12 +1000,22 @@ static inline void cpu_pc_from_tb(CPUS390XState *env, TranslationBlock* tb) + } + + /* fpu_helper.c */ +-uint32_t set_cc_f32(float32 v1, float32 v2); +-uint32_t set_cc_f64(float64 v1, float64 v2); ++uint32_t set_cc_f32(CPUS390XState *env, float32 v1, float32 v2); ++uint32_t set_cc_f64(CPUS390XState *env, float64 v1, float64 v2); + uint32_t set_cc_nz_f32(float32 v); + uint32_t set_cc_nz_f64(float64 v); + + /* misc_helper.c */ + void program_interrupt(CPUS390XState *env, uint32_t code, int ilc); + ++/* temporary wrappers */ ++uint32_t cpu_ldub_data(CPUS390XState *env, target_ulong ptr); ++uint32_t cpu_lduw_data(CPUS390XState *env, target_ulong ptr); ++uint32_t cpu_ldl_data(CPUS390XState *env, target_ulong ptr); ++uint64_t cpu_ldq_data(CPUS390XState *env, target_ulong ptr); ++ ++void cpu_stb_data(CPUS390XState *env, target_ulong ptr, uint32_t data); ++void cpu_stw_data(CPUS390XState *env, target_ulong ptr, uint32_t data); ++void cpu_stl_data(CPUS390XState *env, target_ulong ptr, uint32_t data); ++void cpu_stq_data(CPUS390XState *env, target_ulong ptr, uint64_t data); + #endif +diff --git a/target-s390x/fpu_helper.c b/target-s390x/fpu_helper.c +index 1389052..e235419 100644 +--- a/target-s390x/fpu_helper.c ++++ b/target-s390x/fpu_helper.c +@@ -19,10 +19,10 @@ + */ + + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helper.h" + +-#if !defined(CONFIG_USER_ONLY) ++/* temporarily disabled due to wrapper use */ ++#if 0 && !defined(CONFIG_USER_ONLY) + #include "softmmu_exec.h" + #endif + +@@ -33,7 +33,7 @@ + #define HELPER_LOG(x...) + #endif + +-static inline int float_comp_to_cc(int float_compare) ++static inline int float_comp_to_cc(CPUS390XState *env, int float_compare) + { + switch (float_compare) { + case float_relation_equal: +@@ -50,14 +50,16 @@ static inline int float_comp_to_cc(int float_compare) + } + + /* condition codes for binary FP ops */ +-uint32_t set_cc_f32(float32 v1, float32 v2) ++uint32_t set_cc_f32(CPUS390XState *env, float32 v1, float32 v2) + { +- return float_comp_to_cc(float32_compare_quiet(v1, v2, &env->fpu_status)); ++ return float_comp_to_cc(env, float32_compare_quiet(v1, v2, ++ &env->fpu_status)); + } + +-uint32_t set_cc_f64(float64 v1, float64 v2) ++uint32_t set_cc_f64(CPUS390XState *env, float64 v1, float64 v2) + { +- return float_comp_to_cc(float64_compare_quiet(v1, v2, &env->fpu_status)); ++ return float_comp_to_cc(env, float64_compare_quiet(v1, v2, ++ &env->fpu_status)); + } + + /* condition codes for unary FP ops */ +@@ -101,14 +103,14 @@ static uint32_t set_cc_nz_f128(float128 v) + } + + /* convert 32-bit int to 64-bit float */ +-void HELPER(cdfbr)(uint32_t f1, int32_t v2) ++void HELPER(cdfbr)(CPUS390XState *env, uint32_t f1, int32_t v2) + { + HELPER_LOG("%s: converting %d to f%d\n", __func__, v2, f1); + env->fregs[f1].d = int32_to_float64(v2, &env->fpu_status); + } + + /* convert 32-bit int to 128-bit float */ +-void HELPER(cxfbr)(uint32_t f1, int32_t v2) ++void HELPER(cxfbr)(CPUS390XState *env, uint32_t f1, int32_t v2) + { + CPU_QuadU v1; + +@@ -118,21 +120,21 @@ void HELPER(cxfbr)(uint32_t f1, int32_t v2) + } + + /* convert 64-bit int to 32-bit float */ +-void HELPER(cegbr)(uint32_t f1, int64_t v2) ++void HELPER(cegbr)(CPUS390XState *env, uint32_t f1, int64_t v2) + { + HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1); + env->fregs[f1].l.upper = int64_to_float32(v2, &env->fpu_status); + } + + /* convert 64-bit int to 64-bit float */ +-void HELPER(cdgbr)(uint32_t f1, int64_t v2) ++void HELPER(cdgbr)(CPUS390XState *env, uint32_t f1, int64_t v2) + { + HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1); + env->fregs[f1].d = int64_to_float64(v2, &env->fpu_status); + } + + /* convert 64-bit int to 128-bit float */ +-void HELPER(cxgbr)(uint32_t f1, int64_t v2) ++void HELPER(cxgbr)(CPUS390XState *env, uint32_t f1, int64_t v2) + { + CPU_QuadU x1; + +@@ -144,7 +146,7 @@ void HELPER(cxgbr)(uint32_t f1, int64_t v2) + } + + /* convert 32-bit int to 32-bit float */ +-void HELPER(cefbr)(uint32_t f1, int32_t v2) ++void HELPER(cefbr)(CPUS390XState *env, uint32_t f1, int32_t v2) + { + env->fregs[f1].l.upper = int32_to_float32(v2, &env->fpu_status); + HELPER_LOG("%s: converting %d to 0x%d in f%d\n", __func__, v2, +@@ -152,7 +154,7 @@ void HELPER(cefbr)(uint32_t f1, int32_t v2) + } + + /* 32-bit FP addition RR */ +-uint32_t HELPER(aebr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(aebr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].l.upper = float32_add(env->fregs[f1].l.upper, + env->fregs[f2].l.upper, +@@ -164,7 +166,7 @@ uint32_t HELPER(aebr)(uint32_t f1, uint32_t f2) + } + + /* 64-bit FP addition RR */ +-uint32_t HELPER(adbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(adbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].d = float64_add(env->fregs[f1].d, env->fregs[f2].d, + &env->fpu_status); +@@ -175,7 +177,7 @@ uint32_t HELPER(adbr)(uint32_t f1, uint32_t f2) + } + + /* 32-bit FP subtraction RR */ +-uint32_t HELPER(sebr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(sebr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].l.upper = float32_sub(env->fregs[f1].l.upper, + env->fregs[f2].l.upper, +@@ -187,7 +189,7 @@ uint32_t HELPER(sebr)(uint32_t f1, uint32_t f2) + } + + /* 64-bit FP subtraction RR */ +-uint32_t HELPER(sdbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(sdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].d = float64_sub(env->fregs[f1].d, env->fregs[f2].d, + &env->fpu_status); +@@ -198,7 +200,7 @@ uint32_t HELPER(sdbr)(uint32_t f1, uint32_t f2) + } + + /* 32-bit FP division RR */ +-void HELPER(debr)(uint32_t f1, uint32_t f2) ++void HELPER(debr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].l.upper = float32_div(env->fregs[f1].l.upper, + env->fregs[f2].l.upper, +@@ -206,7 +208,7 @@ void HELPER(debr)(uint32_t f1, uint32_t f2) + } + + /* 128-bit FP division RR */ +-void HELPER(dxbr)(uint32_t f1, uint32_t f2) ++void HELPER(dxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; + CPU_QuadU v2; +@@ -222,14 +224,14 @@ void HELPER(dxbr)(uint32_t f1, uint32_t f2) + } + + /* 64-bit FP multiplication RR */ +-void HELPER(mdbr)(uint32_t f1, uint32_t f2) ++void HELPER(mdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].d = float64_mul(env->fregs[f1].d, env->fregs[f2].d, + &env->fpu_status); + } + + /* 128-bit FP multiplication RR */ +-void HELPER(mxbr)(uint32_t f1, uint32_t f2) ++void HELPER(mxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; + CPU_QuadU v2; +@@ -245,14 +247,14 @@ void HELPER(mxbr)(uint32_t f1, uint32_t f2) + } + + /* convert 32-bit float to 64-bit float */ +-void HELPER(ldebr)(uint32_t r1, uint32_t r2) ++void HELPER(ldebr)(CPUS390XState *env, uint32_t r1, uint32_t r2) + { + env->fregs[r1].d = float32_to_float64(env->fregs[r2].l.upper, + &env->fpu_status); + } + + /* convert 128-bit float to 64-bit float */ +-void HELPER(ldxbr)(uint32_t f1, uint32_t f2) ++void HELPER(ldxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU x2; + +@@ -263,7 +265,7 @@ void HELPER(ldxbr)(uint32_t f1, uint32_t f2) + } + + /* convert 64-bit float to 128-bit float */ +-void HELPER(lxdbr)(uint32_t f1, uint32_t f2) ++void HELPER(lxdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU res; + +@@ -273,7 +275,7 @@ void HELPER(lxdbr)(uint32_t f1, uint32_t f2) + } + + /* convert 64-bit float to 32-bit float */ +-void HELPER(ledbr)(uint32_t f1, uint32_t f2) ++void HELPER(ledbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + float64 d2 = env->fregs[f2].d; + +@@ -281,7 +283,7 @@ void HELPER(ledbr)(uint32_t f1, uint32_t f2) + } + + /* convert 128-bit float to 32-bit float */ +-void HELPER(lexbr)(uint32_t f1, uint32_t f2) ++void HELPER(lexbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU x2; + +@@ -292,7 +294,7 @@ void HELPER(lexbr)(uint32_t f1, uint32_t f2) + } + + /* absolute value of 32-bit float */ +-uint32_t HELPER(lpebr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(lpebr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + float32 v1; + float32 v2 = env->fregs[f2].d; +@@ -303,7 +305,7 @@ uint32_t HELPER(lpebr)(uint32_t f1, uint32_t f2) + } + + /* absolute value of 64-bit float */ +-uint32_t HELPER(lpdbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(lpdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + float64 v1; + float64 v2 = env->fregs[f2].d; +@@ -314,7 +316,7 @@ uint32_t HELPER(lpdbr)(uint32_t f1, uint32_t f2) + } + + /* absolute value of 128-bit float */ +-uint32_t HELPER(lpxbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(lpxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; + CPU_QuadU v2; +@@ -328,21 +330,21 @@ uint32_t HELPER(lpxbr)(uint32_t f1, uint32_t f2) + } + + /* load and test 64-bit float */ +-uint32_t HELPER(ltdbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(ltdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].d = env->fregs[f2].d; + return set_cc_nz_f64(env->fregs[f1].d); + } + + /* load and test 32-bit float */ +-uint32_t HELPER(ltebr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(ltebr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].l.upper = env->fregs[f2].l.upper; + return set_cc_nz_f32(env->fregs[f1].l.upper); + } + + /* load and test 128-bit float */ +-uint32_t HELPER(ltxbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(ltxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU x; + +@@ -354,7 +356,7 @@ uint32_t HELPER(ltxbr)(uint32_t f1, uint32_t f2) + } + + /* load complement of 32-bit float */ +-uint32_t HELPER(lcebr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(lcebr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].l.upper = float32_chs(env->fregs[f2].l.upper); + +@@ -362,7 +364,7 @@ uint32_t HELPER(lcebr)(uint32_t f1, uint32_t f2) + } + + /* load complement of 64-bit float */ +-uint32_t HELPER(lcdbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(lcdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].d = float64_chs(env->fregs[f2].d); + +@@ -370,7 +372,7 @@ uint32_t HELPER(lcdbr)(uint32_t f1, uint32_t f2) + } + + /* load complement of 128-bit float */ +-uint32_t HELPER(lcxbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(lcxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU x1, x2; + +@@ -383,7 +385,7 @@ uint32_t HELPER(lcxbr)(uint32_t f1, uint32_t f2) + } + + /* 32-bit FP addition RM */ +-void HELPER(aeb)(uint32_t f1, uint32_t val) ++void HELPER(aeb)(CPUS390XState *env, uint32_t f1, uint32_t val) + { + float32 v1 = env->fregs[f1].l.upper; + CPU_FloatU v2; +@@ -395,7 +397,7 @@ void HELPER(aeb)(uint32_t f1, uint32_t val) + } + + /* 32-bit FP division RM */ +-void HELPER(deb)(uint32_t f1, uint32_t val) ++void HELPER(deb)(CPUS390XState *env, uint32_t f1, uint32_t val) + { + float32 v1 = env->fregs[f1].l.upper; + CPU_FloatU v2; +@@ -407,7 +409,7 @@ void HELPER(deb)(uint32_t f1, uint32_t val) + } + + /* 32-bit FP multiplication RM */ +-void HELPER(meeb)(uint32_t f1, uint32_t val) ++void HELPER(meeb)(CPUS390XState *env, uint32_t f1, uint32_t val) + { + float32 v1 = env->fregs[f1].l.upper; + CPU_FloatU v2; +@@ -419,29 +421,29 @@ void HELPER(meeb)(uint32_t f1, uint32_t val) + } + + /* 32-bit FP compare RR */ +-uint32_t HELPER(cebr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(cebr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + float32 v1 = env->fregs[f1].l.upper; + float32 v2 = env->fregs[f2].l.upper; + + HELPER_LOG("%s: comparing 0x%d from f%d and 0x%d\n", __func__, + v1, f1, v2); +- return set_cc_f32(v1, v2); ++ return set_cc_f32(env, v1, v2); + } + + /* 64-bit FP compare RR */ +-uint32_t HELPER(cdbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(cdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + float64 v1 = env->fregs[f1].d; + float64 v2 = env->fregs[f2].d; + + HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%ld\n", __func__, + v1, f1, v2); +- return set_cc_f64(v1, v2); ++ return set_cc_f64(env, v1, v2); + } + + /* 128-bit FP compare RR */ +-uint32_t HELPER(cxbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(cxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; + CPU_QuadU v2; +@@ -451,29 +453,29 @@ uint32_t HELPER(cxbr)(uint32_t f1, uint32_t f2) + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; + +- return float_comp_to_cc(float128_compare_quiet(v1.q, v2.q, ++ return float_comp_to_cc(env, float128_compare_quiet(v1.q, v2.q, + &env->fpu_status)); + } + + /* 64-bit FP compare RM */ +-uint32_t HELPER(cdb)(uint32_t f1, uint64_t a2) ++uint32_t HELPER(cdb)(CPUS390XState *env, uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; + +- v2.ll = ldq(a2); ++ v2.ll = cpu_ldq_data(env, a2); + HELPER_LOG("%s: comparing 0x%ld from f%d and 0x%lx\n", __func__, v1, + f1, v2.d); +- return set_cc_f64(v1, v2.d); ++ return set_cc_f64(env, v1, v2.d); + } + + /* 64-bit FP addition RM */ +-uint32_t HELPER(adb)(uint32_t f1, uint64_t a2) ++uint32_t HELPER(adb)(CPUS390XState *env, uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; + +- v2.ll = ldq(a2); ++ v2.ll = cpu_ldq_data(env, a2); + HELPER_LOG("%s: adding 0x%lx from f%d and 0x%lx\n", __func__, + v1, f1, v2.d); + env->fregs[f1].d = v1 = float64_add(v1, v2.d, &env->fpu_status); +@@ -481,7 +483,7 @@ uint32_t HELPER(adb)(uint32_t f1, uint64_t a2) + } + + /* 32-bit FP subtraction RM */ +-void HELPER(seb)(uint32_t f1, uint32_t val) ++void HELPER(seb)(CPUS390XState *env, uint32_t f1, uint32_t val) + { + float32 v1 = env->fregs[f1].l.upper; + CPU_FloatU v2; +@@ -491,41 +493,41 @@ void HELPER(seb)(uint32_t f1, uint32_t val) + } + + /* 64-bit FP subtraction RM */ +-uint32_t HELPER(sdb)(uint32_t f1, uint64_t a2) ++uint32_t HELPER(sdb)(CPUS390XState *env, uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; + +- v2.ll = ldq(a2); ++ v2.ll = cpu_ldq_data(env, a2); + env->fregs[f1].d = v1 = float64_sub(v1, v2.d, &env->fpu_status); + return set_cc_nz_f64(v1); + } + + /* 64-bit FP multiplication RM */ +-void HELPER(mdb)(uint32_t f1, uint64_t a2) ++void HELPER(mdb)(CPUS390XState *env, uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; + +- v2.ll = ldq(a2); ++ v2.ll = cpu_ldq_data(env, a2); + HELPER_LOG("%s: multiplying 0x%lx from f%d and 0x%ld\n", __func__, + v1, f1, v2.d); + env->fregs[f1].d = float64_mul(v1, v2.d, &env->fpu_status); + } + + /* 64-bit FP division RM */ +-void HELPER(ddb)(uint32_t f1, uint64_t a2) ++void HELPER(ddb)(CPUS390XState *env, uint32_t f1, uint64_t a2) + { + float64 v1 = env->fregs[f1].d; + CPU_DoubleU v2; + +- v2.ll = ldq(a2); ++ v2.ll = cpu_ldq_data(env, a2); + HELPER_LOG("%s: dividing 0x%lx from f%d by 0x%ld\n", __func__, + v1, f1, v2.d); + env->fregs[f1].d = float64_div(v1, v2.d, &env->fpu_status); + } + +-static void set_round_mode(int m3) ++static void set_round_mode(CPUS390XState *env, int m3) + { + switch (m3) { + case 0: +@@ -553,33 +555,36 @@ static void set_round_mode(int m3) + } + + /* convert 32-bit float to 64-bit int */ +-uint32_t HELPER(cgebr)(uint32_t r1, uint32_t f2, uint32_t m3) ++uint32_t HELPER(cgebr)(CPUS390XState *env, uint32_t r1, uint32_t f2, ++ uint32_t m3) + { + float32 v2 = env->fregs[f2].l.upper; + +- set_round_mode(m3); ++ set_round_mode(env, m3); + env->regs[r1] = float32_to_int64(v2, &env->fpu_status); + return set_cc_nz_f32(v2); + } + + /* convert 64-bit float to 64-bit int */ +-uint32_t HELPER(cgdbr)(uint32_t r1, uint32_t f2, uint32_t m3) ++uint32_t HELPER(cgdbr)(CPUS390XState *env, uint32_t r1, uint32_t f2, ++ uint32_t m3) + { + float64 v2 = env->fregs[f2].d; + +- set_round_mode(m3); ++ set_round_mode(env, m3); + env->regs[r1] = float64_to_int64(v2, &env->fpu_status); + return set_cc_nz_f64(v2); + } + + /* convert 128-bit float to 64-bit int */ +-uint32_t HELPER(cgxbr)(uint32_t r1, uint32_t f2, uint32_t m3) ++uint32_t HELPER(cgxbr)(CPUS390XState *env, uint32_t r1, uint32_t f2, ++ uint32_t m3) + { + CPU_QuadU v2; + + v2.ll.upper = env->fregs[f2].ll; + v2.ll.lower = env->fregs[f2 + 2].ll; +- set_round_mode(m3); ++ set_round_mode(env, m3); + env->regs[r1] = float128_to_int64(v2.q, &env->fpu_status); + if (float128_is_any_nan(v2.q)) { + return 3; +@@ -593,29 +598,32 @@ uint32_t HELPER(cgxbr)(uint32_t r1, uint32_t f2, uint32_t m3) + } + + /* convert 32-bit float to 32-bit int */ +-uint32_t HELPER(cfebr)(uint32_t r1, uint32_t f2, uint32_t m3) ++uint32_t HELPER(cfebr)(CPUS390XState *env, uint32_t r1, uint32_t f2, ++ uint32_t m3) + { + float32 v2 = env->fregs[f2].l.upper; + +- set_round_mode(m3); ++ set_round_mode(env, m3); + env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | + float32_to_int32(v2, &env->fpu_status); + return set_cc_nz_f32(v2); + } + + /* convert 64-bit float to 32-bit int */ +-uint32_t HELPER(cfdbr)(uint32_t r1, uint32_t f2, uint32_t m3) ++uint32_t HELPER(cfdbr)(CPUS390XState *env, uint32_t r1, uint32_t f2, ++ uint32_t m3) + { + float64 v2 = env->fregs[f2].d; + +- set_round_mode(m3); ++ set_round_mode(env, m3); + env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | + float64_to_int32(v2, &env->fpu_status); + return set_cc_nz_f64(v2); + } + + /* convert 128-bit float to 32-bit int */ +-uint32_t HELPER(cfxbr)(uint32_t r1, uint32_t f2, uint32_t m3) ++uint32_t HELPER(cfxbr)(CPUS390XState *env, uint32_t r1, uint32_t f2, ++ uint32_t m3) + { + CPU_QuadU v2; + +@@ -627,19 +635,19 @@ uint32_t HELPER(cfxbr)(uint32_t r1, uint32_t f2, uint32_t m3) + } + + /* load 32-bit FP zero */ +-void HELPER(lzer)(uint32_t f1) ++void HELPER(lzer)(CPUS390XState *env, uint32_t f1) + { + env->fregs[f1].l.upper = float32_zero; + } + + /* load 64-bit FP zero */ +-void HELPER(lzdr)(uint32_t f1) ++void HELPER(lzdr)(CPUS390XState *env, uint32_t f1) + { + env->fregs[f1].d = float64_zero; + } + + /* load 128-bit FP zero */ +-void HELPER(lzxr)(uint32_t f1) ++void HELPER(lzxr)(CPUS390XState *env, uint32_t f1) + { + CPU_QuadU x; + +@@ -649,7 +657,7 @@ void HELPER(lzxr)(uint32_t f1) + } + + /* 128-bit FP subtraction RR */ +-uint32_t HELPER(sxbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(sxbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; + CPU_QuadU v2; +@@ -666,7 +674,7 @@ uint32_t HELPER(sxbr)(uint32_t f1, uint32_t f2) + } + + /* 128-bit FP addition RR */ +-uint32_t HELPER(axbr)(uint32_t f1, uint32_t f2) ++uint32_t HELPER(axbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + CPU_QuadU v1; + CPU_QuadU v2; +@@ -683,7 +691,7 @@ uint32_t HELPER(axbr)(uint32_t f1, uint32_t f2) + } + + /* 32-bit FP multiplication RR */ +-void HELPER(meebr)(uint32_t f1, uint32_t f2) ++void HELPER(meebr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].l.upper = float32_mul(env->fregs[f1].l.upper, + env->fregs[f2].l.upper, +@@ -691,19 +699,19 @@ void HELPER(meebr)(uint32_t f1, uint32_t f2) + } + + /* 64-bit FP division RR */ +-void HELPER(ddbr)(uint32_t f1, uint32_t f2) ++void HELPER(ddbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].d = float64_div(env->fregs[f1].d, env->fregs[f2].d, + &env->fpu_status); + } + + /* 64-bit FP multiply and add RM */ +-void HELPER(madb)(uint32_t f1, uint64_t a2, uint32_t f3) ++void HELPER(madb)(CPUS390XState *env, uint32_t f1, uint64_t a2, uint32_t f3) + { + CPU_DoubleU v2; + + HELPER_LOG("%s: f1 %d a2 0x%lx f3 %d\n", __func__, f1, a2, f3); +- v2.ll = ldq(a2); ++ v2.ll = cpu_ldq_data(env, a2); + env->fregs[f1].d = float64_add(env->fregs[f1].d, + float64_mul(v2.d, env->fregs[f3].d, + &env->fpu_status), +@@ -711,7 +719,7 @@ void HELPER(madb)(uint32_t f1, uint64_t a2, uint32_t f3) + } + + /* 64-bit FP multiply and add RR */ +-void HELPER(madbr)(uint32_t f1, uint32_t f3, uint32_t f2) ++void HELPER(madbr)(CPUS390XState *env, uint32_t f1, uint32_t f3, uint32_t f2) + { + HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __func__, f1, f2, f3); + env->fregs[f1].d = float64_add(float64_mul(env->fregs[f2].d, +@@ -721,7 +729,7 @@ void HELPER(madbr)(uint32_t f1, uint32_t f3, uint32_t f2) + } + + /* 64-bit FP multiply and subtract RR */ +-void HELPER(msdbr)(uint32_t f1, uint32_t f3, uint32_t f2) ++void HELPER(msdbr)(CPUS390XState *env, uint32_t f1, uint32_t f3, uint32_t f2) + { + HELPER_LOG("%s: f1 %d f2 %d f3 %d\n", __func__, f1, f2, f3); + env->fregs[f1].d = float64_sub(float64_mul(env->fregs[f2].d, +@@ -731,7 +739,7 @@ void HELPER(msdbr)(uint32_t f1, uint32_t f3, uint32_t f2) + } + + /* 32-bit FP multiply and add RR */ +-void HELPER(maebr)(uint32_t f1, uint32_t f3, uint32_t f2) ++void HELPER(maebr)(CPUS390XState *env, uint32_t f1, uint32_t f3, uint32_t f2) + { + env->fregs[f1].l.upper = float32_add(env->fregs[f1].l.upper, + float32_mul(env->fregs[f2].l.upper, +@@ -741,29 +749,29 @@ void HELPER(maebr)(uint32_t f1, uint32_t f3, uint32_t f2) + } + + /* convert 32-bit float to 64-bit float */ +-void HELPER(ldeb)(uint32_t f1, uint64_t a2) ++void HELPER(ldeb)(CPUS390XState *env, uint32_t f1, uint64_t a2) + { + uint32_t v2; + +- v2 = ldl(a2); ++ v2 = cpu_ldl_data(env, a2); + env->fregs[f1].d = float32_to_float64(v2, + &env->fpu_status); + } + + /* convert 64-bit float to 128-bit float */ +-void HELPER(lxdb)(uint32_t f1, uint64_t a2) ++void HELPER(lxdb)(CPUS390XState *env, uint32_t f1, uint64_t a2) + { + CPU_DoubleU v2; + CPU_QuadU v1; + +- v2.ll = ldq(a2); ++ v2.ll = cpu_ldq_data(env, a2); + v1.q = float64_to_float128(v2.d, &env->fpu_status); + env->fregs[f1].ll = v1.ll.upper; + env->fregs[f1 + 2].ll = v1.ll.lower; + } + + /* test data class 32-bit */ +-uint32_t HELPER(tceb)(uint32_t f1, uint64_t m2) ++uint32_t HELPER(tceb)(CPUS390XState *env, uint32_t f1, uint64_t m2) + { + float32 v1 = env->fregs[f1].l.upper; + int neg = float32_is_neg(v1); +@@ -785,7 +793,7 @@ uint32_t HELPER(tceb)(uint32_t f1, uint64_t m2) + } + + /* test data class 64-bit */ +-uint32_t HELPER(tcdb)(uint32_t f1, uint64_t m2) ++uint32_t HELPER(tcdb)(CPUS390XState *env, uint32_t f1, uint64_t m2) + { + float64 v1 = env->fregs[f1].d; + int neg = float64_is_neg(v1); +@@ -806,7 +814,7 @@ uint32_t HELPER(tcdb)(uint32_t f1, uint64_t m2) + } + + /* test data class 128-bit */ +-uint32_t HELPER(tcxb)(uint32_t f1, uint64_t m2) ++uint32_t HELPER(tcxb)(CPUS390XState *env, uint32_t f1, uint64_t m2) + { + CPU_QuadU v1; + uint32_t cc = 0; +@@ -830,7 +838,7 @@ uint32_t HELPER(tcxb)(uint32_t f1, uint64_t m2) + } + + /* square root 64-bit RR */ +-void HELPER(sqdbr)(uint32_t f1, uint32_t f2) ++void HELPER(sqdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2) + { + env->fregs[f1].d = float64_sqrt(env->fregs[f2].d, &env->fpu_status); + } +diff --git a/target-s390x/helper.h b/target-s390x/helper.h +index 01c8d0e..af98773 100644 +--- a/target-s390x/helper.h ++++ b/target-s390x/helper.h +@@ -45,70 +45,70 @@ DEF_HELPER_3(mvcle, i32, i32, i64, i32) + DEF_HELPER_3(clcle, i32, i32, i64, i32) + DEF_HELPER_3(slb, i32, i32, i32, i32) + DEF_HELPER_4(slbg, i32, i32, i32, i64, i64) +-DEF_HELPER_2(cefbr, void, i32, s32) +-DEF_HELPER_2(cdfbr, void, i32, s32) +-DEF_HELPER_2(cxfbr, void, i32, s32) +-DEF_HELPER_2(cegbr, void, i32, s64) +-DEF_HELPER_2(cdgbr, void, i32, s64) +-DEF_HELPER_2(cxgbr, void, i32, s64) +-DEF_HELPER_2(adbr, i32, i32, i32) +-DEF_HELPER_2(aebr, i32, i32, i32) +-DEF_HELPER_2(sebr, i32, i32, i32) +-DEF_HELPER_2(sdbr, i32, i32, i32) +-DEF_HELPER_2(debr, void, i32, i32) +-DEF_HELPER_2(dxbr, void, i32, i32) +-DEF_HELPER_2(mdbr, void, i32, i32) +-DEF_HELPER_2(mxbr, void, i32, i32) +-DEF_HELPER_2(ldebr, void, i32, i32) +-DEF_HELPER_2(ldxbr, void, i32, i32) +-DEF_HELPER_2(lxdbr, void, i32, i32) +-DEF_HELPER_2(ledbr, void, i32, i32) +-DEF_HELPER_2(lexbr, void, i32, i32) +-DEF_HELPER_2(lpebr, i32, i32, i32) +-DEF_HELPER_2(lpdbr, i32, i32, i32) +-DEF_HELPER_2(lpxbr, i32, i32, i32) +-DEF_HELPER_2(ltebr, i32, i32, i32) +-DEF_HELPER_2(ltdbr, i32, i32, i32) +-DEF_HELPER_2(ltxbr, i32, i32, i32) +-DEF_HELPER_2(lcebr, i32, i32, i32) +-DEF_HELPER_2(lcdbr, i32, i32, i32) +-DEF_HELPER_2(lcxbr, i32, i32, i32) +-DEF_HELPER_2(aeb, void, i32, i32) +-DEF_HELPER_2(deb, void, i32, i32) +-DEF_HELPER_2(meeb, void, i32, i32) +-DEF_HELPER_2(cdb, i32, i32, i64) +-DEF_HELPER_2(adb, i32, i32, i64) +-DEF_HELPER_2(seb, void, i32, i32) +-DEF_HELPER_2(sdb, i32, i32, i64) +-DEF_HELPER_2(mdb, void, i32, i64) +-DEF_HELPER_2(ddb, void, i32, i64) +-DEF_HELPER_FLAGS_2(cebr, TCG_CALL_PURE, i32, i32, i32) +-DEF_HELPER_FLAGS_2(cdbr, TCG_CALL_PURE, i32, i32, i32) +-DEF_HELPER_FLAGS_2(cxbr, TCG_CALL_PURE, i32, i32, i32) +-DEF_HELPER_3(cgebr, i32, i32, i32, i32) +-DEF_HELPER_3(cgdbr, i32, i32, i32, i32) +-DEF_HELPER_3(cgxbr, i32, i32, i32, i32) +-DEF_HELPER_1(lzer, void, i32) +-DEF_HELPER_1(lzdr, void, i32) +-DEF_HELPER_1(lzxr, void, i32) +-DEF_HELPER_3(cfebr, i32, i32, i32, i32) +-DEF_HELPER_3(cfdbr, i32, i32, i32, i32) +-DEF_HELPER_3(cfxbr, i32, i32, i32, i32) +-DEF_HELPER_2(axbr, i32, i32, i32) +-DEF_HELPER_2(sxbr, i32, i32, i32) +-DEF_HELPER_2(meebr, void, i32, i32) +-DEF_HELPER_2(ddbr, void, i32, i32) +-DEF_HELPER_3(madb, void, i32, i64, i32) +-DEF_HELPER_3(maebr, void, i32, i32, i32) +-DEF_HELPER_3(madbr, void, i32, i32, i32) +-DEF_HELPER_3(msdbr, void, i32, i32, i32) +-DEF_HELPER_2(ldeb, void, i32, i64) +-DEF_HELPER_2(lxdb, void, i32, i64) +-DEF_HELPER_FLAGS_2(tceb, TCG_CALL_PURE, i32, i32, i64) +-DEF_HELPER_FLAGS_2(tcdb, TCG_CALL_PURE, i32, i32, i64) +-DEF_HELPER_FLAGS_2(tcxb, TCG_CALL_PURE, i32, i32, i64) ++DEF_HELPER_3(cefbr, void, env, i32, s32) ++DEF_HELPER_3(cdfbr, void, env, i32, s32) ++DEF_HELPER_3(cxfbr, void, env, i32, s32) ++DEF_HELPER_3(cegbr, void, env, i32, s64) ++DEF_HELPER_3(cdgbr, void, env, i32, s64) ++DEF_HELPER_3(cxgbr, void, env, i32, s64) ++DEF_HELPER_3(adbr, i32, env, i32, i32) ++DEF_HELPER_3(aebr, i32, env, i32, i32) ++DEF_HELPER_3(sebr, i32, env, i32, i32) ++DEF_HELPER_3(sdbr, i32, env, i32, i32) ++DEF_HELPER_3(debr, void, env, i32, i32) ++DEF_HELPER_3(dxbr, void, env, i32, i32) ++DEF_HELPER_3(mdbr, void, env, i32, i32) ++DEF_HELPER_3(mxbr, void, env, i32, i32) ++DEF_HELPER_3(ldebr, void, env, i32, i32) ++DEF_HELPER_3(ldxbr, void, env, i32, i32) ++DEF_HELPER_3(lxdbr, void, env, i32, i32) ++DEF_HELPER_3(ledbr, void, env, i32, i32) ++DEF_HELPER_3(lexbr, void, env, i32, i32) ++DEF_HELPER_3(lpebr, i32, env, i32, i32) ++DEF_HELPER_3(lpdbr, i32, env, i32, i32) ++DEF_HELPER_3(lpxbr, i32, env, i32, i32) ++DEF_HELPER_3(ltebr, i32, env, i32, i32) ++DEF_HELPER_3(ltdbr, i32, env, i32, i32) ++DEF_HELPER_3(ltxbr, i32, env, i32, i32) ++DEF_HELPER_3(lcebr, i32, env, i32, i32) ++DEF_HELPER_3(lcdbr, i32, env, i32, i32) ++DEF_HELPER_3(lcxbr, i32, env, i32, i32) ++DEF_HELPER_3(aeb, void, env, i32, i32) ++DEF_HELPER_3(deb, void, env, i32, i32) ++DEF_HELPER_3(meeb, void, env, i32, i32) ++DEF_HELPER_3(cdb, i32, env, i32, i64) ++DEF_HELPER_3(adb, i32, env, i32, i64) ++DEF_HELPER_3(seb, void, env, i32, i32) ++DEF_HELPER_3(sdb, i32, env, i32, i64) ++DEF_HELPER_3(mdb, void, env, i32, i64) ++DEF_HELPER_3(ddb, void, env, i32, i64) ++DEF_HELPER_FLAGS_3(cebr, TCG_CALL_PURE, i32, env, i32, i32) ++DEF_HELPER_FLAGS_3(cdbr, TCG_CALL_PURE, i32, env, i32, i32) ++DEF_HELPER_FLAGS_3(cxbr, TCG_CALL_PURE, i32, env, i32, i32) ++DEF_HELPER_4(cgebr, i32, env, i32, i32, i32) ++DEF_HELPER_4(cgdbr, i32, env, i32, i32, i32) ++DEF_HELPER_4(cgxbr, i32, env, i32, i32, i32) ++DEF_HELPER_2(lzer, void, env, i32) ++DEF_HELPER_2(lzdr, void, env, i32) ++DEF_HELPER_2(lzxr, void, env, i32) ++DEF_HELPER_4(cfebr, i32, env, i32, i32, i32) ++DEF_HELPER_4(cfdbr, i32, env, i32, i32, i32) ++DEF_HELPER_4(cfxbr, i32, env, i32, i32, i32) ++DEF_HELPER_3(axbr, i32, env, i32, i32) ++DEF_HELPER_3(sxbr, i32, env, i32, i32) ++DEF_HELPER_3(meebr, void, env, i32, i32) ++DEF_HELPER_3(ddbr, void, env, i32, i32) ++DEF_HELPER_4(madb, void, env, i32, i64, i32) ++DEF_HELPER_4(maebr, void, env, i32, i32, i32) ++DEF_HELPER_4(madbr, void, env, i32, i32, i32) ++DEF_HELPER_4(msdbr, void, env, i32, i32, i32) ++DEF_HELPER_3(ldeb, void, env, i32, i64) ++DEF_HELPER_3(lxdb, void, env, i32, i64) ++DEF_HELPER_FLAGS_3(tceb, TCG_CALL_PURE, i32, env, i32, i64) ++DEF_HELPER_FLAGS_3(tcdb, TCG_CALL_PURE, i32, env, i32, i64) ++DEF_HELPER_FLAGS_3(tcxb, TCG_CALL_PURE, i32, env, i32, i64) + DEF_HELPER_2(flogr, i32, i32, i64) +-DEF_HELPER_2(sqdbr, void, i32, i32) ++DEF_HELPER_3(sqdbr, void, env, i32, i32) + DEF_HELPER_FLAGS_1(cvd, TCG_CALL_PURE|TCG_CALL_CONST, i64, s32) + DEF_HELPER_3(unpk, void, i32, i64, i64) + DEF_HELPER_3(tr, void, i32, i64, i64) +diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c +index ba05e65..3f8b3ba 100644 +--- a/target-s390x/mem_helper.c ++++ b/target-s390x/mem_helper.c +@@ -1188,3 +1188,52 @@ uint32_t HELPER(lra)(uint64_t addr, uint32_t r1) + } + + #endif ++ ++/* temporary wrappers */ ++#if defined(CONFIG_USER_ONLY) ++#define ldub_data(addr) ldub_raw(addr) ++#define lduw_data(addr) lduw_raw(addr) ++#define ldl_data(addr) ldl_raw(addr) ++#define ldq_data(addr) ldq_raw(addr) ++ ++#define stb_data(addr, data) stb_raw(addr, data) ++#define stw_data(addr, data) stw_raw(addr, data) ++#define stl_data(addr, data) stl_raw(addr, data) ++#define stq_data(addr, data) stq_raw(addr, data) ++#endif ++ ++#define WRAP_LD(rettype, fn) \ ++ rettype cpu_ ## fn(CPUS390XState *env1, target_ulong addr) \ ++ { \ ++ CPUS390XState *saved_env; \ ++ rettype ret; \ ++ \ ++ saved_env = env; \ ++ env = env1; \ ++ ret = fn(addr); \ ++ env = saved_env; \ ++ return ret; \ ++ } ++ ++WRAP_LD(uint32_t, ldub_data) ++WRAP_LD(uint32_t, lduw_data) ++WRAP_LD(uint32_t, ldl_data) ++WRAP_LD(uint64_t, ldq_data) ++#undef WRAP_LD ++ ++#define WRAP_ST(datatype, fn) \ ++ void cpu_ ## fn(CPUS390XState *env1, target_ulong addr, datatype val) \ ++ { \ ++ CPUS390XState *saved_env; \ ++ \ ++ saved_env = env; \ ++ env = env1; \ ++ fn(addr, val); \ ++ env = saved_env; \ ++ } ++ ++WRAP_ST(uint32_t, stb_data) ++WRAP_ST(uint32_t, stw_data) ++WRAP_ST(uint32_t, stl_data) ++WRAP_ST(uint64_t, stq_data) ++#undef WRAP_ST +diff --git a/target-s390x/translate.c b/target-s390x/translate.c +index c370df3..b1f2071 100644 +--- a/target-s390x/translate.c ++++ b/target-s390x/translate.c +@@ -2206,11 +2206,11 @@ static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, + switch (op) { + case 0x4: /* LDEB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_ldeb(tmp_r1, addr); ++ gen_helper_ldeb(cpu_env, tmp_r1, addr); + break; + case 0x5: /* LXDB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_lxdb(tmp_r1, addr); ++ gen_helper_lxdb(cpu_env, tmp_r1, addr); + break; + case 0x9: /* CEB R1,D2(X2,B2) [RXE] */ + tmp = tcg_temp_new_i64(); +@@ -2225,7 +2225,7 @@ static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, + tmp32 = tcg_temp_new_i32(); + tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); + tcg_gen_trunc_i64_i32(tmp32, tmp); +- gen_helper_aeb(tmp_r1, tmp32); ++ gen_helper_aeb(cpu_env, tmp_r1, tmp32); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32); + +@@ -2238,7 +2238,7 @@ static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, + tmp32 = tcg_temp_new_i32(); + tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); + tcg_gen_trunc_i64_i32(tmp32, tmp); +- gen_helper_seb(tmp_r1, tmp32); ++ gen_helper_seb(cpu_env, tmp_r1, tmp32); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32); + +@@ -2251,23 +2251,23 @@ static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, + tmp32 = tcg_temp_new_i32(); + tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); + tcg_gen_trunc_i64_i32(tmp32, tmp); +- gen_helper_deb(tmp_r1, tmp32); ++ gen_helper_deb(cpu_env, tmp_r1, tmp32); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32); + break; + case 0x10: /* TCEB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_tceb(cc_op, tmp_r1, addr); ++ gen_helper_tceb(cc_op, cpu_env, tmp_r1, addr); + set_cc_static(s); + break; + case 0x11: /* TCDB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_tcdb(cc_op, tmp_r1, addr); ++ gen_helper_tcdb(cc_op, cpu_env, tmp_r1, addr); + set_cc_static(s); + break; + case 0x12: /* TCXB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_tcxb(cc_op, tmp_r1, addr); ++ gen_helper_tcxb(cc_op, cpu_env, tmp_r1, addr); + set_cc_static(s); + break; + case 0x17: /* MEEB R1,D2(X2,B2) [RXE] */ +@@ -2275,38 +2275,38 @@ static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, + tmp32 = tcg_temp_new_i32(); + tcg_gen_qemu_ld32u(tmp, addr, get_mem_index(s)); + tcg_gen_trunc_i64_i32(tmp32, tmp); +- gen_helper_meeb(tmp_r1, tmp32); ++ gen_helper_meeb(cpu_env, tmp_r1, tmp32); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32); + break; + case 0x19: /* CDB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_cdb(cc_op, tmp_r1, addr); ++ gen_helper_cdb(cc_op, cpu_env, tmp_r1, addr); + set_cc_static(s); + break; + case 0x1a: /* ADB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_adb(cc_op, tmp_r1, addr); ++ gen_helper_adb(cc_op, cpu_env, tmp_r1, addr); + set_cc_static(s); + break; + case 0x1b: /* SDB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_sdb(cc_op, tmp_r1, addr); ++ gen_helper_sdb(cc_op, cpu_env, tmp_r1, addr); + set_cc_static(s); + break; + case 0x1c: /* MDB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_mdb(tmp_r1, addr); ++ gen_helper_mdb(cpu_env, tmp_r1, addr); + break; + case 0x1d: /* DDB R1,D2(X2,B2) [RXE] */ + potential_page_fault(s); +- gen_helper_ddb(tmp_r1, addr); ++ gen_helper_ddb(cpu_env, tmp_r1, addr); + break; + case 0x1e: /* MADB R1,R3,D2(X2,B2) [RXF] */ + /* for RXF insns, r1 is R3 and r1b is R1 */ + tmp32 = tcg_const_i32(r1b); + potential_page_fault(s); +- gen_helper_madb(tmp32, addr, tmp_r1); ++ gen_helper_madb(cpu_env, tmp32, addr, tmp_r1); + tcg_temp_free_i32(tmp32); + break; + default: +@@ -3001,14 +3001,14 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + #define FP_HELPER(i) \ + tmp32_1 = tcg_const_i32(r1); \ + tmp32_2 = tcg_const_i32(r2); \ +- gen_helper_ ## i (tmp32_1, tmp32_2); \ ++ gen_helper_ ## i(cpu_env, tmp32_1, tmp32_2); \ + tcg_temp_free_i32(tmp32_1); \ + tcg_temp_free_i32(tmp32_2); + + #define FP_HELPER_CC(i) \ + tmp32_1 = tcg_const_i32(r1); \ + tmp32_2 = tcg_const_i32(r2); \ +- gen_helper_ ## i (cc_op, tmp32_1, tmp32_2); \ ++ gen_helper_ ## i(cc_op, cpu_env, tmp32_1, tmp32_2); \ + set_cc_static(s); \ + tcg_temp_free_i32(tmp32_1); \ + tcg_temp_free_i32(tmp32_2); +@@ -3080,13 +3080,13 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + tmp32_3 = tcg_const_i32(r1); + switch (op) { + case 0xe: +- gen_helper_maebr(tmp32_1, tmp32_3, tmp32_2); ++ gen_helper_maebr(cpu_env, tmp32_1, tmp32_3, tmp32_2); + break; + case 0x1e: +- gen_helper_madbr(tmp32_1, tmp32_3, tmp32_2); ++ gen_helper_madbr(cpu_env, tmp32_1, tmp32_3, tmp32_2); + break; + case 0x1f: +- gen_helper_msdbr(tmp32_1, tmp32_3, tmp32_2); ++ gen_helper_msdbr(cpu_env, tmp32_1, tmp32_3, tmp32_2); + break; + default: + tcg_abort(); +@@ -3138,17 +3138,17 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + break; + case 0x74: /* LZER R1 [RRE] */ + tmp32_1 = tcg_const_i32(r1); +- gen_helper_lzer(tmp32_1); ++ gen_helper_lzer(cpu_env, tmp32_1); + tcg_temp_free_i32(tmp32_1); + break; + case 0x75: /* LZDR R1 [RRE] */ + tmp32_1 = tcg_const_i32(r1); +- gen_helper_lzdr(tmp32_1); ++ gen_helper_lzdr(cpu_env, tmp32_1); + tcg_temp_free_i32(tmp32_1); + break; + case 0x76: /* LZXR R1 [RRE] */ + tmp32_1 = tcg_const_i32(r1); +- gen_helper_lzxr(tmp32_1); ++ gen_helper_lzxr(cpu_env, tmp32_1); + tcg_temp_free_i32(tmp32_1); + break; + case 0x84: /* SFPC R1 [RRE] */ +@@ -3169,13 +3169,13 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + tmp32_2 = load_reg32(r2); + switch (op) { + case 0x94: +- gen_helper_cefbr(tmp32_1, tmp32_2); ++ gen_helper_cefbr(cpu_env, tmp32_1, tmp32_2); + break; + case 0x95: +- gen_helper_cdfbr(tmp32_1, tmp32_2); ++ gen_helper_cdfbr(cpu_env, tmp32_1, tmp32_2); + break; + case 0x96: +- gen_helper_cxfbr(tmp32_1, tmp32_2); ++ gen_helper_cxfbr(cpu_env, tmp32_1, tmp32_2); + break; + default: + tcg_abort(); +@@ -3191,13 +3191,13 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + tmp32_3 = tcg_const_i32(m3); + switch (op) { + case 0x98: +- gen_helper_cfebr(cc_op, tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_cfebr(cc_op, cpu_env, tmp32_1, tmp32_2, tmp32_3); + break; + case 0x99: +- gen_helper_cfdbr(cc_op, tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_cfdbr(cc_op, cpu_env, tmp32_1, tmp32_2, tmp32_3); + break; + case 0x9a: +- gen_helper_cfxbr(cc_op, tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_cfxbr(cc_op, cpu_env, tmp32_1, tmp32_2, tmp32_3); + break; + default: + tcg_abort(); +@@ -3213,10 +3213,10 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + tmp = load_reg(r2); + switch (op) { + case 0xa4: +- gen_helper_cegbr(tmp32_1, tmp); ++ gen_helper_cegbr(cpu_env, tmp32_1, tmp); + break; + case 0xa5: +- gen_helper_cdgbr(tmp32_1, tmp); ++ gen_helper_cdgbr(cpu_env, tmp32_1, tmp); + break; + default: + tcg_abort(); +@@ -3227,7 +3227,7 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + case 0xa6: /* CXGBR R1,R2 [RRE] */ + tmp32_1 = tcg_const_i32(r1); + tmp = load_reg(r2); +- gen_helper_cxgbr(tmp32_1, tmp); ++ gen_helper_cxgbr(cpu_env, tmp32_1, tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i64(tmp); + break; +@@ -3235,7 +3235,7 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r2); + tmp32_3 = tcg_const_i32(m3); +- gen_helper_cgebr(cc_op, tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_cgebr(cc_op, cpu_env, tmp32_1, tmp32_2, tmp32_3); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -3245,7 +3245,7 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r2); + tmp32_3 = tcg_const_i32(m3); +- gen_helper_cgdbr(cc_op, tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_cgdbr(cc_op, cpu_env, tmp32_1, tmp32_2, tmp32_3); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -3255,7 +3255,7 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r2); + tmp32_3 = tcg_const_i32(m3); +- gen_helper_cgxbr(cc_op, tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_cgxbr(cc_op, cpu_env, tmp32_1, tmp32_2, tmp32_3); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +-- +1.7.12.1 + diff --git a/0012-target-s390x-avoid-AREG0-for-integer-helpers.patch b/0012-target-s390x-avoid-AREG0-for-integer-helpers.patch new file mode 100644 index 0000000..379d0f7 --- /dev/null +++ b/0012-target-s390x-avoid-AREG0-for-integer-helpers.patch @@ -0,0 +1,202 @@ +From d44b8c2cacaa50e7420f0dfaf42c344bcf134431 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:37 +0000 +Subject: [PATCH] target-s390x: avoid AREG0 for integer helpers + +Make integer helpers take a parameter for CPUState instead +of relying on global env. + +Signed-off-by: Blue Swirl +Signed-off-by: Alexander Graf +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 1 - + target-s390x/helper.h | 10 +++++----- + target-s390x/int_helper.c | 12 ++++++------ + target-s390x/translate.c | 16 ++++++++-------- + 4 files changed, 19 insertions(+), 20 deletions(-) + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index 7d965e9..7b2c5c1 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -3,7 +3,6 @@ obj-y += int_helper.o fpu_helper.o cc_helper.o mem_helper.o misc_helper.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + +-$(obj)/int_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/cc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/mem_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/misc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/helper.h b/target-s390x/helper.h +index af98773..c03cd59 100644 +--- a/target-s390x/helper.h ++++ b/target-s390x/helper.h +@@ -12,8 +12,8 @@ DEF_HELPER_FLAGS_1(set_cc_comp_s64, TCG_CALL_PURE|TCG_CALL_CONST, i32, s64) + DEF_HELPER_FLAGS_2(set_cc_icm, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32) + DEF_HELPER_3(clm, i32, i32, i32, i64) + DEF_HELPER_3(stcm, void, i32, i32, i64) +-DEF_HELPER_2(mlg, void, i32, i64) +-DEF_HELPER_2(dlg, void, i32, i64) ++DEF_HELPER_3(mlg, void, env, i32, i64) ++DEF_HELPER_3(dlg, void, env, i32, i64) + DEF_HELPER_FLAGS_3(set_cc_add64, TCG_CALL_PURE|TCG_CALL_CONST, i32, s64, s64, s64) + DEF_HELPER_FLAGS_3(set_cc_addu64, TCG_CALL_PURE|TCG_CALL_CONST, i32, i64, i64, i64) + DEF_HELPER_FLAGS_3(set_cc_add32, TCG_CALL_PURE|TCG_CALL_CONST, i32, s32, s32, s32) +@@ -43,8 +43,8 @@ DEF_HELPER_3(stam, void, i32, i64, i32) + DEF_HELPER_3(lam, void, i32, i64, i32) + DEF_HELPER_3(mvcle, i32, i32, i64, i32) + DEF_HELPER_3(clcle, i32, i32, i64, i32) +-DEF_HELPER_3(slb, i32, i32, i32, i32) +-DEF_HELPER_4(slbg, i32, i32, i32, i64, i64) ++DEF_HELPER_4(slb, i32, env, i32, i32, i32) ++DEF_HELPER_5(slbg, i32, env, i32, i32, i64, i64) + DEF_HELPER_3(cefbr, void, env, i32, s32) + DEF_HELPER_3(cdfbr, void, env, i32, s32) + DEF_HELPER_3(cxfbr, void, env, i32, s32) +@@ -107,7 +107,7 @@ DEF_HELPER_3(lxdb, void, env, i32, i64) + DEF_HELPER_FLAGS_3(tceb, TCG_CALL_PURE, i32, env, i32, i64) + DEF_HELPER_FLAGS_3(tcdb, TCG_CALL_PURE, i32, env, i32, i64) + DEF_HELPER_FLAGS_3(tcxb, TCG_CALL_PURE, i32, env, i32, i64) +-DEF_HELPER_2(flogr, i32, i32, i64) ++DEF_HELPER_3(flogr, i32, env, i32, i64) + DEF_HELPER_3(sqdbr, void, env, i32, i32) + DEF_HELPER_FLAGS_1(cvd, TCG_CALL_PURE|TCG_CALL_CONST, i64, s32) + DEF_HELPER_3(unpk, void, i32, i64, i64) +diff --git a/target-s390x/int_helper.c b/target-s390x/int_helper.c +index e2eeb07..f202a7e 100644 +--- a/target-s390x/int_helper.c ++++ b/target-s390x/int_helper.c +@@ -19,7 +19,6 @@ + */ + + #include "cpu.h" +-#include "dyngen-exec.h" + #include "host-utils.h" + #include "helper.h" + +@@ -31,7 +30,7 @@ + #endif + + /* 64/64 -> 128 unsigned multiplication */ +-void HELPER(mlg)(uint32_t r1, uint64_t v2) ++void HELPER(mlg)(CPUS390XState *env, uint32_t r1, uint64_t v2) + { + #if HOST_LONG_BITS == 64 && defined(__GNUC__) + /* assuming 64-bit hosts have __uint128_t */ +@@ -46,7 +45,7 @@ void HELPER(mlg)(uint32_t r1, uint64_t v2) + } + + /* 128 -> 64/64 unsigned division */ +-void HELPER(dlg)(uint32_t r1, uint64_t v2) ++void HELPER(dlg)(CPUS390XState *env, uint32_t r1, uint64_t v2) + { + uint64_t divisor = v2; + +@@ -129,7 +128,7 @@ uint32_t HELPER(addc_u32)(uint32_t cc, uint32_t v1, uint32_t v2) + } + + /* subtract unsigned v2 from v1 with borrow */ +-uint32_t HELPER(slb)(uint32_t cc, uint32_t r1, uint32_t v2) ++uint32_t HELPER(slb)(CPUS390XState *env, uint32_t cc, uint32_t r1, uint32_t v2) + { + uint32_t v1 = env->regs[r1]; + uint32_t res = v1 + (~v2) + (cc >> 1); +@@ -144,7 +143,8 @@ uint32_t HELPER(slb)(uint32_t cc, uint32_t r1, uint32_t v2) + } + + /* subtract unsigned v2 from v1 with borrow */ +-uint32_t HELPER(slbg)(uint32_t cc, uint32_t r1, uint64_t v1, uint64_t v2) ++uint32_t HELPER(slbg)(CPUS390XState *env, uint32_t cc, uint32_t r1, ++ uint64_t v1, uint64_t v2) + { + uint64_t res = v1 + (~v2) + (cc >> 1); + +@@ -158,7 +158,7 @@ uint32_t HELPER(slbg)(uint32_t cc, uint32_t r1, uint64_t v1, uint64_t v2) + } + + /* find leftmost one */ +-uint32_t HELPER(flogr)(uint32_t r1, uint64_t v2) ++uint32_t HELPER(flogr)(CPUS390XState *env, uint32_t r1, uint64_t v2) + { + uint64_t res = 0; + uint64_t ov2 = v2; +diff --git a/target-s390x/translate.c b/target-s390x/translate.c +index b1f2071..2a61e92 100644 +--- a/target-s390x/translate.c ++++ b/target-s390x/translate.c +@@ -1803,7 +1803,7 @@ static void disas_e3(DisasContext* s, int op, int r1, int x2, int b2, int d2) + tmp2 = tcg_temp_new_i64(); + tmp32_1 = tcg_const_i32(r1); + tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); +- gen_helper_mlg(tmp32_1, tmp2); ++ gen_helper_mlg(cpu_env, tmp32_1, tmp2); + tcg_temp_free_i64(tmp2); + tcg_temp_free_i32(tmp32_1); + break; +@@ -1811,7 +1811,7 @@ static void disas_e3(DisasContext* s, int op, int r1, int x2, int b2, int d2) + tmp2 = tcg_temp_new_i64(); + tmp32_1 = tcg_const_i32(r1); + tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); +- gen_helper_dlg(tmp32_1, tmp2); ++ gen_helper_dlg(cpu_env, tmp32_1, tmp2); + tcg_temp_free_i64(tmp2); + tcg_temp_free_i32(tmp32_1); + break; +@@ -1837,7 +1837,7 @@ static void disas_e3(DisasContext* s, int op, int r1, int x2, int b2, int d2) + tcg_gen_qemu_ld64(tmp2, addr, get_mem_index(s)); + /* XXX possible optimization point */ + gen_op_calc_cc(s); +- gen_helper_slbg(cc_op, cc_op, tmp32_1, regs[r1], tmp2); ++ gen_helper_slbg(cc_op, cpu_env, cc_op, tmp32_1, regs[r1], tmp2); + set_cc_static(s); + tcg_temp_free_i64(tmp2); + tcg_temp_free_i32(tmp32_1); +@@ -1917,7 +1917,7 @@ static void disas_e3(DisasContext* s, int op, int r1, int x2, int b2, int d2) + tcg_gen_trunc_i64_i32(tmp32_2, tmp2); + /* XXX possible optimization point */ + gen_op_calc_cc(s); +- gen_helper_slb(cc_op, cc_op, tmp32_1, tmp32_2); ++ gen_helper_slb(cc_op, cpu_env, cc_op, tmp32_1, tmp32_2); + set_cc_static(s); + tcg_temp_free_i64(tmp2); + tcg_temp_free_i32(tmp32_1); +@@ -3535,7 +3535,7 @@ static void disas_b9(DisasContext *s, int op, int r1, int r2) + case 0x83: /* FLOGR R1,R2 [RRE] */ + tmp = load_reg(r2); + tmp32_1 = tcg_const_i32(r1); +- gen_helper_flogr(cc_op, tmp32_1, tmp); ++ gen_helper_flogr(cc_op, cpu_env, tmp32_1, tmp); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -3555,7 +3555,7 @@ static void disas_b9(DisasContext *s, int op, int r1, int r2) + case 0x87: /* DLGR R1,R2 [RRE] */ + tmp32_1 = tcg_const_i32(r1); + tmp = load_reg(r2); +- gen_helper_dlg(tmp32_1, tmp); ++ gen_helper_dlg(cpu_env, tmp32_1, tmp); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + break; +@@ -3580,7 +3580,7 @@ static void disas_b9(DisasContext *s, int op, int r1, int r2) + tmp2 = load_reg(r2); + tmp32_1 = tcg_const_i32(r1); + gen_op_calc_cc(s); +- gen_helper_slbg(cc_op, cc_op, tmp32_1, tmp, tmp2); ++ gen_helper_slbg(cc_op, cpu_env, cc_op, tmp32_1, tmp, tmp2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i64(tmp2); +@@ -3647,7 +3647,7 @@ static void disas_b9(DisasContext *s, int op, int r1, int r2) + tmp32_1 = load_reg32(r2); + tmp32_2 = tcg_const_i32(r1); + gen_op_calc_cc(s); +- gen_helper_slb(cc_op, cc_op, tmp32_2, tmp32_1); ++ gen_helper_slb(cc_op, cpu_env, cc_op, tmp32_2, tmp32_1); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +-- +1.7.12.1 + diff --git a/0013-target-s390x-avoid-AREG0-for-condition-code-helpers.patch b/0013-target-s390x-avoid-AREG0-for-condition-code-helpers.patch new file mode 100644 index 0000000..eddecbb --- /dev/null +++ b/0013-target-s390x-avoid-AREG0-for-condition-code-helpers.patch @@ -0,0 +1,190 @@ +From ead7a100e907eddd0ba9f3cebb5f84c1afb120b8 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:38 +0000 +Subject: [PATCH] target-s390x: avoid AREG0 for condition code helpers + +Make condition code helpers take a parameter for CPUState instead +of relying on global env. + +Signed-off-by: Blue Swirl +Signed-off-by: Alexander Graf +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 1 - + target-s390x/cc_helper.c | 11 +++++------ + target-s390x/helper.h | 10 +++++----- + target-s390x/translate.c | 16 ++++++++-------- + 4 files changed, 18 insertions(+), 20 deletions(-) + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index 7b2c5c1..736cf33 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -3,6 +3,5 @@ obj-y += int_helper.o fpu_helper.o cc_helper.o mem_helper.o misc_helper.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + +-$(obj)/cc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/mem_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) + $(obj)/misc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/cc_helper.c b/target-s390x/cc_helper.c +index 9c3a2c4..19ef145 100644 +--- a/target-s390x/cc_helper.c ++++ b/target-s390x/cc_helper.c +@@ -19,7 +19,6 @@ + */ + + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helper.h" + + /* #define DEBUG_HELPER */ +@@ -500,14 +499,14 @@ uint32_t calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst, + return do_calc_cc(env, cc_op, src, dst, vr); + } + +-uint32_t HELPER(calc_cc)(uint32_t cc_op, uint64_t src, uint64_t dst, +- uint64_t vr) ++uint32_t HELPER(calc_cc)(CPUS390XState *env, uint32_t cc_op, uint64_t src, ++ uint64_t dst, uint64_t vr) + { + return do_calc_cc(env, cc_op, src, dst, vr); + } + + /* insert psw mask and condition code into r1 */ +-void HELPER(ipm)(uint32_t cc, uint32_t r1) ++void HELPER(ipm)(CPUS390XState *env, uint32_t cc, uint32_t r1) + { + uint64_t r = env->regs[r1]; + +@@ -519,13 +518,13 @@ void HELPER(ipm)(uint32_t cc, uint32_t r1) + } + + #ifndef CONFIG_USER_ONLY +-void HELPER(load_psw)(uint64_t mask, uint64_t addr) ++void HELPER(load_psw)(CPUS390XState *env, uint64_t mask, uint64_t addr) + { + load_psw(env, mask, addr); + cpu_loop_exit(env); + } + +-void HELPER(sacf)(uint64_t a1) ++void HELPER(sacf)(CPUS390XState *env, uint64_t a1) + { + HELPER_LOG("%s: %16" PRIx64 "\n", __func__, a1); + +diff --git a/target-s390x/helper.h b/target-s390x/helper.h +index c03cd59..876b88e 100644 +--- a/target-s390x/helper.h ++++ b/target-s390x/helper.h +@@ -36,7 +36,7 @@ DEF_HELPER_FLAGS_1(abs_i64, TCG_CALL_PURE|TCG_CALL_CONST, i64, s64) + DEF_HELPER_FLAGS_1(nabs_i64, TCG_CALL_PURE|TCG_CALL_CONST, s64, s64) + DEF_HELPER_3(stcmh, void, i32, i64, i32) + DEF_HELPER_3(icmh, i32, i32, i64, i32) +-DEF_HELPER_2(ipm, void, i32, i32) ++DEF_HELPER_3(ipm, void, env, i32, i32) + DEF_HELPER_FLAGS_3(addc_u32, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32, i32) + DEF_HELPER_FLAGS_3(set_cc_addc_u64, TCG_CALL_PURE|TCG_CALL_CONST, i32, i64, i64, i64) + DEF_HELPER_3(stam, void, i32, i64, i32) +@@ -115,7 +115,7 @@ DEF_HELPER_3(tr, void, i32, i64, i64) + + DEF_HELPER_2(servc, i32, i32, i64) + DEF_HELPER_3(diag, i64, i32, i64, i64) +-DEF_HELPER_2(load_psw, void, i64, i64) ++DEF_HELPER_3(load_psw, void, env, i64, i64) + DEF_HELPER_1(program_interrupt, void, i32) + DEF_HELPER_FLAGS_1(stidp, TCG_CALL_CONST, void, i64) + DEF_HELPER_FLAGS_1(spx, TCG_CALL_CONST, void, i64) +@@ -139,14 +139,14 @@ DEF_HELPER_2(csp, i32, i32, i32) + DEF_HELPER_3(mvcs, i32, i64, i64, i64) + DEF_HELPER_3(mvcp, i32, i64, i64, i64) + DEF_HELPER_3(sigp, i32, i64, i32, i64) +-DEF_HELPER_1(sacf, void, i64) ++DEF_HELPER_2(sacf, void, env, i64) + DEF_HELPER_FLAGS_2(ipte, TCG_CALL_CONST, void, i64, i64) + DEF_HELPER_FLAGS_0(ptlb, TCG_CALL_CONST, void) + DEF_HELPER_2(lra, i32, i64, i32) + DEF_HELPER_2(stura, void, i64, i32) + DEF_HELPER_2(cksm, void, i32, i32) + +-DEF_HELPER_FLAGS_4(calc_cc, TCG_CALL_PURE|TCG_CALL_CONST, +- i32, i32, i64, i64, i64) ++DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_PURE|TCG_CALL_CONST, ++ i32, env, i32, i64, i64, i64) + + #include "def-helper.h" +diff --git a/target-s390x/translate.c b/target-s390x/translate.c +index 2a61e92..1d87272 100644 +--- a/target-s390x/translate.c ++++ b/target-s390x/translate.c +@@ -722,7 +722,7 @@ static void gen_op_calc_cc(DisasContext *s) + case CC_OP_NZ_F32: + case CC_OP_NZ_F64: + /* 1 argument */ +- gen_helper_calc_cc(cc_op, local_cc_op, dummy, cc_dst, dummy); ++ gen_helper_calc_cc(cc_op, cpu_env, local_cc_op, dummy, cc_dst, dummy); + break; + case CC_OP_ICM: + case CC_OP_LTGT_32: +@@ -735,7 +735,7 @@ static void gen_op_calc_cc(DisasContext *s) + case CC_OP_LTGT_F64: + case CC_OP_SLAG: + /* 2 arguments */ +- gen_helper_calc_cc(cc_op, local_cc_op, cc_src, cc_dst, dummy); ++ gen_helper_calc_cc(cc_op, cpu_env, local_cc_op, cc_src, cc_dst, dummy); + break; + case CC_OP_ADD_64: + case CC_OP_ADDU_64: +@@ -746,11 +746,11 @@ static void gen_op_calc_cc(DisasContext *s) + case CC_OP_SUB_32: + case CC_OP_SUBU_32: + /* 3 arguments */ +- gen_helper_calc_cc(cc_op, local_cc_op, cc_src, cc_dst, cc_vr); ++ gen_helper_calc_cc(cc_op, cpu_env, local_cc_op, cc_src, cc_dst, cc_vr); + break; + case CC_OP_DYNAMIC: + /* unknown operation - assume 3 arguments and cc_op in env */ +- gen_helper_calc_cc(cc_op, cc_op, cc_src, cc_dst, cc_vr); ++ gen_helper_calc_cc(cc_op, cpu_env, cc_op, cc_src, cc_dst, cc_vr); + break; + default: + tcg_abort(); +@@ -2628,7 +2628,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + case 0x22: /* IPM R1 [RRE] */ + tmp32_1 = tcg_const_i32(r1); + gen_op_calc_cc(s); +- gen_helper_ipm(cc_op, tmp32_1); ++ gen_helper_ipm(cpu_env, cc_op, tmp32_1); + tcg_temp_free_i32(tmp32_1); + break; + case 0x41: /* CKSM R1,R2 [RRE] */ +@@ -2916,7 +2916,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_sacf(tmp); ++ gen_helper_sacf(cpu_env, tmp); + tcg_temp_free_i64(tmp); + /* addressing mode has changed, so end the block */ + s->pc += ilc * 2; +@@ -2967,7 +2967,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + tcg_gen_qemu_ld64(tmp2, tmp, get_mem_index(s)); + tcg_gen_addi_i64(tmp, tmp, 8); + tcg_gen_qemu_ld64(tmp3, tmp, get_mem_index(s)); +- gen_helper_load_psw(tmp2, tmp3); ++ gen_helper_load_psw(cpu_env, tmp2, tmp3); + /* we need to keep cc_op intact */ + s->is_jmp = DISAS_JUMP; + tcg_temp_free_i64(tmp); +@@ -4527,7 +4527,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_gen_qemu_ld32u(tmp2, tmp, get_mem_index(s)); + tcg_gen_addi_i64(tmp, tmp, 4); + tcg_gen_qemu_ld32u(tmp3, tmp, get_mem_index(s)); +- gen_helper_load_psw(tmp2, tmp3); ++ gen_helper_load_psw(cpu_env, tmp2, tmp3); + tcg_temp_free_i64(tmp); + tcg_temp_free_i64(tmp2); + tcg_temp_free_i64(tmp3); +-- +1.7.12.1 + diff --git a/0014-target-s390x-avoid-AREG0-for-misc-helpers.patch b/0014-target-s390x-avoid-AREG0-for-misc-helpers.patch new file mode 100644 index 0000000..11ff8fb --- /dev/null +++ b/0014-target-s390x-avoid-AREG0-for-misc-helpers.patch @@ -0,0 +1,411 @@ +From 208547c7afbe6ee8a9a1f81095e67a6cbe4a37ec Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:39 +0000 +Subject: [PATCH] target-s390x: avoid AREG0 for misc helpers + +Make misc helpers take a parameter for CPUState instead +of relying on global env. + +Signed-off-by: Blue Swirl +[agraf: fix conflict] +Signed-off-by: Alexander Graf + +Signed-off-by: Michael Roth +--- + target-s390x/Makefile.objs | 1 - + target-s390x/helper.h | 26 +++++++++++----------- + target-s390x/mem_helper.c | 2 +- + target-s390x/misc_helper.c | 55 +++++++++++++++++++++++++--------------------- + target-s390x/translate.c | 32 +++++++++++++-------------- + 5 files changed, 60 insertions(+), 56 deletions(-) + +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index 736cf33..156d946 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -4,4 +4,3 @@ obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o + + $(obj)/mem_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +-$(obj)/misc_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/helper.h b/target-s390x/helper.h +index 876b88e..f4e0b37 100644 +--- a/target-s390x/helper.h ++++ b/target-s390x/helper.h +@@ -1,6 +1,6 @@ + #include "def-helper.h" + +-DEF_HELPER_1(exception, void, i32) ++DEF_HELPER_2(exception, void, env, i32) + DEF_HELPER_3(nc, i32, i32, i64, i64) + DEF_HELPER_3(oc, i32, i32, i64, i64) + DEF_HELPER_3(xc, i32, i32, i64, i64) +@@ -113,20 +113,20 @@ DEF_HELPER_FLAGS_1(cvd, TCG_CALL_PURE|TCG_CALL_CONST, i64, s32) + DEF_HELPER_3(unpk, void, i32, i64, i64) + DEF_HELPER_3(tr, void, i32, i64, i64) + +-DEF_HELPER_2(servc, i32, i32, i64) +-DEF_HELPER_3(diag, i64, i32, i64, i64) ++DEF_HELPER_3(servc, i32, env, i32, i64) ++DEF_HELPER_4(diag, i64, env, i32, i64, i64) + DEF_HELPER_3(load_psw, void, env, i64, i64) + DEF_HELPER_1(program_interrupt, void, i32) +-DEF_HELPER_FLAGS_1(stidp, TCG_CALL_CONST, void, i64) +-DEF_HELPER_FLAGS_1(spx, TCG_CALL_CONST, void, i64) ++DEF_HELPER_FLAGS_2(stidp, TCG_CALL_CONST, void, env, i64) ++DEF_HELPER_FLAGS_2(spx, TCG_CALL_CONST, void, env, i64) + DEF_HELPER_FLAGS_1(sck, TCG_CALL_CONST, i32, i64) +-DEF_HELPER_1(stck, i32, i64) +-DEF_HELPER_1(stcke, i32, i64) +-DEF_HELPER_FLAGS_1(sckc, TCG_CALL_CONST, void, i64) +-DEF_HELPER_FLAGS_1(stckc, TCG_CALL_CONST, void, i64) +-DEF_HELPER_FLAGS_1(spt, TCG_CALL_CONST, void, i64) +-DEF_HELPER_FLAGS_1(stpt, TCG_CALL_CONST, void, i64) +-DEF_HELPER_3(stsi, i32, i64, i32, i32) ++DEF_HELPER_2(stck, i32, env, i64) ++DEF_HELPER_2(stcke, i32, env, i64) ++DEF_HELPER_FLAGS_2(sckc, TCG_CALL_CONST, void, env, i64) ++DEF_HELPER_FLAGS_2(stckc, TCG_CALL_CONST, void, env, i64) ++DEF_HELPER_FLAGS_2(spt, TCG_CALL_CONST, void, env, i64) ++DEF_HELPER_FLAGS_2(stpt, TCG_CALL_CONST, void, env, i64) ++DEF_HELPER_4(stsi, i32, env, i64, i32, i32) + DEF_HELPER_3(lctl, void, i32, i64, i32) + DEF_HELPER_3(lctlg, void, i32, i64, i32) + DEF_HELPER_3(stctl, void, i32, i64, i32) +@@ -138,7 +138,7 @@ DEF_HELPER_FLAGS_2(rrbe, TCG_CALL_CONST, i32, i32, i64) + DEF_HELPER_2(csp, i32, i32, i32) + DEF_HELPER_3(mvcs, i32, i64, i64, i64) + DEF_HELPER_3(mvcp, i32, i64, i64, i64) +-DEF_HELPER_3(sigp, i32, i64, i32, i64) ++DEF_HELPER_4(sigp, i32, env, i64, i32, i64) + DEF_HELPER_2(sacf, void, env, i64) + DEF_HELPER_FLAGS_2(ipte, TCG_CALL_CONST, void, i64, i64) + DEF_HELPER_FLAGS_0(ptlb, TCG_CALL_CONST, void) +diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c +index 3f8b3ba..52f2602 100644 +--- a/target-s390x/mem_helper.c ++++ b/target-s390x/mem_helper.c +@@ -595,7 +595,7 @@ uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) + env->psw.addr = ret - 4; + env->int_svc_code = (insn | v1) & 0xff; + env->int_svc_ilc = 4; +- helper_exception(EXCP_SVC); ++ helper_exception(env, EXCP_SVC); + } else if ((insn & 0xff00) == 0xbf00) { + uint32_t insn2, r1, r3, b2, d2; + +diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c +index 1d5137f..ced26c6 100644 +--- a/target-s390x/misc_helper.c ++++ b/target-s390x/misc_helper.c +@@ -21,7 +21,6 @@ + #include "cpu.h" + #include "memory.h" + #include "cputlb.h" +-#include "dyngen-exec.h" + #include "host-utils.h" + #include "helper.h" + #include +@@ -32,7 +31,10 @@ + #endif + + #if !defined(CONFIG_USER_ONLY) ++/* temporarily disabled due to wrapper use */ ++#if 0 + #include "softmmu_exec.h" ++#endif + #include "sysemu.h" + #endif + +@@ -44,7 +46,7 @@ + #endif + + /* raise an exception */ +-void HELPER(exception)(uint32_t excp) ++void HELPER(exception)(CPUS390XState *env, uint32_t excp) + { + HELPER_LOG("%s: exception %d\n", __func__, excp); + env->exception_index = excp; +@@ -112,7 +114,7 @@ int sclp_service_call(CPUS390XState *env, uint32_t sccb, uint64_t code) + } + + /* SCLP service call */ +-uint32_t HELPER(servc)(uint32_t r1, uint64_t r2) ++uint32_t HELPER(servc)(CPUS390XState *env, uint32_t r1, uint64_t r2) + { + int r; + +@@ -125,7 +127,8 @@ uint32_t HELPER(servc)(uint32_t r1, uint64_t r2) + } + + /* DIAG */ +-uint64_t HELPER(diag)(uint32_t num, uint64_t mem, uint64_t code) ++uint64_t HELPER(diag)(CPUS390XState *env, uint32_t num, uint64_t mem, ++ uint64_t code) + { + uint64_t r; + +@@ -155,17 +158,17 @@ uint64_t HELPER(diag)(uint32_t num, uint64_t mem, uint64_t code) + } + + /* Store CPU ID */ +-void HELPER(stidp)(uint64_t a1) ++void HELPER(stidp)(CPUS390XState *env, uint64_t a1) + { +- stq(a1, env->cpu_num); ++ cpu_stq_data(env, a1, env->cpu_num); + } + + /* Set Prefix */ +-void HELPER(spx)(uint64_t a1) ++void HELPER(spx)(CPUS390XState *env, uint64_t a1) + { + uint32_t prefix; + +- prefix = ldl(a1); ++ prefix = cpu_ldl_data(env, a1); + env->psa = prefix & 0xfffff000; + qemu_log("prefix: %#x\n", prefix); + tlb_flush_page(env, 0); +@@ -191,31 +194,31 @@ static inline uint64_t clock_value(CPUS390XState *env) + } + + /* Store Clock */ +-uint32_t HELPER(stck)(uint64_t a1) ++uint32_t HELPER(stck)(CPUS390XState *env, uint64_t a1) + { +- stq(a1, clock_value(env)); ++ cpu_stq_data(env, a1, clock_value(env)); + + return 0; + } + + /* Store Clock Extended */ +-uint32_t HELPER(stcke)(uint64_t a1) ++uint32_t HELPER(stcke)(CPUS390XState *env, uint64_t a1) + { +- stb(a1, 0); ++ cpu_stb_data(env, a1, 0); + /* basically the same value as stck */ +- stq(a1 + 1, clock_value(env) | env->cpu_num); ++ cpu_stq_data(env, a1 + 1, clock_value(env) | env->cpu_num); + /* more fine grained than stck */ +- stq(a1 + 9, 0); ++ cpu_stq_data(env, a1 + 9, 0); + /* XXX programmable fields */ +- stw(a1 + 17, 0); ++ cpu_stw_data(env, a1 + 17, 0); + + return 0; + } + + /* Set Clock Comparator */ +-void HELPER(sckc)(uint64_t a1) ++void HELPER(sckc)(CPUS390XState *env, uint64_t a1) + { +- uint64_t time = ldq(a1); ++ uint64_t time = cpu_ldq_data(env, a1); + + if (time == -1ULL) { + return; +@@ -230,16 +233,16 @@ void HELPER(sckc)(uint64_t a1) + } + + /* Store Clock Comparator */ +-void HELPER(stckc)(uint64_t a1) ++void HELPER(stckc)(CPUS390XState *env, uint64_t a1) + { + /* XXX implement */ +- stq(a1, 0); ++ cpu_stq_data(env, a1, 0); + } + + /* Set CPU Timer */ +-void HELPER(spt)(uint64_t a1) ++void HELPER(spt)(CPUS390XState *env, uint64_t a1) + { +- uint64_t time = ldq(a1); ++ uint64_t time = cpu_ldq_data(env, a1); + + if (time == -1ULL) { + return; +@@ -252,14 +255,15 @@ void HELPER(spt)(uint64_t a1) + } + + /* Store CPU Timer */ +-void HELPER(stpt)(uint64_t a1) ++void HELPER(stpt)(CPUS390XState *env, uint64_t a1) + { + /* XXX implement */ +- stq(a1, 0); ++ cpu_stq_data(env, a1, 0); + } + + /* Store System Information */ +-uint32_t HELPER(stsi)(uint64_t a0, uint32_t r0, uint32_t r1) ++uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0, uint32_t r0, ++ uint32_t r1) + { + int cc = 0; + int sel1, sel2; +@@ -384,7 +388,8 @@ uint32_t HELPER(stsi)(uint64_t a0, uint32_t r0, uint32_t r1) + return cc; + } + +-uint32_t HELPER(sigp)(uint64_t order_code, uint32_t r1, uint64_t cpu_addr) ++uint32_t HELPER(sigp)(CPUS390XState *env, uint64_t order_code, uint32_t r1, ++ uint64_t cpu_addr) + { + int cc = 0; + +diff --git a/target-s390x/translate.c b/target-s390x/translate.c +index 1d87272..0c61e63 100644 +--- a/target-s390x/translate.c ++++ b/target-s390x/translate.c +@@ -312,7 +312,7 @@ static inline void gen_debug(DisasContext *s) + TCGv_i32 tmp = tcg_const_i32(EXCP_DEBUG); + update_psw_addr(s); + gen_op_calc_cc(s); +- gen_helper_exception(tmp); ++ gen_helper_exception(cpu_env, tmp); + tcg_temp_free_i32(tmp); + s->is_jmp = DISAS_EXCP; + } +@@ -324,7 +324,7 @@ static void gen_illegal_opcode(DisasContext *s, int ilc) + TCGv_i32 tmp = tcg_const_i32(EXCP_SPEC); + update_psw_addr(s); + gen_op_calc_cc(s); +- gen_helper_exception(tmp); ++ gen_helper_exception(cpu_env, tmp); + tcg_temp_free_i32(tmp); + s->is_jmp = DISAS_EXCP; + } +@@ -377,7 +377,7 @@ static void gen_program_exception(DisasContext *s, int ilc, int code) + + /* trigger exception */ + tmp = tcg_const_i32(EXCP_PGM); +- gen_helper_exception(tmp); ++ gen_helper_exception(cpu_env, tmp); + tcg_temp_free_i32(tmp); + + /* end TB here */ +@@ -2712,7 +2712,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_stidp(tmp); ++ gen_helper_stidp(cpu_env, tmp); + tcg_temp_free_i64(tmp); + break; + case 0x04: /* SCK D2(B2) [S] */ +@@ -2730,7 +2730,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_stck(cc_op, tmp); ++ gen_helper_stck(cc_op, cpu_env, tmp); + set_cc_static(s); + tcg_temp_free_i64(tmp); + break; +@@ -2740,7 +2740,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_sckc(tmp); ++ gen_helper_sckc(cpu_env, tmp); + tcg_temp_free_i64(tmp); + break; + case 0x07: /* STCKC D2(B2) [S] */ +@@ -2749,7 +2749,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_stckc(tmp); ++ gen_helper_stckc(cpu_env, tmp); + tcg_temp_free_i64(tmp); + break; + case 0x08: /* SPT D2(B2) [S] */ +@@ -2758,7 +2758,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_spt(tmp); ++ gen_helper_spt(cpu_env, tmp); + tcg_temp_free_i64(tmp); + break; + case 0x09: /* STPT D2(B2) [S] */ +@@ -2767,7 +2767,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_stpt(tmp); ++ gen_helper_stpt(cpu_env, tmp); + tcg_temp_free_i64(tmp); + break; + case 0x0a: /* SPKA D2(B2) [S] */ +@@ -2793,7 +2793,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_spx(tmp); ++ gen_helper_spx(cpu_env, tmp); + tcg_temp_free_i64(tmp); + break; + case 0x11: /* STPX D2(B2) [S] */ +@@ -2906,7 +2906,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +- gen_helper_stcke(cc_op, tmp); ++ gen_helper_stcke(cc_op, cpu_env, tmp); + set_cc_static(s); + tcg_temp_free_i64(tmp); + break; +@@ -2930,7 +2930,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + tmp32_1 = load_reg32(0); + tmp32_2 = load_reg32(1); + potential_page_fault(s); +- gen_helper_stsi(cc_op, tmp, tmp32_1, tmp32_2); ++ gen_helper_stsi(cc_op, cpu_env, tmp, tmp32_1, tmp32_2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -2980,7 +2980,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + potential_page_fault(s); + tmp32_1 = load_reg32(r2); + tmp = load_reg(r1); +- gen_helper_servc(cc_op, tmp32_1, tmp); ++ gen_helper_servc(cc_op, cpu_env, tmp32_1, tmp); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i64(tmp); +@@ -3926,7 +3926,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_3 = tcg_const_i32(EXCP_SVC); + tcg_gen_st_i32(tmp32_1, cpu_env, offsetof(CPUS390XState, int_svc_code)); + tcg_gen_st_i32(tmp32_2, cpu_env, offsetof(CPUS390XState, int_svc_ilc)); +- gen_helper_exception(tmp32_3); ++ gen_helper_exception(cpu_env, tmp32_3); + s->is_jmp = DISAS_EXCP; + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -4543,7 +4543,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(insn & 0xfff); + tmp2 = load_reg(2); + tmp3 = load_reg(1); +- gen_helper_diag(tmp2, tmp32_1, tmp2, tmp3); ++ gen_helper_diag(tmp2, cpu_env, tmp32_1, tmp2, tmp3); + store_reg(2, tmp2); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i64(tmp2); +@@ -4777,7 +4777,7 @@ static void disas_s390_insn(DisasContext *s) + tmp2 = load_reg(r3); + tmp32_1 = tcg_const_i32(r1); + potential_page_fault(s); +- gen_helper_sigp(cc_op, tmp, tmp32_1, tmp2); ++ gen_helper_sigp(cc_op, cpu_env, tmp, tmp32_1, tmp2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i64(tmp2); +-- +1.7.12.1 + diff --git a/0015-target-s390x-switch-to-AREG0-free-mode.patch b/0015-target-s390x-switch-to-AREG0-free-mode.patch new file mode 100644 index 0000000..2329cb2 --- /dev/null +++ b/0015-target-s390x-switch-to-AREG0-free-mode.patch @@ -0,0 +1,1584 @@ +From 77fb132a1dc3780a57d8a1e889b366f0492963a5 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:33:40 +0000 +Subject: [PATCH] target-s390x: switch to AREG0 free mode + +Add an explicit CPUState parameter instead of relying on AREG0. + +Remove temporary wrappers and switch to AREG0 free mode. + +Signed-off-by: Blue Swirl +[agraf: fix conflicts] +Signed-off-by: Alexander Graf + +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-s390x/Makefile.objs | 2 - + target-s390x/cpu.h | 10 -- + target-s390x/fpu_helper.c | 3 +- + target-s390x/helper.c | 6 +- + target-s390x/helper.h | 78 +++++------ + target-s390x/mem_helper.c | 338 ++++++++++++++++++++------------------------- + target-s390x/misc_helper.c | 3 - + target-s390x/translate.c | 88 ++++++------ + 9 files changed, 239 insertions(+), 291 deletions(-) + +diff --git a/configure b/configure +index bf3acc8..3ad6f74 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | i386 | or32 | sparc* | x86_64 | xtensa* | ppc*) ++ alpha | i386 | or32 | s390x | sparc* | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs +index 156d946..e728abf 100644 +--- a/target-s390x/Makefile.objs ++++ b/target-s390x/Makefile.objs +@@ -2,5 +2,3 @@ obj-y += translate.o helper.o cpu.o interrupt.o + obj-y += int_helper.o fpu_helper.o cc_helper.o mem_helper.o misc_helper.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-$(CONFIG_KVM) += kvm.o +- +-$(obj)/mem_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h +index 9b7a2e3..ed81af3 100644 +--- a/target-s390x/cpu.h ++++ b/target-s390x/cpu.h +@@ -1008,14 +1008,4 @@ uint32_t set_cc_nz_f64(float64 v); + /* misc_helper.c */ + void program_interrupt(CPUS390XState *env, uint32_t code, int ilc); + +-/* temporary wrappers */ +-uint32_t cpu_ldub_data(CPUS390XState *env, target_ulong ptr); +-uint32_t cpu_lduw_data(CPUS390XState *env, target_ulong ptr); +-uint32_t cpu_ldl_data(CPUS390XState *env, target_ulong ptr); +-uint64_t cpu_ldq_data(CPUS390XState *env, target_ulong ptr); +- +-void cpu_stb_data(CPUS390XState *env, target_ulong ptr, uint32_t data); +-void cpu_stw_data(CPUS390XState *env, target_ulong ptr, uint32_t data); +-void cpu_stl_data(CPUS390XState *env, target_ulong ptr, uint32_t data); +-void cpu_stq_data(CPUS390XState *env, target_ulong ptr, uint64_t data); + #endif +diff --git a/target-s390x/fpu_helper.c b/target-s390x/fpu_helper.c +index e235419..ee9420d 100644 +--- a/target-s390x/fpu_helper.c ++++ b/target-s390x/fpu_helper.c +@@ -21,8 +21,7 @@ + #include "cpu.h" + #include "helper.h" + +-/* temporarily disabled due to wrapper use */ +-#if 0 && !defined(CONFIG_USER_ONLY) ++#if !defined(CONFIG_USER_ONLY) + #include "softmmu_exec.h" + #endif + +diff --git a/target-s390x/helper.c b/target-s390x/helper.c +index d98e6d9..a5741ec 100644 +--- a/target-s390x/helper.c ++++ b/target-s390x/helper.c +@@ -499,14 +499,14 @@ static void do_program_interrupt(CPUS390XState *env) + + switch (ilc) { + case ILC_LATER: +- ilc = get_ilc(ldub_code(env->psw.addr)); ++ ilc = get_ilc(cpu_ldub_code(env, env->psw.addr)); + break; + case ILC_LATER_INC: +- ilc = get_ilc(ldub_code(env->psw.addr)); ++ ilc = get_ilc(cpu_ldub_code(env, env->psw.addr)); + env->psw.addr += ilc * 2; + break; + case ILC_LATER_INC_2: +- ilc = get_ilc(ldub_code(env->psw.addr)) * 2; ++ ilc = get_ilc(cpu_ldub_code(env, env->psw.addr)) * 2; + env->psw.addr += ilc; + break; + } +diff --git a/target-s390x/helper.h b/target-s390x/helper.h +index f4e0b37..5419f37 100644 +--- a/target-s390x/helper.h ++++ b/target-s390x/helper.h +@@ -1,17 +1,17 @@ + #include "def-helper.h" + + DEF_HELPER_2(exception, void, env, i32) +-DEF_HELPER_3(nc, i32, i32, i64, i64) +-DEF_HELPER_3(oc, i32, i32, i64, i64) +-DEF_HELPER_3(xc, i32, i32, i64, i64) +-DEF_HELPER_3(mvc, void, i32, i64, i64) +-DEF_HELPER_3(clc, i32, i32, i64, i64) +-DEF_HELPER_2(mvcl, i32, i32, i32) ++DEF_HELPER_4(nc, i32, env, i32, i64, i64) ++DEF_HELPER_4(oc, i32, env, i32, i64, i64) ++DEF_HELPER_4(xc, i32, env, i32, i64, i64) ++DEF_HELPER_4(mvc, void, env, i32, i64, i64) ++DEF_HELPER_4(clc, i32, env, i32, i64, i64) ++DEF_HELPER_3(mvcl, i32, env, i32, i32) + DEF_HELPER_FLAGS_1(set_cc_comp_s32, TCG_CALL_PURE|TCG_CALL_CONST, i32, s32) + DEF_HELPER_FLAGS_1(set_cc_comp_s64, TCG_CALL_PURE|TCG_CALL_CONST, i32, s64) + DEF_HELPER_FLAGS_2(set_cc_icm, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32) +-DEF_HELPER_3(clm, i32, i32, i32, i64) +-DEF_HELPER_3(stcm, void, i32, i32, i64) ++DEF_HELPER_4(clm, i32, env, i32, i32, i64) ++DEF_HELPER_4(stcm, void, env, i32, i32, i64) + DEF_HELPER_3(mlg, void, env, i32, i64) + DEF_HELPER_3(dlg, void, env, i32, i64) + DEF_HELPER_FLAGS_3(set_cc_add64, TCG_CALL_PURE|TCG_CALL_CONST, i32, s64, s64, s64) +@@ -22,27 +22,27 @@ DEF_HELPER_FLAGS_3(set_cc_sub64, TCG_CALL_PURE|TCG_CALL_CONST, i32, s64, s64, s6 + DEF_HELPER_FLAGS_3(set_cc_subu64, TCG_CALL_PURE|TCG_CALL_CONST, i32, i64, i64, i64) + DEF_HELPER_FLAGS_3(set_cc_sub32, TCG_CALL_PURE|TCG_CALL_CONST, i32, s32, s32, s32) + DEF_HELPER_FLAGS_3(set_cc_subu32, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32, i32) +-DEF_HELPER_3(srst, i32, i32, i32, i32) +-DEF_HELPER_3(clst, i32, i32, i32, i32) +-DEF_HELPER_3(mvpg, void, i64, i64, i64) +-DEF_HELPER_3(mvst, void, i32, i32, i32) +-DEF_HELPER_3(csg, i32, i32, i64, i32) +-DEF_HELPER_3(cdsg, i32, i32, i64, i32) +-DEF_HELPER_3(cs, i32, i32, i64, i32) +-DEF_HELPER_4(ex, i32, i32, i64, i64, i64) ++DEF_HELPER_4(srst, i32, env, i32, i32, i32) ++DEF_HELPER_4(clst, i32, env, i32, i32, i32) ++DEF_HELPER_4(mvpg, void, env, i64, i64, i64) ++DEF_HELPER_4(mvst, void, env, i32, i32, i32) ++DEF_HELPER_4(csg, i32, env, i32, i64, i32) ++DEF_HELPER_4(cdsg, i32, env, i32, i64, i32) ++DEF_HELPER_4(cs, i32, env, i32, i64, i32) ++DEF_HELPER_5(ex, i32, env, i32, i64, i64, i64) + DEF_HELPER_FLAGS_1(abs_i32, TCG_CALL_PURE|TCG_CALL_CONST, i32, s32) + DEF_HELPER_FLAGS_1(nabs_i32, TCG_CALL_PURE|TCG_CALL_CONST, s32, s32) + DEF_HELPER_FLAGS_1(abs_i64, TCG_CALL_PURE|TCG_CALL_CONST, i64, s64) + DEF_HELPER_FLAGS_1(nabs_i64, TCG_CALL_PURE|TCG_CALL_CONST, s64, s64) +-DEF_HELPER_3(stcmh, void, i32, i64, i32) +-DEF_HELPER_3(icmh, i32, i32, i64, i32) ++DEF_HELPER_4(stcmh, void, env, i32, i64, i32) ++DEF_HELPER_4(icmh, i32, env, i32, i64, i32) + DEF_HELPER_3(ipm, void, env, i32, i32) + DEF_HELPER_FLAGS_3(addc_u32, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32, i32) + DEF_HELPER_FLAGS_3(set_cc_addc_u64, TCG_CALL_PURE|TCG_CALL_CONST, i32, i64, i64, i64) +-DEF_HELPER_3(stam, void, i32, i64, i32) +-DEF_HELPER_3(lam, void, i32, i64, i32) +-DEF_HELPER_3(mvcle, i32, i32, i64, i32) +-DEF_HELPER_3(clcle, i32, i32, i64, i32) ++DEF_HELPER_4(stam, void, env, i32, i64, i32) ++DEF_HELPER_4(lam, void, env, i32, i64, i32) ++DEF_HELPER_4(mvcle, i32, env, i32, i64, i32) ++DEF_HELPER_4(clcle, i32, env, i32, i64, i32) + DEF_HELPER_4(slb, i32, env, i32, i32, i32) + DEF_HELPER_5(slbg, i32, env, i32, i32, i64, i64) + DEF_HELPER_3(cefbr, void, env, i32, s32) +@@ -110,8 +110,8 @@ DEF_HELPER_FLAGS_3(tcxb, TCG_CALL_PURE, i32, env, i32, i64) + DEF_HELPER_3(flogr, i32, env, i32, i64) + DEF_HELPER_3(sqdbr, void, env, i32, i32) + DEF_HELPER_FLAGS_1(cvd, TCG_CALL_PURE|TCG_CALL_CONST, i64, s32) +-DEF_HELPER_3(unpk, void, i32, i64, i64) +-DEF_HELPER_3(tr, void, i32, i64, i64) ++DEF_HELPER_4(unpk, void, env, i32, i64, i64) ++DEF_HELPER_4(tr, void, env, i32, i64, i64) + + DEF_HELPER_3(servc, i32, env, i32, i64) + DEF_HELPER_4(diag, i64, env, i32, i64, i64) +@@ -127,24 +127,24 @@ DEF_HELPER_FLAGS_2(stckc, TCG_CALL_CONST, void, env, i64) + DEF_HELPER_FLAGS_2(spt, TCG_CALL_CONST, void, env, i64) + DEF_HELPER_FLAGS_2(stpt, TCG_CALL_CONST, void, env, i64) + DEF_HELPER_4(stsi, i32, env, i64, i32, i32) +-DEF_HELPER_3(lctl, void, i32, i64, i32) +-DEF_HELPER_3(lctlg, void, i32, i64, i32) +-DEF_HELPER_3(stctl, void, i32, i64, i32) +-DEF_HELPER_3(stctg, void, i32, i64, i32) ++DEF_HELPER_4(lctl, void, env, i32, i64, i32) ++DEF_HELPER_4(lctlg, void, env, i32, i64, i32) ++DEF_HELPER_4(stctl, void, env, i32, i64, i32) ++DEF_HELPER_4(stctg, void, env, i32, i64, i32) + DEF_HELPER_FLAGS_2(tprot, TCG_CALL_CONST, i32, i64, i64) +-DEF_HELPER_FLAGS_1(iske, TCG_CALL_PURE|TCG_CALL_CONST, i64, i64) +-DEF_HELPER_FLAGS_2(sske, TCG_CALL_CONST, void, i32, i64) +-DEF_HELPER_FLAGS_2(rrbe, TCG_CALL_CONST, i32, i32, i64) +-DEF_HELPER_2(csp, i32, i32, i32) +-DEF_HELPER_3(mvcs, i32, i64, i64, i64) +-DEF_HELPER_3(mvcp, i32, i64, i64, i64) ++DEF_HELPER_FLAGS_2(iske, TCG_CALL_PURE|TCG_CALL_CONST, i64, env, i64) ++DEF_HELPER_FLAGS_3(sske, TCG_CALL_CONST, void, env, i32, i64) ++DEF_HELPER_FLAGS_3(rrbe, TCG_CALL_CONST, i32, env, i32, i64) ++DEF_HELPER_3(csp, i32, env, i32, i32) ++DEF_HELPER_4(mvcs, i32, env, i64, i64, i64) ++DEF_HELPER_4(mvcp, i32, env, i64, i64, i64) + DEF_HELPER_4(sigp, i32, env, i64, i32, i64) + DEF_HELPER_2(sacf, void, env, i64) +-DEF_HELPER_FLAGS_2(ipte, TCG_CALL_CONST, void, i64, i64) +-DEF_HELPER_FLAGS_0(ptlb, TCG_CALL_CONST, void) +-DEF_HELPER_2(lra, i32, i64, i32) +-DEF_HELPER_2(stura, void, i64, i32) +-DEF_HELPER_2(cksm, void, i32, i32) ++DEF_HELPER_FLAGS_3(ipte, TCG_CALL_CONST, void, env, i64, i64) ++DEF_HELPER_FLAGS_1(ptlb, TCG_CALL_CONST, void, env) ++DEF_HELPER_3(lra, i32, env, i64, i32) ++DEF_HELPER_3(stura, void, env, i64, i32) ++DEF_HELPER_3(cksm, void, env, i32, i32) + + DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_PURE|TCG_CALL_CONST, + i32, env, i32, i64, i64, i64) +diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c +index 52f2602..b21b37c 100644 +--- a/target-s390x/mem_helper.c ++++ b/target-s390x/mem_helper.c +@@ -19,7 +19,6 @@ + */ + + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helper.h" + + /*****************************************************************************/ +@@ -45,15 +44,12 @@ + NULL, it means that the function was called in C code (i.e. not + from generated code or from helper.c) */ + /* XXX: fix it to restore all registers */ +-void tlb_fill(CPUS390XState *env1, target_ulong addr, int is_write, int mmu_idx, ++void tlb_fill(CPUS390XState *env, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) + { + TranslationBlock *tb; +- CPUS390XState *saved_env; + int ret; + +- saved_env = env; +- env = env1; + ret = cpu_s390x_handle_mmu_fault(env, addr, is_write, mmu_idx); + if (unlikely(ret != 0)) { + if (likely(retaddr)) { +@@ -67,7 +63,6 @@ void tlb_fill(CPUS390XState *env1, target_ulong addr, int is_write, int mmu_idx, + } + cpu_loop_exit(env); + } +- env = saved_env; + } + + #endif +@@ -90,7 +85,7 @@ static void mvc_fast_memset(CPUS390XState *env, uint32_t l, uint64_t dest, + int flags; + + if (mmu_translate(env, dest, 1, asc, &dest_phys, &flags)) { +- stb(dest, byte); ++ cpu_stb_data(env, dest, byte); + cpu_abort(env, "should never reach here"); + } + dest_phys |= dest & ~TARGET_PAGE_MASK; +@@ -114,13 +109,13 @@ static void mvc_fast_memmove(CPUS390XState *env, uint32_t l, uint64_t dest, + int flags; + + if (mmu_translate(env, dest, 1, asc, &dest_phys, &flags)) { +- stb(dest, 0); ++ cpu_stb_data(env, dest, 0); + cpu_abort(env, "should never reach here"); + } + dest_phys |= dest & ~TARGET_PAGE_MASK; + + if (mmu_translate(env, src, 0, asc, &src_phys, &flags)) { +- ldub(src); ++ cpu_ldub_data(env, src); + cpu_abort(env, "should never reach here"); + } + src_phys |= src & ~TARGET_PAGE_MASK; +@@ -136,7 +131,8 @@ static void mvc_fast_memmove(CPUS390XState *env, uint32_t l, uint64_t dest, + #endif + + /* and on array */ +-uint32_t HELPER(nc)(uint32_t l, uint64_t dest, uint64_t src) ++uint32_t HELPER(nc)(CPUS390XState *env, uint32_t l, uint64_t dest, ++ uint64_t src) + { + int i; + unsigned char x; +@@ -145,17 +141,18 @@ uint32_t HELPER(nc)(uint32_t l, uint64_t dest, uint64_t src) + HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", + __func__, l, dest, src); + for (i = 0; i <= l; i++) { +- x = ldub(dest + i) & ldub(src + i); ++ x = cpu_ldub_data(env, dest + i) & cpu_ldub_data(env, src + i); + if (x) { + cc = 1; + } +- stb(dest + i, x); ++ cpu_stb_data(env, dest + i, x); + } + return cc; + } + + /* xor on array */ +-uint32_t HELPER(xc)(uint32_t l, uint64_t dest, uint64_t src) ++uint32_t HELPER(xc)(CPUS390XState *env, uint32_t l, uint64_t dest, ++ uint64_t src) + { + int i; + unsigned char x; +@@ -179,17 +176,18 @@ uint32_t HELPER(xc)(uint32_t l, uint64_t dest, uint64_t src) + #endif + + for (i = 0; i <= l; i++) { +- x = ldub(dest + i) ^ ldub(src + i); ++ x = cpu_ldub_data(env, dest + i) ^ cpu_ldub_data(env, src + i); + if (x) { + cc = 1; + } +- stb(dest + i, x); ++ cpu_stb_data(env, dest + i, x); + } + return cc; + } + + /* or on array */ +-uint32_t HELPER(oc)(uint32_t l, uint64_t dest, uint64_t src) ++uint32_t HELPER(oc)(CPUS390XState *env, uint32_t l, uint64_t dest, ++ uint64_t src) + { + int i; + unsigned char x; +@@ -198,17 +196,17 @@ uint32_t HELPER(oc)(uint32_t l, uint64_t dest, uint64_t src) + HELPER_LOG("%s l %d dest %" PRIx64 " src %" PRIx64 "\n", + __func__, l, dest, src); + for (i = 0; i <= l; i++) { +- x = ldub(dest + i) | ldub(src + i); ++ x = cpu_ldub_data(env, dest + i) | cpu_ldub_data(env, src + i); + if (x) { + cc = 1; + } +- stb(dest + i, x); ++ cpu_stb_data(env, dest + i, x); + } + return cc; + } + + /* memmove */ +-void HELPER(mvc)(uint32_t l, uint64_t dest, uint64_t src) ++void HELPER(mvc)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src) + { + int i = 0; + int x = 0; +@@ -222,7 +220,7 @@ void HELPER(mvc)(uint32_t l, uint64_t dest, uint64_t src) + (src & TARGET_PAGE_MASK) == ((src + l) & TARGET_PAGE_MASK) && + (dest & TARGET_PAGE_MASK) == ((dest + l) & TARGET_PAGE_MASK)) { + if (dest == (src + 1)) { +- mvc_fast_memset(env, l + 1, dest, ldub(src)); ++ mvc_fast_memset(env, l + 1, dest, cpu_ldub_data(env, src)); + return; + } else if ((src & TARGET_PAGE_MASK) != (dest & TARGET_PAGE_MASK)) { + mvc_fast_memmove(env, l + 1, dest, src); +@@ -231,7 +229,7 @@ void HELPER(mvc)(uint32_t l, uint64_t dest, uint64_t src) + } + #else + if (dest == (src + 1)) { +- memset(g2h(dest), ldub(src), l + 1); ++ memset(g2h(dest), cpu_ldub_data(env, src), l + 1); + return; + } else { + memmove(g2h(dest), g2h(src), l + 1); +@@ -242,19 +240,19 @@ void HELPER(mvc)(uint32_t l, uint64_t dest, uint64_t src) + /* handle the parts that fit into 8-byte loads/stores */ + if (dest != (src + 1)) { + for (i = 0; i < l_64; i++) { +- stq(dest + x, ldq(src + x)); ++ cpu_stq_data(env, dest + x, cpu_ldq_data(env, src + x)); + x += 8; + } + } + + /* slow version crossing pages with byte accesses */ + for (i = x; i <= l; i++) { +- stb(dest + i, ldub(src + i)); ++ cpu_stb_data(env, dest + i, cpu_ldub_data(env, src + i)); + } + } + + /* compare unsigned byte arrays */ +-uint32_t HELPER(clc)(uint32_t l, uint64_t s1, uint64_t s2) ++uint32_t HELPER(clc)(CPUS390XState *env, uint32_t l, uint64_t s1, uint64_t s2) + { + int i; + unsigned char x, y; +@@ -263,8 +261,8 @@ uint32_t HELPER(clc)(uint32_t l, uint64_t s1, uint64_t s2) + HELPER_LOG("%s l %d s1 %" PRIx64 " s2 %" PRIx64 "\n", + __func__, l, s1, s2); + for (i = 0; i <= l; i++) { +- x = ldub(s1 + i); +- y = ldub(s2 + i); ++ x = cpu_ldub_data(env, s1 + i); ++ y = cpu_ldub_data(env, s2 + i); + HELPER_LOG("%02x (%c)/%02x (%c) ", x, x, y, y); + if (x < y) { + cc = 1; +@@ -281,7 +279,8 @@ uint32_t HELPER(clc)(uint32_t l, uint64_t s1, uint64_t s2) + } + + /* compare logical under mask */ +-uint32_t HELPER(clm)(uint32_t r1, uint32_t mask, uint64_t addr) ++uint32_t HELPER(clm)(CPUS390XState *env, uint32_t r1, uint32_t mask, ++ uint64_t addr) + { + uint8_t r, d; + uint32_t cc; +@@ -291,7 +290,7 @@ uint32_t HELPER(clm)(uint32_t r1, uint32_t mask, uint64_t addr) + cc = 0; + while (mask) { + if (mask & 8) { +- d = ldub(addr); ++ d = cpu_ldub_data(env, addr); + r = (r1 & 0xff000000UL) >> 24; + HELPER_LOG("mask 0x%x %02x/%02x (0x%" PRIx64 ") ", mask, r, d, + addr); +@@ -312,7 +311,8 @@ uint32_t HELPER(clm)(uint32_t r1, uint32_t mask, uint64_t addr) + } + + /* store character under mask */ +-void HELPER(stcm)(uint32_t r1, uint32_t mask, uint64_t addr) ++void HELPER(stcm)(CPUS390XState *env, uint32_t r1, uint32_t mask, ++ uint64_t addr) + { + uint8_t r; + +@@ -321,7 +321,7 @@ void HELPER(stcm)(uint32_t r1, uint32_t mask, uint64_t addr) + while (mask) { + if (mask & 8) { + r = (r1 & 0xff000000UL) >> 24; +- stb(addr, r); ++ cpu_stb_data(env, addr, r); + HELPER_LOG("mask 0x%x %02x (0x%lx) ", mask, r, addr); + addr++; + } +@@ -331,7 +331,7 @@ void HELPER(stcm)(uint32_t r1, uint32_t mask, uint64_t addr) + HELPER_LOG("\n"); + } + +-static inline uint64_t get_address(int x2, int b2, int d2) ++static inline uint64_t get_address(CPUS390XState *env, int x2, int b2, int d2) + { + uint64_t r = d2; + +@@ -351,7 +351,7 @@ static inline uint64_t get_address(int x2, int b2, int d2) + return r; + } + +-static inline uint64_t get_address_31fix(int reg) ++static inline uint64_t get_address_31fix(CPUS390XState *env, int reg) + { + uint64_t r = env->regs[reg]; + +@@ -364,18 +364,18 @@ static inline uint64_t get_address_31fix(int reg) + } + + /* search string (c is byte to search, r2 is string, r1 end of string) */ +-uint32_t HELPER(srst)(uint32_t c, uint32_t r1, uint32_t r2) ++uint32_t HELPER(srst)(CPUS390XState *env, uint32_t c, uint32_t r1, uint32_t r2) + { + uint64_t i; + uint32_t cc = 2; +- uint64_t str = get_address_31fix(r2); +- uint64_t end = get_address_31fix(r1); ++ uint64_t str = get_address_31fix(env, r2); ++ uint64_t end = get_address_31fix(env, r1); + + HELPER_LOG("%s: c %d *r1 0x%" PRIx64 " *r2 0x%" PRIx64 "\n", __func__, + c, env->regs[r1], env->regs[r2]); + + for (i = str; i != end; i++) { +- if (ldub(i) == c) { ++ if (cpu_ldub_data(env, i) == c) { + env->regs[r1] = i; + cc = 1; + break; +@@ -386,10 +386,10 @@ uint32_t HELPER(srst)(uint32_t c, uint32_t r1, uint32_t r2) + } + + /* unsigned string compare (c is string terminator) */ +-uint32_t HELPER(clst)(uint32_t c, uint32_t r1, uint32_t r2) ++uint32_t HELPER(clst)(CPUS390XState *env, uint32_t c, uint32_t r1, uint32_t r2) + { +- uint64_t s1 = get_address_31fix(r1); +- uint64_t s2 = get_address_31fix(r2); ++ uint64_t s1 = get_address_31fix(env, r1); ++ uint64_t s2 = get_address_31fix(env, r2); + uint8_t v1, v2; + uint32_t cc; + +@@ -401,8 +401,8 @@ uint32_t HELPER(clst)(uint32_t c, uint32_t r1, uint32_t r2) + } + #endif + for (;;) { +- v1 = ldub(s1); +- v2 = ldub(s2); ++ v1 = cpu_ldub_data(env, s1); ++ v2 = cpu_ldub_data(env, s2); + if ((v1 == c || v2 == c) || (v1 != v2)) { + break; + } +@@ -422,14 +422,14 @@ uint32_t HELPER(clst)(uint32_t c, uint32_t r1, uint32_t r2) + } + + /* move page */ +-void HELPER(mvpg)(uint64_t r0, uint64_t r1, uint64_t r2) ++void HELPER(mvpg)(CPUS390XState *env, uint64_t r0, uint64_t r1, uint64_t r2) + { + /* XXX missing r0 handling */ + #ifdef CONFIG_USER_ONLY + int i; + + for (i = 0; i < TARGET_PAGE_SIZE; i++) { +- stb(r1 + i, ldub(r2 + i)); ++ cpu_stb_data(env, r1 + i, cpu_ldub_data(env, r2 + i)); + } + #else + mvc_fast_memmove(env, TARGET_PAGE_SIZE, r1, r2); +@@ -437,10 +437,10 @@ void HELPER(mvpg)(uint64_t r0, uint64_t r1, uint64_t r2) + } + + /* string copy (c is string terminator) */ +-void HELPER(mvst)(uint32_t c, uint32_t r1, uint32_t r2) ++void HELPER(mvst)(CPUS390XState *env, uint32_t c, uint32_t r1, uint32_t r2) + { +- uint64_t dest = get_address_31fix(r1); +- uint64_t src = get_address_31fix(r2); ++ uint64_t dest = get_address_31fix(env, r1); ++ uint64_t src = get_address_31fix(env, r2); + uint8_t v; + + c = c & 0xff; +@@ -451,8 +451,8 @@ void HELPER(mvst)(uint32_t c, uint32_t r1, uint32_t r2) + } + #endif + for (;;) { +- v = ldub(src); +- stb(dest, v); ++ v = cpu_ldub_data(env, src); ++ cpu_stb_data(env, dest, v); + if (v == c) { + break; + } +@@ -463,15 +463,15 @@ void HELPER(mvst)(uint32_t c, uint32_t r1, uint32_t r2) + } + + /* compare and swap 64-bit */ +-uint32_t HELPER(csg)(uint32_t r1, uint64_t a2, uint32_t r3) ++uint32_t HELPER(csg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + /* FIXME: locking? */ + uint32_t cc; +- uint64_t v2 = ldq(a2); ++ uint64_t v2 = cpu_ldq_data(env, a2); + + if (env->regs[r1] == v2) { + cc = 0; +- stq(a2, env->regs[r3]); ++ cpu_stq_data(env, a2, env->regs[r3]); + } else { + cc = 1; + env->regs[r1] = v2; +@@ -480,19 +480,19 @@ uint32_t HELPER(csg)(uint32_t r1, uint64_t a2, uint32_t r3) + } + + /* compare double and swap 64-bit */ +-uint32_t HELPER(cdsg)(uint32_t r1, uint64_t a2, uint32_t r3) ++uint32_t HELPER(cdsg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + /* FIXME: locking? */ + uint32_t cc; +- uint64_t v2_hi = ldq(a2); +- uint64_t v2_lo = ldq(a2 + 8); ++ uint64_t v2_hi = cpu_ldq_data(env, a2); ++ uint64_t v2_lo = cpu_ldq_data(env, a2 + 8); + uint64_t v1_hi = env->regs[r1]; + uint64_t v1_lo = env->regs[r1 + 1]; + + if ((v1_hi == v2_hi) && (v1_lo == v2_lo)) { + cc = 0; +- stq(a2, env->regs[r3]); +- stq(a2 + 8, env->regs[r3 + 1]); ++ cpu_stq_data(env, a2, env->regs[r3]); ++ cpu_stq_data(env, a2 + 8, env->regs[r3 + 1]); + } else { + cc = 1; + env->regs[r1] = v2_hi; +@@ -503,16 +503,16 @@ uint32_t HELPER(cdsg)(uint32_t r1, uint64_t a2, uint32_t r3) + } + + /* compare and swap 32-bit */ +-uint32_t HELPER(cs)(uint32_t r1, uint64_t a2, uint32_t r3) ++uint32_t HELPER(cs)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + /* FIXME: locking? */ + uint32_t cc; +- uint32_t v2 = ldl(a2); ++ uint32_t v2 = cpu_ldl_data(env, a2); + + HELPER_LOG("%s: r1 %d a2 0x%lx r3 %d\n", __func__, r1, a2, r3); + if (((uint32_t)env->regs[r1]) == v2) { + cc = 0; +- stl(a2, (uint32_t)env->regs[r3]); ++ cpu_stl_data(env, a2, (uint32_t)env->regs[r3]); + } else { + cc = 1; + env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) | v2; +@@ -520,7 +520,8 @@ uint32_t HELPER(cs)(uint32_t r1, uint64_t a2, uint32_t r3) + return cc; + } + +-static uint32_t helper_icm(uint32_t r1, uint64_t address, uint32_t mask) ++static uint32_t helper_icm(CPUS390XState *env, uint32_t r1, uint64_t address, ++ uint32_t mask) + { + int pos = 24; /* top of the lower half of r1 */ + uint64_t rmask = 0xff000000ULL; +@@ -531,7 +532,7 @@ static uint32_t helper_icm(uint32_t r1, uint64_t address, uint32_t mask) + while (mask) { + if (mask & 8) { + env->regs[r1] &= ~rmask; +- val = ldub(address); ++ val = cpu_ldub_data(env, address); + if ((val & 0x80) && !ccd) { + cc = 1; + } +@@ -557,9 +558,10 @@ static uint32_t helper_icm(uint32_t r1, uint64_t address, uint32_t mask) + in other words: tricky... + currently implemented by interpreting the cases it is most commonly used in + */ +-uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) ++uint32_t HELPER(ex)(CPUS390XState *env, uint32_t cc, uint64_t v1, ++ uint64_t addr, uint64_t ret) + { +- uint16_t insn = lduw_code(addr); ++ uint16_t insn = cpu_lduw_code(env, addr); + + HELPER_LOG("%s: v1 0x%lx addr 0x%lx insn 0x%x\n", __func__, v1, addr, + insn); +@@ -567,23 +569,27 @@ uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) + uint32_t l, insn2, b1, b2, d1, d2; + + l = v1 & 0xff; +- insn2 = ldl_code(addr + 2); ++ insn2 = cpu_ldl_code(env, addr + 2); + b1 = (insn2 >> 28) & 0xf; + b2 = (insn2 >> 12) & 0xf; + d1 = (insn2 >> 16) & 0xfff; + d2 = insn2 & 0xfff; + switch (insn & 0xf00) { + case 0x200: +- helper_mvc(l, get_address(0, b1, d1), get_address(0, b2, d2)); ++ helper_mvc(env, l, get_address(env, 0, b1, d1), ++ get_address(env, 0, b2, d2)); + break; + case 0x500: +- cc = helper_clc(l, get_address(0, b1, d1), get_address(0, b2, d2)); ++ cc = helper_clc(env, l, get_address(env, 0, b1, d1), ++ get_address(env, 0, b2, d2)); + break; + case 0x700: +- cc = helper_xc(l, get_address(0, b1, d1), get_address(0, b2, d2)); ++ cc = helper_xc(env, l, get_address(env, 0, b1, d1), ++ get_address(env, 0, b2, d2)); + break; + case 0xc00: +- helper_tr(l, get_address(0, b1, d1), get_address(0, b2, d2)); ++ helper_tr(env, l, get_address(env, 0, b1, d1), ++ get_address(env, 0, b2, d2)); + break; + default: + goto abort; +@@ -599,12 +605,12 @@ uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) + } else if ((insn & 0xff00) == 0xbf00) { + uint32_t insn2, r1, r3, b2, d2; + +- insn2 = ldl_code(addr + 2); ++ insn2 = cpu_ldl_code(env, addr + 2); + r1 = (insn2 >> 20) & 0xf; + r3 = (insn2 >> 16) & 0xf; + b2 = (insn2 >> 12) & 0xf; + d2 = insn2 & 0xfff; +- cc = helper_icm(r1, get_address(0, b2, d2), r3); ++ cc = helper_icm(env, r1, get_address(env, 0, b2, d2), r3); + } else { + abort: + cpu_abort(env, "EXECUTE on instruction prefix 0x%x not implemented\n", +@@ -614,13 +620,14 @@ uint32_t HELPER(ex)(uint32_t cc, uint64_t v1, uint64_t addr, uint64_t ret) + } + + /* store character under mask high operates on the upper half of r1 */ +-void HELPER(stcmh)(uint32_t r1, uint64_t address, uint32_t mask) ++void HELPER(stcmh)(CPUS390XState *env, uint32_t r1, uint64_t address, ++ uint32_t mask) + { + int pos = 56; /* top of the upper half of r1 */ + + while (mask) { + if (mask & 8) { +- stb(address, (env->regs[r1] >> pos) & 0xff); ++ cpu_stb_data(env, address, (env->regs[r1] >> pos) & 0xff); + address++; + } + mask = (mask << 1) & 0xf; +@@ -630,7 +637,8 @@ void HELPER(stcmh)(uint32_t r1, uint64_t address, uint32_t mask) + + /* insert character under mask high; same as icm, but operates on the + upper half of r1 */ +-uint32_t HELPER(icmh)(uint32_t r1, uint64_t address, uint32_t mask) ++uint32_t HELPER(icmh)(CPUS390XState *env, uint32_t r1, uint64_t address, ++ uint32_t mask) + { + int pos = 56; /* top of the upper half of r1 */ + uint64_t rmask = 0xff00000000000000ULL; +@@ -641,7 +649,7 @@ uint32_t HELPER(icmh)(uint32_t r1, uint64_t address, uint32_t mask) + while (mask) { + if (mask & 8) { + env->regs[r1] &= ~rmask; +- val = ldub(address); ++ val = cpu_ldub_data(env, address); + if ((val & 0x80) && !ccd) { + cc = 1; + } +@@ -661,12 +669,12 @@ uint32_t HELPER(icmh)(uint32_t r1, uint64_t address, uint32_t mask) + } + + /* load access registers r1 to r3 from memory at a2 */ +-void HELPER(lam)(uint32_t r1, uint64_t a2, uint32_t r3) ++void HELPER(lam)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + int i; + + for (i = r1;; i = (i + 1) % 16) { +- env->aregs[i] = ldl(a2); ++ env->aregs[i] = cpu_ldl_data(env, a2); + a2 += 4; + + if (i == r3) { +@@ -676,12 +684,12 @@ void HELPER(lam)(uint32_t r1, uint64_t a2, uint32_t r3) + } + + /* store access registers r1 to r3 in memory at a2 */ +-void HELPER(stam)(uint32_t r1, uint64_t a2, uint32_t r3) ++void HELPER(stam)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + int i; + + for (i = r1;; i = (i + 1) % 16) { +- stl(a2, env->aregs[i]); ++ cpu_stl_data(env, a2, env->aregs[i]); + a2 += 4; + + if (i == r3) { +@@ -691,12 +699,12 @@ void HELPER(stam)(uint32_t r1, uint64_t a2, uint32_t r3) + } + + /* move long */ +-uint32_t HELPER(mvcl)(uint32_t r1, uint32_t r2) ++uint32_t HELPER(mvcl)(CPUS390XState *env, uint32_t r1, uint32_t r2) + { + uint64_t destlen = env->regs[r1 + 1] & 0xffffff; +- uint64_t dest = get_address_31fix(r1); ++ uint64_t dest = get_address_31fix(env, r1); + uint64_t srclen = env->regs[r2 + 1] & 0xffffff; +- uint64_t src = get_address_31fix(r2); ++ uint64_t src = get_address_31fix(env, r2); + uint8_t pad = src >> 24; + uint8_t v; + uint32_t cc; +@@ -714,12 +722,12 @@ uint32_t HELPER(mvcl)(uint32_t r1, uint32_t r2) + } + + for (; destlen && srclen; src++, dest++, destlen--, srclen--) { +- v = ldub(src); +- stb(dest, v); ++ v = cpu_ldub_data(env, src); ++ cpu_stb_data(env, dest, v); + } + + for (; destlen; dest++, destlen--) { +- stb(dest, pad); ++ cpu_stb_data(env, dest, pad); + } + + env->regs[r1 + 1] = destlen; +@@ -732,7 +740,8 @@ uint32_t HELPER(mvcl)(uint32_t r1, uint32_t r2) + } + + /* move long extended another memcopy insn with more bells and whistles */ +-uint32_t HELPER(mvcle)(uint32_t r1, uint64_t a2, uint32_t r3) ++uint32_t HELPER(mvcle)(CPUS390XState *env, uint32_t r1, uint64_t a2, ++ uint32_t r3) + { + uint64_t destlen = env->regs[r1 + 1]; + uint64_t dest = env->regs[r1]; +@@ -762,12 +771,12 @@ uint32_t HELPER(mvcle)(uint32_t r1, uint64_t a2, uint32_t r3) + } + + for (; destlen && srclen; src++, dest++, destlen--, srclen--) { +- v = ldub(src); +- stb(dest, v); ++ v = cpu_ldub_data(env, src); ++ cpu_stb_data(env, dest, v); + } + + for (; destlen; dest++, destlen--) { +- stb(dest, pad); ++ cpu_stb_data(env, dest, pad); + } + + env->regs[r1 + 1] = destlen; +@@ -781,12 +790,13 @@ uint32_t HELPER(mvcle)(uint32_t r1, uint64_t a2, uint32_t r3) + } + + /* compare logical long extended memcompare insn with padding */ +-uint32_t HELPER(clcle)(uint32_t r1, uint64_t a2, uint32_t r3) ++uint32_t HELPER(clcle)(CPUS390XState *env, uint32_t r1, uint64_t a2, ++ uint32_t r3) + { + uint64_t destlen = env->regs[r1 + 1]; +- uint64_t dest = get_address_31fix(r1); ++ uint64_t dest = get_address_31fix(env, r1); + uint64_t srclen = env->regs[r3 + 1]; +- uint64_t src = get_address_31fix(r3); ++ uint64_t src = get_address_31fix(env, r3); + uint8_t pad = a2 & 0xff; + uint8_t v1 = 0, v2 = 0; + uint32_t cc = 0; +@@ -800,8 +810,8 @@ uint32_t HELPER(clcle)(uint32_t r1, uint64_t a2, uint32_t r3) + } + + for (; destlen || srclen; src++, dest++, destlen--, srclen--) { +- v1 = srclen ? ldub(src) : pad; +- v2 = destlen ? ldub(dest) : pad; ++ v1 = srclen ? cpu_ldub_data(env, src) : pad; ++ v2 = destlen ? cpu_ldub_data(env, dest) : pad; + if (v1 != v2) { + cc = (v1 < v2) ? 1 : 2; + break; +@@ -818,14 +828,14 @@ uint32_t HELPER(clcle)(uint32_t r1, uint64_t a2, uint32_t r3) + } + + /* checksum */ +-void HELPER(cksm)(uint32_t r1, uint32_t r2) ++void HELPER(cksm)(CPUS390XState *env, uint32_t r1, uint32_t r2) + { +- uint64_t src = get_address_31fix(r2); ++ uint64_t src = get_address_31fix(env, r2); + uint64_t src_len = env->regs[(r2 + 1) & 15]; + uint64_t cksm = (uint32_t)env->regs[r1]; + + while (src_len >= 4) { +- cksm += ldl(src); ++ cksm += cpu_ldl_data(env, src); + + /* move to next word */ + src_len -= 4; +@@ -836,14 +846,14 @@ void HELPER(cksm)(uint32_t r1, uint32_t r2) + case 0: + break; + case 1: +- cksm += ldub(src) << 24; ++ cksm += cpu_ldub_data(env, src) << 24; + break; + case 2: +- cksm += lduw(src) << 16; ++ cksm += cpu_lduw_data(env, src) << 16; + break; + case 3: +- cksm += lduw(src) << 16; +- cksm += ldub(src + 2) << 8; ++ cksm += cpu_lduw_data(env, src) << 16; ++ cksm += cpu_ldub_data(env, src + 2) << 8; + break; + } + +@@ -856,7 +866,8 @@ void HELPER(cksm)(uint32_t r1, uint32_t r2) + ((uint32_t)cksm + (cksm >> 32)); + } + +-void HELPER(unpk)(uint32_t len, uint64_t dest, uint64_t src) ++void HELPER(unpk)(CPUS390XState *env, uint32_t len, uint64_t dest, ++ uint64_t src) + { + int len_dest = len >> 4; + int len_src = len & 0xf; +@@ -867,8 +878,8 @@ void HELPER(unpk)(uint32_t len, uint64_t dest, uint64_t src) + src += len_src; + + /* last byte is special, it only flips the nibbles */ +- b = ldub(src); +- stb(dest, (b << 4) | (b >> 4)); ++ b = cpu_ldub_data(env, src); ++ cpu_stb_data(env, dest, (b << 4) | (b >> 4)); + src--; + len_src--; + +@@ -878,7 +889,7 @@ void HELPER(unpk)(uint32_t len, uint64_t dest, uint64_t src) + uint8_t cur_byte = 0; + + if (len_src > 0) { +- cur_byte = ldub(src); ++ cur_byte = cpu_ldub_data(env, src); + } + + len_dest--; +@@ -897,30 +908,31 @@ void HELPER(unpk)(uint32_t len, uint64_t dest, uint64_t src) + /* zone bits */ + cur_byte |= 0xf0; + +- stb(dest, cur_byte); ++ cpu_stb_data(env, dest, cur_byte); + } + } + +-void HELPER(tr)(uint32_t len, uint64_t array, uint64_t trans) ++void HELPER(tr)(CPUS390XState *env, uint32_t len, uint64_t array, ++ uint64_t trans) + { + int i; + + for (i = 0; i <= len; i++) { +- uint8_t byte = ldub(array + i); +- uint8_t new_byte = ldub(trans + byte); ++ uint8_t byte = cpu_ldub_data(env, array + i); ++ uint8_t new_byte = cpu_ldub_data(env, trans + byte); + +- stb(array + i, new_byte); ++ cpu_stb_data(env, array + i, new_byte); + } + } + + #if !defined(CONFIG_USER_ONLY) +-void HELPER(lctlg)(uint32_t r1, uint64_t a2, uint32_t r3) ++void HELPER(lctlg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + int i; + uint64_t src = a2; + + for (i = r1;; i = (i + 1) % 16) { +- env->cregs[i] = ldq(src); ++ env->cregs[i] = cpu_ldq_data(env, src); + HELPER_LOG("load ctl %d from 0x%" PRIx64 " == 0x%" PRIx64 "\n", + i, src, env->cregs[i]); + src += sizeof(uint64_t); +@@ -933,13 +945,14 @@ void HELPER(lctlg)(uint32_t r1, uint64_t a2, uint32_t r3) + tlb_flush(env, 1); + } + +-void HELPER(lctl)(uint32_t r1, uint64_t a2, uint32_t r3) ++void HELPER(lctl)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + int i; + uint64_t src = a2; + + for (i = r1;; i = (i + 1) % 16) { +- env->cregs[i] = (env->cregs[i] & 0xFFFFFFFF00000000ULL) | ldl(src); ++ env->cregs[i] = (env->cregs[i] & 0xFFFFFFFF00000000ULL) | ++ cpu_ldl_data(env, src); + src += sizeof(uint32_t); + + if (i == r3) { +@@ -950,13 +963,13 @@ void HELPER(lctl)(uint32_t r1, uint64_t a2, uint32_t r3) + tlb_flush(env, 1); + } + +-void HELPER(stctg)(uint32_t r1, uint64_t a2, uint32_t r3) ++void HELPER(stctg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + int i; + uint64_t dest = a2; + + for (i = r1;; i = (i + 1) % 16) { +- stq(dest, env->cregs[i]); ++ cpu_stq_data(env, dest, env->cregs[i]); + dest += sizeof(uint64_t); + + if (i == r3) { +@@ -965,13 +978,13 @@ void HELPER(stctg)(uint32_t r1, uint64_t a2, uint32_t r3) + } + } + +-void HELPER(stctl)(uint32_t r1, uint64_t a2, uint32_t r3) ++void HELPER(stctl)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3) + { + int i; + uint64_t dest = a2; + + for (i = r1;; i = (i + 1) % 16) { +- stl(dest, env->cregs[i]); ++ cpu_stl_data(env, dest, env->cregs[i]); + dest += sizeof(uint32_t); + + if (i == r3) { +@@ -988,9 +1001,9 @@ uint32_t HELPER(tprot)(uint64_t a1, uint64_t a2) + } + + /* insert storage key extended */ +-uint64_t HELPER(iske)(uint64_t r2) ++uint64_t HELPER(iske)(CPUS390XState *env, uint64_t r2) + { +- uint64_t addr = get_address(0, 0, r2); ++ uint64_t addr = get_address(env, 0, 0, r2); + + if (addr > ram_size) { + return 0; +@@ -1000,9 +1013,9 @@ uint64_t HELPER(iske)(uint64_t r2) + } + + /* set storage key extended */ +-void HELPER(sske)(uint32_t r1, uint64_t r2) ++void HELPER(sske)(CPUS390XState *env, uint32_t r1, uint64_t r2) + { +- uint64_t addr = get_address(0, 0, r2); ++ uint64_t addr = get_address(env, 0, 0, r2); + + if (addr > ram_size) { + return; +@@ -1012,7 +1025,7 @@ void HELPER(sske)(uint32_t r1, uint64_t r2) + } + + /* reset reference bit extended */ +-uint32_t HELPER(rrbe)(uint32_t r1, uint64_t r2) ++uint32_t HELPER(rrbe)(CPUS390XState *env, uint32_t r1, uint64_t r2) + { + uint8_t re; + uint8_t key; +@@ -1038,15 +1051,15 @@ uint32_t HELPER(rrbe)(uint32_t r1, uint64_t r2) + } + + /* compare and swap and purge */ +-uint32_t HELPER(csp)(uint32_t r1, uint32_t r2) ++uint32_t HELPER(csp)(CPUS390XState *env, uint32_t r1, uint32_t r2) + { + uint32_t cc; + uint32_t o1 = env->regs[r1]; +- uint64_t a2 = get_address_31fix(r2) & ~3ULL; +- uint32_t o2 = ldl(a2); ++ uint64_t a2 = get_address_31fix(env, r2) & ~3ULL; ++ uint32_t o2 = cpu_ldl_data(env, a2); + + if (o1 == o2) { +- stl(a2, env->regs[(r1 + 1) & 15]); ++ cpu_stl_data(env, a2, env->regs[(r1 + 1) & 15]); + if (env->regs[r2] & 0x3) { + /* flush TLB / ALB */ + tlb_flush(env, 1); +@@ -1060,8 +1073,8 @@ uint32_t HELPER(csp)(uint32_t r1, uint32_t r2) + return cc; + } + +-static uint32_t mvc_asc(int64_t l, uint64_t a1, uint64_t mode1, uint64_t a2, +- uint64_t mode2) ++static uint32_t mvc_asc(CPUS390XState *env, int64_t l, uint64_t a1, ++ uint64_t mode1, uint64_t a2, uint64_t mode2) + { + target_ulong src, dest; + int flags, cc = 0, i; +@@ -1089,7 +1102,7 @@ static uint32_t mvc_asc(int64_t l, uint64_t a1, uint64_t mode1, uint64_t a2, + /* XXX be more clever */ + if ((((dest + i) & TARGET_PAGE_MASK) != (dest & TARGET_PAGE_MASK)) || + (((src + i) & TARGET_PAGE_MASK) != (src & TARGET_PAGE_MASK))) { +- mvc_asc(l - i, a1 + i, mode1, a2 + i, mode2); ++ mvc_asc(env, l - i, a1 + i, mode1, a2 + i, mode2); + break; + } + stb_phys(dest + i, ldub_phys(src + i)); +@@ -1098,24 +1111,24 @@ static uint32_t mvc_asc(int64_t l, uint64_t a1, uint64_t mode1, uint64_t a2, + return cc; + } + +-uint32_t HELPER(mvcs)(uint64_t l, uint64_t a1, uint64_t a2) ++uint32_t HELPER(mvcs)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2) + { + HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n", + __func__, l, a1, a2); + +- return mvc_asc(l, a1, PSW_ASC_SECONDARY, a2, PSW_ASC_PRIMARY); ++ return mvc_asc(env, l, a1, PSW_ASC_SECONDARY, a2, PSW_ASC_PRIMARY); + } + +-uint32_t HELPER(mvcp)(uint64_t l, uint64_t a1, uint64_t a2) ++uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2) + { + HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n", + __func__, l, a1, a2); + +- return mvc_asc(l, a1, PSW_ASC_PRIMARY, a2, PSW_ASC_SECONDARY); ++ return mvc_asc(env, l, a1, PSW_ASC_PRIMARY, a2, PSW_ASC_SECONDARY); + } + + /* invalidate pte */ +-void HELPER(ipte)(uint64_t pte_addr, uint64_t vaddr) ++void HELPER(ipte)(CPUS390XState *env, uint64_t pte_addr, uint64_t vaddr) + { + uint64_t page = vaddr & TARGET_PAGE_MASK; + uint64_t pte = 0; +@@ -1141,19 +1154,19 @@ void HELPER(ipte)(uint64_t pte_addr, uint64_t vaddr) + } + + /* flush local tlb */ +-void HELPER(ptlb)(void) ++void HELPER(ptlb)(CPUS390XState *env) + { + tlb_flush(env, 1); + } + + /* store using real address */ +-void HELPER(stura)(uint64_t addr, uint32_t v1) ++void HELPER(stura)(CPUS390XState *env, uint64_t addr, uint32_t v1) + { +- stw_phys(get_address(0, 0, addr), v1); ++ stw_phys(get_address(env, 0, 0, addr), v1); + } + + /* load real address */ +-uint32_t HELPER(lra)(uint64_t addr, uint32_t r1) ++uint32_t HELPER(lra)(CPUS390XState *env, uint64_t addr, uint32_t r1) + { + uint32_t cc = 0; + int old_exc = env->exception_index; +@@ -1188,52 +1201,3 @@ uint32_t HELPER(lra)(uint64_t addr, uint32_t r1) + } + + #endif +- +-/* temporary wrappers */ +-#if defined(CONFIG_USER_ONLY) +-#define ldub_data(addr) ldub_raw(addr) +-#define lduw_data(addr) lduw_raw(addr) +-#define ldl_data(addr) ldl_raw(addr) +-#define ldq_data(addr) ldq_raw(addr) +- +-#define stb_data(addr, data) stb_raw(addr, data) +-#define stw_data(addr, data) stw_raw(addr, data) +-#define stl_data(addr, data) stl_raw(addr, data) +-#define stq_data(addr, data) stq_raw(addr, data) +-#endif +- +-#define WRAP_LD(rettype, fn) \ +- rettype cpu_ ## fn(CPUS390XState *env1, target_ulong addr) \ +- { \ +- CPUS390XState *saved_env; \ +- rettype ret; \ +- \ +- saved_env = env; \ +- env = env1; \ +- ret = fn(addr); \ +- env = saved_env; \ +- return ret; \ +- } +- +-WRAP_LD(uint32_t, ldub_data) +-WRAP_LD(uint32_t, lduw_data) +-WRAP_LD(uint32_t, ldl_data) +-WRAP_LD(uint64_t, ldq_data) +-#undef WRAP_LD +- +-#define WRAP_ST(datatype, fn) \ +- void cpu_ ## fn(CPUS390XState *env1, target_ulong addr, datatype val) \ +- { \ +- CPUS390XState *saved_env; \ +- \ +- saved_env = env; \ +- env = env1; \ +- fn(addr, val); \ +- env = saved_env; \ +- } +- +-WRAP_ST(uint32_t, stb_data) +-WRAP_ST(uint32_t, stw_data) +-WRAP_ST(uint32_t, stl_data) +-WRAP_ST(uint64_t, stq_data) +-#undef WRAP_ST +diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c +index ced26c6..2938ac9 100644 +--- a/target-s390x/misc_helper.c ++++ b/target-s390x/misc_helper.c +@@ -31,10 +31,7 @@ + #endif + + #if !defined(CONFIG_USER_ONLY) +-/* temporarily disabled due to wrapper use */ +-#if 0 + #include "softmmu_exec.h" +-#endif + #include "sysemu.h" + #endif + +diff --git a/target-s390x/translate.c b/target-s390x/translate.c +index 0c61e63..66119cd 100644 +--- a/target-s390x/translate.c ++++ b/target-s390x/translate.c +@@ -276,19 +276,19 @@ static inline void potential_page_fault(DisasContext *s) + + static inline uint64_t ld_code2(uint64_t pc) + { +- return (uint64_t)lduw_code(pc); ++ return (uint64_t)cpu_lduw_code(cpu_single_env, pc); + } + + static inline uint64_t ld_code4(uint64_t pc) + { +- return (uint64_t)ldl_code(pc); ++ return (uint64_t)cpu_ldl_code(cpu_single_env, pc); + } + + static inline uint64_t ld_code6(uint64_t pc) + { + uint64_t opc; +- opc = (uint64_t)lduw_code(pc) << 32; +- opc |= (uint64_t)(uint32_t)ldl_code(pc+2); ++ opc = (uint64_t)cpu_lduw_code(cpu_single_env, pc) << 32; ++ opc |= (uint64_t)(uint32_t)cpu_ldl_code(cpu_single_env, pc + 2); + return opc; + } + +@@ -1263,7 +1263,7 @@ static void gen_op_mvc(DisasContext *s, int l, TCGv_i64 s1, TCGv_i64 s2) + /* Fall back to helper */ + vl = tcg_const_i32(l); + potential_page_fault(s); +- gen_helper_mvc(vl, s1, s2); ++ gen_helper_mvc(cpu_env, vl, s1, s2); + tcg_temp_free_i32(vl); + return; + } +@@ -1455,7 +1455,7 @@ static void gen_op_clc(DisasContext *s, int l, TCGv_i64 s1, TCGv_i64 s2) + + potential_page_fault(s); + vl = tcg_const_i32(l); +- gen_helper_clc(cc_op, vl, s1, s2); ++ gen_helper_clc(cc_op, cpu_env, vl, s1, s2); + tcg_temp_free_i32(vl); + set_cc_static(s); + } +@@ -2094,7 +2094,7 @@ do_mh: + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_stcmh(tmp32_1, tmp, tmp32_2); ++ gen_helper_stcmh(cpu_env, tmp32_1, tmp, tmp32_2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -2107,7 +2107,7 @@ do_mh: + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_lctlg(tmp32_1, tmp, tmp32_2); ++ gen_helper_lctlg(cpu_env, tmp32_1, tmp, tmp32_2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -2119,7 +2119,7 @@ do_mh: + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_stctg(tmp32_1, tmp, tmp32_2); ++ gen_helper_stctg(cpu_env, tmp32_1, tmp, tmp32_2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -2131,7 +2131,7 @@ do_mh: + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); + /* XXX rewrite in tcg */ +- gen_helper_csg(cc_op, tmp32_1, tmp, tmp32_2); ++ gen_helper_csg(cc_op, cpu_env, tmp32_1, tmp, tmp32_2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -2143,7 +2143,7 @@ do_mh: + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); + /* XXX rewrite in tcg */ +- gen_helper_cdsg(cc_op, tmp32_1, tmp, tmp32_2); ++ gen_helper_cdsg(cc_op, cpu_env, tmp32_1, tmp, tmp32_2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -2183,7 +2183,7 @@ do_mh: + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); + /* XXX split CC calculation out */ +- gen_helper_icmh(cc_op, tmp32_1, tmp, tmp32_2); ++ gen_helper_icmh(cc_op, cpu_env, tmp32_1, tmp, tmp32_2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -2635,7 +2635,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r2); + potential_page_fault(s); +- gen_helper_cksm(tmp32_1, tmp32_2); ++ gen_helper_cksm(cpu_env, tmp32_1, tmp32_2); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); + gen_op_movi_cc(s, 0); +@@ -2664,7 +2664,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + tmp2 = load_reg(r1); + tmp3 = load_reg(r2); + potential_page_fault(s); +- gen_helper_mvpg(tmp, tmp2, tmp3); ++ gen_helper_mvpg(cpu_env, tmp, tmp2, tmp3); + tcg_temp_free_i64(tmp); + tcg_temp_free_i64(tmp2); + tcg_temp_free_i64(tmp3); +@@ -2676,7 +2676,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + tmp32_2 = tcg_const_i32(r1); + tmp32_3 = tcg_const_i32(r2); + potential_page_fault(s); +- gen_helper_mvst(tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_mvst(cpu_env, tmp32_1, tmp32_2, tmp32_3); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); + tcg_temp_free_i32(tmp32_3); +@@ -2687,7 +2687,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + tmp32_2 = tcg_const_i32(r1); + tmp32_3 = tcg_const_i32(r2); + potential_page_fault(s); +- gen_helper_clst(cc_op, tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_clst(cc_op, cpu_env, tmp32_1, tmp32_2, tmp32_3); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -2698,7 +2698,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + tmp32_2 = tcg_const_i32(r1); + tmp32_3 = tcg_const_i32(r2); + potential_page_fault(s); +- gen_helper_srst(cc_op, tmp32_1, tmp32_2, tmp32_3); ++ gen_helper_srst(cc_op, cpu_env, tmp32_1, tmp32_2, tmp32_3); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -2785,7 +2785,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + case 0x0d: /* PTLB [S] */ + /* Purge TLB */ + check_privileged(s, ilc); +- gen_helper_ptlb(); ++ gen_helper_ptlb(cpu_env); + break; + case 0x10: /* SPX D2(B2) [S] */ + /* Set Prefix Register */ +@@ -2828,7 +2828,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + r2 = insn & 0xf; + tmp = load_reg(r1); + tmp2 = load_reg(r2); +- gen_helper_ipte(tmp, tmp2); ++ gen_helper_ipte(cpu_env, tmp, tmp2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i64(tmp2); + break; +@@ -2839,7 +2839,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + r2 = insn & 0xf; + tmp = load_reg(r2); + tmp2 = tcg_temp_new_i64(); +- gen_helper_iske(tmp2, tmp); ++ gen_helper_iske(tmp2, cpu_env, tmp); + store_reg(r1, tmp2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i64(tmp2); +@@ -2851,7 +2851,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + r2 = insn & 0xf; + tmp32_1 = load_reg32(r1); + tmp = load_reg(r2); +- gen_helper_rrbe(cc_op, tmp32_1, tmp); ++ gen_helper_rrbe(cc_op, cpu_env, tmp32_1, tmp); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i64(tmp); +@@ -2863,7 +2863,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + r2 = insn & 0xf; + tmp32_1 = load_reg32(r1); + tmp = load_reg(r2); +- gen_helper_sske(tmp32_1, tmp); ++ gen_helper_sske(cpu_env, tmp32_1, tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i64(tmp); + break; +@@ -2880,7 +2880,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + tmp32_1 = load_reg32(r1); + tmp = load_reg(r2); + potential_page_fault(s); +- gen_helper_stura(tmp, tmp32_1); ++ gen_helper_stura(cpu_env, tmp, tmp32_1); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i64(tmp); + break; +@@ -2891,7 +2891,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + r2 = insn & 0xf; + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r2); +- gen_helper_csp(cc_op, tmp32_1, tmp32_2); ++ gen_helper_csp(cc_op, cpu_env, tmp32_1, tmp32_2); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -3865,7 +3865,7 @@ static void disas_s390_insn(DisasContext *s) + int ilc; + int l1; + +- opc = ldub_code(s->pc); ++ opc = cpu_ldub_code(cpu_single_env, s->pc); + LOG_DISAS("opc 0x%x\n", opc); + + ilc = get_ilc(opc); +@@ -3951,7 +3951,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r2); + potential_page_fault(s); +- gen_helper_mvcl(cc_op, tmp32_1, tmp32_2); ++ gen_helper_mvcl(cc_op, cpu_env, tmp32_1, tmp32_2); + set_cc_static(s); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -4165,7 +4165,7 @@ static void disas_s390_insn(DisasContext *s) + tmp3 = tcg_const_i64(s->pc + 4); + update_psw_addr(s); + gen_op_calc_cc(s); +- gen_helper_ex(cc_op, cc_op, tmp2, tmp, tmp3); ++ gen_helper_ex(cc_op, cpu_env, cc_op, tmp2, tmp, tmp3); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i64(tmp2); +@@ -4694,7 +4694,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_lam(tmp32_1, tmp, tmp32_2); ++ gen_helper_lam(cpu_env, tmp32_1, tmp, tmp32_2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -4706,7 +4706,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_stam(tmp32_1, tmp, tmp32_2); ++ gen_helper_stam(cpu_env, tmp32_1, tmp, tmp32_2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -4732,7 +4732,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_mvcle(cc_op, tmp32_1, tmp, tmp32_2); ++ gen_helper_mvcle(cc_op, cpu_env, tmp32_1, tmp, tmp32_2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -4745,7 +4745,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_clcle(cc_op, tmp32_1, tmp, tmp32_2); ++ gen_helper_clcle(cc_op, cpu_env, tmp32_1, tmp, tmp32_2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -4789,7 +4789,7 @@ static void disas_s390_insn(DisasContext *s) + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp32_1 = tcg_const_i32(r1); + potential_page_fault(s); +- gen_helper_lra(cc_op, tmp, tmp32_1); ++ gen_helper_lra(cc_op, cpu_env, tmp, tmp32_1); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -4835,7 +4835,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_stctl(tmp32_1, tmp, tmp32_2); ++ gen_helper_stctl(cpu_env, tmp32_1, tmp, tmp32_2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -4849,7 +4849,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_lctl(tmp32_1, tmp, tmp32_2); ++ gen_helper_lctl(cpu_env, tmp32_1, tmp, tmp32_2); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -4869,7 +4869,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_cs(cc_op, tmp32_1, tmp, tmp32_2); ++ gen_helper_cs(cc_op, cpu_env, tmp32_1, tmp, tmp32_2); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -4882,7 +4882,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = load_reg32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_clm(cc_op, tmp32_1, tmp32_2, tmp); ++ gen_helper_clm(cc_op, cpu_env, tmp32_1, tmp32_2, tmp); + set_cc_static(s); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); +@@ -4895,7 +4895,7 @@ static void disas_s390_insn(DisasContext *s) + tmp32_1 = load_reg32(r1); + tmp32_2 = tcg_const_i32(r3); + potential_page_fault(s); +- gen_helper_stcm(tmp32_1, tmp32_2, tmp); ++ gen_helper_stcm(cpu_env, tmp32_1, tmp32_2, tmp); + tcg_temp_free_i64(tmp); + tcg_temp_free_i32(tmp32_1); + tcg_temp_free_i32(tmp32_2); +@@ -4992,7 +4992,7 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0xd4: + potential_page_fault(s); +- gen_helper_nc(cc_op, vl, tmp, tmp2); ++ gen_helper_nc(cc_op, cpu_env, vl, tmp, tmp2); + set_cc_static(s); + break; + case 0xd5: +@@ -5000,22 +5000,22 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0xd6: + potential_page_fault(s); +- gen_helper_oc(cc_op, vl, tmp, tmp2); ++ gen_helper_oc(cc_op, cpu_env, vl, tmp, tmp2); + set_cc_static(s); + break; + case 0xd7: + potential_page_fault(s); +- gen_helper_xc(cc_op, vl, tmp, tmp2); ++ gen_helper_xc(cc_op, cpu_env, vl, tmp, tmp2); + set_cc_static(s); + break; + case 0xdc: + potential_page_fault(s); +- gen_helper_tr(vl, tmp, tmp2); ++ gen_helper_tr(cpu_env, vl, tmp, tmp2); + set_cc_static(s); + break; + case 0xf3: + potential_page_fault(s); +- gen_helper_unpk(vl, tmp, tmp2); ++ gen_helper_unpk(cpu_env, vl, tmp, tmp2); + break; + default: + tcg_abort(); +@@ -5040,9 +5040,9 @@ static void disas_s390_insn(DisasContext *s) + tmp2 = get_address(s, 0, b1, d1); + tmp3 = get_address(s, 0, b2, d2); + if (opc == 0xda) { +- gen_helper_mvcp(cc_op, tmp, tmp2, tmp3); ++ gen_helper_mvcp(cc_op, cpu_env, tmp, tmp2, tmp3); + } else { +- gen_helper_mvcs(cc_op, tmp, tmp2, tmp3); ++ gen_helper_mvcs(cc_op, cpu_env, tmp, tmp2, tmp3); + } + set_cc_static(s); + tcg_temp_free_i64(tmp); +-- +1.7.12.1 + diff --git a/0016-tcg-s390-fix-ld-st-with-CONFIG_TCG_PASS_AREG0.patch b/0016-tcg-s390-fix-ld-st-with-CONFIG_TCG_PASS_AREG0.patch new file mode 100644 index 0000000..96c305e --- /dev/null +++ b/0016-tcg-s390-fix-ld-st-with-CONFIG_TCG_PASS_AREG0.patch @@ -0,0 +1,64 @@ +From 0b95df52ecad351c916108e9f3a9d1bc3327b495 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Sat, 8 Sep 2012 03:45:43 +0000 +Subject: [PATCH] tcg/s390: fix ld/st with CONFIG_TCG_PASS_AREG0 + +The load/store slow path has been broken in e141ab52d: +- We need to move 4 registers for store functions and 3 registers for + load functions and not the reverse. +- According to the s390x calling convention the arguments of a function + should be zero extended. This means that the register shift should be + done with TCG_TYPE_I64 to ensure the higher word is correctly zero + extended when needed. + +I am aware that CONFIG_TCG_PASS_AREG0 is being removed and thus that +this patch can be improved, but doing so means it can also be applied to +the 1.1 and 1.2 stable branches. + +Signed-off-by: Aurelien Jarno +Signed-off-by: Alexander Graf +Signed-off-by: Michael Roth +--- + tcg/s390/tcg-target.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/tcg/s390/tcg-target.c b/tcg/s390/tcg-target.c +index 04662c1..99b5339 100644 +--- a/tcg/s390/tcg-target.c ++++ b/tcg/s390/tcg-target.c +@@ -1509,11 +1509,13 @@ static void tcg_prepare_qemu_ldst(TCGContext* s, TCGReg data_reg, + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R4, mem_index); + #ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ +- tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[2], ++ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[3], ++ tcg_target_call_iarg_regs[2]); ++ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[2], + tcg_target_call_iarg_regs[1]); +- tcg_out_mov(s, TCG_TYPE_TL, tcg_target_call_iarg_regs[1], ++ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[1], + tcg_target_call_iarg_regs[0]); +- tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], ++ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[0], + TCG_AREG0); + #endif + tgen_calli(s, (tcg_target_ulong)qemu_st_helpers[s_bits]); +@@ -1521,13 +1523,11 @@ static void tcg_prepare_qemu_ldst(TCGContext* s, TCGReg data_reg, + tcg_out_movi(s, TCG_TYPE_I32, arg1, mem_index); + #ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ +- tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3], +- tcg_target_call_iarg_regs[2]); + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[2], + tcg_target_call_iarg_regs[1]); +- tcg_out_mov(s, TCG_TYPE_TL, tcg_target_call_iarg_regs[1], ++ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[1], + tcg_target_call_iarg_regs[0]); +- tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], ++ tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[0], + TCG_AREG0); + #endif + tgen_calli(s, (tcg_target_ulong)qemu_ld_helpers[s_bits]); +-- +1.7.12.1 + diff --git a/0017-target-arm-Fix-potential-buffer-overflow.patch b/0017-target-arm-Fix-potential-buffer-overflow.patch new file mode 100644 index 0000000..6b9726e --- /dev/null +++ b/0017-target-arm-Fix-potential-buffer-overflow.patch @@ -0,0 +1,47 @@ +From e7c3f6b4365f3162f8e25d58f76410aca28719a2 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Tue, 4 Sep 2012 07:35:57 +0200 +Subject: [PATCH] target-arm: Fix potential buffer overflow + +Report from smatch: + +target-arm/helper.c:651 arm946_prbs_read(6) error: + buffer overflow 'env->cp15.c6_region' 8 <= 8 +target-arm/helper.c:661 arm946_prbs_write(6) error: + buffer overflow 'env->cp15.c6_region' 8 <= 8 + +c7_region is an array with 8 elements, so the index must be less than 8. + +Signed-off-by: Stefan Weil +Reviewed-by: Peter Maydell +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + target-arm/helper.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/target-arm/helper.c b/target-arm/helper.c +index dceaa95..e27df96 100644 +--- a/target-arm/helper.c ++++ b/target-arm/helper.c +@@ -645,7 +645,7 @@ static int pmsav5_insn_ap_read(CPUARMState *env, const ARMCPRegInfo *ri, + static int arm946_prbs_read(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t *value) + { +- if (ri->crm > 8) { ++ if (ri->crm >= 8) { + return EXCP_UDEF; + } + *value = env->cp15.c6_region[ri->crm]; +@@ -655,7 +655,7 @@ static int arm946_prbs_read(CPUARMState *env, const ARMCPRegInfo *ri, + static int arm946_prbs_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) + { +- if (ri->crm > 8) { ++ if (ri->crm >= 8) { + return EXCP_UDEF; + } + env->cp15.c6_region[ri->crm] = value; +-- +1.7.12.1 + diff --git a/0018-tcg-optimize-split-expression-simplification.patch b/0018-tcg-optimize-split-expression-simplification.patch new file mode 100644 index 0000000..0dcd9b0 --- /dev/null +++ b/0018-tcg-optimize-split-expression-simplification.patch @@ -0,0 +1,57 @@ +From 16f29b266435c7eaffc5081c6bba4651d56a8ce8 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Thu, 6 Sep 2012 16:47:13 +0200 +Subject: [PATCH] tcg/optimize: split expression simplification + +Split expression simplification in multiple parts so that a given op +can appear multiple times. This patch should not change anything. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 9c65474..63f970d 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -322,7 +322,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + break; + } + +- /* Simplify expression if possible. */ ++ /* Simplify expression for "op r, a, 0 => mov r, a" cases */ + switch (op) { + CASE_OP_32_64(add): + CASE_OP_32_64(sub): +@@ -352,6 +352,12 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + continue; + } + break; ++ default: ++ break; ++ } ++ ++ /* Simplify expression for "op r, a, 0 => movi r, 0" cases */ ++ switch (op) { + CASE_OP_32_64(mul): + if ((temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0)) { +@@ -362,6 +368,12 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + continue; + } + break; ++ default: ++ break; ++ } ++ ++ /* Simplify expression for "op r, a, a => mov r, a" cases */ ++ switch (op) { + CASE_OP_32_64(or): + CASE_OP_32_64(and): + if (args[1] == args[2]) { +-- +1.7.12.1 + diff --git a/0019-tcg-optimize-simplify-or-xor-r-a-0-cases.patch b/0019-tcg-optimize-simplify-or-xor-r-a-0-cases.patch new file mode 100644 index 0000000..4f9dd62 --- /dev/null +++ b/0019-tcg-optimize-simplify-or-xor-r-a-0-cases.patch @@ -0,0 +1,30 @@ +From f69f9bd1a7a095ee153eea5422651780aef178b0 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Thu, 6 Sep 2012 16:47:14 +0200 +Subject: [PATCH] tcg/optimize: simplify or/xor r, a, 0 cases + +or/xor r, a, 0 is equivalent to a mov r, a. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 63f970d..0db849e 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -331,6 +331,8 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + CASE_OP_32_64(sar): + CASE_OP_32_64(rotl): + CASE_OP_32_64(rotr): ++ CASE_OP_32_64(or): ++ CASE_OP_32_64(xor): + if (temps[args[1]].state == TCG_TEMP_CONST) { + /* Proceed with possible constant folding. */ + break; +-- +1.7.12.1 + diff --git a/0020-tcg-optimize-simplify-and-r-a-0-cases.patch b/0020-tcg-optimize-simplify-and-r-a-0-cases.patch new file mode 100644 index 0000000..e609e66 --- /dev/null +++ b/0020-tcg-optimize-simplify-and-r-a-0-cases.patch @@ -0,0 +1,29 @@ +From f08c59ce7dee67a95cf06d9588b4312e7d071788 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Thu, 6 Sep 2012 16:47:14 +0200 +Subject: [PATCH] tcg/optimize: simplify and r, a, 0 cases + +and r, a, 0 is equivalent to a movi r, 0. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 0db849e..c12cb2b 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -360,6 +360,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + + /* Simplify expression for "op r, a, 0 => movi r, 0" cases */ + switch (op) { ++ CASE_OP_32_64(and): + CASE_OP_32_64(mul): + if ((temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0)) { +-- +1.7.12.1 + diff --git a/0021-tcg-optimize-simplify-shift-rot-r-0-a-movi-r-0-cases.patch b/0021-tcg-optimize-simplify-shift-rot-r-0-a-movi-r-0-cases.patch new file mode 100644 index 0000000..d77bf30 --- /dev/null +++ b/0021-tcg-optimize-simplify-shift-rot-r-0-a-movi-r-0-cases.patch @@ -0,0 +1,48 @@ +From bbed332c7ad12e9885d3f457f366fa0b29445dcd Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Thu, 6 Sep 2012 16:47:14 +0200 +Subject: [PATCH] tcg/optimize: simplify shift/rot r, 0, a => movi r, 0 cases + +shift/rot r, 0, a is equivalent to movi r, 0. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index c12cb2b..1698ba3 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -322,6 +322,26 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + break; + } + ++ /* Simplify expressions for "shift/rot r, 0, a => movi r, 0" */ ++ switch (op) { ++ CASE_OP_32_64(shl): ++ CASE_OP_32_64(shr): ++ CASE_OP_32_64(sar): ++ CASE_OP_32_64(rotl): ++ CASE_OP_32_64(rotr): ++ if (temps[args[1]].state == TCG_TEMP_CONST ++ && temps[args[1]].val == 0) { ++ gen_opc_buf[op_index] = op_to_movi(op); ++ tcg_opt_gen_movi(gen_args, args[0], 0, nb_temps, nb_globals); ++ args += 3; ++ gen_args += 2; ++ continue; ++ } ++ break; ++ default: ++ break; ++ } ++ + /* Simplify expression for "op r, a, 0 => mov r, a" cases */ + switch (op) { + CASE_OP_32_64(add): +-- +1.7.12.1 + diff --git a/0022-tcg-optimize-swap-brcond-setcond-arguments-when-poss.patch b/0022-tcg-optimize-swap-brcond-setcond-arguments-when-poss.patch new file mode 100644 index 0000000..19135ee --- /dev/null +++ b/0022-tcg-optimize-swap-brcond-setcond-arguments-when-poss.patch @@ -0,0 +1,49 @@ +From 1127ad0d084f0cef11b5658b3dbbf8505d8d3af0 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Thu, 6 Sep 2012 16:47:14 +0200 +Subject: [PATCH] tcg/optimize: swap brcond/setcond arguments when possible + +brcond and setcond ops are not commutative, but it's easy to compute the +new condition after swapping the arguments. Try to always put the constant +argument in second position like for commutative ops, to help backends to +generate better code. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 1698ba3..7debc8a 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -318,6 +318,24 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + args[2] = tmp; + } + break; ++ CASE_OP_32_64(brcond): ++ if (temps[args[0]].state == TCG_TEMP_CONST ++ && temps[args[1]].state != TCG_TEMP_CONST) { ++ tmp = args[0]; ++ args[0] = args[1]; ++ args[1] = tmp; ++ args[2] = tcg_swap_cond(args[2]); ++ } ++ break; ++ CASE_OP_32_64(setcond): ++ if (temps[args[1]].state == TCG_TEMP_CONST ++ && temps[args[2]].state != TCG_TEMP_CONST) { ++ tmp = args[1]; ++ args[1] = args[2]; ++ args[2] = tmp; ++ args[3] = tcg_swap_cond(args[3]); ++ } ++ break; + default: + break; + } +-- +1.7.12.1 + diff --git a/0023-tcg-optimize-add-constant-folding-for-setcond.patch b/0023-tcg-optimize-add-constant-folding-for-setcond.patch new file mode 100644 index 0000000..0968e1e --- /dev/null +++ b/0023-tcg-optimize-add-constant-folding-for-setcond.patch @@ -0,0 +1,114 @@ +From 1bbb9ac3e775b55d0d5c57c209f47e742a9be810 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Thu, 6 Sep 2012 16:47:14 +0200 +Subject: [PATCH] tcg/optimize: add constant folding for setcond + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 81 insertions(+) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 7debc8a..1cb1f36 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -267,6 +267,67 @@ static TCGArg do_constant_folding(TCGOpcode op, TCGArg x, TCGArg y) + return res; + } + ++static TCGArg do_constant_folding_cond(TCGOpcode op, TCGArg x, ++ TCGArg y, TCGCond c) ++{ ++ switch (op_bits(op)) { ++ case 32: ++ switch (c) { ++ case TCG_COND_EQ: ++ return (uint32_t)x == (uint32_t)y; ++ case TCG_COND_NE: ++ return (uint32_t)x != (uint32_t)y; ++ case TCG_COND_LT: ++ return (int32_t)x < (int32_t)y; ++ case TCG_COND_GE: ++ return (int32_t)x >= (int32_t)y; ++ case TCG_COND_LE: ++ return (int32_t)x <= (int32_t)y; ++ case TCG_COND_GT: ++ return (int32_t)x > (int32_t)y; ++ case TCG_COND_LTU: ++ return (uint32_t)x < (uint32_t)y; ++ case TCG_COND_GEU: ++ return (uint32_t)x >= (uint32_t)y; ++ case TCG_COND_LEU: ++ return (uint32_t)x <= (uint32_t)y; ++ case TCG_COND_GTU: ++ return (uint32_t)x > (uint32_t)y; ++ } ++ break; ++ case 64: ++ switch (c) { ++ case TCG_COND_EQ: ++ return (uint64_t)x == (uint64_t)y; ++ case TCG_COND_NE: ++ return (uint64_t)x != (uint64_t)y; ++ case TCG_COND_LT: ++ return (int64_t)x < (int64_t)y; ++ case TCG_COND_GE: ++ return (int64_t)x >= (int64_t)y; ++ case TCG_COND_LE: ++ return (int64_t)x <= (int64_t)y; ++ case TCG_COND_GT: ++ return (int64_t)x > (int64_t)y; ++ case TCG_COND_LTU: ++ return (uint64_t)x < (uint64_t)y; ++ case TCG_COND_GEU: ++ return (uint64_t)x >= (uint64_t)y; ++ case TCG_COND_LEU: ++ return (uint64_t)x <= (uint64_t)y; ++ case TCG_COND_GTU: ++ return (uint64_t)x > (uint64_t)y; ++ } ++ break; ++ } ++ ++ fprintf(stderr, ++ "Unrecognized bitness %d or condition %d in " ++ "do_constant_folding_cond.\n", op_bits(op), c); ++ tcg_abort(); ++} ++ ++ + /* Propagate constants and copies, fold constant expressions. */ + static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + TCGArg *args, TCGOpDef *tcg_op_defs) +@@ -522,6 +583,26 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + args += 3; + break; + } ++ CASE_OP_32_64(setcond): ++ if (temps[args[1]].state == TCG_TEMP_CONST ++ && temps[args[2]].state == TCG_TEMP_CONST) { ++ gen_opc_buf[op_index] = op_to_movi(op); ++ tmp = do_constant_folding_cond(op, temps[args[1]].val, ++ temps[args[2]].val, args[3]); ++ tcg_opt_gen_movi(gen_args, args[0], tmp, nb_temps, nb_globals); ++ gen_args += 2; ++ args += 4; ++ break; ++ } else { ++ reset_temp(args[0], nb_temps, nb_globals); ++ gen_args[0] = args[0]; ++ gen_args[1] = args[1]; ++ gen_args[2] = args[2]; ++ gen_args[3] = args[3]; ++ gen_args += 4; ++ args += 4; ++ break; ++ } + case INDEX_op_call: + nb_call_args = (args[0] >> 16) + (args[0] & 0xffff); + if (!(args[nb_call_args + 1] & (TCG_CALL_CONST | TCG_CALL_PURE))) { +-- +1.7.12.1 + diff --git a/0024-tcg-optimize-add-constant-folding-for-brcond.patch b/0024-tcg-optimize-add-constant-folding-for-brcond.patch new file mode 100644 index 0000000..0b4c73b --- /dev/null +++ b/0024-tcg-optimize-add-constant-folding-for-brcond.patch @@ -0,0 +1,60 @@ +From 98dc31743b94d5719c02c589e7cd652e95570b25 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Thu, 6 Sep 2012 16:47:14 +0200 +Subject: [PATCH] tcg/optimize: add constant folding for brcond + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 27 ++++++++++++++++++++++++++- + 1 file changed, 26 insertions(+), 1 deletion(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 1cb1f36..156e8d9 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -603,6 +603,32 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + args += 4; + break; + } ++ CASE_OP_32_64(brcond): ++ if (temps[args[0]].state == TCG_TEMP_CONST ++ && temps[args[1]].state == TCG_TEMP_CONST) { ++ if (do_constant_folding_cond(op, temps[args[0]].val, ++ temps[args[1]].val, args[2])) { ++ memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); ++ gen_opc_buf[op_index] = INDEX_op_br; ++ gen_args[0] = args[3]; ++ gen_args += 1; ++ args += 4; ++ } else { ++ gen_opc_buf[op_index] = INDEX_op_nop; ++ args += 4; ++ } ++ break; ++ } else { ++ memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); ++ reset_temp(args[0], nb_temps, nb_globals); ++ gen_args[0] = args[0]; ++ gen_args[1] = args[1]; ++ gen_args[2] = args[2]; ++ gen_args[3] = args[3]; ++ gen_args += 4; ++ args += 4; ++ break; ++ } + case INDEX_op_call: + nb_call_args = (args[0] >> 16) + (args[0] & 0xffff); + if (!(args[nb_call_args + 1] & (TCG_CALL_CONST | TCG_CALL_PURE))) { +@@ -624,7 +650,6 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + case INDEX_op_set_label: + case INDEX_op_jmp: + case INDEX_op_br: +- CASE_OP_32_64(brcond): + memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); + for (i = 0; i < def->nb_args; i++) { + *gen_args = *args; +-- +1.7.12.1 + diff --git a/0025-tcg-optimize-fix-if-else-break-coding-style.patch b/0025-tcg-optimize-fix-if-else-break-coding-style.patch new file mode 100644 index 0000000..ef77b6e --- /dev/null +++ b/0025-tcg-optimize-fix-if-else-break-coding-style.patch @@ -0,0 +1,144 @@ +From b7dc881b44c3698a0a81d226d6012d3c5833fd29 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 7 Sep 2012 12:24:32 +0200 +Subject: [PATCH] tcg/optimize: fix if/else/break coding style + +optimizer.c contains some cases were the break is appearing in both the +if and the else parts. Fix that by moving it to the outer part. Also +move some common code there. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 34 +++++++++++----------------------- + 1 file changed, 11 insertions(+), 23 deletions(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 156e8d9..fba0ed9 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -441,15 +441,14 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + if ((temps[args[0]].state == TCG_TEMP_COPY + && temps[args[0]].val == args[1]) + || args[0] == args[1]) { +- args += 3; + gen_opc_buf[op_index] = INDEX_op_nop; + } else { + gen_opc_buf[op_index] = op_to_mov(op); + tcg_opt_gen_mov(s, gen_args, args[0], args[1], + nb_temps, nb_globals); + gen_args += 2; +- args += 3; + } ++ args += 3; + continue; + } + break; +@@ -480,15 +479,14 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + CASE_OP_32_64(and): + if (args[1] == args[2]) { + if (args[1] == args[0]) { +- args += 3; + gen_opc_buf[op_index] = INDEX_op_nop; + } else { + gen_opc_buf[op_index] = op_to_mov(op); + tcg_opt_gen_mov(s, gen_args, args[0], args[1], nb_temps, + nb_globals); + gen_args += 2; +- args += 3; + } ++ args += 3; + continue; + } + break; +@@ -538,17 +536,14 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_opc_buf[op_index] = op_to_movi(op); + tmp = do_constant_folding(op, temps[args[1]].val, 0); + tcg_opt_gen_movi(gen_args, args[0], tmp, nb_temps, nb_globals); +- gen_args += 2; +- args += 2; +- break; + } else { + reset_temp(args[0], nb_temps, nb_globals); + gen_args[0] = args[0]; + gen_args[1] = args[1]; +- gen_args += 2; +- args += 2; +- break; + } ++ gen_args += 2; ++ args += 2; ++ break; + CASE_OP_32_64(add): + CASE_OP_32_64(sub): + CASE_OP_32_64(mul): +@@ -572,17 +567,15 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + temps[args[2]].val); + tcg_opt_gen_movi(gen_args, args[0], tmp, nb_temps, nb_globals); + gen_args += 2; +- args += 3; +- break; + } else { + reset_temp(args[0], nb_temps, nb_globals); + gen_args[0] = args[0]; + gen_args[1] = args[1]; + gen_args[2] = args[2]; + gen_args += 3; +- args += 3; +- break; + } ++ args += 3; ++ break; + CASE_OP_32_64(setcond): + if (temps[args[1]].state == TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST) { +@@ -591,8 +584,6 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + temps[args[2]].val, args[3]); + tcg_opt_gen_movi(gen_args, args[0], tmp, nb_temps, nb_globals); + gen_args += 2; +- args += 4; +- break; + } else { + reset_temp(args[0], nb_temps, nb_globals); + gen_args[0] = args[0]; +@@ -600,9 +591,9 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_args[2] = args[2]; + gen_args[3] = args[3]; + gen_args += 4; +- args += 4; +- break; + } ++ args += 4; ++ break; + CASE_OP_32_64(brcond): + if (temps[args[0]].state == TCG_TEMP_CONST + && temps[args[1]].state == TCG_TEMP_CONST) { +@@ -612,12 +603,9 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_opc_buf[op_index] = INDEX_op_br; + gen_args[0] = args[3]; + gen_args += 1; +- args += 4; + } else { + gen_opc_buf[op_index] = INDEX_op_nop; +- args += 4; + } +- break; + } else { + memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); + reset_temp(args[0], nb_temps, nb_globals); +@@ -626,9 +614,9 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_args[2] = args[2]; + gen_args[3] = args[3]; + gen_args += 4; +- args += 4; +- break; + } ++ args += 4; ++ break; + case INDEX_op_call: + nb_call_args = (args[0] >> 16) + (args[0] & 0xffff); + if (!(args[nb_call_args + 1] & (TCG_CALL_CONST | TCG_CALL_PURE))) { +-- +1.7.12.1 + diff --git a/0026-target-s390x-avoid-cpu_single_env.patch b/0026-target-s390x-avoid-cpu_single_env.patch new file mode 100644 index 0000000..2b3e6a4 --- /dev/null +++ b/0026-target-s390x-avoid-cpu_single_env.patch @@ -0,0 +1,1337 @@ +From d8503917ec9ba86829387f05db7da2eb6fa8123f Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sat, 8 Sep 2012 11:15:37 +0000 +Subject: [PATCH] target-s390x: avoid cpu_single_env + +Pass around CPUState instead of using global cpu_single_env. + +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + target-s390x/translate.c | 356 ++++++++++++++++++++++++----------------------- + 1 file changed, 183 insertions(+), 173 deletions(-) + +diff --git a/target-s390x/translate.c b/target-s390x/translate.c +index 66119cd..3214783 100644 +--- a/target-s390x/translate.c ++++ b/target-s390x/translate.c +@@ -274,21 +274,21 @@ static inline void potential_page_fault(DisasContext *s) + #endif + } + +-static inline uint64_t ld_code2(uint64_t pc) ++static inline uint64_t ld_code2(CPUS390XState *env, uint64_t pc) + { +- return (uint64_t)cpu_lduw_code(cpu_single_env, pc); ++ return (uint64_t)cpu_lduw_code(env, pc); + } + +-static inline uint64_t ld_code4(uint64_t pc) ++static inline uint64_t ld_code4(CPUS390XState *env, uint64_t pc) + { +- return (uint64_t)cpu_ldl_code(cpu_single_env, pc); ++ return (uint64_t)cpu_ldl_code(env, pc); + } + +-static inline uint64_t ld_code6(uint64_t pc) ++static inline uint64_t ld_code6(CPUS390XState *env, uint64_t pc) + { + uint64_t opc; +- opc = (uint64_t)cpu_lduw_code(cpu_single_env, pc) << 32; +- opc |= (uint64_t)(uint32_t)cpu_ldl_code(cpu_single_env, pc + 2); ++ opc = (uint64_t)cpu_lduw_code(env, pc) << 32; ++ opc |= (uint64_t)(uint32_t)cpu_ldl_code(env, pc + 2); + return opc; + } + +@@ -319,7 +319,7 @@ static inline void gen_debug(DisasContext *s) + + #ifdef CONFIG_USER_ONLY + +-static void gen_illegal_opcode(DisasContext *s, int ilc) ++static void gen_illegal_opcode(CPUS390XState *env, DisasContext *s, int ilc) + { + TCGv_i32 tmp = tcg_const_i32(EXCP_SPEC); + update_psw_addr(s); +@@ -331,20 +331,20 @@ static void gen_illegal_opcode(DisasContext *s, int ilc) + + #else /* CONFIG_USER_ONLY */ + +-static void debug_print_inst(DisasContext *s, int ilc) ++static void debug_print_inst(CPUS390XState *env, DisasContext *s, int ilc) + { + #ifdef DEBUG_ILLEGAL_INSTRUCTIONS + uint64_t inst = 0; + + switch (ilc & 3) { + case 1: +- inst = ld_code2(s->pc); ++ inst = ld_code2(env, s->pc); + break; + case 2: +- inst = ld_code4(s->pc); ++ inst = ld_code4(env, s->pc); + break; + case 3: +- inst = ld_code6(s->pc); ++ inst = ld_code6(env, s->pc); + break; + } + +@@ -353,11 +353,12 @@ static void debug_print_inst(DisasContext *s, int ilc) + #endif + } + +-static void gen_program_exception(DisasContext *s, int ilc, int code) ++static void gen_program_exception(CPUS390XState *env, DisasContext *s, int ilc, ++ int code) + { + TCGv_i32 tmp; + +- debug_print_inst(s, ilc); ++ debug_print_inst(env, s, ilc); + + /* remember what pgm exeption this was */ + tmp = tcg_const_i32(code); +@@ -385,20 +386,21 @@ static void gen_program_exception(DisasContext *s, int ilc, int code) + } + + +-static void gen_illegal_opcode(DisasContext *s, int ilc) ++static void gen_illegal_opcode(CPUS390XState *env, DisasContext *s, int ilc) + { +- gen_program_exception(s, ilc, PGM_SPECIFICATION); ++ gen_program_exception(env, s, ilc, PGM_SPECIFICATION); + } + +-static void gen_privileged_exception(DisasContext *s, int ilc) ++static void gen_privileged_exception(CPUS390XState *env, DisasContext *s, ++ int ilc) + { +- gen_program_exception(s, ilc, PGM_PRIVILEGED); ++ gen_program_exception(env, s, ilc, PGM_PRIVILEGED); + } + +-static void check_privileged(DisasContext *s, int ilc) ++static void check_privileged(CPUS390XState *env, DisasContext *s, int ilc) + { + if (s->tb->flags & (PSW_MASK_PSTATE >> 32)) { +- gen_privileged_exception(s, ilc); ++ gen_privileged_exception(env, s, ilc); + } + } + +@@ -1460,7 +1462,8 @@ static void gen_op_clc(DisasContext *s, int l, TCGv_i64 s1, TCGv_i64 s2) + set_cc_static(s); + } + +-static void disas_e3(DisasContext* s, int op, int r1, int x2, int b2, int d2) ++static void disas_e3(CPUS390XState *env, DisasContext* s, int op, int r1, ++ int x2, int b2, int d2) + { + TCGv_i64 addr, tmp, tmp2, tmp3, tmp4; + TCGv_i32 tmp32_1, tmp32_2, tmp32_3; +@@ -1925,14 +1928,14 @@ static void disas_e3(DisasContext* s, int op, int r1, int x2, int b2, int d2) + break; + default: + LOG_DISAS("illegal e3 operation 0x%x\n", op); +- gen_illegal_opcode(s, 3); ++ gen_illegal_opcode(env, s, 3); + break; + } + tcg_temp_free_i64(addr); + } + + #ifndef CONFIG_USER_ONLY +-static void disas_e5(DisasContext* s, uint64_t insn) ++static void disas_e5(CPUS390XState *env, DisasContext* s, uint64_t insn) + { + TCGv_i64 tmp, tmp2; + int op = (insn >> 32) & 0xff; +@@ -1950,7 +1953,7 @@ static void disas_e5(DisasContext* s, uint64_t insn) + break; + default: + LOG_DISAS("illegal e5 operation 0x%x\n", op); +- gen_illegal_opcode(s, 3); ++ gen_illegal_opcode(env, s, 3); + break; + } + +@@ -1959,7 +1962,8 @@ static void disas_e5(DisasContext* s, uint64_t insn) + } + #endif + +-static void disas_eb(DisasContext *s, int op, int r1, int r3, int b2, int d2) ++static void disas_eb(CPUS390XState *env, DisasContext *s, int op, int r1, ++ int r3, int b2, int d2) + { + TCGv_i64 tmp, tmp2, tmp3, tmp4; + TCGv_i32 tmp32_1, tmp32_2; +@@ -2102,7 +2106,7 @@ do_mh: + #ifndef CONFIG_USER_ONLY + case 0x2f: /* LCTLG R1,R3,D2(B2) [RSE] */ + /* Load Control */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); +@@ -2114,7 +2118,7 @@ do_mh: + break; + case 0x25: /* STCTG R1,R3,D2(B2) [RSE] */ + /* Store Control */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r3); +@@ -2191,13 +2195,13 @@ do_mh: + break; + default: + LOG_DISAS("illegal eb operation 0x%x\n", op); +- gen_illegal_opcode(s, ilc); ++ gen_illegal_opcode(env, s, ilc); + break; + } + } + +-static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, +- int r1b) ++static void disas_ed(CPUS390XState *env, DisasContext *s, int op, int r1, ++ int x2, int b2, int d2, int r1b) + { + TCGv_i32 tmp_r1, tmp32; + TCGv_i64 addr, tmp; +@@ -2311,14 +2315,15 @@ static void disas_ed(DisasContext *s, int op, int r1, int x2, int b2, int d2, + break; + default: + LOG_DISAS("illegal ed operation 0x%x\n", op); +- gen_illegal_opcode(s, 3); ++ gen_illegal_opcode(env, s, 3); + return; + } + tcg_temp_free_i32(tmp_r1); + tcg_temp_free_i64(addr); + } + +-static void disas_a5(DisasContext *s, int op, int r1, int i2) ++static void disas_a5(CPUS390XState *env, DisasContext *s, int op, int r1, ++ int i2) + { + TCGv_i64 tmp, tmp2; + TCGv_i32 tmp32; +@@ -2467,12 +2472,13 @@ static void disas_a5(DisasContext *s, int op, int r1, int i2) + break; + default: + LOG_DISAS("illegal a5 operation 0x%x\n", op); +- gen_illegal_opcode(s, 2); ++ gen_illegal_opcode(env, s, 2); + return; + } + } + +-static void disas_a7(DisasContext *s, int op, int r1, int i2) ++static void disas_a7(CPUS390XState *env, DisasContext *s, int op, int r1, ++ int i2) + { + TCGv_i64 tmp, tmp2; + TCGv_i32 tmp32_1, tmp32_2, tmp32_3; +@@ -2604,12 +2610,13 @@ static void disas_a7(DisasContext *s, int op, int r1, int i2) + break; + default: + LOG_DISAS("illegal a7 operation 0x%x\n", op); +- gen_illegal_opcode(s, 2); ++ gen_illegal_opcode(env, s, 2); + return; + } + } + +-static void disas_b2(DisasContext *s, int op, uint32_t insn) ++static void disas_b2(CPUS390XState *env, DisasContext *s, int op, ++ uint32_t insn) + { + TCGv_i64 tmp, tmp2, tmp3; + TCGv_i32 tmp32_1, tmp32_2, tmp32_3; +@@ -2708,7 +2715,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + #ifndef CONFIG_USER_ONLY + case 0x02: /* STIDP D2(B2) [S] */ + /* Store CPU ID */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +@@ -2717,7 +2724,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x04: /* SCK D2(B2) [S] */ + /* Set Clock */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +@@ -2736,7 +2743,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x06: /* SCKC D2(B2) [S] */ + /* Set Clock Comparator */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +@@ -2745,7 +2752,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x07: /* STCKC D2(B2) [S] */ + /* Store Clock Comparator */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +@@ -2754,7 +2761,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x08: /* SPT D2(B2) [S] */ + /* Set CPU Timer */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +@@ -2763,7 +2770,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x09: /* STPT D2(B2) [S] */ + /* Store CPU Timer */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +@@ -2772,7 +2779,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x0a: /* SPKA D2(B2) [S] */ + /* Set PSW Key from Address */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp2 = tcg_temp_new_i64(); +@@ -2784,12 +2791,12 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x0d: /* PTLB [S] */ + /* Purge TLB */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + gen_helper_ptlb(cpu_env); + break; + case 0x10: /* SPX D2(B2) [S] */ + /* Set Prefix Register */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +@@ -2798,7 +2805,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x11: /* STPX D2(B2) [S] */ + /* Store Prefix */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp2 = tcg_temp_new_i64(); +@@ -2809,7 +2816,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x12: /* STAP D2(B2) [S] */ + /* Store CPU Address */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp2 = tcg_temp_new_i64(); +@@ -2823,7 +2830,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x21: /* IPTE R1,R2 [RRE] */ + /* Invalidate PTE */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + r1 = (insn >> 4) & 0xf; + r2 = insn & 0xf; + tmp = load_reg(r1); +@@ -2834,7 +2841,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x29: /* ISKE R1,R2 [RRE] */ + /* Insert Storage Key Extended */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + r1 = (insn >> 4) & 0xf; + r2 = insn & 0xf; + tmp = load_reg(r2); +@@ -2846,7 +2853,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x2a: /* RRBE R1,R2 [RRE] */ + /* Set Storage Key Extended */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + r1 = (insn >> 4) & 0xf; + r2 = insn & 0xf; + tmp32_1 = load_reg32(r1); +@@ -2858,7 +2865,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x2b: /* SSKE R1,R2 [RRE] */ + /* Set Storage Key Extended */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + r1 = (insn >> 4) & 0xf; + r2 = insn & 0xf; + tmp32_1 = load_reg32(r1); +@@ -2869,12 +2876,12 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x34: /* STCH ? */ + /* Store Subchannel */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + gen_op_movi_cc(s, 3); + break; + case 0x46: /* STURA R1,R2 [RRE] */ + /* Store Using Real Address */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + r1 = (insn >> 4) & 0xf; + r2 = insn & 0xf; + tmp32_1 = load_reg32(r1); +@@ -2886,7 +2893,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x50: /* CSP R1,R2 [RRE] */ + /* Compare And Swap And Purge */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + r1 = (insn >> 4) & 0xf; + r2 = insn & 0xf; + tmp32_1 = tcg_const_i32(r1); +@@ -2898,7 +2905,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x5f: /* CHSC ? */ + /* Channel Subsystem Call */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + gen_op_movi_cc(s, 3); + break; + case 0x78: /* STCKE D2(B2) [S] */ +@@ -2912,7 +2919,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x79: /* SACF D2(B2) [S] */ + /* Store Clock Extended */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + potential_page_fault(s); +@@ -2924,7 +2931,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + s->is_jmp = DISAS_EXCP; + break; + case 0x7d: /* STSI D2,(B2) [S] */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = load_reg32(0); +@@ -2950,7 +2957,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0xb1: /* STFL D2(B2) [S] */ + /* Store Facility List (CPU features) at 200 */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + tmp2 = tcg_const_i64(0xc0000000); + tmp = tcg_const_i64(200); + tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s)); +@@ -2959,7 +2966,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0xb2: /* LPSWE D2(B2) [S] */ + /* Load PSW Extended */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp2 = tcg_temp_new_i64(); +@@ -2976,7 +2983,7 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + break; + case 0x20: /* SERVC R1,R2 [RRE] */ + /* SCLP Service call (PV hypercall) */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + potential_page_fault(s); + tmp32_1 = load_reg32(r2); + tmp = load_reg(r1); +@@ -2988,12 +2995,13 @@ static void disas_b2(DisasContext *s, int op, uint32_t insn) + #endif + default: + LOG_DISAS("illegal b2 operation 0x%x\n", op); +- gen_illegal_opcode(s, ilc); ++ gen_illegal_opcode(env, s, ilc); + break; + } + } + +-static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) ++static void disas_b3(CPUS390XState *env, DisasContext *s, int op, int m3, ++ int r1, int r2) + { + TCGv_i64 tmp; + TCGv_i32 tmp32_1, tmp32_2, tmp32_3; +@@ -3263,7 +3271,7 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + break; + default: + LOG_DISAS("illegal b3 operation 0x%x\n", op); +- gen_illegal_opcode(s, 2); ++ gen_illegal_opcode(env, s, 2); + break; + } + +@@ -3271,7 +3279,8 @@ static void disas_b3(DisasContext *s, int op, int m3, int r1, int r2) + #undef FP_HELPER + } + +-static void disas_b9(DisasContext *s, int op, int r1, int r2) ++static void disas_b9(CPUS390XState *env, DisasContext *s, int op, int r1, ++ int r2) + { + TCGv_i64 tmp, tmp2, tmp3; + TCGv_i32 tmp32_1, tmp32_2, tmp32_3; +@@ -3654,12 +3663,12 @@ static void disas_b9(DisasContext *s, int op, int r1, int r2) + break; + default: + LOG_DISAS("illegal b9 operation 0x%x\n", op); +- gen_illegal_opcode(s, 2); ++ gen_illegal_opcode(env, s, 2); + break; + } + } + +-static void disas_c0(DisasContext *s, int op, int r1, int i2) ++static void disas_c0(CPUS390XState *env, DisasContext *s, int op, int r1, int i2) + { + TCGv_i64 tmp; + TCGv_i32 tmp32_1, tmp32_2; +@@ -3755,12 +3764,13 @@ static void disas_c0(DisasContext *s, int op, int r1, int i2) + break; + default: + LOG_DISAS("illegal c0 operation 0x%x\n", op); +- gen_illegal_opcode(s, 3); ++ gen_illegal_opcode(env, s, 3); + break; + } + } + +-static void disas_c2(DisasContext *s, int op, int r1, int i2) ++static void disas_c2(CPUS390XState *env, DisasContext *s, int op, int r1, ++ int i2) + { + TCGv_i64 tmp, tmp2, tmp3; + TCGv_i32 tmp32_1, tmp32_2, tmp32_3; +@@ -3832,7 +3842,7 @@ static void disas_c2(DisasContext *s, int op, int r1, int i2) + break; + default: + LOG_DISAS("illegal c2 operation 0x%x\n", op); +- gen_illegal_opcode(s, 3); ++ gen_illegal_opcode(env, s, 3); + break; + } + } +@@ -3854,7 +3864,7 @@ static void gen_and_or_xor_i32(int opc, TCGv_i32 tmp, TCGv_i32 tmp2) + } + } + +-static void disas_s390_insn(DisasContext *s) ++static void disas_s390_insn(CPUS390XState *env, DisasContext *s) + { + TCGv_i64 tmp, tmp2, tmp3, tmp4; + TCGv_i32 tmp32_1, tmp32_2, tmp32_3, tmp32_4; +@@ -3865,7 +3875,7 @@ static void disas_s390_insn(DisasContext *s) + int ilc; + int l1; + +- opc = cpu_ldub_code(cpu_single_env, s->pc); ++ opc = cpu_ldub_code(env, s->pc); + LOG_DISAS("opc 0x%x\n", opc); + + ilc = get_ilc(opc); +@@ -3873,12 +3883,12 @@ static void disas_s390_insn(DisasContext *s) + switch (opc) { + #ifndef CONFIG_USER_ONLY + case 0x01: /* SAM */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + /* set addressing mode, but we only do 64bit anyways */ + break; + #endif + case 0x6: /* BCTR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r1); + tcg_gen_subi_i32(tmp32_1, tmp32_1, 1); +@@ -3904,7 +3914,7 @@ static void disas_s390_insn(DisasContext *s) + } + break; + case 0x7: /* BCR M1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + if (r2) { + tmp = load_reg(r2); +@@ -3916,7 +3926,7 @@ static void disas_s390_insn(DisasContext *s) + } + break; + case 0xa: /* SVC I [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + debug_insn(insn); + i = insn & 0xff; + update_psw_addr(s); +@@ -3933,7 +3943,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_3); + break; + case 0xd: /* BASR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp = tcg_const_i64(pc_to_link_info(s, s->pc + 2)); + store_reg(r1, tmp); +@@ -3946,7 +3956,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp); + break; + case 0xe: /* MVCL R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = tcg_const_i32(r1); + tmp32_2 = tcg_const_i32(r2); +@@ -3957,7 +3967,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0x10: /* LPR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r2); + set_cc_abs32(s, tmp32_1); +@@ -3966,7 +3976,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_1); + break; + case 0x11: /* LNR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r2); + set_cc_nabs32(s, tmp32_1); +@@ -3975,7 +3985,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_1); + break; + case 0x12: /* LTR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r2); + if (r1 != r2) { +@@ -3985,7 +3995,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_1); + break; + case 0x13: /* LCR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r2); + tcg_gen_neg_i32(tmp32_1, tmp32_1); +@@ -3996,7 +4006,7 @@ static void disas_s390_insn(DisasContext *s) + case 0x14: /* NR R1,R2 [RR] */ + case 0x16: /* OR R1,R2 [RR] */ + case 0x17: /* XR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_2 = load_reg32(r2); + tmp32_1 = load_reg32(r1); +@@ -4007,7 +4017,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0x18: /* LR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r2); + store_reg32(r1, tmp32_1); +@@ -4015,7 +4025,7 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0x15: /* CLR R1,R2 [RR] */ + case 0x19: /* CR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r1); + tmp32_2 = load_reg32(r2); +@@ -4029,7 +4039,7 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0x1a: /* AR R1,R2 [RR] */ + case 0x1e: /* ALR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r1); + tmp32_2 = load_reg32(r2); +@@ -4047,7 +4057,7 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0x1b: /* SR R1,R2 [RR] */ + case 0x1f: /* SLR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r1); + tmp32_2 = load_reg32(r2); +@@ -4065,7 +4075,7 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0x1c: /* MR R1,R2 [RR] */ + /* reg(r1, r1+1) = reg(r1+1) * reg(r2) */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp2 = load_reg(r2); + tmp3 = load_reg((r1 + 1) & 15); +@@ -4079,7 +4089,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp3); + break; + case 0x1d: /* DR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_reg32(r1); + tmp32_2 = load_reg32(r1 + 1); +@@ -4114,21 +4124,21 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp3); + break; + case 0x28: /* LDR R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp = load_freg(r2); + store_freg(r1, tmp); + tcg_temp_free_i64(tmp); + break; + case 0x38: /* LER R1,R2 [RR] */ +- insn = ld_code2(s->pc); ++ insn = ld_code2(env, s->pc); + decode_rr(s, insn, &r1, &r2); + tmp32_1 = load_freg32(r2); + store_freg32(r1, tmp32_1); + tcg_temp_free_i32(tmp32_1); + break; + case 0x40: /* STH R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = load_reg(r1); + tcg_gen_qemu_st16(tmp2, tmp, get_mem_index(s)); +@@ -4136,13 +4146,13 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x41: /* la */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + store_reg(r1, tmp); /* FIXME: 31/24-bit addressing */ + tcg_temp_free_i64(tmp); + break; + case 0x42: /* STC R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = load_reg(r1); + tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s)); +@@ -4150,7 +4160,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x43: /* IC R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s)); +@@ -4159,7 +4169,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x44: /* EX R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = load_reg(r1); + tmp3 = tcg_const_i64(s->pc + 4); +@@ -4172,7 +4182,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp3); + break; + case 0x46: /* BCT R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tcg_temp_free_i64(tmp); + +@@ -4196,14 +4206,14 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp); + break; + case 0x47: /* BC M1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + gen_bcr(s, r1, tmp, s->pc + 4); + tcg_temp_free_i64(tmp); + s->is_jmp = DISAS_TB_JUMP; + break; + case 0x48: /* LH R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tcg_gen_qemu_ld16s(tmp2, tmp, get_mem_index(s)); +@@ -4212,7 +4222,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x49: /* CH R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp32_1 = load_reg32(r1); + tmp32_2 = tcg_temp_new_i32(); +@@ -4228,7 +4238,7 @@ static void disas_s390_insn(DisasContext *s) + case 0x4a: /* AH R1,D2(X2,B2) [RX] */ + case 0x4b: /* SH R1,D2(X2,B2) [RX] */ + case 0x4c: /* MH R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = load_reg32(r1); +@@ -4261,7 +4271,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x4d: /* BAS R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_const_i64(pc_to_link_info(s, s->pc + 4)); + store_reg(r1, tmp2); +@@ -4271,7 +4281,7 @@ static void disas_s390_insn(DisasContext *s) + s->is_jmp = DISAS_JUMP; + break; + case 0x4e: /* CVD R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = tcg_temp_new_i32(); +@@ -4283,7 +4293,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_1); + break; + case 0x50: /* st r1, d2(x2, b2) */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = load_reg(r1); + tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s)); +@@ -4291,7 +4301,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x55: /* CL R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = tcg_temp_new_i32(); +@@ -4307,7 +4317,7 @@ static void disas_s390_insn(DisasContext *s) + case 0x54: /* N R1,D2(X2,B2) [RX] */ + case 0x56: /* O R1,D2(X2,B2) [RX] */ + case 0x57: /* X R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = load_reg32(r1); +@@ -4323,7 +4333,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0x58: /* l r1, d2(x2, b2) */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = tcg_temp_new_i32(); +@@ -4335,7 +4345,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_1); + break; + case 0x59: /* C R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = tcg_temp_new_i32(); +@@ -4352,7 +4362,7 @@ static void disas_s390_insn(DisasContext *s) + case 0x5b: /* S R1,D2(X2,B2) [RX] */ + case 0x5e: /* AL R1,D2(X2,B2) [RX] */ + case 0x5f: /* SL R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp32_1 = load_reg32(r1); + tmp32_2 = tcg_temp_new_i32(); +@@ -4395,7 +4405,7 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0x5c: /* M R1,D2(X2,B2) [RX] */ + /* reg(r1, r1+1) = reg(r1+1) * *(s32*)addr */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tcg_gen_qemu_ld32s(tmp2, tmp, get_mem_index(s)); +@@ -4411,7 +4421,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp3); + break; + case 0x5d: /* D R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp3 = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp32_1 = load_reg32(r1); + tmp32_2 = load_reg32(r1 + 1); +@@ -4445,7 +4455,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp3); + break; + case 0x60: /* STD R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = load_freg(r1); + tcg_gen_qemu_st64(tmp2, tmp, get_mem_index(s)); +@@ -4453,7 +4463,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x68: /* LD R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tcg_gen_qemu_ld64(tmp2, tmp, get_mem_index(s)); +@@ -4462,7 +4472,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x70: /* STE R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = load_freg32(r1); +@@ -4473,7 +4483,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_1); + break; + case 0x71: /* MS R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = load_reg32(r1); +@@ -4488,7 +4498,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0x78: /* LE R1,D2(X2,B2) [RX] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp2 = tcg_temp_new_i64(); + tmp32_1 = tcg_temp_new_i32(); +@@ -4502,8 +4512,8 @@ static void disas_s390_insn(DisasContext *s) + #ifndef CONFIG_USER_ONLY + case 0x80: /* SSM D2(B2) [S] */ + /* Set System Mask */ +- check_privileged(s, ilc); +- insn = ld_code4(s->pc); ++ check_privileged(env, s, ilc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp2 = tcg_temp_new_i64(); +@@ -4518,8 +4528,8 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0x82: /* LPSW D2(B2) [S] */ + /* Load PSW */ +- check_privileged(s, ilc); +- insn = ld_code4(s->pc); ++ check_privileged(env, s, ilc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp2 = tcg_temp_new_i64(); +@@ -4536,9 +4546,9 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0x83: /* DIAG R1,R3,D2 [RS] */ + /* Diagnose call (KVM hypercall) */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + potential_page_fault(s); +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp32_1 = tcg_const_i32(insn & 0xfff); + tmp2 = load_reg(2); +@@ -4553,7 +4563,7 @@ static void disas_s390_insn(DisasContext *s) + case 0x88: /* SRL R1,D2(B2) [RS] */ + case 0x89: /* SLL R1,D2(B2) [RS] */ + case 0x8a: /* SRA R1,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = load_reg32(r1); +@@ -4582,7 +4592,7 @@ static void disas_s390_insn(DisasContext *s) + case 0x8c: /* SRDL R1,D2(B2) [RS] */ + case 0x8d: /* SLDL R1,D2(B2) [RS] */ + case 0x8e: /* SRDA R1,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); /* shift */ + tmp2 = tcg_temp_new_i64(); +@@ -4611,7 +4621,7 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0x98: /* LM R1,R3,D2(B2) [RS] */ + case 0x90: /* STM R1,R3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + + tmp = get_address(s, 0, b2, d2); +@@ -4637,7 +4647,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp4); + break; + case 0x91: /* TM D1(B1),I2 [SI] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_si(s, insn, &i2, &b1, &d1); + tmp2 = tcg_const_i64(i2); + tcg_gen_qemu_ld8u(tmp, tmp, get_mem_index(s)); +@@ -4646,7 +4656,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x92: /* MVI D1(B1),I2 [SI] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_si(s, insn, &i2, &b1, &d1); + tmp2 = tcg_const_i64(i2); + tcg_gen_qemu_st8(tmp2, tmp, get_mem_index(s)); +@@ -4656,7 +4666,7 @@ static void disas_s390_insn(DisasContext *s) + case 0x94: /* NI D1(B1),I2 [SI] */ + case 0x96: /* OI D1(B1),I2 [SI] */ + case 0x97: /* XI D1(B1),I2 [SI] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_si(s, insn, &i2, &b1, &d1); + tmp2 = tcg_temp_new_i64(); + tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s)); +@@ -4679,7 +4689,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x95: /* CLI D1(B1),I2 [SI] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + tmp = decode_si(s, insn, &i2, &b1, &d1); + tmp2 = tcg_temp_new_i64(); + tcg_gen_qemu_ld8u(tmp2, tmp, get_mem_index(s)); +@@ -4688,7 +4698,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0x9a: /* LAM R1,R3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); +@@ -4700,7 +4710,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0x9b: /* STAM R1,R3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); +@@ -4712,21 +4722,21 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0xa5: +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + r1 = (insn >> 20) & 0xf; + op = (insn >> 16) & 0xf; + i2 = insn & 0xffff; +- disas_a5(s, op, r1, i2); ++ disas_a5(env, s, op, r1, i2); + break; + case 0xa7: +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + r1 = (insn >> 20) & 0xf; + op = (insn >> 16) & 0xf; + i2 = (short)insn; +- disas_a7(s, op, r1, i2); ++ disas_a7(env, s, op, r1, i2); + break; + case 0xa8: /* MVCLE R1,R3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); +@@ -4739,7 +4749,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0xa9: /* CLCLE R1,R3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); +@@ -4754,8 +4764,8 @@ static void disas_s390_insn(DisasContext *s) + #ifndef CONFIG_USER_ONLY + case 0xac: /* STNSM D1(B1),I2 [SI] */ + case 0xad: /* STOSM D1(B1),I2 [SI] */ +- check_privileged(s, ilc); +- insn = ld_code4(s->pc); ++ check_privileged(env, s, ilc); ++ insn = ld_code4(env, s->pc); + tmp = decode_si(s, insn, &i2, &b1, &d1); + tmp2 = tcg_temp_new_i64(); + tcg_gen_shri_i64(tmp2, psw_mask, 56); +@@ -4770,8 +4780,8 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + case 0xae: /* SIGP R1,R3,D2(B2) [RS] */ +- check_privileged(s, ilc); +- insn = ld_code4(s->pc); ++ check_privileged(env, s, ilc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp2 = load_reg(r3); +@@ -4784,8 +4794,8 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_1); + break; + case 0xb1: /* LRA R1,D2(X2, B2) [RX] */ +- check_privileged(s, ilc); +- insn = ld_code4(s->pc); ++ check_privileged(env, s, ilc); ++ insn = ld_code4(env, s->pc); + tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2); + tmp32_1 = tcg_const_i32(r1); + potential_page_fault(s); +@@ -4796,7 +4806,7 @@ static void disas_s390_insn(DisasContext *s) + break; + #endif + case 0xb2: +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + op = (insn >> 16) & 0xff; + switch (op) { + case 0x9c: /* STFPC D2(B2) [S] */ +@@ -4813,23 +4823,23 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i64(tmp2); + break; + default: +- disas_b2(s, op, insn); ++ disas_b2(env, s, op, insn); + break; + } + break; + case 0xb3: +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + op = (insn >> 16) & 0xff; + r3 = (insn >> 12) & 0xf; /* aka m3 */ + r1 = (insn >> 4) & 0xf; + r2 = insn & 0xf; +- disas_b3(s, op, r3, r1, r2); ++ disas_b3(env, s, op, r3, r1, r2); + break; + #ifndef CONFIG_USER_ONLY + case 0xb6: /* STCTL R1,R3,D2(B2) [RS] */ + /* Store Control */ +- check_privileged(s, ilc); +- insn = ld_code4(s->pc); ++ check_privileged(env, s, ilc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); +@@ -4842,8 +4852,8 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0xb7: /* LCTL R1,R3,D2(B2) [RS] */ + /* Load Control */ +- check_privileged(s, ilc); +- insn = ld_code4(s->pc); ++ check_privileged(env, s, ilc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); +@@ -4856,14 +4866,14 @@ static void disas_s390_insn(DisasContext *s) + break; + #endif + case 0xb9: +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + r1 = (insn >> 4) & 0xf; + r2 = insn & 0xf; + op = (insn >> 16) & 0xff; +- disas_b9(s, op, r1, r2); ++ disas_b9(env, s, op, r1, r2); + break; + case 0xba: /* CS R1,R3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = tcg_const_i32(r1); +@@ -4876,7 +4886,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0xbd: /* CLM R1,M3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = load_reg32(r1); +@@ -4889,7 +4899,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0xbe: /* STCM R1,M3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + tmp = get_address(s, 0, b2, d2); + tmp32_1 = load_reg32(r1); +@@ -4901,7 +4911,7 @@ static void disas_s390_insn(DisasContext *s) + tcg_temp_free_i32(tmp32_2); + break; + case 0xbf: /* ICM R1,M3,D2(B2) [RS] */ +- insn = ld_code4(s->pc); ++ insn = ld_code4(env, s->pc); + decode_rs(s, insn, &r1, &r3, &b2, &d2); + if (r3 == 15) { + /* effectively a 32-bit load */ +@@ -4956,16 +4966,16 @@ static void disas_s390_insn(DisasContext *s) + break; + case 0xc0: + case 0xc2: +- insn = ld_code6(s->pc); ++ insn = ld_code6(env, s->pc); + r1 = (insn >> 36) & 0xf; + op = (insn >> 32) & 0xf; + i2 = (int)insn; + switch (opc) { + case 0xc0: +- disas_c0(s, op, r1, i2); ++ disas_c0(env, s, op, r1, i2); + break; + case 0xc2: +- disas_c2(s, op, r1, i2); ++ disas_c2(env, s, op, r1, i2); + break; + default: + tcg_abort(); +@@ -4978,7 +4988,7 @@ static void disas_s390_insn(DisasContext *s) + case 0xd7: /* XC D1(L,B1),D2(B2) [SS] */ + case 0xdc: /* TR D1(L,B1),D2(B2) [SS] */ + case 0xf3: /* UNPK D1(L1,B1),D2(L2,B2) [SS] */ +- insn = ld_code6(s->pc); ++ insn = ld_code6(env, s->pc); + vl = tcg_const_i32((insn >> 32) & 0xff); + b1 = (insn >> 28) & 0xf; + b2 = (insn >> 12) & 0xf; +@@ -5026,9 +5036,9 @@ static void disas_s390_insn(DisasContext *s) + #ifndef CONFIG_USER_ONLY + case 0xda: /* MVCP D1(R1,B1),D2(B2),R3 [SS] */ + case 0xdb: /* MVCS D1(R1,B1),D2(B2),R3 [SS] */ +- check_privileged(s, ilc); ++ check_privileged(env, s, ilc); + potential_page_fault(s); +- insn = ld_code6(s->pc); ++ insn = ld_code6(env, s->pc); + r1 = (insn >> 36) & 0xf; + r3 = (insn >> 32) & 0xf; + b1 = (insn >> 28) & 0xf; +@@ -5051,7 +5061,7 @@ static void disas_s390_insn(DisasContext *s) + break; + #endif + case 0xe3: +- insn = ld_code6(s->pc); ++ insn = ld_code6(env, s->pc); + debug_insn(insn); + op = insn & 0xff; + r1 = (insn >> 36) & 0xf; +@@ -5059,19 +5069,19 @@ static void disas_s390_insn(DisasContext *s) + b2 = (insn >> 28) & 0xf; + d2 = ((int)((((insn >> 16) & 0xfff) + | ((insn << 4) & 0xff000)) << 12)) >> 12; +- disas_e3(s, op, r1, x2, b2, d2 ); ++ disas_e3(env, s, op, r1, x2, b2, d2 ); + break; + #ifndef CONFIG_USER_ONLY + case 0xe5: + /* Test Protection */ +- check_privileged(s, ilc); +- insn = ld_code6(s->pc); ++ check_privileged(env, s, ilc); ++ insn = ld_code6(env, s->pc); + debug_insn(insn); +- disas_e5(s, insn); ++ disas_e5(env, s, insn); + break; + #endif + case 0xeb: +- insn = ld_code6(s->pc); ++ insn = ld_code6(env, s->pc); + debug_insn(insn); + op = insn & 0xff; + r1 = (insn >> 36) & 0xf; +@@ -5079,10 +5089,10 @@ static void disas_s390_insn(DisasContext *s) + b2 = (insn >> 28) & 0xf; + d2 = ((int)((((insn >> 16) & 0xfff) + | ((insn << 4) & 0xff000)) << 12)) >> 12; +- disas_eb(s, op, r1, r3, b2, d2); ++ disas_eb(env, s, op, r1, r3, b2, d2); + break; + case 0xed: +- insn = ld_code6(s->pc); ++ insn = ld_code6(env, s->pc); + debug_insn(insn); + op = insn & 0xff; + r1 = (insn >> 36) & 0xf; +@@ -5090,11 +5100,11 @@ static void disas_s390_insn(DisasContext *s) + b2 = (insn >> 28) & 0xf; + d2 = (short)((insn >> 16) & 0xfff); + r1b = (insn >> 12) & 0xf; +- disas_ed(s, op, r1, x2, b2, d2, r1b); ++ disas_ed(env, s, op, r1, x2, b2, d2, r1b); + break; + default: + qemu_log_mask(LOG_UNIMP, "unimplemented opcode 0x%x\n", opc); +- gen_illegal_opcode(s, ilc); ++ gen_illegal_opcode(env, s, ilc); + break; + } + +@@ -5167,7 +5177,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env, + LOG_DISAS("pc " TARGET_FMT_lx "\n", + dc.pc); + #endif +- disas_s390_insn(&dc); ++ disas_s390_insn(env, &dc); + + num_insns++; + if (env->singlestep_enabled) { +-- +1.7.12.1 + diff --git a/0027-target-lm32-switch-to-AREG0-free-mode.patch b/0027-target-lm32-switch-to-AREG0-free-mode.patch new file mode 100644 index 0000000..9a92a12 --- /dev/null +++ b/0027-target-lm32-switch-to-AREG0-free-mode.patch @@ -0,0 +1,282 @@ +From 25e9a95d0571c40738daa479467d757eb477739e Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 06:57:17 +0000 +Subject: [PATCH] target-lm32: switch to AREG0 free mode + +Add an explicit CPUState parameter instead of relying on AREG0 +and switch to AREG0 free mode. + +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-lm32/Makefile.objs | 2 -- + target-lm32/helper.h | 20 ++++++++++---------- + target-lm32/op_helper.c | 29 +++++++++++------------------ + target-lm32/translate.c | 28 +++++++++++++--------------- + 5 files changed, 35 insertions(+), 46 deletions(-) + +diff --git a/configure b/configure +index 3ad6f74..1e3ea7f 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | i386 | or32 | s390x | sparc* | x86_64 | xtensa* | ppc*) ++ alpha | i386 | lm32 | or32 | s390x | sparc* | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-lm32/Makefile.objs b/target-lm32/Makefile.objs +index 2e0e093..ca20f21 100644 +--- a/target-lm32/Makefile.objs ++++ b/target-lm32/Makefile.objs +@@ -1,4 +1,2 @@ + obj-y += translate.o op_helper.o helper.o cpu.o + obj-$(CONFIG_SOFTMMU) += machine.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-lm32/helper.h b/target-lm32/helper.h +index 9d335ef..07f5670 100644 +--- a/target-lm32/helper.h ++++ b/target-lm32/helper.h +@@ -1,14 +1,14 @@ + #include "def-helper.h" + +-DEF_HELPER_1(raise_exception, void, i32) +-DEF_HELPER_0(hlt, void) +-DEF_HELPER_1(wcsr_im, void, i32) +-DEF_HELPER_1(wcsr_ip, void, i32) +-DEF_HELPER_1(wcsr_jtx, void, i32) +-DEF_HELPER_1(wcsr_jrx, void, i32) +-DEF_HELPER_0(rcsr_im, i32) +-DEF_HELPER_0(rcsr_ip, i32) +-DEF_HELPER_0(rcsr_jtx, i32) +-DEF_HELPER_0(rcsr_jrx, i32) ++DEF_HELPER_2(raise_exception, void, env, i32) ++DEF_HELPER_1(hlt, void, env) ++DEF_HELPER_2(wcsr_im, void, env, i32) ++DEF_HELPER_2(wcsr_ip, void, env, i32) ++DEF_HELPER_2(wcsr_jtx, void, env, i32) ++DEF_HELPER_2(wcsr_jrx, void, env, i32) ++DEF_HELPER_1(rcsr_im, i32, env) ++DEF_HELPER_1(rcsr_ip, i32, env) ++DEF_HELPER_1(rcsr_jtx, i32, env) ++DEF_HELPER_1(rcsr_jrx, i32, env) + + #include "def-helper.h" +diff --git a/target-lm32/op_helper.c b/target-lm32/op_helper.c +index 51edc1a..7b91d8c 100644 +--- a/target-lm32/op_helper.c ++++ b/target-lm32/op_helper.c +@@ -1,6 +1,5 @@ + #include + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helper.h" + #include "host-utils.h" + +@@ -18,55 +17,55 @@ + #define SHIFT 3 + #include "softmmu_template.h" + +-void helper_raise_exception(uint32_t index) ++void helper_raise_exception(CPULM32State *env, uint32_t index) + { + env->exception_index = index; + cpu_loop_exit(env); + } + +-void helper_hlt(void) ++void helper_hlt(CPULM32State *env) + { + env->halted = 1; + env->exception_index = EXCP_HLT; + cpu_loop_exit(env); + } + +-void helper_wcsr_im(uint32_t im) ++void helper_wcsr_im(CPULM32State *env, uint32_t im) + { + lm32_pic_set_im(env->pic_state, im); + } + +-void helper_wcsr_ip(uint32_t im) ++void helper_wcsr_ip(CPULM32State *env, uint32_t im) + { + lm32_pic_set_ip(env->pic_state, im); + } + +-void helper_wcsr_jtx(uint32_t jtx) ++void helper_wcsr_jtx(CPULM32State *env, uint32_t jtx) + { + lm32_juart_set_jtx(env->juart_state, jtx); + } + +-void helper_wcsr_jrx(uint32_t jrx) ++void helper_wcsr_jrx(CPULM32State *env, uint32_t jrx) + { + lm32_juart_set_jrx(env->juart_state, jrx); + } + +-uint32_t helper_rcsr_im(void) ++uint32_t helper_rcsr_im(CPULM32State *env) + { + return lm32_pic_get_im(env->pic_state); + } + +-uint32_t helper_rcsr_ip(void) ++uint32_t helper_rcsr_ip(CPULM32State *env) + { + return lm32_pic_get_ip(env->pic_state); + } + +-uint32_t helper_rcsr_jtx(void) ++uint32_t helper_rcsr_jtx(CPULM32State *env) + { + return lm32_juart_get_jtx(env->juart_state); + } + +-uint32_t helper_rcsr_jrx(void) ++uint32_t helper_rcsr_jrx(CPULM32State *env) + { + return lm32_juart_get_jrx(env->juart_state); + } +@@ -74,17 +73,12 @@ uint32_t helper_rcsr_jrx(void) + /* Try to fill the TLB and return an exception if error. If retaddr is + NULL, it means that the function was called in C code (i.e. not + from generated code or from helper.c) */ +-/* XXX: fix it to restore all registers */ +-void tlb_fill(CPULM32State *env1, target_ulong addr, int is_write, int mmu_idx, ++void tlb_fill(CPULM32State *env, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) + { + TranslationBlock *tb; +- CPULM32State *saved_env; + int ret; + +- saved_env = env; +- env = env1; +- + ret = cpu_lm32_handle_mmu_fault(env, addr, is_write, mmu_idx); + if (unlikely(ret)) { + if (retaddr) { +@@ -98,7 +92,6 @@ void tlb_fill(CPULM32State *env1, target_ulong addr, int is_write, int mmu_idx, + } + cpu_loop_exit(env); + } +- env = saved_env; + } + #endif + +diff --git a/target-lm32/translate.c b/target-lm32/translate.c +index 872a2ba..5f6dcba 100644 +--- a/target-lm32/translate.c ++++ b/target-lm32/translate.c +@@ -116,7 +116,7 @@ static inline void t_gen_raise_exception(DisasContext *dc, uint32_t index) + { + TCGv_i32 tmp = tcg_const_i32(index); + +- gen_helper_raise_exception(tmp); ++ gen_helper_raise_exception(cpu_env, tmp); + tcg_temp_free_i32(tmp); + } + +@@ -179,7 +179,7 @@ static void dec_and(DisasContext *dc) + } else { + if (dc->r0 == 0 && dc->r1 == 0 && dc->r2 == 0) { + tcg_gen_movi_tl(cpu_pc, dc->pc + 4); +- gen_helper_hlt(); ++ gen_helper_hlt(cpu_env); + } else { + tcg_gen_and_tl(cpu_R[dc->r2], cpu_R[dc->r0], cpu_R[dc->r1]); + } +@@ -601,10 +601,10 @@ static void dec_rcsr(DisasContext *dc) + tcg_gen_mov_tl(cpu_R[dc->r2], cpu_ie); + break; + case CSR_IM: +- gen_helper_rcsr_im(cpu_R[dc->r2]); ++ gen_helper_rcsr_im(cpu_R[dc->r2], cpu_env); + break; + case CSR_IP: +- gen_helper_rcsr_ip(cpu_R[dc->r2]); ++ gen_helper_rcsr_ip(cpu_R[dc->r2], cpu_env); + break; + case CSR_CC: + tcg_gen_mov_tl(cpu_R[dc->r2], cpu_cc); +@@ -622,10 +622,10 @@ static void dec_rcsr(DisasContext *dc) + tcg_gen_mov_tl(cpu_R[dc->r2], cpu_deba); + break; + case CSR_JTX: +- gen_helper_rcsr_jtx(cpu_R[dc->r2]); ++ gen_helper_rcsr_jtx(cpu_R[dc->r2], cpu_env); + break; + case CSR_JRX: +- gen_helper_rcsr_jrx(cpu_R[dc->r2]); ++ gen_helper_rcsr_jrx(cpu_R[dc->r2], cpu_env); + break; + case CSR_ICC: + case CSR_DCC: +@@ -812,7 +812,7 @@ static void dec_wcsr(DisasContext *dc) + if (use_icount) { + gen_io_start(); + } +- gen_helper_wcsr_im(cpu_R[dc->r1]); ++ gen_helper_wcsr_im(cpu_env, cpu_R[dc->r1]); + tcg_gen_movi_tl(cpu_pc, dc->pc + 4); + if (use_icount) { + gen_io_end(); +@@ -824,7 +824,7 @@ static void dec_wcsr(DisasContext *dc) + if (use_icount) { + gen_io_start(); + } +- gen_helper_wcsr_ip(cpu_R[dc->r1]); ++ gen_helper_wcsr_ip(cpu_env, cpu_R[dc->r1]); + tcg_gen_movi_tl(cpu_pc, dc->pc + 4); + if (use_icount) { + gen_io_end(); +@@ -844,10 +844,10 @@ static void dec_wcsr(DisasContext *dc) + tcg_gen_mov_tl(cpu_deba, cpu_R[dc->r1]); + break; + case CSR_JTX: +- gen_helper_wcsr_jtx(cpu_R[dc->r1]); ++ gen_helper_wcsr_jtx(cpu_env, cpu_R[dc->r1]); + break; + case CSR_JRX: +- gen_helper_wcsr_jrx(cpu_R[dc->r1]); ++ gen_helper_wcsr_jrx(cpu_env, cpu_R[dc->r1]); + break; + case CSR_DC: + tcg_gen_mov_tl(cpu_dc, cpu_R[dc->r1]); +@@ -940,15 +940,13 @@ static const DecoderInfo decinfo[] = { + dec_cmpne + }; + +-static inline void decode(DisasContext *dc) ++static inline void decode(DisasContext *dc, uint32_t ir) + { +- uint32_t ir; +- + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP))) { + tcg_gen_debug_insn_start(dc->pc); + } + +- dc->ir = ir = ldl_code(dc->pc); ++ dc->ir = ir; + LOG_DIS("%8.8x\t", dc->ir); + + /* try guessing 'empty' instruction memory, although it may be a valid +@@ -1068,7 +1066,7 @@ static void gen_intermediate_code_internal(CPULM32State *env, + gen_io_start(); + } + +- decode(dc); ++ decode(dc, cpu_ldl_code(env, dc->pc)); + dc->pc += 4; + num_insns++; + +-- +1.7.12.1 + diff --git a/0028-target-m68k-switch-to-AREG0-free-mode.patch b/0028-target-m68k-switch-to-AREG0-free-mode.patch new file mode 100644 index 0000000..220b78d --- /dev/null +++ b/0028-target-m68k-switch-to-AREG0-free-mode.patch @@ -0,0 +1,502 @@ +From 2ace9fd11db103aecebf451aff3bc23838248667 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:27:38 +0000 +Subject: [PATCH] target-m68k: switch to AREG0 free mode + +Add an explicit CPUState parameter instead of relying on AREG0 +and switch to AREG0 free mode. + +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-m68k/Makefile.objs | 2 -- + target-m68k/helpers.h | 2 +- + target-m68k/op_helper.c | 68 +++++++++++++++++------------------------- + target-m68k/translate.c | 76 ++++++++++++++++++++++++----------------------- + 5 files changed, 68 insertions(+), 82 deletions(-) + +diff --git a/configure b/configure +index 1e3ea7f..af03942 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | i386 | lm32 | or32 | s390x | sparc* | x86_64 | xtensa* | ppc*) ++ alpha | i386 | lm32 | m68k | or32 | s390x | sparc* | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-m68k/Makefile.objs b/target-m68k/Makefile.objs +index cda6015..7eccfab 100644 +--- a/target-m68k/Makefile.objs ++++ b/target-m68k/Makefile.objs +@@ -1,5 +1,3 @@ + obj-y += m68k-semi.o + obj-y += translate.o op_helper.o helper.o cpu.o + obj-$(CONFIG_SOFTMMU) += machine.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-m68k/helpers.h b/target-m68k/helpers.h +index cb8a0c7..8112b44 100644 +--- a/target-m68k/helpers.h ++++ b/target-m68k/helpers.h +@@ -49,6 +49,6 @@ DEF_HELPER_3(set_mac_exts, void, env, i32, i32) + DEF_HELPER_3(set_mac_extu, void, env, i32, i32) + + DEF_HELPER_2(flush_flags, void, env, i32) +-DEF_HELPER_1(raise_exception, void, i32) ++DEF_HELPER_2(raise_exception, void, env, i32) + + #include "def-helper.h" +diff --git a/target-m68k/op_helper.c b/target-m68k/op_helper.c +index 1971a57..3116287 100644 +--- a/target-m68k/op_helper.c ++++ b/target-m68k/op_helper.c +@@ -17,17 +17,16 @@ + * License along with this library; if not, see . + */ + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helpers.h" + + #if defined(CONFIG_USER_ONLY) + +-void do_interrupt(CPUM68KState *env1) ++void do_interrupt(CPUM68KState *env) + { +- env1->exception_index = -1; ++ env->exception_index = -1; + } + +-void do_interrupt_m68k_hardirq(CPUM68KState *env1) ++void do_interrupt_m68k_hardirq(CPUM68KState *env) + { + } + +@@ -54,16 +53,12 @@ extern int semihosting_enabled; + /* Try to fill the TLB and return an exception if error. If retaddr is + NULL, it means that the function was called in C code (i.e. not + from generated code or from helper.c) */ +-/* XXX: fix it to restore all registers */ +-void tlb_fill(CPUM68KState *env1, target_ulong addr, int is_write, int mmu_idx, ++void tlb_fill(CPUM68KState *env, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) + { + TranslationBlock *tb; +- CPUM68KState *saved_env; + int ret; + +- saved_env = env; +- env = env1; + ret = cpu_m68k_handle_mmu_fault(env, addr, is_write, mmu_idx); + if (unlikely(ret)) { + if (retaddr) { +@@ -77,24 +72,23 @@ void tlb_fill(CPUM68KState *env1, target_ulong addr, int is_write, int mmu_idx, + } + cpu_loop_exit(env); + } +- env = saved_env; + } + +-static void do_rte(void) ++static void do_rte(CPUM68KState *env) + { + uint32_t sp; + uint32_t fmt; + + sp = env->aregs[7]; +- fmt = ldl_kernel(sp); +- env->pc = ldl_kernel(sp + 4); ++ fmt = cpu_ldl_kernel(env, sp); ++ env->pc = cpu_ldl_kernel(env, sp + 4); + sp |= (fmt >> 28) & 3; + env->sr = fmt & 0xffff; + m68k_switch_sp(env); + env->aregs[7] = sp + 8; + } + +-static void do_interrupt_all(int is_hw) ++static void do_interrupt_all(CPUM68KState *env, int is_hw) + { + uint32_t sp; + uint32_t fmt; +@@ -108,14 +102,14 @@ static void do_interrupt_all(int is_hw) + switch (env->exception_index) { + case EXCP_RTE: + /* Return from an exception. */ +- do_rte(); ++ do_rte(env); + return; + case EXCP_HALT_INSN: + if (semihosting_enabled + && (env->sr & SR_S) != 0 + && (env->pc & 3) == 0 +- && lduw_code(env->pc - 4) == 0x4e71 +- && ldl_code(env->pc) == 0x4e7bf000) { ++ && cpu_lduw_code(env, env->pc - 4) == 0x4e71 ++ && cpu_ldl_code(env, env->pc) == 0x4e7bf000) { + env->pc += 4; + do_m68k_semihosting(env, env->dregs[0]); + return; +@@ -151,44 +145,34 @@ static void do_interrupt_all(int is_hw) + /* ??? This could cause MMU faults. */ + sp &= ~3; + sp -= 4; +- stl_kernel(sp, retaddr); ++ cpu_stl_kernel(env, sp, retaddr); + sp -= 4; +- stl_kernel(sp, fmt); ++ cpu_stl_kernel(env, sp, fmt); + env->aregs[7] = sp; + /* Jump to vector. */ +- env->pc = ldl_kernel(env->vbr + vector); ++ env->pc = cpu_ldl_kernel(env, env->vbr + vector); + } + +-void do_interrupt(CPUM68KState *env1) ++void do_interrupt(CPUM68KState *env) + { +- CPUM68KState *saved_env; +- +- saved_env = env; +- env = env1; +- do_interrupt_all(0); +- env = saved_env; ++ do_interrupt_all(env, 0); + } + +-void do_interrupt_m68k_hardirq(CPUM68KState *env1) ++void do_interrupt_m68k_hardirq(CPUM68KState *env) + { +- CPUM68KState *saved_env; +- +- saved_env = env; +- env = env1; +- do_interrupt_all(1); +- env = saved_env; ++ do_interrupt_all(env, 1); + } + #endif + +-static void raise_exception(int tt) ++static void raise_exception(CPUM68KState *env, int tt) + { + env->exception_index = tt; + cpu_loop_exit(env); + } + +-void HELPER(raise_exception)(uint32_t tt) ++void HELPER(raise_exception)(CPUM68KState *env, uint32_t tt) + { +- raise_exception(tt); ++ raise_exception(env, tt); + } + + void HELPER(divu)(CPUM68KState *env, uint32_t word) +@@ -202,8 +186,9 @@ void HELPER(divu)(CPUM68KState *env, uint32_t word) + num = env->div1; + den = env->div2; + /* ??? This needs to make sure the throwing location is accurate. */ +- if (den == 0) +- raise_exception(EXCP_DIV0); ++ if (den == 0) { ++ raise_exception(env, EXCP_DIV0); ++ } + quot = num / den; + rem = num % den; + flags = 0; +@@ -231,8 +216,9 @@ void HELPER(divs)(CPUM68KState *env, uint32_t word) + + num = env->div1; + den = env->div2; +- if (den == 0) +- raise_exception(EXCP_DIV0); ++ if (den == 0) { ++ raise_exception(env, EXCP_DIV0); ++ } + quot = num / den; + rem = num % den; + flags = 0; +diff --git a/target-m68k/translate.c b/target-m68k/translate.c +index 9fc1e31..10bb303 100644 +--- a/target-m68k/translate.c ++++ b/target-m68k/translate.c +@@ -260,9 +260,9 @@ static TCGv gen_ldst(DisasContext *s, int opsize, TCGv addr, TCGv val, + static inline uint32_t read_im32(DisasContext *s) + { + uint32_t im; +- im = ((uint32_t)lduw_code(s->pc)) << 16; ++ im = ((uint32_t)cpu_lduw_code(cpu_single_env, s->pc)) << 16; + s->pc += 2; +- im |= lduw_code(s->pc); ++ im |= cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + return im; + } +@@ -297,7 +297,7 @@ static TCGv gen_lea_indexed(DisasContext *s, int opsize, TCGv base) + uint32_t bd, od; + + offset = s->pc; +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + + if ((ext & 0x800) == 0 && !m68k_feature(s->env, M68K_FEATURE_WORD_INDEX)) +@@ -311,7 +311,7 @@ static TCGv gen_lea_indexed(DisasContext *s, int opsize, TCGv base) + if ((ext & 0x30) > 0x10) { + /* base displacement */ + if ((ext & 0x30) == 0x20) { +- bd = (int16_t)lduw_code(s->pc); ++ bd = (int16_t)cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + } else { + bd = read_im32(s); +@@ -360,7 +360,7 @@ static TCGv gen_lea_indexed(DisasContext *s, int opsize, TCGv base) + if ((ext & 3) > 1) { + /* outer displacement */ + if ((ext & 3) == 2) { +- od = (int16_t)lduw_code(s->pc); ++ od = (int16_t)cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + } else { + od = read_im32(s); +@@ -514,7 +514,7 @@ static TCGv gen_lea(DisasContext *s, uint16_t insn, int opsize) + case 5: /* Indirect displacement. */ + reg = AREG(insn, 0); + tmp = tcg_temp_new(); +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tmp, reg, (int16_t)ext); + return tmp; +@@ -524,7 +524,7 @@ static TCGv gen_lea(DisasContext *s, uint16_t insn, int opsize) + case 7: /* Other */ + switch (insn & 7) { + case 0: /* Absolute short. */ +- offset = ldsw_code(s->pc); ++ offset = cpu_ldsw_code(cpu_single_env, s->pc); + s->pc += 2; + return tcg_const_i32(offset); + case 1: /* Absolute long. */ +@@ -532,7 +532,7 @@ static TCGv gen_lea(DisasContext *s, uint16_t insn, int opsize) + return tcg_const_i32(offset); + case 2: /* pc displacement */ + offset = s->pc; +- offset += ldsw_code(s->pc); ++ offset += cpu_ldsw_code(cpu_single_env, s->pc); + s->pc += 2; + return tcg_const_i32(offset); + case 3: /* pc index+displacement. */ +@@ -638,17 +638,19 @@ static TCGv gen_ea(DisasContext *s, uint16_t insn, int opsize, TCGv val, + /* Sign extend values for consistency. */ + switch (opsize) { + case OS_BYTE: +- if (what == EA_LOADS) +- offset = ldsb_code(s->pc + 1); +- else +- offset = ldub_code(s->pc + 1); ++ if (what == EA_LOADS) { ++ offset = cpu_ldsb_code(cpu_single_env, s->pc + 1); ++ } else { ++ offset = cpu_ldub_code(cpu_single_env, s->pc + 1); ++ } + s->pc += 2; + break; + case OS_WORD: +- if (what == EA_LOADS) +- offset = ldsw_code(s->pc); +- else +- offset = lduw_code(s->pc); ++ if (what == EA_LOADS) { ++ offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ } else { ++ offset = cpu_lduw_code(cpu_single_env, s->pc); ++ } + s->pc += 2; + break; + case OS_LONG: +@@ -815,7 +817,7 @@ static void gen_exception(DisasContext *s, uint32_t where, int nr) + { + gen_flush_cc_op(s); + gen_jmp_im(s, where); +- gen_helper_raise_exception(tcg_const_i32(nr)); ++ gen_helper_raise_exception(cpu_env, tcg_const_i32(nr)); + } + + static inline void gen_addr_fault(DisasContext *s) +@@ -934,7 +936,7 @@ DISAS_INSN(divl) + TCGv reg; + uint16_t ext; + +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + if (ext & 0x87f8) { + gen_exception(s, s->pc - 4, EXCP_UNSUPPORTED); +@@ -1086,7 +1088,7 @@ DISAS_INSN(movem) + TCGv tmp; + int is_load; + +- mask = lduw_code(s->pc); ++ mask = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + tmp = gen_lea(s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { +@@ -1130,7 +1132,7 @@ DISAS_INSN(bitop_im) + opsize = OS_LONG; + op = (insn >> 6) & 3; + +- bitnum = lduw_code(s->pc); ++ bitnum = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + if (bitnum & 0xff00) { + disas_undef(s, insn); +@@ -1383,7 +1385,7 @@ static void gen_set_sr(DisasContext *s, uint16_t insn, int ccr_only) + else if ((insn & 0x3f) == 0x3c) + { + uint16_t val; +- val = lduw_code(s->pc); ++ val = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + gen_set_sr_im(s, val, ccr_only); + } +@@ -1507,7 +1509,7 @@ DISAS_INSN(mull) + + /* The upper 32 bits of the product are discarded, so + muls.l and mulu.l are functionally equivalent. */ +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + if (ext & 0x87ff) { + gen_exception(s, s->pc - 4, EXCP_UNSUPPORTED); +@@ -1528,7 +1530,7 @@ DISAS_INSN(link) + TCGv reg; + TCGv tmp; + +- offset = ldsw_code(s->pc); ++ offset = cpu_ldsw_code(cpu_single_env, s->pc); + s->pc += 2; + reg = AREG(insn, 0); + tmp = tcg_temp_new(); +@@ -1649,7 +1651,7 @@ DISAS_INSN(branch) + op = (insn >> 8) & 0xf; + offset = (int8_t)insn; + if (offset == 0) { +- offset = ldsw_code(s->pc); ++ offset = cpu_ldsw_code(cpu_single_env, s->pc); + s->pc += 2; + } else if (offset == -1) { + offset = read_im32(s); +@@ -1934,13 +1936,13 @@ DISAS_INSN(strldsr) + uint32_t addr; + + addr = s->pc - 2; +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + if (ext != 0x46FC) { + gen_exception(s, addr, EXCP_UNSUPPORTED); + return; + } +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + if (IS_USER(s) || (ext & SR_S) == 0) { + gen_exception(s, addr, EXCP_PRIVILEGE); +@@ -2008,7 +2010,7 @@ DISAS_INSN(stop) + return; + } + +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + + gen_set_sr_im(s, ext, 0); +@@ -2035,7 +2037,7 @@ DISAS_INSN(movec) + return; + } + +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + + if (ext & 0x8000) { +@@ -2100,7 +2102,7 @@ DISAS_INSN(fpu) + int set_dest; + int opsize; + +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + opmode = ext & 0x7f; + switch ((ext >> 13) & 7) { +@@ -2136,7 +2138,7 @@ DISAS_INSN(fpu) + tcg_gen_addi_i32(tmp32, tmp32, -8); + break; + case 5: +- offset = ldsw_code(s->pc); ++ offset = cpu_ldsw_code(cpu_single_env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tmp32, tmp32, offset); + break; +@@ -2250,12 +2252,12 @@ DISAS_INSN(fpu) + tcg_gen_addi_i32(tmp32, tmp32, -8); + break; + case 5: +- offset = ldsw_code(s->pc); ++ offset = cpu_ldsw_code(cpu_single_env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tmp32, tmp32, offset); + break; + case 7: +- offset = ldsw_code(s->pc); ++ offset = cpu_ldsw_code(cpu_single_env, s->pc); + offset += s->pc - 2; + s->pc += 2; + tcg_gen_addi_i32(tmp32, tmp32, offset); +@@ -2381,10 +2383,10 @@ DISAS_INSN(fbcc) + int l1; + + addr = s->pc; +- offset = ldsw_code(s->pc); ++ offset = cpu_ldsw_code(cpu_single_env, s->pc); + s->pc += 2; + if (insn & (1 << 6)) { +- offset = (offset << 16) | lduw_code(s->pc); ++ offset = (offset << 16) | cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + } + +@@ -2506,7 +2508,7 @@ DISAS_INSN(mac) + s->done_mac = 1; + } + +- ext = lduw_code(s->pc); ++ ext = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + + acc = ((insn >> 7) & 1) | ((ext >> 3) & 2); +@@ -2941,7 +2943,7 @@ static void disas_m68k_insn(CPUM68KState * env, DisasContext *s) + { + uint16_t insn; + +- insn = lduw_code(s->pc); ++ insn = cpu_lduw_code(cpu_single_env, s->pc); + s->pc += 2; + + opcode_table[insn](s, insn); +@@ -3028,7 +3030,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb, + gen_flush_cc_op(dc); + tcg_gen_movi_i32(QREG_PC, dc->pc); + } +- gen_helper_raise_exception(tcg_const_i32(EXCP_DEBUG)); ++ gen_helper_raise_exception(cpu_env, tcg_const_i32(EXCP_DEBUG)); + } else { + switch(dc->is_jmp) { + case DISAS_NEXT: +-- +1.7.12.1 + diff --git a/0029-target-m68k-avoid-using-cpu_single_env.patch b/0029-target-m68k-avoid-using-cpu_single_env.patch new file mode 100644 index 0000000..871bbe8 --- /dev/null +++ b/0029-target-m68k-avoid-using-cpu_single_env.patch @@ -0,0 +1,901 @@ +From 5560cd783146734a60c446f43227044cbb580edd Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sat, 8 Sep 2012 10:48:20 +0000 +Subject: [PATCH] target-m68k: avoid using cpu_single_env + +Pass around CPUState instead of using global cpu_single_env. + +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + target-m68k/translate.c | 270 +++++++++++++++++++++++++----------------------- + 1 file changed, 140 insertions(+), 130 deletions(-) + +diff --git a/target-m68k/translate.c b/target-m68k/translate.c +index 10bb303..fb707f2 100644 +--- a/target-m68k/translate.c ++++ b/target-m68k/translate.c +@@ -150,18 +150,24 @@ static void *gen_throws_exception; + #define OS_SINGLE 4 + #define OS_DOUBLE 5 + +-typedef void (*disas_proc)(DisasContext *, uint16_t); ++typedef void (*disas_proc)(CPUM68KState *env, DisasContext *s, uint16_t insn); + + #ifdef DEBUG_DISPATCH +-#define DISAS_INSN(name) \ +- static void real_disas_##name (DisasContext *s, uint16_t insn); \ +- static void disas_##name (DisasContext *s, uint16_t insn) { \ +- qemu_log("Dispatch " #name "\n"); \ +- real_disas_##name(s, insn); } \ +- static void real_disas_##name (DisasContext *s, uint16_t insn) ++#define DISAS_INSN(name) \ ++ static void real_disas_##name(CPUM68KState *env, DisasContext *s, \ ++ uint16_t insn); \ ++ static void disas_##name(CPUM68KState *env, DisasContext *s, \ ++ uint16_t insn) \ ++ { \ ++ qemu_log("Dispatch " #name "\n"); \ ++ real_disas_##name(s, env, insn); \ ++ } \ ++ static void real_disas_##name(CPUM68KState *env, DisasContext *s, \ ++ uint16_t insn) + #else +-#define DISAS_INSN(name) \ +- static void disas_##name (DisasContext *s, uint16_t insn) ++#define DISAS_INSN(name) \ ++ static void disas_##name(CPUM68KState *env, DisasContext *s, \ ++ uint16_t insn) + #endif + + /* Generate a load from the specified address. Narrow values are +@@ -257,12 +263,12 @@ static TCGv gen_ldst(DisasContext *s, int opsize, TCGv addr, TCGv val, + } + + /* Read a 32-bit immediate constant. */ +-static inline uint32_t read_im32(DisasContext *s) ++static inline uint32_t read_im32(CPUM68KState *env, DisasContext *s) + { + uint32_t im; +- im = ((uint32_t)cpu_lduw_code(cpu_single_env, s->pc)) << 16; ++ im = ((uint32_t)cpu_lduw_code(env, s->pc)) << 16; + s->pc += 2; +- im |= cpu_lduw_code(cpu_single_env, s->pc); ++ im |= cpu_lduw_code(env, s->pc); + s->pc += 2; + return im; + } +@@ -288,7 +294,8 @@ static TCGv gen_addr_index(uint16_t ext, TCGv tmp) + + /* Handle a base + index + displacement effective addresss. + A NULL_QREG base means pc-relative. */ +-static TCGv gen_lea_indexed(DisasContext *s, int opsize, TCGv base) ++static TCGv gen_lea_indexed(CPUM68KState *env, DisasContext *s, int opsize, ++ TCGv base) + { + uint32_t offset; + uint16_t ext; +@@ -297,7 +304,7 @@ static TCGv gen_lea_indexed(DisasContext *s, int opsize, TCGv base) + uint32_t bd, od; + + offset = s->pc; +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + + if ((ext & 0x800) == 0 && !m68k_feature(s->env, M68K_FEATURE_WORD_INDEX)) +@@ -311,10 +318,10 @@ static TCGv gen_lea_indexed(DisasContext *s, int opsize, TCGv base) + if ((ext & 0x30) > 0x10) { + /* base displacement */ + if ((ext & 0x30) == 0x20) { +- bd = (int16_t)cpu_lduw_code(cpu_single_env, s->pc); ++ bd = (int16_t)cpu_lduw_code(env, s->pc); + s->pc += 2; + } else { +- bd = read_im32(s); ++ bd = read_im32(env, s); + } + } else { + bd = 0; +@@ -360,10 +367,10 @@ static TCGv gen_lea_indexed(DisasContext *s, int opsize, TCGv base) + if ((ext & 3) > 1) { + /* outer displacement */ + if ((ext & 3) == 2) { +- od = (int16_t)cpu_lduw_code(cpu_single_env, s->pc); ++ od = (int16_t)cpu_lduw_code(env, s->pc); + s->pc += 2; + } else { +- od = read_im32(s); ++ od = read_im32(env, s); + } + } else { + od = 0; +@@ -492,7 +499,8 @@ static inline TCGv gen_extend(TCGv val, int opsize, int sign) + + /* Generate code for an "effective address". Does not adjust the base + register for autoincrement addressing modes. */ +-static TCGv gen_lea(DisasContext *s, uint16_t insn, int opsize) ++static TCGv gen_lea(CPUM68KState *env, DisasContext *s, uint16_t insn, ++ int opsize) + { + TCGv reg; + TCGv tmp; +@@ -514,29 +522,29 @@ static TCGv gen_lea(DisasContext *s, uint16_t insn, int opsize) + case 5: /* Indirect displacement. */ + reg = AREG(insn, 0); + tmp = tcg_temp_new(); +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tmp, reg, (int16_t)ext); + return tmp; + case 6: /* Indirect index + displacement. */ + reg = AREG(insn, 0); +- return gen_lea_indexed(s, opsize, reg); ++ return gen_lea_indexed(env, s, opsize, reg); + case 7: /* Other */ + switch (insn & 7) { + case 0: /* Absolute short. */ +- offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + return tcg_const_i32(offset); + case 1: /* Absolute long. */ +- offset = read_im32(s); ++ offset = read_im32(env, s); + return tcg_const_i32(offset); + case 2: /* pc displacement */ + offset = s->pc; +- offset += cpu_ldsw_code(cpu_single_env, s->pc); ++ offset += cpu_ldsw_code(env, s->pc); + s->pc += 2; + return tcg_const_i32(offset); + case 3: /* pc index+displacement. */ +- return gen_lea_indexed(s, opsize, NULL_QREG); ++ return gen_lea_indexed(env, s, opsize, NULL_QREG); + case 4: /* Immediate. */ + default: + return NULL_QREG; +@@ -548,15 +556,16 @@ static TCGv gen_lea(DisasContext *s, uint16_t insn, int opsize) + + /* Helper function for gen_ea. Reuse the computed address between the + for read/write operands. */ +-static inline TCGv gen_ea_once(DisasContext *s, uint16_t insn, int opsize, +- TCGv val, TCGv *addrp, ea_what what) ++static inline TCGv gen_ea_once(CPUM68KState *env, DisasContext *s, ++ uint16_t insn, int opsize, TCGv val, ++ TCGv *addrp, ea_what what) + { + TCGv tmp; + + if (addrp && what == EA_STORE) { + tmp = *addrp; + } else { +- tmp = gen_lea(s, insn, opsize); ++ tmp = gen_lea(env, s, insn, opsize); + if (IS_NULL_QREG(tmp)) + return tmp; + if (addrp) +@@ -568,8 +577,8 @@ static inline TCGv gen_ea_once(DisasContext *s, uint16_t insn, int opsize, + /* Generate code to load/store a value ito/from an EA. If VAL > 0 this is + a write otherwise it is a read (0 == sign extend, -1 == zero extend). + ADDRP is non-null for readwrite operands. */ +-static TCGv gen_ea(DisasContext *s, uint16_t insn, int opsize, TCGv val, +- TCGv *addrp, ea_what what) ++static TCGv gen_ea(CPUM68KState *env, DisasContext *s, uint16_t insn, ++ int opsize, TCGv val, TCGv *addrp, ea_what what) + { + TCGv reg; + TCGv result; +@@ -609,7 +618,7 @@ static TCGv gen_ea(DisasContext *s, uint16_t insn, int opsize, TCGv val, + if (addrp && what == EA_STORE) { + tmp = *addrp; + } else { +- tmp = gen_lea(s, insn, opsize); ++ tmp = gen_lea(env, s, insn, opsize); + if (IS_NULL_QREG(tmp)) + return tmp; + if (addrp) +@@ -626,35 +635,35 @@ static TCGv gen_ea(DisasContext *s, uint16_t insn, int opsize, TCGv val, + return result; + case 5: /* Indirect displacement. */ + case 6: /* Indirect index + displacement. */ +- return gen_ea_once(s, insn, opsize, val, addrp, what); ++ return gen_ea_once(env, s, insn, opsize, val, addrp, what); + case 7: /* Other */ + switch (insn & 7) { + case 0: /* Absolute short. */ + case 1: /* Absolute long. */ + case 2: /* pc displacement */ + case 3: /* pc index+displacement. */ +- return gen_ea_once(s, insn, opsize, val, addrp, what); ++ return gen_ea_once(env, s, insn, opsize, val, addrp, what); + case 4: /* Immediate. */ + /* Sign extend values for consistency. */ + switch (opsize) { + case OS_BYTE: + if (what == EA_LOADS) { +- offset = cpu_ldsb_code(cpu_single_env, s->pc + 1); ++ offset = cpu_ldsb_code(env, s->pc + 1); + } else { +- offset = cpu_ldub_code(cpu_single_env, s->pc + 1); ++ offset = cpu_ldub_code(env, s->pc + 1); + } + s->pc += 2; + break; + case OS_WORD: + if (what == EA_LOADS) { +- offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ offset = cpu_ldsw_code(env, s->pc); + } else { +- offset = cpu_lduw_code(cpu_single_env, s->pc); ++ offset = cpu_lduw_code(env, s->pc); + } + s->pc += 2; + break; + case OS_LONG: +- offset = read_im32(s); ++ offset = read_im32(env, s); + break; + default: + qemu_assert(0, "Bad immediate operand"); +@@ -825,20 +834,21 @@ static inline void gen_addr_fault(DisasContext *s) + gen_exception(s, s->insn_pc, EXCP_ADDRESS); + } + +-#define SRC_EA(result, opsize, op_sign, addrp) do { \ +- result = gen_ea(s, insn, opsize, NULL_QREG, addrp, op_sign ? EA_LOADS : EA_LOADU); \ +- if (IS_NULL_QREG(result)) { \ +- gen_addr_fault(s); \ +- return; \ +- } \ ++#define SRC_EA(env, result, opsize, op_sign, addrp) do { \ ++ result = gen_ea(env, s, insn, opsize, NULL_QREG, addrp, \ ++ op_sign ? EA_LOADS : EA_LOADU); \ ++ if (IS_NULL_QREG(result)) { \ ++ gen_addr_fault(s); \ ++ return; \ ++ } \ + } while (0) + +-#define DEST_EA(insn, opsize, val, addrp) do { \ +- TCGv ea_result = gen_ea(s, insn, opsize, val, addrp, EA_STORE); \ +- if (IS_NULL_QREG(ea_result)) { \ +- gen_addr_fault(s); \ +- return; \ +- } \ ++#define DEST_EA(env, insn, opsize, val, addrp) do { \ ++ TCGv ea_result = gen_ea(env, s, insn, opsize, val, addrp, EA_STORE); \ ++ if (IS_NULL_QREG(ea_result)) { \ ++ gen_addr_fault(s); \ ++ return; \ ++ } \ + } while (0) + + /* Generate a jump to an immediate address. */ +@@ -874,8 +884,7 @@ DISAS_INSN(undef_fpu) + DISAS_INSN(undef) + { + gen_exception(s, s->pc - 2, EXCP_UNSUPPORTED); +- cpu_abort(cpu_single_env, "Illegal instruction: %04x @ %08x", +- insn, s->pc - 2); ++ cpu_abort(env, "Illegal instruction: %04x @ %08x", insn, s->pc - 2); + } + + DISAS_INSN(mulw) +@@ -892,7 +901,7 @@ DISAS_INSN(mulw) + tcg_gen_ext16s_i32(tmp, reg); + else + tcg_gen_ext16u_i32(tmp, reg); +- SRC_EA(src, OS_WORD, sign, NULL); ++ SRC_EA(env, src, OS_WORD, sign, NULL); + tcg_gen_mul_i32(tmp, tmp, src); + tcg_gen_mov_i32(reg, tmp); + /* Unlike m68k, coldfire always clears the overflow bit. */ +@@ -913,7 +922,7 @@ DISAS_INSN(divw) + } else { + tcg_gen_ext16u_i32(QREG_DIV1, reg); + } +- SRC_EA(src, OS_WORD, sign, NULL); ++ SRC_EA(env, src, OS_WORD, sign, NULL); + tcg_gen_mov_i32(QREG_DIV2, src); + if (sign) { + gen_helper_divs(cpu_env, tcg_const_i32(1)); +@@ -936,7 +945,7 @@ DISAS_INSN(divl) + TCGv reg; + uint16_t ext; + +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (ext & 0x87f8) { + gen_exception(s, s->pc - 4, EXCP_UNSUPPORTED); +@@ -945,7 +954,7 @@ DISAS_INSN(divl) + num = DREG(ext, 12); + reg = DREG(ext, 0); + tcg_gen_mov_i32(QREG_DIV1, num); +- SRC_EA(den, OS_LONG, 0, NULL); ++ SRC_EA(env, den, OS_LONG, 0, NULL); + tcg_gen_mov_i32(QREG_DIV2, den); + if (ext & 0x0800) { + gen_helper_divs(cpu_env, tcg_const_i32(0)); +@@ -975,11 +984,11 @@ DISAS_INSN(addsub) + reg = DREG(insn, 9); + dest = tcg_temp_new(); + if (insn & 0x100) { +- SRC_EA(tmp, OS_LONG, 0, &addr); ++ SRC_EA(env, tmp, OS_LONG, 0, &addr); + src = reg; + } else { + tmp = reg; +- SRC_EA(src, OS_LONG, 0, NULL); ++ SRC_EA(env, src, OS_LONG, 0, NULL); + } + if (add) { + tcg_gen_add_i32(dest, tmp, src); +@@ -992,7 +1001,7 @@ DISAS_INSN(addsub) + } + gen_update_cc_add(dest, src); + if (insn & 0x100) { +- DEST_EA(insn, OS_LONG, dest, &addr); ++ DEST_EA(env, insn, OS_LONG, dest, &addr); + } else { + tcg_gen_mov_i32(reg, dest); + } +@@ -1022,7 +1031,7 @@ DISAS_INSN(bitop_reg) + else + opsize = OS_LONG; + op = (insn >> 6) & 3; +- SRC_EA(src1, opsize, 0, op ? &addr: NULL); ++ SRC_EA(env, src1, opsize, 0, op ? &addr: NULL); + src2 = DREG(insn, 9); + dest = tcg_temp_new(); + +@@ -1057,7 +1066,7 @@ DISAS_INSN(bitop_reg) + break; + } + if (op) +- DEST_EA(insn, opsize, dest, &addr); ++ DEST_EA(env, insn, opsize, dest, &addr); + } + + DISAS_INSN(sats) +@@ -1088,9 +1097,9 @@ DISAS_INSN(movem) + TCGv tmp; + int is_load; + +- mask = cpu_lduw_code(cpu_single_env, s->pc); ++ mask = cpu_lduw_code(env, s->pc); + s->pc += 2; +- tmp = gen_lea(s, insn, OS_LONG); ++ tmp = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { + gen_addr_fault(s); + return; +@@ -1132,14 +1141,14 @@ DISAS_INSN(bitop_im) + opsize = OS_LONG; + op = (insn >> 6) & 3; + +- bitnum = cpu_lduw_code(cpu_single_env, s->pc); ++ bitnum = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (bitnum & 0xff00) { +- disas_undef(s, insn); ++ disas_undef(env, s, insn); + return; + } + +- SRC_EA(src1, opsize, 0, op ? &addr: NULL); ++ SRC_EA(env, src1, opsize, 0, op ? &addr: NULL); + + gen_flush_flags(s); + if (opsize == OS_BYTE) +@@ -1174,7 +1183,7 @@ DISAS_INSN(bitop_im) + default: /* btst */ + break; + } +- DEST_EA(insn, opsize, tmp, &addr); ++ DEST_EA(env, insn, opsize, tmp, &addr); + } + } + +@@ -1187,8 +1196,8 @@ DISAS_INSN(arith_im) + TCGv addr; + + op = (insn >> 9) & 7; +- SRC_EA(src1, OS_LONG, 0, (op == 6) ? NULL : &addr); +- im = read_im32(s); ++ SRC_EA(env, src1, OS_LONG, 0, (op == 6) ? NULL : &addr); ++ im = read_im32(env, s); + dest = tcg_temp_new(); + switch (op) { + case 0: /* ori */ +@@ -1227,7 +1236,7 @@ DISAS_INSN(arith_im) + abort(); + } + if (op != 6) { +- DEST_EA(insn, OS_LONG, dest, &addr); ++ DEST_EA(env, insn, OS_LONG, dest, &addr); + } + } + +@@ -1259,7 +1268,7 @@ DISAS_INSN(move) + default: + abort(); + } +- SRC_EA(src, opsize, 1, NULL); ++ SRC_EA(env, src, opsize, 1, NULL); + op = (insn >> 6) & 7; + if (op == 1) { + /* movea */ +@@ -1270,7 +1279,7 @@ DISAS_INSN(move) + /* normal move */ + uint16_t dest_ea; + dest_ea = ((insn >> 9) & 7) | (op << 3); +- DEST_EA(dest_ea, opsize, src, NULL); ++ DEST_EA(env, dest_ea, opsize, src, NULL); + /* This will be correct because loads sign extend. */ + gen_logic_cc(s, src); + } +@@ -1291,7 +1300,7 @@ DISAS_INSN(lea) + TCGv tmp; + + reg = AREG(insn, 9); +- tmp = gen_lea(s, insn, OS_LONG); ++ tmp = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { + gen_addr_fault(s); + return; +@@ -1316,7 +1325,7 @@ DISAS_INSN(clr) + default: + abort(); + } +- DEST_EA(insn, opsize, tcg_const_i32(0), NULL); ++ DEST_EA(env, insn, opsize, tcg_const_i32(0), NULL); + gen_logic_cc(s, tcg_const_i32(0)); + } + +@@ -1365,7 +1374,8 @@ static void gen_set_sr_im(DisasContext *s, uint16_t val, int ccr_only) + } + } + +-static void gen_set_sr(DisasContext *s, uint16_t insn, int ccr_only) ++static void gen_set_sr(CPUM68KState *env, DisasContext *s, uint16_t insn, ++ int ccr_only) + { + TCGv tmp; + TCGv reg; +@@ -1385,17 +1395,17 @@ static void gen_set_sr(DisasContext *s, uint16_t insn, int ccr_only) + else if ((insn & 0x3f) == 0x3c) + { + uint16_t val; +- val = cpu_lduw_code(cpu_single_env, s->pc); ++ val = cpu_lduw_code(env, s->pc); + s->pc += 2; + gen_set_sr_im(s, val, ccr_only); + } + else +- disas_undef(s, insn); ++ disas_undef(env, s, insn); + } + + DISAS_INSN(move_to_ccr) + { +- gen_set_sr(s, insn, 1); ++ gen_set_sr(env, s, insn, 1); + } + + DISAS_INSN(not) +@@ -1426,7 +1436,7 @@ DISAS_INSN(pea) + { + TCGv tmp; + +- tmp = gen_lea(s, insn, OS_LONG); ++ tmp = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { + gen_addr_fault(s); + return; +@@ -1472,7 +1482,7 @@ DISAS_INSN(tst) + default: + abort(); + } +- SRC_EA(tmp, opsize, 1, NULL); ++ SRC_EA(env, tmp, opsize, 1, NULL); + gen_logic_cc(s, tmp); + } + +@@ -1494,10 +1504,10 @@ DISAS_INSN(tas) + TCGv addr; + + dest = tcg_temp_new(); +- SRC_EA(src1, OS_BYTE, 1, &addr); ++ SRC_EA(env, src1, OS_BYTE, 1, &addr); + gen_logic_cc(s, src1); + tcg_gen_ori_i32(dest, src1, 0x80); +- DEST_EA(insn, OS_BYTE, dest, &addr); ++ DEST_EA(env, insn, OS_BYTE, dest, &addr); + } + + DISAS_INSN(mull) +@@ -1509,14 +1519,14 @@ DISAS_INSN(mull) + + /* The upper 32 bits of the product are discarded, so + muls.l and mulu.l are functionally equivalent. */ +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (ext & 0x87ff) { + gen_exception(s, s->pc - 4, EXCP_UNSUPPORTED); + return; + } + reg = DREG(ext, 12); +- SRC_EA(src1, OS_LONG, 0, NULL); ++ SRC_EA(env, src1, OS_LONG, 0, NULL); + dest = tcg_temp_new(); + tcg_gen_mul_i32(dest, src1, reg); + tcg_gen_mov_i32(reg, dest); +@@ -1530,7 +1540,7 @@ DISAS_INSN(link) + TCGv reg; + TCGv tmp; + +- offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + reg = AREG(insn, 0); + tmp = tcg_temp_new(); +@@ -1574,7 +1584,7 @@ DISAS_INSN(jump) + + /* Load the target address first to ensure correct exception + behavior. */ +- tmp = gen_lea(s, insn, OS_LONG); ++ tmp = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { + gen_addr_fault(s); + return; +@@ -1594,7 +1604,7 @@ DISAS_INSN(addsubq) + int val; + TCGv addr; + +- SRC_EA(src1, OS_LONG, 0, &addr); ++ SRC_EA(env, src1, OS_LONG, 0, &addr); + val = (insn >> 9) & 7; + if (val == 0) + val = 8; +@@ -1621,7 +1631,7 @@ DISAS_INSN(addsubq) + } + gen_update_cc_add(dest, src2); + } +- DEST_EA(insn, OS_LONG, dest, &addr); ++ DEST_EA(env, insn, OS_LONG, dest, &addr); + } + + DISAS_INSN(tpf) +@@ -1636,7 +1646,7 @@ DISAS_INSN(tpf) + case 4: /* No extension words. */ + break; + default: +- disas_undef(s, insn); ++ disas_undef(env, s, insn); + } + } + +@@ -1651,10 +1661,10 @@ DISAS_INSN(branch) + op = (insn >> 8) & 0xf; + offset = (int8_t)insn; + if (offset == 0) { +- offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + } else if (offset == -1) { +- offset = read_im32(s); ++ offset = read_im32(env, s); + } + if (op == 1) { + /* bsr */ +@@ -1693,7 +1703,7 @@ DISAS_INSN(mvzs) + opsize = OS_WORD; + else + opsize = OS_BYTE; +- SRC_EA(src, opsize, (insn & 0x80) == 0, NULL); ++ SRC_EA(env, src, opsize, (insn & 0x80) == 0, NULL); + reg = DREG(insn, 9); + tcg_gen_mov_i32(reg, src); + gen_logic_cc(s, src); +@@ -1709,11 +1719,11 @@ DISAS_INSN(or) + reg = DREG(insn, 9); + dest = tcg_temp_new(); + if (insn & 0x100) { +- SRC_EA(src, OS_LONG, 0, &addr); ++ SRC_EA(env, src, OS_LONG, 0, &addr); + tcg_gen_or_i32(dest, src, reg); +- DEST_EA(insn, OS_LONG, dest, &addr); ++ DEST_EA(env, insn, OS_LONG, dest, &addr); + } else { +- SRC_EA(src, OS_LONG, 0, NULL); ++ SRC_EA(env, src, OS_LONG, 0, NULL); + tcg_gen_or_i32(dest, src, reg); + tcg_gen_mov_i32(reg, dest); + } +@@ -1725,7 +1735,7 @@ DISAS_INSN(suba) + TCGv src; + TCGv reg; + +- SRC_EA(src, OS_LONG, 0, NULL); ++ SRC_EA(env, src, OS_LONG, 0, NULL); + reg = AREG(insn, 9); + tcg_gen_sub_i32(reg, reg, src); + } +@@ -1751,7 +1761,7 @@ DISAS_INSN(mov3q) + val = -1; + src = tcg_const_i32(val); + gen_logic_cc(s, src); +- DEST_EA(insn, OS_LONG, src, NULL); ++ DEST_EA(env, insn, OS_LONG, src, NULL); + } + + DISAS_INSN(cmp) +@@ -1779,7 +1789,7 @@ DISAS_INSN(cmp) + default: + abort(); + } +- SRC_EA(src, opsize, 1, NULL); ++ SRC_EA(env, src, opsize, 1, NULL); + reg = DREG(insn, 9); + dest = tcg_temp_new(); + tcg_gen_sub_i32(dest, reg, src); +@@ -1798,7 +1808,7 @@ DISAS_INSN(cmpa) + } else { + opsize = OS_WORD; + } +- SRC_EA(src, opsize, 1, NULL); ++ SRC_EA(env, src, opsize, 1, NULL); + reg = AREG(insn, 9); + dest = tcg_temp_new(); + tcg_gen_sub_i32(dest, reg, src); +@@ -1813,12 +1823,12 @@ DISAS_INSN(eor) + TCGv dest; + TCGv addr; + +- SRC_EA(src, OS_LONG, 0, &addr); ++ SRC_EA(env, src, OS_LONG, 0, &addr); + reg = DREG(insn, 9); + dest = tcg_temp_new(); + tcg_gen_xor_i32(dest, src, reg); + gen_logic_cc(s, dest); +- DEST_EA(insn, OS_LONG, dest, &addr); ++ DEST_EA(env, insn, OS_LONG, dest, &addr); + } + + DISAS_INSN(and) +@@ -1831,11 +1841,11 @@ DISAS_INSN(and) + reg = DREG(insn, 9); + dest = tcg_temp_new(); + if (insn & 0x100) { +- SRC_EA(src, OS_LONG, 0, &addr); ++ SRC_EA(env, src, OS_LONG, 0, &addr); + tcg_gen_and_i32(dest, src, reg); +- DEST_EA(insn, OS_LONG, dest, &addr); ++ DEST_EA(env, insn, OS_LONG, dest, &addr); + } else { +- SRC_EA(src, OS_LONG, 0, NULL); ++ SRC_EA(env, src, OS_LONG, 0, NULL); + tcg_gen_and_i32(dest, src, reg); + tcg_gen_mov_i32(reg, dest); + } +@@ -1847,7 +1857,7 @@ DISAS_INSN(adda) + TCGv src; + TCGv reg; + +- SRC_EA(src, OS_LONG, 0, NULL); ++ SRC_EA(env, src, OS_LONG, 0, NULL); + reg = AREG(insn, 9); + tcg_gen_add_i32(reg, reg, src); + } +@@ -1936,13 +1946,13 @@ DISAS_INSN(strldsr) + uint32_t addr; + + addr = s->pc - 2; +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (ext != 0x46FC) { + gen_exception(s, addr, EXCP_UNSUPPORTED); + return; + } +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (IS_USER(s) || (ext & SR_S) == 0) { + gen_exception(s, addr, EXCP_PRIVILEGE); +@@ -1972,7 +1982,7 @@ DISAS_INSN(move_to_sr) + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } +- gen_set_sr(s, insn, 0); ++ gen_set_sr(env, s, insn, 0); + gen_lookup_tb(s); + } + +@@ -2010,7 +2020,7 @@ DISAS_INSN(stop) + return; + } + +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + + gen_set_sr_im(s, ext, 0); +@@ -2037,7 +2047,7 @@ DISAS_INSN(movec) + return; + } + +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + + if (ext & 0x8000) { +@@ -2102,7 +2112,7 @@ DISAS_INSN(fpu) + int set_dest; + int opsize; + +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + opmode = ext & 0x7f; + switch ((ext >> 13) & 7) { +@@ -2138,7 +2148,7 @@ DISAS_INSN(fpu) + tcg_gen_addi_i32(tmp32, tmp32, -8); + break; + case 5: +- offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tmp32, tmp32, offset); + break; +@@ -2164,7 +2174,7 @@ DISAS_INSN(fpu) + default: + goto undef; + } +- DEST_EA(insn, opsize, tmp32, NULL); ++ DEST_EA(env, insn, opsize, tmp32, NULL); + tcg_temp_free_i32(tmp32); + return; + case 4: /* fmove to control register. */ +@@ -2192,7 +2202,7 @@ DISAS_INSN(fpu) + (ext >> 10) & 7); + goto undef; + } +- DEST_EA(insn, OS_LONG, tmp32, NULL); ++ DEST_EA(env, insn, OS_LONG, tmp32, NULL); + break; + case 6: /* fmovem */ + case 7: +@@ -2202,7 +2212,7 @@ DISAS_INSN(fpu) + int i; + if ((ext & 0x1f00) != 0x1000 || (ext & 0xff) == 0) + goto undef; +- tmp32 = gen_lea(s, insn, OS_LONG); ++ tmp32 = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp32)) { + gen_addr_fault(s); + return; +@@ -2252,12 +2262,12 @@ DISAS_INSN(fpu) + tcg_gen_addi_i32(tmp32, tmp32, -8); + break; + case 5: +- offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tmp32, tmp32, offset); + break; + case 7: +- offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ offset = cpu_ldsw_code(env, s->pc); + offset += s->pc - 2; + s->pc += 2; + tcg_gen_addi_i32(tmp32, tmp32, offset); +@@ -2277,7 +2287,7 @@ DISAS_INSN(fpu) + } + tcg_temp_free_i32(tmp32); + } else { +- SRC_EA(tmp32, opsize, 1, NULL); ++ SRC_EA(env, tmp32, opsize, 1, NULL); + src = tcg_temp_new_i64(); + switch (opsize) { + case OS_LONG: +@@ -2372,7 +2382,7 @@ DISAS_INSN(fpu) + undef: + /* FIXME: Is this right for offset addressing modes? */ + s->pc -= 2; +- disas_undef_fpu(s, insn); ++ disas_undef_fpu(env, s, insn); + } + + DISAS_INSN(fbcc) +@@ -2383,10 +2393,10 @@ DISAS_INSN(fbcc) + int l1; + + addr = s->pc; +- offset = cpu_ldsw_code(cpu_single_env, s->pc); ++ offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + if (insn & (1 << 6)) { +- offset = (offset << 16) | cpu_lduw_code(cpu_single_env, s->pc); ++ offset = (offset << 16) | cpu_lduw_code(env, s->pc); + s->pc += 2; + } + +@@ -2508,18 +2518,18 @@ DISAS_INSN(mac) + s->done_mac = 1; + } + +- ext = cpu_lduw_code(cpu_single_env, s->pc); ++ ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + + acc = ((insn >> 7) & 1) | ((ext >> 3) & 2); + dual = ((insn & 0x30) != 0 && (ext & 3) != 0); + if (dual && !m68k_feature(s->env, M68K_FEATURE_CF_EMAC_B)) { +- disas_undef(s, insn); ++ disas_undef(env, s, insn); + return; + } + if (insn & 0x30) { + /* MAC with load. */ +- tmp = gen_lea(s, insn, OS_LONG); ++ tmp = gen_lea(env, s, insn, OS_LONG); + addr = tcg_temp_new(); + tcg_gen_and_i32(addr, tmp, QREG_MAC_MASK); + /* Load the value now to ensure correct exception behavior. +@@ -2733,7 +2743,7 @@ DISAS_INSN(to_mac) + int accnum; + accnum = (insn >> 9) & 3; + acc = MACREG(accnum); +- SRC_EA(val, OS_LONG, 0, NULL); ++ SRC_EA(env, val, OS_LONG, 0, NULL); + if (s->env->macsr & MACSR_FI) { + tcg_gen_ext_i32_i64(acc, val); + tcg_gen_shli_i64(acc, acc, 8); +@@ -2750,7 +2760,7 @@ DISAS_INSN(to_mac) + DISAS_INSN(to_macsr) + { + TCGv val; +- SRC_EA(val, OS_LONG, 0, NULL); ++ SRC_EA(env, val, OS_LONG, 0, NULL); + gen_helper_set_macsr(cpu_env, val); + gen_lookup_tb(s); + } +@@ -2758,7 +2768,7 @@ DISAS_INSN(to_macsr) + DISAS_INSN(to_mask) + { + TCGv val; +- SRC_EA(val, OS_LONG, 0, NULL); ++ SRC_EA(env, val, OS_LONG, 0, NULL); + tcg_gen_ori_i32(QREG_MAC_MASK, val, 0xffff0000); + } + +@@ -2766,7 +2776,7 @@ DISAS_INSN(to_mext) + { + TCGv val; + TCGv acc; +- SRC_EA(val, OS_LONG, 0, NULL); ++ SRC_EA(env, val, OS_LONG, 0, NULL); + acc = tcg_const_i32((insn & 0x400) ? 2 : 0); + if (s->env->macsr & MACSR_FI) + gen_helper_set_mac_extf(cpu_env, val, acc); +@@ -2943,10 +2953,10 @@ static void disas_m68k_insn(CPUM68KState * env, DisasContext *s) + { + uint16_t insn; + +- insn = cpu_lduw_code(cpu_single_env, s->pc); ++ insn = cpu_lduw_code(env, s->pc); + s->pc += 2; + +- opcode_table[insn](s, insn); ++ opcode_table[insn](env, s, insn); + } + + /* generate intermediate code for basic block 'tb'. */ +-- +1.7.12.1 + diff --git a/0030-target-unicore32-switch-to-AREG0-free-mode.patch b/0030-target-unicore32-switch-to-AREG0-free-mode.patch new file mode 100644 index 0000000..4880417 --- /dev/null +++ b/0030-target-unicore32-switch-to-AREG0-free-mode.patch @@ -0,0 +1,437 @@ +From 23ff6fa6a883d210aab33e09d0bb9470df5083fc Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 07:42:33 +0000 +Subject: [PATCH] target-unicore32: switch to AREG0 free mode + +Add an explicit CPUState parameter instead of relying on AREG0 +and switch to AREG0 free mode. + +Tested-by: Guan Xuetao +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-unicore32/Makefile.objs | 2 -- + target-unicore32/helper.h | 26 ++++++++--------- + target-unicore32/op_helper.c | 65 ++++++++++++++++-------------------------- + target-unicore32/translate.c | 38 ++++++++++++------------ + 5 files changed, 58 insertions(+), 75 deletions(-) + +diff --git a/configure b/configure +index af03942..a8827ba 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | i386 | lm32 | m68k | or32 | s390x | sparc* | x86_64 | xtensa* | ppc*) ++ alpha | i386 | lm32 | m68k | or32 | s390x | sparc* | unicore32 | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-unicore32/Makefile.objs b/target-unicore32/Makefile.objs +index 777f01f..8e143da 100644 +--- a/target-unicore32/Makefile.objs ++++ b/target-unicore32/Makefile.objs +@@ -2,5 +2,3 @@ obj-y += translate.o op_helper.o helper.o cpu.o + obj-y += ucf64_helper.o + + obj-$(CONFIG_SOFTMMU) += machine.o softmmu.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-unicore32/helper.h b/target-unicore32/helper.h +index 305318a..a4b8149 100644 +--- a/target-unicore32/helper.h ++++ b/target-unicore32/helper.h +@@ -17,26 +17,26 @@ DEF_HELPER_1(cp1_putc, void, i32) + DEF_HELPER_1(clz, i32, i32) + DEF_HELPER_1(clo, i32, i32) + +-DEF_HELPER_1(exception, void, i32) ++DEF_HELPER_2(exception, void, env, i32) + +-DEF_HELPER_2(asr_write, void, i32, i32) +-DEF_HELPER_0(asr_read, i32) ++DEF_HELPER_3(asr_write, void, env, i32, i32) ++DEF_HELPER_1(asr_read, i32, env) + +-DEF_HELPER_1(get_user_reg, i32, i32) +-DEF_HELPER_2(set_user_reg, void, i32, i32) ++DEF_HELPER_2(get_user_reg, i32, env, i32) ++DEF_HELPER_3(set_user_reg, void, env, i32, i32) + +-DEF_HELPER_2(add_cc, i32, i32, i32) +-DEF_HELPER_2(adc_cc, i32, i32, i32) +-DEF_HELPER_2(sub_cc, i32, i32, i32) +-DEF_HELPER_2(sbc_cc, i32, i32, i32) ++DEF_HELPER_3(add_cc, i32, env, i32, i32) ++DEF_HELPER_3(adc_cc, i32, env, i32, i32) ++DEF_HELPER_3(sub_cc, i32, env, i32, i32) ++DEF_HELPER_3(sbc_cc, i32, env, i32, i32) + + DEF_HELPER_2(shl, i32, i32, i32) + DEF_HELPER_2(shr, i32, i32, i32) + DEF_HELPER_2(sar, i32, i32, i32) +-DEF_HELPER_2(shl_cc, i32, i32, i32) +-DEF_HELPER_2(shr_cc, i32, i32, i32) +-DEF_HELPER_2(sar_cc, i32, i32, i32) +-DEF_HELPER_2(ror_cc, i32, i32, i32) ++DEF_HELPER_3(shl_cc, i32, env, i32, i32) ++DEF_HELPER_3(shr_cc, i32, env, i32, i32) ++DEF_HELPER_3(sar_cc, i32, env, i32, i32) ++DEF_HELPER_3(ror_cc, i32, env, i32, i32) + + DEF_HELPER_1(ucf64_get_fpscr, i32, env) + DEF_HELPER_2(ucf64_set_fpscr, void, env, i32) +diff --git a/target-unicore32/op_helper.c b/target-unicore32/op_helper.c +index c63789d..f474d1b 100644 +--- a/target-unicore32/op_helper.c ++++ b/target-unicore32/op_helper.c +@@ -9,19 +9,18 @@ + * later version. See the COPYING file in the top-level directory. + */ + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helper.h" + + #define SIGNBIT (uint32_t)0x80000000 + #define SIGNBIT64 ((uint64_t)1 << 63) + +-void HELPER(exception)(uint32_t excp) ++void HELPER(exception)(CPUUniCore32State *env, uint32_t excp) + { + env->exception_index = excp; + cpu_loop_exit(env); + } + +-static target_ulong asr_read(void) ++static target_ulong asr_read(CPUUniCore32State *env) + { + int ZF; + ZF = (env->ZF == 0); +@@ -29,24 +28,18 @@ static target_ulong asr_read(void) + (env->CF << 29) | ((env->VF & 0x80000000) >> 3); + } + +-target_ulong cpu_asr_read(CPUUniCore32State *env1) ++target_ulong cpu_asr_read(CPUUniCore32State *env) + { +- CPUUniCore32State *saved_env; +- target_ulong ret; +- +- saved_env = env; +- env = env1; +- ret = asr_read(); +- env = saved_env; +- return ret; ++ return asr_read(env); + } + +-target_ulong HELPER(asr_read)(void) ++target_ulong HELPER(asr_read)(CPUUniCore32State *env) + { +- return asr_read(); ++ return asr_read(env); + } + +-static void asr_write(target_ulong val, target_ulong mask) ++static void asr_write(CPUUniCore32State *env, target_ulong val, ++ target_ulong mask) + { + if (mask & ASR_NZCV) { + env->ZF = (~val) & ASR_Z; +@@ -62,23 +55,19 @@ static void asr_write(target_ulong val, target_ulong mask) + env->uncached_asr = (env->uncached_asr & ~mask) | (val & mask); + } + +-void cpu_asr_write(CPUUniCore32State *env1, target_ulong val, target_ulong mask) ++void cpu_asr_write(CPUUniCore32State *env, target_ulong val, target_ulong mask) + { +- CPUUniCore32State *saved_env; +- +- saved_env = env; +- env = env1; +- asr_write(val, mask); +- env = saved_env; ++ asr_write(env, val, mask); + } + +-void HELPER(asr_write)(target_ulong val, target_ulong mask) ++void HELPER(asr_write)(CPUUniCore32State *env, target_ulong val, ++ target_ulong mask) + { +- asr_write(val, mask); ++ asr_write(env, val, mask); + } + + /* Access to user mode registers from privileged modes. */ +-uint32_t HELPER(get_user_reg)(uint32_t regno) ++uint32_t HELPER(get_user_reg)(CPUUniCore32State *env, uint32_t regno) + { + uint32_t val; + +@@ -92,7 +81,7 @@ uint32_t HELPER(get_user_reg)(uint32_t regno) + return val; + } + +-void HELPER(set_user_reg)(uint32_t regno, uint32_t val) ++void HELPER(set_user_reg)(CPUUniCore32State *env, uint32_t regno, uint32_t val) + { + if (regno == 29) { + env->banked_r29[0] = val; +@@ -107,7 +96,7 @@ void HELPER(set_user_reg)(uint32_t regno, uint32_t val) + The only way to do that in TCG is a conditional branch, which clobbers + all our temporaries. For now implement these as helper functions. */ + +-uint32_t HELPER(add_cc)(uint32_t a, uint32_t b) ++uint32_t HELPER(add_cc)(CPUUniCore32State *env, uint32_t a, uint32_t b) + { + uint32_t result; + result = a + b; +@@ -117,7 +106,7 @@ uint32_t HELPER(add_cc)(uint32_t a, uint32_t b) + return result; + } + +-uint32_t HELPER(adc_cc)(uint32_t a, uint32_t b) ++uint32_t HELPER(adc_cc)(CPUUniCore32State *env, uint32_t a, uint32_t b) + { + uint32_t result; + if (!env->CF) { +@@ -132,7 +121,7 @@ uint32_t HELPER(adc_cc)(uint32_t a, uint32_t b) + return result; + } + +-uint32_t HELPER(sub_cc)(uint32_t a, uint32_t b) ++uint32_t HELPER(sub_cc)(CPUUniCore32State *env, uint32_t a, uint32_t b) + { + uint32_t result; + result = a - b; +@@ -142,7 +131,7 @@ uint32_t HELPER(sub_cc)(uint32_t a, uint32_t b) + return result; + } + +-uint32_t HELPER(sbc_cc)(uint32_t a, uint32_t b) ++uint32_t HELPER(sbc_cc)(CPUUniCore32State *env, uint32_t a, uint32_t b) + { + uint32_t result; + if (!env->CF) { +@@ -186,7 +175,7 @@ uint32_t HELPER(sar)(uint32_t x, uint32_t i) + return (int32_t)x >> shift; + } + +-uint32_t HELPER(shl_cc)(uint32_t x, uint32_t i) ++uint32_t HELPER(shl_cc)(CPUUniCore32State *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) { +@@ -203,7 +192,7 @@ uint32_t HELPER(shl_cc)(uint32_t x, uint32_t i) + return x; + } + +-uint32_t HELPER(shr_cc)(uint32_t x, uint32_t i) ++uint32_t HELPER(shr_cc)(CPUUniCore32State *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) { +@@ -220,7 +209,7 @@ uint32_t HELPER(shr_cc)(uint32_t x, uint32_t i) + return x; + } + +-uint32_t HELPER(sar_cc)(uint32_t x, uint32_t i) ++uint32_t HELPER(sar_cc)(CPUUniCore32State *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) { +@@ -233,7 +222,7 @@ uint32_t HELPER(sar_cc)(uint32_t x, uint32_t i) + return x; + } + +-uint32_t HELPER(ror_cc)(uint32_t x, uint32_t i) ++uint32_t HELPER(ror_cc)(CPUUniCore32State *env, uint32_t x, uint32_t i) + { + int shift1, shift; + shift1 = i & 0xff; +@@ -264,16 +253,13 @@ uint32_t HELPER(ror_cc)(uint32_t x, uint32_t i) + #define SHIFT 3 + #include "softmmu_template.h" + +-void tlb_fill(CPUUniCore32State *env1, target_ulong addr, int is_write, +- int mmu_idx, uintptr_t retaddr) ++void tlb_fill(CPUUniCore32State *env, target_ulong addr, int is_write, ++ int mmu_idx, uintptr_t retaddr) + { + TranslationBlock *tb; +- CPUUniCore32State *saved_env; + unsigned long pc; + int ret; + +- saved_env = env; +- env = env1; + ret = uc32_cpu_handle_mmu_fault(env, addr, is_write, mmu_idx); + if (unlikely(ret)) { + if (retaddr) { +@@ -287,6 +273,5 @@ void tlb_fill(CPUUniCore32State *env1, target_ulong addr, int is_write, + } + cpu_loop_exit(env); + } +- env = saved_env; + } + #endif +diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c +index 188bf8c..b786a6b 100644 +--- a/target-unicore32/translate.c ++++ b/target-unicore32/translate.c +@@ -253,7 +253,7 @@ static void disas_ocd_insn(CPUUniCore32State *env, DisasContext *s, + static inline void gen_set_asr(TCGv var, uint32_t mask) + { + TCGv tmp_mask = tcg_const_i32(mask); +- gen_helper_asr_write(var, tmp_mask); ++ gen_helper_asr_write(cpu_env, var, tmp_mask); + tcg_temp_free_i32(tmp_mask); + } + /* Set NZCV flags from the high 4 bits of var. */ +@@ -263,7 +263,7 @@ static void gen_exception(int excp) + { + TCGv tmp = new_tmp(); + tcg_gen_movi_i32(tmp, excp); +- gen_helper_exception(tmp); ++ gen_helper_exception(cpu_env, tmp); + dead_tmp(tmp); + } + +@@ -416,16 +416,16 @@ static inline void gen_uc32_shift_reg(TCGv var, int shiftop, + if (flags) { + switch (shiftop) { + case 0: +- gen_helper_shl_cc(var, var, shift); ++ gen_helper_shl_cc(var, cpu_env, var, shift); + break; + case 1: +- gen_helper_shr_cc(var, var, shift); ++ gen_helper_shr_cc(var, cpu_env, var, shift); + break; + case 2: +- gen_helper_sar_cc(var, var, shift); ++ gen_helper_sar_cc(var, cpu_env, var, shift); + break; + case 3: +- gen_helper_ror_cc(var, var, shift); ++ gen_helper_ror_cc(var, cpu_env, var, shift); + break; + } + } else { +@@ -1323,11 +1323,11 @@ static void do_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + if (IS_USER(s)) { + ILLEGAL; + } +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + gen_exception_return(s, tmp); + } else { + if (UCOP_SET_S) { +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + } else { + tcg_gen_sub_i32(tmp, tmp, tmp2); + } +@@ -1336,7 +1336,7 @@ static void do_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + break; + case 0x03: + if (UCOP_SET_S) { +- gen_helper_sub_cc(tmp, tmp2, tmp); ++ gen_helper_sub_cc(tmp, cpu_env, tmp2, tmp); + } else { + tcg_gen_sub_i32(tmp, tmp2, tmp); + } +@@ -1344,7 +1344,7 @@ static void do_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + break; + case 0x04: + if (UCOP_SET_S) { +- gen_helper_add_cc(tmp, tmp, tmp2); ++ gen_helper_add_cc(tmp, cpu_env, tmp, tmp2); + } else { + tcg_gen_add_i32(tmp, tmp, tmp2); + } +@@ -1352,7 +1352,7 @@ static void do_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + break; + case 0x05: + if (UCOP_SET_S) { +- gen_helper_adc_cc(tmp, tmp, tmp2); ++ gen_helper_adc_cc(tmp, cpu_env, tmp, tmp2); + } else { + gen_add_carry(tmp, tmp, tmp2); + } +@@ -1360,7 +1360,7 @@ static void do_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + break; + case 0x06: + if (UCOP_SET_S) { +- gen_helper_sbc_cc(tmp, tmp, tmp2); ++ gen_helper_sbc_cc(tmp, cpu_env, tmp, tmp2); + } else { + gen_sub_carry(tmp, tmp, tmp2); + } +@@ -1368,7 +1368,7 @@ static void do_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + break; + case 0x07: + if (UCOP_SET_S) { +- gen_helper_sbc_cc(tmp, tmp2, tmp); ++ gen_helper_sbc_cc(tmp, cpu_env, tmp2, tmp); + } else { + gen_sub_carry(tmp, tmp2, tmp); + } +@@ -1390,13 +1390,13 @@ static void do_datap(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + break; + case 0x0a: + if (UCOP_SET_S) { +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + } + dead_tmp(tmp); + break; + case 0x0b: + if (UCOP_SET_S) { +- gen_helper_add_cc(tmp, tmp, tmp2); ++ gen_helper_add_cc(tmp, cpu_env, tmp, tmp2); + } + dead_tmp(tmp); + break; +@@ -1536,7 +1536,7 @@ static void do_misc(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + tmp = load_cpu_field(bsr); + } else { + tmp = new_tmp(); +- gen_helper_asr_read(tmp); ++ gen_helper_asr_read(tmp, cpu_env); + } + store_reg(s, UCOP_REG_D, tmp); + return; +@@ -1760,7 +1760,7 @@ static void do_ldst_m(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + gen_bx(s, tmp); + } else if (user) { + tmp2 = tcg_const_i32(reg); +- gen_helper_set_user_reg(tmp2, tmp); ++ gen_helper_set_user_reg(cpu_env, tmp2, tmp); + tcg_temp_free_i32(tmp2); + dead_tmp(tmp); + } else if (reg == UCOP_REG_N) { +@@ -1778,7 +1778,7 @@ static void do_ldst_m(CPUUniCore32State *env, DisasContext *s, uint32_t insn) + } else if (user) { + tmp = new_tmp(); + tmp2 = tcg_const_i32(reg); +- gen_helper_get_user_reg(tmp, tmp2); ++ gen_helper_get_user_reg(tmp, cpu_env, tmp2); + tcg_temp_free_i32(tmp2); + } else { + tmp = load_reg(s, reg); +@@ -1861,7 +1861,7 @@ static void disas_uc32_insn(CPUUniCore32State *env, DisasContext *s) + { + unsigned int insn; + +- insn = ldl_code(s->pc); ++ insn = cpu_ldl_code(env, s->pc); + s->pc += 4; + + /* UniCore instructions class: +-- +1.7.12.1 + diff --git a/0031-target-arm-convert-void-helpers.patch b/0031-target-arm-convert-void-helpers.patch new file mode 100644 index 0000000..3ea4640 --- /dev/null +++ b/0031-target-arm-convert-void-helpers.patch @@ -0,0 +1,181 @@ +From 140048c58e4ceb4f3bac87d7154d2731bb2bcd5d Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Tue, 4 Sep 2012 20:08:34 +0000 +Subject: [PATCH] target-arm: convert void helpers + +Add an explicit CPUState parameter instead of relying on AREG0. + +For easier review, convert only op helpers which don't return any value. + +Signed-off-by: Blue Swirl +Reviewed-by: Peter Maydell +Signed-off-by: Michael Roth +--- + target-arm/helper.h | 8 ++++---- + target-arm/op_helper.c | 20 ++++++++++---------- + target-arm/translate.c | 8 ++++---- + 3 files changed, 18 insertions(+), 18 deletions(-) + +diff --git a/target-arm/helper.h b/target-arm/helper.h +index 21e9cfe..106aacd 100644 +--- a/target-arm/helper.h ++++ b/target-arm/helper.h +@@ -50,10 +50,10 @@ DEF_HELPER_2(usad8, i32, i32, i32) + DEF_HELPER_1(logicq_cc, i32, i64) + + DEF_HELPER_3(sel_flags, i32, i32, i32, i32) +-DEF_HELPER_1(exception, void, i32) +-DEF_HELPER_0(wfi, void) ++DEF_HELPER_2(exception, void, env, i32) ++DEF_HELPER_1(wfi, void, env) + +-DEF_HELPER_2(cpsr_write, void, i32, i32) ++DEF_HELPER_3(cpsr_write, void, env, i32, i32) + DEF_HELPER_0(cpsr_read, i32) + + DEF_HELPER_3(v7m_msr, void, env, i32, i32) +@@ -68,7 +68,7 @@ DEF_HELPER_2(get_r13_banked, i32, env, i32) + DEF_HELPER_3(set_r13_banked, void, env, i32, i32) + + DEF_HELPER_1(get_user_reg, i32, i32) +-DEF_HELPER_2(set_user_reg, void, i32, i32) ++DEF_HELPER_3(set_user_reg, void, env, i32, i32) + + DEF_HELPER_1(vfp_get_fpscr, i32, env) + DEF_HELPER_2(vfp_set_fpscr, void, env, i32) +diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c +index d77bfab..b1adce3 100644 +--- a/target-arm/op_helper.c ++++ b/target-arm/op_helper.c +@@ -23,7 +23,7 @@ + #define SIGNBIT (uint32_t)0x80000000 + #define SIGNBIT64 ((uint64_t)1 << 63) + +-static void raise_exception(int tt) ++static void raise_exception(CPUARMState *env, int tt) + { + env->exception_index = tt; + cpu_loop_exit(env); +@@ -93,7 +93,7 @@ void tlb_fill(CPUARMState *env1, target_ulong addr, int is_write, int mmu_idx, + cpu_restore_state(tb, env, retaddr); + } + } +- raise_exception(env->exception_index); ++ raise_exception(env, env->exception_index); + } + env = saved_env; + } +@@ -230,14 +230,14 @@ uint32_t HELPER(usat16)(uint32_t x, uint32_t shift) + return res; + } + +-void HELPER(wfi)(void) ++void HELPER(wfi)(CPUARMState *env) + { + env->exception_index = EXCP_HLT; + env->halted = 1; + cpu_loop_exit(env); + } + +-void HELPER(exception)(uint32_t excp) ++void HELPER(exception)(CPUARMState *env, uint32_t excp) + { + env->exception_index = excp; + cpu_loop_exit(env); +@@ -248,7 +248,7 @@ uint32_t HELPER(cpsr_read)(void) + return cpsr_read(env) & ~CPSR_EXEC; + } + +-void HELPER(cpsr_write)(uint32_t val, uint32_t mask) ++void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask) + { + cpsr_write(env, val, mask); + } +@@ -271,7 +271,7 @@ uint32_t HELPER(get_user_reg)(uint32_t regno) + return val; + } + +-void HELPER(set_user_reg)(uint32_t regno, uint32_t val) ++void HELPER(set_user_reg)(CPUARMState *env, uint32_t regno, uint32_t val) + { + if (regno == 13) { + env->banked_r13[0] = val; +@@ -290,7 +290,7 @@ void HELPER(set_cp_reg)(CPUARMState *env, void *rip, uint32_t value) + const ARMCPRegInfo *ri = rip; + int excp = ri->writefn(env, ri, value); + if (excp) { +- raise_exception(excp); ++ raise_exception(env, excp); + } + } + +@@ -300,7 +300,7 @@ uint32_t HELPER(get_cp_reg)(CPUARMState *env, void *rip) + uint64_t value; + int excp = ri->readfn(env, ri, &value); + if (excp) { +- raise_exception(excp); ++ raise_exception(env, excp); + } + return value; + } +@@ -310,7 +310,7 @@ void HELPER(set_cp_reg64)(CPUARMState *env, void *rip, uint64_t value) + const ARMCPRegInfo *ri = rip; + int excp = ri->writefn(env, ri, value); + if (excp) { +- raise_exception(excp); ++ raise_exception(env, excp); + } + } + +@@ -320,7 +320,7 @@ uint64_t HELPER(get_cp_reg64)(CPUARMState *env, void *rip) + uint64_t value; + int excp = ri->readfn(env, ri, &value); + if (excp) { +- raise_exception(excp); ++ raise_exception(env, excp); + } + return value; + } +diff --git a/target-arm/translate.c b/target-arm/translate.c +index edef79a..6f651d9 100644 +--- a/target-arm/translate.c ++++ b/target-arm/translate.c +@@ -199,7 +199,7 @@ static void store_reg(DisasContext *s, int reg, TCGv var) + static inline void gen_set_cpsr(TCGv var, uint32_t mask) + { + TCGv tmp_mask = tcg_const_i32(mask); +- gen_helper_cpsr_write(var, tmp_mask); ++ gen_helper_cpsr_write(cpu_env, var, tmp_mask); + tcg_temp_free_i32(tmp_mask); + } + /* Set NZCV flags from the high 4 bits of var. */ +@@ -209,7 +209,7 @@ static void gen_exception(int excp) + { + TCGv tmp = tcg_temp_new_i32(); + tcg_gen_movi_i32(tmp, excp); +- gen_helper_exception(tmp); ++ gen_helper_exception(cpu_env, tmp); + tcg_temp_free_i32(tmp); + } + +@@ -7719,7 +7719,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + tmp = gen_ld32(addr, IS_USER(s)); + if (user) { + tmp2 = tcg_const_i32(i); +- gen_helper_set_user_reg(tmp2, tmp); ++ gen_helper_set_user_reg(cpu_env, tmp2, tmp); + tcg_temp_free_i32(tmp2); + tcg_temp_free_i32(tmp); + } else if (i == rn) { +@@ -9913,7 +9913,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env, + /* nothing more to generate */ + break; + case DISAS_WFI: +- gen_helper_wfi(); ++ gen_helper_wfi(cpu_env); + break; + case DISAS_SWI: + gen_exception(EXCP_SWI); +-- +1.7.12.1 + diff --git a/0032-target-arm-convert-remaining-helpers.patch b/0032-target-arm-convert-remaining-helpers.patch new file mode 100644 index 0000000..73dd928 --- /dev/null +++ b/0032-target-arm-convert-remaining-helpers.patch @@ -0,0 +1,821 @@ +From 18e713cf6b5ae2e7c48bb412c959c10322bef5e5 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Tue, 4 Sep 2012 20:19:15 +0000 +Subject: [PATCH] target-arm: convert remaining helpers + +Convert remaining helpers to AREG0 free mode: add an explicit +CPUState parameter instead of relying on AREG0. + +Signed-off-by: Blue Swirl +Reviewed-by: Peter Maydell +Signed-off-by: Michael Roth +--- + target-arm/helper.h | 52 +++++++++---------- + target-arm/op_helper.c | 64 +++++++++++------------ + target-arm/translate.c | 134 ++++++++++++++++++++++++------------------------- + 3 files changed, 125 insertions(+), 125 deletions(-) + +diff --git a/target-arm/helper.h b/target-arm/helper.h +index 106aacd..afdb2b5 100644 +--- a/target-arm/helper.h ++++ b/target-arm/helper.h +@@ -4,12 +4,12 @@ DEF_HELPER_1(clz, i32, i32) + DEF_HELPER_1(sxtb16, i32, i32) + DEF_HELPER_1(uxtb16, i32, i32) + +-DEF_HELPER_2(add_setq, i32, i32, i32) +-DEF_HELPER_2(add_saturate, i32, i32, i32) +-DEF_HELPER_2(sub_saturate, i32, i32, i32) +-DEF_HELPER_2(add_usaturate, i32, i32, i32) +-DEF_HELPER_2(sub_usaturate, i32, i32, i32) +-DEF_HELPER_1(double_saturate, i32, s32) ++DEF_HELPER_3(add_setq, i32, env, i32, i32) ++DEF_HELPER_3(add_saturate, i32, env, i32, i32) ++DEF_HELPER_3(sub_saturate, i32, env, i32, i32) ++DEF_HELPER_3(add_usaturate, i32, env, i32, i32) ++DEF_HELPER_3(sub_usaturate, i32, env, i32, i32) ++DEF_HELPER_2(double_saturate, i32, env, s32) + DEF_HELPER_2(sdiv, s32, s32, s32) + DEF_HELPER_2(udiv, i32, i32, i32) + DEF_HELPER_1(rbit, i32, i32) +@@ -40,10 +40,10 @@ PAS_OP(uq) + PAS_OP(uh) + #undef PAS_OP + +-DEF_HELPER_2(ssat, i32, i32, i32) +-DEF_HELPER_2(usat, i32, i32, i32) +-DEF_HELPER_2(ssat16, i32, i32, i32) +-DEF_HELPER_2(usat16, i32, i32, i32) ++DEF_HELPER_3(ssat, i32, env, i32, i32) ++DEF_HELPER_3(usat, i32, env, i32, i32) ++DEF_HELPER_3(ssat16, i32, env, i32, i32) ++DEF_HELPER_3(usat16, i32, env, i32, i32) + + DEF_HELPER_2(usad8, i32, i32, i32) + +@@ -54,7 +54,7 @@ DEF_HELPER_2(exception, void, env, i32) + DEF_HELPER_1(wfi, void, env) + + DEF_HELPER_3(cpsr_write, void, env, i32, i32) +-DEF_HELPER_0(cpsr_read, i32) ++DEF_HELPER_1(cpsr_read, i32, env) + + DEF_HELPER_3(v7m_msr, void, env, i32, i32) + DEF_HELPER_2(v7m_mrs, i32, env, i32) +@@ -67,7 +67,7 @@ DEF_HELPER_2(get_cp_reg64, i64, env, ptr) + DEF_HELPER_2(get_r13_banked, i32, env, i32) + DEF_HELPER_3(set_r13_banked, void, env, i32, i32) + +-DEF_HELPER_1(get_user_reg, i32, i32) ++DEF_HELPER_2(get_user_reg, i32, env, i32) + DEF_HELPER_3(set_user_reg, void, env, i32, i32) + + DEF_HELPER_1(vfp_get_fpscr, i32, env) +@@ -140,20 +140,20 @@ DEF_HELPER_2(recpe_f32, f32, f32, env) + DEF_HELPER_2(rsqrte_f32, f32, f32, env) + DEF_HELPER_2(recpe_u32, i32, i32, env) + DEF_HELPER_2(rsqrte_u32, i32, i32, env) +-DEF_HELPER_4(neon_tbl, i32, i32, i32, i32, i32) +- +-DEF_HELPER_2(add_cc, i32, i32, i32) +-DEF_HELPER_2(adc_cc, i32, i32, i32) +-DEF_HELPER_2(sub_cc, i32, i32, i32) +-DEF_HELPER_2(sbc_cc, i32, i32, i32) +- +-DEF_HELPER_2(shl, i32, i32, i32) +-DEF_HELPER_2(shr, i32, i32, i32) +-DEF_HELPER_2(sar, i32, i32, i32) +-DEF_HELPER_2(shl_cc, i32, i32, i32) +-DEF_HELPER_2(shr_cc, i32, i32, i32) +-DEF_HELPER_2(sar_cc, i32, i32, i32) +-DEF_HELPER_2(ror_cc, i32, i32, i32) ++DEF_HELPER_5(neon_tbl, i32, env, i32, i32, i32, i32) ++ ++DEF_HELPER_3(add_cc, i32, env, i32, i32) ++DEF_HELPER_3(adc_cc, i32, env, i32, i32) ++DEF_HELPER_3(sub_cc, i32, env, i32, i32) ++DEF_HELPER_3(sbc_cc, i32, env, i32, i32) ++ ++DEF_HELPER_3(shl, i32, env, i32, i32) ++DEF_HELPER_3(shr, i32, env, i32, i32) ++DEF_HELPER_3(sar, i32, env, i32, i32) ++DEF_HELPER_3(shl_cc, i32, env, i32, i32) ++DEF_HELPER_3(shr_cc, i32, env, i32, i32) ++DEF_HELPER_3(sar_cc, i32, env, i32, i32) ++DEF_HELPER_3(ror_cc, i32, env, i32, i32) + + /* neon_helper.c */ + DEF_HELPER_3(neon_qadd_u8, i32, env, i32, i32) +diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c +index b1adce3..5b868bf 100644 +--- a/target-arm/op_helper.c ++++ b/target-arm/op_helper.c +@@ -29,7 +29,7 @@ static void raise_exception(CPUARMState *env, int tt) + cpu_loop_exit(env); + } + +-uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, ++uint32_t HELPER(neon_tbl)(CPUARMState *env, uint32_t ireg, uint32_t def, + uint32_t rn, uint32_t maxindex) + { + uint32_t val; +@@ -101,7 +101,7 @@ void tlb_fill(CPUARMState *env1, target_ulong addr, int is_write, int mmu_idx, + + /* FIXME: Pass an explicit pointer to QF to CPUARMState, and move saturating + instructions into helper.c */ +-uint32_t HELPER(add_setq)(uint32_t a, uint32_t b) ++uint32_t HELPER(add_setq)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t res = a + b; + if (((res ^ a) & SIGNBIT) && !((a ^ b) & SIGNBIT)) +@@ -109,7 +109,7 @@ uint32_t HELPER(add_setq)(uint32_t a, uint32_t b) + return res; + } + +-uint32_t HELPER(add_saturate)(uint32_t a, uint32_t b) ++uint32_t HELPER(add_saturate)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t res = a + b; + if (((res ^ a) & SIGNBIT) && !((a ^ b) & SIGNBIT)) { +@@ -119,7 +119,7 @@ uint32_t HELPER(add_saturate)(uint32_t a, uint32_t b) + return res; + } + +-uint32_t HELPER(sub_saturate)(uint32_t a, uint32_t b) ++uint32_t HELPER(sub_saturate)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t res = a - b; + if (((res ^ a) & SIGNBIT) && ((a ^ b) & SIGNBIT)) { +@@ -129,7 +129,7 @@ uint32_t HELPER(sub_saturate)(uint32_t a, uint32_t b) + return res; + } + +-uint32_t HELPER(double_saturate)(int32_t val) ++uint32_t HELPER(double_saturate)(CPUARMState *env, int32_t val) + { + uint32_t res; + if (val >= 0x40000000) { +@@ -144,7 +144,7 @@ uint32_t HELPER(double_saturate)(int32_t val) + return res; + } + +-uint32_t HELPER(add_usaturate)(uint32_t a, uint32_t b) ++uint32_t HELPER(add_usaturate)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t res = a + b; + if (res < a) { +@@ -154,7 +154,7 @@ uint32_t HELPER(add_usaturate)(uint32_t a, uint32_t b) + return res; + } + +-uint32_t HELPER(sub_usaturate)(uint32_t a, uint32_t b) ++uint32_t HELPER(sub_usaturate)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t res = a - b; + if (res > a) { +@@ -165,7 +165,7 @@ uint32_t HELPER(sub_usaturate)(uint32_t a, uint32_t b) + } + + /* Signed saturation. */ +-static inline uint32_t do_ssat(int32_t val, int shift) ++static inline uint32_t do_ssat(CPUARMState *env, int32_t val, int shift) + { + int32_t top; + uint32_t mask; +@@ -183,7 +183,7 @@ static inline uint32_t do_ssat(int32_t val, int shift) + } + + /* Unsigned saturation. */ +-static inline uint32_t do_usat(int32_t val, int shift) ++static inline uint32_t do_usat(CPUARMState *env, int32_t val, int shift) + { + uint32_t max; + +@@ -199,34 +199,34 @@ static inline uint32_t do_usat(int32_t val, int shift) + } + + /* Signed saturate. */ +-uint32_t HELPER(ssat)(uint32_t x, uint32_t shift) ++uint32_t HELPER(ssat)(CPUARMState *env, uint32_t x, uint32_t shift) + { +- return do_ssat(x, shift); ++ return do_ssat(env, x, shift); + } + + /* Dual halfword signed saturate. */ +-uint32_t HELPER(ssat16)(uint32_t x, uint32_t shift) ++uint32_t HELPER(ssat16)(CPUARMState *env, uint32_t x, uint32_t shift) + { + uint32_t res; + +- res = (uint16_t)do_ssat((int16_t)x, shift); +- res |= do_ssat(((int32_t)x) >> 16, shift) << 16; ++ res = (uint16_t)do_ssat(env, (int16_t)x, shift); ++ res |= do_ssat(env, ((int32_t)x) >> 16, shift) << 16; + return res; + } + + /* Unsigned saturate. */ +-uint32_t HELPER(usat)(uint32_t x, uint32_t shift) ++uint32_t HELPER(usat)(CPUARMState *env, uint32_t x, uint32_t shift) + { +- return do_usat(x, shift); ++ return do_usat(env, x, shift); + } + + /* Dual halfword unsigned saturate. */ +-uint32_t HELPER(usat16)(uint32_t x, uint32_t shift) ++uint32_t HELPER(usat16)(CPUARMState *env, uint32_t x, uint32_t shift) + { + uint32_t res; + +- res = (uint16_t)do_usat((int16_t)x, shift); +- res |= do_usat(((int32_t)x) >> 16, shift) << 16; ++ res = (uint16_t)do_usat(env, (int16_t)x, shift); ++ res |= do_usat(env, ((int32_t)x) >> 16, shift) << 16; + return res; + } + +@@ -243,7 +243,7 @@ void HELPER(exception)(CPUARMState *env, uint32_t excp) + cpu_loop_exit(env); + } + +-uint32_t HELPER(cpsr_read)(void) ++uint32_t HELPER(cpsr_read)(CPUARMState *env) + { + return cpsr_read(env) & ~CPSR_EXEC; + } +@@ -254,7 +254,7 @@ void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask) + } + + /* Access to user mode registers from privileged modes. */ +-uint32_t HELPER(get_user_reg)(uint32_t regno) ++uint32_t HELPER(get_user_reg)(CPUARMState *env, uint32_t regno) + { + uint32_t val; + +@@ -329,7 +329,7 @@ uint64_t HELPER(get_cp_reg64)(CPUARMState *env, void *rip) + The only way to do that in TCG is a conditional branch, which clobbers + all our temporaries. For now implement these as helper functions. */ + +-uint32_t HELPER (add_cc)(uint32_t a, uint32_t b) ++uint32_t HELPER (add_cc)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t result; + result = a + b; +@@ -339,7 +339,7 @@ uint32_t HELPER (add_cc)(uint32_t a, uint32_t b) + return result; + } + +-uint32_t HELPER(adc_cc)(uint32_t a, uint32_t b) ++uint32_t HELPER(adc_cc)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t result; + if (!env->CF) { +@@ -354,7 +354,7 @@ uint32_t HELPER(adc_cc)(uint32_t a, uint32_t b) + return result; + } + +-uint32_t HELPER(sub_cc)(uint32_t a, uint32_t b) ++uint32_t HELPER(sub_cc)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t result; + result = a - b; +@@ -364,7 +364,7 @@ uint32_t HELPER(sub_cc)(uint32_t a, uint32_t b) + return result; + } + +-uint32_t HELPER(sbc_cc)(uint32_t a, uint32_t b) ++uint32_t HELPER(sbc_cc)(CPUARMState *env, uint32_t a, uint32_t b) + { + uint32_t result; + if (!env->CF) { +@@ -381,7 +381,7 @@ uint32_t HELPER(sbc_cc)(uint32_t a, uint32_t b) + + /* Similarly for variable shift instructions. */ + +-uint32_t HELPER(shl)(uint32_t x, uint32_t i) ++uint32_t HELPER(shl)(CPUARMState *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) +@@ -389,7 +389,7 @@ uint32_t HELPER(shl)(uint32_t x, uint32_t i) + return x << shift; + } + +-uint32_t HELPER(shr)(uint32_t x, uint32_t i) ++uint32_t HELPER(shr)(CPUARMState *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) +@@ -397,7 +397,7 @@ uint32_t HELPER(shr)(uint32_t x, uint32_t i) + return (uint32_t)x >> shift; + } + +-uint32_t HELPER(sar)(uint32_t x, uint32_t i) ++uint32_t HELPER(sar)(CPUARMState *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) +@@ -405,7 +405,7 @@ uint32_t HELPER(sar)(uint32_t x, uint32_t i) + return (int32_t)x >> shift; + } + +-uint32_t HELPER(shl_cc)(uint32_t x, uint32_t i) ++uint32_t HELPER(shl_cc)(CPUARMState *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) { +@@ -421,7 +421,7 @@ uint32_t HELPER(shl_cc)(uint32_t x, uint32_t i) + return x; + } + +-uint32_t HELPER(shr_cc)(uint32_t x, uint32_t i) ++uint32_t HELPER(shr_cc)(CPUARMState *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) { +@@ -437,7 +437,7 @@ uint32_t HELPER(shr_cc)(uint32_t x, uint32_t i) + return x; + } + +-uint32_t HELPER(sar_cc)(uint32_t x, uint32_t i) ++uint32_t HELPER(sar_cc)(CPUARMState *env, uint32_t x, uint32_t i) + { + int shift = i & 0xff; + if (shift >= 32) { +@@ -450,7 +450,7 @@ uint32_t HELPER(sar_cc)(uint32_t x, uint32_t i) + return x; + } + +-uint32_t HELPER(ror_cc)(uint32_t x, uint32_t i) ++uint32_t HELPER(ror_cc)(CPUARMState *env, uint32_t x, uint32_t i) + { + int shift1, shift; + shift1 = i & 0xff; +diff --git a/target-arm/translate.c b/target-arm/translate.c +index 6f651d9..9ae3b26 100644 +--- a/target-arm/translate.c ++++ b/target-arm/translate.c +@@ -490,16 +490,16 @@ static inline void gen_arm_shift_reg(TCGv var, int shiftop, + { + if (flags) { + switch (shiftop) { +- case 0: gen_helper_shl_cc(var, var, shift); break; +- case 1: gen_helper_shr_cc(var, var, shift); break; +- case 2: gen_helper_sar_cc(var, var, shift); break; +- case 3: gen_helper_ror_cc(var, var, shift); break; ++ case 0: gen_helper_shl_cc(var, cpu_env, var, shift); break; ++ case 1: gen_helper_shr_cc(var, cpu_env, var, shift); break; ++ case 2: gen_helper_sar_cc(var, cpu_env, var, shift); break; ++ case 3: gen_helper_ror_cc(var, cpu_env, var, shift); break; + } + } else { + switch (shiftop) { +- case 0: gen_helper_shl(var, var, shift); break; +- case 1: gen_helper_shr(var, var, shift); break; +- case 2: gen_helper_sar(var, var, shift); break; ++ case 0: gen_helper_shl(var, cpu_env, var, shift); break; ++ case 1: gen_helper_shr(var, cpu_env, var, shift); break; ++ case 2: gen_helper_sar(var, cpu_env, var, shift); break; + case 3: tcg_gen_andi_i32(shift, shift, 0x1f); + tcg_gen_rotr_i32(var, var, shift); break; + } +@@ -6121,7 +6121,7 @@ static int disas_neon_data_insn(CPUARMState * env, DisasContext *s, uint32_t ins + tmp2 = neon_load_reg(rm, 0); + tmp4 = tcg_const_i32(rn); + tmp5 = tcg_const_i32(n); +- gen_helper_neon_tbl(tmp2, tmp2, tmp, tmp4, tmp5); ++ gen_helper_neon_tbl(tmp2, cpu_env, tmp2, tmp, tmp4, tmp5); + tcg_temp_free_i32(tmp); + if (insn & (1 << 6)) { + tmp = neon_load_reg(rd, 1); +@@ -6130,7 +6130,7 @@ static int disas_neon_data_insn(CPUARMState * env, DisasContext *s, uint32_t ins + tcg_gen_movi_i32(tmp, 0); + } + tmp3 = neon_load_reg(rm, 1); +- gen_helper_neon_tbl(tmp3, tmp3, tmp, tmp4, tmp5); ++ gen_helper_neon_tbl(tmp3, cpu_env, tmp3, tmp, tmp4, tmp5); + tcg_temp_free_i32(tmp5); + tcg_temp_free_i32(tmp4); + neon_store_reg(rd, 0, tmp2); +@@ -6818,7 +6818,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + tmp = load_cpu_field(spsr); + } else { + tmp = tcg_temp_new_i32(); +- gen_helper_cpsr_read(tmp); ++ gen_helper_cpsr_read(tmp, cpu_env); + } + store_reg(s, rd, tmp); + } +@@ -6869,11 +6869,11 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + tmp = load_reg(s, rm); + tmp2 = load_reg(s, rn); + if (op1 & 2) +- gen_helper_double_saturate(tmp2, tmp2); ++ gen_helper_double_saturate(tmp2, cpu_env, tmp2); + if (op1 & 1) +- gen_helper_sub_saturate(tmp, tmp, tmp2); ++ gen_helper_sub_saturate(tmp, cpu_env, tmp, tmp2); + else +- gen_helper_add_saturate(tmp, tmp, tmp2); ++ gen_helper_add_saturate(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + store_reg(s, rd, tmp); + break; +@@ -6911,7 +6911,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + tcg_temp_free_i64(tmp64); + if ((sh & 2) == 0) { + tmp2 = load_reg(s, rn); +- gen_helper_add_setq(tmp, tmp, tmp2); ++ gen_helper_add_setq(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + } + store_reg(s, rd, tmp); +@@ -6931,7 +6931,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + } else { + if (op1 == 0) { + tmp2 = load_reg(s, rn); +- gen_helper_add_setq(tmp, tmp, tmp2); ++ gen_helper_add_setq(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + } + store_reg(s, rd, tmp); +@@ -7005,11 +7005,11 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + if (IS_USER(s)) { + goto illegal_op; + } +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + gen_exception_return(s, tmp); + } else { + if (set_cc) { +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + } else { + tcg_gen_sub_i32(tmp, tmp, tmp2); + } +@@ -7018,7 +7018,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + break; + case 0x03: + if (set_cc) { +- gen_helper_sub_cc(tmp, tmp2, tmp); ++ gen_helper_sub_cc(tmp, cpu_env, tmp2, tmp); + } else { + tcg_gen_sub_i32(tmp, tmp2, tmp); + } +@@ -7026,7 +7026,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + break; + case 0x04: + if (set_cc) { +- gen_helper_add_cc(tmp, tmp, tmp2); ++ gen_helper_add_cc(tmp, cpu_env, tmp, tmp2); + } else { + tcg_gen_add_i32(tmp, tmp, tmp2); + } +@@ -7034,7 +7034,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + break; + case 0x05: + if (set_cc) { +- gen_helper_adc_cc(tmp, tmp, tmp2); ++ gen_helper_adc_cc(tmp, cpu_env, tmp, tmp2); + } else { + gen_add_carry(tmp, tmp, tmp2); + } +@@ -7042,7 +7042,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + break; + case 0x06: + if (set_cc) { +- gen_helper_sbc_cc(tmp, tmp, tmp2); ++ gen_helper_sbc_cc(tmp, cpu_env, tmp, tmp2); + } else { + gen_sub_carry(tmp, tmp, tmp2); + } +@@ -7050,7 +7050,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + break; + case 0x07: + if (set_cc) { +- gen_helper_sbc_cc(tmp, tmp2, tmp); ++ gen_helper_sbc_cc(tmp, cpu_env, tmp2, tmp); + } else { + gen_sub_carry(tmp, tmp2, tmp); + } +@@ -7072,13 +7072,13 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + break; + case 0x0a: + if (set_cc) { +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tmp); + break; + case 0x0b: + if (set_cc) { +- gen_helper_add_cc(tmp, tmp, tmp2); ++ gen_helper_add_cc(tmp, cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tmp); + break; +@@ -7395,9 +7395,9 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + sh = (insn >> 16) & 0x1f; + tmp2 = tcg_const_i32(sh); + if (insn & (1 << 22)) +- gen_helper_usat(tmp, tmp, tmp2); ++ gen_helper_usat(tmp, cpu_env, tmp, tmp2); + else +- gen_helper_ssat(tmp, tmp, tmp2); ++ gen_helper_ssat(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + store_reg(s, rd, tmp); + } else if ((insn & 0x00300fe0) == 0x00200f20) { +@@ -7406,9 +7406,9 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + sh = (insn >> 16) & 0x1f; + tmp2 = tcg_const_i32(sh); + if (insn & (1 << 22)) +- gen_helper_usat16(tmp, tmp, tmp2); ++ gen_helper_usat16(tmp, cpu_env, tmp, tmp2); + else +- gen_helper_ssat16(tmp, tmp, tmp2); ++ gen_helper_ssat16(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + store_reg(s, rd, tmp); + } else if ((insn & 0x00700fe0) == 0x00000fa0) { +@@ -7518,7 +7518,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + * however it may overflow considered as a signed + * operation, in which case we must set the Q flag. + */ +- gen_helper_add_setq(tmp, tmp, tmp2); ++ gen_helper_add_setq(tmp, cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tmp2); + if (insn & (1 << 22)) { +@@ -7534,7 +7534,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + if (rd != 15) + { + tmp2 = load_reg(s, rd); +- gen_helper_add_setq(tmp, tmp, tmp2); ++ gen_helper_add_setq(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + } + store_reg(s, rn, tmp); +@@ -7738,7 +7738,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + } else if (user) { + tmp = tcg_temp_new_i32(); + tmp2 = tcg_const_i32(i); +- gen_helper_get_user_reg(tmp, tmp2); ++ gen_helper_get_user_reg(tmp, cpu_env, tmp2); + tcg_temp_free_i32(tmp2); + } else { + tmp = load_reg(s, i); +@@ -7865,31 +7865,31 @@ gen_thumb2_data_op(DisasContext *s, int op, int conds, uint32_t shifter_out, TCG + break; + case 8: /* add */ + if (conds) +- gen_helper_add_cc(t0, t0, t1); ++ gen_helper_add_cc(t0, cpu_env, t0, t1); + else + tcg_gen_add_i32(t0, t0, t1); + break; + case 10: /* adc */ + if (conds) +- gen_helper_adc_cc(t0, t0, t1); ++ gen_helper_adc_cc(t0, cpu_env, t0, t1); + else + gen_adc(t0, t1); + break; + case 11: /* sbc */ + if (conds) +- gen_helper_sbc_cc(t0, t0, t1); ++ gen_helper_sbc_cc(t0, cpu_env, t0, t1); + else + gen_sub_carry(t0, t0, t1); + break; + case 13: /* sub */ + if (conds) +- gen_helper_sub_cc(t0, t0, t1); ++ gen_helper_sub_cc(t0, cpu_env, t0, t1); + else + tcg_gen_sub_i32(t0, t0, t1); + break; + case 14: /* rsb */ + if (conds) +- gen_helper_sub_cc(t0, t1, t0); ++ gen_helper_sub_cc(t0, cpu_env, t1, t0); + else + tcg_gen_sub_i32(t0, t1, t0); + break; +@@ -8111,7 +8111,7 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw + gen_st32(tmp, addr, 0); + tcg_gen_addi_i32(addr, addr, 4); + tmp = tcg_temp_new_i32(); +- gen_helper_cpsr_read(tmp); ++ gen_helper_cpsr_read(tmp, cpu_env); + gen_st32(tmp, addr, 0); + if (insn & (1 << 21)) { + if ((insn & (1 << 24)) == 0) { +@@ -8293,11 +8293,11 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + if (op & 1) +- gen_helper_double_saturate(tmp, tmp); ++ gen_helper_double_saturate(tmp, cpu_env, tmp); + if (op & 2) +- gen_helper_sub_saturate(tmp, tmp2, tmp); ++ gen_helper_sub_saturate(tmp, cpu_env, tmp2, tmp); + else +- gen_helper_add_saturate(tmp, tmp, tmp2); ++ gen_helper_add_saturate(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + } else { + tmp = load_reg(s, rn); +@@ -8353,7 +8353,7 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw + tcg_temp_free_i32(tmp2); + if (rs != 15) { + tmp2 = load_reg(s, rs); +- gen_helper_add_setq(tmp, tmp, tmp2); ++ gen_helper_add_setq(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + } + break; +@@ -8370,13 +8370,13 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw + * however it may overflow considered as a signed + * operation, in which case we must set the Q flag. + */ +- gen_helper_add_setq(tmp, tmp, tmp2); ++ gen_helper_add_setq(tmp, cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tmp2); + if (rs != 15) + { + tmp2 = load_reg(s, rs); +- gen_helper_add_setq(tmp, tmp, tmp2); ++ gen_helper_add_setq(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + } + break; +@@ -8393,7 +8393,7 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw + if (rs != 15) + { + tmp2 = load_reg(s, rs); +- gen_helper_add_setq(tmp, tmp, tmp2); ++ gen_helper_add_setq(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + } + break; +@@ -8632,7 +8632,7 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw + gen_helper_v7m_mrs(tmp, cpu_env, addr); + tcg_temp_free_i32(addr); + } else { +- gen_helper_cpsr_read(tmp); ++ gen_helper_cpsr_read(tmp, cpu_env); + } + store_reg(s, rd, tmp); + break; +@@ -8721,15 +8721,15 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw + if (op & 4) { + /* Unsigned. */ + if ((op & 1) && shift == 0) +- gen_helper_usat16(tmp, tmp, tmp2); ++ gen_helper_usat16(tmp, cpu_env, tmp, tmp2); + else +- gen_helper_usat(tmp, tmp, tmp2); ++ gen_helper_usat(tmp, cpu_env, tmp, tmp2); + } else { + /* Signed. */ + if ((op & 1) && shift == 0) +- gen_helper_ssat16(tmp, tmp, tmp2); ++ gen_helper_ssat16(tmp, cpu_env, tmp, tmp2); + else +- gen_helper_ssat(tmp, tmp, tmp2); ++ gen_helper_ssat(tmp, cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tmp2); + break; +@@ -9017,12 +9017,12 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + if (s->condexec_mask) + tcg_gen_sub_i32(tmp, tmp, tmp2); + else +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + } else { + if (s->condexec_mask) + tcg_gen_add_i32(tmp, tmp, tmp2); + else +- gen_helper_add_cc(tmp, tmp, tmp2); ++ gen_helper_add_cc(tmp, cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tmp2); + store_reg(s, rd, tmp); +@@ -9053,7 +9053,7 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + tcg_gen_movi_i32(tmp2, insn & 0xff); + switch (op) { + case 1: /* cmp */ +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp); + tcg_temp_free_i32(tmp2); + break; +@@ -9061,7 +9061,7 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + if (s->condexec_mask) + tcg_gen_add_i32(tmp, tmp, tmp2); + else +- gen_helper_add_cc(tmp, tmp, tmp2); ++ gen_helper_add_cc(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + store_reg(s, rd, tmp); + break; +@@ -9069,7 +9069,7 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + if (s->condexec_mask) + tcg_gen_sub_i32(tmp, tmp, tmp2); + else +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + store_reg(s, rd, tmp); + break; +@@ -9105,7 +9105,7 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + case 1: /* cmp */ + tmp = load_reg(s, rd); + tmp2 = load_reg(s, rm); +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + tcg_temp_free_i32(tmp2); + tcg_temp_free_i32(tmp); + break; +@@ -9166,25 +9166,25 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + break; + case 0x2: /* lsl */ + if (s->condexec_mask) { +- gen_helper_shl(tmp2, tmp2, tmp); ++ gen_helper_shl(tmp2, cpu_env, tmp2, tmp); + } else { +- gen_helper_shl_cc(tmp2, tmp2, tmp); ++ gen_helper_shl_cc(tmp2, cpu_env, tmp2, tmp); + gen_logic_CC(tmp2); + } + break; + case 0x3: /* lsr */ + if (s->condexec_mask) { +- gen_helper_shr(tmp2, tmp2, tmp); ++ gen_helper_shr(tmp2, cpu_env, tmp2, tmp); + } else { +- gen_helper_shr_cc(tmp2, tmp2, tmp); ++ gen_helper_shr_cc(tmp2, cpu_env, tmp2, tmp); + gen_logic_CC(tmp2); + } + break; + case 0x4: /* asr */ + if (s->condexec_mask) { +- gen_helper_sar(tmp2, tmp2, tmp); ++ gen_helper_sar(tmp2, cpu_env, tmp2, tmp); + } else { +- gen_helper_sar_cc(tmp2, tmp2, tmp); ++ gen_helper_sar_cc(tmp2, cpu_env, tmp2, tmp); + gen_logic_CC(tmp2); + } + break; +@@ -9192,20 +9192,20 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + if (s->condexec_mask) + gen_adc(tmp, tmp2); + else +- gen_helper_adc_cc(tmp, tmp, tmp2); ++ gen_helper_adc_cc(tmp, cpu_env, tmp, tmp2); + break; + case 0x6: /* sbc */ + if (s->condexec_mask) + gen_sub_carry(tmp, tmp, tmp2); + else +- gen_helper_sbc_cc(tmp, tmp, tmp2); ++ gen_helper_sbc_cc(tmp, cpu_env, tmp, tmp2); + break; + case 0x7: /* ror */ + if (s->condexec_mask) { + tcg_gen_andi_i32(tmp, tmp, 0x1f); + tcg_gen_rotr_i32(tmp2, tmp2, tmp); + } else { +- gen_helper_ror_cc(tmp2, tmp2, tmp); ++ gen_helper_ror_cc(tmp2, cpu_env, tmp2, tmp); + gen_logic_CC(tmp2); + } + break; +@@ -9218,14 +9218,14 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + if (s->condexec_mask) + tcg_gen_neg_i32(tmp, tmp2); + else +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + break; + case 0xa: /* cmp */ +- gen_helper_sub_cc(tmp, tmp, tmp2); ++ gen_helper_sub_cc(tmp, cpu_env, tmp, tmp2); + rd = 16; + break; + case 0xb: /* cmn */ +- gen_helper_add_cc(tmp, tmp, tmp2); ++ gen_helper_add_cc(tmp, cpu_env, tmp, tmp2); + rd = 16; + break; + case 0xc: /* orr */ +-- +1.7.12.1 + diff --git a/0033-target-arm-final-conversion-to-AREG0-free-mode.patch b/0033-target-arm-final-conversion-to-AREG0-free-mode.patch new file mode 100644 index 0000000..8a83359 --- /dev/null +++ b/0033-target-arm-final-conversion-to-AREG0-free-mode.patch @@ -0,0 +1,179 @@ +From 28b8f097f9fb107882aa51bd25ba87619beb033e Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Tue, 4 Sep 2012 20:25:59 +0000 +Subject: [PATCH] target-arm: final conversion to AREG0 free mode + +Convert code load functions and switch to AREG0 free mode. + +Signed-off-by: Blue Swirl +Reviewed-by: Peter Maydell +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-arm/Makefile.objs | 2 -- + target-arm/cpu.h | 10 ++++++---- + target-arm/helper.c | 9 +++++---- + target-arm/op_helper.c | 8 +------- + target-arm/translate.c | 6 +++--- + 6 files changed, 16 insertions(+), 21 deletions(-) + +diff --git a/configure b/configure +index a8827ba..e8806f0 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | i386 | lm32 | m68k | or32 | s390x | sparc* | unicore32 | x86_64 | xtensa* | ppc*) ++ alpha | arm* | i386 | lm32 | m68k | or32 | s390x | sparc* | unicore32 | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-arm/Makefile.objs b/target-arm/Makefile.objs +index f447c4f..b6f1a9e 100644 +--- a/target-arm/Makefile.objs ++++ b/target-arm/Makefile.objs +@@ -2,5 +2,3 @@ obj-y += arm-semi.o + obj-$(CONFIG_SOFTMMU) += machine.o + obj-y += translate.o op_helper.o helper.o cpu.o + obj-y += neon_helper.o iwmmxt_helper.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-arm/cpu.h b/target-arm/cpu.h +index d7f93d9..7fac94f 100644 +--- a/target-arm/cpu.h ++++ b/target-arm/cpu.h +@@ -734,9 +734,10 @@ static inline void cpu_pc_from_tb(CPUARMState *env, TranslationBlock *tb) + } + + /* Load an instruction and return it in the standard little-endian order */ +-static inline uint32_t arm_ldl_code(uint32_t addr, bool do_swap) ++static inline uint32_t arm_ldl_code(CPUARMState *env, uint32_t addr, ++ bool do_swap) + { +- uint32_t insn = ldl_code(addr); ++ uint32_t insn = cpu_ldl_code(env, addr); + if (do_swap) { + return bswap32(insn); + } +@@ -744,9 +745,10 @@ static inline uint32_t arm_ldl_code(uint32_t addr, bool do_swap) + } + + /* Ditto, for a halfword (Thumb) instruction */ +-static inline uint16_t arm_lduw_code(uint32_t addr, bool do_swap) ++static inline uint16_t arm_lduw_code(CPUARMState *env, uint32_t addr, ++ bool do_swap) + { +- uint16_t insn = lduw_code(addr); ++ uint16_t insn = cpu_lduw_code(env, addr); + if (do_swap) { + return bswap16(insn); + } +diff --git a/target-arm/helper.c b/target-arm/helper.c +index e27df96..58340bd 100644 +--- a/target-arm/helper.c ++++ b/target-arm/helper.c +@@ -1756,7 +1756,7 @@ static void do_interrupt_v7m(CPUARMState *env) + case EXCP_BKPT: + if (semihosting_enabled) { + int nr; +- nr = arm_lduw_code(env->regs[15], env->bswap_code) & 0xff; ++ nr = arm_lduw_code(env, env->regs[15], env->bswap_code) & 0xff; + if (nr == 0xab) { + env->regs[15] += 2; + env->regs[0] = do_arm_semihosting(env); +@@ -1828,9 +1828,10 @@ void do_interrupt(CPUARMState *env) + if (semihosting_enabled) { + /* Check for semihosting interrupt. */ + if (env->thumb) { +- mask = arm_lduw_code(env->regs[15] - 2, env->bswap_code) & 0xff; ++ mask = arm_lduw_code(env, env->regs[15] - 2, env->bswap_code) ++ & 0xff; + } else { +- mask = arm_ldl_code(env->regs[15] - 4, env->bswap_code) ++ mask = arm_ldl_code(env, env->regs[15] - 4, env->bswap_code) + & 0xffffff; + } + /* Only intercept calls from privileged modes, to provide some +@@ -1851,7 +1852,7 @@ void do_interrupt(CPUARMState *env) + case EXCP_BKPT: + /* See if this is a semihosting syscall. */ + if (env->thumb && semihosting_enabled) { +- mask = arm_lduw_code(env->regs[15], env->bswap_code) & 0xff; ++ mask = arm_lduw_code(env, env->regs[15], env->bswap_code) & 0xff; + if (mask == 0xab + && (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) { + env->regs[15] += 2; +diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c +index 5b868bf..f13fc3a 100644 +--- a/target-arm/op_helper.c ++++ b/target-arm/op_helper.c +@@ -17,7 +17,6 @@ + * License along with this library; if not, see . + */ + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helper.h" + + #define SIGNBIT (uint32_t)0x80000000 +@@ -72,16 +71,12 @@ uint32_t HELPER(neon_tbl)(CPUARMState *env, uint32_t ireg, uint32_t def, + /* try to fill the TLB and return an exception if error. If retaddr is + NULL, it means that the function was called in C code (i.e. not + from generated code or from helper.c) */ +-/* XXX: fix it to restore all registers */ +-void tlb_fill(CPUARMState *env1, target_ulong addr, int is_write, int mmu_idx, ++void tlb_fill(CPUARMState *env, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) + { + TranslationBlock *tb; +- CPUARMState *saved_env; + int ret; + +- saved_env = env; +- env = env1; + ret = cpu_arm_handle_mmu_fault(env, addr, is_write, mmu_idx); + if (unlikely(ret)) { + if (retaddr) { +@@ -95,7 +90,6 @@ void tlb_fill(CPUARMState *env1, target_ulong addr, int is_write, int mmu_idx, + } + raise_exception(env, env->exception_index); + } +- env = saved_env; + } + #endif + +diff --git a/target-arm/translate.c b/target-arm/translate.c +index 9ae3b26..f4b447a 100644 +--- a/target-arm/translate.c ++++ b/target-arm/translate.c +@@ -6534,7 +6534,7 @@ static void disas_arm_insn(CPUARMState * env, DisasContext *s) + TCGv addr; + TCGv_i64 tmp64; + +- insn = arm_ldl_code(s->pc, s->bswap_code); ++ insn = arm_ldl_code(env, s->pc, s->bswap_code); + s->pc += 4; + + /* M variants do not implement ARM mode. */ +@@ -7962,7 +7962,7 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw + /* Fall through to 32-bit decode. */ + } + +- insn = arm_lduw_code(s->pc, s->bswap_code); ++ insn = arm_lduw_code(env, s->pc, s->bswap_code); + s->pc += 2; + insn |= (uint32_t)insn_hw1 << 16; + +@@ -8992,7 +8992,7 @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s) + } + } + +- insn = arm_lduw_code(s->pc, s->bswap_code); ++ insn = arm_lduw_code(env, s->pc, s->bswap_code); + s->pc += 2; + + switch (insn >> 12) { +-- +1.7.12.1 + diff --git a/0034-target-microblaze-switch-to-AREG0-free-mode.patch b/0034-target-microblaze-switch-to-AREG0-free-mode.patch new file mode 100644 index 0000000..fea6bb8 --- /dev/null +++ b/0034-target-microblaze-switch-to-AREG0-free-mode.patch @@ -0,0 +1,715 @@ +From 449d4f2cfbdd2b5fd00e3e82c78bf580bd81551d Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 08:39:22 +0000 +Subject: [PATCH] target-microblaze: switch to AREG0 free mode + +Add an explicit CPUState parameter instead of relying on AREG0 +and switch to AREG0 free mode. + +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-microblaze/Makefile.objs | 2 - + target-microblaze/helper.h | 48 ++++++++--------- + target-microblaze/op_helper.c | 115 ++++++++++++++++++---------------------- + target-microblaze/translate.c | 61 +++++++++++---------- + 5 files changed, 110 insertions(+), 118 deletions(-) + +diff --git a/configure b/configure +index e8806f0..0b4ef4a 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | arm* | i386 | lm32 | m68k | or32 | s390x | sparc* | unicore32 | x86_64 | xtensa* | ppc*) ++ alpha | arm* | i386 | lm32 | m68k | microblaze* | or32 | s390x | sparc* | unicore32 | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-microblaze/Makefile.objs b/target-microblaze/Makefile.objs +index 4b09e8c..afb87bc 100644 +--- a/target-microblaze/Makefile.objs ++++ b/target-microblaze/Makefile.objs +@@ -1,4 +1,2 @@ + obj-y += translate.o op_helper.o helper.o cpu.o + obj-$(CONFIG_SOFTMMU) += mmu.o machine.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-microblaze/helper.h b/target-microblaze/helper.h +index 9dcfb0f..a1a732c 100644 +--- a/target-microblaze/helper.h ++++ b/target-microblaze/helper.h +@@ -1,39 +1,39 @@ + #include "def-helper.h" + +-DEF_HELPER_1(raise_exception, void, i32) +-DEF_HELPER_0(debug, void) ++DEF_HELPER_2(raise_exception, void, env, i32) ++DEF_HELPER_1(debug, void, env) + DEF_HELPER_FLAGS_3(carry, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32, i32) + DEF_HELPER_2(cmp, i32, i32, i32) + DEF_HELPER_2(cmpu, i32, i32, i32) + DEF_HELPER_FLAGS_1(clz, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32) + +-DEF_HELPER_2(divs, i32, i32, i32) +-DEF_HELPER_2(divu, i32, i32, i32) +- +-DEF_HELPER_2(fadd, i32, i32, i32) +-DEF_HELPER_2(frsub, i32, i32, i32) +-DEF_HELPER_2(fmul, i32, i32, i32) +-DEF_HELPER_2(fdiv, i32, i32, i32) +-DEF_HELPER_1(flt, i32, i32) +-DEF_HELPER_1(fint, i32, i32) +-DEF_HELPER_1(fsqrt, i32, i32) +- +-DEF_HELPER_2(fcmp_un, i32, i32, i32) +-DEF_HELPER_2(fcmp_lt, i32, i32, i32) +-DEF_HELPER_2(fcmp_eq, i32, i32, i32) +-DEF_HELPER_2(fcmp_le, i32, i32, i32) +-DEF_HELPER_2(fcmp_gt, i32, i32, i32) +-DEF_HELPER_2(fcmp_ne, i32, i32, i32) +-DEF_HELPER_2(fcmp_ge, i32, i32, i32) ++DEF_HELPER_3(divs, i32, env, i32, i32) ++DEF_HELPER_3(divu, i32, env, i32, i32) ++ ++DEF_HELPER_3(fadd, i32, env, i32, i32) ++DEF_HELPER_3(frsub, i32, env, i32, i32) ++DEF_HELPER_3(fmul, i32, env, i32, i32) ++DEF_HELPER_3(fdiv, i32, env, i32, i32) ++DEF_HELPER_2(flt, i32, env, i32) ++DEF_HELPER_2(fint, i32, env, i32) ++DEF_HELPER_2(fsqrt, i32, env, i32) ++ ++DEF_HELPER_3(fcmp_un, i32, env, i32, i32) ++DEF_HELPER_3(fcmp_lt, i32, env, i32, i32) ++DEF_HELPER_3(fcmp_eq, i32, env, i32, i32) ++DEF_HELPER_3(fcmp_le, i32, env, i32, i32) ++DEF_HELPER_3(fcmp_gt, i32, env, i32, i32) ++DEF_HELPER_3(fcmp_ne, i32, env, i32, i32) ++DEF_HELPER_3(fcmp_ge, i32, env, i32, i32) + + DEF_HELPER_FLAGS_2(pcmpbf, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32) + #if !defined(CONFIG_USER_ONLY) +-DEF_HELPER_1(mmu_read, i32, i32) +-DEF_HELPER_2(mmu_write, void, i32, i32) ++DEF_HELPER_2(mmu_read, i32, env, i32) ++DEF_HELPER_3(mmu_write, void, env, i32, i32) + #endif + +-DEF_HELPER_4(memalign, void, i32, i32, i32, i32) +-DEF_HELPER_1(stackprot, void, i32) ++DEF_HELPER_5(memalign, void, env, i32, i32, i32, i32) ++DEF_HELPER_2(stackprot, void, env, i32) + + DEF_HELPER_2(get, i32, i32, i32) + DEF_HELPER_3(put, void, i32, i32, i32) +diff --git a/target-microblaze/op_helper.c b/target-microblaze/op_helper.c +index 3b1f072..c9789f4 100644 +--- a/target-microblaze/op_helper.c ++++ b/target-microblaze/op_helper.c +@@ -20,7 +20,6 @@ + + #include + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helper.h" + #include "host-utils.h" + +@@ -42,17 +41,12 @@ + /* Try to fill the TLB and return an exception if error. If retaddr is + NULL, it means that the function was called in C code (i.e. not + from generated code or from helper.c) */ +-/* XXX: fix it to restore all registers */ +-void tlb_fill(CPUMBState *env1, target_ulong addr, int is_write, int mmu_idx, ++void tlb_fill(CPUMBState *env, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) + { + TranslationBlock *tb; +- CPUMBState *saved_env; + int ret; + +- saved_env = env; +- env = env1; +- + ret = cpu_mb_handle_mmu_fault(env, addr, is_write, mmu_idx); + if (unlikely(ret)) { + if (retaddr) { +@@ -66,7 +60,6 @@ void tlb_fill(CPUMBState *env1, target_ulong addr, int is_write, int mmu_idx, + } + cpu_loop_exit(env); + } +- env = saved_env; + } + #endif + +@@ -105,13 +98,13 @@ uint32_t helper_get(uint32_t id, uint32_t ctrl) + return 0xdead0000 | id; + } + +-void helper_raise_exception(uint32_t index) ++void helper_raise_exception(CPUMBState *env, uint32_t index) + { + env->exception_index = index; + cpu_loop_exit(env); + } + +-void helper_debug(void) ++void helper_debug(CPUMBState *env) + { + int i; + +@@ -176,7 +169,7 @@ uint32_t helper_carry(uint32_t a, uint32_t b, uint32_t cf) + return ncf; + } + +-static inline int div_prepare(uint32_t a, uint32_t b) ++static inline int div_prepare(CPUMBState *env, uint32_t a, uint32_t b) + { + if (b == 0) { + env->sregs[SR_MSR] |= MSR_DZ; +@@ -184,7 +177,7 @@ static inline int div_prepare(uint32_t a, uint32_t b) + if ((env->sregs[SR_MSR] & MSR_EE) + && !(env->pvr.regs[2] & PVR2_DIV_ZERO_EXC_MASK)) { + env->sregs[SR_ESR] = ESR_EC_DIVZERO; +- helper_raise_exception(EXCP_HW_EXCP); ++ helper_raise_exception(env, EXCP_HW_EXCP); + } + return 0; + } +@@ -192,28 +185,30 @@ static inline int div_prepare(uint32_t a, uint32_t b) + return 1; + } + +-uint32_t helper_divs(uint32_t a, uint32_t b) ++uint32_t helper_divs(CPUMBState *env, uint32_t a, uint32_t b) + { +- if (!div_prepare(a, b)) ++ if (!div_prepare(env, a, b)) { + return 0; ++ } + return (int32_t)a / (int32_t)b; + } + +-uint32_t helper_divu(uint32_t a, uint32_t b) ++uint32_t helper_divu(CPUMBState *env, uint32_t a, uint32_t b) + { +- if (!div_prepare(a, b)) ++ if (!div_prepare(env, a, b)) { + return 0; ++ } + return a / b; + } + + /* raise FPU exception. */ +-static void raise_fpu_exception(void) ++static void raise_fpu_exception(CPUMBState *env) + { + env->sregs[SR_ESR] = ESR_EC_FPU; +- helper_raise_exception(EXCP_HW_EXCP); ++ helper_raise_exception(env, EXCP_HW_EXCP); + } + +-static void update_fpu_flags(int flags) ++static void update_fpu_flags(CPUMBState *env, int flags) + { + int raise = 0; + +@@ -236,11 +231,11 @@ static void update_fpu_flags(int flags) + if (raise + && (env->pvr.regs[2] & PVR2_FPU_EXC_MASK) + && (env->sregs[SR_MSR] & MSR_EE)) { +- raise_fpu_exception(); ++ raise_fpu_exception(env); + } + } + +-uint32_t helper_fadd(uint32_t a, uint32_t b) ++uint32_t helper_fadd(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fd, fa, fb; + int flags; +@@ -251,11 +246,11 @@ uint32_t helper_fadd(uint32_t a, uint32_t b) + fd.f = float32_add(fa.f, fb.f, &env->fp_status); + + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags); ++ update_fpu_flags(env, flags); + return fd.l; + } + +-uint32_t helper_frsub(uint32_t a, uint32_t b) ++uint32_t helper_frsub(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fd, fa, fb; + int flags; +@@ -265,11 +260,11 @@ uint32_t helper_frsub(uint32_t a, uint32_t b) + fb.l = b; + fd.f = float32_sub(fb.f, fa.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags); ++ update_fpu_flags(env, flags); + return fd.l; + } + +-uint32_t helper_fmul(uint32_t a, uint32_t b) ++uint32_t helper_fmul(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fd, fa, fb; + int flags; +@@ -279,12 +274,12 @@ uint32_t helper_fmul(uint32_t a, uint32_t b) + fb.l = b; + fd.f = float32_mul(fa.f, fb.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags); ++ update_fpu_flags(env, flags); + + return fd.l; + } + +-uint32_t helper_fdiv(uint32_t a, uint32_t b) ++uint32_t helper_fdiv(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fd, fa, fb; + int flags; +@@ -294,12 +289,12 @@ uint32_t helper_fdiv(uint32_t a, uint32_t b) + fb.l = b; + fd.f = float32_div(fb.f, fa.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags); ++ update_fpu_flags(env, flags); + + return fd.l; + } + +-uint32_t helper_fcmp_un(uint32_t a, uint32_t b) ++uint32_t helper_fcmp_un(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fa, fb; + uint32_t r = 0; +@@ -308,7 +303,7 @@ uint32_t helper_fcmp_un(uint32_t a, uint32_t b) + fb.l = b; + + if (float32_is_signaling_nan(fa.f) || float32_is_signaling_nan(fb.f)) { +- update_fpu_flags(float_flag_invalid); ++ update_fpu_flags(env, float_flag_invalid); + r = 1; + } + +@@ -319,7 +314,7 @@ uint32_t helper_fcmp_un(uint32_t a, uint32_t b) + return r; + } + +-uint32_t helper_fcmp_lt(uint32_t a, uint32_t b) ++uint32_t helper_fcmp_lt(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fa, fb; + int r; +@@ -330,12 +325,12 @@ uint32_t helper_fcmp_lt(uint32_t a, uint32_t b) + fb.l = b; + r = float32_lt(fb.f, fa.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags & float_flag_invalid); ++ update_fpu_flags(env, flags & float_flag_invalid); + + return r; + } + +-uint32_t helper_fcmp_eq(uint32_t a, uint32_t b) ++uint32_t helper_fcmp_eq(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fa, fb; + int flags; +@@ -346,12 +341,12 @@ uint32_t helper_fcmp_eq(uint32_t a, uint32_t b) + fb.l = b; + r = float32_eq_quiet(fa.f, fb.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags & float_flag_invalid); ++ update_fpu_flags(env, flags & float_flag_invalid); + + return r; + } + +-uint32_t helper_fcmp_le(uint32_t a, uint32_t b) ++uint32_t helper_fcmp_le(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fa, fb; + int flags; +@@ -362,13 +357,13 @@ uint32_t helper_fcmp_le(uint32_t a, uint32_t b) + set_float_exception_flags(0, &env->fp_status); + r = float32_le(fa.f, fb.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags & float_flag_invalid); ++ update_fpu_flags(env, flags & float_flag_invalid); + + + return r; + } + +-uint32_t helper_fcmp_gt(uint32_t a, uint32_t b) ++uint32_t helper_fcmp_gt(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fa, fb; + int flags, r; +@@ -378,11 +373,11 @@ uint32_t helper_fcmp_gt(uint32_t a, uint32_t b) + set_float_exception_flags(0, &env->fp_status); + r = float32_lt(fa.f, fb.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags & float_flag_invalid); ++ update_fpu_flags(env, flags & float_flag_invalid); + return r; + } + +-uint32_t helper_fcmp_ne(uint32_t a, uint32_t b) ++uint32_t helper_fcmp_ne(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fa, fb; + int flags, r; +@@ -392,12 +387,12 @@ uint32_t helper_fcmp_ne(uint32_t a, uint32_t b) + set_float_exception_flags(0, &env->fp_status); + r = !float32_eq_quiet(fa.f, fb.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags & float_flag_invalid); ++ update_fpu_flags(env, flags & float_flag_invalid); + + return r; + } + +-uint32_t helper_fcmp_ge(uint32_t a, uint32_t b) ++uint32_t helper_fcmp_ge(CPUMBState *env, uint32_t a, uint32_t b) + { + CPU_FloatU fa, fb; + int flags, r; +@@ -407,12 +402,12 @@ uint32_t helper_fcmp_ge(uint32_t a, uint32_t b) + set_float_exception_flags(0, &env->fp_status); + r = !float32_lt(fa.f, fb.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags & float_flag_invalid); ++ update_fpu_flags(env, flags & float_flag_invalid); + + return r; + } + +-uint32_t helper_flt(uint32_t a) ++uint32_t helper_flt(CPUMBState *env, uint32_t a) + { + CPU_FloatU fd, fa; + +@@ -421,7 +416,7 @@ uint32_t helper_flt(uint32_t a) + return fd.l; + } + +-uint32_t helper_fint(uint32_t a) ++uint32_t helper_fint(CPUMBState *env, uint32_t a) + { + CPU_FloatU fa; + uint32_t r; +@@ -431,12 +426,12 @@ uint32_t helper_fint(uint32_t a) + fa.l = a; + r = float32_to_int32(fa.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags); ++ update_fpu_flags(env, flags); + + return r; + } + +-uint32_t helper_fsqrt(uint32_t a) ++uint32_t helper_fsqrt(CPUMBState *env, uint32_t a) + { + CPU_FloatU fd, fa; + int flags; +@@ -445,7 +440,7 @@ uint32_t helper_fsqrt(uint32_t a) + fa.l = a; + fd.l = float32_sqrt(fa.f, &env->fp_status); + flags = get_float_exception_flags(&env->fp_status); +- update_fpu_flags(flags); ++ update_fpu_flags(env, flags); + + return fd.l; + } +@@ -463,7 +458,8 @@ uint32_t helper_pcmpbf(uint32_t a, uint32_t b) + return 0; + } + +-void helper_memalign(uint32_t addr, uint32_t dr, uint32_t wr, uint32_t mask) ++void helper_memalign(CPUMBState *env, uint32_t addr, uint32_t dr, uint32_t wr, ++ uint32_t mask) + { + if (addr & mask) { + qemu_log_mask(CPU_LOG_INT, +@@ -478,45 +474,39 @@ void helper_memalign(uint32_t addr, uint32_t dr, uint32_t wr, uint32_t mask) + if (!(env->sregs[SR_MSR] & MSR_EE)) { + return; + } +- helper_raise_exception(EXCP_HW_EXCP); ++ helper_raise_exception(env, EXCP_HW_EXCP); + } + } + +-void helper_stackprot(uint32_t addr) ++void helper_stackprot(CPUMBState *env, uint32_t addr) + { + if (addr < env->slr || addr > env->shr) { + qemu_log("Stack protector violation at %x %x %x\n", + addr, env->slr, env->shr); + env->sregs[SR_EAR] = addr; + env->sregs[SR_ESR] = ESR_EC_STACKPROT; +- helper_raise_exception(EXCP_HW_EXCP); ++ helper_raise_exception(env, EXCP_HW_EXCP); + } + } + + #if !defined(CONFIG_USER_ONLY) + /* Writes/reads to the MMU's special regs end up here. */ +-uint32_t helper_mmu_read(uint32_t rn) ++uint32_t helper_mmu_read(CPUMBState *env, uint32_t rn) + { + return mmu_read(env, rn); + } + +-void helper_mmu_write(uint32_t rn, uint32_t v) ++void helper_mmu_write(CPUMBState *env, uint32_t rn, uint32_t v) + { + mmu_write(env, rn, v); + } + +-void cpu_unassigned_access(CPUMBState *env1, target_phys_addr_t addr, ++void cpu_unassigned_access(CPUMBState *env, target_phys_addr_t addr, + int is_write, int is_exec, int is_asi, int size) + { +- CPUMBState *saved_env; +- +- saved_env = env; +- env = env1; +- + qemu_log_mask(CPU_LOG_INT, "Unassigned " TARGET_FMT_plx " wr=%d exe=%d\n", + addr, is_write, is_exec); + if (!(env->sregs[SR_MSR] & MSR_EE)) { +- env = saved_env; + return; + } + +@@ -524,14 +514,13 @@ void cpu_unassigned_access(CPUMBState *env1, target_phys_addr_t addr, + if (is_exec) { + if ((env->pvr.regs[2] & PVR2_IOPB_BUS_EXC_MASK)) { + env->sregs[SR_ESR] = ESR_EC_INSN_BUS; +- helper_raise_exception(EXCP_HW_EXCP); ++ helper_raise_exception(env, EXCP_HW_EXCP); + } + } else { + if ((env->pvr.regs[2] & PVR2_DOPB_BUS_EXC_MASK)) { + env->sregs[SR_ESR] = ESR_EC_DATA_BUS; +- helper_raise_exception(EXCP_HW_EXCP); ++ helper_raise_exception(env, EXCP_HW_EXCP); + } + } +- env = saved_env; + } + #endif +diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c +index 7470149..9c7d77f 100644 +--- a/target-microblaze/translate.c ++++ b/target-microblaze/translate.c +@@ -126,7 +126,7 @@ static inline void t_gen_raise_exception(DisasContext *dc, uint32_t index) + + t_sync_flags(dc); + tcg_gen_movi_tl(cpu_SR[SR_PC], dc->pc); +- gen_helper_raise_exception(tmp); ++ gen_helper_raise_exception(cpu_env, tmp); + tcg_temp_free_i32(tmp); + dc->is_jmp = DISAS_UPDATE; + } +@@ -503,9 +503,9 @@ static void dec_msr(DisasContext *dc) + sr &= 7; + LOG_DIS("m%ss sr%d r%d imm=%x\n", to ? "t" : "f", sr, dc->ra, dc->imm); + if (to) +- gen_helper_mmu_write(tcg_const_tl(sr), cpu_R[dc->ra]); ++ gen_helper_mmu_write(cpu_env, tcg_const_tl(sr), cpu_R[dc->ra]); + else +- gen_helper_mmu_read(cpu_R[dc->rd], tcg_const_tl(sr)); ++ gen_helper_mmu_read(cpu_R[dc->rd], cpu_env, tcg_const_tl(sr)); + return; + } + #endif +@@ -704,9 +704,11 @@ static void dec_div(DisasContext *dc) + } + + if (u) +- gen_helper_divu(cpu_R[dc->rd], *(dec_alu_op_b(dc)), cpu_R[dc->ra]); ++ gen_helper_divu(cpu_R[dc->rd], cpu_env, *(dec_alu_op_b(dc)), ++ cpu_R[dc->ra]); + else +- gen_helper_divs(cpu_R[dc->rd], *(dec_alu_op_b(dc)), cpu_R[dc->ra]); ++ gen_helper_divs(cpu_R[dc->rd], cpu_env, *(dec_alu_op_b(dc)), ++ cpu_R[dc->ra]); + if (!dc->rd) + tcg_gen_movi_tl(cpu_R[dc->rd], 0); + } +@@ -912,7 +914,7 @@ static inline TCGv *compute_ldst_addr(DisasContext *dc, TCGv *t) + tcg_gen_add_tl(*t, cpu_R[dc->ra], cpu_R[dc->rb]); + + if (stackprot) { +- gen_helper_stackprot(*t); ++ gen_helper_stackprot(cpu_env, *t); + } + return t; + } +@@ -930,7 +932,7 @@ static inline TCGv *compute_ldst_addr(DisasContext *dc, TCGv *t) + } + + if (stackprot) { +- gen_helper_stackprot(*t); ++ gen_helper_stackprot(cpu_env, *t); + } + return t; + } +@@ -1056,7 +1058,7 @@ static void dec_load(DisasContext *dc) + gen_load(dc, v, *addr, size); + + tcg_gen_movi_tl(cpu_SR[SR_PC], dc->pc); +- gen_helper_memalign(*addr, tcg_const_tl(dc->rd), ++ gen_helper_memalign(cpu_env, *addr, tcg_const_tl(dc->rd), + tcg_const_tl(0), tcg_const_tl(size - 1)); + if (dc->rd) { + if (rev) { +@@ -1218,7 +1220,7 @@ static void dec_store(DisasContext *dc) + * the alignment checks in between the probe and the mem + * access. + */ +- gen_helper_memalign(*addr, tcg_const_tl(dc->rd), ++ gen_helper_memalign(cpu_env, *addr, tcg_const_tl(dc->rd), + tcg_const_tl(1), tcg_const_tl(size - 1)); + } + +@@ -1493,49 +1495,53 @@ static void dec_fpu(DisasContext *dc) + + switch (fpu_insn) { + case 0: +- gen_helper_fadd(cpu_R[dc->rd], cpu_R[dc->ra], cpu_R[dc->rb]); ++ gen_helper_fadd(cpu_R[dc->rd], cpu_env, cpu_R[dc->ra], ++ cpu_R[dc->rb]); + break; + + case 1: +- gen_helper_frsub(cpu_R[dc->rd], cpu_R[dc->ra], cpu_R[dc->rb]); ++ gen_helper_frsub(cpu_R[dc->rd], cpu_env, cpu_R[dc->ra], ++ cpu_R[dc->rb]); + break; + + case 2: +- gen_helper_fmul(cpu_R[dc->rd], cpu_R[dc->ra], cpu_R[dc->rb]); ++ gen_helper_fmul(cpu_R[dc->rd], cpu_env, cpu_R[dc->ra], ++ cpu_R[dc->rb]); + break; + + case 3: +- gen_helper_fdiv(cpu_R[dc->rd], cpu_R[dc->ra], cpu_R[dc->rb]); ++ gen_helper_fdiv(cpu_R[dc->rd], cpu_env, cpu_R[dc->ra], ++ cpu_R[dc->rb]); + break; + + case 4: + switch ((dc->ir >> 4) & 7) { + case 0: +- gen_helper_fcmp_un(cpu_R[dc->rd], ++ gen_helper_fcmp_un(cpu_R[dc->rd], cpu_env, + cpu_R[dc->ra], cpu_R[dc->rb]); + break; + case 1: +- gen_helper_fcmp_lt(cpu_R[dc->rd], ++ gen_helper_fcmp_lt(cpu_R[dc->rd], cpu_env, + cpu_R[dc->ra], cpu_R[dc->rb]); + break; + case 2: +- gen_helper_fcmp_eq(cpu_R[dc->rd], ++ gen_helper_fcmp_eq(cpu_R[dc->rd], cpu_env, + cpu_R[dc->ra], cpu_R[dc->rb]); + break; + case 3: +- gen_helper_fcmp_le(cpu_R[dc->rd], ++ gen_helper_fcmp_le(cpu_R[dc->rd], cpu_env, + cpu_R[dc->ra], cpu_R[dc->rb]); + break; + case 4: +- gen_helper_fcmp_gt(cpu_R[dc->rd], ++ gen_helper_fcmp_gt(cpu_R[dc->rd], cpu_env, + cpu_R[dc->ra], cpu_R[dc->rb]); + break; + case 5: +- gen_helper_fcmp_ne(cpu_R[dc->rd], ++ gen_helper_fcmp_ne(cpu_R[dc->rd], cpu_env, + cpu_R[dc->ra], cpu_R[dc->rb]); + break; + case 6: +- gen_helper_fcmp_ge(cpu_R[dc->rd], ++ gen_helper_fcmp_ge(cpu_R[dc->rd], cpu_env, + cpu_R[dc->ra], cpu_R[dc->rb]); + break; + default: +@@ -1552,21 +1558,21 @@ static void dec_fpu(DisasContext *dc) + if (!dec_check_fpuv2(dc)) { + return; + } +- gen_helper_flt(cpu_R[dc->rd], cpu_R[dc->ra]); ++ gen_helper_flt(cpu_R[dc->rd], cpu_env, cpu_R[dc->ra]); + break; + + case 6: + if (!dec_check_fpuv2(dc)) { + return; + } +- gen_helper_fint(cpu_R[dc->rd], cpu_R[dc->ra]); ++ gen_helper_fint(cpu_R[dc->rd], cpu_env, cpu_R[dc->ra]); + break; + + case 7: + if (!dec_check_fpuv2(dc)) { + return; + } +- gen_helper_fsqrt(cpu_R[dc->rd], cpu_R[dc->ra]); ++ gen_helper_fsqrt(cpu_R[dc->rd], cpu_env, cpu_R[dc->ra]); + break; + + default: +@@ -1654,15 +1660,14 @@ static struct decoder_info { + {{0, 0}, dec_null} + }; + +-static inline void decode(DisasContext *dc) ++static inline void decode(DisasContext *dc, uint32_t ir) + { +- uint32_t ir; + int i; + + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP))) + tcg_gen_debug_insn_start(dc->pc); + +- dc->ir = ir = ldl_code(dc->pc); ++ dc->ir = ir; + LOG_DIS("%8.8x\t", dc->ir); + + if (dc->ir) +@@ -1796,7 +1801,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb, + gen_io_start(); + + dc->clear_imm = 1; +- decode(dc); ++ decode(dc, cpu_ldl_code(env, dc->pc)); + if (dc->clear_imm) + dc->tb_flags &= ~IMM_FLAG; + dc->pc += 4; +@@ -1871,7 +1876,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb, + if (dc->is_jmp != DISAS_JUMP) { + tcg_gen_movi_tl(cpu_SR[SR_PC], npc); + } +- gen_helper_raise_exception(tmp); ++ gen_helper_raise_exception(cpu_env, tmp); + tcg_temp_free_i32(tmp); + } else { + switch(dc->is_jmp) { +-- +1.7.12.1 + diff --git a/0035-target-cris-Avoid-AREG0-for-helpers.patch b/0035-target-cris-Avoid-AREG0-for-helpers.patch new file mode 100644 index 0000000..9314afb --- /dev/null +++ b/0035-target-cris-Avoid-AREG0-for-helpers.patch @@ -0,0 +1,523 @@ +From 1e3916b0cbfd39cb3fc8996423d5574068583145 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Thu, 30 Aug 2012 16:56:39 +0200 +Subject: [PATCH] target-cris: Avoid AREG0 for helpers + +Add an explicit CPUCRISState parameter instead of relying on AREG0. + +Signed-off-by: Blue Swirl +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + target-cris/helper.h | 37 +++++++++++---------- + target-cris/op_helper.c | 80 ++++++++++++++++++++++++--------------------- + target-cris/translate.c | 44 +++++++++++++------------ + target-cris/translate_v10.c | 4 +-- + 4 files changed, 88 insertions(+), 77 deletions(-) + +diff --git a/target-cris/helper.h b/target-cris/helper.h +index 093063a..99fb326 100644 +--- a/target-cris/helper.h ++++ b/target-cris/helper.h +@@ -1,26 +1,29 @@ + #include "def-helper.h" + +-DEF_HELPER_1(raise_exception, void, i32) +-DEF_HELPER_1(tlb_flush_pid, void, i32) +-DEF_HELPER_1(spc_write, void, i32) ++DEF_HELPER_2(raise_exception, void, env, i32) ++DEF_HELPER_2(tlb_flush_pid, void, env, i32) ++DEF_HELPER_2(spc_write, void, env, i32) + DEF_HELPER_3(dump, void, i32, i32, i32) +-DEF_HELPER_0(rfe, void); +-DEF_HELPER_0(rfn, void); ++DEF_HELPER_1(rfe, void, env); ++DEF_HELPER_1(rfn, void, env); + +-DEF_HELPER_2(movl_sreg_reg, void, i32, i32) +-DEF_HELPER_2(movl_reg_sreg, void, i32, i32) ++DEF_HELPER_3(movl_sreg_reg, void, env, i32, i32) ++DEF_HELPER_3(movl_reg_sreg, void, env, i32, i32) + + DEF_HELPER_FLAGS_1(lz, TCG_CALL_PURE, i32, i32); +-DEF_HELPER_FLAGS_3(btst, TCG_CALL_PURE, i32, i32, i32, i32); ++DEF_HELPER_FLAGS_4(btst, TCG_CALL_PURE, i32, env, i32, i32, i32); + +-DEF_HELPER_FLAGS_3(evaluate_flags_muls, TCG_CALL_PURE, i32, i32, i32, i32) +-DEF_HELPER_FLAGS_3(evaluate_flags_mulu, TCG_CALL_PURE, i32, i32, i32, i32) +-DEF_HELPER_FLAGS_4(evaluate_flags_mcp, TCG_CALL_PURE, i32, i32, i32, i32, i32) +-DEF_HELPER_FLAGS_4(evaluate_flags_alu_4, TCG_CALL_PURE, i32, i32, i32, i32, i32) +-DEF_HELPER_FLAGS_4(evaluate_flags_sub_4, TCG_CALL_PURE, i32, i32, i32, i32, i32) +-DEF_HELPER_FLAGS_2(evaluate_flags_move_4, TCG_CALL_PURE, i32, i32, i32) +-DEF_HELPER_FLAGS_2(evaluate_flags_move_2, TCG_CALL_PURE, i32, i32, i32) +-DEF_HELPER_0(evaluate_flags, void) +-DEF_HELPER_0(top_evaluate_flags, void) ++DEF_HELPER_FLAGS_4(evaluate_flags_muls, TCG_CALL_PURE, i32, env, i32, i32, i32) ++DEF_HELPER_FLAGS_4(evaluate_flags_mulu, TCG_CALL_PURE, i32, env, i32, i32, i32) ++DEF_HELPER_FLAGS_5(evaluate_flags_mcp, TCG_CALL_PURE, i32, env, ++ i32, i32, i32, i32) ++DEF_HELPER_FLAGS_5(evaluate_flags_alu_4, TCG_CALL_PURE, i32, env, ++ i32, i32, i32, i32) ++DEF_HELPER_FLAGS_5(evaluate_flags_sub_4, TCG_CALL_PURE, i32, env, ++ i32, i32, i32, i32) ++DEF_HELPER_FLAGS_3(evaluate_flags_move_4, TCG_CALL_PURE, i32, env, i32, i32) ++DEF_HELPER_FLAGS_3(evaluate_flags_move_2, TCG_CALL_PURE, i32, env, i32, i32) ++DEF_HELPER_1(evaluate_flags, void, env) ++DEF_HELPER_1(top_evaluate_flags, void, env) + + #include "def-helper.h" +diff --git a/target-cris/op_helper.c b/target-cris/op_helper.c +index ac7c98c..5ca85a0 100644 +--- a/target-cris/op_helper.c ++++ b/target-cris/op_helper.c +@@ -79,7 +79,7 @@ void tlb_fill(CPUCRISState *env1, target_ulong addr, int is_write, int mmu_idx, + cpu_restore_state(tb, env, retaddr); + + /* Evaluate flags after retranslation. */ +- helper_top_evaluate_flags(); ++ helper_top_evaluate_flags(env); + } + } + cpu_loop_exit(env); +@@ -89,13 +89,13 @@ void tlb_fill(CPUCRISState *env1, target_ulong addr, int is_write, int mmu_idx, + + #endif + +-void helper_raise_exception(uint32_t index) ++void helper_raise_exception(CPUCRISState *env, uint32_t index) + { + env->exception_index = index; + cpu_loop_exit(env); + } + +-void helper_tlb_flush_pid(uint32_t pid) ++void helper_tlb_flush_pid(CPUCRISState *env, uint32_t pid) + { + #if !defined(CONFIG_USER_ONLY) + pid &= 0xff; +@@ -104,7 +104,7 @@ void helper_tlb_flush_pid(uint32_t pid) + #endif + } + +-void helper_spc_write(uint32_t new_spc) ++void helper_spc_write(CPUCRISState *env, uint32_t new_spc) + { + #if !defined(CONFIG_USER_ONLY) + tlb_flush_page(env, env->pregs[PR_SPC]); +@@ -121,7 +121,7 @@ void helper_dump(uint32_t a0, uint32_t a1, uint32_t a2) + #define EXTRACT_FIELD(src, start, end) \ + (((src) >> start) & ((1 << (end - start + 1)) - 1)) + +-void helper_movl_sreg_reg (uint32_t sreg, uint32_t reg) ++void helper_movl_sreg_reg(CPUCRISState *env, uint32_t sreg, uint32_t reg) + { + uint32_t srs; + srs = env->pregs[PR_SRS]; +@@ -171,7 +171,7 @@ void helper_movl_sreg_reg (uint32_t sreg, uint32_t reg) + #endif + } + +-void helper_movl_reg_sreg (uint32_t reg, uint32_t sreg) ++void helper_movl_reg_sreg(CPUCRISState *env, uint32_t reg, uint32_t sreg) + { + uint32_t srs; + env->pregs[PR_SRS] &= 3; +@@ -216,7 +216,7 @@ static void cris_ccs_rshift(CPUCRISState *env) + env->pregs[PR_CCS] = ccs; + } + +-void helper_rfe(void) ++void helper_rfe(CPUCRISState *env) + { + int rflag = env->pregs[PR_CCS] & R_FLAG; + +@@ -232,7 +232,7 @@ void helper_rfe(void) + env->pregs[PR_CCS] |= P_FLAG; + } + +-void helper_rfn(void) ++void helper_rfn(CPUCRISState *env) + { + int rflag = env->pregs[PR_CCS] & R_FLAG; + +@@ -256,7 +256,7 @@ uint32_t helper_lz(uint32_t t0) + return clz32(t0); + } + +-uint32_t helper_btst(uint32_t t0, uint32_t t1, uint32_t ccs) ++uint32_t helper_btst(CPUCRISState *env, uint32_t t0, uint32_t t1, uint32_t ccs) + { + /* FIXME: clean this up. */ + +@@ -284,7 +284,8 @@ uint32_t helper_btst(uint32_t t0, uint32_t t1, uint32_t ccs) + return ccs; + } + +-static inline uint32_t evaluate_flags_writeback(uint32_t flags, uint32_t ccs) ++static inline uint32_t evaluate_flags_writeback(CPUCRISState *env, ++ uint32_t flags, uint32_t ccs) + { + unsigned int x, z, mask; + +@@ -303,7 +304,8 @@ static inline uint32_t evaluate_flags_writeback(uint32_t flags, uint32_t ccs) + return ccs; + } + +-uint32_t helper_evaluate_flags_muls(uint32_t ccs, uint32_t res, uint32_t mof) ++uint32_t helper_evaluate_flags_muls(CPUCRISState *env, ++ uint32_t ccs, uint32_t res, uint32_t mof) + { + uint32_t flags = 0; + int64_t tmp; +@@ -321,10 +323,11 @@ uint32_t helper_evaluate_flags_muls(uint32_t ccs, uint32_t res, uint32_t mof) + if ((dneg && mof != -1) + || (!dneg && mof != 0)) + flags |= V_FLAG; +- return evaluate_flags_writeback(flags, ccs); ++ return evaluate_flags_writeback(env, flags, ccs); + } + +-uint32_t helper_evaluate_flags_mulu(uint32_t ccs, uint32_t res, uint32_t mof) ++uint32_t helper_evaluate_flags_mulu(CPUCRISState *env, ++ uint32_t ccs, uint32_t res, uint32_t mof) + { + uint32_t flags = 0; + uint64_t tmp; +@@ -339,10 +342,10 @@ uint32_t helper_evaluate_flags_mulu(uint32_t ccs, uint32_t res, uint32_t mof) + if (mof) + flags |= V_FLAG; + +- return evaluate_flags_writeback(flags, ccs); ++ return evaluate_flags_writeback(env, flags, ccs); + } + +-uint32_t helper_evaluate_flags_mcp(uint32_t ccs, ++uint32_t helper_evaluate_flags_mcp(CPUCRISState *env, uint32_t ccs, + uint32_t src, uint32_t dst, uint32_t res) + { + uint32_t flags = 0; +@@ -368,10 +371,10 @@ uint32_t helper_evaluate_flags_mcp(uint32_t ccs, + flags |= R_FLAG; + } + +- return evaluate_flags_writeback(flags, ccs); ++ return evaluate_flags_writeback(env, flags, ccs); + } + +-uint32_t helper_evaluate_flags_alu_4(uint32_t ccs, ++uint32_t helper_evaluate_flags_alu_4(CPUCRISState *env, uint32_t ccs, + uint32_t src, uint32_t dst, uint32_t res) + { + uint32_t flags = 0; +@@ -397,10 +400,10 @@ uint32_t helper_evaluate_flags_alu_4(uint32_t ccs, + flags |= C_FLAG; + } + +- return evaluate_flags_writeback(flags, ccs); ++ return evaluate_flags_writeback(env, flags, ccs); + } + +-uint32_t helper_evaluate_flags_sub_4(uint32_t ccs, ++uint32_t helper_evaluate_flags_sub_4(CPUCRISState *env, uint32_t ccs, + uint32_t src, uint32_t dst, uint32_t res) + { + uint32_t flags = 0; +@@ -427,10 +430,11 @@ uint32_t helper_evaluate_flags_sub_4(uint32_t ccs, + } + + flags ^= C_FLAG; +- return evaluate_flags_writeback(flags, ccs); ++ return evaluate_flags_writeback(env, flags, ccs); + } + +-uint32_t helper_evaluate_flags_move_4(uint32_t ccs, uint32_t res) ++uint32_t helper_evaluate_flags_move_4(CPUCRISState *env, ++ uint32_t ccs, uint32_t res) + { + uint32_t flags = 0; + +@@ -439,9 +443,10 @@ uint32_t helper_evaluate_flags_move_4(uint32_t ccs, uint32_t res) + else if (res == 0L) + flags |= Z_FLAG; + +- return evaluate_flags_writeback(flags, ccs); ++ return evaluate_flags_writeback(env, flags, ccs); + } +-uint32_t helper_evaluate_flags_move_2(uint32_t ccs, uint32_t res) ++uint32_t helper_evaluate_flags_move_2(CPUCRISState *env, ++ uint32_t ccs, uint32_t res) + { + uint32_t flags = 0; + +@@ -450,12 +455,12 @@ uint32_t helper_evaluate_flags_move_2(uint32_t ccs, uint32_t res) + else if (res == 0) + flags |= Z_FLAG; + +- return evaluate_flags_writeback(flags, ccs); ++ return evaluate_flags_writeback(env, flags, ccs); + } + + /* TODO: This is expensive. We could split things up and only evaluate part of + CCR on a need to know basis. For now, we simply re-evaluate everything. */ +-void helper_evaluate_flags(void) ++void helper_evaluate_flags(CPUCRISState *env) + { + uint32_t src, dst, res; + uint32_t flags = 0; +@@ -571,25 +576,26 @@ void helper_evaluate_flags(void) + if (env->cc_op == CC_OP_SUB || env->cc_op == CC_OP_CMP) + flags ^= C_FLAG; + +- env->pregs[PR_CCS] = evaluate_flags_writeback(flags, env->pregs[PR_CCS]); ++ env->pregs[PR_CCS] = evaluate_flags_writeback(env, flags, ++ env->pregs[PR_CCS]); + } + +-void helper_top_evaluate_flags(void) ++void helper_top_evaluate_flags(CPUCRISState *env) + { + switch (env->cc_op) + { + case CC_OP_MCP: +- env->pregs[PR_CCS] = helper_evaluate_flags_mcp( ++ env->pregs[PR_CCS] = helper_evaluate_flags_mcp(env, + env->pregs[PR_CCS], env->cc_src, + env->cc_dest, env->cc_result); + break; + case CC_OP_MULS: +- env->pregs[PR_CCS] = helper_evaluate_flags_muls( ++ env->pregs[PR_CCS] = helper_evaluate_flags_muls(env, + env->pregs[PR_CCS], env->cc_result, + env->pregs[PR_MOF]); + break; + case CC_OP_MULU: +- env->pregs[PR_CCS] = helper_evaluate_flags_mulu( ++ env->pregs[PR_CCS] = helper_evaluate_flags_mulu(env, + env->pregs[PR_CCS], env->cc_result, + env->pregs[PR_MOF]); + break; +@@ -604,18 +610,18 @@ void helper_top_evaluate_flags(void) + { + case 4: + env->pregs[PR_CCS] = +- helper_evaluate_flags_move_4( ++ helper_evaluate_flags_move_4(env, + env->pregs[PR_CCS], + env->cc_result); + break; + case 2: + env->pregs[PR_CCS] = +- helper_evaluate_flags_move_2( ++ helper_evaluate_flags_move_2(env, + env->pregs[PR_CCS], + env->cc_result); + break; + default: +- helper_evaluate_flags(); ++ helper_evaluate_flags(env); + break; + } + break; +@@ -626,12 +632,12 @@ void helper_top_evaluate_flags(void) + case CC_OP_CMP: + if (env->cc_size == 4) + env->pregs[PR_CCS] = +- helper_evaluate_flags_sub_4( ++ helper_evaluate_flags_sub_4(env, + env->pregs[PR_CCS], + env->cc_src, env->cc_dest, + env->cc_result); + else +- helper_evaluate_flags(); ++ helper_evaluate_flags(env); + break; + default: + { +@@ -639,13 +645,13 @@ void helper_top_evaluate_flags(void) + { + case 4: + env->pregs[PR_CCS] = +- helper_evaluate_flags_alu_4( ++ helper_evaluate_flags_alu_4(env, + env->pregs[PR_CCS], + env->cc_src, env->cc_dest, + env->cc_result); + break; + default: +- helper_evaluate_flags(); ++ helper_evaluate_flags(env); + break; + } + } +diff --git a/target-cris/translate.c b/target-cris/translate.c +index ad31877..283dd98 100644 +--- a/target-cris/translate.c ++++ b/target-cris/translate.c +@@ -211,9 +211,9 @@ static inline void t_gen_mov_preg_TN(DisasContext *dc, int r, TCGv tn) + tcg_gen_andi_tl(cpu_PR[r], tn, 3); + else { + if (r == PR_PID) +- gen_helper_tlb_flush_pid(tn); ++ gen_helper_tlb_flush_pid(cpu_env, tn); + if (dc->tb_flags & S_FLAG && r == PR_SPC) +- gen_helper_spc_write(tn); ++ gen_helper_spc_write(cpu_env, tn); + else if (r == PR_CCS) + dc->cpustate_changed = 1; + tcg_gen_mov_tl(cpu_PR[r], tn); +@@ -278,7 +278,7 @@ static void cris_lock_irq(DisasContext *dc) + static inline void t_gen_raise_exception(uint32_t index) + { + TCGv_i32 tmp = tcg_const_i32(index); +- gen_helper_raise_exception(tmp); ++ gen_helper_raise_exception(cpu_env, tmp); + tcg_temp_free_i32(tmp); + } + +@@ -624,17 +624,17 @@ static void cris_evaluate_flags(DisasContext *dc) + switch (dc->cc_op) + { + case CC_OP_MCP: +- gen_helper_evaluate_flags_mcp(cpu_PR[PR_CCS], ++ gen_helper_evaluate_flags_mcp(cpu_PR[PR_CCS], cpu_env, + cpu_PR[PR_CCS], cc_src, + cc_dest, cc_result); + break; + case CC_OP_MULS: +- gen_helper_evaluate_flags_muls(cpu_PR[PR_CCS], ++ gen_helper_evaluate_flags_muls(cpu_PR[PR_CCS], cpu_env, + cpu_PR[PR_CCS], cc_result, + cpu_PR[PR_MOF]); + break; + case CC_OP_MULU: +- gen_helper_evaluate_flags_mulu(cpu_PR[PR_CCS], ++ gen_helper_evaluate_flags_mulu(cpu_PR[PR_CCS], cpu_env, + cpu_PR[PR_CCS], cc_result, + cpu_PR[PR_MOF]); + break; +@@ -648,15 +648,15 @@ static void cris_evaluate_flags(DisasContext *dc) + switch (dc->cc_size) + { + case 4: +- gen_helper_evaluate_flags_move_4(cpu_PR[PR_CCS], +- cpu_PR[PR_CCS], cc_result); ++ gen_helper_evaluate_flags_move_4(cpu_PR[PR_CCS], ++ cpu_env, cpu_PR[PR_CCS], cc_result); + break; + case 2: +- gen_helper_evaluate_flags_move_2(cpu_PR[PR_CCS], +- cpu_PR[PR_CCS], cc_result); ++ gen_helper_evaluate_flags_move_2(cpu_PR[PR_CCS], ++ cpu_env, cpu_PR[PR_CCS], cc_result); + break; + default: +- gen_helper_evaluate_flags(); ++ gen_helper_evaluate_flags(cpu_env); + break; + } + break; +@@ -666,21 +666,21 @@ static void cris_evaluate_flags(DisasContext *dc) + case CC_OP_SUB: + case CC_OP_CMP: + if (dc->cc_size == 4) +- gen_helper_evaluate_flags_sub_4(cpu_PR[PR_CCS], ++ gen_helper_evaluate_flags_sub_4(cpu_PR[PR_CCS], cpu_env, + cpu_PR[PR_CCS], cc_src, cc_dest, cc_result); + else +- gen_helper_evaluate_flags(); ++ gen_helper_evaluate_flags(cpu_env); + + break; + default: + switch (dc->cc_size) + { + case 4: +- gen_helper_evaluate_flags_alu_4(cpu_PR[PR_CCS], ++ gen_helper_evaluate_flags_alu_4(cpu_PR[PR_CCS], cpu_env, + cpu_PR[PR_CCS], cc_src, cc_dest, cc_result); + break; + default: +- gen_helper_evaluate_flags(); ++ gen_helper_evaluate_flags(cpu_env); + break; + } + break; +@@ -1475,7 +1475,7 @@ static int dec_btstq(DisasContext *dc) + + cris_cc_mask(dc, CC_MASK_NZ); + cris_evaluate_flags(dc); +- gen_helper_btst(cpu_PR[PR_CCS], cpu_R[dc->op2], ++ gen_helper_btst(cpu_PR[PR_CCS], cpu_env, cpu_R[dc->op2], + tcg_const_tl(dc->op1), cpu_PR[PR_CCS]); + cris_alu(dc, CC_OP_MOVE, + cpu_R[dc->op2], cpu_R[dc->op2], cpu_R[dc->op2], 4); +@@ -1925,7 +1925,7 @@ static int dec_btst_r(DisasContext *dc) + dc->op1, dc->op2); + cris_cc_mask(dc, CC_MASK_NZ); + cris_evaluate_flags(dc); +- gen_helper_btst(cpu_PR[PR_CCS], cpu_R[dc->op2], ++ gen_helper_btst(cpu_PR[PR_CCS], cpu_env, cpu_R[dc->op2], + cpu_R[dc->op1], cpu_PR[PR_CCS]); + cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op2], + cpu_R[dc->op2], cpu_R[dc->op2], 4); +@@ -2135,14 +2135,16 @@ static int dec_move_rs(DisasContext *dc) + { + LOG_DIS("move $r%u, $s%u\n", dc->op1, dc->op2); + cris_cc_mask(dc, 0); +- gen_helper_movl_sreg_reg(tcg_const_tl(dc->op2), tcg_const_tl(dc->op1)); ++ gen_helper_movl_sreg_reg(cpu_env, tcg_const_tl(dc->op2), ++ tcg_const_tl(dc->op1)); + return 2; + } + static int dec_move_sr(DisasContext *dc) + { + LOG_DIS("move $s%u, $r%u\n", dc->op2, dc->op1); + cris_cc_mask(dc, 0); +- gen_helper_movl_reg_sreg(tcg_const_tl(dc->op1), tcg_const_tl(dc->op2)); ++ gen_helper_movl_reg_sreg(cpu_env, tcg_const_tl(dc->op1), ++ tcg_const_tl(dc->op2)); + return 2; + } + +@@ -2906,14 +2908,14 @@ static int dec_rfe_etc(DisasContext *dc) + /* rfe. */ + LOG_DIS("rfe\n"); + cris_evaluate_flags(dc); +- gen_helper_rfe(); ++ gen_helper_rfe(cpu_env); + dc->is_jmp = DISAS_UPDATE; + break; + case 5: + /* rfn. */ + LOG_DIS("rfn\n"); + cris_evaluate_flags(dc); +- gen_helper_rfn(); ++ gen_helper_rfn(cpu_env); + dc->is_jmp = DISAS_UPDATE; + break; + case 6: +diff --git a/target-cris/translate_v10.c b/target-cris/translate_v10.c +index 3629629..9a39c6a 100644 +--- a/target-cris/translate_v10.c ++++ b/target-cris/translate_v10.c +@@ -289,7 +289,7 @@ static unsigned int dec10_quick_imm(DisasContext *dc) + } else { + /* BTST */ + cris_update_cc_op(dc, CC_OP_FLAGS, 4); +- gen_helper_btst(cpu_PR[PR_CCS], cpu_R[dc->dst], ++ gen_helper_btst(cpu_PR[PR_CCS], cpu_env, cpu_R[dc->dst], + tcg_const_tl(imm), cpu_PR[PR_CCS]); + } + break; +@@ -723,7 +723,7 @@ static unsigned int dec10_reg(DisasContext *dc) + LOG_DIS("btst $r%d, $r%d sz=%d\n", dc->src, dc->dst, size); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_update_cc_op(dc, CC_OP_FLAGS, 4); +- gen_helper_btst(cpu_PR[PR_CCS], cpu_R[dc->dst], ++ gen_helper_btst(cpu_PR[PR_CCS], cpu_env, cpu_R[dc->dst], + cpu_R[dc->src], cpu_PR[PR_CCS]); + break; + case CRISV10_REG_DSTEP: +-- +1.7.12.1 + diff --git a/0036-target-cris-Switch-to-AREG0-free-mode.patch b/0036-target-cris-Switch-to-AREG0-free-mode.patch new file mode 100644 index 0000000..1464e22 --- /dev/null +++ b/0036-target-cris-Switch-to-AREG0-free-mode.patch @@ -0,0 +1,1538 @@ +From 327937b3765d53776e42ffd3990e0b551c98b0e6 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 7 Sep 2012 16:13:27 +0200 +Subject: [PATCH] target-cris: Switch to AREG0 free mode + +Add an explicit CPUCRISState parameter instead of relying on AREG0, and +use cpu_ld* in translation and interrupt handling. Remove AREG0 swapping +in tlb_fill(). Switch to AREG0 free mode + +Signed-off-by: Blue Swirl +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-cris/Makefile.objs | 2 - + target-cris/helper.c | 4 +- + target-cris/op_helper.c | 9 +- + target-cris/translate.c | 256 ++++++++++++++++++++++---------------------- + target-cris/translate_v10.c | 95 ++++++++-------- + 6 files changed, 181 insertions(+), 187 deletions(-) + +diff --git a/configure b/configure +index 0b4ef4a..2a12022 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | arm* | i386 | lm32 | m68k | microblaze* | or32 | s390x | sparc* | unicore32 | x86_64 | xtensa* | ppc*) ++ alpha | arm* | cris | i386 | lm32 | m68k | microblaze* | or32 | s390x | sparc* | unicore32 | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-cris/Makefile.objs b/target-cris/Makefile.objs +index 4b09e8c..afb87bc 100644 +--- a/target-cris/Makefile.objs ++++ b/target-cris/Makefile.objs +@@ -1,4 +1,2 @@ + obj-y += translate.o op_helper.o helper.o cpu.o + obj-$(CONFIG_SOFTMMU) += mmu.o machine.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-cris/helper.c b/target-cris/helper.c +index bfbc29e..1bdb7e2 100644 +--- a/target-cris/helper.c ++++ b/target-cris/helper.c +@@ -151,7 +151,7 @@ static void do_interruptv10(CPUCRISState *env) + } + + /* Now that we are in kernel mode, load the handlers address. */ +- env->pc = ldl_code(env->pregs[PR_EBP] + ex_vec * 4); ++ env->pc = cpu_ldl_code(env, env->pregs[PR_EBP] + ex_vec * 4); + env->locked_irq = 1; + env->pregs[PR_CCS] |= F_FLAG_V10; /* set F. */ + +@@ -233,7 +233,7 @@ void do_interrupt(CPUCRISState *env) + /* Now that we are in kernel mode, load the handlers address. + This load may not fault, real hw leaves that behaviour as + undefined. */ +- env->pc = ldl_code(env->pregs[PR_EBP] + ex_vec * 4); ++ env->pc = cpu_ldl_code(env, env->pregs[PR_EBP] + ex_vec * 4); + + /* Clear the excption_index to avoid spurios hw_aborts for recursive + bus faults. */ +diff --git a/target-cris/op_helper.c b/target-cris/op_helper.c +index 5ca85a0..a7468d4 100644 +--- a/target-cris/op_helper.c ++++ b/target-cris/op_helper.c +@@ -19,7 +19,6 @@ + */ + + #include "cpu.h" +-#include "dyngen-exec.h" + #include "mmu.h" + #include "helper.h" + #include "host-utils.h" +@@ -55,17 +54,12 @@ + /* Try to fill the TLB and return an exception if error. If retaddr is + NULL, it means that the function was called in C code (i.e. not + from generated code or from helper.c) */ +-/* XXX: fix it to restore all registers */ +-void tlb_fill(CPUCRISState *env1, target_ulong addr, int is_write, int mmu_idx, ++void tlb_fill(CPUCRISState *env, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) + { + TranslationBlock *tb; +- CPUCRISState *saved_env; + int ret; + +- saved_env = env; +- env = env1; +- + D_LOG("%s pc=%x tpc=%x ra=%p\n", __func__, + env->pc, env->debug1, (void *)retaddr); + ret = cpu_cris_handle_mmu_fault(env, addr, is_write, mmu_idx); +@@ -84,7 +78,6 @@ void tlb_fill(CPUCRISState *env1, target_ulong addr, int is_write, int mmu_idx, + } + cpu_loop_exit(env); + } +- env = saved_env; + } + + #endif +diff --git a/target-cris/translate.c b/target-cris/translate.c +index 283dd98..19144b5 100644 +--- a/target-cris/translate.c ++++ b/target-cris/translate.c +@@ -78,7 +78,7 @@ typedef struct DisasContext { + target_ulong pc, ppc; + + /* Decoder. */ +- unsigned int (*decoder)(struct DisasContext *dc); ++ unsigned int (*decoder)(CPUCRISState *env, struct DisasContext *dc); + uint32_t ir; + uint32_t opcode; + unsigned int op1; +@@ -233,7 +233,7 @@ static int sign_extend(unsigned int val, unsigned int width) + return sval; + } + +-static int cris_fetch(DisasContext *dc, uint32_t addr, ++static int cris_fetch(CPUCRISState *env, DisasContext *dc, uint32_t addr, + unsigned int size, unsigned int sign) + { + int r; +@@ -241,24 +241,24 @@ static int cris_fetch(DisasContext *dc, uint32_t addr, + switch (size) { + case 4: + { +- r = ldl_code(addr); ++ r = cpu_ldl_code(env, addr); + break; + } + case 2: + { + if (sign) { +- r = ldsw_code(addr); ++ r = cpu_ldsw_code(env, addr); + } else { +- r = lduw_code(addr); ++ r = cpu_lduw_code(env, addr); + } + break; + } + case 1: + { + if (sign) { +- r = ldsb_code(addr); ++ r = cpu_ldsb_code(env, addr); + } else { +- r = ldub_code(addr); ++ r = cpu_ldub_code(env, addr); + } + break; + } +@@ -1304,8 +1304,8 @@ static void dec_prep_alu_r(DisasContext *dc, int rs, int rd, + t_gen_zext(dst, cpu_R[rd], size); + } + +-static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize, +- TCGv dst) ++static int dec_prep_move_m(CPUCRISState *env, DisasContext *dc, ++ int s_ext, int memsize, TCGv dst) + { + unsigned int rs; + uint32_t imm; +@@ -1321,7 +1321,7 @@ static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize, + if (memsize == 1) + insn_len++; + +- imm = cris_fetch(dc, dc->pc + 2, memsize, s_ext); ++ imm = cris_fetch(env, dc, dc->pc + 2, memsize, s_ext); + tcg_gen_movi_tl(dst, imm); + dc->postinc = 0; + } else { +@@ -1338,12 +1338,12 @@ static int dec_prep_move_m(DisasContext *dc, int s_ext, int memsize, + /* Prepare T0 and T1 for a memory + alu operation. + s_ext decides if the operand1 should be sign-extended or zero-extended when + needed. */ +-static int dec_prep_alu_m(DisasContext *dc, int s_ext, int memsize, +- TCGv dst, TCGv src) ++static int dec_prep_alu_m(CPUCRISState *env, DisasContext *dc, ++ int s_ext, int memsize, TCGv dst, TCGv src) + { + int insn_len; + +- insn_len = dec_prep_move_m(dc, s_ext, memsize, src); ++ insn_len = dec_prep_move_m(env, dc, s_ext, memsize, src); + tcg_gen_mov_tl(dst, cpu_R[dc->op2]); + return insn_len; + } +@@ -1362,7 +1362,7 @@ static const char *cc_name(int cc) + + /* Start of insn decoders. */ + +-static int dec_bccq(DisasContext *dc) ++static int dec_bccq(CPUCRISState *env, DisasContext *dc) + { + int32_t offset; + int sign; +@@ -1382,7 +1382,7 @@ static int dec_bccq(DisasContext *dc) + cris_prepare_cc_branch (dc, offset, cond); + return 2; + } +-static int dec_addoq(DisasContext *dc) ++static int dec_addoq(CPUCRISState *env, DisasContext *dc) + { + int32_t imm; + +@@ -1396,7 +1396,7 @@ static int dec_addoq(DisasContext *dc) + + return 2; + } +-static int dec_addq(DisasContext *dc) ++static int dec_addq(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("addq %u, $r%u\n", dc->op1, dc->op2); + +@@ -1408,7 +1408,7 @@ static int dec_addq(DisasContext *dc) + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(dc->op1), 4); + return 2; + } +-static int dec_moveq(DisasContext *dc) ++static int dec_moveq(CPUCRISState *env, DisasContext *dc) + { + uint32_t imm; + +@@ -1419,7 +1419,7 @@ static int dec_moveq(DisasContext *dc) + tcg_gen_movi_tl(cpu_R[dc->op2], imm); + return 2; + } +-static int dec_subq(DisasContext *dc) ++static int dec_subq(CPUCRISState *env, DisasContext *dc) + { + dc->op1 = EXTRACT_FIELD(dc->ir, 0, 5); + +@@ -1430,7 +1430,7 @@ static int dec_subq(DisasContext *dc) + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(dc->op1), 4); + return 2; + } +-static int dec_cmpq(DisasContext *dc) ++static int dec_cmpq(CPUCRISState *env, DisasContext *dc) + { + uint32_t imm; + dc->op1 = EXTRACT_FIELD(dc->ir, 0, 5); +@@ -1443,7 +1443,7 @@ static int dec_cmpq(DisasContext *dc) + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(imm), 4); + return 2; + } +-static int dec_andq(DisasContext *dc) ++static int dec_andq(CPUCRISState *env, DisasContext *dc) + { + uint32_t imm; + dc->op1 = EXTRACT_FIELD(dc->ir, 0, 5); +@@ -1456,7 +1456,7 @@ static int dec_andq(DisasContext *dc) + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(imm), 4); + return 2; + } +-static int dec_orq(DisasContext *dc) ++static int dec_orq(CPUCRISState *env, DisasContext *dc) + { + uint32_t imm; + dc->op1 = EXTRACT_FIELD(dc->ir, 0, 5); +@@ -1468,7 +1468,7 @@ static int dec_orq(DisasContext *dc) + cpu_R[dc->op2], cpu_R[dc->op2], tcg_const_tl(imm), 4); + return 2; + } +-static int dec_btstq(DisasContext *dc) ++static int dec_btstq(CPUCRISState *env, DisasContext *dc) + { + dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4); + LOG_DIS("btstq %u, $r%d\n", dc->op1, dc->op2); +@@ -1483,7 +1483,7 @@ static int dec_btstq(DisasContext *dc) + dc->flags_uptodate = 1; + return 2; + } +-static int dec_asrq(DisasContext *dc) ++static int dec_asrq(CPUCRISState *env, DisasContext *dc) + { + dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4); + LOG_DIS("asrq %u, $r%d\n", dc->op1, dc->op2); +@@ -1495,7 +1495,7 @@ static int dec_asrq(DisasContext *dc) + cpu_R[dc->op2], cpu_R[dc->op2], 4); + return 2; + } +-static int dec_lslq(DisasContext *dc) ++static int dec_lslq(CPUCRISState *env, DisasContext *dc) + { + dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4); + LOG_DIS("lslq %u, $r%d\n", dc->op1, dc->op2); +@@ -1509,7 +1509,7 @@ static int dec_lslq(DisasContext *dc) + cpu_R[dc->op2], cpu_R[dc->op2], 4); + return 2; + } +-static int dec_lsrq(DisasContext *dc) ++static int dec_lsrq(CPUCRISState *env, DisasContext *dc) + { + dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4); + LOG_DIS("lsrq %u, $r%d\n", dc->op1, dc->op2); +@@ -1523,7 +1523,7 @@ static int dec_lsrq(DisasContext *dc) + return 2; + } + +-static int dec_move_r(DisasContext *dc) ++static int dec_move_r(CPUCRISState *env, DisasContext *dc) + { + int size = memsize_zz(dc); + +@@ -1551,7 +1551,7 @@ static int dec_move_r(DisasContext *dc) + return 2; + } + +-static int dec_scc_r(DisasContext *dc) ++static int dec_scc_r(CPUCRISState *env, DisasContext *dc) + { + int cond = dc->op2; + +@@ -1594,7 +1594,7 @@ static inline void cris_alu_free_temps(DisasContext *dc, int size, TCGv *t) + } + } + +-static int dec_and_r(DisasContext *dc) ++static int dec_and_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1611,7 +1611,7 @@ static int dec_and_r(DisasContext *dc) + return 2; + } + +-static int dec_lz_r(DisasContext *dc) ++static int dec_lz_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + LOG_DIS("lz $r%u, $r%u\n", +@@ -1624,7 +1624,7 @@ static int dec_lz_r(DisasContext *dc) + return 2; + } + +-static int dec_lsl_r(DisasContext *dc) ++static int dec_lsl_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1641,7 +1641,7 @@ static int dec_lsl_r(DisasContext *dc) + return 2; + } + +-static int dec_lsr_r(DisasContext *dc) ++static int dec_lsr_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1658,7 +1658,7 @@ static int dec_lsr_r(DisasContext *dc) + return 2; + } + +-static int dec_asr_r(DisasContext *dc) ++static int dec_asr_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1675,7 +1675,7 @@ static int dec_asr_r(DisasContext *dc) + return 2; + } + +-static int dec_muls_r(DisasContext *dc) ++static int dec_muls_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1691,7 +1691,7 @@ static int dec_muls_r(DisasContext *dc) + return 2; + } + +-static int dec_mulu_r(DisasContext *dc) ++static int dec_mulu_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1708,7 +1708,7 @@ static int dec_mulu_r(DisasContext *dc) + } + + +-static int dec_dstep_r(DisasContext *dc) ++static int dec_dstep_r(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("dstep $r%u, $r%u\n", dc->op1, dc->op2); + cris_cc_mask(dc, CC_MASK_NZ); +@@ -1717,7 +1717,7 @@ static int dec_dstep_r(DisasContext *dc) + return 2; + } + +-static int dec_xor_r(DisasContext *dc) ++static int dec_xor_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1733,7 +1733,7 @@ static int dec_xor_r(DisasContext *dc) + return 2; + } + +-static int dec_bound_r(DisasContext *dc) ++static int dec_bound_r(CPUCRISState *env, DisasContext *dc) + { + TCGv l0; + int size = memsize_zz(dc); +@@ -1747,7 +1747,7 @@ static int dec_bound_r(DisasContext *dc) + return 2; + } + +-static int dec_cmp_r(DisasContext *dc) ++static int dec_cmp_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1762,7 +1762,7 @@ static int dec_cmp_r(DisasContext *dc) + return 2; + } + +-static int dec_abs_r(DisasContext *dc) ++static int dec_abs_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + +@@ -1781,7 +1781,7 @@ static int dec_abs_r(DisasContext *dc) + return 2; + } + +-static int dec_add_r(DisasContext *dc) ++static int dec_add_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1796,7 +1796,7 @@ static int dec_add_r(DisasContext *dc) + return 2; + } + +-static int dec_addc_r(DisasContext *dc) ++static int dec_addc_r(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("addc $r%u, $r%u\n", + dc->op1, dc->op2); +@@ -1811,7 +1811,7 @@ static int dec_addc_r(DisasContext *dc) + return 2; + } + +-static int dec_mcp_r(DisasContext *dc) ++static int dec_mcp_r(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("mcp $p%u, $r%u\n", + dc->op2, dc->op1); +@@ -1838,7 +1838,7 @@ static char * swapmode_name(int mode, char *modename) { + } + #endif + +-static int dec_swap_r(DisasContext *dc) ++static int dec_swap_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + #if DISAS_CRIS +@@ -1864,7 +1864,7 @@ static int dec_swap_r(DisasContext *dc) + return 2; + } + +-static int dec_or_r(DisasContext *dc) ++static int dec_or_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1878,7 +1878,7 @@ static int dec_or_r(DisasContext *dc) + return 2; + } + +-static int dec_addi_r(DisasContext *dc) ++static int dec_addi_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + LOG_DIS("addi.%c $r%u, $r%u\n", +@@ -1891,7 +1891,7 @@ static int dec_addi_r(DisasContext *dc) + return 2; + } + +-static int dec_addi_acr(DisasContext *dc) ++static int dec_addi_acr(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + LOG_DIS("addi.%c $r%u, $r%u, $acr\n", +@@ -1904,7 +1904,7 @@ static int dec_addi_acr(DisasContext *dc) + return 2; + } + +-static int dec_neg_r(DisasContext *dc) ++static int dec_neg_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1919,7 +1919,7 @@ static int dec_neg_r(DisasContext *dc) + return 2; + } + +-static int dec_btst_r(DisasContext *dc) ++static int dec_btst_r(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("btst $r%u, $r%u\n", + dc->op1, dc->op2); +@@ -1934,7 +1934,7 @@ static int dec_btst_r(DisasContext *dc) + return 2; + } + +-static int dec_sub_r(DisasContext *dc) ++static int dec_sub_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int size = memsize_zz(dc); +@@ -1949,7 +1949,7 @@ static int dec_sub_r(DisasContext *dc) + } + + /* Zero extension. From size to dword. */ +-static int dec_movu_r(DisasContext *dc) ++static int dec_movu_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + int size = memsize_z(dc); +@@ -1966,7 +1966,7 @@ static int dec_movu_r(DisasContext *dc) + } + + /* Sign extension. From size to dword. */ +-static int dec_movs_r(DisasContext *dc) ++static int dec_movs_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + int size = memsize_z(dc); +@@ -1985,7 +1985,7 @@ static int dec_movs_r(DisasContext *dc) + } + + /* zero extension. From size to dword. */ +-static int dec_addu_r(DisasContext *dc) ++static int dec_addu_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + int size = memsize_z(dc); +@@ -2004,7 +2004,7 @@ static int dec_addu_r(DisasContext *dc) + } + + /* Sign extension. From size to dword. */ +-static int dec_adds_r(DisasContext *dc) ++static int dec_adds_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + int size = memsize_z(dc); +@@ -2023,7 +2023,7 @@ static int dec_adds_r(DisasContext *dc) + } + + /* Zero extension. From size to dword. */ +-static int dec_subu_r(DisasContext *dc) ++static int dec_subu_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + int size = memsize_z(dc); +@@ -2042,7 +2042,7 @@ static int dec_subu_r(DisasContext *dc) + } + + /* Sign extension. From size to dword. */ +-static int dec_subs_r(DisasContext *dc) ++static int dec_subs_r(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + int size = memsize_z(dc); +@@ -2060,7 +2060,7 @@ static int dec_subs_r(DisasContext *dc) + return 2; + } + +-static int dec_setclrf(DisasContext *dc) ++static int dec_setclrf(CPUCRISState *env, DisasContext *dc) + { + uint32_t flags; + int set = (~dc->opcode >> 2) & 1; +@@ -2131,7 +2131,7 @@ static int dec_setclrf(DisasContext *dc) + return 2; + } + +-static int dec_move_rs(DisasContext *dc) ++static int dec_move_rs(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("move $r%u, $s%u\n", dc->op1, dc->op2); + cris_cc_mask(dc, 0); +@@ -2139,7 +2139,7 @@ static int dec_move_rs(DisasContext *dc) + tcg_const_tl(dc->op1)); + return 2; + } +-static int dec_move_sr(DisasContext *dc) ++static int dec_move_sr(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("move $s%u, $r%u\n", dc->op2, dc->op1); + cris_cc_mask(dc, 0); +@@ -2148,7 +2148,7 @@ static int dec_move_sr(DisasContext *dc) + return 2; + } + +-static int dec_move_rp(DisasContext *dc) ++static int dec_move_rp(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + LOG_DIS("move $r%u, $p%u\n", dc->op1, dc->op2); +@@ -2178,7 +2178,7 @@ static int dec_move_rp(DisasContext *dc) + tcg_temp_free(t[0]); + return 2; + } +-static int dec_move_pr(DisasContext *dc) ++static int dec_move_pr(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + LOG_DIS("move $p%u, $r%u\n", dc->op2, dc->op1); +@@ -2200,7 +2200,7 @@ static int dec_move_pr(DisasContext *dc) + return 2; + } + +-static int dec_move_mr(DisasContext *dc) ++static int dec_move_mr(CPUCRISState *env, DisasContext *dc) + { + int memsize = memsize_zz(dc); + int insn_len; +@@ -2210,7 +2210,7 @@ static int dec_move_mr(DisasContext *dc) + dc->op2); + + if (memsize == 4) { +- insn_len = dec_prep_move_m(dc, 0, 4, cpu_R[dc->op2]); ++ insn_len = dec_prep_move_m(env, dc, 0, 4, cpu_R[dc->op2]); + cris_cc_mask(dc, CC_MASK_NZ); + cris_update_cc_op(dc, CC_OP_MOVE, 4); + cris_update_cc_x(dc); +@@ -2220,7 +2220,7 @@ static int dec_move_mr(DisasContext *dc) + TCGv t0; + + t0 = tcg_temp_new(); +- insn_len = dec_prep_move_m(dc, 0, memsize, t0); ++ insn_len = dec_prep_move_m(env, dc, 0, memsize, t0); + cris_cc_mask(dc, CC_MASK_NZ); + cris_alu(dc, CC_OP_MOVE, + cpu_R[dc->op2], cpu_R[dc->op2], t0, memsize); +@@ -2242,7 +2242,7 @@ static inline void cris_alu_m_free_temps(TCGv *t) + tcg_temp_free(t[1]); + } + +-static int dec_movs_m(DisasContext *dc) ++static int dec_movs_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_z(dc); +@@ -2254,7 +2254,7 @@ static int dec_movs_m(DisasContext *dc) + + cris_alu_m_alloc_temps(t); + /* sign extend. */ +- insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 1, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZ); + cris_alu(dc, CC_OP_MOVE, + cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); +@@ -2263,7 +2263,7 @@ static int dec_movs_m(DisasContext *dc) + return insn_len; + } + +-static int dec_addu_m(DisasContext *dc) ++static int dec_addu_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_z(dc); +@@ -2275,7 +2275,7 @@ static int dec_addu_m(DisasContext *dc) + + cris_alu_m_alloc_temps(t); + /* sign extend. */ +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_ADD, + cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); +@@ -2284,7 +2284,7 @@ static int dec_addu_m(DisasContext *dc) + return insn_len; + } + +-static int dec_adds_m(DisasContext *dc) ++static int dec_adds_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_z(dc); +@@ -2296,7 +2296,7 @@ static int dec_adds_m(DisasContext *dc) + + cris_alu_m_alloc_temps(t); + /* sign extend. */ +- insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 1, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_ADD, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); + do_postinc(dc, memsize); +@@ -2304,7 +2304,7 @@ static int dec_adds_m(DisasContext *dc) + return insn_len; + } + +-static int dec_subu_m(DisasContext *dc) ++static int dec_subu_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_z(dc); +@@ -2316,7 +2316,7 @@ static int dec_subu_m(DisasContext *dc) + + cris_alu_m_alloc_temps(t); + /* sign extend. */ +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); + do_postinc(dc, memsize); +@@ -2324,7 +2324,7 @@ static int dec_subu_m(DisasContext *dc) + return insn_len; + } + +-static int dec_subs_m(DisasContext *dc) ++static int dec_subs_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_z(dc); +@@ -2336,7 +2336,7 @@ static int dec_subs_m(DisasContext *dc) + + cris_alu_m_alloc_temps(t); + /* sign extend. */ +- insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 1, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); + do_postinc(dc, memsize); +@@ -2344,7 +2344,7 @@ static int dec_subs_m(DisasContext *dc) + return insn_len; + } + +-static int dec_movu_m(DisasContext *dc) ++static int dec_movu_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_z(dc); +@@ -2356,7 +2356,7 @@ static int dec_movu_m(DisasContext *dc) + dc->op2); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZ); + cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); + do_postinc(dc, memsize); +@@ -2364,7 +2364,7 @@ static int dec_movu_m(DisasContext *dc) + return insn_len; + } + +-static int dec_cmpu_m(DisasContext *dc) ++static int dec_cmpu_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_z(dc); +@@ -2375,7 +2375,7 @@ static int dec_cmpu_m(DisasContext *dc) + dc->op2); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_CMP, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); + do_postinc(dc, memsize); +@@ -2383,7 +2383,7 @@ static int dec_cmpu_m(DisasContext *dc) + return insn_len; + } + +-static int dec_cmps_m(DisasContext *dc) ++static int dec_cmps_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_z(dc); +@@ -2394,7 +2394,7 @@ static int dec_cmps_m(DisasContext *dc) + dc->op2); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 1, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_CMP, + cpu_R[dc->op2], cpu_R[dc->op2], t[1], +@@ -2404,7 +2404,7 @@ static int dec_cmps_m(DisasContext *dc) + return insn_len; + } + +-static int dec_cmp_m(DisasContext *dc) ++static int dec_cmp_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_zz(dc); +@@ -2415,7 +2415,7 @@ static int dec_cmp_m(DisasContext *dc) + dc->op2); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_CMP, + cpu_R[dc->op2], cpu_R[dc->op2], t[1], +@@ -2425,7 +2425,7 @@ static int dec_cmp_m(DisasContext *dc) + return insn_len; + } + +-static int dec_test_m(DisasContext *dc) ++static int dec_test_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_zz(dc); +@@ -2438,7 +2438,7 @@ static int dec_test_m(DisasContext *dc) + cris_evaluate_flags(dc); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZ); + tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~3); + +@@ -2449,7 +2449,7 @@ static int dec_test_m(DisasContext *dc) + return insn_len; + } + +-static int dec_and_m(DisasContext *dc) ++static int dec_and_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_zz(dc); +@@ -2460,7 +2460,7 @@ static int dec_and_m(DisasContext *dc) + dc->op2); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZ); + cris_alu(dc, CC_OP_AND, cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); + do_postinc(dc, memsize); +@@ -2468,7 +2468,7 @@ static int dec_and_m(DisasContext *dc) + return insn_len; + } + +-static int dec_add_m(DisasContext *dc) ++static int dec_add_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_zz(dc); +@@ -2479,7 +2479,7 @@ static int dec_add_m(DisasContext *dc) + dc->op2); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_ADD, + cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); +@@ -2488,7 +2488,7 @@ static int dec_add_m(DisasContext *dc) + return insn_len; + } + +-static int dec_addo_m(DisasContext *dc) ++static int dec_addo_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_zz(dc); +@@ -2499,7 +2499,7 @@ static int dec_addo_m(DisasContext *dc) + dc->op2); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 1, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 1, memsize, t[0], t[1]); + cris_cc_mask(dc, 0); + cris_alu(dc, CC_OP_ADD, cpu_R[R_ACR], t[0], t[1], 4); + do_postinc(dc, memsize); +@@ -2507,7 +2507,7 @@ static int dec_addo_m(DisasContext *dc) + return insn_len; + } + +-static int dec_bound_m(DisasContext *dc) ++static int dec_bound_m(CPUCRISState *env, DisasContext *dc) + { + TCGv l[2]; + int memsize = memsize_zz(dc); +@@ -2519,7 +2519,7 @@ static int dec_bound_m(DisasContext *dc) + + l[0] = tcg_temp_local_new(); + l[1] = tcg_temp_local_new(); +- insn_len = dec_prep_alu_m(dc, 0, memsize, l[0], l[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, l[0], l[1]); + cris_cc_mask(dc, CC_MASK_NZ); + cris_alu(dc, CC_OP_BOUND, cpu_R[dc->op2], l[0], l[1], 4); + do_postinc(dc, memsize); +@@ -2528,7 +2528,7 @@ static int dec_bound_m(DisasContext *dc) + return insn_len; + } + +-static int dec_addc_mr(DisasContext *dc) ++static int dec_addc_mr(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int insn_len = 2; +@@ -2543,7 +2543,7 @@ static int dec_addc_mr(DisasContext *dc) + dc->flags_x = X_FLAG; + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, 4, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, 4, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_ADDC, cpu_R[dc->op2], t[0], t[1], 4); + do_postinc(dc, 4); +@@ -2551,7 +2551,7 @@ static int dec_addc_mr(DisasContext *dc) + return insn_len; + } + +-static int dec_sub_m(DisasContext *dc) ++static int dec_sub_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_zz(dc); +@@ -2562,7 +2562,7 @@ static int dec_sub_m(DisasContext *dc) + dc->op2, dc->ir, dc->zzsize); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], t[0], t[1], memsize); + do_postinc(dc, memsize); +@@ -2570,7 +2570,7 @@ static int dec_sub_m(DisasContext *dc) + return insn_len; + } + +-static int dec_or_m(DisasContext *dc) ++static int dec_or_m(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_zz(dc); +@@ -2581,7 +2581,7 @@ static int dec_or_m(DisasContext *dc) + dc->op2, dc->pc); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, CC_MASK_NZ); + cris_alu(dc, CC_OP_OR, + cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); +@@ -2590,7 +2590,7 @@ static int dec_or_m(DisasContext *dc) + return insn_len; + } + +-static int dec_move_mp(DisasContext *dc) ++static int dec_move_mp(CPUCRISState *env, DisasContext *dc) + { + TCGv t[2]; + int memsize = memsize_zz(dc); +@@ -2603,7 +2603,7 @@ static int dec_move_mp(DisasContext *dc) + dc->op2); + + cris_alu_m_alloc_temps(t); +- insn_len = dec_prep_alu_m(dc, 0, memsize, t[0], t[1]); ++ insn_len = dec_prep_alu_m(env, dc, 0, memsize, t[0], t[1]); + cris_cc_mask(dc, 0); + if (dc->op2 == PR_CCS) { + cris_evaluate_flags(dc); +@@ -2622,7 +2622,7 @@ static int dec_move_mp(DisasContext *dc) + return insn_len; + } + +-static int dec_move_pm(DisasContext *dc) ++static int dec_move_pm(CPUCRISState *env, DisasContext *dc) + { + TCGv t0; + int memsize; +@@ -2648,7 +2648,7 @@ static int dec_move_pm(DisasContext *dc) + return 2; + } + +-static int dec_movem_mr(DisasContext *dc) ++static int dec_movem_mr(CPUCRISState *env, DisasContext *dc) + { + TCGv_i64 tmp[16]; + TCGv tmp32; +@@ -2695,7 +2695,7 @@ static int dec_movem_mr(DisasContext *dc) + return 2; + } + +-static int dec_movem_rm(DisasContext *dc) ++static int dec_movem_rm(CPUCRISState *env, DisasContext *dc) + { + TCGv tmp; + TCGv addr; +@@ -2724,7 +2724,7 @@ static int dec_movem_rm(DisasContext *dc) + return 2; + } + +-static int dec_move_rm(DisasContext *dc) ++static int dec_move_rm(CPUCRISState *env, DisasContext *dc) + { + int memsize; + +@@ -2743,7 +2743,7 @@ static int dec_move_rm(DisasContext *dc) + return 2; + } + +-static int dec_lapcq(DisasContext *dc) ++static int dec_lapcq(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("lapcq %x, $r%u\n", + dc->pc + dc->op1*2, dc->op2); +@@ -2752,7 +2752,7 @@ static int dec_lapcq(DisasContext *dc) + return 2; + } + +-static int dec_lapc_im(DisasContext *dc) ++static int dec_lapc_im(CPUCRISState *env, DisasContext *dc) + { + unsigned int rd; + int32_t imm; +@@ -2761,7 +2761,7 @@ static int dec_lapc_im(DisasContext *dc) + rd = dc->op2; + + cris_cc_mask(dc, 0); +- imm = cris_fetch(dc, dc->pc + 2, 4, 0); ++ imm = cris_fetch(env, dc, dc->pc + 2, 4, 0); + LOG_DIS("lapc 0x%x, $r%u\n", imm + dc->pc, dc->op2); + + pc = dc->pc; +@@ -2771,7 +2771,7 @@ static int dec_lapc_im(DisasContext *dc) + } + + /* Jump to special reg. */ +-static int dec_jump_p(DisasContext *dc) ++static int dec_jump_p(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("jump $p%u\n", dc->op2); + +@@ -2786,7 +2786,7 @@ static int dec_jump_p(DisasContext *dc) + } + + /* Jump and save. */ +-static int dec_jas_r(DisasContext *dc) ++static int dec_jas_r(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("jas $r%u, $p%u\n", dc->op1, dc->op2); + cris_cc_mask(dc, 0); +@@ -2800,11 +2800,11 @@ static int dec_jas_r(DisasContext *dc) + return 2; + } + +-static int dec_jas_im(DisasContext *dc) ++static int dec_jas_im(CPUCRISState *env, DisasContext *dc) + { + uint32_t imm; + +- imm = cris_fetch(dc, dc->pc + 2, 4, 0); ++ imm = cris_fetch(env, dc, dc->pc + 2, 4, 0); + + LOG_DIS("jas 0x%x\n", imm); + cris_cc_mask(dc, 0); +@@ -2816,11 +2816,11 @@ static int dec_jas_im(DisasContext *dc) + return 6; + } + +-static int dec_jasc_im(DisasContext *dc) ++static int dec_jasc_im(CPUCRISState *env, DisasContext *dc) + { + uint32_t imm; + +- imm = cris_fetch(dc, dc->pc + 2, 4, 0); ++ imm = cris_fetch(env, dc, dc->pc + 2, 4, 0); + + LOG_DIS("jasc 0x%x\n", imm); + cris_cc_mask(dc, 0); +@@ -2832,7 +2832,7 @@ static int dec_jasc_im(DisasContext *dc) + return 6; + } + +-static int dec_jasc_r(DisasContext *dc) ++static int dec_jasc_r(CPUCRISState *env, DisasContext *dc) + { + LOG_DIS("jasc_r $r%u, $p%u\n", dc->op1, dc->op2); + cris_cc_mask(dc, 0); +@@ -2843,12 +2843,12 @@ static int dec_jasc_r(DisasContext *dc) + return 2; + } + +-static int dec_bcc_im(DisasContext *dc) ++static int dec_bcc_im(CPUCRISState *env, DisasContext *dc) + { + int32_t offset; + uint32_t cond = dc->op2; + +- offset = cris_fetch(dc, dc->pc + 2, 2, 1); ++ offset = cris_fetch(env, dc, dc->pc + 2, 2, 1); + + LOG_DIS("b%s %d pc=%x dst=%x\n", + cc_name(cond), offset, +@@ -2860,12 +2860,12 @@ static int dec_bcc_im(DisasContext *dc) + return 4; + } + +-static int dec_bas_im(DisasContext *dc) ++static int dec_bas_im(CPUCRISState *env, DisasContext *dc) + { + int32_t simm; + + +- simm = cris_fetch(dc, dc->pc + 2, 4, 0); ++ simm = cris_fetch(env, dc, dc->pc + 2, 4, 0); + + LOG_DIS("bas 0x%x, $p%u\n", dc->pc + simm, dc->op2); + cris_cc_mask(dc, 0); +@@ -2877,10 +2877,10 @@ static int dec_bas_im(DisasContext *dc) + return 6; + } + +-static int dec_basc_im(DisasContext *dc) ++static int dec_basc_im(CPUCRISState *env, DisasContext *dc) + { + int32_t simm; +- simm = cris_fetch(dc, dc->pc + 2, 4, 0); ++ simm = cris_fetch(env, dc, dc->pc + 2, 4, 0); + + LOG_DIS("basc 0x%x, $p%u\n", dc->pc + simm, dc->op2); + cris_cc_mask(dc, 0); +@@ -2892,7 +2892,7 @@ static int dec_basc_im(DisasContext *dc) + return 6; + } + +-static int dec_rfe_etc(DisasContext *dc) ++static int dec_rfe_etc(CPUCRISState *env, DisasContext *dc) + { + cris_cc_mask(dc, 0); + +@@ -2939,17 +2939,17 @@ static int dec_rfe_etc(DisasContext *dc) + return 2; + } + +-static int dec_ftag_fidx_d_m(DisasContext *dc) ++static int dec_ftag_fidx_d_m(CPUCRISState *env, DisasContext *dc) + { + return 2; + } + +-static int dec_ftag_fidx_i_m(DisasContext *dc) ++static int dec_ftag_fidx_i_m(CPUCRISState *env, DisasContext *dc) + { + return 2; + } + +-static int dec_null(DisasContext *dc) ++static int dec_null(CPUCRISState *env, DisasContext *dc) + { + printf ("unknown insn pc=%x opc=%x op1=%x op2=%x\n", + dc->pc, dc->opcode, dc->op1, dc->op2); +@@ -2963,7 +2963,7 @@ static struct decoder_info { + uint32_t bits; + uint32_t mask; + }; +- int (*dec)(DisasContext *dc); ++ int (*dec)(CPUCRISState *env, DisasContext *dc); + } decinfo[] = { + /* Order matters here. */ + {DEC_MOVEQ, dec_moveq}, +@@ -3069,7 +3069,7 @@ static struct decoder_info { + {{0, 0}, dec_null} + }; + +-static unsigned int crisv32_decoder(DisasContext *dc) ++static unsigned int crisv32_decoder(CPUCRISState *env, DisasContext *dc) + { + int insn_len = 2; + int i; +@@ -3078,7 +3078,7 @@ static unsigned int crisv32_decoder(DisasContext *dc) + tcg_gen_debug_insn_start(dc->pc); + + /* Load a halfword onto the instruction register. */ +- dc->ir = cris_fetch(dc, dc->pc, 2, 0); ++ dc->ir = cris_fetch(env, dc, dc->pc, 2, 0); + + /* Now decode it. */ + dc->opcode = EXTRACT_FIELD(dc->ir, 4, 11); +@@ -3092,7 +3092,7 @@ static unsigned int crisv32_decoder(DisasContext *dc) + for (i = 0; i < ARRAY_SIZE(decinfo); i++) { + if ((dc->opcode & decinfo[i].mask) == decinfo[i].bits) + { +- insn_len = decinfo[i].dec(dc); ++ insn_len = decinfo[i].dec(env, dc); + break; + } + } +@@ -3286,7 +3286,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb, + gen_io_start(); + dc->clear_x = 1; + +- insn_len = dc->decoder(dc); ++ insn_len = dc->decoder(env, dc); + dc->ppc = dc->pc; + dc->pc += insn_len; + if (dc->clear_x) +diff --git a/target-cris/translate_v10.c b/target-cris/translate_v10.c +index 9a39c6a..d2cca89 100644 +--- a/target-cris/translate_v10.c ++++ b/target-cris/translate_v10.c +@@ -164,8 +164,8 @@ static unsigned int crisv10_post_memaddr(DisasContext *dc, unsigned int size) + return insn_len; + } + +-static int dec10_prep_move_m(DisasContext *dc, int s_ext, int memsize, +- TCGv dst) ++static int dec10_prep_move_m(CPUCRISState *env, DisasContext *dc, ++ int s_ext, int memsize, TCGv dst) + { + unsigned int rs; + uint32_t imm; +@@ -182,17 +182,17 @@ static int dec10_prep_move_m(DisasContext *dc, int s_ext, int memsize, + if (memsize != 4) { + if (s_ext) { + if (memsize == 1) +- imm = ldsb_code(dc->pc + 2); ++ imm = cpu_ldsb_code(env, dc->pc + 2); + else +- imm = ldsw_code(dc->pc + 2); ++ imm = cpu_ldsw_code(env, dc->pc + 2); + } else { + if (memsize == 1) +- imm = ldub_code(dc->pc + 2); ++ imm = cpu_ldub_code(env, dc->pc + 2); + else +- imm = lduw_code(dc->pc + 2); ++ imm = cpu_lduw_code(env, dc->pc + 2); + } + } else +- imm = ldl_code(dc->pc + 2); ++ imm = cpu_ldl_code(env, dc->pc + 2); + + tcg_gen_movi_tl(dst, imm); + +@@ -752,7 +752,8 @@ static unsigned int dec10_reg(DisasContext *dc) + return insn_len; + } + +-static unsigned int dec10_ind_move_m_r(DisasContext *dc, unsigned int size) ++static unsigned int dec10_ind_move_m_r(CPUCRISState *env, DisasContext *dc, ++ unsigned int size) + { + unsigned int insn_len = 2; + TCGv t; +@@ -762,7 +763,7 @@ static unsigned int dec10_ind_move_m_r(DisasContext *dc, unsigned int size) + + cris_cc_mask(dc, CC_MASK_NZVC); + t = tcg_temp_new(); +- insn_len += dec10_prep_move_m(dc, 0, size, t); ++ insn_len += dec10_prep_move_m(env, dc, 0, size, t); + cris_alu(dc, CC_OP_MOVE, cpu_R[dc->dst], cpu_R[dc->dst], t, size); + if (dc->dst == 15) { + tcg_gen_mov_tl(env_btarget, cpu_R[dc->dst]); +@@ -789,7 +790,7 @@ static unsigned int dec10_ind_move_r_m(DisasContext *dc, unsigned int size) + return insn_len; + } + +-static unsigned int dec10_ind_move_m_pr(DisasContext *dc) ++static unsigned int dec10_ind_move_m_pr(CPUCRISState *env, DisasContext *dc) + { + unsigned int insn_len = 2, rd = dc->dst; + TCGv t, addr; +@@ -799,7 +800,7 @@ static unsigned int dec10_ind_move_m_pr(DisasContext *dc) + + addr = tcg_temp_new(); + t = tcg_temp_new(); +- insn_len += dec10_prep_move_m(dc, 0, 4, t); ++ insn_len += dec10_prep_move_m(env, dc, 0, 4, t); + if (rd == 15) { + tcg_gen_mov_tl(env_btarget, t); + cris_prepare_jmp(dc, JMP_INDIRECT); +@@ -899,14 +900,15 @@ static void dec10_movem_m_r(DisasContext *dc) + tcg_temp_free(t0); + } + +-static int dec10_ind_alu(DisasContext *dc, int op, unsigned int size) ++static int dec10_ind_alu(CPUCRISState *env, DisasContext *dc, ++ int op, unsigned int size) + { + int insn_len = 0; + int rd = dc->dst; + TCGv t[2]; + + cris_alu_m_alloc_temps(t); +- insn_len += dec10_prep_move_m(dc, 0, size, t[0]); ++ insn_len += dec10_prep_move_m(env, dc, 0, size, t[0]); + cris_alu(dc, op, cpu_R[dc->dst], cpu_R[rd], t[0], size); + if (dc->dst == 15) { + tcg_gen_mov_tl(env_btarget, cpu_R[dc->dst]); +@@ -920,14 +922,15 @@ static int dec10_ind_alu(DisasContext *dc, int op, unsigned int size) + return insn_len; + } + +-static int dec10_ind_bound(DisasContext *dc, unsigned int size) ++static int dec10_ind_bound(CPUCRISState *env, DisasContext *dc, ++ unsigned int size) + { + int insn_len = 0; + int rd = dc->dst; + TCGv t; + + t = tcg_temp_local_new(); +- insn_len += dec10_prep_move_m(dc, 0, size, t); ++ insn_len += dec10_prep_move_m(env, dc, 0, size, t); + cris_alu(dc, CC_OP_BOUND, cpu_R[dc->dst], cpu_R[rd], t, 4); + if (dc->dst == 15) { + tcg_gen_mov_tl(env_btarget, cpu_R[dc->dst]); +@@ -940,7 +943,7 @@ static int dec10_ind_bound(DisasContext *dc, unsigned int size) + return insn_len; + } + +-static int dec10_alux_m(DisasContext *dc, int op) ++static int dec10_alux_m(CPUCRISState *env, DisasContext *dc, int op) + { + unsigned int size = (dc->size & 1) ? 2 : 1; + unsigned int sx = !!(dc->size & 2); +@@ -953,7 +956,7 @@ static int dec10_alux_m(DisasContext *dc, int op) + t = tcg_temp_new(); + + cris_cc_mask(dc, CC_MASK_NZVC); +- insn_len += dec10_prep_move_m(dc, sx, size, t); ++ insn_len += dec10_prep_move_m(env, dc, sx, size, t); + cris_alu(dc, op, cpu_R[dc->dst], cpu_R[rd], t, 4); + if (dc->dst == 15) { + tcg_gen_mov_tl(env_btarget, cpu_R[dc->dst]); +@@ -966,7 +969,7 @@ static int dec10_alux_m(DisasContext *dc, int op) + return insn_len; + } + +-static int dec10_dip(DisasContext *dc) ++static int dec10_dip(CPUCRISState *env, DisasContext *dc) + { + int insn_len = 2; + uint32_t imm; +@@ -974,7 +977,7 @@ static int dec10_dip(DisasContext *dc) + LOG_DIS("dip pc=%x opcode=%d r%d r%d\n", + dc->pc, dc->opcode, dc->src, dc->dst); + if (dc->src == 15) { +- imm = ldl_code(dc->pc + 2); ++ imm = cpu_ldl_code(env, dc->pc + 2); + tcg_gen_movi_tl(cpu_PR[PR_PREFIX], imm); + if (dc->postinc) + insn_len += 4; +@@ -989,7 +992,7 @@ static int dec10_dip(DisasContext *dc) + return insn_len; + } + +-static int dec10_bdap_m(DisasContext *dc, int size) ++static int dec10_bdap_m(CPUCRISState *env, DisasContext *dc, int size) + { + int insn_len = 2; + int rd = dc->dst; +@@ -1014,13 +1017,13 @@ static int dec10_bdap_m(DisasContext *dc, int size) + } + #endif + /* Now the rest of the modes are truly indirect. */ +- insn_len += dec10_prep_move_m(dc, 1, size, cpu_PR[PR_PREFIX]); ++ insn_len += dec10_prep_move_m(env, dc, 1, size, cpu_PR[PR_PREFIX]); + tcg_gen_add_tl(cpu_PR[PR_PREFIX], cpu_PR[PR_PREFIX], cpu_R[rd]); + cris_set_prefix(dc); + return insn_len; + } + +-static unsigned int dec10_ind(DisasContext *dc) ++static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc) + { + unsigned int insn_len = 2; + unsigned int size = dec10_size(dc->size); +@@ -1031,7 +1034,7 @@ static unsigned int dec10_ind(DisasContext *dc) + if (dc->size != 3) { + switch (dc->opcode) { + case CRISV10_IND_MOVE_M_R: +- return dec10_ind_move_m_r(dc, size); ++ return dec10_ind_move_m_r(env, dc, size); + break; + case CRISV10_IND_MOVE_R_M: + return dec10_ind_move_r_m(dc, size); +@@ -1039,7 +1042,7 @@ static unsigned int dec10_ind(DisasContext *dc) + case CRISV10_IND_CMP: + LOG_DIS("cmp size=%d op=%d %d\n", size, dc->src, dc->dst); + cris_cc_mask(dc, CC_MASK_NZVC); +- insn_len += dec10_ind_alu(dc, CC_OP_CMP, size); ++ insn_len += dec10_ind_alu(env, dc, CC_OP_CMP, size); + break; + case CRISV10_IND_TEST: + LOG_DIS("test size=%d op=%d %d\n", size, dc->src, dc->dst); +@@ -1047,7 +1050,7 @@ static unsigned int dec10_ind(DisasContext *dc) + cris_evaluate_flags(dc); + cris_cc_mask(dc, CC_MASK_NZVC); + cris_alu_m_alloc_temps(t); +- insn_len += dec10_prep_move_m(dc, 0, size, t[0]); ++ insn_len += dec10_prep_move_m(env, dc, 0, size, t[0]); + tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~3); + cris_alu(dc, CC_OP_CMP, cpu_R[dc->dst], + t[0], tcg_const_tl(0), size); +@@ -1056,39 +1059,39 @@ static unsigned int dec10_ind(DisasContext *dc) + case CRISV10_IND_ADD: + LOG_DIS("add size=%d op=%d %d\n", size, dc->src, dc->dst); + cris_cc_mask(dc, CC_MASK_NZVC); +- insn_len += dec10_ind_alu(dc, CC_OP_ADD, size); ++ insn_len += dec10_ind_alu(env, dc, CC_OP_ADD, size); + break; + case CRISV10_IND_SUB: + LOG_DIS("sub size=%d op=%d %d\n", size, dc->src, dc->dst); + cris_cc_mask(dc, CC_MASK_NZVC); +- insn_len += dec10_ind_alu(dc, CC_OP_SUB, size); ++ insn_len += dec10_ind_alu(env, dc, CC_OP_SUB, size); + break; + case CRISV10_IND_BOUND: + LOG_DIS("bound size=%d op=%d %d\n", size, dc->src, dc->dst); + cris_cc_mask(dc, CC_MASK_NZVC); +- insn_len += dec10_ind_bound(dc, size); ++ insn_len += dec10_ind_bound(env, dc, size); + break; + case CRISV10_IND_AND: + LOG_DIS("and size=%d op=%d %d\n", size, dc->src, dc->dst); + cris_cc_mask(dc, CC_MASK_NZVC); +- insn_len += dec10_ind_alu(dc, CC_OP_AND, size); ++ insn_len += dec10_ind_alu(env, dc, CC_OP_AND, size); + break; + case CRISV10_IND_OR: + LOG_DIS("or size=%d op=%d %d\n", size, dc->src, dc->dst); + cris_cc_mask(dc, CC_MASK_NZVC); +- insn_len += dec10_ind_alu(dc, CC_OP_OR, size); ++ insn_len += dec10_ind_alu(env, dc, CC_OP_OR, size); + break; + case CRISV10_IND_MOVX: +- insn_len = dec10_alux_m(dc, CC_OP_MOVE); ++ insn_len = dec10_alux_m(env, dc, CC_OP_MOVE); + break; + case CRISV10_IND_ADDX: +- insn_len = dec10_alux_m(dc, CC_OP_ADD); ++ insn_len = dec10_alux_m(env, dc, CC_OP_ADD); + break; + case CRISV10_IND_SUBX: +- insn_len = dec10_alux_m(dc, CC_OP_SUB); ++ insn_len = dec10_alux_m(env, dc, CC_OP_SUB); + break; + case CRISV10_IND_CMPX: +- insn_len = dec10_alux_m(dc, CC_OP_CMP); ++ insn_len = dec10_alux_m(env, dc, CC_OP_CMP); + break; + case CRISV10_IND_MUL: + /* This is a reg insn coded in the mem indir space. */ +@@ -1097,7 +1100,7 @@ static unsigned int dec10_ind(DisasContext *dc) + dec10_reg_mul(dc, size, dc->ir & (1 << 10)); + break; + case CRISV10_IND_BDAP_M: +- insn_len = dec10_bdap_m(dc, size); ++ insn_len = dec10_bdap_m(env, dc, size); + break; + default: + LOG_DIS("pc=%x var-ind.%d %d r%d r%d\n", +@@ -1110,7 +1113,7 @@ static unsigned int dec10_ind(DisasContext *dc) + + switch (dc->opcode) { + case CRISV10_IND_MOVE_M_SPR: +- insn_len = dec10_ind_move_m_pr(dc); ++ insn_len = dec10_ind_move_m_pr(env, dc); + break; + case CRISV10_IND_MOVE_SPR_M: + insn_len = dec10_ind_move_pr_m(dc); +@@ -1119,7 +1122,7 @@ static unsigned int dec10_ind(DisasContext *dc) + if (dc->src == 15) { + LOG_DIS("jump.%d %d r%d r%d direct\n", size, + dc->opcode, dc->src, dc->dst); +- imm = ldl_code(dc->pc + 2); ++ imm = cpu_ldl_code(env, dc->pc + 2); + if (dc->mode == CRISV10_MODE_AUTOINC) + insn_len += size; + +@@ -1168,24 +1171,24 @@ static unsigned int dec10_ind(DisasContext *dc) + dc->delayed_branch--; /* v10 has no dslot here. */ + break; + case CRISV10_IND_MOVX: +- insn_len = dec10_alux_m(dc, CC_OP_MOVE); ++ insn_len = dec10_alux_m(env, dc, CC_OP_MOVE); + break; + case CRISV10_IND_ADDX: +- insn_len = dec10_alux_m(dc, CC_OP_ADD); ++ insn_len = dec10_alux_m(env, dc, CC_OP_ADD); + break; + case CRISV10_IND_SUBX: +- insn_len = dec10_alux_m(dc, CC_OP_SUB); ++ insn_len = dec10_alux_m(env, dc, CC_OP_SUB); + break; + case CRISV10_IND_CMPX: +- insn_len = dec10_alux_m(dc, CC_OP_CMP); ++ insn_len = dec10_alux_m(env, dc, CC_OP_CMP); + break; + case CRISV10_IND_DIP: +- insn_len = dec10_dip(dc); ++ insn_len = dec10_dip(env, dc); + break; + case CRISV10_IND_BCC_M: + + cris_cc_mask(dc, 0); +- imm = ldsw_code(dc->pc + 2); ++ imm = cpu_ldsw_code(env, dc->pc + 2); + simm = (int16_t)imm; + simm += 4; + +@@ -1202,7 +1205,7 @@ static unsigned int dec10_ind(DisasContext *dc) + return insn_len; + } + +-static unsigned int crisv10_decoder(DisasContext *dc) ++static unsigned int crisv10_decoder(CPUCRISState *env, DisasContext *dc) + { + unsigned int insn_len = 2; + +@@ -1210,7 +1213,7 @@ static unsigned int crisv10_decoder(DisasContext *dc) + tcg_gen_debug_insn_start(dc->pc); + + /* Load a halfword onto the instruction register. */ +- dc->ir = lduw_code(dc->pc); ++ dc->ir = cpu_lduw_code(env, dc->pc); + + /* Now decode it. */ + dc->opcode = EXTRACT_FIELD(dc->ir, 6, 9); +@@ -1235,7 +1238,7 @@ static unsigned int crisv10_decoder(DisasContext *dc) + break; + case CRISV10_MODE_AUTOINC: + case CRISV10_MODE_INDIRECT: +- insn_len = dec10_ind(dc); ++ insn_len = dec10_ind(env, dc); + break; + } + +-- +1.7.12.1 + diff --git a/0037-target-sh4-switch-to-AREG0-free-mode.patch b/0037-target-sh4-switch-to-AREG0-free-mode.patch new file mode 100644 index 0000000..dbbffb0 --- /dev/null +++ b/0037-target-sh4-switch-to-AREG0-free-mode.patch @@ -0,0 +1,1060 @@ +From 22bb4c416286bbfc340f65e5c7f286d96a731cc7 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 10:37:06 +0000 +Subject: [PATCH] target-sh4: switch to AREG0 free mode + +Add an explicit CPUState parameter instead of relying on AREG0 +and switch to AREG0 free mode. + +Acked-by: Aurelien Jarno +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-sh4/Makefile.objs | 2 - + target-sh4/helper.h | 84 +++++++++++----------- + target-sh4/op_helper.c | 182 +++++++++++++++++++++++------------------------ + target-sh4/translate.c | 114 ++++++++++++++++------------- + 5 files changed, 195 insertions(+), 189 deletions(-) + +diff --git a/configure b/configure +index 2a12022..03ce76e 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | arm* | cris | i386 | lm32 | m68k | microblaze* | or32 | s390x | sparc* | unicore32 | x86_64 | xtensa* | ppc*) ++ alpha | arm* | cris | i386 | lm32 | m68k | microblaze* | or32 | s390x | sh4* | sparc* | unicore32 | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-sh4/Makefile.objs b/target-sh4/Makefile.objs +index 2e0e093..ca20f21 100644 +--- a/target-sh4/Makefile.objs ++++ b/target-sh4/Makefile.objs +@@ -1,4 +1,2 @@ + obj-y += translate.o op_helper.o helper.o cpu.o + obj-$(CONFIG_SOFTMMU) += machine.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-sh4/helper.h b/target-sh4/helper.h +index 95e3c7c..6e4f108 100644 +--- a/target-sh4/helper.h ++++ b/target-sh4/helper.h +@@ -1,54 +1,54 @@ + #include "def-helper.h" + +-DEF_HELPER_0(ldtlb, void) +-DEF_HELPER_0(raise_illegal_instruction, void) +-DEF_HELPER_0(raise_slot_illegal_instruction, void) +-DEF_HELPER_0(raise_fpu_disable, void) +-DEF_HELPER_0(raise_slot_fpu_disable, void) +-DEF_HELPER_0(debug, void) +-DEF_HELPER_1(sleep, void, i32) +-DEF_HELPER_1(trapa, void, i32) ++DEF_HELPER_1(ldtlb, void, env) ++DEF_HELPER_1(raise_illegal_instruction, void, env) ++DEF_HELPER_1(raise_slot_illegal_instruction, void, env) ++DEF_HELPER_1(raise_fpu_disable, void, env) ++DEF_HELPER_1(raise_slot_fpu_disable, void, env) ++DEF_HELPER_1(debug, void, env) ++DEF_HELPER_2(sleep, void, env, i32) ++DEF_HELPER_2(trapa, void, env, i32) + +-DEF_HELPER_2(movcal, void, i32, i32) +-DEF_HELPER_0(discard_movcal_backup, void) +-DEF_HELPER_1(ocbi, void, i32) ++DEF_HELPER_3(movcal, void, env, i32, i32) ++DEF_HELPER_1(discard_movcal_backup, void, env) ++DEF_HELPER_2(ocbi, void, env, i32) + +-DEF_HELPER_2(addv, i32, i32, i32) +-DEF_HELPER_2(addc, i32, i32, i32) +-DEF_HELPER_2(subv, i32, i32, i32) +-DEF_HELPER_2(subc, i32, i32, i32) +-DEF_HELPER_2(div1, i32, i32, i32) +-DEF_HELPER_2(macl, void, i32, i32) +-DEF_HELPER_2(macw, void, i32, i32) ++DEF_HELPER_3(addv, i32, env, i32, i32) ++DEF_HELPER_3(addc, i32, env, i32, i32) ++DEF_HELPER_3(subv, i32, env, i32, i32) ++DEF_HELPER_3(subc, i32, env, i32, i32) ++DEF_HELPER_3(div1, i32, env, i32, i32) ++DEF_HELPER_3(macl, void, env, i32, i32) ++DEF_HELPER_3(macw, void, env, i32, i32) + +-DEF_HELPER_1(ld_fpscr, void, i32) ++DEF_HELPER_2(ld_fpscr, void, env, i32) + + DEF_HELPER_1(fabs_FT, f32, f32) + DEF_HELPER_1(fabs_DT, f64, f64) +-DEF_HELPER_2(fadd_FT, f32, f32, f32) +-DEF_HELPER_2(fadd_DT, f64, f64, f64) +-DEF_HELPER_1(fcnvsd_FT_DT, f64, f32) +-DEF_HELPER_1(fcnvds_DT_FT, f32, f64) ++DEF_HELPER_3(fadd_FT, f32, env, f32, f32) ++DEF_HELPER_3(fadd_DT, f64, env, f64, f64) ++DEF_HELPER_2(fcnvsd_FT_DT, f64, env, f32) ++DEF_HELPER_2(fcnvds_DT_FT, f32, env, f64) + +-DEF_HELPER_2(fcmp_eq_FT, void, f32, f32) +-DEF_HELPER_2(fcmp_eq_DT, void, f64, f64) +-DEF_HELPER_2(fcmp_gt_FT, void, f32, f32) +-DEF_HELPER_2(fcmp_gt_DT, void, f64, f64) +-DEF_HELPER_2(fdiv_FT, f32, f32, f32) +-DEF_HELPER_2(fdiv_DT, f64, f64, f64) +-DEF_HELPER_1(float_FT, f32, i32) +-DEF_HELPER_1(float_DT, f64, i32) +-DEF_HELPER_3(fmac_FT, f32, f32, f32, f32) +-DEF_HELPER_2(fmul_FT, f32, f32, f32) +-DEF_HELPER_2(fmul_DT, f64, f64, f64) ++DEF_HELPER_3(fcmp_eq_FT, void, env, f32, f32) ++DEF_HELPER_3(fcmp_eq_DT, void, env, f64, f64) ++DEF_HELPER_3(fcmp_gt_FT, void, env, f32, f32) ++DEF_HELPER_3(fcmp_gt_DT, void, env, f64, f64) ++DEF_HELPER_3(fdiv_FT, f32, env, f32, f32) ++DEF_HELPER_3(fdiv_DT, f64, env, f64, f64) ++DEF_HELPER_2(float_FT, f32, env, i32) ++DEF_HELPER_2(float_DT, f64, env, i32) ++DEF_HELPER_4(fmac_FT, f32, env, f32, f32, f32) ++DEF_HELPER_3(fmul_FT, f32, env, f32, f32) ++DEF_HELPER_3(fmul_DT, f64, env, f64, f64) + DEF_HELPER_1(fneg_T, f32, f32) +-DEF_HELPER_2(fsub_FT, f32, f32, f32) +-DEF_HELPER_2(fsub_DT, f64, f64, f64) +-DEF_HELPER_1(fsqrt_FT, f32, f32) +-DEF_HELPER_1(fsqrt_DT, f64, f64) +-DEF_HELPER_1(ftrc_FT, i32, f32) +-DEF_HELPER_1(ftrc_DT, i32, f64) +-DEF_HELPER_2(fipr, void, i32, i32) +-DEF_HELPER_1(ftrv, void, i32) ++DEF_HELPER_3(fsub_FT, f32, env, f32, f32) ++DEF_HELPER_3(fsub_DT, f64, env, f64, f64) ++DEF_HELPER_2(fsqrt_FT, f32, env, f32) ++DEF_HELPER_2(fsqrt_DT, f64, env, f64) ++DEF_HELPER_2(ftrc_FT, i32, env, f32) ++DEF_HELPER_2(ftrc_DT, i32, env, f64) ++DEF_HELPER_3(fipr, void, env, i32, i32) ++DEF_HELPER_2(ftrv, void, env, i32) + + #include "def-helper.h" +diff --git a/target-sh4/op_helper.c b/target-sh4/op_helper.c +index 4054791..9b4328d 100644 +--- a/target-sh4/op_helper.c ++++ b/target-sh4/op_helper.c +@@ -19,10 +19,9 @@ + #include + #include + #include "cpu.h" +-#include "dyngen-exec.h" + #include "helper.h" + +-static void cpu_restore_state_from_retaddr(uintptr_t retaddr) ++static void cpu_restore_state_from_retaddr(CPUSH4State *env, uintptr_t retaddr) + { + TranslationBlock *tb; + +@@ -53,26 +52,22 @@ static void cpu_restore_state_from_retaddr(uintptr_t retaddr) + #define SHIFT 3 + #include "softmmu_template.h" + +-void tlb_fill(CPUSH4State *env1, target_ulong addr, int is_write, int mmu_idx, ++void tlb_fill(CPUSH4State *env, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) + { +- CPUSH4State *saved_env; + int ret; + +- saved_env = env; +- env = env1; + ret = cpu_sh4_handle_mmu_fault(env, addr, is_write, mmu_idx); + if (ret) { + /* now we have a real cpu fault */ +- cpu_restore_state_from_retaddr(retaddr); ++ cpu_restore_state_from_retaddr(env, retaddr); + cpu_loop_exit(env); + } +- env = saved_env; + } + + #endif + +-void helper_ldtlb(void) ++void helper_ldtlb(CPUSH4State *env) + { + #ifdef CONFIG_USER_ONLY + /* XXXXX */ +@@ -82,40 +77,41 @@ void helper_ldtlb(void) + #endif + } + +-static inline void raise_exception(int index, uintptr_t retaddr) ++static inline void raise_exception(CPUSH4State *env, int index, ++ uintptr_t retaddr) + { + env->exception_index = index; +- cpu_restore_state_from_retaddr(retaddr); ++ cpu_restore_state_from_retaddr(env, retaddr); + cpu_loop_exit(env); + } + +-void helper_raise_illegal_instruction(void) ++void helper_raise_illegal_instruction(CPUSH4State *env) + { +- raise_exception(0x180, GETPC()); ++ raise_exception(env, 0x180, GETPC()); + } + +-void helper_raise_slot_illegal_instruction(void) ++void helper_raise_slot_illegal_instruction(CPUSH4State *env) + { +- raise_exception(0x1a0, GETPC()); ++ raise_exception(env, 0x1a0, GETPC()); + } + +-void helper_raise_fpu_disable(void) ++void helper_raise_fpu_disable(CPUSH4State *env) + { +- raise_exception(0x800, GETPC()); ++ raise_exception(env, 0x800, GETPC()); + } + +-void helper_raise_slot_fpu_disable(void) ++void helper_raise_slot_fpu_disable(CPUSH4State *env) + { +- raise_exception(0x820, GETPC()); ++ raise_exception(env, 0x820, GETPC()); + } + +-void helper_debug(void) ++void helper_debug(CPUSH4State *env) + { + env->exception_index = EXCP_DEBUG; + cpu_loop_exit(env); + } + +-void helper_sleep(uint32_t next_pc) ++void helper_sleep(CPUSH4State *env, uint32_t next_pc) + { + env->halted = 1; + env->in_sleep = 1; +@@ -124,13 +120,13 @@ void helper_sleep(uint32_t next_pc) + cpu_loop_exit(env); + } + +-void helper_trapa(uint32_t tra) ++void helper_trapa(CPUSH4State *env, uint32_t tra) + { + env->tra = tra << 2; +- raise_exception(0x160, GETPC()); ++ raise_exception(env, 0x160, GETPC()); + } + +-void helper_movcal(uint32_t address, uint32_t value) ++void helper_movcal(CPUSH4State *env, uint32_t address, uint32_t value) + { + if (cpu_sh4_is_cached (env, address)) + { +@@ -144,7 +140,7 @@ void helper_movcal(uint32_t address, uint32_t value) + } + } + +-void helper_discard_movcal_backup(void) ++void helper_discard_movcal_backup(CPUSH4State *env) + { + memory_content *current = env->movcal_backup; + +@@ -158,7 +154,7 @@ void helper_discard_movcal_backup(void) + } + } + +-void helper_ocbi(uint32_t address) ++void helper_ocbi(CPUSH4State *env, uint32_t address) + { + memory_content **current = &(env->movcal_backup); + while (*current) +@@ -167,7 +163,7 @@ void helper_ocbi(uint32_t address) + if ((a & ~0x1F) == (address & ~0x1F)) + { + memory_content *next = (*current)->next; +- stl(a, (*current)->value); ++ cpu_stl_data(env, a, (*current)->value); + + if (next == NULL) + { +@@ -181,7 +177,7 @@ void helper_ocbi(uint32_t address) + } + } + +-uint32_t helper_addc(uint32_t arg0, uint32_t arg1) ++uint32_t helper_addc(CPUSH4State *env, uint32_t arg0, uint32_t arg1) + { + uint32_t tmp0, tmp1; + +@@ -197,7 +193,7 @@ uint32_t helper_addc(uint32_t arg0, uint32_t arg1) + return arg1; + } + +-uint32_t helper_addv(uint32_t arg0, uint32_t arg1) ++uint32_t helper_addv(CPUSH4State *env, uint32_t arg0, uint32_t arg1) + { + uint32_t dest, src, ans; + +@@ -236,7 +232,7 @@ uint32_t helper_addv(uint32_t arg0, uint32_t arg1) + #define SETM env->sr |= SR_M + #define CLRM env->sr &= ~SR_M + +-uint32_t helper_div1(uint32_t arg0, uint32_t arg1) ++uint32_t helper_div1(CPUSH4State *env, uint32_t arg0, uint32_t arg1) + { + uint32_t tmp0, tmp2; + uint8_t old_q, tmp1 = 0xff; +@@ -344,7 +340,7 @@ uint32_t helper_div1(uint32_t arg0, uint32_t arg1) + return arg1; + } + +-void helper_macl(uint32_t arg0, uint32_t arg1) ++void helper_macl(CPUSH4State *env, uint32_t arg0, uint32_t arg1) + { + int64_t res; + +@@ -360,7 +356,7 @@ void helper_macl(uint32_t arg0, uint32_t arg1) + } + } + +-void helper_macw(uint32_t arg0, uint32_t arg1) ++void helper_macw(CPUSH4State *env, uint32_t arg0, uint32_t arg1) + { + int64_t res; + +@@ -379,7 +375,7 @@ void helper_macw(uint32_t arg0, uint32_t arg1) + } + } + +-uint32_t helper_subc(uint32_t arg0, uint32_t arg1) ++uint32_t helper_subc(CPUSH4State *env, uint32_t arg0, uint32_t arg1) + { + uint32_t tmp0, tmp1; + +@@ -395,7 +391,7 @@ uint32_t helper_subc(uint32_t arg0, uint32_t arg1) + return arg1; + } + +-uint32_t helper_subv(uint32_t arg0, uint32_t arg1) ++uint32_t helper_subv(CPUSH4State *env, uint32_t arg0, uint32_t arg1) + { + int32_t dest, src, ans; + +@@ -424,17 +420,17 @@ uint32_t helper_subv(uint32_t arg0, uint32_t arg1) + return arg1; + } + +-static inline void set_t(void) ++static inline void set_t(CPUSH4State *env) + { + env->sr |= SR_T; + } + +-static inline void clr_t(void) ++static inline void clr_t(CPUSH4State *env) + { + env->sr &= ~SR_T; + } + +-void helper_ld_fpscr(uint32_t val) ++void helper_ld_fpscr(CPUSH4State *env, uint32_t val) + { + env->fpscr = val & FPSCR_MASK; + if ((val & FPSCR_RM_MASK) == FPSCR_RM_ZERO) { +@@ -445,7 +441,7 @@ void helper_ld_fpscr(uint32_t val) + set_flush_to_zero((val & FPSCR_DN) != 0, &env->fp_status); + } + +-static void update_fpscr(uintptr_t retaddr) ++static void update_fpscr(CPUSH4State *env, uintptr_t retaddr) + { + int xcpt, cause, enable; + +@@ -479,7 +475,7 @@ static void update_fpscr(uintptr_t retaddr) + cause = (env->fpscr & FPSCR_CAUSE_MASK) >> FPSCR_CAUSE_SHIFT; + enable = (env->fpscr & FPSCR_ENABLE_MASK) >> FPSCR_ENABLE_SHIFT; + if (cause & enable) { +- cpu_restore_state_from_retaddr(retaddr); ++ cpu_restore_state_from_retaddr(env, retaddr); + env->exception_index = 0x120; + cpu_loop_exit(env); + } +@@ -496,156 +492,156 @@ float64 helper_fabs_DT(float64 t0) + return float64_abs(t0); + } + +-float32 helper_fadd_FT(float32 t0, float32 t1) ++float32 helper_fadd_FT(CPUSH4State *env, float32 t0, float32 t1) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float32_add(t0, t1, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-float64 helper_fadd_DT(float64 t0, float64 t1) ++float64 helper_fadd_DT(CPUSH4State *env, float64 t0, float64 t1) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float64_add(t0, t1, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-void helper_fcmp_eq_FT(float32 t0, float32 t1) ++void helper_fcmp_eq_FT(CPUSH4State *env, float32 t0, float32 t1) + { + int relation; + + set_float_exception_flags(0, &env->fp_status); + relation = float32_compare(t0, t1, &env->fp_status); + if (unlikely(relation == float_relation_unordered)) { +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + } else if (relation == float_relation_equal) { +- set_t(); ++ set_t(env); + } else { +- clr_t(); ++ clr_t(env); + } + } + +-void helper_fcmp_eq_DT(float64 t0, float64 t1) ++void helper_fcmp_eq_DT(CPUSH4State *env, float64 t0, float64 t1) + { + int relation; + + set_float_exception_flags(0, &env->fp_status); + relation = float64_compare(t0, t1, &env->fp_status); + if (unlikely(relation == float_relation_unordered)) { +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + } else if (relation == float_relation_equal) { +- set_t(); ++ set_t(env); + } else { +- clr_t(); ++ clr_t(env); + } + } + +-void helper_fcmp_gt_FT(float32 t0, float32 t1) ++void helper_fcmp_gt_FT(CPUSH4State *env, float32 t0, float32 t1) + { + int relation; + + set_float_exception_flags(0, &env->fp_status); + relation = float32_compare(t0, t1, &env->fp_status); + if (unlikely(relation == float_relation_unordered)) { +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + } else if (relation == float_relation_greater) { +- set_t(); ++ set_t(env); + } else { +- clr_t(); ++ clr_t(env); + } + } + +-void helper_fcmp_gt_DT(float64 t0, float64 t1) ++void helper_fcmp_gt_DT(CPUSH4State *env, float64 t0, float64 t1) + { + int relation; + + set_float_exception_flags(0, &env->fp_status); + relation = float64_compare(t0, t1, &env->fp_status); + if (unlikely(relation == float_relation_unordered)) { +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + } else if (relation == float_relation_greater) { +- set_t(); ++ set_t(env); + } else { +- clr_t(); ++ clr_t(env); + } + } + +-float64 helper_fcnvsd_FT_DT(float32 t0) ++float64 helper_fcnvsd_FT_DT(CPUSH4State *env, float32 t0) + { + float64 ret; + set_float_exception_flags(0, &env->fp_status); + ret = float32_to_float64(t0, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return ret; + } + +-float32 helper_fcnvds_DT_FT(float64 t0) ++float32 helper_fcnvds_DT_FT(CPUSH4State *env, float64 t0) + { + float32 ret; + set_float_exception_flags(0, &env->fp_status); + ret = float64_to_float32(t0, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return ret; + } + +-float32 helper_fdiv_FT(float32 t0, float32 t1) ++float32 helper_fdiv_FT(CPUSH4State *env, float32 t0, float32 t1) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float32_div(t0, t1, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-float64 helper_fdiv_DT(float64 t0, float64 t1) ++float64 helper_fdiv_DT(CPUSH4State *env, float64 t0, float64 t1) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float64_div(t0, t1, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-float32 helper_float_FT(uint32_t t0) ++float32 helper_float_FT(CPUSH4State *env, uint32_t t0) + { + float32 ret; + set_float_exception_flags(0, &env->fp_status); + ret = int32_to_float32(t0, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return ret; + } + +-float64 helper_float_DT(uint32_t t0) ++float64 helper_float_DT(CPUSH4State *env, uint32_t t0) + { + float64 ret; + set_float_exception_flags(0, &env->fp_status); + ret = int32_to_float64(t0, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return ret; + } + +-float32 helper_fmac_FT(float32 t0, float32 t1, float32 t2) ++float32 helper_fmac_FT(CPUSH4State *env, float32 t0, float32 t1, float32 t2) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float32_mul(t0, t1, &env->fp_status); + t0 = float32_add(t0, t2, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-float32 helper_fmul_FT(float32 t0, float32 t1) ++float32 helper_fmul_FT(CPUSH4State *env, float32 t0, float32 t1) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float32_mul(t0, t1, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-float64 helper_fmul_DT(float64 t0, float64 t1) ++float64 helper_fmul_DT(CPUSH4State *env, float64 t0, float64 t1) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float64_mul(t0, t1, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +@@ -654,57 +650,57 @@ float32 helper_fneg_T(float32 t0) + return float32_chs(t0); + } + +-float32 helper_fsqrt_FT(float32 t0) ++float32 helper_fsqrt_FT(CPUSH4State *env, float32 t0) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float32_sqrt(t0, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-float64 helper_fsqrt_DT(float64 t0) ++float64 helper_fsqrt_DT(CPUSH4State *env, float64 t0) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float64_sqrt(t0, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-float32 helper_fsub_FT(float32 t0, float32 t1) ++float32 helper_fsub_FT(CPUSH4State *env, float32 t0, float32 t1) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float32_sub(t0, t1, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-float64 helper_fsub_DT(float64 t0, float64 t1) ++float64 helper_fsub_DT(CPUSH4State *env, float64 t0, float64 t1) + { + set_float_exception_flags(0, &env->fp_status); + t0 = float64_sub(t0, t1, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return t0; + } + +-uint32_t helper_ftrc_FT(float32 t0) ++uint32_t helper_ftrc_FT(CPUSH4State *env, float32 t0) + { + uint32_t ret; + set_float_exception_flags(0, &env->fp_status); + ret = float32_to_int32_round_to_zero(t0, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return ret; + } + +-uint32_t helper_ftrc_DT(float64 t0) ++uint32_t helper_ftrc_DT(CPUSH4State *env, float64 t0) + { + uint32_t ret; + set_float_exception_flags(0, &env->fp_status); + ret = float64_to_int32_round_to_zero(t0, &env->fp_status); +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + return ret; + } + +-void helper_fipr(uint32_t m, uint32_t n) ++void helper_fipr(CPUSH4State *env, uint32_t m, uint32_t n) + { + int bank, i; + float32 r, p; +@@ -719,12 +715,12 @@ void helper_fipr(uint32_t m, uint32_t n) + &env->fp_status); + r = float32_add(r, p, &env->fp_status); + } +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + + env->fregs[bank + n + 3] = r; + } + +-void helper_ftrv(uint32_t n) ++void helper_ftrv(CPUSH4State *env, uint32_t n) + { + int bank_matrix, bank_vector; + int i, j; +@@ -743,7 +739,7 @@ void helper_ftrv(uint32_t n) + r[i] = float32_add(r[i], p, &env->fp_status); + } + } +- update_fpscr(GETPC()); ++ update_fpscr(env, GETPC()); + + for (i = 0 ; i < 4 ; i++) { + env->fregs[bank_vector + i] = r[i]; +diff --git a/target-sh4/translate.c b/target-sh4/translate.c +index 6532ad2..d05c74c 100644 +--- a/target-sh4/translate.c ++++ b/target-sh4/translate.c +@@ -276,7 +276,7 @@ static void gen_goto_tb(DisasContext * ctx, int n, target_ulong dest) + } else { + tcg_gen_movi_i32(cpu_pc, dest); + if (ctx->singlestep_enabled) +- gen_helper_debug(); ++ gen_helper_debug(cpu_env); + tcg_gen_exit_tb(0); + } + } +@@ -288,7 +288,7 @@ static void gen_jump(DisasContext * ctx) + delayed jump as immediate jump are conditinal jumps */ + tcg_gen_mov_i32(cpu_pc, cpu_delayed_pc); + if (ctx->singlestep_enabled) +- gen_helper_debug(); ++ gen_helper_debug(cpu_env); + tcg_gen_exit_tb(0); + } else { + gen_goto_tb(ctx, 0, ctx->delayed_pc); +@@ -437,7 +437,7 @@ static inline void gen_store_fpr64 (TCGv_i64 t, int reg) + #define CHECK_NOT_DELAY_SLOT \ + if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) \ + { \ +- gen_helper_raise_slot_illegal_instruction(); \ ++ gen_helper_raise_slot_illegal_instruction(cpu_env); \ + ctx->bstate = BS_EXCP; \ + return; \ + } +@@ -445,9 +445,9 @@ static inline void gen_store_fpr64 (TCGv_i64 t, int reg) + #define CHECK_PRIVILEGED \ + if (IS_USER(ctx)) { \ + if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) { \ +- gen_helper_raise_slot_illegal_instruction(); \ ++ gen_helper_raise_slot_illegal_instruction(cpu_env); \ + } else { \ +- gen_helper_raise_illegal_instruction(); \ ++ gen_helper_raise_illegal_instruction(cpu_env); \ + } \ + ctx->bstate = BS_EXCP; \ + return; \ +@@ -456,9 +456,9 @@ static inline void gen_store_fpr64 (TCGv_i64 t, int reg) + #define CHECK_FPU_ENABLED \ + if (ctx->flags & SR_FD) { \ + if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) { \ +- gen_helper_raise_slot_fpu_disable(); \ ++ gen_helper_raise_slot_fpu_disable(cpu_env); \ + } else { \ +- gen_helper_raise_fpu_disable(); \ ++ gen_helper_raise_fpu_disable(cpu_env); \ + } \ + ctx->bstate = BS_EXCP; \ + return; \ +@@ -492,7 +492,7 @@ static void _decode_opc(DisasContext * ctx) + if (opcode != 0x0093 /* ocbi */ + && opcode != 0x00c3 /* movca.l */) + { +- gen_helper_discard_movcal_backup (); ++ gen_helper_discard_movcal_backup(cpu_env); + ctx->has_movcal = 0; + } + } +@@ -523,7 +523,7 @@ static void _decode_opc(DisasContext * ctx) + return; + case 0x0038: /* ldtlb */ + CHECK_PRIVILEGED +- gen_helper_ldtlb(); ++ gen_helper_ldtlb(cpu_env); + return; + case 0x002b: /* rte */ + CHECK_PRIVILEGED +@@ -551,7 +551,7 @@ static void _decode_opc(DisasContext * ctx) + return; + case 0x001b: /* sleep */ + CHECK_PRIVILEGED +- gen_helper_sleep(tcg_const_i32(ctx->pc + 2)); ++ gen_helper_sleep(cpu_env, tcg_const_i32(ctx->pc + 2)); + return; + } + +@@ -761,10 +761,10 @@ static void _decode_opc(DisasContext * ctx) + tcg_gen_add_i32(REG(B11_8), REG(B11_8), REG(B7_4)); + return; + case 0x300e: /* addc Rm,Rn */ +- gen_helper_addc(REG(B11_8), REG(B7_4), REG(B11_8)); ++ gen_helper_addc(REG(B11_8), cpu_env, REG(B7_4), REG(B11_8)); + return; + case 0x300f: /* addv Rm,Rn */ +- gen_helper_addv(REG(B11_8), REG(B7_4), REG(B11_8)); ++ gen_helper_addv(REG(B11_8), cpu_env, REG(B7_4), REG(B11_8)); + return; + case 0x2009: /* and Rm,Rn */ + tcg_gen_and_i32(REG(B11_8), REG(B11_8), REG(B7_4)); +@@ -817,7 +817,7 @@ static void _decode_opc(DisasContext * ctx) + } + return; + case 0x3004: /* div1 Rm,Rn */ +- gen_helper_div1(REG(B11_8), REG(B7_4), REG(B11_8)); ++ gen_helper_div1(REG(B11_8), cpu_env, REG(B7_4), REG(B11_8)); + return; + case 0x300d: /* dmuls.l Rm,Rn */ + { +@@ -870,7 +870,7 @@ static void _decode_opc(DisasContext * ctx) + tcg_gen_qemu_ld32s(arg0, REG(B7_4), ctx->memidx); + arg1 = tcg_temp_new(); + tcg_gen_qemu_ld32s(arg1, REG(B11_8), ctx->memidx); +- gen_helper_macl(arg0, arg1); ++ gen_helper_macl(cpu_env, arg0, arg1); + tcg_temp_free(arg1); + tcg_temp_free(arg0); + tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4); +@@ -884,7 +884,7 @@ static void _decode_opc(DisasContext * ctx) + tcg_gen_qemu_ld32s(arg0, REG(B7_4), ctx->memidx); + arg1 = tcg_temp_new(); + tcg_gen_qemu_ld32s(arg1, REG(B11_8), ctx->memidx); +- gen_helper_macw(arg0, arg1); ++ gen_helper_macw(cpu_env, arg0, arg1); + tcg_temp_free(arg1); + tcg_temp_free(arg0); + tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 2); +@@ -1013,10 +1013,10 @@ static void _decode_opc(DisasContext * ctx) + tcg_gen_sub_i32(REG(B11_8), REG(B11_8), REG(B7_4)); + return; + case 0x300a: /* subc Rm,Rn */ +- gen_helper_subc(REG(B11_8), REG(B7_4), REG(B11_8)); ++ gen_helper_subc(REG(B11_8), cpu_env, REG(B7_4), REG(B11_8)); + return; + case 0x300b: /* subv Rm,Rn */ +- gen_helper_subv(REG(B11_8), REG(B7_4), REG(B11_8)); ++ gen_helper_subv(REG(B11_8), cpu_env, REG(B7_4), REG(B11_8)); + return; + case 0x2008: /* tst Rm,Rn */ + { +@@ -1152,22 +1152,22 @@ static void _decode_opc(DisasContext * ctx) + gen_load_fpr64(fp1, DREG(B7_4)); + switch (ctx->opcode & 0xf00f) { + case 0xf000: /* fadd Rm,Rn */ +- gen_helper_fadd_DT(fp0, fp0, fp1); ++ gen_helper_fadd_DT(fp0, cpu_env, fp0, fp1); + break; + case 0xf001: /* fsub Rm,Rn */ +- gen_helper_fsub_DT(fp0, fp0, fp1); ++ gen_helper_fsub_DT(fp0, cpu_env, fp0, fp1); + break; + case 0xf002: /* fmul Rm,Rn */ +- gen_helper_fmul_DT(fp0, fp0, fp1); ++ gen_helper_fmul_DT(fp0, cpu_env, fp0, fp1); + break; + case 0xf003: /* fdiv Rm,Rn */ +- gen_helper_fdiv_DT(fp0, fp0, fp1); ++ gen_helper_fdiv_DT(fp0, cpu_env, fp0, fp1); + break; + case 0xf004: /* fcmp/eq Rm,Rn */ +- gen_helper_fcmp_eq_DT(fp0, fp1); ++ gen_helper_fcmp_eq_DT(cpu_env, fp0, fp1); + return; + case 0xf005: /* fcmp/gt Rm,Rn */ +- gen_helper_fcmp_gt_DT(fp0, fp1); ++ gen_helper_fcmp_gt_DT(cpu_env, fp0, fp1); + return; + } + gen_store_fpr64(fp0, DREG(B11_8)); +@@ -1176,22 +1176,32 @@ static void _decode_opc(DisasContext * ctx) + } else { + switch (ctx->opcode & 0xf00f) { + case 0xf000: /* fadd Rm,Rn */ +- gen_helper_fadd_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); ++ gen_helper_fadd_FT(cpu_fregs[FREG(B11_8)], cpu_env, ++ cpu_fregs[FREG(B11_8)], ++ cpu_fregs[FREG(B7_4)]); + break; + case 0xf001: /* fsub Rm,Rn */ +- gen_helper_fsub_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); ++ gen_helper_fsub_FT(cpu_fregs[FREG(B11_8)], cpu_env, ++ cpu_fregs[FREG(B11_8)], ++ cpu_fregs[FREG(B7_4)]); + break; + case 0xf002: /* fmul Rm,Rn */ +- gen_helper_fmul_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); ++ gen_helper_fmul_FT(cpu_fregs[FREG(B11_8)], cpu_env, ++ cpu_fregs[FREG(B11_8)], ++ cpu_fregs[FREG(B7_4)]); + break; + case 0xf003: /* fdiv Rm,Rn */ +- gen_helper_fdiv_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); ++ gen_helper_fdiv_FT(cpu_fregs[FREG(B11_8)], cpu_env, ++ cpu_fregs[FREG(B11_8)], ++ cpu_fregs[FREG(B7_4)]); + break; + case 0xf004: /* fcmp/eq Rm,Rn */ +- gen_helper_fcmp_eq_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); ++ gen_helper_fcmp_eq_FT(cpu_env, cpu_fregs[FREG(B11_8)], ++ cpu_fregs[FREG(B7_4)]); + return; + case 0xf005: /* fcmp/gt Rm,Rn */ +- gen_helper_fcmp_gt_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]); ++ gen_helper_fcmp_gt_FT(cpu_env, cpu_fregs[FREG(B11_8)], ++ cpu_fregs[FREG(B7_4)]); + return; + } + } +@@ -1203,8 +1213,9 @@ static void _decode_opc(DisasContext * ctx) + if (ctx->fpscr & FPSCR_PR) { + break; /* illegal instruction */ + } else { +- gen_helper_fmac_FT(cpu_fregs[FREG(B11_8)], +- cpu_fregs[FREG(0)], cpu_fregs[FREG(B7_4)], cpu_fregs[FREG(B11_8)]); ++ gen_helper_fmac_FT(cpu_fregs[FREG(B11_8)], cpu_env, ++ cpu_fregs[FREG(0)], cpu_fregs[FREG(B7_4)], ++ cpu_fregs[FREG(B11_8)]); + return; + } + } +@@ -1356,7 +1367,7 @@ static void _decode_opc(DisasContext * ctx) + TCGv imm; + CHECK_NOT_DELAY_SLOT + imm = tcg_const_i32(B7_0); +- gen_helper_trapa(imm); ++ gen_helper_trapa(cpu_env, imm); + tcg_temp_free(imm); + ctx->bstate = BS_BRANCH; + } +@@ -1531,7 +1542,7 @@ static void _decode_opc(DisasContext * ctx) + LDST(fpul, 0x405a, 0x4056, 0x005a, 0x4052, {CHECK_FPU_ENABLED}) + case 0x406a: /* lds Rm,FPSCR */ + CHECK_FPU_ENABLED +- gen_helper_ld_fpscr(REG(B11_8)); ++ gen_helper_ld_fpscr(cpu_env, REG(B11_8)); + ctx->bstate = BS_STOP; + return; + case 0x4066: /* lds.l @Rm+,FPSCR */ +@@ -1540,7 +1551,7 @@ static void _decode_opc(DisasContext * ctx) + TCGv addr = tcg_temp_new(); + tcg_gen_qemu_ld32s(addr, REG(B11_8), ctx->memidx); + tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4); +- gen_helper_ld_fpscr(addr); ++ gen_helper_ld_fpscr(cpu_env, addr); + tcg_temp_free(addr); + ctx->bstate = BS_STOP; + } +@@ -1567,7 +1578,7 @@ static void _decode_opc(DisasContext * ctx) + { + TCGv val = tcg_temp_new(); + tcg_gen_qemu_ld32u(val, REG(B11_8), ctx->memidx); +- gen_helper_movcal (REG(B11_8), val); ++ gen_helper_movcal(cpu_env, REG(B11_8), val); + tcg_gen_qemu_st32(REG(0), REG(B11_8), ctx->memidx); + } + ctx->has_movcal = 1; +@@ -1619,7 +1630,7 @@ static void _decode_opc(DisasContext * ctx) + break; + case 0x0093: /* ocbi @Rn */ + { +- gen_helper_ocbi (REG(B11_8)); ++ gen_helper_ocbi(cpu_env, REG(B11_8)); + } + return; + case 0x00a3: /* ocbp @Rn */ +@@ -1733,12 +1744,12 @@ static void _decode_opc(DisasContext * ctx) + if (ctx->opcode & 0x0100) + break; /* illegal instruction */ + fp = tcg_temp_new_i64(); +- gen_helper_float_DT(fp, cpu_fpul); ++ gen_helper_float_DT(fp, cpu_env, cpu_fpul); + gen_store_fpr64(fp, DREG(B11_8)); + tcg_temp_free_i64(fp); + } + else { +- gen_helper_float_FT(cpu_fregs[FREG(B11_8)], cpu_fpul); ++ gen_helper_float_FT(cpu_fregs[FREG(B11_8)], cpu_env, cpu_fpul); + } + return; + case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */ +@@ -1749,11 +1760,11 @@ static void _decode_opc(DisasContext * ctx) + break; /* illegal instruction */ + fp = tcg_temp_new_i64(); + gen_load_fpr64(fp, DREG(B11_8)); +- gen_helper_ftrc_DT(cpu_fpul, fp); ++ gen_helper_ftrc_DT(cpu_fpul, cpu_env, fp); + tcg_temp_free_i64(fp); + } + else { +- gen_helper_ftrc_FT(cpu_fpul, cpu_fregs[FREG(B11_8)]); ++ gen_helper_ftrc_FT(cpu_fpul, cpu_env, cpu_fregs[FREG(B11_8)]); + } + return; + case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */ +@@ -1783,11 +1794,12 @@ static void _decode_opc(DisasContext * ctx) + break; /* illegal instruction */ + TCGv_i64 fp = tcg_temp_new_i64(); + gen_load_fpr64(fp, DREG(B11_8)); +- gen_helper_fsqrt_DT(fp, fp); ++ gen_helper_fsqrt_DT(fp, cpu_env, fp); + gen_store_fpr64(fp, DREG(B11_8)); + tcg_temp_free_i64(fp); + } else { +- gen_helper_fsqrt_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)]); ++ gen_helper_fsqrt_FT(cpu_fregs[FREG(B11_8)], cpu_env, ++ cpu_fregs[FREG(B11_8)]); + } + return; + case 0xf07d: /* fsrra FRn */ +@@ -1809,7 +1821,7 @@ static void _decode_opc(DisasContext * ctx) + CHECK_FPU_ENABLED + { + TCGv_i64 fp = tcg_temp_new_i64(); +- gen_helper_fcnvsd_FT_DT(fp, cpu_fpul); ++ gen_helper_fcnvsd_FT_DT(fp, cpu_env, cpu_fpul); + gen_store_fpr64(fp, DREG(B11_8)); + tcg_temp_free_i64(fp); + } +@@ -1819,7 +1831,7 @@ static void _decode_opc(DisasContext * ctx) + { + TCGv_i64 fp = tcg_temp_new_i64(); + gen_load_fpr64(fp, DREG(B11_8)); +- gen_helper_fcnvds_DT_FT(cpu_fpul, fp); ++ gen_helper_fcnvds_DT_FT(cpu_fpul, cpu_env, fp); + tcg_temp_free_i64(fp); + } + return; +@@ -1829,7 +1841,7 @@ static void _decode_opc(DisasContext * ctx) + TCGv m, n; + m = tcg_const_i32((ctx->opcode >> 8) & 3); + n = tcg_const_i32((ctx->opcode >> 10) & 3); +- gen_helper_fipr(m, n); ++ gen_helper_fipr(cpu_env, m, n); + tcg_temp_free(m); + tcg_temp_free(n); + return; +@@ -1841,7 +1853,7 @@ static void _decode_opc(DisasContext * ctx) + (ctx->fpscr & FPSCR_PR) == 0) { + TCGv n; + n = tcg_const_i32((ctx->opcode >> 10) & 3); +- gen_helper_ftrv(n); ++ gen_helper_ftrv(cpu_env, n); + tcg_temp_free(n); + return; + } +@@ -1853,9 +1865,9 @@ static void _decode_opc(DisasContext * ctx) + fflush(stderr); + #endif + if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) { +- gen_helper_raise_slot_illegal_instruction(); ++ gen_helper_raise_slot_illegal_instruction(cpu_env); + } else { +- gen_helper_raise_illegal_instruction(); ++ gen_helper_raise_illegal_instruction(cpu_env); + } + ctx->bstate = BS_EXCP; + } +@@ -1934,7 +1946,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb, + if (ctx.pc == bp->pc) { + /* We have hit a breakpoint - make sure PC is up-to-date */ + tcg_gen_movi_i32(cpu_pc, ctx.pc); +- gen_helper_debug(); ++ gen_helper_debug(cpu_env); + ctx.bstate = BS_EXCP; + break; + } +@@ -1958,7 +1970,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb, + fprintf(stderr, "Loading opcode at address 0x%08x\n", ctx.pc); + fflush(stderr); + #endif +- ctx.opcode = lduw_code(ctx.pc); ++ ctx.opcode = cpu_lduw_code(env, ctx.pc); + decode_opc(&ctx); + num_insns++; + ctx.pc += 2; +@@ -1975,7 +1987,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb, + gen_io_end(); + if (env->singlestep_enabled) { + tcg_gen_movi_i32(cpu_pc, ctx.pc); +- gen_helper_debug(); ++ gen_helper_debug(cpu_env); + } else { + switch (ctx.bstate) { + case BS_STOP: +-- +1.7.12.1 + diff --git a/0038-target-mips-switch-to-AREG0-free-mode.patch b/0038-target-mips-switch-to-AREG0-free-mode.patch new file mode 100644 index 0000000..6c8ea5a --- /dev/null +++ b/0038-target-mips-switch-to-AREG0-free-mode.patch @@ -0,0 +1,6336 @@ +From 8ad14b12fbe7555da2b2f0f1f28e07b8a34b686c Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 14:52:59 +0000 +Subject: [PATCH] target-mips: switch to AREG0 free mode + +Add an explicit CPUState parameter instead of relying on AREG0 +and switch to AREG0 free mode. + +Signed-off-by: Blue Swirl +Acked-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + configure | 2 +- + target-mips/Makefile.objs | 2 - + target-mips/cpu.h | 16 +- + target-mips/helper.h | 410 ++++++++--------- + target-mips/op_helper.c | 1065 ++++++++++++++++++++++++--------------------- + target-mips/translate.c | 754 ++++++++++++++++---------------- + 6 files changed, 1163 insertions(+), 1086 deletions(-) + +diff --git a/configure b/configure +index 03ce76e..83b068d 100755 +--- a/configure ++++ b/configure +@@ -3839,7 +3839,7 @@ symlink "$source_path/Makefile.target" "$target_dir/Makefile" + + + case "$target_arch2" in +- alpha | arm* | cris | i386 | lm32 | m68k | microblaze* | or32 | s390x | sh4* | sparc* | unicore32 | x86_64 | xtensa* | ppc*) ++ alpha | arm* | cris | i386 | lm32 | m68k | microblaze* | mips* | or32 | s390x | sh4* | sparc* | unicore32 | x86_64 | xtensa* | ppc*) + echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak + ;; + esac +diff --git a/target-mips/Makefile.objs b/target-mips/Makefile.objs +index 2e0e093..ca20f21 100644 +--- a/target-mips/Makefile.objs ++++ b/target-mips/Makefile.objs +@@ -1,4 +1,2 @@ + obj-y += translate.o op_helper.o helper.o cpu.o + obj-$(CONFIG_SOFTMMU) += machine.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/target-mips/cpu.h b/target-mips/cpu.h +index ce3467f..be4f805 100644 +--- a/target-mips/cpu.h ++++ b/target-mips/cpu.h +@@ -38,10 +38,10 @@ struct CPUMIPSTLBContext { + uint32_t nb_tlb; + uint32_t tlb_in_use; + int (*map_address) (struct CPUMIPSState *env, target_phys_addr_t *physical, int *prot, target_ulong address, int rw, int access_type); +- void (*helper_tlbwi) (void); +- void (*helper_tlbwr) (void); +- void (*helper_tlbp) (void); +- void (*helper_tlbr) (void); ++ void (*helper_tlbwi)(struct CPUMIPSState *env); ++ void (*helper_tlbwr)(struct CPUMIPSState *env); ++ void (*helper_tlbp)(struct CPUMIPSState *env); ++ void (*helper_tlbr)(struct CPUMIPSState *env); + union { + struct { + r4k_tlb_t tlb[MIPS_TLB_MAX]; +@@ -485,10 +485,10 @@ int fixed_mmu_map_address (CPUMIPSState *env, target_phys_addr_t *physical, int + target_ulong address, int rw, int access_type); + int r4k_map_address (CPUMIPSState *env, target_phys_addr_t *physical, int *prot, + target_ulong address, int rw, int access_type); +-void r4k_helper_tlbwi (void); +-void r4k_helper_tlbwr (void); +-void r4k_helper_tlbp (void); +-void r4k_helper_tlbr (void); ++void r4k_helper_tlbwi(CPUMIPSState *env); ++void r4k_helper_tlbwr(CPUMIPSState *env); ++void r4k_helper_tlbp(CPUMIPSState *env); ++void r4k_helper_tlbr(CPUMIPSState *env); + + void cpu_unassigned_access(CPUMIPSState *env, target_phys_addr_t addr, + int is_write, int is_exec, int unused, int size); +diff --git a/target-mips/helper.h b/target-mips/helper.h +index 76fb451..109ac37 100644 +--- a/target-mips/helper.h ++++ b/target-mips/helper.h +@@ -1,25 +1,25 @@ + #include "def-helper.h" + +-DEF_HELPER_2(raise_exception_err, noreturn, i32, int) +-DEF_HELPER_1(raise_exception, noreturn, i32) ++DEF_HELPER_3(raise_exception_err, noreturn, env, i32, int) ++DEF_HELPER_2(raise_exception, noreturn, env, i32) + + #ifdef TARGET_MIPS64 +-DEF_HELPER_3(ldl, tl, tl, tl, int) +-DEF_HELPER_3(ldr, tl, tl, tl, int) +-DEF_HELPER_3(sdl, void, tl, tl, int) +-DEF_HELPER_3(sdr, void, tl, tl, int) ++DEF_HELPER_4(ldl, tl, env, tl, tl, int) ++DEF_HELPER_4(ldr, tl, env, tl, tl, int) ++DEF_HELPER_4(sdl, void, env, tl, tl, int) ++DEF_HELPER_4(sdr, void, env, tl, tl, int) + #endif +-DEF_HELPER_3(lwl, tl, tl, tl, int) +-DEF_HELPER_3(lwr, tl, tl, tl, int) +-DEF_HELPER_3(swl, void, tl, tl, int) +-DEF_HELPER_3(swr, void, tl, tl, int) ++DEF_HELPER_4(lwl, tl, env, tl, tl, int) ++DEF_HELPER_4(lwr, tl, env, tl, tl, int) ++DEF_HELPER_4(swl, void, env, tl, tl, int) ++DEF_HELPER_4(swr, void, env, tl, tl, int) + + #ifndef CONFIG_USER_ONLY +-DEF_HELPER_2(ll, tl, tl, int) +-DEF_HELPER_3(sc, tl, tl, tl, int) ++DEF_HELPER_3(ll, tl, env, tl, int) ++DEF_HELPER_4(sc, tl, env, tl, tl, int) + #ifdef TARGET_MIPS64 +-DEF_HELPER_2(lld, tl, tl, int) +-DEF_HELPER_3(scd, tl, tl, tl, int) ++DEF_HELPER_3(lld, tl, env, tl, int) ++DEF_HELPER_4(scd, tl, env, tl, tl, int) + #endif + #endif + +@@ -28,195 +28,195 @@ DEF_HELPER_FLAGS_1(clz, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl) + #ifdef TARGET_MIPS64 + DEF_HELPER_FLAGS_1(dclo, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl) + DEF_HELPER_FLAGS_1(dclz, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl) +-DEF_HELPER_2(dmult, void, tl, tl) +-DEF_HELPER_2(dmultu, void, tl, tl) ++DEF_HELPER_3(dmult, void, env, tl, tl) ++DEF_HELPER_3(dmultu, void, env, tl, tl) + #endif + +-DEF_HELPER_2(muls, tl, tl, tl) +-DEF_HELPER_2(mulsu, tl, tl, tl) +-DEF_HELPER_2(macc, tl, tl, tl) +-DEF_HELPER_2(maccu, tl, tl, tl) +-DEF_HELPER_2(msac, tl, tl, tl) +-DEF_HELPER_2(msacu, tl, tl, tl) +-DEF_HELPER_2(mulhi, tl, tl, tl) +-DEF_HELPER_2(mulhiu, tl, tl, tl) +-DEF_HELPER_2(mulshi, tl, tl, tl) +-DEF_HELPER_2(mulshiu, tl, tl, tl) +-DEF_HELPER_2(macchi, tl, tl, tl) +-DEF_HELPER_2(macchiu, tl, tl, tl) +-DEF_HELPER_2(msachi, tl, tl, tl) +-DEF_HELPER_2(msachiu, tl, tl, tl) ++DEF_HELPER_3(muls, tl, env, tl, tl) ++DEF_HELPER_3(mulsu, tl, env, tl, tl) ++DEF_HELPER_3(macc, tl, env, tl, tl) ++DEF_HELPER_3(maccu, tl, env, tl, tl) ++DEF_HELPER_3(msac, tl, env, tl, tl) ++DEF_HELPER_3(msacu, tl, env, tl, tl) ++DEF_HELPER_3(mulhi, tl, env, tl, tl) ++DEF_HELPER_3(mulhiu, tl, env, tl, tl) ++DEF_HELPER_3(mulshi, tl, env, tl, tl) ++DEF_HELPER_3(mulshiu, tl, env, tl, tl) ++DEF_HELPER_3(macchi, tl, env, tl, tl) ++DEF_HELPER_3(macchiu, tl, env, tl, tl) ++DEF_HELPER_3(msachi, tl, env, tl, tl) ++DEF_HELPER_3(msachiu, tl, env, tl, tl) + + #ifndef CONFIG_USER_ONLY + /* CP0 helpers */ +-DEF_HELPER_0(mfc0_mvpcontrol, tl) +-DEF_HELPER_0(mfc0_mvpconf0, tl) +-DEF_HELPER_0(mfc0_mvpconf1, tl) +-DEF_HELPER_0(mftc0_vpecontrol, tl) +-DEF_HELPER_0(mftc0_vpeconf0, tl) +-DEF_HELPER_0(mfc0_random, tl) +-DEF_HELPER_0(mfc0_tcstatus, tl) +-DEF_HELPER_0(mftc0_tcstatus, tl) +-DEF_HELPER_0(mfc0_tcbind, tl) +-DEF_HELPER_0(mftc0_tcbind, tl) +-DEF_HELPER_0(mfc0_tcrestart, tl) +-DEF_HELPER_0(mftc0_tcrestart, tl) +-DEF_HELPER_0(mfc0_tchalt, tl) +-DEF_HELPER_0(mftc0_tchalt, tl) +-DEF_HELPER_0(mfc0_tccontext, tl) +-DEF_HELPER_0(mftc0_tccontext, tl) +-DEF_HELPER_0(mfc0_tcschedule, tl) +-DEF_HELPER_0(mftc0_tcschedule, tl) +-DEF_HELPER_0(mfc0_tcschefback, tl) +-DEF_HELPER_0(mftc0_tcschefback, tl) +-DEF_HELPER_0(mfc0_count, tl) +-DEF_HELPER_0(mftc0_entryhi, tl) +-DEF_HELPER_0(mftc0_status, tl) +-DEF_HELPER_0(mftc0_cause, tl) +-DEF_HELPER_0(mftc0_epc, tl) +-DEF_HELPER_0(mftc0_ebase, tl) +-DEF_HELPER_1(mftc0_configx, tl, tl) +-DEF_HELPER_0(mfc0_lladdr, tl) +-DEF_HELPER_1(mfc0_watchlo, tl, i32) +-DEF_HELPER_1(mfc0_watchhi, tl, i32) +-DEF_HELPER_0(mfc0_debug, tl) +-DEF_HELPER_0(mftc0_debug, tl) ++DEF_HELPER_1(mfc0_mvpcontrol, tl, env) ++DEF_HELPER_1(mfc0_mvpconf0, tl, env) ++DEF_HELPER_1(mfc0_mvpconf1, tl, env) ++DEF_HELPER_1(mftc0_vpecontrol, tl, env) ++DEF_HELPER_1(mftc0_vpeconf0, tl, env) ++DEF_HELPER_1(mfc0_random, tl, env) ++DEF_HELPER_1(mfc0_tcstatus, tl, env) ++DEF_HELPER_1(mftc0_tcstatus, tl, env) ++DEF_HELPER_1(mfc0_tcbind, tl, env) ++DEF_HELPER_1(mftc0_tcbind, tl, env) ++DEF_HELPER_1(mfc0_tcrestart, tl, env) ++DEF_HELPER_1(mftc0_tcrestart, tl, env) ++DEF_HELPER_1(mfc0_tchalt, tl, env) ++DEF_HELPER_1(mftc0_tchalt, tl, env) ++DEF_HELPER_1(mfc0_tccontext, tl, env) ++DEF_HELPER_1(mftc0_tccontext, tl, env) ++DEF_HELPER_1(mfc0_tcschedule, tl, env) ++DEF_HELPER_1(mftc0_tcschedule, tl, env) ++DEF_HELPER_1(mfc0_tcschefback, tl, env) ++DEF_HELPER_1(mftc0_tcschefback, tl, env) ++DEF_HELPER_1(mfc0_count, tl, env) ++DEF_HELPER_1(mftc0_entryhi, tl, env) ++DEF_HELPER_1(mftc0_status, tl, env) ++DEF_HELPER_1(mftc0_cause, tl, env) ++DEF_HELPER_1(mftc0_epc, tl, env) ++DEF_HELPER_1(mftc0_ebase, tl, env) ++DEF_HELPER_2(mftc0_configx, tl, env, tl) ++DEF_HELPER_1(mfc0_lladdr, tl, env) ++DEF_HELPER_2(mfc0_watchlo, tl, env, i32) ++DEF_HELPER_2(mfc0_watchhi, tl, env, i32) ++DEF_HELPER_1(mfc0_debug, tl, env) ++DEF_HELPER_1(mftc0_debug, tl, env) + #ifdef TARGET_MIPS64 +-DEF_HELPER_0(dmfc0_tcrestart, tl) +-DEF_HELPER_0(dmfc0_tchalt, tl) +-DEF_HELPER_0(dmfc0_tccontext, tl) +-DEF_HELPER_0(dmfc0_tcschedule, tl) +-DEF_HELPER_0(dmfc0_tcschefback, tl) +-DEF_HELPER_0(dmfc0_lladdr, tl) +-DEF_HELPER_1(dmfc0_watchlo, tl, i32) ++DEF_HELPER_1(dmfc0_tcrestart, tl, env) ++DEF_HELPER_1(dmfc0_tchalt, tl, env) ++DEF_HELPER_1(dmfc0_tccontext, tl, env) ++DEF_HELPER_1(dmfc0_tcschedule, tl, env) ++DEF_HELPER_1(dmfc0_tcschefback, tl, env) ++DEF_HELPER_1(dmfc0_lladdr, tl, env) ++DEF_HELPER_2(dmfc0_watchlo, tl, env, i32) + #endif /* TARGET_MIPS64 */ + +-DEF_HELPER_1(mtc0_index, void, tl) +-DEF_HELPER_1(mtc0_mvpcontrol, void, tl) +-DEF_HELPER_1(mtc0_vpecontrol, void, tl) +-DEF_HELPER_1(mttc0_vpecontrol, void, tl) +-DEF_HELPER_1(mtc0_vpeconf0, void, tl) +-DEF_HELPER_1(mttc0_vpeconf0, void, tl) +-DEF_HELPER_1(mtc0_vpeconf1, void, tl) +-DEF_HELPER_1(mtc0_yqmask, void, tl) +-DEF_HELPER_1(mtc0_vpeopt, void, tl) +-DEF_HELPER_1(mtc0_entrylo0, void, tl) +-DEF_HELPER_1(mtc0_tcstatus, void, tl) +-DEF_HELPER_1(mttc0_tcstatus, void, tl) +-DEF_HELPER_1(mtc0_tcbind, void, tl) +-DEF_HELPER_1(mttc0_tcbind, void, tl) +-DEF_HELPER_1(mtc0_tcrestart, void, tl) +-DEF_HELPER_1(mttc0_tcrestart, void, tl) +-DEF_HELPER_1(mtc0_tchalt, void, tl) +-DEF_HELPER_1(mttc0_tchalt, void, tl) +-DEF_HELPER_1(mtc0_tccontext, void, tl) +-DEF_HELPER_1(mttc0_tccontext, void, tl) +-DEF_HELPER_1(mtc0_tcschedule, void, tl) +-DEF_HELPER_1(mttc0_tcschedule, void, tl) +-DEF_HELPER_1(mtc0_tcschefback, void, tl) +-DEF_HELPER_1(mttc0_tcschefback, void, tl) +-DEF_HELPER_1(mtc0_entrylo1, void, tl) +-DEF_HELPER_1(mtc0_context, void, tl) +-DEF_HELPER_1(mtc0_pagemask, void, tl) +-DEF_HELPER_1(mtc0_pagegrain, void, tl) +-DEF_HELPER_1(mtc0_wired, void, tl) +-DEF_HELPER_1(mtc0_srsconf0, void, tl) +-DEF_HELPER_1(mtc0_srsconf1, void, tl) +-DEF_HELPER_1(mtc0_srsconf2, void, tl) +-DEF_HELPER_1(mtc0_srsconf3, void, tl) +-DEF_HELPER_1(mtc0_srsconf4, void, tl) +-DEF_HELPER_1(mtc0_hwrena, void, tl) +-DEF_HELPER_1(mtc0_count, void, tl) +-DEF_HELPER_1(mtc0_entryhi, void, tl) +-DEF_HELPER_1(mttc0_entryhi, void, tl) +-DEF_HELPER_1(mtc0_compare, void, tl) +-DEF_HELPER_1(mtc0_status, void, tl) +-DEF_HELPER_1(mttc0_status, void, tl) +-DEF_HELPER_1(mtc0_intctl, void, tl) +-DEF_HELPER_1(mtc0_srsctl, void, tl) +-DEF_HELPER_1(mtc0_cause, void, tl) +-DEF_HELPER_1(mttc0_cause, void, tl) +-DEF_HELPER_1(mtc0_ebase, void, tl) +-DEF_HELPER_1(mttc0_ebase, void, tl) +-DEF_HELPER_1(mtc0_config0, void, tl) +-DEF_HELPER_1(mtc0_config2, void, tl) +-DEF_HELPER_1(mtc0_lladdr, void, tl) +-DEF_HELPER_2(mtc0_watchlo, void, tl, i32) +-DEF_HELPER_2(mtc0_watchhi, void, tl, i32) +-DEF_HELPER_1(mtc0_xcontext, void, tl) +-DEF_HELPER_1(mtc0_framemask, void, tl) +-DEF_HELPER_1(mtc0_debug, void, tl) +-DEF_HELPER_1(mttc0_debug, void, tl) +-DEF_HELPER_1(mtc0_performance0, void, tl) +-DEF_HELPER_1(mtc0_taglo, void, tl) +-DEF_HELPER_1(mtc0_datalo, void, tl) +-DEF_HELPER_1(mtc0_taghi, void, tl) +-DEF_HELPER_1(mtc0_datahi, void, tl) ++DEF_HELPER_2(mtc0_index, void, env, tl) ++DEF_HELPER_2(mtc0_mvpcontrol, void, env, tl) ++DEF_HELPER_2(mtc0_vpecontrol, void, env, tl) ++DEF_HELPER_2(mttc0_vpecontrol, void, env, tl) ++DEF_HELPER_2(mtc0_vpeconf0, void, env, tl) ++DEF_HELPER_2(mttc0_vpeconf0, void, env, tl) ++DEF_HELPER_2(mtc0_vpeconf1, void, env, tl) ++DEF_HELPER_2(mtc0_yqmask, void, env, tl) ++DEF_HELPER_2(mtc0_vpeopt, void, env, tl) ++DEF_HELPER_2(mtc0_entrylo0, void, env, tl) ++DEF_HELPER_2(mtc0_tcstatus, void, env, tl) ++DEF_HELPER_2(mttc0_tcstatus, void, env, tl) ++DEF_HELPER_2(mtc0_tcbind, void, env, tl) ++DEF_HELPER_2(mttc0_tcbind, void, env, tl) ++DEF_HELPER_2(mtc0_tcrestart, void, env, tl) ++DEF_HELPER_2(mttc0_tcrestart, void, env, tl) ++DEF_HELPER_2(mtc0_tchalt, void, env, tl) ++DEF_HELPER_2(mttc0_tchalt, void, env, tl) ++DEF_HELPER_2(mtc0_tccontext, void, env, tl) ++DEF_HELPER_2(mttc0_tccontext, void, env, tl) ++DEF_HELPER_2(mtc0_tcschedule, void, env, tl) ++DEF_HELPER_2(mttc0_tcschedule, void, env, tl) ++DEF_HELPER_2(mtc0_tcschefback, void, env, tl) ++DEF_HELPER_2(mttc0_tcschefback, void, env, tl) ++DEF_HELPER_2(mtc0_entrylo1, void, env, tl) ++DEF_HELPER_2(mtc0_context, void, env, tl) ++DEF_HELPER_2(mtc0_pagemask, void, env, tl) ++DEF_HELPER_2(mtc0_pagegrain, void, env, tl) ++DEF_HELPER_2(mtc0_wired, void, env, tl) ++DEF_HELPER_2(mtc0_srsconf0, void, env, tl) ++DEF_HELPER_2(mtc0_srsconf1, void, env, tl) ++DEF_HELPER_2(mtc0_srsconf2, void, env, tl) ++DEF_HELPER_2(mtc0_srsconf3, void, env, tl) ++DEF_HELPER_2(mtc0_srsconf4, void, env, tl) ++DEF_HELPER_2(mtc0_hwrena, void, env, tl) ++DEF_HELPER_2(mtc0_count, void, env, tl) ++DEF_HELPER_2(mtc0_entryhi, void, env, tl) ++DEF_HELPER_2(mttc0_entryhi, void, env, tl) ++DEF_HELPER_2(mtc0_compare, void, env, tl) ++DEF_HELPER_2(mtc0_status, void, env, tl) ++DEF_HELPER_2(mttc0_status, void, env, tl) ++DEF_HELPER_2(mtc0_intctl, void, env, tl) ++DEF_HELPER_2(mtc0_srsctl, void, env, tl) ++DEF_HELPER_2(mtc0_cause, void, env, tl) ++DEF_HELPER_2(mttc0_cause, void, env, tl) ++DEF_HELPER_2(mtc0_ebase, void, env, tl) ++DEF_HELPER_2(mttc0_ebase, void, env, tl) ++DEF_HELPER_2(mtc0_config0, void, env, tl) ++DEF_HELPER_2(mtc0_config2, void, env, tl) ++DEF_HELPER_2(mtc0_lladdr, void, env, tl) ++DEF_HELPER_3(mtc0_watchlo, void, env, tl, i32) ++DEF_HELPER_3(mtc0_watchhi, void, env, tl, i32) ++DEF_HELPER_2(mtc0_xcontext, void, env, tl) ++DEF_HELPER_2(mtc0_framemask, void, env, tl) ++DEF_HELPER_2(mtc0_debug, void, env, tl) ++DEF_HELPER_2(mttc0_debug, void, env, tl) ++DEF_HELPER_2(mtc0_performance0, void, env, tl) ++DEF_HELPER_2(mtc0_taglo, void, env, tl) ++DEF_HELPER_2(mtc0_datalo, void, env, tl) ++DEF_HELPER_2(mtc0_taghi, void, env, tl) ++DEF_HELPER_2(mtc0_datahi, void, env, tl) + + /* MIPS MT functions */ +-DEF_HELPER_1(mftgpr, tl, i32); +-DEF_HELPER_1(mftlo, tl, i32) +-DEF_HELPER_1(mfthi, tl, i32) +-DEF_HELPER_1(mftacx, tl, i32) +-DEF_HELPER_0(mftdsp, tl) +-DEF_HELPER_2(mttgpr, void, tl, i32) +-DEF_HELPER_2(mttlo, void, tl, i32) +-DEF_HELPER_2(mtthi, void, tl, i32) +-DEF_HELPER_2(mttacx, void, tl, i32) +-DEF_HELPER_1(mttdsp, void, tl) ++DEF_HELPER_2(mftgpr, tl, env, i32); ++DEF_HELPER_2(mftlo, tl, env, i32) ++DEF_HELPER_2(mfthi, tl, env, i32) ++DEF_HELPER_2(mftacx, tl, env, i32) ++DEF_HELPER_1(mftdsp, tl, env) ++DEF_HELPER_3(mttgpr, void, env, tl, i32) ++DEF_HELPER_3(mttlo, void, env, tl, i32) ++DEF_HELPER_3(mtthi, void, env, tl, i32) ++DEF_HELPER_3(mttacx, void, env, tl, i32) ++DEF_HELPER_2(mttdsp, void, env, tl) + DEF_HELPER_0(dmt, tl) + DEF_HELPER_0(emt, tl) +-DEF_HELPER_0(dvpe, tl) +-DEF_HELPER_0(evpe, tl) ++DEF_HELPER_1(dvpe, tl, env) ++DEF_HELPER_1(evpe, tl, env) + #endif /* !CONFIG_USER_ONLY */ + + /* microMIPS functions */ +-DEF_HELPER_3(lwm, void, tl, tl, i32); +-DEF_HELPER_3(swm, void, tl, tl, i32); ++DEF_HELPER_4(lwm, void, env, tl, tl, i32); ++DEF_HELPER_4(swm, void, env, tl, tl, i32); + #ifdef TARGET_MIPS64 +-DEF_HELPER_3(ldm, void, tl, tl, i32); +-DEF_HELPER_3(sdm, void, tl, tl, i32); ++DEF_HELPER_4(ldm, void, env, tl, tl, i32); ++DEF_HELPER_4(sdm, void, env, tl, tl, i32); + #endif + + DEF_HELPER_2(fork, void, tl, tl) +-DEF_HELPER_1(yield, tl, tl) ++DEF_HELPER_2(yield, tl, env, tl) + + /* CP1 functions */ +-DEF_HELPER_1(cfc1, tl, i32) +-DEF_HELPER_2(ctc1, void, tl, i32) ++DEF_HELPER_2(cfc1, tl, env, i32) ++DEF_HELPER_3(ctc1, void, env, tl, i32) + +-DEF_HELPER_1(float_cvtd_s, i64, i32) +-DEF_HELPER_1(float_cvtd_w, i64, i32) +-DEF_HELPER_1(float_cvtd_l, i64, i64) +-DEF_HELPER_1(float_cvtl_d, i64, i64) +-DEF_HELPER_1(float_cvtl_s, i64, i32) +-DEF_HELPER_1(float_cvtps_pw, i64, i64) +-DEF_HELPER_1(float_cvtpw_ps, i64, i64) +-DEF_HELPER_1(float_cvts_d, i32, i64) +-DEF_HELPER_1(float_cvts_w, i32, i32) +-DEF_HELPER_1(float_cvts_l, i32, i64) +-DEF_HELPER_1(float_cvts_pl, i32, i32) +-DEF_HELPER_1(float_cvts_pu, i32, i32) +-DEF_HELPER_1(float_cvtw_s, i32, i32) +-DEF_HELPER_1(float_cvtw_d, i32, i64) ++DEF_HELPER_2(float_cvtd_s, i64, env, i32) ++DEF_HELPER_2(float_cvtd_w, i64, env, i32) ++DEF_HELPER_2(float_cvtd_l, i64, env, i64) ++DEF_HELPER_2(float_cvtl_d, i64, env, i64) ++DEF_HELPER_2(float_cvtl_s, i64, env, i32) ++DEF_HELPER_2(float_cvtps_pw, i64, env, i64) ++DEF_HELPER_2(float_cvtpw_ps, i64, env, i64) ++DEF_HELPER_2(float_cvts_d, i32, env, i64) ++DEF_HELPER_2(float_cvts_w, i32, env, i32) ++DEF_HELPER_2(float_cvts_l, i32, env, i64) ++DEF_HELPER_2(float_cvts_pl, i32, env, i32) ++DEF_HELPER_2(float_cvts_pu, i32, env, i32) ++DEF_HELPER_2(float_cvtw_s, i32, env, i32) ++DEF_HELPER_2(float_cvtw_d, i32, env, i64) + +-DEF_HELPER_2(float_addr_ps, i64, i64, i64) +-DEF_HELPER_2(float_mulr_ps, i64, i64, i64) ++DEF_HELPER_3(float_addr_ps, i64, env, i64, i64) ++DEF_HELPER_3(float_mulr_ps, i64, env, i64, i64) + +-#define FOP_PROTO(op) \ +-DEF_HELPER_1(float_ ## op ## l_s, i64, i32) \ +-DEF_HELPER_1(float_ ## op ## l_d, i64, i64) \ +-DEF_HELPER_1(float_ ## op ## w_s, i32, i32) \ +-DEF_HELPER_1(float_ ## op ## w_d, i32, i64) ++#define FOP_PROTO(op) \ ++DEF_HELPER_2(float_ ## op ## l_s, i64, env, i32) \ ++DEF_HELPER_2(float_ ## op ## l_d, i64, env, i64) \ ++DEF_HELPER_2(float_ ## op ## w_s, i32, env, i32) \ ++DEF_HELPER_2(float_ ## op ## w_d, i32, env, i64) + FOP_PROTO(round) + FOP_PROTO(trunc) + FOP_PROTO(ceil) + FOP_PROTO(floor) + #undef FOP_PROTO + +-#define FOP_PROTO(op) \ +-DEF_HELPER_1(float_ ## op ## _s, i32, i32) \ +-DEF_HELPER_1(float_ ## op ## _d, i64, i64) ++#define FOP_PROTO(op) \ ++DEF_HELPER_2(float_ ## op ## _s, i32, env, i32) \ ++DEF_HELPER_2(float_ ## op ## _d, i64, env, i64) + FOP_PROTO(sqrt) + FOP_PROTO(rsqrt) + FOP_PROTO(recip) +@@ -228,14 +228,20 @@ DEF_HELPER_1(float_ ## op ## _d, i64, i64) \ + DEF_HELPER_1(float_ ## op ## _ps, i64, i64) + FOP_PROTO(abs) + FOP_PROTO(chs) ++#undef FOP_PROTO ++ ++#define FOP_PROTO(op) \ ++DEF_HELPER_2(float_ ## op ## _s, i32, env, i32) \ ++DEF_HELPER_2(float_ ## op ## _d, i64, env, i64) \ ++DEF_HELPER_2(float_ ## op ## _ps, i64, env, i64) + FOP_PROTO(recip1) + FOP_PROTO(rsqrt1) + #undef FOP_PROTO + +-#define FOP_PROTO(op) \ +-DEF_HELPER_2(float_ ## op ## _s, i32, i32, i32) \ +-DEF_HELPER_2(float_ ## op ## _d, i64, i64, i64) \ +-DEF_HELPER_2(float_ ## op ## _ps, i64, i64, i64) ++#define FOP_PROTO(op) \ ++DEF_HELPER_3(float_ ## op ## _s, i32, env, i32, i32) \ ++DEF_HELPER_3(float_ ## op ## _d, i64, env, i64, i64) \ ++DEF_HELPER_3(float_ ## op ## _ps, i64, env, i64, i64) + FOP_PROTO(add) + FOP_PROTO(sub) + FOP_PROTO(mul) +@@ -244,23 +250,23 @@ FOP_PROTO(recip2) + FOP_PROTO(rsqrt2) + #undef FOP_PROTO + +-#define FOP_PROTO(op) \ +-DEF_HELPER_3(float_ ## op ## _s, i32, i32, i32, i32) \ +-DEF_HELPER_3(float_ ## op ## _d, i64, i64, i64, i64) \ +-DEF_HELPER_3(float_ ## op ## _ps, i64, i64, i64, i64) ++#define FOP_PROTO(op) \ ++DEF_HELPER_4(float_ ## op ## _s, i32, env, i32, i32, i32) \ ++DEF_HELPER_4(float_ ## op ## _d, i64, env, i64, i64, i64) \ ++DEF_HELPER_4(float_ ## op ## _ps, i64, env, i64, i64, i64) + FOP_PROTO(muladd) + FOP_PROTO(mulsub) + FOP_PROTO(nmuladd) + FOP_PROTO(nmulsub) + #undef FOP_PROTO + +-#define FOP_PROTO(op) \ +-DEF_HELPER_3(cmp_d_ ## op, void, i64, i64, int) \ +-DEF_HELPER_3(cmpabs_d_ ## op, void, i64, i64, int) \ +-DEF_HELPER_3(cmp_s_ ## op, void, i32, i32, int) \ +-DEF_HELPER_3(cmpabs_s_ ## op, void, i32, i32, int) \ +-DEF_HELPER_3(cmp_ps_ ## op, void, i64, i64, int) \ +-DEF_HELPER_3(cmpabs_ps_ ## op, void, i64, i64, int) ++#define FOP_PROTO(op) \ ++DEF_HELPER_4(cmp_d_ ## op, void, env, i64, i64, int) \ ++DEF_HELPER_4(cmpabs_d_ ## op, void, env, i64, i64, int) \ ++DEF_HELPER_4(cmp_s_ ## op, void, env, i32, i32, int) \ ++DEF_HELPER_4(cmpabs_s_ ## op, void, env, i32, i32, int) \ ++DEF_HELPER_4(cmp_ps_ ## op, void, env, i64, i64, int) \ ++DEF_HELPER_4(cmpabs_ps_ ## op, void, env, i64, i64, int) + FOP_PROTO(f) + FOP_PROTO(un) + FOP_PROTO(eq) +@@ -281,20 +287,20 @@ FOP_PROTO(ngt) + + /* Special functions */ + #ifndef CONFIG_USER_ONLY +-DEF_HELPER_0(tlbwi, void) +-DEF_HELPER_0(tlbwr, void) +-DEF_HELPER_0(tlbp, void) +-DEF_HELPER_0(tlbr, void) +-DEF_HELPER_0(di, tl) +-DEF_HELPER_0(ei, tl) +-DEF_HELPER_0(eret, void) +-DEF_HELPER_0(deret, void) ++DEF_HELPER_1(tlbwi, void, env) ++DEF_HELPER_1(tlbwr, void, env) ++DEF_HELPER_1(tlbp, void, env) ++DEF_HELPER_1(tlbr, void, env) ++DEF_HELPER_1(di, tl, env) ++DEF_HELPER_1(ei, tl, env) ++DEF_HELPER_1(eret, void, env) ++DEF_HELPER_1(deret, void, env) + #endif /* !CONFIG_USER_ONLY */ +-DEF_HELPER_0(rdhwr_cpunum, tl) +-DEF_HELPER_0(rdhwr_synci_step, tl) +-DEF_HELPER_0(rdhwr_cc, tl) +-DEF_HELPER_0(rdhwr_ccres, tl) +-DEF_HELPER_1(pmon, void, int) +-DEF_HELPER_0(wait, void) ++DEF_HELPER_1(rdhwr_cpunum, tl, env) ++DEF_HELPER_1(rdhwr_synci_step, tl, env) ++DEF_HELPER_1(rdhwr_cc, tl, env) ++DEF_HELPER_1(rdhwr_ccres, tl, env) ++DEF_HELPER_2(pmon, void, env, int) ++DEF_HELPER_1(wait, void, env) + + #include "def-helper.h" +diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c +index e5bc93e..d2a8a55 100644 +--- a/target-mips/op_helper.c ++++ b/target-mips/op_helper.c +@@ -18,8 +18,6 @@ + */ + #include + #include "cpu.h" +-#include "dyngen-exec.h" +- + #include "host-utils.h" + + #include "helper.h" +@@ -84,7 +82,8 @@ static inline void compute_hflags(CPUMIPSState *env) + /*****************************************************************************/ + /* Exceptions processing helpers */ + +-void helper_raise_exception_err (uint32_t exception, int error_code) ++void helper_raise_exception_err(CPUMIPSState *env, uint32_t exception, ++ int error_code) + { + #if 1 + if (exception < 0x100) +@@ -95,13 +94,13 @@ void helper_raise_exception_err (uint32_t exception, int error_code) + cpu_loop_exit(env); + } + +-void helper_raise_exception (uint32_t exception) ++void helper_raise_exception(CPUMIPSState *env, uint32_t exception) + { +- helper_raise_exception_err(exception, 0); ++ helper_raise_exception_err(env, exception, 0); + } + + #if !defined(CONFIG_USER_ONLY) +-static void do_restore_state(uintptr_t pc) ++static void do_restore_state(CPUMIPSState *env, uintptr_t pc) + { + TranslationBlock *tb; + +@@ -114,20 +113,22 @@ static void do_restore_state(uintptr_t pc) + + #if defined(CONFIG_USER_ONLY) + #define HELPER_LD(name, insn, type) \ +-static inline type do_##name(target_ulong addr, int mem_idx) \ ++static inline type do_##name(CPUMIPSState *env, target_ulong addr, \ ++ int mem_idx) \ + { \ + return (type) insn##_raw(addr); \ + } + #else + #define HELPER_LD(name, insn, type) \ +-static inline type do_##name(target_ulong addr, int mem_idx) \ ++static inline type do_##name(CPUMIPSState *env, target_ulong addr, \ ++ int mem_idx) \ + { \ + switch (mem_idx) \ + { \ +- case 0: return (type) insn##_kernel(addr); break; \ +- case 1: return (type) insn##_super(addr); break; \ ++ case 0: return (type) cpu_##insn##_kernel(env, addr); break; \ ++ case 1: return (type) cpu_##insn##_super(env, addr); break; \ + default: \ +- case 2: return (type) insn##_user(addr); break; \ ++ case 2: return (type) cpu_##insn##_user(env, addr); break; \ + } \ + } + #endif +@@ -140,20 +141,22 @@ HELPER_LD(ld, ldq, int64_t) + + #if defined(CONFIG_USER_ONLY) + #define HELPER_ST(name, insn, type) \ +-static inline void do_##name(target_ulong addr, type val, int mem_idx) \ ++static inline void do_##name(CPUMIPSState *env, target_ulong addr, \ ++ type val, int mem_idx) \ + { \ + insn##_raw(addr, val); \ + } + #else + #define HELPER_ST(name, insn, type) \ +-static inline void do_##name(target_ulong addr, type val, int mem_idx) \ ++static inline void do_##name(CPUMIPSState *env, target_ulong addr, \ ++ type val, int mem_idx) \ + { \ + switch (mem_idx) \ + { \ +- case 0: insn##_kernel(addr, val); break; \ +- case 1: insn##_super(addr, val); break; \ ++ case 0: cpu_##insn##_kernel(env, addr, val); break; \ ++ case 1: cpu_##insn##_super(env, addr, val); break; \ + default: \ +- case 2: insn##_user(addr, val); break; \ ++ case 2: cpu_##insn##_user(env, addr, val); break; \ + } \ + } + #endif +@@ -187,12 +190,12 @@ target_ulong helper_dclz (target_ulong arg1) + #endif /* TARGET_MIPS64 */ + + /* 64 bits arithmetic for 32 bits hosts */ +-static inline uint64_t get_HILO (void) ++static inline uint64_t get_HILO(CPUMIPSState *env) + { + return ((uint64_t)(env->active_tc.HI[0]) << 32) | (uint32_t)env->active_tc.LO[0]; + } + +-static inline target_ulong set_HIT0_LO(uint64_t HILO) ++static inline target_ulong set_HIT0_LO(CPUMIPSState *env, uint64_t HILO) + { + target_ulong tmp; + env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); +@@ -200,7 +203,7 @@ static inline target_ulong set_HIT0_LO(uint64_t HILO) + return tmp; + } + +-static inline target_ulong set_HI_LOT0(uint64_t HILO) ++static inline target_ulong set_HI_LOT0(CPUMIPSState *env, uint64_t HILO) + { + target_ulong tmp = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); + env->active_tc.HI[0] = (int32_t)(HILO >> 32); +@@ -208,91 +211,110 @@ static inline target_ulong set_HI_LOT0(uint64_t HILO) + } + + /* Multiplication variants of the vr54xx. */ +-target_ulong helper_muls (target_ulong arg1, target_ulong arg2) ++target_ulong helper_muls(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HI_LOT0(0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); ++ return set_HI_LOT0(env, 0 - ((int64_t)(int32_t)arg1 * ++ (int64_t)(int32_t)arg2)); + } + +-target_ulong helper_mulsu (target_ulong arg1, target_ulong arg2) ++target_ulong helper_mulsu(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HI_LOT0(0 - (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); ++ return set_HI_LOT0(env, 0 - (uint64_t)(uint32_t)arg1 * ++ (uint64_t)(uint32_t)arg2); + } + +-target_ulong helper_macc (target_ulong arg1, target_ulong arg2) ++target_ulong helper_macc(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HI_LOT0((int64_t)get_HILO() + (int64_t)(int32_t)arg1 * +- (int64_t)(int32_t)arg2); ++ return set_HI_LOT0(env, (int64_t)get_HILO(env) + (int64_t)(int32_t)arg1 * ++ (int64_t)(int32_t)arg2); + } + +-target_ulong helper_macchi (target_ulong arg1, target_ulong arg2) ++target_ulong helper_macchi(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HIT0_LO((int64_t)get_HILO() + (int64_t)(int32_t)arg1 * +- (int64_t)(int32_t)arg2); ++ return set_HIT0_LO(env, (int64_t)get_HILO(env) + (int64_t)(int32_t)arg1 * ++ (int64_t)(int32_t)arg2); + } + +-target_ulong helper_maccu (target_ulong arg1, target_ulong arg2) ++target_ulong helper_maccu(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HI_LOT0((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 * +- (uint64_t)(uint32_t)arg2); ++ return set_HI_LOT0(env, (uint64_t)get_HILO(env) + ++ (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); + } + +-target_ulong helper_macchiu (target_ulong arg1, target_ulong arg2) ++target_ulong helper_macchiu(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HIT0_LO((uint64_t)get_HILO() + (uint64_t)(uint32_t)arg1 * +- (uint64_t)(uint32_t)arg2); ++ return set_HIT0_LO(env, (uint64_t)get_HILO(env) + ++ (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); + } + +-target_ulong helper_msac (target_ulong arg1, target_ulong arg2) ++target_ulong helper_msac(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HI_LOT0((int64_t)get_HILO() - (int64_t)(int32_t)arg1 * +- (int64_t)(int32_t)arg2); ++ return set_HI_LOT0(env, (int64_t)get_HILO(env) - (int64_t)(int32_t)arg1 * ++ (int64_t)(int32_t)arg2); + } + +-target_ulong helper_msachi (target_ulong arg1, target_ulong arg2) ++target_ulong helper_msachi(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HIT0_LO((int64_t)get_HILO() - (int64_t)(int32_t)arg1 * +- (int64_t)(int32_t)arg2); ++ return set_HIT0_LO(env, (int64_t)get_HILO(env) - (int64_t)(int32_t)arg1 * ++ (int64_t)(int32_t)arg2); + } + +-target_ulong helper_msacu (target_ulong arg1, target_ulong arg2) ++target_ulong helper_msacu(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HI_LOT0((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 * +- (uint64_t)(uint32_t)arg2); ++ return set_HI_LOT0(env, (uint64_t)get_HILO(env) - ++ (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); + } + +-target_ulong helper_msachiu (target_ulong arg1, target_ulong arg2) ++target_ulong helper_msachiu(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HIT0_LO((uint64_t)get_HILO() - (uint64_t)(uint32_t)arg1 * +- (uint64_t)(uint32_t)arg2); ++ return set_HIT0_LO(env, (uint64_t)get_HILO(env) - ++ (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); + } + +-target_ulong helper_mulhi (target_ulong arg1, target_ulong arg2) ++target_ulong helper_mulhi(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HIT0_LO((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); ++ return set_HIT0_LO(env, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); + } + +-target_ulong helper_mulhiu (target_ulong arg1, target_ulong arg2) ++target_ulong helper_mulhiu(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HIT0_LO((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); ++ return set_HIT0_LO(env, (uint64_t)(uint32_t)arg1 * ++ (uint64_t)(uint32_t)arg2); + } + +-target_ulong helper_mulshi (target_ulong arg1, target_ulong arg2) ++target_ulong helper_mulshi(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HIT0_LO(0 - (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); ++ return set_HIT0_LO(env, 0 - (int64_t)(int32_t)arg1 * ++ (int64_t)(int32_t)arg2); + } + +-target_ulong helper_mulshiu (target_ulong arg1, target_ulong arg2) ++target_ulong helper_mulshiu(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2) + { +- return set_HIT0_LO(0 - (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); ++ return set_HIT0_LO(env, 0 - (uint64_t)(uint32_t)arg1 * ++ (uint64_t)(uint32_t)arg2); + } + + #ifdef TARGET_MIPS64 +-void helper_dmult (target_ulong arg1, target_ulong arg2) ++void helper_dmult(CPUMIPSState *env, target_ulong arg1, target_ulong arg2) + { + muls64(&(env->active_tc.LO[0]), &(env->active_tc.HI[0]), arg1, arg2); + } + +-void helper_dmultu (target_ulong arg1, target_ulong arg2) ++void helper_dmultu(CPUMIPSState *env, target_ulong arg1, target_ulong arg2) + { + mulu64(&(env->active_tc.LO[0]), &(env->active_tc.HI[0]), arg1, arg2); + } +@@ -300,7 +322,9 @@ void helper_dmultu (target_ulong arg1, target_ulong arg2) + + #ifndef CONFIG_USER_ONLY + +-static inline target_phys_addr_t do_translate_address(target_ulong address, int rw) ++static inline target_phys_addr_t do_translate_address(CPUMIPSState *env, ++ target_ulong address, ++ int rw) + { + target_phys_addr_t lladdr; + +@@ -314,10 +338,10 @@ static inline target_phys_addr_t do_translate_address(target_ulong address, int + } + + #define HELPER_LD_ATOMIC(name, insn) \ +-target_ulong helper_##name(target_ulong arg, int mem_idx) \ ++target_ulong helper_##name(CPUMIPSState *env, target_ulong arg, int mem_idx) \ + { \ +- env->lladdr = do_translate_address(arg, 0); \ +- env->llval = do_##insn(arg, mem_idx); \ ++ env->lladdr = do_translate_address(env, arg, 0); \ ++ env->llval = do_##insn(env, arg, mem_idx); \ + return env->llval; \ + } + HELPER_LD_ATOMIC(ll, lw) +@@ -327,18 +351,19 @@ HELPER_LD_ATOMIC(lld, ld) + #undef HELPER_LD_ATOMIC + + #define HELPER_ST_ATOMIC(name, ld_insn, st_insn, almask) \ +-target_ulong helper_##name(target_ulong arg1, target_ulong arg2, int mem_idx) \ ++target_ulong helper_##name(CPUMIPSState *env, target_ulong arg1, \ ++ target_ulong arg2, int mem_idx) \ + { \ + target_long tmp; \ + \ + if (arg2 & almask) { \ + env->CP0_BadVAddr = arg2; \ +- helper_raise_exception(EXCP_AdES); \ ++ helper_raise_exception(env, EXCP_AdES); \ + } \ +- if (do_translate_address(arg2, 1) == env->lladdr) { \ +- tmp = do_##ld_insn(arg2, mem_idx); \ ++ if (do_translate_address(env, arg2, 1) == env->lladdr) { \ ++ tmp = do_##ld_insn(env, arg2, mem_idx); \ + if (tmp == env->llval) { \ +- do_##st_insn(arg2, arg1, mem_idx); \ ++ do_##st_insn(env, arg2, arg1, mem_idx); \ + return 1; \ + } \ + } \ +@@ -359,80 +384,84 @@ HELPER_ST_ATOMIC(scd, ld, sd, 0x7) + #define GET_OFFSET(addr, offset) (addr - (offset)) + #endif + +-target_ulong helper_lwl(target_ulong arg1, target_ulong arg2, int mem_idx) ++target_ulong helper_lwl(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2, int mem_idx) + { + target_ulong tmp; + +- tmp = do_lbu(arg2, mem_idx); ++ tmp = do_lbu(env, arg2, mem_idx); + arg1 = (arg1 & 0x00FFFFFF) | (tmp << 24); + + if (GET_LMASK(arg2) <= 2) { +- tmp = do_lbu(GET_OFFSET(arg2, 1), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 1), mem_idx); + arg1 = (arg1 & 0xFF00FFFF) | (tmp << 16); + } + + if (GET_LMASK(arg2) <= 1) { +- tmp = do_lbu(GET_OFFSET(arg2, 2), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 2), mem_idx); + arg1 = (arg1 & 0xFFFF00FF) | (tmp << 8); + } + + if (GET_LMASK(arg2) == 0) { +- tmp = do_lbu(GET_OFFSET(arg2, 3), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 3), mem_idx); + arg1 = (arg1 & 0xFFFFFF00) | tmp; + } + return (int32_t)arg1; + } + +-target_ulong helper_lwr(target_ulong arg1, target_ulong arg2, int mem_idx) ++target_ulong helper_lwr(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2, int mem_idx) + { + target_ulong tmp; + +- tmp = do_lbu(arg2, mem_idx); ++ tmp = do_lbu(env, arg2, mem_idx); + arg1 = (arg1 & 0xFFFFFF00) | tmp; + + if (GET_LMASK(arg2) >= 1) { +- tmp = do_lbu(GET_OFFSET(arg2, -1), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -1), mem_idx); + arg1 = (arg1 & 0xFFFF00FF) | (tmp << 8); + } + + if (GET_LMASK(arg2) >= 2) { +- tmp = do_lbu(GET_OFFSET(arg2, -2), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -2), mem_idx); + arg1 = (arg1 & 0xFF00FFFF) | (tmp << 16); + } + + if (GET_LMASK(arg2) == 3) { +- tmp = do_lbu(GET_OFFSET(arg2, -3), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -3), mem_idx); + arg1 = (arg1 & 0x00FFFFFF) | (tmp << 24); + } + return (int32_t)arg1; + } + +-void helper_swl(target_ulong arg1, target_ulong arg2, int mem_idx) ++void helper_swl(CPUMIPSState *env, target_ulong arg1, target_ulong arg2, ++ int mem_idx) + { +- do_sb(arg2, (uint8_t)(arg1 >> 24), mem_idx); ++ do_sb(env, arg2, (uint8_t)(arg1 >> 24), mem_idx); + + if (GET_LMASK(arg2) <= 2) +- do_sb(GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 16), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 16), mem_idx); + + if (GET_LMASK(arg2) <= 1) +- do_sb(GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 8), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 8), mem_idx); + + if (GET_LMASK(arg2) == 0) +- do_sb(GET_OFFSET(arg2, 3), (uint8_t)arg1, mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 3), (uint8_t)arg1, mem_idx); + } + +-void helper_swr(target_ulong arg1, target_ulong arg2, int mem_idx) ++void helper_swr(CPUMIPSState *env, target_ulong arg1, target_ulong arg2, ++ int mem_idx) + { +- do_sb(arg2, (uint8_t)arg1, mem_idx); ++ do_sb(env, arg2, (uint8_t)arg1, mem_idx); + + if (GET_LMASK(arg2) >= 1) +- do_sb(GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx); + + if (GET_LMASK(arg2) >= 2) +- do_sb(GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx); + + if (GET_LMASK(arg2) == 3) +- do_sb(GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx); + } + + #if defined(TARGET_MIPS64) +@@ -445,167 +474,172 @@ void helper_swr(target_ulong arg1, target_ulong arg2, int mem_idx) + #define GET_LMASK64(v) (((v) & 7) ^ 7) + #endif + +-target_ulong helper_ldl(target_ulong arg1, target_ulong arg2, int mem_idx) ++target_ulong helper_ldl(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2, int mem_idx) + { + uint64_t tmp; + +- tmp = do_lbu(arg2, mem_idx); ++ tmp = do_lbu(env, arg2, mem_idx); + arg1 = (arg1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56); + + if (GET_LMASK64(arg2) <= 6) { +- tmp = do_lbu(GET_OFFSET(arg2, 1), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 1), mem_idx); + arg1 = (arg1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48); + } + + if (GET_LMASK64(arg2) <= 5) { +- tmp = do_lbu(GET_OFFSET(arg2, 2), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 2), mem_idx); + arg1 = (arg1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40); + } + + if (GET_LMASK64(arg2) <= 4) { +- tmp = do_lbu(GET_OFFSET(arg2, 3), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 3), mem_idx); + arg1 = (arg1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32); + } + + if (GET_LMASK64(arg2) <= 3) { +- tmp = do_lbu(GET_OFFSET(arg2, 4), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 4), mem_idx); + arg1 = (arg1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24); + } + + if (GET_LMASK64(arg2) <= 2) { +- tmp = do_lbu(GET_OFFSET(arg2, 5), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 5), mem_idx); + arg1 = (arg1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16); + } + + if (GET_LMASK64(arg2) <= 1) { +- tmp = do_lbu(GET_OFFSET(arg2, 6), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 6), mem_idx); + arg1 = (arg1 & 0xFFFFFFFFFFFF00FFULL) | (tmp << 8); + } + + if (GET_LMASK64(arg2) == 0) { +- tmp = do_lbu(GET_OFFSET(arg2, 7), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, 7), mem_idx); + arg1 = (arg1 & 0xFFFFFFFFFFFFFF00ULL) | tmp; + } + + return arg1; + } + +-target_ulong helper_ldr(target_ulong arg1, target_ulong arg2, int mem_idx) ++target_ulong helper_ldr(CPUMIPSState *env, target_ulong arg1, ++ target_ulong arg2, int mem_idx) + { + uint64_t tmp; + +- tmp = do_lbu(arg2, mem_idx); ++ tmp = do_lbu(env, arg2, mem_idx); + arg1 = (arg1 & 0xFFFFFFFFFFFFFF00ULL) | tmp; + + if (GET_LMASK64(arg2) >= 1) { +- tmp = do_lbu(GET_OFFSET(arg2, -1), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -1), mem_idx); + arg1 = (arg1 & 0xFFFFFFFFFFFF00FFULL) | (tmp << 8); + } + + if (GET_LMASK64(arg2) >= 2) { +- tmp = do_lbu(GET_OFFSET(arg2, -2), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -2), mem_idx); + arg1 = (arg1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16); + } + + if (GET_LMASK64(arg2) >= 3) { +- tmp = do_lbu(GET_OFFSET(arg2, -3), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -3), mem_idx); + arg1 = (arg1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24); + } + + if (GET_LMASK64(arg2) >= 4) { +- tmp = do_lbu(GET_OFFSET(arg2, -4), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -4), mem_idx); + arg1 = (arg1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32); + } + + if (GET_LMASK64(arg2) >= 5) { +- tmp = do_lbu(GET_OFFSET(arg2, -5), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -5), mem_idx); + arg1 = (arg1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40); + } + + if (GET_LMASK64(arg2) >= 6) { +- tmp = do_lbu(GET_OFFSET(arg2, -6), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -6), mem_idx); + arg1 = (arg1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48); + } + + if (GET_LMASK64(arg2) == 7) { +- tmp = do_lbu(GET_OFFSET(arg2, -7), mem_idx); ++ tmp = do_lbu(env, GET_OFFSET(arg2, -7), mem_idx); + arg1 = (arg1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56); + } + + return arg1; + } + +-void helper_sdl(target_ulong arg1, target_ulong arg2, int mem_idx) ++void helper_sdl(CPUMIPSState *env, target_ulong arg1, target_ulong arg2, ++ int mem_idx) + { +- do_sb(arg2, (uint8_t)(arg1 >> 56), mem_idx); ++ do_sb(env, arg2, (uint8_t)(arg1 >> 56), mem_idx); + + if (GET_LMASK64(arg2) <= 6) +- do_sb(GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 48), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 48), mem_idx); + + if (GET_LMASK64(arg2) <= 5) +- do_sb(GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 40), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 40), mem_idx); + + if (GET_LMASK64(arg2) <= 4) +- do_sb(GET_OFFSET(arg2, 3), (uint8_t)(arg1 >> 32), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 3), (uint8_t)(arg1 >> 32), mem_idx); + + if (GET_LMASK64(arg2) <= 3) +- do_sb(GET_OFFSET(arg2, 4), (uint8_t)(arg1 >> 24), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 4), (uint8_t)(arg1 >> 24), mem_idx); + + if (GET_LMASK64(arg2) <= 2) +- do_sb(GET_OFFSET(arg2, 5), (uint8_t)(arg1 >> 16), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 5), (uint8_t)(arg1 >> 16), mem_idx); + + if (GET_LMASK64(arg2) <= 1) +- do_sb(GET_OFFSET(arg2, 6), (uint8_t)(arg1 >> 8), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 6), (uint8_t)(arg1 >> 8), mem_idx); + + if (GET_LMASK64(arg2) <= 0) +- do_sb(GET_OFFSET(arg2, 7), (uint8_t)arg1, mem_idx); ++ do_sb(env, GET_OFFSET(arg2, 7), (uint8_t)arg1, mem_idx); + } + +-void helper_sdr(target_ulong arg1, target_ulong arg2, int mem_idx) ++void helper_sdr(CPUMIPSState *env, target_ulong arg1, target_ulong arg2, ++ int mem_idx) + { +- do_sb(arg2, (uint8_t)arg1, mem_idx); ++ do_sb(env, arg2, (uint8_t)arg1, mem_idx); + + if (GET_LMASK64(arg2) >= 1) +- do_sb(GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx); + + if (GET_LMASK64(arg2) >= 2) +- do_sb(GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx); + + if (GET_LMASK64(arg2) >= 3) +- do_sb(GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx); + + if (GET_LMASK64(arg2) >= 4) +- do_sb(GET_OFFSET(arg2, -4), (uint8_t)(arg1 >> 32), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -4), (uint8_t)(arg1 >> 32), mem_idx); + + if (GET_LMASK64(arg2) >= 5) +- do_sb(GET_OFFSET(arg2, -5), (uint8_t)(arg1 >> 40), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -5), (uint8_t)(arg1 >> 40), mem_idx); + + if (GET_LMASK64(arg2) >= 6) +- do_sb(GET_OFFSET(arg2, -6), (uint8_t)(arg1 >> 48), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -6), (uint8_t)(arg1 >> 48), mem_idx); + + if (GET_LMASK64(arg2) == 7) +- do_sb(GET_OFFSET(arg2, -7), (uint8_t)(arg1 >> 56), mem_idx); ++ do_sb(env, GET_OFFSET(arg2, -7), (uint8_t)(arg1 >> 56), mem_idx); + } + #endif /* TARGET_MIPS64 */ + + static const int multiple_regs[] = { 16, 17, 18, 19, 20, 21, 22, 23, 30 }; + +-void helper_lwm (target_ulong addr, target_ulong reglist, uint32_t mem_idx) ++void helper_lwm(CPUMIPSState *env, target_ulong addr, target_ulong reglist, ++ uint32_t mem_idx) + { + target_ulong base_reglist = reglist & 0xf; + target_ulong do_r31 = reglist & 0x10; + #ifdef CONFIG_USER_ONLY + #undef ldfun +-#define ldfun ldl_raw ++#define ldfun(env, addr) ldl_raw(addr) + #else +- uint32_t (*ldfun)(target_ulong); ++ uint32_t (*ldfun)(CPUMIPSState *env, target_ulong); + + switch (mem_idx) + { +- case 0: ldfun = ldl_kernel; break; +- case 1: ldfun = ldl_super; break; ++ case 0: ldfun = cpu_ldl_kernel; break; ++ case 1: ldfun = cpu_ldl_super; break; + default: +- case 2: ldfun = ldl_user; break; ++ case 2: ldfun = cpu_ldl_user; break; + } + #endif + +@@ -613,32 +647,33 @@ void helper_lwm (target_ulong addr, target_ulong reglist, uint32_t mem_idx) + target_ulong i; + + for (i = 0; i < base_reglist; i++) { +- env->active_tc.gpr[multiple_regs[i]] = (target_long) ldfun(addr); ++ env->active_tc.gpr[multiple_regs[i]] = (target_long)ldfun(env, addr); + addr += 4; + } + } + + if (do_r31) { +- env->active_tc.gpr[31] = (target_long) ldfun(addr); ++ env->active_tc.gpr[31] = (target_long)ldfun(env, addr); + } + } + +-void helper_swm (target_ulong addr, target_ulong reglist, uint32_t mem_idx) ++void helper_swm(CPUMIPSState *env, target_ulong addr, target_ulong reglist, ++ uint32_t mem_idx) + { + target_ulong base_reglist = reglist & 0xf; + target_ulong do_r31 = reglist & 0x10; + #ifdef CONFIG_USER_ONLY + #undef stfun +-#define stfun stl_raw ++#define stfun(env, addr, val) stl_raw(addr, val) + #else +- void (*stfun)(target_ulong, uint32_t); ++ void (*stfun)(CPUMIPSState *env, target_ulong, uint32_t); + + switch (mem_idx) + { +- case 0: stfun = stl_kernel; break; +- case 1: stfun = stl_super; break; ++ case 0: stfun = cpu_stl_kernel; break; ++ case 1: stfun = cpu_stl_super; break; + default: +- case 2: stfun = stl_user; break; ++ case 2: stfun = cpu_stl_user; break; + } + #endif + +@@ -646,33 +681,34 @@ void helper_swm (target_ulong addr, target_ulong reglist, uint32_t mem_idx) + target_ulong i; + + for (i = 0; i < base_reglist; i++) { +- stfun(addr, env->active_tc.gpr[multiple_regs[i]]); ++ stfun(env, addr, env->active_tc.gpr[multiple_regs[i]]); + addr += 4; + } + } + + if (do_r31) { +- stfun(addr, env->active_tc.gpr[31]); ++ stfun(env, addr, env->active_tc.gpr[31]); + } + } + + #if defined(TARGET_MIPS64) +-void helper_ldm (target_ulong addr, target_ulong reglist, uint32_t mem_idx) ++void helper_ldm(CPUMIPSState *env, target_ulong addr, target_ulong reglist, ++ uint32_t mem_idx) + { + target_ulong base_reglist = reglist & 0xf; + target_ulong do_r31 = reglist & 0x10; + #ifdef CONFIG_USER_ONLY + #undef ldfun +-#define ldfun ldq_raw ++#define ldfun(env, addr) ldq_raw(addr) + #else +- uint64_t (*ldfun)(target_ulong); ++ uint64_t (*ldfun)(CPUMIPSState *env, target_ulong); + + switch (mem_idx) + { +- case 0: ldfun = ldq_kernel; break; +- case 1: ldfun = ldq_super; break; ++ case 0: ldfun = cpu_ldq_kernel; break; ++ case 1: ldfun = cpu_ldq_super; break; + default: +- case 2: ldfun = ldq_user; break; ++ case 2: ldfun = cpu_ldq_user; break; + } + #endif + +@@ -680,32 +716,33 @@ void helper_ldm (target_ulong addr, target_ulong reglist, uint32_t mem_idx) + target_ulong i; + + for (i = 0; i < base_reglist; i++) { +- env->active_tc.gpr[multiple_regs[i]] = ldfun(addr); ++ env->active_tc.gpr[multiple_regs[i]] = ldfun(env, addr); + addr += 8; + } + } + + if (do_r31) { +- env->active_tc.gpr[31] = ldfun(addr); ++ env->active_tc.gpr[31] = ldfun(env, addr); + } + } + +-void helper_sdm (target_ulong addr, target_ulong reglist, uint32_t mem_idx) ++void helper_sdm(CPUMIPSState *env, target_ulong addr, target_ulong reglist, ++ uint32_t mem_idx) + { + target_ulong base_reglist = reglist & 0xf; + target_ulong do_r31 = reglist & 0x10; + #ifdef CONFIG_USER_ONLY + #undef stfun +-#define stfun stq_raw ++#define stfun(env, addr, val) stq_raw(addr, val) + #else +- void (*stfun)(target_ulong, uint64_t); ++ void (*stfun)(CPUMIPSState *env, target_ulong, uint64_t); + + switch (mem_idx) + { +- case 0: stfun = stq_kernel; break; +- case 1: stfun = stq_super; break; ++ case 0: stfun = cpu_stq_kernel; break; ++ case 1: stfun = cpu_stq_super; break; + default: +- case 2: stfun = stq_user; break; ++ case 2: stfun = cpu_stq_user; break; + } + #endif + +@@ -713,13 +750,13 @@ void helper_sdm (target_ulong addr, target_ulong reglist, uint32_t mem_idx) + target_ulong i; + + for (i = 0; i < base_reglist; i++) { +- stfun(addr, env->active_tc.gpr[multiple_regs[i]]); ++ stfun(env, addr, env->active_tc.gpr[multiple_regs[i]]); + addr += 8; + } + } + + if (do_r31) { +- stfun(addr, env->active_tc.gpr[31]); ++ stfun(env, addr, env->active_tc.gpr[31]); + } + } + #endif +@@ -772,7 +809,7 @@ static inline void mips_tc_sleep(CPUMIPSState *c, int tc) + FIXME: This code assumes that all VPEs have the same number of TCs, + which depends on runtime setup. Can probably be fixed by + walking the list of CPUMIPSStates. */ +-static CPUMIPSState *mips_cpu_map_tc(int *tc) ++static CPUMIPSState *mips_cpu_map_tc(CPUMIPSState *env, int *tc) + { + CPUMIPSState *other; + int vpe_idx, nr_threads = env->nr_threads; +@@ -799,7 +836,7 @@ static CPUMIPSState *mips_cpu_map_tc(int *tc) + These helper call synchronizes the regs for a given cpu. */ + + /* Called for updates to CP0_Status. */ +-static void sync_c0_status(CPUMIPSState *cpu, int tc) ++static void sync_c0_status(CPUMIPSState *env, CPUMIPSState *cpu, int tc) + { + int32_t tcstatus, *tcst; + uint32_t v = cpu->CP0_Status; +@@ -834,7 +871,8 @@ static void sync_c0_status(CPUMIPSState *cpu, int tc) + } + + /* Called for updates to CP0_TCStatus. */ +-static void sync_c0_tcstatus(CPUMIPSState *cpu, int tc, target_ulong v) ++static void sync_c0_tcstatus(CPUMIPSState *cpu, int tc, ++ target_ulong v) + { + uint32_t status; + uint32_t tcu, tmx, tasid, tksu; +@@ -883,35 +921,35 @@ static void sync_c0_entryhi(CPUMIPSState *cpu, int tc) + } + + /* CP0 helpers */ +-target_ulong helper_mfc0_mvpcontrol (void) ++target_ulong helper_mfc0_mvpcontrol(CPUMIPSState *env) + { + return env->mvp->CP0_MVPControl; + } + +-target_ulong helper_mfc0_mvpconf0 (void) ++target_ulong helper_mfc0_mvpconf0(CPUMIPSState *env) + { + return env->mvp->CP0_MVPConf0; + } + +-target_ulong helper_mfc0_mvpconf1 (void) ++target_ulong helper_mfc0_mvpconf1(CPUMIPSState *env) + { + return env->mvp->CP0_MVPConf1; + } + +-target_ulong helper_mfc0_random (void) ++target_ulong helper_mfc0_random(CPUMIPSState *env) + { + return (int32_t)cpu_mips_get_random(env); + } + +-target_ulong helper_mfc0_tcstatus (void) ++target_ulong helper_mfc0_tcstatus(CPUMIPSState *env) + { + return env->active_tc.CP0_TCStatus; + } + +-target_ulong helper_mftc0_tcstatus(void) ++target_ulong helper_mftc0_tcstatus(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCStatus; +@@ -919,15 +957,15 @@ target_ulong helper_mftc0_tcstatus(void) + return other->tcs[other_tc].CP0_TCStatus; + } + +-target_ulong helper_mfc0_tcbind (void) ++target_ulong helper_mfc0_tcbind(CPUMIPSState *env) + { + return env->active_tc.CP0_TCBind; + } + +-target_ulong helper_mftc0_tcbind(void) ++target_ulong helper_mftc0_tcbind(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCBind; +@@ -935,15 +973,15 @@ target_ulong helper_mftc0_tcbind(void) + return other->tcs[other_tc].CP0_TCBind; + } + +-target_ulong helper_mfc0_tcrestart (void) ++target_ulong helper_mfc0_tcrestart(CPUMIPSState *env) + { + return env->active_tc.PC; + } + +-target_ulong helper_mftc0_tcrestart(void) ++target_ulong helper_mftc0_tcrestart(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.PC; +@@ -951,15 +989,15 @@ target_ulong helper_mftc0_tcrestart(void) + return other->tcs[other_tc].PC; + } + +-target_ulong helper_mfc0_tchalt (void) ++target_ulong helper_mfc0_tchalt(CPUMIPSState *env) + { + return env->active_tc.CP0_TCHalt; + } + +-target_ulong helper_mftc0_tchalt(void) ++target_ulong helper_mftc0_tchalt(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCHalt; +@@ -967,15 +1005,15 @@ target_ulong helper_mftc0_tchalt(void) + return other->tcs[other_tc].CP0_TCHalt; + } + +-target_ulong helper_mfc0_tccontext (void) ++target_ulong helper_mfc0_tccontext(CPUMIPSState *env) + { + return env->active_tc.CP0_TCContext; + } + +-target_ulong helper_mftc0_tccontext(void) ++target_ulong helper_mftc0_tccontext(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCContext; +@@ -983,15 +1021,15 @@ target_ulong helper_mftc0_tccontext(void) + return other->tcs[other_tc].CP0_TCContext; + } + +-target_ulong helper_mfc0_tcschedule (void) ++target_ulong helper_mfc0_tcschedule(CPUMIPSState *env) + { + return env->active_tc.CP0_TCSchedule; + } + +-target_ulong helper_mftc0_tcschedule(void) ++target_ulong helper_mftc0_tcschedule(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCSchedule; +@@ -999,15 +1037,15 @@ target_ulong helper_mftc0_tcschedule(void) + return other->tcs[other_tc].CP0_TCSchedule; + } + +-target_ulong helper_mfc0_tcschefback (void) ++target_ulong helper_mfc0_tcschefback(CPUMIPSState *env) + { + return env->active_tc.CP0_TCScheFBack; + } + +-target_ulong helper_mftc0_tcschefback(void) ++target_ulong helper_mftc0_tcschefback(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCScheFBack; +@@ -1015,24 +1053,24 @@ target_ulong helper_mftc0_tcschefback(void) + return other->tcs[other_tc].CP0_TCScheFBack; + } + +-target_ulong helper_mfc0_count (void) ++target_ulong helper_mfc0_count(CPUMIPSState *env) + { + return (int32_t)cpu_mips_get_count(env); + } + +-target_ulong helper_mftc0_entryhi(void) ++target_ulong helper_mftc0_entryhi(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_EntryHi; + } + +-target_ulong helper_mftc0_cause(void) ++target_ulong helper_mftc0_cause(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + int32_t tccause; +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) { + tccause = other->CP0_Cause; +@@ -1043,30 +1081,30 @@ target_ulong helper_mftc0_cause(void) + return tccause; + } + +-target_ulong helper_mftc0_status(void) ++target_ulong helper_mftc0_status(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_Status; + } + +-target_ulong helper_mfc0_lladdr (void) ++target_ulong helper_mfc0_lladdr(CPUMIPSState *env) + { + return (int32_t)(env->lladdr >> env->CP0_LLAddr_shift); + } + +-target_ulong helper_mfc0_watchlo (uint32_t sel) ++target_ulong helper_mfc0_watchlo(CPUMIPSState *env, uint32_t sel) + { + return (int32_t)env->CP0_WatchLo[sel]; + } + +-target_ulong helper_mfc0_watchhi (uint32_t sel) ++target_ulong helper_mfc0_watchhi(CPUMIPSState *env, uint32_t sel) + { + return env->CP0_WatchHi[sel]; + } + +-target_ulong helper_mfc0_debug (void) ++target_ulong helper_mfc0_debug(CPUMIPSState *env) + { + target_ulong t0 = env->CP0_Debug; + if (env->hflags & MIPS_HFLAG_DM) +@@ -1075,11 +1113,11 @@ target_ulong helper_mfc0_debug (void) + return t0; + } + +-target_ulong helper_mftc0_debug(void) ++target_ulong helper_mftc0_debug(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + int32_t tcstatus; +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + tcstatus = other->active_tc.CP0_Debug_tcstatus; +@@ -1092,43 +1130,43 @@ target_ulong helper_mftc0_debug(void) + } + + #if defined(TARGET_MIPS64) +-target_ulong helper_dmfc0_tcrestart (void) ++target_ulong helper_dmfc0_tcrestart(CPUMIPSState *env) + { + return env->active_tc.PC; + } + +-target_ulong helper_dmfc0_tchalt (void) ++target_ulong helper_dmfc0_tchalt(CPUMIPSState *env) + { + return env->active_tc.CP0_TCHalt; + } + +-target_ulong helper_dmfc0_tccontext (void) ++target_ulong helper_dmfc0_tccontext(CPUMIPSState *env) + { + return env->active_tc.CP0_TCContext; + } + +-target_ulong helper_dmfc0_tcschedule (void) ++target_ulong helper_dmfc0_tcschedule(CPUMIPSState *env) + { + return env->active_tc.CP0_TCSchedule; + } + +-target_ulong helper_dmfc0_tcschefback (void) ++target_ulong helper_dmfc0_tcschefback(CPUMIPSState *env) + { + return env->active_tc.CP0_TCScheFBack; + } + +-target_ulong helper_dmfc0_lladdr (void) ++target_ulong helper_dmfc0_lladdr(CPUMIPSState *env) + { + return env->lladdr >> env->CP0_LLAddr_shift; + } + +-target_ulong helper_dmfc0_watchlo (uint32_t sel) ++target_ulong helper_dmfc0_watchlo(CPUMIPSState *env, uint32_t sel) + { + return env->CP0_WatchLo[sel]; + } + #endif /* TARGET_MIPS64 */ + +-void helper_mtc0_index (target_ulong arg1) ++void helper_mtc0_index(CPUMIPSState *env, target_ulong arg1) + { + int num = 1; + unsigned int tmp = env->tlb->nb_tlb; +@@ -1140,7 +1178,7 @@ void helper_mtc0_index (target_ulong arg1) + env->CP0_Index = (env->CP0_Index & 0x80000000) | (arg1 & (num - 1)); + } + +-void helper_mtc0_mvpcontrol (target_ulong arg1) ++void helper_mtc0_mvpcontrol(CPUMIPSState *env, target_ulong arg1) + { + uint32_t mask = 0; + uint32_t newval; +@@ -1157,7 +1195,7 @@ void helper_mtc0_mvpcontrol (target_ulong arg1) + env->mvp->CP0_MVPControl = newval; + } + +-void helper_mtc0_vpecontrol (target_ulong arg1) ++void helper_mtc0_vpecontrol(CPUMIPSState *env, target_ulong arg1) + { + uint32_t mask; + uint32_t newval; +@@ -1174,10 +1212,10 @@ void helper_mtc0_vpecontrol (target_ulong arg1) + env->CP0_VPEControl = newval; + } + +-void helper_mttc0_vpecontrol(target_ulong arg1) ++void helper_mttc0_vpecontrol(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + uint32_t mask; + uint32_t newval; + +@@ -1190,23 +1228,23 @@ void helper_mttc0_vpecontrol(target_ulong arg1) + other->CP0_VPEControl = newval; + } + +-target_ulong helper_mftc0_vpecontrol(void) ++target_ulong helper_mftc0_vpecontrol(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + /* FIXME: Mask away return zero on read bits. */ + return other->CP0_VPEControl; + } + +-target_ulong helper_mftc0_vpeconf0(void) ++target_ulong helper_mftc0_vpeconf0(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_VPEConf0; + } + +-void helper_mtc0_vpeconf0 (target_ulong arg1) ++void helper_mtc0_vpeconf0(CPUMIPSState *env, target_ulong arg1) + { + uint32_t mask = 0; + uint32_t newval; +@@ -1223,10 +1261,10 @@ void helper_mtc0_vpeconf0 (target_ulong arg1) + env->CP0_VPEConf0 = newval; + } + +-void helper_mttc0_vpeconf0(target_ulong arg1) ++void helper_mttc0_vpeconf0(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + uint32_t mask = 0; + uint32_t newval; + +@@ -1237,7 +1275,7 @@ void helper_mttc0_vpeconf0(target_ulong arg1) + other->CP0_VPEConf0 = newval; + } + +-void helper_mtc0_vpeconf1 (target_ulong arg1) ++void helper_mtc0_vpeconf1(CPUMIPSState *env, target_ulong arg1) + { + uint32_t mask = 0; + uint32_t newval; +@@ -1255,25 +1293,25 @@ void helper_mtc0_vpeconf1 (target_ulong arg1) + env->CP0_VPEConf1 = newval; + } + +-void helper_mtc0_yqmask (target_ulong arg1) ++void helper_mtc0_yqmask(CPUMIPSState *env, target_ulong arg1) + { + /* Yield qualifier inputs not implemented. */ + env->CP0_YQMask = 0x00000000; + } + +-void helper_mtc0_vpeopt (target_ulong arg1) ++void helper_mtc0_vpeopt(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_VPEOpt = arg1 & 0x0000ffff; + } + +-void helper_mtc0_entrylo0 (target_ulong arg1) ++void helper_mtc0_entrylo0(CPUMIPSState *env, target_ulong arg1) + { + /* Large physaddr (PABITS) not implemented */ + /* 1k pages not implemented */ + env->CP0_EntryLo0 = arg1 & 0x3FFFFFFF; + } + +-void helper_mtc0_tcstatus (target_ulong arg1) ++void helper_mtc0_tcstatus(CPUMIPSState *env, target_ulong arg1) + { + uint32_t mask = env->CP0_TCStatus_rw_bitmask; + uint32_t newval; +@@ -1284,10 +1322,10 @@ void helper_mtc0_tcstatus (target_ulong arg1) + sync_c0_tcstatus(env, env->current_tc, newval); + } + +-void helper_mttc0_tcstatus (target_ulong arg1) ++void helper_mttc0_tcstatus(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCStatus = arg1; +@@ -1296,7 +1334,7 @@ void helper_mttc0_tcstatus (target_ulong arg1) + sync_c0_tcstatus(other, other_tc, arg1); + } + +-void helper_mtc0_tcbind (target_ulong arg1) ++void helper_mtc0_tcbind(CPUMIPSState *env, target_ulong arg1) + { + uint32_t mask = (1 << CP0TCBd_TBE); + uint32_t newval; +@@ -1307,12 +1345,12 @@ void helper_mtc0_tcbind (target_ulong arg1) + env->active_tc.CP0_TCBind = newval; + } + +-void helper_mttc0_tcbind (target_ulong arg1) ++void helper_mttc0_tcbind(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + uint32_t mask = (1 << CP0TCBd_TBE); + uint32_t newval; +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) + mask |= (1 << CP0TCBd_CurVPE); +@@ -1325,7 +1363,7 @@ void helper_mttc0_tcbind (target_ulong arg1) + } + } + +-void helper_mtc0_tcrestart (target_ulong arg1) ++void helper_mtc0_tcrestart(CPUMIPSState *env, target_ulong arg1) + { + env->active_tc.PC = arg1; + env->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS); +@@ -1333,10 +1371,10 @@ void helper_mtc0_tcrestart (target_ulong arg1) + /* MIPS16 not implemented. */ + } + +-void helper_mttc0_tcrestart (target_ulong arg1) ++void helper_mttc0_tcrestart(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) { + other->active_tc.PC = arg1; +@@ -1351,7 +1389,7 @@ void helper_mttc0_tcrestart (target_ulong arg1) + } + } + +-void helper_mtc0_tchalt (target_ulong arg1) ++void helper_mtc0_tchalt(CPUMIPSState *env, target_ulong arg1) + { + env->active_tc.CP0_TCHalt = arg1 & 0x1; + +@@ -1363,10 +1401,10 @@ void helper_mtc0_tchalt (target_ulong arg1) + } + } + +-void helper_mttc0_tchalt (target_ulong arg1) ++void helper_mttc0_tchalt(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + // TODO: Halt TC / Restart (if allocated+active) TC. + +@@ -1382,15 +1420,15 @@ void helper_mttc0_tchalt (target_ulong arg1) + } + } + +-void helper_mtc0_tccontext (target_ulong arg1) ++void helper_mtc0_tccontext(CPUMIPSState *env, target_ulong arg1) + { + env->active_tc.CP0_TCContext = arg1; + } + +-void helper_mttc0_tccontext (target_ulong arg1) ++void helper_mttc0_tccontext(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCContext = arg1; +@@ -1398,15 +1436,15 @@ void helper_mttc0_tccontext (target_ulong arg1) + other->tcs[other_tc].CP0_TCContext = arg1; + } + +-void helper_mtc0_tcschedule (target_ulong arg1) ++void helper_mtc0_tcschedule(CPUMIPSState *env, target_ulong arg1) + { + env->active_tc.CP0_TCSchedule = arg1; + } + +-void helper_mttc0_tcschedule (target_ulong arg1) ++void helper_mttc0_tcschedule(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCSchedule = arg1; +@@ -1414,15 +1452,15 @@ void helper_mttc0_tcschedule (target_ulong arg1) + other->tcs[other_tc].CP0_TCSchedule = arg1; + } + +-void helper_mtc0_tcschefback (target_ulong arg1) ++void helper_mtc0_tcschefback(CPUMIPSState *env, target_ulong arg1) + { + env->active_tc.CP0_TCScheFBack = arg1; + } + +-void helper_mttc0_tcschefback (target_ulong arg1) ++void helper_mttc0_tcschefback(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCScheFBack = arg1; +@@ -1430,25 +1468,25 @@ void helper_mttc0_tcschefback (target_ulong arg1) + other->tcs[other_tc].CP0_TCScheFBack = arg1; + } + +-void helper_mtc0_entrylo1 (target_ulong arg1) ++void helper_mtc0_entrylo1(CPUMIPSState *env, target_ulong arg1) + { + /* Large physaddr (PABITS) not implemented */ + /* 1k pages not implemented */ + env->CP0_EntryLo1 = arg1 & 0x3FFFFFFF; + } + +-void helper_mtc0_context (target_ulong arg1) ++void helper_mtc0_context(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_Context = (env->CP0_Context & 0x007FFFFF) | (arg1 & ~0x007FFFFF); + } + +-void helper_mtc0_pagemask (target_ulong arg1) ++void helper_mtc0_pagemask(CPUMIPSState *env, target_ulong arg1) + { + /* 1k pages not implemented */ + env->CP0_PageMask = arg1 & (0x1FFFFFFF & (TARGET_PAGE_MASK << 1)); + } + +-void helper_mtc0_pagegrain (target_ulong arg1) ++void helper_mtc0_pagegrain(CPUMIPSState *env, target_ulong arg1) + { + /* SmartMIPS not implemented */ + /* Large physaddr (PABITS) not implemented */ +@@ -1456,47 +1494,47 @@ void helper_mtc0_pagegrain (target_ulong arg1) + env->CP0_PageGrain = 0; + } + +-void helper_mtc0_wired (target_ulong arg1) ++void helper_mtc0_wired(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_Wired = arg1 % env->tlb->nb_tlb; + } + +-void helper_mtc0_srsconf0 (target_ulong arg1) ++void helper_mtc0_srsconf0(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_SRSConf0 |= arg1 & env->CP0_SRSConf0_rw_bitmask; + } + +-void helper_mtc0_srsconf1 (target_ulong arg1) ++void helper_mtc0_srsconf1(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_SRSConf1 |= arg1 & env->CP0_SRSConf1_rw_bitmask; + } + +-void helper_mtc0_srsconf2 (target_ulong arg1) ++void helper_mtc0_srsconf2(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_SRSConf2 |= arg1 & env->CP0_SRSConf2_rw_bitmask; + } + +-void helper_mtc0_srsconf3 (target_ulong arg1) ++void helper_mtc0_srsconf3(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_SRSConf3 |= arg1 & env->CP0_SRSConf3_rw_bitmask; + } + +-void helper_mtc0_srsconf4 (target_ulong arg1) ++void helper_mtc0_srsconf4(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_SRSConf4 |= arg1 & env->CP0_SRSConf4_rw_bitmask; + } + +-void helper_mtc0_hwrena (target_ulong arg1) ++void helper_mtc0_hwrena(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_HWREna = arg1 & 0x0000000F; + } + +-void helper_mtc0_count (target_ulong arg1) ++void helper_mtc0_count(CPUMIPSState *env, target_ulong arg1) + { + cpu_mips_store_count(env, arg1); + } + +-void helper_mtc0_entryhi (target_ulong arg1) ++void helper_mtc0_entryhi(CPUMIPSState *env, target_ulong arg1) + { + target_ulong old, val; + +@@ -1515,21 +1553,21 @@ void helper_mtc0_entryhi (target_ulong arg1) + cpu_mips_tlb_flush(env, 1); + } + +-void helper_mttc0_entryhi(target_ulong arg1) ++void helper_mttc0_entryhi(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + other->CP0_EntryHi = arg1; + sync_c0_entryhi(other, other_tc); + } + +-void helper_mtc0_compare (target_ulong arg1) ++void helper_mtc0_compare(CPUMIPSState *env, target_ulong arg1) + { + cpu_mips_store_compare(env, arg1); + } + +-void helper_mtc0_status (target_ulong arg1) ++void helper_mtc0_status(CPUMIPSState *env, target_ulong arg1) + { + uint32_t val, old; + uint32_t mask = env->CP0_Status_rw_bitmask; +@@ -1538,7 +1576,7 @@ void helper_mtc0_status (target_ulong arg1) + old = env->CP0_Status; + env->CP0_Status = (env->CP0_Status & ~mask) | val; + if (env->CP0_Config3 & (1 << CP0C3_MT)) { +- sync_c0_status(env, env->current_tc); ++ sync_c0_status(env, env, env->current_tc); + } else { + compute_hflags(env); + } +@@ -1557,22 +1595,22 @@ void helper_mtc0_status (target_ulong arg1) + } + } + +-void helper_mttc0_status(target_ulong arg1) ++void helper_mttc0_status(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + other->CP0_Status = arg1 & ~0xf1000018; +- sync_c0_status(other, other_tc); ++ sync_c0_status(env, other, other_tc); + } + +-void helper_mtc0_intctl (target_ulong arg1) ++void helper_mtc0_intctl(CPUMIPSState *env, target_ulong arg1) + { + /* vectored interrupts not implemented, no performance counters. */ + env->CP0_IntCtl = (env->CP0_IntCtl & ~0x000003e0) | (arg1 & 0x000003e0); + } + +-void helper_mtc0_srsctl (target_ulong arg1) ++void helper_mtc0_srsctl(CPUMIPSState *env, target_ulong arg1) + { + uint32_t mask = (0xf << CP0SRSCtl_ESS) | (0xf << CP0SRSCtl_PSS); + env->CP0_SRSCtl = (env->CP0_SRSCtl & ~mask) | (arg1 & mask); +@@ -1606,52 +1644,52 @@ static void mtc0_cause(CPUMIPSState *cpu, target_ulong arg1) + } + } + +-void helper_mtc0_cause(target_ulong arg1) ++void helper_mtc0_cause(CPUMIPSState *env, target_ulong arg1) + { + mtc0_cause(env, arg1); + } + +-void helper_mttc0_cause(target_ulong arg1) ++void helper_mttc0_cause(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + mtc0_cause(other, arg1); + } + +-target_ulong helper_mftc0_epc(void) ++target_ulong helper_mftc0_epc(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_EPC; + } + +-target_ulong helper_mftc0_ebase(void) ++target_ulong helper_mftc0_ebase(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_EBase; + } + +-void helper_mtc0_ebase (target_ulong arg1) ++void helper_mtc0_ebase(CPUMIPSState *env, target_ulong arg1) + { + /* vectored interrupts not implemented */ + env->CP0_EBase = (env->CP0_EBase & ~0x3FFFF000) | (arg1 & 0x3FFFF000); + } + +-void helper_mttc0_ebase(target_ulong arg1) ++void helper_mttc0_ebase(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + other->CP0_EBase = (other->CP0_EBase & ~0x3FFFF000) | (arg1 & 0x3FFFF000); + } + +-target_ulong helper_mftc0_configx(target_ulong idx) ++target_ulong helper_mftc0_configx(CPUMIPSState *env, target_ulong idx) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + switch (idx) { + case 0: return other->CP0_Config0; +@@ -1667,49 +1705,49 @@ target_ulong helper_mftc0_configx(target_ulong idx) + return 0; + } + +-void helper_mtc0_config0 (target_ulong arg1) ++void helper_mtc0_config0(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_Config0 = (env->CP0_Config0 & 0x81FFFFF8) | (arg1 & 0x00000007); + } + +-void helper_mtc0_config2 (target_ulong arg1) ++void helper_mtc0_config2(CPUMIPSState *env, target_ulong arg1) + { + /* tertiary/secondary caches not implemented */ + env->CP0_Config2 = (env->CP0_Config2 & 0x8FFF0FFF); + } + +-void helper_mtc0_lladdr (target_ulong arg1) ++void helper_mtc0_lladdr(CPUMIPSState *env, target_ulong arg1) + { + target_long mask = env->CP0_LLAddr_rw_bitmask; + arg1 = arg1 << env->CP0_LLAddr_shift; + env->lladdr = (env->lladdr & ~mask) | (arg1 & mask); + } + +-void helper_mtc0_watchlo (target_ulong arg1, uint32_t sel) ++void helper_mtc0_watchlo(CPUMIPSState *env, target_ulong arg1, uint32_t sel) + { + /* Watch exceptions for instructions, data loads, data stores + not implemented. */ + env->CP0_WatchLo[sel] = (arg1 & ~0x7); + } + +-void helper_mtc0_watchhi (target_ulong arg1, uint32_t sel) ++void helper_mtc0_watchhi(CPUMIPSState *env, target_ulong arg1, uint32_t sel) + { + env->CP0_WatchHi[sel] = (arg1 & 0x40FF0FF8); + env->CP0_WatchHi[sel] &= ~(env->CP0_WatchHi[sel] & arg1 & 0x7); + } + +-void helper_mtc0_xcontext (target_ulong arg1) ++void helper_mtc0_xcontext(CPUMIPSState *env, target_ulong arg1) + { + target_ulong mask = (1ULL << (env->SEGBITS - 7)) - 1; + env->CP0_XContext = (env->CP0_XContext & mask) | (arg1 & ~mask); + } + +-void helper_mtc0_framemask (target_ulong arg1) ++void helper_mtc0_framemask(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_Framemask = arg1; /* XXX */ + } + +-void helper_mtc0_debug (target_ulong arg1) ++void helper_mtc0_debug(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_Debug = (env->CP0_Debug & 0x8C03FC1F) | (arg1 & 0x13300120); + if (arg1 & (1 << CP0DB_DM)) +@@ -1718,11 +1756,11 @@ void helper_mtc0_debug (target_ulong arg1) + env->hflags &= ~MIPS_HFLAG_DM; + } + +-void helper_mttc0_debug(target_ulong arg1) ++void helper_mttc0_debug(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + uint32_t val = arg1 & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt)); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + /* XXX: Might be wrong, check with EJTAG spec. */ + if (other_tc == other->current_tc) +@@ -1734,36 +1772,36 @@ void helper_mttc0_debug(target_ulong arg1) + (arg1 & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt))); + } + +-void helper_mtc0_performance0 (target_ulong arg1) ++void helper_mtc0_performance0(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_Performance0 = arg1 & 0x000007ff; + } + +-void helper_mtc0_taglo (target_ulong arg1) ++void helper_mtc0_taglo(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_TagLo = arg1 & 0xFFFFFCF6; + } + +-void helper_mtc0_datalo (target_ulong arg1) ++void helper_mtc0_datalo(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_DataLo = arg1; /* XXX */ + } + +-void helper_mtc0_taghi (target_ulong arg1) ++void helper_mtc0_taghi(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_TagHi = arg1; /* XXX */ + } + +-void helper_mtc0_datahi (target_ulong arg1) ++void helper_mtc0_datahi(CPUMIPSState *env, target_ulong arg1) + { + env->CP0_DataHi = arg1; /* XXX */ + } + + /* MIPS MT functions */ +-target_ulong helper_mftgpr(uint32_t sel) ++target_ulong helper_mftgpr(CPUMIPSState *env, uint32_t sel) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.gpr[sel]; +@@ -1771,10 +1809,10 @@ target_ulong helper_mftgpr(uint32_t sel) + return other->tcs[other_tc].gpr[sel]; + } + +-target_ulong helper_mftlo(uint32_t sel) ++target_ulong helper_mftlo(CPUMIPSState *env, uint32_t sel) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.LO[sel]; +@@ -1782,10 +1820,10 @@ target_ulong helper_mftlo(uint32_t sel) + return other->tcs[other_tc].LO[sel]; + } + +-target_ulong helper_mfthi(uint32_t sel) ++target_ulong helper_mfthi(CPUMIPSState *env, uint32_t sel) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.HI[sel]; +@@ -1793,10 +1831,10 @@ target_ulong helper_mfthi(uint32_t sel) + return other->tcs[other_tc].HI[sel]; + } + +-target_ulong helper_mftacx(uint32_t sel) ++target_ulong helper_mftacx(CPUMIPSState *env, uint32_t sel) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.ACX[sel]; +@@ -1804,10 +1842,10 @@ target_ulong helper_mftacx(uint32_t sel) + return other->tcs[other_tc].ACX[sel]; + } + +-target_ulong helper_mftdsp(void) ++target_ulong helper_mftdsp(CPUMIPSState *env) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.DSPControl; +@@ -1815,10 +1853,10 @@ target_ulong helper_mftdsp(void) + return other->tcs[other_tc].DSPControl; + } + +-void helper_mttgpr(target_ulong arg1, uint32_t sel) ++void helper_mttgpr(CPUMIPSState *env, target_ulong arg1, uint32_t sel) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.gpr[sel] = arg1; +@@ -1826,10 +1864,10 @@ void helper_mttgpr(target_ulong arg1, uint32_t sel) + other->tcs[other_tc].gpr[sel] = arg1; + } + +-void helper_mttlo(target_ulong arg1, uint32_t sel) ++void helper_mttlo(CPUMIPSState *env, target_ulong arg1, uint32_t sel) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.LO[sel] = arg1; +@@ -1837,10 +1875,10 @@ void helper_mttlo(target_ulong arg1, uint32_t sel) + other->tcs[other_tc].LO[sel] = arg1; + } + +-void helper_mtthi(target_ulong arg1, uint32_t sel) ++void helper_mtthi(CPUMIPSState *env, target_ulong arg1, uint32_t sel) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.HI[sel] = arg1; +@@ -1848,10 +1886,10 @@ void helper_mtthi(target_ulong arg1, uint32_t sel) + other->tcs[other_tc].HI[sel] = arg1; + } + +-void helper_mttacx(target_ulong arg1, uint32_t sel) ++void helper_mttacx(CPUMIPSState *env, target_ulong arg1, uint32_t sel) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.ACX[sel] = arg1; +@@ -1859,10 +1897,10 @@ void helper_mttacx(target_ulong arg1, uint32_t sel) + other->tcs[other_tc].ACX[sel] = arg1; + } + +-void helper_mttdsp(target_ulong arg1) ++void helper_mttdsp(CPUMIPSState *env, target_ulong arg1) + { + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); +- CPUMIPSState *other = mips_cpu_map_tc(&other_tc); ++ CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.DSPControl = arg1; +@@ -1883,7 +1921,7 @@ target_ulong helper_emt(void) + return 0; + } + +-target_ulong helper_dvpe(void) ++target_ulong helper_dvpe(CPUMIPSState *env) + { + CPUMIPSState *other_cpu = first_cpu; + target_ulong prev = env->mvp->CP0_MVPControl; +@@ -1899,7 +1937,7 @@ target_ulong helper_dvpe(void) + return prev; + } + +-target_ulong helper_evpe(void) ++target_ulong helper_evpe(CPUMIPSState *env) + { + CPUMIPSState *other_cpu = first_cpu; + target_ulong prev = env->mvp->CP0_MVPControl; +@@ -1925,7 +1963,7 @@ void helper_fork(target_ulong arg1, target_ulong arg2) + // TODO: store to TC register + } + +-target_ulong helper_yield(target_ulong arg) ++target_ulong helper_yield(CPUMIPSState *env, target_ulong arg) + { + target_long arg1 = arg; + +@@ -1936,13 +1974,13 @@ target_ulong helper_yield(target_ulong arg) + env->active_tc.CP0_TCStatus & (1 << CP0TCSt_DT)) { + env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); + env->CP0_VPEControl |= 4 << CP0VPECo_EXCPT; +- helper_raise_exception(EXCP_THREAD); ++ helper_raise_exception(env, EXCP_THREAD); + } + } + } else if (arg1 == 0) { + if (0 /* TODO: TC underflow */) { + env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); +- helper_raise_exception(EXCP_THREAD); ++ helper_raise_exception(env, EXCP_THREAD); + } else { + // TODO: Deallocate TC + } +@@ -1950,7 +1988,7 @@ target_ulong helper_yield(target_ulong arg) + /* Yield qualifier inputs not implemented. */ + env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); + env->CP0_VPEControl |= 2 << CP0VPECo_EXCPT; +- helper_raise_exception(EXCP_THREAD); ++ helper_raise_exception(env, EXCP_THREAD); + } + return env->CP0_YQMask; + } +@@ -1972,7 +2010,7 @@ static void r4k_mips_tlb_flush_extra (CPUMIPSState *env, int first) + } + } + +-static void r4k_fill_tlb (int idx) ++static void r4k_fill_tlb(CPUMIPSState *env, int idx) + { + r4k_tlb_t *tlb; + +@@ -1995,7 +2033,7 @@ static void r4k_fill_tlb (int idx) + tlb->PFN[1] = (env->CP0_EntryLo1 >> 6) << 12; + } + +-void r4k_helper_tlbwi (void) ++void r4k_helper_tlbwi(CPUMIPSState *env) + { + int idx; + +@@ -2007,18 +2045,18 @@ void r4k_helper_tlbwi (void) + r4k_mips_tlb_flush_extra (env, env->tlb->nb_tlb); + + r4k_invalidate_tlb(env, idx, 0); +- r4k_fill_tlb(idx); ++ r4k_fill_tlb(env, idx); + } + +-void r4k_helper_tlbwr (void) ++void r4k_helper_tlbwr(CPUMIPSState *env) + { + int r = cpu_mips_get_random(env); + + r4k_invalidate_tlb(env, r, 1); +- r4k_fill_tlb(r); ++ r4k_fill_tlb(env, r); + } + +-void r4k_helper_tlbp (void) ++void r4k_helper_tlbp(CPUMIPSState *env) + { + r4k_tlb_t *tlb; + target_ulong mask; +@@ -2060,7 +2098,7 @@ void r4k_helper_tlbp (void) + } + } + +-void r4k_helper_tlbr (void) ++void r4k_helper_tlbr(CPUMIPSState *env) + { + r4k_tlb_t *tlb; + uint8_t ASID; +@@ -2084,28 +2122,28 @@ void r4k_helper_tlbr (void) + (tlb->C1 << 3) | (tlb->PFN[1] >> 6); + } + +-void helper_tlbwi(void) ++void helper_tlbwi(CPUMIPSState *env) + { +- env->tlb->helper_tlbwi(); ++ env->tlb->helper_tlbwi(env); + } + +-void helper_tlbwr(void) ++void helper_tlbwr(CPUMIPSState *env) + { +- env->tlb->helper_tlbwr(); ++ env->tlb->helper_tlbwr(env); + } + +-void helper_tlbp(void) ++void helper_tlbp(CPUMIPSState *env) + { +- env->tlb->helper_tlbp(); ++ env->tlb->helper_tlbp(env); + } + +-void helper_tlbr(void) ++void helper_tlbr(CPUMIPSState *env) + { +- env->tlb->helper_tlbr(); ++ env->tlb->helper_tlbr(env); + } + + /* Specials */ +-target_ulong helper_di (void) ++target_ulong helper_di(CPUMIPSState *env) + { + target_ulong t0 = env->CP0_Status; + +@@ -2113,7 +2151,7 @@ target_ulong helper_di (void) + return t0; + } + +-target_ulong helper_ei (void) ++target_ulong helper_ei(CPUMIPSState *env) + { + target_ulong t0 = env->CP0_Status; + +@@ -2121,7 +2159,7 @@ target_ulong helper_ei (void) + return t0; + } + +-static void debug_pre_eret (void) ++static void debug_pre_eret(CPUMIPSState *env) + { + if (qemu_loglevel_mask(CPU_LOG_EXEC)) { + qemu_log("ERET: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx, +@@ -2134,7 +2172,7 @@ static void debug_pre_eret (void) + } + } + +-static void debug_post_eret (void) ++static void debug_post_eret(CPUMIPSState *env) + { + if (qemu_loglevel_mask(CPU_LOG_EXEC)) { + qemu_log(" => PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx, +@@ -2152,7 +2190,7 @@ static void debug_post_eret (void) + } + } + +-static void set_pc (target_ulong error_pc) ++static void set_pc(CPUMIPSState *env, target_ulong error_pc) + { + env->active_tc.PC = error_pc & ~(target_ulong)1; + if (error_pc & 1) { +@@ -2162,78 +2200,78 @@ static void set_pc (target_ulong error_pc) + } + } + +-void helper_eret (void) ++void helper_eret(CPUMIPSState *env) + { +- debug_pre_eret(); ++ debug_pre_eret(env); + if (env->CP0_Status & (1 << CP0St_ERL)) { +- set_pc(env->CP0_ErrorEPC); ++ set_pc(env, env->CP0_ErrorEPC); + env->CP0_Status &= ~(1 << CP0St_ERL); + } else { +- set_pc(env->CP0_EPC); ++ set_pc(env, env->CP0_EPC); + env->CP0_Status &= ~(1 << CP0St_EXL); + } + compute_hflags(env); +- debug_post_eret(); ++ debug_post_eret(env); + env->lladdr = 1; + } + +-void helper_deret (void) ++void helper_deret(CPUMIPSState *env) + { +- debug_pre_eret(); +- set_pc(env->CP0_DEPC); ++ debug_pre_eret(env); ++ set_pc(env, env->CP0_DEPC); + + env->hflags &= MIPS_HFLAG_DM; + compute_hflags(env); +- debug_post_eret(); ++ debug_post_eret(env); + env->lladdr = 1; + } + #endif /* !CONFIG_USER_ONLY */ + +-target_ulong helper_rdhwr_cpunum(void) ++target_ulong helper_rdhwr_cpunum(CPUMIPSState *env) + { + if ((env->hflags & MIPS_HFLAG_CP0) || + (env->CP0_HWREna & (1 << 0))) + return env->CP0_EBase & 0x3ff; + else +- helper_raise_exception(EXCP_RI); ++ helper_raise_exception(env, EXCP_RI); + + return 0; + } + +-target_ulong helper_rdhwr_synci_step(void) ++target_ulong helper_rdhwr_synci_step(CPUMIPSState *env) + { + if ((env->hflags & MIPS_HFLAG_CP0) || + (env->CP0_HWREna & (1 << 1))) + return env->SYNCI_Step; + else +- helper_raise_exception(EXCP_RI); ++ helper_raise_exception(env, EXCP_RI); + + return 0; + } + +-target_ulong helper_rdhwr_cc(void) ++target_ulong helper_rdhwr_cc(CPUMIPSState *env) + { + if ((env->hflags & MIPS_HFLAG_CP0) || + (env->CP0_HWREna & (1 << 2))) + return env->CP0_Count; + else +- helper_raise_exception(EXCP_RI); ++ helper_raise_exception(env, EXCP_RI); + + return 0; + } + +-target_ulong helper_rdhwr_ccres(void) ++target_ulong helper_rdhwr_ccres(CPUMIPSState *env) + { + if ((env->hflags & MIPS_HFLAG_CP0) || + (env->CP0_HWREna & (1 << 3))) + return env->CCRes; + else +- helper_raise_exception(EXCP_RI); ++ helper_raise_exception(env, EXCP_RI); + + return 0; + } + +-void helper_pmon (int function) ++void helper_pmon(CPUMIPSState *env, int function) + { + function /= 2; + switch (function) { +@@ -2259,16 +2297,17 @@ void helper_pmon (int function) + } + } + +-void helper_wait (void) ++void helper_wait(CPUMIPSState *env) + { + env->halted = 1; + cpu_reset_interrupt(env, CPU_INTERRUPT_WAKE); +- helper_raise_exception(EXCP_HLT); ++ helper_raise_exception(env, EXCP_HLT); + } + + #if !defined(CONFIG_USER_ONLY) + +-static void QEMU_NORETURN do_unaligned_access(target_ulong addr, int is_write, ++static void QEMU_NORETURN do_unaligned_access(CPUMIPSState *env, ++ target_ulong addr, int is_write, + int is_user, uintptr_t retaddr); + + #define MMUSUFFIX _mmu +@@ -2286,23 +2325,20 @@ static void QEMU_NORETURN do_unaligned_access(target_ulong addr, int is_write, + #define SHIFT 3 + #include "softmmu_template.h" + +-static void do_unaligned_access(target_ulong addr, int is_write, +- int is_user, uintptr_t retaddr) ++static void do_unaligned_access(CPUMIPSState *env, target_ulong addr, ++ int is_write, int is_user, uintptr_t retaddr) + { + env->CP0_BadVAddr = addr; +- do_restore_state (retaddr); +- helper_raise_exception ((is_write == 1) ? EXCP_AdES : EXCP_AdEL); ++ do_restore_state(env, retaddr); ++ helper_raise_exception(env, (is_write == 1) ? EXCP_AdES : EXCP_AdEL); + } + +-void tlb_fill(CPUMIPSState *env1, target_ulong addr, int is_write, int mmu_idx, ++void tlb_fill(CPUMIPSState *env, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) + { + TranslationBlock *tb; +- CPUMIPSState *saved_env; + int ret; + +- saved_env = env; +- env = env1; + ret = cpu_mips_handle_mmu_fault(env, addr, is_write, mmu_idx); + if (ret) { + if (retaddr) { +@@ -2314,20 +2350,17 @@ void tlb_fill(CPUMIPSState *env1, target_ulong addr, int is_write, int mmu_idx, + cpu_restore_state(tb, env, retaddr); + } + } +- helper_raise_exception_err(env->exception_index, env->error_code); ++ helper_raise_exception_err(env, env->exception_index, env->error_code); + } +- env = saved_env; + } + +-void cpu_unassigned_access(CPUMIPSState *env1, target_phys_addr_t addr, ++void cpu_unassigned_access(CPUMIPSState *env, target_phys_addr_t addr, + int is_write, int is_exec, int unused, int size) + { +- env = env1; +- + if (is_exec) +- helper_raise_exception(EXCP_IBE); ++ helper_raise_exception(env, EXCP_IBE); + else +- helper_raise_exception(EXCP_DBE); ++ helper_raise_exception(env, EXCP_DBE); + } + #endif /* !CONFIG_USER_ONLY */ + +@@ -2356,7 +2389,7 @@ static unsigned int ieee_rm[] = { + #define RESTORE_FLUSH_MODE \ + set_flush_to_zero((env->active_fpu.fcr31 & (1 << 24)) != 0, &env->active_fpu.fp_status); + +-target_ulong helper_cfc1 (uint32_t reg) ++target_ulong helper_cfc1(CPUMIPSState *env, uint32_t reg) + { + target_ulong arg1; + +@@ -2381,7 +2414,7 @@ target_ulong helper_cfc1 (uint32_t reg) + return arg1; + } + +-void helper_ctc1 (target_ulong arg1, uint32_t reg) ++void helper_ctc1(CPUMIPSState *env, target_ulong arg1, uint32_t reg) + { + switch(reg) { + case 25: +@@ -2415,7 +2448,7 @@ void helper_ctc1 (target_ulong arg1, uint32_t reg) + RESTORE_FLUSH_MODE; + set_float_exception_flags(0, &env->active_fpu.fp_status); + if ((GET_FP_ENABLE(env->active_fpu.fcr31) | 0x20) & GET_FP_CAUSE(env->active_fpu.fcr31)) +- helper_raise_exception(EXCP_FPE); ++ helper_raise_exception(env, EXCP_FPE); + } + + static inline int ieee_ex_to_mips(int xcpt) +@@ -2441,13 +2474,13 @@ static inline int ieee_ex_to_mips(int xcpt) + return ret; + } + +-static inline void update_fcr31(void) ++static inline void update_fcr31(CPUMIPSState *env) + { + int tmp = ieee_ex_to_mips(get_float_exception_flags(&env->active_fpu.fp_status)); + + SET_FP_CAUSE(env->active_fpu.fcr31, tmp); + if (GET_FP_ENABLE(env->active_fpu.fcr31) & tmp) +- helper_raise_exception(EXCP_FPE); ++ helper_raise_exception(env, EXCP_FPE); + else + UPDATE_FP_FLAGS(env->active_fpu.fcr31, tmp); + } +@@ -2458,71 +2491,71 @@ static inline void update_fcr31(void) + paired single lower "pl", paired single upper "pu". */ + + /* unary operations, modifying fp status */ +-uint64_t helper_float_sqrt_d(uint64_t fdt0) ++uint64_t helper_float_sqrt_d(CPUMIPSState *env, uint64_t fdt0) + { + return float64_sqrt(fdt0, &env->active_fpu.fp_status); + } + +-uint32_t helper_float_sqrt_s(uint32_t fst0) ++uint32_t helper_float_sqrt_s(CPUMIPSState *env, uint32_t fst0) + { + return float32_sqrt(fst0, &env->active_fpu.fp_status); + } + +-uint64_t helper_float_cvtd_s(uint32_t fst0) ++uint64_t helper_float_cvtd_s(CPUMIPSState *env, uint32_t fst0) + { + uint64_t fdt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint64_t helper_float_cvtd_w(uint32_t wt0) ++uint64_t helper_float_cvtd_w(CPUMIPSState *env, uint32_t wt0) + { + uint64_t fdt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint64_t helper_float_cvtd_l(uint64_t dt0) ++uint64_t helper_float_cvtd_l(CPUMIPSState *env, uint64_t dt0) + { + uint64_t fdt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint64_t helper_float_cvtl_d(uint64_t fdt0) ++uint64_t helper_float_cvtl_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t dt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint64_t helper_float_cvtl_s(uint32_t fst0) ++uint64_t helper_float_cvtl_s(CPUMIPSState *env, uint32_t fst0) + { + uint64_t dt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint64_t helper_float_cvtps_pw(uint64_t dt0) ++uint64_t helper_float_cvtps_pw(CPUMIPSState *env, uint64_t dt0) + { + uint32_t fst2; + uint32_t fsth2; +@@ -2530,11 +2563,11 @@ uint64_t helper_float_cvtps_pw(uint64_t dt0) + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); + fsth2 = int32_to_float32(dt0 >> 32, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return ((uint64_t)fsth2 << 32) | fst2; + } + +-uint64_t helper_float_cvtpw_ps(uint64_t fdt0) ++uint64_t helper_float_cvtpw_ps(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t wt2; + uint32_t wth2; +@@ -2542,7 +2575,7 @@ uint64_t helper_float_cvtpw_ps(uint64_t fdt0) + set_float_exception_flags(0, &env->active_fpu.fp_status); + wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); + wth2 = float32_to_int32(fdt0 >> 32, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) { + wt2 = FLOAT_SNAN32; + wth2 = FLOAT_SNAN32; +@@ -2550,81 +2583,81 @@ uint64_t helper_float_cvtpw_ps(uint64_t fdt0) + return ((uint64_t)wth2 << 32) | wt2; + } + +-uint32_t helper_float_cvts_d(uint64_t fdt0) ++uint32_t helper_float_cvts_d(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t fst2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint32_t helper_float_cvts_w(uint32_t wt0) ++uint32_t helper_float_cvts_w(CPUMIPSState *env, uint32_t wt0) + { + uint32_t fst2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint32_t helper_float_cvts_l(uint64_t dt0) ++uint32_t helper_float_cvts_l(CPUMIPSState *env, uint64_t dt0) + { + uint32_t fst2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint32_t helper_float_cvts_pl(uint32_t wt0) ++uint32_t helper_float_cvts_pl(CPUMIPSState *env, uint32_t wt0) + { + uint32_t wt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + wt2 = wt0; +- update_fcr31(); ++ update_fcr31(env); + return wt2; + } + +-uint32_t helper_float_cvts_pu(uint32_t wth0) ++uint32_t helper_float_cvts_pu(CPUMIPSState *env, uint32_t wth0) + { + uint32_t wt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + wt2 = wth0; +- update_fcr31(); ++ update_fcr31(env); + return wt2; + } + +-uint32_t helper_float_cvtw_s(uint32_t fst0) ++uint32_t helper_float_cvtw_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t wt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint32_t helper_float_cvtw_d(uint64_t fdt0) ++uint32_t helper_float_cvtw_d(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t wt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint64_t helper_float_roundl_d(uint64_t fdt0) ++uint64_t helper_float_roundl_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t dt2; + +@@ -2632,13 +2665,13 @@ uint64_t helper_float_roundl_d(uint64_t fdt0) + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint64_t helper_float_roundl_s(uint32_t fst0) ++uint64_t helper_float_roundl_s(CPUMIPSState *env, uint32_t fst0) + { + uint64_t dt2; + +@@ -2646,13 +2679,13 @@ uint64_t helper_float_roundl_s(uint32_t fst0) + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint32_t helper_float_roundw_d(uint64_t fdt0) ++uint32_t helper_float_roundw_d(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t wt2; + +@@ -2660,13 +2693,13 @@ uint32_t helper_float_roundw_d(uint64_t fdt0) + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint32_t helper_float_roundw_s(uint32_t fst0) ++uint32_t helper_float_roundw_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t wt2; + +@@ -2674,61 +2707,61 @@ uint32_t helper_float_roundw_s(uint32_t fst0) + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint64_t helper_float_truncl_d(uint64_t fdt0) ++uint64_t helper_float_truncl_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t dt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint64_t helper_float_truncl_s(uint32_t fst0) ++uint64_t helper_float_truncl_s(CPUMIPSState *env, uint32_t fst0) + { + uint64_t dt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint32_t helper_float_truncw_d(uint64_t fdt0) ++uint32_t helper_float_truncw_d(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t wt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint32_t helper_float_truncw_s(uint32_t fst0) ++uint32_t helper_float_truncw_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t wt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint64_t helper_float_ceill_d(uint64_t fdt0) ++uint64_t helper_float_ceill_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t dt2; + +@@ -2736,13 +2769,13 @@ uint64_t helper_float_ceill_d(uint64_t fdt0) + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint64_t helper_float_ceill_s(uint32_t fst0) ++uint64_t helper_float_ceill_s(CPUMIPSState *env, uint32_t fst0) + { + uint64_t dt2; + +@@ -2750,13 +2783,13 @@ uint64_t helper_float_ceill_s(uint32_t fst0) + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint32_t helper_float_ceilw_d(uint64_t fdt0) ++uint32_t helper_float_ceilw_d(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t wt2; + +@@ -2764,13 +2797,13 @@ uint32_t helper_float_ceilw_d(uint64_t fdt0) + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint32_t helper_float_ceilw_s(uint32_t fst0) ++uint32_t helper_float_ceilw_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t wt2; + +@@ -2778,13 +2811,13 @@ uint32_t helper_float_ceilw_s(uint32_t fst0) + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint64_t helper_float_floorl_d(uint64_t fdt0) ++uint64_t helper_float_floorl_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t dt2; + +@@ -2792,13 +2825,13 @@ uint64_t helper_float_floorl_d(uint64_t fdt0) + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint64_t helper_float_floorl_s(uint32_t fst0) ++uint64_t helper_float_floorl_s(CPUMIPSState *env, uint32_t fst0) + { + uint64_t dt2; + +@@ -2806,13 +2839,13 @@ uint64_t helper_float_floorl_s(uint32_t fst0) + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + dt2 = FLOAT_SNAN64; + return dt2; + } + +-uint32_t helper_float_floorw_d(uint64_t fdt0) ++uint32_t helper_float_floorw_d(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t wt2; + +@@ -2820,13 +2853,13 @@ uint32_t helper_float_floorw_d(uint64_t fdt0) + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; + } + +-uint32_t helper_float_floorw_s(uint32_t fst0) ++uint32_t helper_float_floorw_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t wt2; + +@@ -2834,7 +2867,7 @@ uint32_t helper_float_floorw_s(uint32_t fst0) + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); + RESTORE_ROUNDING_MODE; +- update_fcr31(); ++ update_fcr31(env); + if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) + wt2 = FLOAT_SNAN32; + return wt2; +@@ -2864,69 +2897,69 @@ FLOAT_UNOP(chs) + #undef FLOAT_UNOP + + /* MIPS specific unary operations */ +-uint64_t helper_float_recip_d(uint64_t fdt0) ++uint64_t helper_float_recip_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t fdt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint32_t helper_float_recip_s(uint32_t fst0) ++uint32_t helper_float_recip_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t fst2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_div(FLOAT_ONE32, fst0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint64_t helper_float_rsqrt_d(uint64_t fdt0) ++uint64_t helper_float_rsqrt_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t fdt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); + fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint32_t helper_float_rsqrt_s(uint32_t fst0) ++uint32_t helper_float_rsqrt_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t fst2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); + fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint64_t helper_float_recip1_d(uint64_t fdt0) ++uint64_t helper_float_recip1_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t fdt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint32_t helper_float_recip1_s(uint32_t fst0) ++uint32_t helper_float_recip1_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t fst2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_div(FLOAT_ONE32, fst0, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint64_t helper_float_recip1_ps(uint64_t fdt0) ++uint64_t helper_float_recip1_ps(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t fst2; + uint32_t fsth2; +@@ -2934,33 +2967,33 @@ uint64_t helper_float_recip1_ps(uint64_t fdt0) + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_div(FLOAT_ONE32, fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); + fsth2 = float32_div(FLOAT_ONE32, fdt0 >> 32, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return ((uint64_t)fsth2 << 32) | fst2; + } + +-uint64_t helper_float_rsqrt1_d(uint64_t fdt0) ++uint64_t helper_float_rsqrt1_d(CPUMIPSState *env, uint64_t fdt0) + { + uint64_t fdt2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); + fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint32_t helper_float_rsqrt1_s(uint32_t fst0) ++uint32_t helper_float_rsqrt1_s(CPUMIPSState *env, uint32_t fst0) + { + uint32_t fst2; + + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); + fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint64_t helper_float_rsqrt1_ps(uint64_t fdt0) ++uint64_t helper_float_rsqrt1_ps(CPUMIPSState *env, uint64_t fdt0) + { + uint32_t fst2; + uint32_t fsth2; +@@ -2970,39 +3003,43 @@ uint64_t helper_float_rsqrt1_ps(uint64_t fdt0) + fsth2 = float32_sqrt(fdt0 >> 32, &env->active_fpu.fp_status); + fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); + fsth2 = float32_div(FLOAT_ONE32, fsth2, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return ((uint64_t)fsth2 << 32) | fst2; + } + +-#define FLOAT_OP(name, p) void helper_float_##name##_##p(void) ++#define FLOAT_OP(name, p) void helper_float_##name##_##p(CPUMIPSState *env) + + /* binary operations */ + #define FLOAT_BINOP(name) \ +-uint64_t helper_float_ ## name ## _d(uint64_t fdt0, uint64_t fdt1) \ ++uint64_t helper_float_ ## name ## _d(CPUMIPSState *env, \ ++ uint64_t fdt0, uint64_t fdt1) \ + { \ + uint64_t dt2; \ + \ + set_float_exception_flags(0, &env->active_fpu.fp_status); \ + dt2 = float64_ ## name (fdt0, fdt1, &env->active_fpu.fp_status); \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) \ + dt2 = FLOAT_QNAN64; \ + return dt2; \ + } \ + \ +-uint32_t helper_float_ ## name ## _s(uint32_t fst0, uint32_t fst1) \ ++uint32_t helper_float_ ## name ## _s(CPUMIPSState *env, \ ++ uint32_t fst0, uint32_t fst1) \ + { \ + uint32_t wt2; \ + \ + set_float_exception_flags(0, &env->active_fpu.fp_status); \ + wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status); \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) \ + wt2 = FLOAT_QNAN32; \ + return wt2; \ + } \ + \ +-uint64_t helper_float_ ## name ## _ps(uint64_t fdt0, uint64_t fdt1) \ ++uint64_t helper_float_ ## name ## _ps(CPUMIPSState *env, \ ++ uint64_t fdt0, \ ++ uint64_t fdt1) \ + { \ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ + uint32_t fsth0 = fdt0 >> 32; \ +@@ -3014,7 +3051,7 @@ uint64_t helper_float_ ## name ## _ps(uint64_t fdt0, uint64_t fdt1) \ + set_float_exception_flags(0, &env->active_fpu.fp_status); \ + wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status); \ + wth2 = float32_ ## name (fsth0, fsth1, &env->active_fpu.fp_status); \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) { \ + wt2 = FLOAT_QNAN32; \ + wth2 = FLOAT_QNAN32; \ +@@ -3030,22 +3067,28 @@ FLOAT_BINOP(div) + + /* ternary operations */ + #define FLOAT_TERNOP(name1, name2) \ +-uint64_t helper_float_ ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \ +- uint64_t fdt2) \ ++uint64_t helper_float_ ## name1 ## name2 ## _d(CPUMIPSState *env, \ ++ uint64_t fdt0, \ ++ uint64_t fdt1, \ ++ uint64_t fdt2) \ + { \ + fdt0 = float64_ ## name1 (fdt0, fdt1, &env->active_fpu.fp_status); \ + return float64_ ## name2 (fdt0, fdt2, &env->active_fpu.fp_status); \ + } \ + \ +-uint32_t helper_float_ ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \ +- uint32_t fst2) \ ++uint32_t helper_float_ ## name1 ## name2 ## _s(CPUMIPSState *env, \ ++ uint32_t fst0, \ ++ uint32_t fst1, \ ++ uint32_t fst2) \ + { \ + fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ + return float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ + } \ + \ +-uint64_t helper_float_ ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1, \ +- uint64_t fdt2) \ ++uint64_t helper_float_ ## name1 ## name2 ## _ps(CPUMIPSState *env, \ ++ uint64_t fdt0, \ ++ uint64_t fdt1, \ ++ uint64_t fdt2) \ + { \ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ + uint32_t fsth0 = fdt0 >> 32; \ +@@ -3067,24 +3110,30 @@ FLOAT_TERNOP(mul, sub) + + /* negated ternary operations */ + #define FLOAT_NTERNOP(name1, name2) \ +-uint64_t helper_float_n ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \ +- uint64_t fdt2) \ ++uint64_t helper_float_n ## name1 ## name2 ## _d(CPUMIPSState *env, \ ++ uint64_t fdt0, \ ++ uint64_t fdt1, \ ++ uint64_t fdt2) \ + { \ + fdt0 = float64_ ## name1 (fdt0, fdt1, &env->active_fpu.fp_status); \ + fdt2 = float64_ ## name2 (fdt0, fdt2, &env->active_fpu.fp_status); \ + return float64_chs(fdt2); \ + } \ + \ +-uint32_t helper_float_n ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \ +- uint32_t fst2) \ ++uint32_t helper_float_n ## name1 ## name2 ## _s(CPUMIPSState *env, \ ++ uint32_t fst0, \ ++ uint32_t fst1, \ ++ uint32_t fst2) \ + { \ + fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ + fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ + return float32_chs(fst2); \ + } \ + \ +-uint64_t helper_float_n ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1,\ +- uint64_t fdt2) \ ++uint64_t helper_float_n ## name1 ## name2 ## _ps(CPUMIPSState *env, \ ++ uint64_t fdt0, \ ++ uint64_t fdt1, \ ++ uint64_t fdt2) \ + { \ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ + uint32_t fsth0 = fdt0 >> 32; \ +@@ -3107,25 +3156,25 @@ FLOAT_NTERNOP(mul, sub) + #undef FLOAT_NTERNOP + + /* MIPS specific binary operations */ +-uint64_t helper_float_recip2_d(uint64_t fdt0, uint64_t fdt2) ++uint64_t helper_float_recip2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) + { + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); + fdt2 = float64_chs(float64_sub(fdt2, FLOAT_ONE64, &env->active_fpu.fp_status)); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint32_t helper_float_recip2_s(uint32_t fst0, uint32_t fst2) ++uint32_t helper_float_recip2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2) + { + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); + fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status)); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint64_t helper_float_recip2_ps(uint64_t fdt0, uint64_t fdt2) ++uint64_t helper_float_recip2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) + { + uint32_t fst0 = fdt0 & 0XFFFFFFFF; + uint32_t fsth0 = fdt0 >> 32; +@@ -3137,31 +3186,31 @@ uint64_t helper_float_recip2_ps(uint64_t fdt0, uint64_t fdt2) + fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); + fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status)); + fsth2 = float32_chs(float32_sub(fsth2, FLOAT_ONE32, &env->active_fpu.fp_status)); +- update_fcr31(); ++ update_fcr31(env); + return ((uint64_t)fsth2 << 32) | fst2; + } + +-uint64_t helper_float_rsqrt2_d(uint64_t fdt0, uint64_t fdt2) ++uint64_t helper_float_rsqrt2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) + { + set_float_exception_flags(0, &env->active_fpu.fp_status); + fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); + fdt2 = float64_sub(fdt2, FLOAT_ONE64, &env->active_fpu.fp_status); + fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, &env->active_fpu.fp_status)); +- update_fcr31(); ++ update_fcr31(env); + return fdt2; + } + +-uint32_t helper_float_rsqrt2_s(uint32_t fst0, uint32_t fst2) ++uint32_t helper_float_rsqrt2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2) + { + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); + fst2 = float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status); + fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status)); +- update_fcr31(); ++ update_fcr31(env); + return fst2; + } + +-uint64_t helper_float_rsqrt2_ps(uint64_t fdt0, uint64_t fdt2) ++uint64_t helper_float_rsqrt2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) + { + uint32_t fst0 = fdt0 & 0XFFFFFFFF; + uint32_t fsth0 = fdt0 >> 32; +@@ -3175,11 +3224,11 @@ uint64_t helper_float_rsqrt2_ps(uint64_t fdt0, uint64_t fdt2) + fsth2 = float32_sub(fsth2, FLOAT_ONE32, &env->active_fpu.fp_status); + fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status)); + fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, &env->active_fpu.fp_status)); +- update_fcr31(); ++ update_fcr31(env); + return ((uint64_t)fsth2 << 32) | fst2; + } + +-uint64_t helper_float_addr_ps(uint64_t fdt0, uint64_t fdt1) ++uint64_t helper_float_addr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1) + { + uint32_t fst0 = fdt0 & 0XFFFFFFFF; + uint32_t fsth0 = fdt0 >> 32; +@@ -3191,11 +3240,11 @@ uint64_t helper_float_addr_ps(uint64_t fdt0, uint64_t fdt1) + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_add (fst0, fsth0, &env->active_fpu.fp_status); + fsth2 = float32_add (fst1, fsth1, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return ((uint64_t)fsth2 << 32) | fst2; + } + +-uint64_t helper_float_mulr_ps(uint64_t fdt0, uint64_t fdt1) ++uint64_t helper_float_mulr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1) + { + uint32_t fst0 = fdt0 & 0XFFFFFFFF; + uint32_t fsth0 = fdt0 >> 32; +@@ -3207,31 +3256,33 @@ uint64_t helper_float_mulr_ps(uint64_t fdt0, uint64_t fdt1) + set_float_exception_flags(0, &env->active_fpu.fp_status); + fst2 = float32_mul (fst0, fsth0, &env->active_fpu.fp_status); + fsth2 = float32_mul (fst1, fsth1, &env->active_fpu.fp_status); +- update_fcr31(); ++ update_fcr31(env); + return ((uint64_t)fsth2 << 32) | fst2; + } + + /* compare operations */ + #define FOP_COND_D(op, cond) \ +-void helper_cmp_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ ++void helper_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ ++ uint64_t fdt1, int cc) \ + { \ + int c; \ + set_float_exception_flags(0, &env->active_fpu.fp_status); \ + c = cond; \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (c) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc, env->active_fpu); \ + } \ +-void helper_cmpabs_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ ++void helper_cmpabs_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ ++ uint64_t fdt1, int cc) \ + { \ + int c; \ + set_float_exception_flags(0, &env->active_fpu.fp_status); \ + fdt0 = float64_abs(fdt0); \ + fdt1 = float64_abs(fdt1); \ + c = cond; \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (c) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ +@@ -3260,25 +3311,27 @@ FOP_COND_D(le, float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) + FOP_COND_D(ngt, float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) || float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) + + #define FOP_COND_S(op, cond) \ +-void helper_cmp_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \ ++void helper_cmp_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ ++ uint32_t fst1, int cc) \ + { \ + int c; \ + set_float_exception_flags(0, &env->active_fpu.fp_status); \ + c = cond; \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (c) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc, env->active_fpu); \ + } \ +-void helper_cmpabs_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \ ++void helper_cmpabs_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ ++ uint32_t fst1, int cc) \ + { \ + int c; \ + set_float_exception_flags(0, &env->active_fpu.fp_status); \ + fst0 = float32_abs(fst0); \ + fst1 = float32_abs(fst1); \ + c = cond; \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (c) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ +@@ -3307,7 +3360,8 @@ FOP_COND_S(le, float32_le(fst0, fst1, &env->active_fpu.fp_status)) + FOP_COND_S(ngt, float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status)) + + #define FOP_COND_PS(op, condl, condh) \ +-void helper_cmp_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ ++void helper_cmp_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \ ++ uint64_t fdt1, int cc) \ + { \ + uint32_t fst0, fsth0, fst1, fsth1; \ + int ch, cl; \ +@@ -3318,7 +3372,7 @@ void helper_cmp_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ + fsth1 = fdt1 >> 32; \ + cl = condl; \ + ch = condh; \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (cl) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ +@@ -3328,7 +3382,8 @@ void helper_cmp_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ + else \ + CLEAR_FP_COND(cc + 1, env->active_fpu); \ + } \ +-void helper_cmpabs_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ ++void helper_cmpabs_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \ ++ uint64_t fdt1, int cc) \ + { \ + uint32_t fst0, fsth0, fst1, fsth1; \ + int ch, cl; \ +@@ -3338,7 +3393,7 @@ void helper_cmpabs_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ + fsth1 = float32_abs(fdt1 >> 32); \ + cl = condl; \ + ch = condh; \ +- update_fcr31(); \ ++ update_fcr31(env); \ + if (cl) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ +diff --git a/target-mips/translate.c b/target-mips/translate.c +index b293419..7ab769f 100644 +--- a/target-mips/translate.c ++++ b/target-mips/translate.c +@@ -483,27 +483,45 @@ static uint32_t gen_opc_hflags[OPC_BUF_SIZE]; + + #include "gen-icount.h" + +-#define gen_helper_0i(name, arg) do { \ ++#define gen_helper_0e0i(name, arg) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(arg); \ +- gen_helper_##name(helper_tmp); \ ++ gen_helper_##name(cpu_env, helper_tmp); \ + tcg_temp_free_i32(helper_tmp); \ + } while(0) + +-#define gen_helper_1i(name, arg1, arg2) do { \ ++#define gen_helper_0e1i(name, arg1, arg2) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(arg2); \ +- gen_helper_##name(arg1, helper_tmp); \ ++ gen_helper_##name(cpu_env, arg1, helper_tmp); \ + tcg_temp_free_i32(helper_tmp); \ + } while(0) + +-#define gen_helper_2i(name, arg1, arg2, arg3) do { \ ++#define gen_helper_1e0i(name, ret, arg1) do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg1); \ ++ gen_helper_##name(ret, cpu_env, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while(0) ++ ++#define gen_helper_1e1i(name, ret, arg1, arg2) do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg2); \ ++ gen_helper_##name(ret, cpu_env, arg1, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while(0) ++ ++#define gen_helper_0e2i(name, arg1, arg2, arg3) do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg3); \ ++ gen_helper_##name(cpu_env, arg1, arg2, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while(0) ++ ++#define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(arg3); \ +- gen_helper_##name(arg1, arg2, helper_tmp); \ ++ gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp); \ + tcg_temp_free_i32(helper_tmp); \ + } while(0) + +-#define gen_helper_3i(name, arg1, arg2, arg3, arg4) do { \ ++#define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(arg4); \ +- gen_helper_##name(arg1, arg2, arg3, helper_tmp); \ ++ gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp); \ + tcg_temp_free_i32(helper_tmp); \ + } while(0) + +@@ -748,7 +766,7 @@ generate_exception_err (DisasContext *ctx, int excp, int err) + TCGv_i32 texcp = tcg_const_i32(excp); + TCGv_i32 terr = tcg_const_i32(err); + save_cpu_state(ctx, 1); +- gen_helper_raise_exception_err(texcp, terr); ++ gen_helper_raise_exception_err(cpu_env, texcp, terr); + tcg_temp_free_i32(terr); + tcg_temp_free_i32(texcp); + } +@@ -757,7 +775,7 @@ static inline void + generate_exception (DisasContext *ctx, int excp) + { + save_cpu_state(ctx, 1); +- gen_helper_0i(raise_exception, excp); ++ gen_helper_0e0i(raise_exception, excp); + } + + /* Addresses computation */ +@@ -871,22 +889,22 @@ static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n, \ + gen_ldcmp_fpr##bits (ctx, fp0, fs); \ + gen_ldcmp_fpr##bits (ctx, fp1, ft); \ + switch (n) { \ +- case 0: gen_helper_2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc); break;\ +- case 1: gen_helper_2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc); break;\ +- case 2: gen_helper_2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc); break;\ +- case 3: gen_helper_2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc); break;\ +- case 4: gen_helper_2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc); break;\ +- case 5: gen_helper_2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc); break;\ +- case 6: gen_helper_2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc); break;\ +- case 7: gen_helper_2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc); break;\ +- case 8: gen_helper_2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc); break;\ +- case 9: gen_helper_2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\ +- case 10: gen_helper_2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc); break;\ +- case 11: gen_helper_2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc); break;\ +- case 12: gen_helper_2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc); break;\ +- case 13: gen_helper_2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc); break;\ +- case 14: gen_helper_2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc); break;\ +- case 15: gen_helper_2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc); break;\ ++ case 0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc); break;\ ++ case 1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc); break;\ ++ case 2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc); break;\ ++ case 3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc); break;\ ++ case 4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc); break;\ ++ case 5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc); break;\ ++ case 6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc); break;\ ++ case 7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc); break;\ ++ case 8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc); break;\ ++ case 9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\ ++ case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc); break;\ ++ case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc); break;\ ++ case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc); break;\ ++ case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc); break;\ ++ case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc); break;\ ++ case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc); break;\ + default: abort(); \ + } \ + tcg_temp_free_i##bits (fp0); \ +@@ -948,7 +966,7 @@ static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx) \ + #define OP_LD_ATOMIC(insn,fname) \ + static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx) \ + { \ +- gen_helper_2i(insn, ret, arg1, ctx->mem_idx); \ ++ gen_helper_1e1i(insn, ret, arg1, ctx->mem_idx); \ + } + #endif + OP_LD_ATOMIC(ll,ld32s); +@@ -975,7 +993,7 @@ static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) + tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20)); \ + tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg)); \ + tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval)); \ +- gen_helper_0i(raise_exception, EXCP_SC); \ ++ gen_helper_0e0i(raise_exception, EXCP_SC); \ + gen_set_label(l2); \ + tcg_gen_movi_tl(t0, 0); \ + gen_store_gpr(t0, rt); \ +@@ -986,7 +1004,7 @@ static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) + static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \ + { \ + TCGv t0 = tcg_temp_new(); \ +- gen_helper_3i(insn, t0, arg1, arg2, ctx->mem_idx); \ ++ gen_helper_1e2i(insn, t0, arg1, arg2, ctx->mem_idx); \ + gen_store_gpr(t0, rt); \ + tcg_temp_free(t0); \ + } +@@ -1066,14 +1084,14 @@ static void gen_ld (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, + case OPC_LDL: + save_cpu_state(ctx, 1); + gen_load_gpr(t1, rt); +- gen_helper_3i(ldl, t1, t1, t0, ctx->mem_idx); ++ gen_helper_1e2i(ldl, t1, t1, t0, ctx->mem_idx); + gen_store_gpr(t1, rt); + opn = "ldl"; + break; + case OPC_LDR: + save_cpu_state(ctx, 1); + gen_load_gpr(t1, rt); +- gen_helper_3i(ldr, t1, t1, t0, ctx->mem_idx); ++ gen_helper_1e2i(ldr, t1, t1, t0, ctx->mem_idx); + gen_store_gpr(t1, rt); + opn = "ldr"; + break; +@@ -1127,14 +1145,14 @@ static void gen_ld (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, + case OPC_LWL: + save_cpu_state(ctx, 1); + gen_load_gpr(t1, rt); +- gen_helper_3i(lwl, t1, t1, t0, ctx->mem_idx); ++ gen_helper_1e2i(lwl, t1, t1, t0, ctx->mem_idx); + gen_store_gpr(t1, rt); + opn = "lwl"; + break; + case OPC_LWR: + save_cpu_state(ctx, 1); + gen_load_gpr(t1, rt); +- gen_helper_3i(lwr, t1, t1, t0, ctx->mem_idx); ++ gen_helper_1e2i(lwr, t1, t1, t0, ctx->mem_idx); + gen_store_gpr(t1, rt); + opn = "lwr"; + break; +@@ -1170,12 +1188,12 @@ static void gen_st (DisasContext *ctx, uint32_t opc, int rt, + break; + case OPC_SDL: + save_cpu_state(ctx, 1); +- gen_helper_2i(sdl, t1, t0, ctx->mem_idx); ++ gen_helper_0e2i(sdl, t1, t0, ctx->mem_idx); + opn = "sdl"; + break; + case OPC_SDR: + save_cpu_state(ctx, 1); +- gen_helper_2i(sdr, t1, t0, ctx->mem_idx); ++ gen_helper_0e2i(sdr, t1, t0, ctx->mem_idx); + opn = "sdr"; + break; + #endif +@@ -1196,12 +1214,12 @@ static void gen_st (DisasContext *ctx, uint32_t opc, int rt, + break; + case OPC_SWL: + save_cpu_state(ctx, 1); +- gen_helper_2i(swl, t1, t0, ctx->mem_idx); ++ gen_helper_0e2i(swl, t1, t0, ctx->mem_idx); + opn = "swl"; + break; + case OPC_SWR: + save_cpu_state(ctx, 1); +- gen_helper_2i(swr, t1, t0, ctx->mem_idx); ++ gen_helper_0e2i(swr, t1, t0, ctx->mem_idx); + opn = "swr"; + break; + } +@@ -2138,11 +2156,11 @@ static void gen_muldiv (DisasContext *ctx, uint32_t opc, + opn = "ddivu"; + break; + case OPC_DMULT: +- gen_helper_dmult(t0, t1); ++ gen_helper_dmult(cpu_env, t0, t1); + opn = "dmult"; + break; + case OPC_DMULTU: +- gen_helper_dmultu(t0, t1); ++ gen_helper_dmultu(cpu_env, t0, t1); + opn = "dmultu"; + break; + #endif +@@ -2254,59 +2272,59 @@ static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc, + + switch (opc) { + case OPC_VR54XX_MULS: +- gen_helper_muls(t0, t0, t1); ++ gen_helper_muls(t0, cpu_env, t0, t1); + opn = "muls"; + break; + case OPC_VR54XX_MULSU: +- gen_helper_mulsu(t0, t0, t1); ++ gen_helper_mulsu(t0, cpu_env, t0, t1); + opn = "mulsu"; + break; + case OPC_VR54XX_MACC: +- gen_helper_macc(t0, t0, t1); ++ gen_helper_macc(t0, cpu_env, t0, t1); + opn = "macc"; + break; + case OPC_VR54XX_MACCU: +- gen_helper_maccu(t0, t0, t1); ++ gen_helper_maccu(t0, cpu_env, t0, t1); + opn = "maccu"; + break; + case OPC_VR54XX_MSAC: +- gen_helper_msac(t0, t0, t1); ++ gen_helper_msac(t0, cpu_env, t0, t1); + opn = "msac"; + break; + case OPC_VR54XX_MSACU: +- gen_helper_msacu(t0, t0, t1); ++ gen_helper_msacu(t0, cpu_env, t0, t1); + opn = "msacu"; + break; + case OPC_VR54XX_MULHI: +- gen_helper_mulhi(t0, t0, t1); ++ gen_helper_mulhi(t0, cpu_env, t0, t1); + opn = "mulhi"; + break; + case OPC_VR54XX_MULHIU: +- gen_helper_mulhiu(t0, t0, t1); ++ gen_helper_mulhiu(t0, cpu_env, t0, t1); + opn = "mulhiu"; + break; + case OPC_VR54XX_MULSHI: +- gen_helper_mulshi(t0, t0, t1); ++ gen_helper_mulshi(t0, cpu_env, t0, t1); + opn = "mulshi"; + break; + case OPC_VR54XX_MULSHIU: +- gen_helper_mulshiu(t0, t0, t1); ++ gen_helper_mulshiu(t0, cpu_env, t0, t1); + opn = "mulshiu"; + break; + case OPC_VR54XX_MACCHI: +- gen_helper_macchi(t0, t0, t1); ++ gen_helper_macchi(t0, cpu_env, t0, t1); + opn = "macchi"; + break; + case OPC_VR54XX_MACCHIU: +- gen_helper_macchiu(t0, t0, t1); ++ gen_helper_macchiu(t0, cpu_env, t0, t1); + opn = "macchiu"; + break; + case OPC_VR54XX_MSACHI: +- gen_helper_msachi(t0, t0, t1); ++ gen_helper_msachi(t0, cpu_env, t0, t1); + opn = "msachi"; + break; + case OPC_VR54XX_MSACHIU: +- gen_helper_msachiu(t0, t0, t1); ++ gen_helper_msachiu(t0, cpu_env, t0, t1); + opn = "msachiu"; + break; + default: +@@ -2683,7 +2701,7 @@ static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest) + gen_save_pc(dest); + if (ctx->singlestep_enabled) { + save_cpu_state(ctx, 0); +- gen_helper_0i(raise_exception, EXCP_DEBUG); ++ gen_helper_0e0i(raise_exception, EXCP_DEBUG); + } + tcg_gen_exit_tb(0); + } +@@ -3187,17 +3205,17 @@ static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_mvpcontrol(arg); ++ gen_helper_mfc0_mvpcontrol(arg, cpu_env); + rn = "MVPControl"; + break; + case 2: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_mvpconf0(arg); ++ gen_helper_mfc0_mvpconf0(arg, cpu_env); + rn = "MVPConf0"; + break; + case 3: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_mvpconf1(arg); ++ gen_helper_mfc0_mvpconf1(arg, cpu_env); + rn = "MVPConf1"; + break; + default: +@@ -3207,7 +3225,7 @@ static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 1: + switch (sel) { + case 0: +- gen_helper_mfc0_random(arg); ++ gen_helper_mfc0_random(arg, cpu_env); + rn = "Random"; + break; + case 1: +@@ -3258,37 +3276,37 @@ static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tcstatus(arg); ++ gen_helper_mfc0_tcstatus(arg, cpu_env); + rn = "TCStatus"; + break; + case 2: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tcbind(arg); ++ gen_helper_mfc0_tcbind(arg, cpu_env); + rn = "TCBind"; + break; + case 3: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tcrestart(arg); ++ gen_helper_mfc0_tcrestart(arg, cpu_env); + rn = "TCRestart"; + break; + case 4: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tchalt(arg); ++ gen_helper_mfc0_tchalt(arg, cpu_env); + rn = "TCHalt"; + break; + case 5: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tccontext(arg); ++ gen_helper_mfc0_tccontext(arg, cpu_env); + rn = "TCContext"; + break; + case 6: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tcschedule(arg); ++ gen_helper_mfc0_tcschedule(arg, cpu_env); + rn = "TCSchedule"; + break; + case 7: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tcschefback(arg); ++ gen_helper_mfc0_tcschefback(arg, cpu_env); + rn = "TCScheFBack"; + break; + default: +@@ -3399,7 +3417,7 @@ static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + /* Mark as an IO operation because we read the time. */ + if (use_icount) + gen_io_start(); +- gen_helper_mfc0_count(arg); ++ gen_helper_mfc0_count(arg, cpu_env); + if (use_icount) { + gen_io_end(); + } +@@ -3531,7 +3549,7 @@ static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 17: + switch (sel) { + case 0: +- gen_helper_mfc0_lladdr(arg); ++ gen_helper_mfc0_lladdr(arg, cpu_env); + rn = "LLAddr"; + break; + default: +@@ -3541,7 +3559,7 @@ static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 18: + switch (sel) { + case 0 ... 7: +- gen_helper_1i(mfc0_watchlo, arg, sel); ++ gen_helper_1e0i(mfc0_watchlo, arg, sel); + rn = "WatchLo"; + break; + default: +@@ -3551,7 +3569,7 @@ static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 19: + switch (sel) { + case 0 ...7: +- gen_helper_1i(mfc0_watchhi, arg, sel); ++ gen_helper_1e0i(mfc0_watchhi, arg, sel); + rn = "WatchHi"; + break; + default: +@@ -3590,7 +3608,7 @@ static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 23: + switch (sel) { + case 0: +- gen_helper_mfc0_debug(arg); /* EJTAG support */ ++ gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */ + rn = "Debug"; + break; + case 1: +@@ -3765,12 +3783,12 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 0: + switch (sel) { + case 0: +- gen_helper_mtc0_index(arg); ++ gen_helper_mtc0_index(cpu_env, arg); + rn = "Index"; + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_mvpcontrol(arg); ++ gen_helper_mtc0_mvpcontrol(cpu_env, arg); + rn = "MVPControl"; + break; + case 2: +@@ -3795,22 +3813,22 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_vpecontrol(arg); ++ gen_helper_mtc0_vpecontrol(cpu_env, arg); + rn = "VPEControl"; + break; + case 2: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_vpeconf0(arg); ++ gen_helper_mtc0_vpeconf0(cpu_env, arg); + rn = "VPEConf0"; + break; + case 3: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_vpeconf1(arg); ++ gen_helper_mtc0_vpeconf1(cpu_env, arg); + rn = "VPEConf1"; + break; + case 4: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_yqmask(arg); ++ gen_helper_mtc0_yqmask(cpu_env, arg); + rn = "YQMask"; + break; + case 5: +@@ -3825,7 +3843,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + break; + case 7: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_vpeopt(arg); ++ gen_helper_mtc0_vpeopt(cpu_env, arg); + rn = "VPEOpt"; + break; + default: +@@ -3835,42 +3853,42 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 2: + switch (sel) { + case 0: +- gen_helper_mtc0_entrylo0(arg); ++ gen_helper_mtc0_entrylo0(cpu_env, arg); + rn = "EntryLo0"; + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcstatus(arg); ++ gen_helper_mtc0_tcstatus(cpu_env, arg); + rn = "TCStatus"; + break; + case 2: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcbind(arg); ++ gen_helper_mtc0_tcbind(cpu_env, arg); + rn = "TCBind"; + break; + case 3: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcrestart(arg); ++ gen_helper_mtc0_tcrestart(cpu_env, arg); + rn = "TCRestart"; + break; + case 4: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tchalt(arg); ++ gen_helper_mtc0_tchalt(cpu_env, arg); + rn = "TCHalt"; + break; + case 5: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tccontext(arg); ++ gen_helper_mtc0_tccontext(cpu_env, arg); + rn = "TCContext"; + break; + case 6: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcschedule(arg); ++ gen_helper_mtc0_tcschedule(cpu_env, arg); + rn = "TCSchedule"; + break; + case 7: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcschefback(arg); ++ gen_helper_mtc0_tcschefback(cpu_env, arg); + rn = "TCScheFBack"; + break; + default: +@@ -3880,7 +3898,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 3: + switch (sel) { + case 0: +- gen_helper_mtc0_entrylo1(arg); ++ gen_helper_mtc0_entrylo1(cpu_env, arg); + rn = "EntryLo1"; + break; + default: +@@ -3890,11 +3908,11 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 4: + switch (sel) { + case 0: +- gen_helper_mtc0_context(arg); ++ gen_helper_mtc0_context(cpu_env, arg); + rn = "Context"; + break; + case 1: +-// gen_helper_mtc0_contextconfig(arg); /* SmartMIPS ASE */ ++// gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */ + rn = "ContextConfig"; + // break; + default: +@@ -3904,12 +3922,12 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 5: + switch (sel) { + case 0: +- gen_helper_mtc0_pagemask(arg); ++ gen_helper_mtc0_pagemask(cpu_env, arg); + rn = "PageMask"; + break; + case 1: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_pagegrain(arg); ++ gen_helper_mtc0_pagegrain(cpu_env, arg); + rn = "PageGrain"; + break; + default: +@@ -3919,32 +3937,32 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 6: + switch (sel) { + case 0: +- gen_helper_mtc0_wired(arg); ++ gen_helper_mtc0_wired(cpu_env, arg); + rn = "Wired"; + break; + case 1: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf0(arg); ++ gen_helper_mtc0_srsconf0(cpu_env, arg); + rn = "SRSConf0"; + break; + case 2: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf1(arg); ++ gen_helper_mtc0_srsconf1(cpu_env, arg); + rn = "SRSConf1"; + break; + case 3: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf2(arg); ++ gen_helper_mtc0_srsconf2(cpu_env, arg); + rn = "SRSConf2"; + break; + case 4: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf3(arg); ++ gen_helper_mtc0_srsconf3(cpu_env, arg); + rn = "SRSConf3"; + break; + case 5: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf4(arg); ++ gen_helper_mtc0_srsconf4(cpu_env, arg); + rn = "SRSConf4"; + break; + default: +@@ -3955,7 +3973,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + switch (sel) { + case 0: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_hwrena(arg); ++ gen_helper_mtc0_hwrena(cpu_env, arg); + rn = "HWREna"; + break; + default: +@@ -3969,7 +3987,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 9: + switch (sel) { + case 0: +- gen_helper_mtc0_count(arg); ++ gen_helper_mtc0_count(cpu_env, arg); + rn = "Count"; + break; + /* 6,7 are implementation dependent */ +@@ -3980,7 +3998,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 10: + switch (sel) { + case 0: +- gen_helper_mtc0_entryhi(arg); ++ gen_helper_mtc0_entryhi(cpu_env, arg); + rn = "EntryHi"; + break; + default: +@@ -3990,7 +4008,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 11: + switch (sel) { + case 0: +- gen_helper_mtc0_compare(arg); ++ gen_helper_mtc0_compare(cpu_env, arg); + rn = "Compare"; + break; + /* 6,7 are implementation dependent */ +@@ -4002,7 +4020,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + switch (sel) { + case 0: + save_cpu_state(ctx, 1); +- gen_helper_mtc0_status(arg); ++ gen_helper_mtc0_status(cpu_env, arg); + /* BS_STOP isn't good enough here, hflags may have changed. */ + gen_save_pc(ctx->pc + 4); + ctx->bstate = BS_EXCP; +@@ -4010,14 +4028,14 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + break; + case 1: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_intctl(arg); ++ gen_helper_mtc0_intctl(cpu_env, arg); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "IntCtl"; + break; + case 2: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsctl(arg); ++ gen_helper_mtc0_srsctl(cpu_env, arg); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "SRSCtl"; +@@ -4037,7 +4055,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + switch (sel) { + case 0: + save_cpu_state(ctx, 1); +- gen_helper_mtc0_cause(arg); ++ gen_helper_mtc0_cause(cpu_env, arg); + rn = "Cause"; + break; + default: +@@ -4062,7 +4080,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + break; + case 1: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_ebase(arg); ++ gen_helper_mtc0_ebase(cpu_env, arg); + rn = "EBase"; + break; + default: +@@ -4072,7 +4090,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 16: + switch (sel) { + case 0: +- gen_helper_mtc0_config0(arg); ++ gen_helper_mtc0_config0(cpu_env, arg); + rn = "Config"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -4082,7 +4100,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + rn = "Config1"; + break; + case 2: +- gen_helper_mtc0_config2(arg); ++ gen_helper_mtc0_config2(cpu_env, arg); + rn = "Config2"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -4109,7 +4127,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 17: + switch (sel) { + case 0: +- gen_helper_mtc0_lladdr(arg); ++ gen_helper_mtc0_lladdr(cpu_env, arg); + rn = "LLAddr"; + break; + default: +@@ -4119,7 +4137,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 18: + switch (sel) { + case 0 ... 7: +- gen_helper_1i(mtc0_watchlo, arg, sel); ++ gen_helper_0e1i(mtc0_watchlo, arg, sel); + rn = "WatchLo"; + break; + default: +@@ -4129,7 +4147,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 19: + switch (sel) { + case 0 ... 7: +- gen_helper_1i(mtc0_watchhi, arg, sel); ++ gen_helper_0e1i(mtc0_watchhi, arg, sel); + rn = "WatchHi"; + break; + default: +@@ -4141,7 +4159,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 0: + #if defined(TARGET_MIPS64) + check_insn(env, ctx, ISA_MIPS3); +- gen_helper_mtc0_xcontext(arg); ++ gen_helper_mtc0_xcontext(cpu_env, arg); + rn = "XContext"; + break; + #endif +@@ -4153,7 +4171,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + /* Officially reserved, but sel 0 is used for R1x000 framemask */ + switch (sel) { + case 0: +- gen_helper_mtc0_framemask(arg); ++ gen_helper_mtc0_framemask(cpu_env, arg); + rn = "Framemask"; + break; + default: +@@ -4167,20 +4185,20 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 23: + switch (sel) { + case 0: +- gen_helper_mtc0_debug(arg); /* EJTAG support */ ++ gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */ + /* BS_STOP isn't good enough here, hflags may have changed. */ + gen_save_pc(ctx->pc + 4); + ctx->bstate = BS_EXCP; + rn = "Debug"; + break; + case 1: +-// gen_helper_mtc0_tracecontrol(arg); /* PDtrace support */ ++// gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */ + rn = "TraceControl"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + // break; + case 2: +-// gen_helper_mtc0_tracecontrol2(arg); /* PDtrace support */ ++// gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */ + rn = "TraceControl2"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -4188,13 +4206,13 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 3: + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +-// gen_helper_mtc0_usertracedata(arg); /* PDtrace support */ ++// gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */ + rn = "UserTraceData"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + // break; + case 4: +-// gen_helper_mtc0_tracebpc(arg); /* PDtrace support */ ++// gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "TraceBPC"; +@@ -4217,7 +4235,7 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 25: + switch (sel) { + case 0: +- gen_helper_mtc0_performance0(arg); ++ gen_helper_mtc0_performance0(cpu_env, arg); + rn = "Performance0"; + break; + case 1: +@@ -4272,14 +4290,14 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 2: + case 4: + case 6: +- gen_helper_mtc0_taglo(arg); ++ gen_helper_mtc0_taglo(cpu_env, arg); + rn = "TagLo"; + break; + case 1: + case 3: + case 5: + case 7: +- gen_helper_mtc0_datalo(arg); ++ gen_helper_mtc0_datalo(cpu_env, arg); + rn = "DataLo"; + break; + default: +@@ -4292,14 +4310,14 @@ static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, i + case 2: + case 4: + case 6: +- gen_helper_mtc0_taghi(arg); ++ gen_helper_mtc0_taghi(cpu_env, arg); + rn = "TagHi"; + break; + case 1: + case 3: + case 5: + case 7: +- gen_helper_mtc0_datahi(arg); ++ gen_helper_mtc0_datahi(cpu_env, arg); + rn = "DataHi"; + break; + default: +@@ -4364,17 +4382,17 @@ static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_mvpcontrol(arg); ++ gen_helper_mfc0_mvpcontrol(arg, cpu_env); + rn = "MVPControl"; + break; + case 2: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_mvpconf0(arg); ++ gen_helper_mfc0_mvpconf0(arg, cpu_env); + rn = "MVPConf0"; + break; + case 3: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_mvpconf1(arg); ++ gen_helper_mfc0_mvpconf1(arg, cpu_env); + rn = "MVPConf1"; + break; + default: +@@ -4384,7 +4402,7 @@ static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 1: + switch (sel) { + case 0: +- gen_helper_mfc0_random(arg); ++ gen_helper_mfc0_random(arg, cpu_env); + rn = "Random"; + break; + case 1: +@@ -4434,37 +4452,37 @@ static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tcstatus(arg); ++ gen_helper_mfc0_tcstatus(arg, cpu_env); + rn = "TCStatus"; + break; + case 2: + check_insn(env, ctx, ASE_MT); +- gen_helper_mfc0_tcbind(arg); ++ gen_helper_mfc0_tcbind(arg, cpu_env); + rn = "TCBind"; + break; + case 3: + check_insn(env, ctx, ASE_MT); +- gen_helper_dmfc0_tcrestart(arg); ++ gen_helper_dmfc0_tcrestart(arg, cpu_env); + rn = "TCRestart"; + break; + case 4: + check_insn(env, ctx, ASE_MT); +- gen_helper_dmfc0_tchalt(arg); ++ gen_helper_dmfc0_tchalt(arg, cpu_env); + rn = "TCHalt"; + break; + case 5: + check_insn(env, ctx, ASE_MT); +- gen_helper_dmfc0_tccontext(arg); ++ gen_helper_dmfc0_tccontext(arg, cpu_env); + rn = "TCContext"; + break; + case 6: + check_insn(env, ctx, ASE_MT); +- gen_helper_dmfc0_tcschedule(arg); ++ gen_helper_dmfc0_tcschedule(arg, cpu_env); + rn = "TCSchedule"; + break; + case 7: + check_insn(env, ctx, ASE_MT); +- gen_helper_dmfc0_tcschefback(arg); ++ gen_helper_dmfc0_tcschefback(arg, cpu_env); + rn = "TCScheFBack"; + break; + default: +@@ -4572,7 +4590,7 @@ static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + /* Mark as an IO operation because we read the time. */ + if (use_icount) + gen_io_start(); +- gen_helper_mfc0_count(arg); ++ gen_helper_mfc0_count(arg, cpu_env); + if (use_icount) { + gen_io_end(); + } +@@ -4701,7 +4719,7 @@ static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 17: + switch (sel) { + case 0: +- gen_helper_dmfc0_lladdr(arg); ++ gen_helper_dmfc0_lladdr(arg, cpu_env); + rn = "LLAddr"; + break; + default: +@@ -4711,7 +4729,7 @@ static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 18: + switch (sel) { + case 0 ... 7: +- gen_helper_1i(dmfc0_watchlo, arg, sel); ++ gen_helper_1e0i(dmfc0_watchlo, arg, sel); + rn = "WatchLo"; + break; + default: +@@ -4721,7 +4739,7 @@ static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 19: + switch (sel) { + case 0 ... 7: +- gen_helper_1i(mfc0_watchhi, arg, sel); ++ gen_helper_1e0i(mfc0_watchhi, arg, sel); + rn = "WatchHi"; + break; + default: +@@ -4757,23 +4775,23 @@ static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 23: + switch (sel) { + case 0: +- gen_helper_mfc0_debug(arg); /* EJTAG support */ ++ gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */ + rn = "Debug"; + break; + case 1: +-// gen_helper_dmfc0_tracecontrol(arg); /* PDtrace support */ ++// gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */ + rn = "TraceControl"; + // break; + case 2: +-// gen_helper_dmfc0_tracecontrol2(arg); /* PDtrace support */ ++// gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */ + rn = "TraceControl2"; + // break; + case 3: +-// gen_helper_dmfc0_usertracedata(arg); /* PDtrace support */ ++// gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */ + rn = "UserTraceData"; + // break; + case 4: +-// gen_helper_dmfc0_tracebpc(arg); /* PDtrace support */ ++// gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */ + rn = "TraceBPC"; + // break; + default: +@@ -4931,12 +4949,12 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 0: + switch (sel) { + case 0: +- gen_helper_mtc0_index(arg); ++ gen_helper_mtc0_index(cpu_env, arg); + rn = "Index"; + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_mvpcontrol(arg); ++ gen_helper_mtc0_mvpcontrol(cpu_env, arg); + rn = "MVPControl"; + break; + case 2: +@@ -4961,22 +4979,22 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_vpecontrol(arg); ++ gen_helper_mtc0_vpecontrol(cpu_env, arg); + rn = "VPEControl"; + break; + case 2: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_vpeconf0(arg); ++ gen_helper_mtc0_vpeconf0(cpu_env, arg); + rn = "VPEConf0"; + break; + case 3: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_vpeconf1(arg); ++ gen_helper_mtc0_vpeconf1(cpu_env, arg); + rn = "VPEConf1"; + break; + case 4: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_yqmask(arg); ++ gen_helper_mtc0_yqmask(cpu_env, arg); + rn = "YQMask"; + break; + case 5: +@@ -4991,7 +5009,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + break; + case 7: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_vpeopt(arg); ++ gen_helper_mtc0_vpeopt(cpu_env, arg); + rn = "VPEOpt"; + break; + default: +@@ -5001,42 +5019,42 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 2: + switch (sel) { + case 0: +- gen_helper_mtc0_entrylo0(arg); ++ gen_helper_mtc0_entrylo0(cpu_env, arg); + rn = "EntryLo0"; + break; + case 1: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcstatus(arg); ++ gen_helper_mtc0_tcstatus(cpu_env, arg); + rn = "TCStatus"; + break; + case 2: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcbind(arg); ++ gen_helper_mtc0_tcbind(cpu_env, arg); + rn = "TCBind"; + break; + case 3: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcrestart(arg); ++ gen_helper_mtc0_tcrestart(cpu_env, arg); + rn = "TCRestart"; + break; + case 4: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tchalt(arg); ++ gen_helper_mtc0_tchalt(cpu_env, arg); + rn = "TCHalt"; + break; + case 5: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tccontext(arg); ++ gen_helper_mtc0_tccontext(cpu_env, arg); + rn = "TCContext"; + break; + case 6: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcschedule(arg); ++ gen_helper_mtc0_tcschedule(cpu_env, arg); + rn = "TCSchedule"; + break; + case 7: + check_insn(env, ctx, ASE_MT); +- gen_helper_mtc0_tcschefback(arg); ++ gen_helper_mtc0_tcschefback(cpu_env, arg); + rn = "TCScheFBack"; + break; + default: +@@ -5046,7 +5064,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 3: + switch (sel) { + case 0: +- gen_helper_mtc0_entrylo1(arg); ++ gen_helper_mtc0_entrylo1(cpu_env, arg); + rn = "EntryLo1"; + break; + default: +@@ -5056,11 +5074,11 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 4: + switch (sel) { + case 0: +- gen_helper_mtc0_context(arg); ++ gen_helper_mtc0_context(cpu_env, arg); + rn = "Context"; + break; + case 1: +-// gen_helper_mtc0_contextconfig(arg); /* SmartMIPS ASE */ ++// gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */ + rn = "ContextConfig"; + // break; + default: +@@ -5070,12 +5088,12 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 5: + switch (sel) { + case 0: +- gen_helper_mtc0_pagemask(arg); ++ gen_helper_mtc0_pagemask(cpu_env, arg); + rn = "PageMask"; + break; + case 1: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_pagegrain(arg); ++ gen_helper_mtc0_pagegrain(cpu_env, arg); + rn = "PageGrain"; + break; + default: +@@ -5085,32 +5103,32 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 6: + switch (sel) { + case 0: +- gen_helper_mtc0_wired(arg); ++ gen_helper_mtc0_wired(cpu_env, arg); + rn = "Wired"; + break; + case 1: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf0(arg); ++ gen_helper_mtc0_srsconf0(cpu_env, arg); + rn = "SRSConf0"; + break; + case 2: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf1(arg); ++ gen_helper_mtc0_srsconf1(cpu_env, arg); + rn = "SRSConf1"; + break; + case 3: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf2(arg); ++ gen_helper_mtc0_srsconf2(cpu_env, arg); + rn = "SRSConf2"; + break; + case 4: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf3(arg); ++ gen_helper_mtc0_srsconf3(cpu_env, arg); + rn = "SRSConf3"; + break; + case 5: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsconf4(arg); ++ gen_helper_mtc0_srsconf4(cpu_env, arg); + rn = "SRSConf4"; + break; + default: +@@ -5121,7 +5139,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + switch (sel) { + case 0: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_hwrena(arg); ++ gen_helper_mtc0_hwrena(cpu_env, arg); + rn = "HWREna"; + break; + default: +@@ -5135,7 +5153,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 9: + switch (sel) { + case 0: +- gen_helper_mtc0_count(arg); ++ gen_helper_mtc0_count(cpu_env, arg); + rn = "Count"; + break; + /* 6,7 are implementation dependent */ +@@ -5148,7 +5166,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 10: + switch (sel) { + case 0: +- gen_helper_mtc0_entryhi(arg); ++ gen_helper_mtc0_entryhi(cpu_env, arg); + rn = "EntryHi"; + break; + default: +@@ -5158,7 +5176,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 11: + switch (sel) { + case 0: +- gen_helper_mtc0_compare(arg); ++ gen_helper_mtc0_compare(cpu_env, arg); + rn = "Compare"; + break; + /* 6,7 are implementation dependent */ +@@ -5172,7 +5190,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + switch (sel) { + case 0: + save_cpu_state(ctx, 1); +- gen_helper_mtc0_status(arg); ++ gen_helper_mtc0_status(cpu_env, arg); + /* BS_STOP isn't good enough here, hflags may have changed. */ + gen_save_pc(ctx->pc + 4); + ctx->bstate = BS_EXCP; +@@ -5180,14 +5198,14 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + break; + case 1: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_intctl(arg); ++ gen_helper_mtc0_intctl(cpu_env, arg); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "IntCtl"; + break; + case 2: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_srsctl(arg); ++ gen_helper_mtc0_srsctl(cpu_env, arg); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "SRSCtl"; +@@ -5212,7 +5230,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + if (use_icount) { + gen_io_start(); + } +- gen_helper_mtc0_cause(arg); ++ gen_helper_mtc0_cause(cpu_env, arg); + if (use_icount) { + gen_io_end(); + } +@@ -5242,7 +5260,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + break; + case 1: + check_insn(env, ctx, ISA_MIPS32R2); +- gen_helper_mtc0_ebase(arg); ++ gen_helper_mtc0_ebase(cpu_env, arg); + rn = "EBase"; + break; + default: +@@ -5252,7 +5270,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 16: + switch (sel) { + case 0: +- gen_helper_mtc0_config0(arg); ++ gen_helper_mtc0_config0(cpu_env, arg); + rn = "Config"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -5262,7 +5280,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + rn = "Config1"; + break; + case 2: +- gen_helper_mtc0_config2(arg); ++ gen_helper_mtc0_config2(cpu_env, arg); + rn = "Config2"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -5280,7 +5298,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 17: + switch (sel) { + case 0: +- gen_helper_mtc0_lladdr(arg); ++ gen_helper_mtc0_lladdr(cpu_env, arg); + rn = "LLAddr"; + break; + default: +@@ -5290,7 +5308,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 18: + switch (sel) { + case 0 ... 7: +- gen_helper_1i(mtc0_watchlo, arg, sel); ++ gen_helper_0e1i(mtc0_watchlo, arg, sel); + rn = "WatchLo"; + break; + default: +@@ -5300,7 +5318,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 19: + switch (sel) { + case 0 ... 7: +- gen_helper_1i(mtc0_watchhi, arg, sel); ++ gen_helper_0e1i(mtc0_watchhi, arg, sel); + rn = "WatchHi"; + break; + default: +@@ -5311,7 +5329,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + switch (sel) { + case 0: + check_insn(env, ctx, ISA_MIPS3); +- gen_helper_mtc0_xcontext(arg); ++ gen_helper_mtc0_xcontext(cpu_env, arg); + rn = "XContext"; + break; + default: +@@ -5322,7 +5340,7 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + /* Officially reserved, but sel 0 is used for R1x000 framemask */ + switch (sel) { + case 0: +- gen_helper_mtc0_framemask(arg); ++ gen_helper_mtc0_framemask(cpu_env, arg); + rn = "Framemask"; + break; + default: +@@ -5336,32 +5354,32 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 23: + switch (sel) { + case 0: +- gen_helper_mtc0_debug(arg); /* EJTAG support */ ++ gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */ + /* BS_STOP isn't good enough here, hflags may have changed. */ + gen_save_pc(ctx->pc + 4); + ctx->bstate = BS_EXCP; + rn = "Debug"; + break; + case 1: +-// gen_helper_mtc0_tracecontrol(arg); /* PDtrace support */ ++// gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "TraceControl"; + // break; + case 2: +-// gen_helper_mtc0_tracecontrol2(arg); /* PDtrace support */ ++// gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "TraceControl2"; + // break; + case 3: +-// gen_helper_mtc0_usertracedata(arg); /* PDtrace support */ ++// gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "UserTraceData"; + // break; + case 4: +-// gen_helper_mtc0_tracebpc(arg); /* PDtrace support */ ++// gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "TraceBPC"; +@@ -5384,35 +5402,35 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 25: + switch (sel) { + case 0: +- gen_helper_mtc0_performance0(arg); ++ gen_helper_mtc0_performance0(cpu_env, arg); + rn = "Performance0"; + break; + case 1: +-// gen_helper_mtc0_performance1(arg); ++// gen_helper_mtc0_performance1(cpu_env, arg); + rn = "Performance1"; + // break; + case 2: +-// gen_helper_mtc0_performance2(arg); ++// gen_helper_mtc0_performance2(cpu_env, arg); + rn = "Performance2"; + // break; + case 3: +-// gen_helper_mtc0_performance3(arg); ++// gen_helper_mtc0_performance3(cpu_env, arg); + rn = "Performance3"; + // break; + case 4: +-// gen_helper_mtc0_performance4(arg); ++// gen_helper_mtc0_performance4(cpu_env, arg); + rn = "Performance4"; + // break; + case 5: +-// gen_helper_mtc0_performance5(arg); ++// gen_helper_mtc0_performance5(cpu_env, arg); + rn = "Performance5"; + // break; + case 6: +-// gen_helper_mtc0_performance6(arg); ++// gen_helper_mtc0_performance6(cpu_env, arg); + rn = "Performance6"; + // break; + case 7: +-// gen_helper_mtc0_performance7(arg); ++// gen_helper_mtc0_performance7(cpu_env, arg); + rn = "Performance7"; + // break; + default: +@@ -5439,14 +5457,14 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 2: + case 4: + case 6: +- gen_helper_mtc0_taglo(arg); ++ gen_helper_mtc0_taglo(cpu_env, arg); + rn = "TagLo"; + break; + case 1: + case 3: + case 5: + case 7: +- gen_helper_mtc0_datalo(arg); ++ gen_helper_mtc0_datalo(cpu_env, arg); + rn = "DataLo"; + break; + default: +@@ -5459,14 +5477,14 @@ static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, + case 2: + case 4: + case 6: +- gen_helper_mtc0_taghi(arg); ++ gen_helper_mtc0_taghi(cpu_env, arg); + rn = "TagHi"; + break; + case 1: + case 3: + case 5: + case 7: +- gen_helper_mtc0_datahi(arg); ++ gen_helper_mtc0_datahi(cpu_env, arg); + rn = "DataHi"; + break; + default: +@@ -5533,10 +5551,10 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 1: + switch (sel) { + case 1: +- gen_helper_mftc0_vpecontrol(t0); ++ gen_helper_mftc0_vpecontrol(t0, cpu_env); + break; + case 2: +- gen_helper_mftc0_vpeconf0(t0); ++ gen_helper_mftc0_vpeconf0(t0, cpu_env); + break; + default: + goto die; +@@ -5546,25 +5564,25 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 2: + switch (sel) { + case 1: +- gen_helper_mftc0_tcstatus(t0); ++ gen_helper_mftc0_tcstatus(t0, cpu_env); + break; + case 2: +- gen_helper_mftc0_tcbind(t0); ++ gen_helper_mftc0_tcbind(t0, cpu_env); + break; + case 3: +- gen_helper_mftc0_tcrestart(t0); ++ gen_helper_mftc0_tcrestart(t0, cpu_env); + break; + case 4: +- gen_helper_mftc0_tchalt(t0); ++ gen_helper_mftc0_tchalt(t0, cpu_env); + break; + case 5: +- gen_helper_mftc0_tccontext(t0); ++ gen_helper_mftc0_tccontext(t0, cpu_env); + break; + case 6: +- gen_helper_mftc0_tcschedule(t0); ++ gen_helper_mftc0_tcschedule(t0, cpu_env); + break; + case 7: +- gen_helper_mftc0_tcschefback(t0); ++ gen_helper_mftc0_tcschefback(t0, cpu_env); + break; + default: + gen_mfc0(env, ctx, t0, rt, sel); +@@ -5574,7 +5592,7 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 10: + switch (sel) { + case 0: +- gen_helper_mftc0_entryhi(t0); ++ gen_helper_mftc0_entryhi(t0, cpu_env); + break; + default: + gen_mfc0(env, ctx, t0, rt, sel); +@@ -5583,7 +5601,7 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 12: + switch (sel) { + case 0: +- gen_helper_mftc0_status(t0); ++ gen_helper_mftc0_status(t0, cpu_env); + break; + default: + gen_mfc0(env, ctx, t0, rt, sel); +@@ -5592,7 +5610,7 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 13: + switch (sel) { + case 0: +- gen_helper_mftc0_cause(t0); ++ gen_helper_mftc0_cause(t0, cpu_env); + break; + default: + goto die; +@@ -5602,7 +5620,7 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 14: + switch (sel) { + case 0: +- gen_helper_mftc0_epc(t0); ++ gen_helper_mftc0_epc(t0, cpu_env); + break; + default: + goto die; +@@ -5612,7 +5630,7 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 15: + switch (sel) { + case 1: +- gen_helper_mftc0_ebase(t0); ++ gen_helper_mftc0_ebase(t0, cpu_env); + break; + default: + goto die; +@@ -5622,7 +5640,7 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 16: + switch (sel) { + case 0 ... 7: +- gen_helper_mftc0_configx(t0, tcg_const_tl(sel)); ++ gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel)); + break; + default: + goto die; +@@ -5632,7 +5650,7 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + case 23: + switch (sel) { + case 0: +- gen_helper_mftc0_debug(t0); ++ gen_helper_mftc0_debug(t0, cpu_env); + break; + default: + gen_mfc0(env, ctx, t0, rt, sel); +@@ -5645,49 +5663,49 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + } else switch (sel) { + /* GPR registers. */ + case 0: +- gen_helper_1i(mftgpr, t0, rt); ++ gen_helper_1e0i(mftgpr, t0, rt); + break; + /* Auxiliary CPU registers */ + case 1: + switch (rt) { + case 0: +- gen_helper_1i(mftlo, t0, 0); ++ gen_helper_1e0i(mftlo, t0, 0); + break; + case 1: +- gen_helper_1i(mfthi, t0, 0); ++ gen_helper_1e0i(mfthi, t0, 0); + break; + case 2: +- gen_helper_1i(mftacx, t0, 0); ++ gen_helper_1e0i(mftacx, t0, 0); + break; + case 4: +- gen_helper_1i(mftlo, t0, 1); ++ gen_helper_1e0i(mftlo, t0, 1); + break; + case 5: +- gen_helper_1i(mfthi, t0, 1); ++ gen_helper_1e0i(mfthi, t0, 1); + break; + case 6: +- gen_helper_1i(mftacx, t0, 1); ++ gen_helper_1e0i(mftacx, t0, 1); + break; + case 8: +- gen_helper_1i(mftlo, t0, 2); ++ gen_helper_1e0i(mftlo, t0, 2); + break; + case 9: +- gen_helper_1i(mfthi, t0, 2); ++ gen_helper_1e0i(mfthi, t0, 2); + break; + case 10: +- gen_helper_1i(mftacx, t0, 2); ++ gen_helper_1e0i(mftacx, t0, 2); + break; + case 12: +- gen_helper_1i(mftlo, t0, 3); ++ gen_helper_1e0i(mftlo, t0, 3); + break; + case 13: +- gen_helper_1i(mfthi, t0, 3); ++ gen_helper_1e0i(mfthi, t0, 3); + break; + case 14: +- gen_helper_1i(mftacx, t0, 3); ++ gen_helper_1e0i(mftacx, t0, 3); + break; + case 16: +- gen_helper_mftdsp(t0); ++ gen_helper_mftdsp(t0, cpu_env); + break; + default: + goto die; +@@ -5712,7 +5730,7 @@ static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + break; + case 3: + /* XXX: For now we support only a single FPU context. */ +- gen_helper_1i(cfc1, t0, rt); ++ gen_helper_1e0i(cfc1, t0, rt); + break; + /* COP2: Not implemented. */ + case 4: +@@ -5751,10 +5769,10 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + case 1: + switch (sel) { + case 1: +- gen_helper_mttc0_vpecontrol(t0); ++ gen_helper_mttc0_vpecontrol(cpu_env, t0); + break; + case 2: +- gen_helper_mttc0_vpeconf0(t0); ++ gen_helper_mttc0_vpeconf0(cpu_env, t0); + break; + default: + goto die; +@@ -5764,25 +5782,25 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + case 2: + switch (sel) { + case 1: +- gen_helper_mttc0_tcstatus(t0); ++ gen_helper_mttc0_tcstatus(cpu_env, t0); + break; + case 2: +- gen_helper_mttc0_tcbind(t0); ++ gen_helper_mttc0_tcbind(cpu_env, t0); + break; + case 3: +- gen_helper_mttc0_tcrestart(t0); ++ gen_helper_mttc0_tcrestart(cpu_env, t0); + break; + case 4: +- gen_helper_mttc0_tchalt(t0); ++ gen_helper_mttc0_tchalt(cpu_env, t0); + break; + case 5: +- gen_helper_mttc0_tccontext(t0); ++ gen_helper_mttc0_tccontext(cpu_env, t0); + break; + case 6: +- gen_helper_mttc0_tcschedule(t0); ++ gen_helper_mttc0_tcschedule(cpu_env, t0); + break; + case 7: +- gen_helper_mttc0_tcschefback(t0); ++ gen_helper_mttc0_tcschefback(cpu_env, t0); + break; + default: + gen_mtc0(env, ctx, t0, rd, sel); +@@ -5792,7 +5810,7 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + case 10: + switch (sel) { + case 0: +- gen_helper_mttc0_entryhi(t0); ++ gen_helper_mttc0_entryhi(cpu_env, t0); + break; + default: + gen_mtc0(env, ctx, t0, rd, sel); +@@ -5801,7 +5819,7 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + case 12: + switch (sel) { + case 0: +- gen_helper_mttc0_status(t0); ++ gen_helper_mttc0_status(cpu_env, t0); + break; + default: + gen_mtc0(env, ctx, t0, rd, sel); +@@ -5810,7 +5828,7 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + case 13: + switch (sel) { + case 0: +- gen_helper_mttc0_cause(t0); ++ gen_helper_mttc0_cause(cpu_env, t0); + break; + default: + goto die; +@@ -5820,7 +5838,7 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + case 15: + switch (sel) { + case 1: +- gen_helper_mttc0_ebase(t0); ++ gen_helper_mttc0_ebase(cpu_env, t0); + break; + default: + goto die; +@@ -5830,7 +5848,7 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + case 23: + switch (sel) { + case 0: +- gen_helper_mttc0_debug(t0); ++ gen_helper_mttc0_debug(cpu_env, t0); + break; + default: + gen_mtc0(env, ctx, t0, rd, sel); +@@ -5843,49 +5861,49 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + } else switch (sel) { + /* GPR registers. */ + case 0: +- gen_helper_1i(mttgpr, t0, rd); ++ gen_helper_0e1i(mttgpr, t0, rd); + break; + /* Auxiliary CPU registers */ + case 1: + switch (rd) { + case 0: +- gen_helper_1i(mttlo, t0, 0); ++ gen_helper_0e1i(mttlo, t0, 0); + break; + case 1: +- gen_helper_1i(mtthi, t0, 0); ++ gen_helper_0e1i(mtthi, t0, 0); + break; + case 2: +- gen_helper_1i(mttacx, t0, 0); ++ gen_helper_0e1i(mttacx, t0, 0); + break; + case 4: +- gen_helper_1i(mttlo, t0, 1); ++ gen_helper_0e1i(mttlo, t0, 1); + break; + case 5: +- gen_helper_1i(mtthi, t0, 1); ++ gen_helper_0e1i(mtthi, t0, 1); + break; + case 6: +- gen_helper_1i(mttacx, t0, 1); ++ gen_helper_0e1i(mttacx, t0, 1); + break; + case 8: +- gen_helper_1i(mttlo, t0, 2); ++ gen_helper_0e1i(mttlo, t0, 2); + break; + case 9: +- gen_helper_1i(mtthi, t0, 2); ++ gen_helper_0e1i(mtthi, t0, 2); + break; + case 10: +- gen_helper_1i(mttacx, t0, 2); ++ gen_helper_0e1i(mttacx, t0, 2); + break; + case 12: +- gen_helper_1i(mttlo, t0, 3); ++ gen_helper_0e1i(mttlo, t0, 3); + break; + case 13: +- gen_helper_1i(mtthi, t0, 3); ++ gen_helper_0e1i(mtthi, t0, 3); + break; + case 14: +- gen_helper_1i(mttacx, t0, 3); ++ gen_helper_0e1i(mttacx, t0, 3); + break; + case 16: +- gen_helper_mttdsp(t0); ++ gen_helper_mttdsp(cpu_env, t0); + break; + default: + goto die; +@@ -5910,7 +5928,7 @@ static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + break; + case 3: + /* XXX: For now we support only a single FPU context. */ +- gen_helper_1i(ctc1, t0, rd); ++ gen_helper_0e1i(ctc1, t0, rd); + break; + /* COP2: Not implemented. */ + case 4: +@@ -5995,30 +6013,30 @@ static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, + opn = "tlbwi"; + if (!env->tlb->helper_tlbwi) + goto die; +- gen_helper_tlbwi(); ++ gen_helper_tlbwi(cpu_env); + break; + case OPC_TLBWR: + opn = "tlbwr"; + if (!env->tlb->helper_tlbwr) + goto die; +- gen_helper_tlbwr(); ++ gen_helper_tlbwr(cpu_env); + break; + case OPC_TLBP: + opn = "tlbp"; + if (!env->tlb->helper_tlbp) + goto die; +- gen_helper_tlbp(); ++ gen_helper_tlbp(cpu_env); + break; + case OPC_TLBR: + opn = "tlbr"; + if (!env->tlb->helper_tlbr) + goto die; +- gen_helper_tlbr(); ++ gen_helper_tlbr(cpu_env); + break; + case OPC_ERET: + opn = "eret"; + check_insn(env, ctx, ISA_MIPS2); +- gen_helper_eret(); ++ gen_helper_eret(cpu_env); + ctx->bstate = BS_EXCP; + break; + case OPC_DERET: +@@ -6028,7 +6046,7 @@ static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, + MIPS_INVAL(opn); + generate_exception(ctx, EXCP_RI); + } else { +- gen_helper_deret(); ++ gen_helper_deret(cpu_env); + ctx->bstate = BS_EXCP; + } + break; +@@ -6039,7 +6057,7 @@ static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, + ctx->pc += 4; + save_cpu_state(ctx, 1); + ctx->pc -= 4; +- gen_helper_wait(); ++ gen_helper_wait(cpu_env); + ctx->bstate = BS_EXCP; + break; + default: +@@ -6340,13 +6358,13 @@ static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs) + opn = "mtc1"; + break; + case OPC_CFC1: +- gen_helper_1i(cfc1, t0, fs); ++ gen_helper_1e0i(cfc1, t0, fs); + gen_store_gpr(t0, rt); + opn = "cfc1"; + break; + case OPC_CTC1: + gen_load_gpr(t0, rt); +- gen_helper_1i(ctc1, t0, fs); ++ gen_helper_0e1i(ctc1, t0, fs); + opn = "ctc1"; + break; + #if defined(TARGET_MIPS64) +@@ -6543,7 +6561,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); +- gen_helper_float_add_s(fp0, fp0, fp1); ++ gen_helper_float_add_s(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); +@@ -6558,7 +6576,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); +- gen_helper_float_sub_s(fp0, fp0, fp1); ++ gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); +@@ -6573,7 +6591,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); +- gen_helper_float_mul_s(fp0, fp0, fp1); ++ gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); +@@ -6588,7 +6606,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); +- gen_helper_float_div_s(fp0, fp0, fp1); ++ gen_helper_float_div_s(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); +@@ -6601,7 +6619,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_sqrt_s(fp0, fp0); ++ gen_helper_float_sqrt_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6646,7 +6664,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr32(fp32, fs); +- gen_helper_float_roundl_s(fp64, fp32); ++ gen_helper_float_roundl_s(fp64, cpu_env, fp32); + tcg_temp_free_i32(fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(fp64); +@@ -6660,7 +6678,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr32(fp32, fs); +- gen_helper_float_truncl_s(fp64, fp32); ++ gen_helper_float_truncl_s(fp64, cpu_env, fp32); + tcg_temp_free_i32(fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(fp64); +@@ -6674,7 +6692,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr32(fp32, fs); +- gen_helper_float_ceill_s(fp64, fp32); ++ gen_helper_float_ceill_s(fp64, cpu_env, fp32); + tcg_temp_free_i32(fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(fp64); +@@ -6688,7 +6706,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr32(fp32, fs); +- gen_helper_float_floorl_s(fp64, fp32); ++ gen_helper_float_floorl_s(fp64, cpu_env, fp32); + tcg_temp_free_i32(fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(fp64); +@@ -6700,7 +6718,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_roundw_s(fp0, fp0); ++ gen_helper_float_roundw_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6711,7 +6729,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_truncw_s(fp0, fp0); ++ gen_helper_float_truncw_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6722,7 +6740,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_ceilw_s(fp0, fp0); ++ gen_helper_float_ceilw_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6733,7 +6751,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_floorw_s(fp0, fp0); ++ gen_helper_float_floorw_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6781,7 +6799,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_recip_s(fp0, fp0); ++ gen_helper_float_recip_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6793,7 +6811,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_rsqrt_s(fp0, fp0); ++ gen_helper_float_rsqrt_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6807,7 +6825,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); +- gen_helper_float_recip2_s(fp0, fp0, fp1); ++ gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); +@@ -6820,7 +6838,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_recip1_s(fp0, fp0); ++ gen_helper_float_recip1_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6832,7 +6850,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_rsqrt1_s(fp0, fp0); ++ gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6846,7 +6864,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); +- gen_helper_float_rsqrt2_s(fp0, fp0, fp1); ++ gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); +@@ -6860,7 +6878,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr32(fp32, fs); +- gen_helper_float_cvtd_s(fp64, fp32); ++ gen_helper_float_cvtd_s(fp64, cpu_env, fp32); + tcg_temp_free_i32(fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(fp64); +@@ -6872,7 +6890,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_cvtw_s(fp0, fp0); ++ gen_helper_float_cvtw_s(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -6885,7 +6903,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr32(fp32, fs); +- gen_helper_float_cvtl_s(fp64, fp32); ++ gen_helper_float_cvtl_s(fp64, cpu_env, fp32); + tcg_temp_free_i32(fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(fp64); +@@ -6941,7 +6959,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_add_d(fp0, fp0, fp1); ++ gen_helper_float_add_d(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -6957,7 +6975,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_sub_d(fp0, fp0, fp1); ++ gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -6973,7 +6991,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_mul_d(fp0, fp0, fp1); ++ gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -6989,7 +7007,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_div_d(fp0, fp0, fp1); ++ gen_helper_float_div_d(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7003,7 +7021,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_sqrt_d(fp0, fp0); ++ gen_helper_float_sqrt_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7050,7 +7068,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_roundl_d(fp0, fp0); ++ gen_helper_float_roundl_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7062,7 +7080,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_truncl_d(fp0, fp0); ++ gen_helper_float_truncl_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7074,7 +7092,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_ceill_d(fp0, fp0); ++ gen_helper_float_ceill_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7086,7 +7104,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_floorl_d(fp0, fp0); ++ gen_helper_float_floorl_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7099,7 +7117,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp64, fs); +- gen_helper_float_roundw_d(fp32, fp64); ++ gen_helper_float_roundw_d(fp32, cpu_env, fp64); + tcg_temp_free_i64(fp64); + gen_store_fpr32(fp32, fd); + tcg_temp_free_i32(fp32); +@@ -7113,7 +7131,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp64, fs); +- gen_helper_float_truncw_d(fp32, fp64); ++ gen_helper_float_truncw_d(fp32, cpu_env, fp64); + tcg_temp_free_i64(fp64); + gen_store_fpr32(fp32, fd); + tcg_temp_free_i32(fp32); +@@ -7127,7 +7145,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp64, fs); +- gen_helper_float_ceilw_d(fp32, fp64); ++ gen_helper_float_ceilw_d(fp32, cpu_env, fp64); + tcg_temp_free_i64(fp64); + gen_store_fpr32(fp32, fd); + tcg_temp_free_i32(fp32); +@@ -7141,7 +7159,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp64, fs); +- gen_helper_float_floorw_d(fp32, fp64); ++ gen_helper_float_floorw_d(fp32, cpu_env, fp64); + tcg_temp_free_i64(fp64); + gen_store_fpr32(fp32, fd); + tcg_temp_free_i32(fp32); +@@ -7190,7 +7208,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_recip_d(fp0, fp0); ++ gen_helper_float_recip_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7202,7 +7220,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_rsqrt_d(fp0, fp0); ++ gen_helper_float_rsqrt_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7216,7 +7234,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_recip2_d(fp0, fp0, fp1); ++ gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7229,7 +7247,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_recip1_d(fp0, fp0); ++ gen_helper_float_recip1_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7241,7 +7259,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_rsqrt1_d(fp0, fp0); ++ gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7255,7 +7273,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_rsqrt2_d(fp0, fp0, fp1); ++ gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7293,7 +7311,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp64, fs); +- gen_helper_float_cvts_d(fp32, fp64); ++ gen_helper_float_cvts_d(fp32, cpu_env, fp64); + tcg_temp_free_i64(fp64); + gen_store_fpr32(fp32, fd); + tcg_temp_free_i32(fp32); +@@ -7307,7 +7325,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp64, fs); +- gen_helper_float_cvtw_d(fp32, fp64); ++ gen_helper_float_cvtw_d(fp32, cpu_env, fp64); + tcg_temp_free_i64(fp64); + gen_store_fpr32(fp32, fd); + tcg_temp_free_i32(fp32); +@@ -7320,7 +7338,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_cvtl_d(fp0, fp0); ++ gen_helper_float_cvtl_d(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7331,7 +7349,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_cvts_w(fp0, fp0); ++ gen_helper_float_cvts_w(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -7344,7 +7362,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr32(fp32, fs); +- gen_helper_float_cvtd_w(fp64, fp32); ++ gen_helper_float_cvtd_w(fp64, cpu_env, fp32); + tcg_temp_free_i32(fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(fp64); +@@ -7358,7 +7376,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp64 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp64, fs); +- gen_helper_float_cvts_l(fp32, fp64); ++ gen_helper_float_cvts_l(fp32, cpu_env, fp64); + tcg_temp_free_i64(fp64); + gen_store_fpr32(fp32, fd); + tcg_temp_free_i32(fp32); +@@ -7371,7 +7389,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_cvtd_l(fp0, fp0); ++ gen_helper_float_cvtd_l(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7383,7 +7401,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_cvtps_pw(fp0, fp0); ++ gen_helper_float_cvtps_pw(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7397,7 +7415,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_add_ps(fp0, fp0, fp1); ++ gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7412,7 +7430,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_sub_ps(fp0, fp0, fp1); ++ gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7427,7 +7445,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_mul_ps(fp0, fp0, fp1); ++ gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7515,7 +7533,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, ft); + gen_load_fpr64(ctx, fp1, fs); +- gen_helper_float_addr_ps(fp0, fp0, fp1); ++ gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7530,7 +7548,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, ft); + gen_load_fpr64(ctx, fp1, fs); +- gen_helper_float_mulr_ps(fp0, fp0, fp1); ++ gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7545,7 +7563,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_recip2_ps(fp0, fp0, fp1); ++ gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7558,7 +7576,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_recip1_ps(fp0, fp0); ++ gen_helper_float_recip1_ps(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7570,7 +7588,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_rsqrt1_ps(fp0, fp0); ++ gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7584,7 +7602,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); +- gen_helper_float_rsqrt2_ps(fp0, fp0, fp1); ++ gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); +@@ -7597,7 +7615,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32h(fp0, fs); +- gen_helper_float_cvts_pu(fp0, fp0); ++ gen_helper_float_cvts_pu(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -7609,7 +7627,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i64 fp0 = tcg_temp_new_i64(); + + gen_load_fpr64(ctx, fp0, fs); +- gen_helper_float_cvtpw_ps(fp0, fp0); ++ gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(fp0); + } +@@ -7621,7 +7639,7 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1, + TCGv_i32 fp0 = tcg_temp_new_i32(); + + gen_load_fpr32(fp0, fs); +- gen_helper_float_cvts_pl(fp0, fp0); ++ gen_helper_float_cvts_pl(fp0, cpu_env, fp0); + gen_store_fpr32(fp0, fd); + tcg_temp_free_i32(fp0); + } +@@ -7887,7 +7905,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); + gen_load_fpr32(fp2, fr); +- gen_helper_float_muladd_s(fp2, fp0, fp1, fp2); ++ gen_helper_float_muladd_s(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i32(fp0); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp2, fd); +@@ -7906,7 +7924,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); +- gen_helper_float_muladd_d(fp2, fp0, fp1, fp2); ++ gen_helper_float_muladd_d(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(fp0); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp2, fd); +@@ -7924,7 +7942,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); +- gen_helper_float_muladd_ps(fp2, fp0, fp1, fp2); ++ gen_helper_float_muladd_ps(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(fp0); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp2, fd); +@@ -7942,7 +7960,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); + gen_load_fpr32(fp2, fr); +- gen_helper_float_mulsub_s(fp2, fp0, fp1, fp2); ++ gen_helper_float_mulsub_s(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i32(fp0); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp2, fd); +@@ -7961,7 +7979,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); +- gen_helper_float_mulsub_d(fp2, fp0, fp1, fp2); ++ gen_helper_float_mulsub_d(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(fp0); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp2, fd); +@@ -7979,7 +7997,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); +- gen_helper_float_mulsub_ps(fp2, fp0, fp1, fp2); ++ gen_helper_float_mulsub_ps(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(fp0); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp2, fd); +@@ -7997,7 +8015,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); + gen_load_fpr32(fp2, fr); +- gen_helper_float_nmuladd_s(fp2, fp0, fp1, fp2); ++ gen_helper_float_nmuladd_s(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i32(fp0); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp2, fd); +@@ -8016,7 +8034,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); +- gen_helper_float_nmuladd_d(fp2, fp0, fp1, fp2); ++ gen_helper_float_nmuladd_d(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(fp0); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp2, fd); +@@ -8034,7 +8052,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); +- gen_helper_float_nmuladd_ps(fp2, fp0, fp1, fp2); ++ gen_helper_float_nmuladd_ps(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(fp0); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp2, fd); +@@ -8052,7 +8070,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr32(fp0, fs); + gen_load_fpr32(fp1, ft); + gen_load_fpr32(fp2, fr); +- gen_helper_float_nmulsub_s(fp2, fp0, fp1, fp2); ++ gen_helper_float_nmulsub_s(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i32(fp0); + tcg_temp_free_i32(fp1); + gen_store_fpr32(fp2, fd); +@@ -8071,7 +8089,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); +- gen_helper_float_nmulsub_d(fp2, fp0, fp1, fp2); ++ gen_helper_float_nmulsub_d(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(fp0); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp2, fd); +@@ -8089,7 +8107,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); +- gen_helper_float_nmulsub_ps(fp2, fp0, fp1, fp2); ++ gen_helper_float_nmulsub_ps(fp2, cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(fp0); + tcg_temp_free_i64(fp1); + gen_store_fpr64(ctx, fp2, fd); +@@ -8122,22 +8140,22 @@ gen_rdhwr (CPUMIPSState *env, DisasContext *ctx, int rt, int rd) + switch (rd) { + case 0: + save_cpu_state(ctx, 1); +- gen_helper_rdhwr_cpunum(t0); ++ gen_helper_rdhwr_cpunum(t0, cpu_env); + gen_store_gpr(t0, rt); + break; + case 1: + save_cpu_state(ctx, 1); +- gen_helper_rdhwr_synci_step(t0); ++ gen_helper_rdhwr_synci_step(t0, cpu_env); + gen_store_gpr(t0, rt); + break; + case 2: + save_cpu_state(ctx, 1); +- gen_helper_rdhwr_cc(t0); ++ gen_helper_rdhwr_cc(t0, cpu_env); + gen_store_gpr(t0, rt); + break; + case 3: + save_cpu_state(ctx, 1); +- gen_helper_rdhwr_ccres(t0); ++ gen_helper_rdhwr_ccres(t0, cpu_env); + gen_store_gpr(t0, rt); + break; + case 29: +@@ -8214,7 +8232,7 @@ static void handle_delay_slot (CPUMIPSState *env, DisasContext *ctx, + } + if (ctx->singlestep_enabled) { + save_cpu_state(ctx, 0); +- gen_helper_0i(raise_exception, EXCP_DEBUG); ++ gen_helper_0e0i(raise_exception, EXCP_DEBUG); + } + tcg_gen_exit_tb(0); + break; +@@ -8678,7 +8696,7 @@ static void decode_i64_mips16 (CPUMIPSState *env, DisasContext *ctx, + static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx, + int *is_branch) + { +- int extend = lduw_code(ctx->pc + 2); ++ int extend = cpu_lduw_code(env, ctx->pc + 2); + int op, rx, ry, funct, sa; + int16_t imm, offset; + +@@ -8904,7 +8922,7 @@ static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx, + /* No delay slot, so just process as a normal instruction */ + break; + case M16_OPC_JAL: +- offset = lduw_code(ctx->pc + 2); ++ offset = cpu_lduw_code(env, ctx->pc + 2); + offset = (((ctx->opcode & 0x1f) << 21) + | ((ctx->opcode >> 5) & 0x1f) << 16 + | offset) << 2; +@@ -9855,17 +9873,17 @@ static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist, + save_cpu_state(ctx, 1); + switch (opc) { + case LWM32: +- gen_helper_lwm(t0, t1, t2); ++ gen_helper_lwm(cpu_env, t0, t1, t2); + break; + case SWM32: +- gen_helper_swm(t0, t1, t2); ++ gen_helper_swm(cpu_env, t0, t1, t2); + break; + #ifdef TARGET_MIPS64 + case LDM: +- gen_helper_ldm(t0, t1, t2); ++ gen_helper_ldm(cpu_env, t0, t1, t2); + break; + case SDM: +- gen_helper_sdm(t0, t1, t2); ++ gen_helper_sdm(cpu_env, t0, t1, t2); + break; + #endif + } +@@ -10287,7 +10305,7 @@ static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs, + TCGv t0 = tcg_temp_new(); + + save_cpu_state(ctx, 1); +- gen_helper_di(t0); ++ gen_helper_di(t0, cpu_env); + gen_store_gpr(t0, rs); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -10300,7 +10318,7 @@ static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs, + TCGv t0 = tcg_temp_new(); + + save_cpu_state(ctx, 1); +- gen_helper_ei(t0); ++ gen_helper_ei(t0, cpu_env); + gen_store_gpr(t0, rs); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -10635,7 +10653,7 @@ static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx, + uint32_t op, minor, mips32_op; + uint32_t cond, fmt, cc; + +- insn = lduw_code(ctx->pc + 2); ++ insn = cpu_lduw_code(env, ctx->pc + 2); + ctx->opcode = (ctx->opcode << 16) | insn; + + rt = (ctx->opcode >> 21) & 0x1f; +@@ -11827,7 +11845,7 @@ static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch) + MIPS_INVAL("PMON / selsl"); + generate_exception(ctx, EXCP_RI); + #else +- gen_helper_0i(pmon, sa); ++ gen_helper_0e0i(pmon, sa); + #endif + break; + case OPC_SYSCALL: +@@ -12045,7 +12063,7 @@ static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch) + + save_cpu_state(ctx, 1); + gen_load_gpr(t0, rs); +- gen_helper_yield(t0, t0); ++ gen_helper_yield(t0, cpu_env, t0); + gen_store_gpr(t0, rd); + tcg_temp_free(t0); + } +@@ -12144,18 +12162,18 @@ static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch) + break; + case OPC_DVPE: + check_insn(env, ctx, ASE_MT); +- gen_helper_dvpe(t0); ++ gen_helper_dvpe(t0, cpu_env); + gen_store_gpr(t0, rt); + break; + case OPC_EVPE: + check_insn(env, ctx, ASE_MT); +- gen_helper_evpe(t0); ++ gen_helper_evpe(t0, cpu_env); + gen_store_gpr(t0, rt); + break; + case OPC_DI: + check_insn(env, ctx, ISA_MIPS32R2); + save_cpu_state(ctx, 1); +- gen_helper_di(t0); ++ gen_helper_di(t0, cpu_env); + gen_store_gpr(t0, rt); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -12163,7 +12181,7 @@ static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch) + case OPC_EI: + check_insn(env, ctx, ISA_MIPS32R2); + save_cpu_state(ctx, 1); +- gen_helper_ei(t0); ++ gen_helper_ei(t0, cpu_env); + gen_store_gpr(t0, rt); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +@@ -12432,7 +12450,7 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb, + if (bp->pc == ctx.pc) { + save_cpu_state(&ctx, 1); + ctx.bstate = BS_BRANCH; +- gen_helper_0i(raise_exception, EXCP_DEBUG); ++ gen_helper_0e0i(raise_exception, EXCP_DEBUG); + /* Include the breakpoint location or the tb won't + * be flushed when it must be. */ + ctx.pc += 4; +@@ -12458,14 +12476,14 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb, + + is_branch = 0; + if (!(ctx.hflags & MIPS_HFLAG_M16)) { +- ctx.opcode = ldl_code(ctx.pc); ++ ctx.opcode = cpu_ldl_code(env, ctx.pc); + insn_bytes = 4; + decode_opc(env, &ctx, &is_branch); + } else if (env->insn_flags & ASE_MICROMIPS) { +- ctx.opcode = lduw_code(ctx.pc); ++ ctx.opcode = cpu_lduw_code(env, ctx.pc); + insn_bytes = decode_micromips_opc(env, &ctx, &is_branch); + } else if (env->insn_flags & ASE_MIPS16) { +- ctx.opcode = lduw_code(ctx.pc); ++ ctx.opcode = cpu_lduw_code(env, ctx.pc); + insn_bytes = decode_mips16_opc(env, &ctx, &is_branch); + } else { + generate_exception(&ctx, EXCP_RI); +@@ -12502,7 +12520,7 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb, + gen_io_end(); + if (env->singlestep_enabled && ctx.bstate != BS_BRANCH) { + save_cpu_state(&ctx, ctx.bstate == BS_NONE); +- gen_helper_0i(raise_exception, EXCP_DEBUG); ++ gen_helper_0e0i(raise_exception, EXCP_DEBUG); + } else { + switch (ctx.bstate) { + case BS_STOP: +-- +1.7.12.1 + diff --git a/0039-Remove-unused-CONFIG_TCG_PASS_AREG0-and-dead-code.patch b/0039-Remove-unused-CONFIG_TCG_PASS_AREG0-and-dead-code.patch new file mode 100644 index 0000000..72c61e8 --- /dev/null +++ b/0039-Remove-unused-CONFIG_TCG_PASS_AREG0-and-dead-code.patch @@ -0,0 +1,1683 @@ +From 3ec8ca067ea6617b5bd4423d0b40c894b39a4924 Mon Sep 17 00:00:00 2001 +From: Blue Swirl +Date: Sun, 2 Sep 2012 15:28:56 +0000 +Subject: [PATCH] Remove unused CONFIG_TCG_PASS_AREG0 and dead code + +Now that CONFIG_TCG_PASS_AREG0 is enabled for all targets, +remove dead code and support for !CONFIG_TCG_PASS_AREG0 case. + +Remove dyngen-exec.h and all references to it. Although included by +hw/spapr_hcall.c, it does not seem to use it. + +Remove unused HELPER_CFLAGS. + +Signed-off-by: Blue Swirl +Reviewed-by: Richard Henderson +Signed-off-by: Michael Roth +--- + Makefile.target | 8 ------ + configure | 11 ------- + cpu-all.h | 11 ------- + cputlb.c | 5 ---- + dyngen-exec.h | 70 -------------------------------------------- + exec-all.h | 4 --- + hw/spapr_hcall.c | 1 - + softmmu_defs.h | 21 -------------- + softmmu_header.h | 63 +++++++++++++--------------------------- + softmmu_template.h | 72 +++++++++++++++++----------------------------- + target-m68k/op_helper.c | 3 -- + target-sparc/Makefile.objs | 2 -- + tcg/arm/tcg-target.c | 31 ++------------------ + tcg/arm/tcg-target.h | 1 - + tcg/hppa/tcg-target.c | 24 ---------------- + tcg/hppa/tcg-target.h | 1 - + tcg/i386/tcg-target.c | 30 ------------------- + tcg/i386/tcg-target.h | 1 - + tcg/ia64/tcg-target.c | 34 ---------------------- + tcg/ia64/tcg-target.h | 1 - + tcg/mips/tcg-target.c | 31 ++------------------ + tcg/mips/tcg-target.h | 1 - + tcg/ppc/tcg-target.c | 38 ------------------------ + tcg/ppc64/tcg-target.c | 28 ------------------ + tcg/s390/tcg-target.c | 24 ---------------- + tcg/s390/tcg-target.h | 1 - + tcg/sparc/tcg-target.c | 30 ------------------- + tcg/sparc/tcg-target.h | 1 - + tcg/tci/tcg-target.c | 4 --- + tci.c | 12 -------- + user-exec.c | 14 --------- + 31 files changed, 53 insertions(+), 525 deletions(-) + delete mode 100644 dyngen-exec.h + +diff --git a/Makefile.target b/Makefile.target +index 7892a8d..d9d54b8 100644 +--- a/Makefile.target ++++ b/Makefile.target +@@ -80,14 +80,6 @@ obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o + + tci-dis.o: QEMU_CFLAGS += -I$(SRC_PATH)/tcg -I$(SRC_PATH)/tcg/tci + +-# HELPER_CFLAGS is used for all the legacy code compiled with static register +-# variables +-user-exec.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +- +-# Note: this is a workaround. The real fix is to avoid compiling +-# cpu_signal_handler() in user-exec.c. +-%/signal.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +- + ######################################################### + # Linux user emulator target + +diff --git a/configure b/configure +index 83b068d..816f0f9 100755 +--- a/configure ++++ b/configure +@@ -118,7 +118,6 @@ audio_card_list="ac97 es1370 sb16 hda" + audio_possible_cards="ac97 es1370 sb16 cs4231a adlib gus hda" + block_drv_whitelist="" + host_cc="gcc" +-helper_cflags="" + libs_softmmu="" + libs_tools="" + audio_pt_int="" +@@ -904,7 +903,6 @@ case "$cpu" in + QEMU_CFLAGS="-m32 -ffixed-g2 -ffixed-g3 $QEMU_CFLAGS" + if test "$solaris" = "no" ; then + QEMU_CFLAGS="-ffixed-g1 -ffixed-g6 $QEMU_CFLAGS" +- helper_cflags="-ffixed-i0" + fi + ;; + sparc64) +@@ -929,7 +927,6 @@ case "$cpu" in + QEMU_CFLAGS="-m32 $QEMU_CFLAGS" + LDFLAGS="-m32 $LDFLAGS" + cc_i386='$(CC) -m32' +- helper_cflags="-fomit-frame-pointer" + host_guest_base="yes" + ;; + x86_64) +@@ -3582,7 +3579,6 @@ if test "$sparse" = "yes" ; then + echo "HOST_CC := REAL_CC=\"\$(HOST_CC)\" cgcc" >> $config_host_mak + echo "QEMU_CFLAGS += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak + fi +-echo "HELPER_CFLAGS=$helper_cflags" >> $config_host_mak + echo "LDFLAGS=$LDFLAGS" >> $config_host_mak + echo "ARLIBS_BEGIN=$arlibs_begin" >> $config_host_mak + echo "ARLIBS_END=$arlibs_end" >> $config_host_mak +@@ -3837,13 +3833,6 @@ fi + + symlink "$source_path/Makefile.target" "$target_dir/Makefile" + +- +-case "$target_arch2" in +- alpha | arm* | cris | i386 | lm32 | m68k | microblaze* | mips* | or32 | s390x | sh4* | sparc* | unicore32 | x86_64 | xtensa* | ppc*) +- echo "CONFIG_TCG_PASS_AREG0=y" >> $config_target_mak +- ;; +-esac +- + upper() { + echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]' + } +diff --git a/cpu-all.h b/cpu-all.h +index 5e07d28..74d3681 100644 +--- a/cpu-all.h ++++ b/cpu-all.h +@@ -260,14 +260,6 @@ extern unsigned long reserved_va; + #define stfl(p, v) stfl_raw(p, v) + #define stfq(p, v) stfq_raw(p, v) + +-#ifndef CONFIG_TCG_PASS_AREG0 +-#define ldub_code(p) ldub_raw(p) +-#define ldsb_code(p) ldsb_raw(p) +-#define lduw_code(p) lduw_raw(p) +-#define ldsw_code(p) ldsw_raw(p) +-#define ldl_code(p) ldl_raw(p) +-#define ldq_code(p) ldq_raw(p) +-#else + #define cpu_ldub_code(env1, p) ldub_raw(p) + #define cpu_ldsb_code(env1, p) ldsb_raw(p) + #define cpu_lduw_code(env1, p) lduw_raw(p) +@@ -296,7 +288,6 @@ extern unsigned long reserved_va; + #define cpu_stw_kernel(env, addr, data) stw_raw(addr, data) + #define cpu_stl_kernel(env, addr, data) stl_raw(addr, data) + #define cpu_stq_kernel(env, addr, data) stq_raw(addr, data) +-#endif + + #define ldub_kernel(p) ldub_raw(p) + #define ldsb_kernel(p) ldsb_raw(p) +@@ -313,7 +304,6 @@ extern unsigned long reserved_va; + #define stfl_kernel(p, v) stfl_raw(p, v) + #define stfq_kernel(p, vt) stfq_raw(p, v) + +-#ifdef CONFIG_TCG_PASS_AREG0 + #define cpu_ldub_data(env, addr) ldub_raw(addr) + #define cpu_lduw_data(env, addr) lduw_raw(addr) + #define cpu_ldl_data(env, addr) ldl_raw(addr) +@@ -321,7 +311,6 @@ extern unsigned long reserved_va; + #define cpu_stb_data(env, addr, data) stb_raw(addr, data) + #define cpu_stw_data(env, addr, data) stw_raw(addr, data) + #define cpu_stl_data(env, addr, data) stl_raw(addr, data) +-#endif + #endif /* defined(CONFIG_USER_ONLY) */ + + /* page related stuff */ +diff --git a/cputlb.c b/cputlb.c +index d3e7b25..51b5897 100644 +--- a/cputlb.c ++++ b/cputlb.c +@@ -325,11 +325,7 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) + mmu_idx = cpu_mmu_index(env1); + if (unlikely(env1->tlb_table[mmu_idx][page_index].addr_code != + (addr & TARGET_PAGE_MASK))) { +-#ifdef CONFIG_TCG_PASS_AREG0 + cpu_ldub_code(env1, addr); +-#else +- ldub_code(addr); +-#endif + } + pd = env1->iotlb[mmu_idx][page_index] & ~TARGET_PAGE_MASK; + mr = iotlb_to_region(pd); +@@ -348,7 +344,6 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) + #define MMUSUFFIX _cmmu + #undef GETPC + #define GETPC() ((uintptr_t)0) +-#define env cpu_single_env + #define SOFTMMU_CODE_ACCESS + + #define SHIFT 0 +diff --git a/dyngen-exec.h b/dyngen-exec.h +deleted file mode 100644 +index 083e20b..0000000 +--- a/dyngen-exec.h ++++ /dev/null +@@ -1,70 +0,0 @@ +-/* +- * dyngen defines for micro operation code +- * +- * Copyright (c) 2003 Fabrice Bellard +- * +- * This library is free software; you can redistribute it and/or +- * modify it under the terms of the GNU Lesser General Public +- * License as published by the Free Software Foundation; either +- * version 2 of the License, or (at your option) any later version. +- * +- * This library is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * Lesser General Public License for more details. +- * +- * You should have received a copy of the GNU Lesser General Public +- * License along with this library; if not, see . +- */ +-#if !defined(__DYNGEN_EXEC_H__) +-#define __DYNGEN_EXEC_H__ +- +-#if defined(CONFIG_TCG_INTERPRETER) +-/* The TCG interpreter does not need a special register AREG0, +- * but it is possible to use one by defining AREG0. +- * On i386, register edi seems to work. */ +-/* Run without special register AREG0 or use a value defined elsewhere. */ +-#elif defined(__i386__) +-#define AREG0 "ebp" +-#elif defined(__x86_64__) +-#define AREG0 "r14" +-#elif defined(_ARCH_PPC) +-#define AREG0 "r27" +-#elif defined(__arm__) +-#define AREG0 "r6" +-#elif defined(__hppa__) +-#define AREG0 "r17" +-#elif defined(__mips__) +-#define AREG0 "s0" +-#elif defined(__sparc__) +-#ifdef CONFIG_SOLARIS +-#define AREG0 "g2" +-#else +-#ifdef __sparc_v9__ +-#define AREG0 "g5" +-#else +-#define AREG0 "g6" +-#endif +-#endif +-#elif defined(__s390__) +-#define AREG0 "r10" +-#elif defined(__alpha__) +-/* Note $15 is the frame pointer, so anything in op-i386.c that would +- require a frame pointer, like alloca, would probably loose. */ +-#define AREG0 "$15" +-#elif defined(__mc68000) +-#define AREG0 "%a5" +-#elif defined(__ia64__) +-#define AREG0 "r7" +-#else +-#error unsupported CPU +-#endif +- +-#if defined(AREG0) +-register CPUArchState *env asm(AREG0); +-#else +-/* TODO: Try env = cpu_single_env. */ +-extern CPUArchState *env; +-#endif +- +-#endif /* !defined(__DYNGEN_EXEC_H__) */ +diff --git a/exec-all.h b/exec-all.h +index c5ec8e1..c5d3a13 100644 +--- a/exec-all.h ++++ b/exec-all.h +@@ -323,9 +323,6 @@ void tlb_fill(CPUArchState *env1, target_ulong addr, int is_write, int mmu_idx, + + #define ACCESS_TYPE (NB_MMU_MODES + 1) + #define MEMSUFFIX _code +-#ifndef CONFIG_TCG_PASS_AREG0 +-#define env cpu_single_env +-#endif + + #define DATA_SIZE 1 + #include "softmmu_header.h" +@@ -341,7 +338,6 @@ void tlb_fill(CPUArchState *env1, target_ulong addr, int is_write, int mmu_idx, + + #undef ACCESS_TYPE + #undef MEMSUFFIX +-#undef env + + #endif + +diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c +index a5990a9..abd847f 100644 +--- a/hw/spapr_hcall.c ++++ b/hw/spapr_hcall.c +@@ -1,6 +1,5 @@ + #include "sysemu.h" + #include "cpu.h" +-#include "dyngen-exec.h" + #include "qemu-char.h" + #include "sysemu.h" + #include "qemu-char.h" +diff --git a/softmmu_defs.h b/softmmu_defs.h +index 8d59f9d..1f25e33 100644 +--- a/softmmu_defs.h ++++ b/softmmu_defs.h +@@ -9,25 +9,6 @@ + #ifndef SOFTMMU_DEFS_H + #define SOFTMMU_DEFS_H + +-#ifndef CONFIG_TCG_PASS_AREG0 +-uint8_t __ldb_mmu(target_ulong addr, int mmu_idx); +-void __stb_mmu(target_ulong addr, uint8_t val, int mmu_idx); +-uint16_t __ldw_mmu(target_ulong addr, int mmu_idx); +-void __stw_mmu(target_ulong addr, uint16_t val, int mmu_idx); +-uint32_t __ldl_mmu(target_ulong addr, int mmu_idx); +-void __stl_mmu(target_ulong addr, uint32_t val, int mmu_idx); +-uint64_t __ldq_mmu(target_ulong addr, int mmu_idx); +-void __stq_mmu(target_ulong addr, uint64_t val, int mmu_idx); +- +-uint8_t __ldb_cmmu(target_ulong addr, int mmu_idx); +-void __stb_cmmu(target_ulong addr, uint8_t val, int mmu_idx); +-uint16_t __ldw_cmmu(target_ulong addr, int mmu_idx); +-void __stw_cmmu(target_ulong addr, uint16_t val, int mmu_idx); +-uint32_t __ldl_cmmu(target_ulong addr, int mmu_idx); +-void __stl_cmmu(target_ulong addr, uint32_t val, int mmu_idx); +-uint64_t __ldq_cmmu(target_ulong addr, int mmu_idx); +-void __stq_cmmu(target_ulong addr, uint64_t val, int mmu_idx); +-#else + uint8_t helper_ldb_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); + void helper_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val, + int mmu_idx); +@@ -54,5 +35,3 @@ uint64_t helper_ldq_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); + void helper_stq_cmmu(CPUArchState *env, target_ulong addr, uint64_t val, + int mmu_idx); + #endif +- +-#endif +diff --git a/softmmu_header.h b/softmmu_header.h +index cf1aa38..d8d9c81 100644 +--- a/softmmu_header.h ++++ b/softmmu_header.h +@@ -78,23 +78,10 @@ + #define ADDR_READ addr_read + #endif + +-#ifndef CONFIG_TCG_PASS_AREG0 +-#define ENV_PARAM +-#define ENV_VAR +-#define CPU_PREFIX +-#define HELPER_PREFIX __ +-#else +-#define ENV_PARAM CPUArchState *env, +-#define ENV_VAR env, +-#define CPU_PREFIX cpu_ +-#define HELPER_PREFIX helper_ +-#endif +- + /* generic load/store macros */ + + static inline RES_TYPE +-glue(glue(glue(CPU_PREFIX, ld), USUFFIX), MEMSUFFIX)(ENV_PARAM +- target_ulong ptr) ++glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr) + { + int page_index; + RES_TYPE res; +@@ -106,9 +93,7 @@ glue(glue(glue(CPU_PREFIX, ld), USUFFIX), MEMSUFFIX)(ENV_PARAM + mmu_idx = CPU_MMU_INDEX; + if (unlikely(env->tlb_table[mmu_idx][page_index].ADDR_READ != + (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) { +- res = glue(glue(glue(HELPER_PREFIX, ld), SUFFIX), MMUSUFFIX)(ENV_VAR +- addr, +- mmu_idx); ++ res = glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(env, addr, mmu_idx); + } else { + uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend; + res = glue(glue(ld, USUFFIX), _raw)(hostaddr); +@@ -118,8 +103,7 @@ glue(glue(glue(CPU_PREFIX, ld), USUFFIX), MEMSUFFIX)(ENV_PARAM + + #if DATA_SIZE <= 2 + static inline int +-glue(glue(glue(CPU_PREFIX, lds), SUFFIX), MEMSUFFIX)(ENV_PARAM +- target_ulong ptr) ++glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr) + { + int res, page_index; + target_ulong addr; +@@ -130,8 +114,8 @@ glue(glue(glue(CPU_PREFIX, lds), SUFFIX), MEMSUFFIX)(ENV_PARAM + mmu_idx = CPU_MMU_INDEX; + if (unlikely(env->tlb_table[mmu_idx][page_index].ADDR_READ != + (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) { +- res = (DATA_STYPE)glue(glue(glue(HELPER_PREFIX, ld), SUFFIX), +- MMUSUFFIX)(ENV_VAR addr, mmu_idx); ++ res = (DATA_STYPE)glue(glue(helper_ld, SUFFIX), ++ MMUSUFFIX)(env, addr, mmu_idx); + } else { + uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend; + res = glue(glue(lds, SUFFIX), _raw)(hostaddr); +@@ -145,8 +129,8 @@ glue(glue(glue(CPU_PREFIX, lds), SUFFIX), MEMSUFFIX)(ENV_PARAM + /* generic store macro */ + + static inline void +-glue(glue(glue(CPU_PREFIX, st), SUFFIX), MEMSUFFIX)(ENV_PARAM target_ulong ptr, +- RES_TYPE v) ++glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr, ++ RES_TYPE v) + { + int page_index; + target_ulong addr; +@@ -157,8 +141,7 @@ glue(glue(glue(CPU_PREFIX, st), SUFFIX), MEMSUFFIX)(ENV_PARAM target_ulong ptr, + mmu_idx = CPU_MMU_INDEX; + if (unlikely(env->tlb_table[mmu_idx][page_index].addr_write != + (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) { +- glue(glue(glue(HELPER_PREFIX, st), SUFFIX), MMUSUFFIX)(ENV_VAR addr, v, +- mmu_idx); ++ glue(glue(helper_st, SUFFIX), MMUSUFFIX)(env, addr, v, mmu_idx); + } else { + uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend; + glue(glue(st, SUFFIX), _raw)(hostaddr, v); +@@ -170,52 +153,50 @@ glue(glue(glue(CPU_PREFIX, st), SUFFIX), MEMSUFFIX)(ENV_PARAM target_ulong ptr, + #if ACCESS_TYPE != (NB_MMU_MODES + 1) + + #if DATA_SIZE == 8 +-static inline float64 glue(glue(CPU_PREFIX, ldfq), MEMSUFFIX)(ENV_PARAM +- target_ulong ptr) ++static inline float64 glue(cpu_ldfq, MEMSUFFIX)(CPUArchState *env, ++ target_ulong ptr) + { + union { + float64 d; + uint64_t i; + } u; +- u.i = glue(glue(CPU_PREFIX, ldq), MEMSUFFIX)(ENV_VAR ptr); ++ u.i = glue(cpu_ldq, MEMSUFFIX)(env, ptr); + return u.d; + } + +-static inline void glue(glue(CPU_PREFIX, stfq), MEMSUFFIX)(ENV_PARAM +- target_ulong ptr, +- float64 v) ++static inline void glue(cpu_stfq, MEMSUFFIX)(CPUArchState *env, ++ target_ulong ptr, float64 v) + { + union { + float64 d; + uint64_t i; + } u; + u.d = v; +- glue(glue(CPU_PREFIX, stq), MEMSUFFIX)(ENV_VAR ptr, u.i); ++ glue(cpu_stq, MEMSUFFIX)(env, ptr, u.i); + } + #endif /* DATA_SIZE == 8 */ + + #if DATA_SIZE == 4 +-static inline float32 glue(glue(CPU_PREFIX, ldfl), MEMSUFFIX)(ENV_PARAM +- target_ulong ptr) ++static inline float32 glue(cpu_ldfl, MEMSUFFIX)(CPUArchState *env, ++ target_ulong ptr) + { + union { + float32 f; + uint32_t i; + } u; +- u.i = glue(glue(CPU_PREFIX, ldl), MEMSUFFIX)(ENV_VAR ptr); ++ u.i = glue(cpu_ldl, MEMSUFFIX)(env, ptr); + return u.f; + } + +-static inline void glue(glue(CPU_PREFIX, stfl), MEMSUFFIX)(ENV_PARAM +- target_ulong ptr, +- float32 v) ++static inline void glue(cpu_stfl, MEMSUFFIX)(CPUArchState *env, ++ target_ulong ptr, float32 v) + { + union { + float32 f; + uint32_t i; + } u; + u.f = v; +- glue(glue(CPU_PREFIX, stl), MEMSUFFIX)(ENV_VAR ptr, u.i); ++ glue(cpu_stl, MEMSUFFIX)(env, ptr, u.i); + } + #endif /* DATA_SIZE == 4 */ + +@@ -230,7 +211,3 @@ static inline void glue(glue(CPU_PREFIX, stfl), MEMSUFFIX)(ENV_PARAM + #undef CPU_MMU_INDEX + #undef MMUSUFFIX + #undef ADDR_READ +-#undef ENV_PARAM +-#undef ENV_VAR +-#undef CPU_PREFIX +-#undef HELPER_PREFIX +diff --git a/softmmu_template.h b/softmmu_template.h +index b8bd700..e2490f0 100644 +--- a/softmmu_template.h ++++ b/softmmu_template.h +@@ -54,23 +54,11 @@ + #define ADDR_READ addr_read + #endif + +-#ifndef CONFIG_TCG_PASS_AREG0 +-#define ENV_PARAM +-#define ENV_VAR +-#define CPU_PREFIX +-#define HELPER_PREFIX __ +-#else +-#define ENV_PARAM CPUArchState *env, +-#define ENV_VAR env, +-#define CPU_PREFIX cpu_ +-#define HELPER_PREFIX helper_ +-#endif +- +-static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(ENV_PARAM ++static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, + target_ulong addr, + int mmu_idx, + uintptr_t retaddr); +-static inline DATA_TYPE glue(io_read, SUFFIX)(ENV_PARAM ++static inline DATA_TYPE glue(io_read, SUFFIX)(CPUArchState *env, + target_phys_addr_t physaddr, + target_ulong addr, + uintptr_t retaddr) +@@ -104,9 +92,8 @@ static inline DATA_TYPE glue(io_read, SUFFIX)(ENV_PARAM + + /* handle all cases except unaligned access which span two pages */ + DATA_TYPE +-glue(glue(glue(HELPER_PREFIX, ld), SUFFIX), MMUSUFFIX)(ENV_PARAM +- target_ulong addr, +- int mmu_idx) ++glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr, ++ int mmu_idx) + { + DATA_TYPE res; + int index; +@@ -126,15 +113,15 @@ glue(glue(glue(HELPER_PREFIX, ld), SUFFIX), MMUSUFFIX)(ENV_PARAM + goto do_unaligned_access; + retaddr = GETPC(); + ioaddr = env->iotlb[mmu_idx][index]; +- res = glue(io_read, SUFFIX)(ENV_VAR ioaddr, addr, retaddr); ++ res = glue(io_read, SUFFIX)(env, ioaddr, addr, retaddr); + } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { + /* slow unaligned access (it spans two pages or IO) */ + do_unaligned_access: + retaddr = GETPC(); + #ifdef ALIGNED_ONLY +- do_unaligned_access(ENV_VAR addr, READ_ACCESS_TYPE, mmu_idx, retaddr); ++ do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); + #endif +- res = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(ENV_VAR addr, ++ res = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(env, addr, + mmu_idx, retaddr); + } else { + /* unaligned/aligned access in the same page */ +@@ -142,7 +129,7 @@ glue(glue(glue(HELPER_PREFIX, ld), SUFFIX), MMUSUFFIX)(ENV_PARAM + #ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + retaddr = GETPC(); +- do_unaligned_access(ENV_VAR addr, READ_ACCESS_TYPE, mmu_idx, retaddr); ++ do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); + } + #endif + addend = env->tlb_table[mmu_idx][index].addend; +@@ -154,7 +141,7 @@ glue(glue(glue(HELPER_PREFIX, ld), SUFFIX), MMUSUFFIX)(ENV_PARAM + retaddr = GETPC(); + #ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) +- do_unaligned_access(ENV_VAR addr, READ_ACCESS_TYPE, mmu_idx, retaddr); ++ do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); + #endif + tlb_fill(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); + goto redo; +@@ -164,7 +151,7 @@ glue(glue(glue(HELPER_PREFIX, ld), SUFFIX), MMUSUFFIX)(ENV_PARAM + + /* handle all unaligned cases */ + static DATA_TYPE +-glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(ENV_PARAM ++glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, + target_ulong addr, + int mmu_idx, + uintptr_t retaddr) +@@ -183,15 +170,15 @@ glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(ENV_PARAM + if ((addr & (DATA_SIZE - 1)) != 0) + goto do_unaligned_access; + ioaddr = env->iotlb[mmu_idx][index]; +- res = glue(io_read, SUFFIX)(ENV_VAR ioaddr, addr, retaddr); ++ res = glue(io_read, SUFFIX)(env, ioaddr, addr, retaddr); + } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { + do_unaligned_access: + /* slow unaligned access (it spans two pages) */ + addr1 = addr & ~(DATA_SIZE - 1); + addr2 = addr1 + DATA_SIZE; +- res1 = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(ENV_VAR addr1, ++ res1 = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(env, addr1, + mmu_idx, retaddr); +- res2 = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(ENV_VAR addr2, ++ res2 = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(env, addr2, + mmu_idx, retaddr); + shift = (addr & (DATA_SIZE - 1)) * 8; + #ifdef TARGET_WORDS_BIGENDIAN +@@ -216,13 +203,13 @@ glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(ENV_PARAM + + #ifndef SOFTMMU_CODE_ACCESS + +-static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(ENV_PARAM ++static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, + target_ulong addr, + DATA_TYPE val, + int mmu_idx, + uintptr_t retaddr); + +-static inline void glue(io_write, SUFFIX)(ENV_PARAM ++static inline void glue(io_write, SUFFIX)(CPUArchState *env, + target_phys_addr_t physaddr, + DATA_TYPE val, + target_ulong addr, +@@ -253,10 +240,9 @@ static inline void glue(io_write, SUFFIX)(ENV_PARAM + #endif /* SHIFT > 2 */ + } + +-void glue(glue(glue(HELPER_PREFIX, st), SUFFIX), MMUSUFFIX)(ENV_PARAM +- target_ulong addr, +- DATA_TYPE val, +- int mmu_idx) ++void glue(glue(helper_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, ++ target_ulong addr, DATA_TYPE val, ++ int mmu_idx) + { + target_phys_addr_t ioaddr; + target_ulong tlb_addr; +@@ -273,14 +259,14 @@ void glue(glue(glue(HELPER_PREFIX, st), SUFFIX), MMUSUFFIX)(ENV_PARAM + goto do_unaligned_access; + retaddr = GETPC(); + ioaddr = env->iotlb[mmu_idx][index]; +- glue(io_write, SUFFIX)(ENV_VAR ioaddr, val, addr, retaddr); ++ glue(io_write, SUFFIX)(env, ioaddr, val, addr, retaddr); + } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { + do_unaligned_access: + retaddr = GETPC(); + #ifdef ALIGNED_ONLY +- do_unaligned_access(ENV_VAR addr, 1, mmu_idx, retaddr); ++ do_unaligned_access(env, addr, 1, mmu_idx, retaddr); + #endif +- glue(glue(slow_st, SUFFIX), MMUSUFFIX)(ENV_VAR addr, val, ++ glue(glue(slow_st, SUFFIX), MMUSUFFIX)(env, addr, val, + mmu_idx, retaddr); + } else { + /* aligned/unaligned access in the same page */ +@@ -288,7 +274,7 @@ void glue(glue(glue(HELPER_PREFIX, st), SUFFIX), MMUSUFFIX)(ENV_PARAM + #ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + retaddr = GETPC(); +- do_unaligned_access(ENV_VAR addr, 1, mmu_idx, retaddr); ++ do_unaligned_access(env, addr, 1, mmu_idx, retaddr); + } + #endif + addend = env->tlb_table[mmu_idx][index].addend; +@@ -300,7 +286,7 @@ void glue(glue(glue(HELPER_PREFIX, st), SUFFIX), MMUSUFFIX)(ENV_PARAM + retaddr = GETPC(); + #ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) +- do_unaligned_access(ENV_VAR addr, 1, mmu_idx, retaddr); ++ do_unaligned_access(env, addr, 1, mmu_idx, retaddr); + #endif + tlb_fill(env, addr, 1, mmu_idx, retaddr); + goto redo; +@@ -308,7 +294,7 @@ void glue(glue(glue(HELPER_PREFIX, st), SUFFIX), MMUSUFFIX)(ENV_PARAM + } + + /* handles all unaligned cases */ +-static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(ENV_PARAM ++static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, + target_ulong addr, + DATA_TYPE val, + int mmu_idx, +@@ -327,7 +313,7 @@ static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(ENV_PARAM + if ((addr & (DATA_SIZE - 1)) != 0) + goto do_unaligned_access; + ioaddr = env->iotlb[mmu_idx][index]; +- glue(io_write, SUFFIX)(ENV_VAR ioaddr, val, addr, retaddr); ++ glue(io_write, SUFFIX)(env, ioaddr, val, addr, retaddr); + } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { + do_unaligned_access: + /* XXX: not efficient, but simple */ +@@ -335,11 +321,11 @@ static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(ENV_PARAM + * previous page from the TLB cache. */ + for(i = DATA_SIZE - 1; i >= 0; i--) { + #ifdef TARGET_WORDS_BIGENDIAN +- glue(slow_stb, MMUSUFFIX)(ENV_VAR addr + i, ++ glue(slow_stb, MMUSUFFIX)(env, addr + i, + val >> (((DATA_SIZE - 1) * 8) - (i * 8)), + mmu_idx, retaddr); + #else +- glue(slow_stb, MMUSUFFIX)(ENV_VAR addr + i, ++ glue(slow_stb, MMUSUFFIX)(env, addr + i, + val >> (i * 8), + mmu_idx, retaddr); + #endif +@@ -366,7 +352,3 @@ static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(ENV_PARAM + #undef USUFFIX + #undef DATA_SIZE + #undef ADDR_READ +-#undef ENV_PARAM +-#undef ENV_VAR +-#undef CPU_PREFIX +-#undef HELPER_PREFIX +diff --git a/target-m68k/op_helper.c b/target-m68k/op_helper.c +index 3116287..aa00504 100644 +--- a/target-m68k/op_helper.c ++++ b/target-m68k/op_helper.c +@@ -192,9 +192,6 @@ void HELPER(divu)(CPUM68KState *env, uint32_t word) + quot = num / den; + rem = num % den; + flags = 0; +- /* Avoid using a PARAM1 of zero. This breaks dyngen because it uses +- the address of a symbol, and gcc knows symbols can't have address +- zero. */ + if (word && quot > 0xffff) + flags |= CCF_V; + if (quot == 0) +diff --git a/target-sparc/Makefile.objs b/target-sparc/Makefile.objs +index a93e07d..9fc42ea 100644 +--- a/target-sparc/Makefile.objs ++++ b/target-sparc/Makefile.objs +@@ -4,5 +4,3 @@ obj-y += fop_helper.o cc_helper.o win_helper.o mmu_helper.o ldst_helper.o + obj-$(TARGET_SPARC) += int32_helper.o + obj-$(TARGET_SPARC64) += int64_helper.o + obj-$(TARGET_SPARC64) += vis_helper.o +- +-$(obj)/op_helper.o: QEMU_CFLAGS += $(HELPER_CFLAGS) +diff --git a/tcg/arm/tcg-target.c b/tcg/arm/tcg-target.c +index cf0ca3d..aed3b53 100644 +--- a/tcg/arm/tcg-target.c ++++ b/tcg/arm/tcg-target.c +@@ -176,7 +176,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + so don't use these. */ + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R0); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R1); +-#if defined(CONFIG_TCG_PASS_AREG0) && (TARGET_LONG_BITS == 64) ++#if TARGET_LONG_BITS == 64 + /* If we're passing env to the helper as r0 and need a regpair + * for the address then r2 will be overwritten as we're setting + * up the args to the helper. +@@ -204,8 +204,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + use these. */ + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R0); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R1); +-#if defined(CONFIG_SOFTMMU) && \ +- defined(CONFIG_TCG_PASS_AREG0) && (TARGET_LONG_BITS == 64) ++#if defined(CONFIG_SOFTMMU) && (TARGET_LONG_BITS == 64) + /* Avoid clashes with registers being used for helper args */ + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R2); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R3); +@@ -223,7 +222,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + #ifdef CONFIG_SOFTMMU + /* r2 is still needed to load data_reg, so don't use it. */ + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R2); +-#if defined(CONFIG_TCG_PASS_AREG0) && (TARGET_LONG_BITS == 64) ++#if TARGET_LONG_BITS == 64 + /* Avoid clashes with registers being used for helper args */ + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R3); + #endif +@@ -954,7 +953,6 @@ static inline void tcg_out_goto_label(TCGContext *s, int cond, int label_index) + + #include "../../softmmu_defs.h" + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void * const qemu_ld_helpers[4] = { +@@ -972,25 +970,6 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +- +-/* legacy helper signature: __st_mmu(target_ulong addr, uintxx_t val, +- int mmu_idx) */ +-static void *qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + + /* Helper routines for marshalling helper function arguments into + * the correct registers and stack. +@@ -1203,9 +1182,7 @@ static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + * trash by moving the earlier arguments into them. + */ + argreg = TCG_REG_R0; +-#ifdef CONFIG_TCG_PASS_AREG0 + argreg = tcg_out_arg_reg32(s, argreg, TCG_AREG0); +-#endif + #if TARGET_LONG_BITS == 64 + argreg = tcg_out_arg_reg64(s, argreg, addr_reg, addr_reg2); + #else +@@ -1421,9 +1398,7 @@ static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) + * trash by moving the earlier arguments into them. + */ + argreg = TCG_REG_R0; +-#ifdef CONFIG_TCG_PASS_AREG0 + argreg = tcg_out_arg_reg32(s, argreg, TCG_AREG0); +-#endif + #if TARGET_LONG_BITS == 64 + argreg = tcg_out_arg_reg64(s, argreg, addr_reg, addr_reg2); + #else +diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h +index f90b834..c0b8f72 100644 +--- a/tcg/arm/tcg-target.h ++++ b/tcg/arm/tcg-target.h +@@ -77,7 +77,6 @@ typedef enum { + #define TCG_TARGET_HAS_GUEST_BASE + + enum { +- /* Note: must be synced with dyngen-exec.h */ + TCG_AREG0 = TCG_REG_R6, + }; + +diff --git a/tcg/hppa/tcg-target.c b/tcg/hppa/tcg-target.c +index 2885212..8b81b70 100644 +--- a/tcg/hppa/tcg-target.c ++++ b/tcg/hppa/tcg-target.c +@@ -882,7 +882,6 @@ static void tcg_out_setcond2(TCGContext *s, int cond, TCGArg ret, + #if defined(CONFIG_SOFTMMU) + #include "../../softmmu_defs.h" + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void * const qemu_ld_helpers[4] = { +@@ -900,25 +899,6 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +- +-/* legacy helper signature: __st_mmu(target_ulong addr, uintxx_t val, +- int mmu_idx) */ +-static void *qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + + /* Load and compare a TLB entry, and branch if TLB miss. OFFSET is set to + the offset of the first ADDR_READ or ADDR_WRITE member of the appropriate +@@ -1085,7 +1065,6 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + } + tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[2], + tcg_target_call_iarg_regs[1]); +@@ -1093,7 +1072,6 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + tcg_target_call_iarg_regs[0]); + tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], + TCG_AREG0); +-#endif + tcg_out_call(s, qemu_ld_helpers[opc & 3]); + + switch (opc) { +@@ -1245,7 +1223,6 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) + tcg_abort(); + } + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3], + tcg_target_call_iarg_regs[2]); +@@ -1255,7 +1232,6 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) + tcg_target_call_iarg_regs[0]); + tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], + TCG_AREG0); +-#endif + tcg_out_call(s, qemu_st_helpers[opc]); + + /* label2: */ +diff --git a/tcg/hppa/tcg-target.h b/tcg/hppa/tcg-target.h +index d4bf6fe..01ef960 100644 +--- a/tcg/hppa/tcg-target.h ++++ b/tcg/hppa/tcg-target.h +@@ -104,7 +104,6 @@ typedef enum { + + #define TCG_TARGET_HAS_GUEST_BASE + +-/* Note: must be synced with dyngen-exec.h */ + #define TCG_AREG0 TCG_REG_R17 + + +diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c +index da17bba..34c2df8 100644 +--- a/tcg/i386/tcg-target.c ++++ b/tcg/i386/tcg-target.c +@@ -183,9 +183,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_set32(ct->u.regs, 0, 0xffff); + tcg_regset_reset_reg(ct->u.regs, tcg_target_call_iarg_regs[0]); + tcg_regset_reset_reg(ct->u.regs, tcg_target_call_iarg_regs[1]); +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_regset_reset_reg(ct->u.regs, tcg_target_call_iarg_regs[2]); +-#endif + } else { + tcg_regset_set32(ct->u.regs, 0, 0xff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_EAX); +@@ -965,7 +963,6 @@ static void tcg_out_jmp(TCGContext *s, tcg_target_long dest) + + #include "../../softmmu_defs.h" + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void *qemu_ld_helpers[4] = { +@@ -983,25 +980,6 @@ static const void *qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +- +-/* legacy helper signature: __st_mmu(target_ulong addr, uintxx_t val, +- int mmu_idx) */ +-static void *qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + + /* Perform the TLB load and compare. + +@@ -1220,16 +1198,13 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + } + tcg_out_push(s, args[addrlo_idx]); + stack_adjust += 4; +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_push(s, TCG_AREG0); + stack_adjust += 4; +-#endif + #else + /* The first argument is already loaded with addrlo. */ + arg_idx = 1; + tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[arg_idx], + mem_index); +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[3], + tcg_target_call_iarg_regs[2]); +@@ -1240,7 +1215,6 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[0], + TCG_AREG0); + #endif +-#endif + + tcg_out_calli(s, (tcg_target_long)qemu_ld_helpers[s_bits]); + +@@ -1436,16 +1410,13 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + } + tcg_out_push(s, args[addrlo_idx]); + stack_adjust += 4; +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_push(s, TCG_AREG0); + stack_adjust += 4; +-#endif + #else + tcg_out_mov(s, (opc == 3 ? TCG_TYPE_I64 : TCG_TYPE_I32), + tcg_target_call_iarg_regs[1], data_reg); + tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[2], mem_index); + stack_adjust = 0; +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[3], + tcg_target_call_iarg_regs[2]); +@@ -1456,7 +1427,6 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[0], + TCG_AREG0); + #endif +-#endif + + tcg_out_calli(s, (tcg_target_long)qemu_st_helpers[s_bits]); + +diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h +index c3cfe05..8be42f3 100644 +--- a/tcg/i386/tcg-target.h ++++ b/tcg/i386/tcg-target.h +@@ -116,7 +116,6 @@ typedef enum { + + #define TCG_TARGET_HAS_GUEST_BASE + +-/* Note: must be synced with dyngen-exec.h */ + #if TCG_TARGET_REG_BITS == 64 + # define TCG_AREG0 TCG_REG_R14 + #else +diff --git a/tcg/ia64/tcg-target.c b/tcg/ia64/tcg-target.c +index dc588db..1745038 100644 +--- a/tcg/ia64/tcg-target.c ++++ b/tcg/ia64/tcg-target.c +@@ -1452,7 +1452,6 @@ static inline void tcg_out_qemu_tlb(TCGContext *s, TCGArg addr_reg, + TCG_REG_P7, TCG_REG_R3, TCG_REG_R57)); + } + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void * const qemu_ld_helpers[4] = { +@@ -1461,16 +1460,6 @@ static const void * const qemu_ld_helpers[4] = { + helper_ldl_mmu, + helper_ldq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +-#endif + + static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + { +@@ -1530,7 +1519,6 @@ static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + tcg_opc_m1 (TCG_REG_P7, OPC_LD8_M1, TCG_REG_R1, TCG_REG_R2), + tcg_opc_i18(TCG_REG_P0, OPC_NOP_I18, 0)); + } +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_bundle(s, mII, + tcg_opc_a5 (TCG_REG_P7, OPC_ADDL_A5, TCG_REG_R58, +@@ -1539,7 +1527,6 @@ static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + TCG_REG_R57, 0, TCG_REG_R56), + tcg_opc_a4 (TCG_REG_P7, OPC_ADDS_A4, + TCG_REG_R56, 0, TCG_AREG0)); +-#endif + if (!bswap || s_bits == 0) { + tcg_out_bundle(s, miB, + tcg_opc_m48(TCG_REG_P0, OPC_NOP_M48, 0), +@@ -1570,7 +1557,6 @@ static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + } + } + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_st_mmu(CPUState *env, target_ulong addr, + uintxx_t val, int mmu_idx) */ + static const void * const qemu_st_helpers[4] = { +@@ -1579,16 +1565,6 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __st_mmu(target_ulong addr, uintxx_t val, +- int mmu_idx) */ +-static void *qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + + static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) + { +@@ -1658,7 +1634,6 @@ static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) + data_reg = TCG_REG_R2; + } + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_bundle(s, mII, + tcg_opc_a5 (TCG_REG_P7, OPC_ADDL_A5, TCG_REG_R59, +@@ -1674,15 +1649,6 @@ static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) + TCG_REG_R56, 0, TCG_AREG0), + tcg_opc_b5 (TCG_REG_P7, OPC_BR_CALL_SPTK_MANY_B5, + TCG_REG_B0, TCG_REG_B6)); +-#else +- tcg_out_bundle(s, miB, +- tcg_opc_m4 (TCG_REG_P6, opc_st_m4[opc], +- data_reg, TCG_REG_R3), +- tcg_opc_a5 (TCG_REG_P7, OPC_ADDL_A5, TCG_REG_R58, +- mem_index, TCG_REG_R0), +- tcg_opc_b5 (TCG_REG_P7, OPC_BR_CALL_SPTK_MANY_B5, +- TCG_REG_B0, TCG_REG_B6)); +-#endif + } + + #else /* !CONFIG_SOFTMMU */ +diff --git a/tcg/ia64/tcg-target.h b/tcg/ia64/tcg-target.h +index 0631b9f..c22962a 100644 +--- a/tcg/ia64/tcg-target.h ++++ b/tcg/ia64/tcg-target.h +@@ -140,7 +140,6 @@ typedef enum { + #define TCG_TARGET_HAS_not_i32 0 /* xor r1, -1, r3 */ + #define TCG_TARGET_HAS_not_i64 0 /* xor r1, -1, r3 */ + +-/* Note: must be synced with dyngen-exec.h */ + #define TCG_AREG0 TCG_REG_R7 + + /* Guest base is supported */ +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index 1006e28..74db83d 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -217,7 +217,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_set(ct->u.regs, 0xffffffff); + #if defined(CONFIG_SOFTMMU) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A0); +-# if defined(CONFIG_TCG_PASS_AREG0) && (TARGET_LONG_BITS == 64) ++# if (TARGET_LONG_BITS == 64) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A2); + # endif + #endif +@@ -227,12 +227,11 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_set(ct->u.regs, 0xffffffff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A0); + #if defined(CONFIG_SOFTMMU) +-# if (defined(CONFIG_TCG_PASS_AREG0) && TARGET_LONG_BITS == 32) || \ +- (!defined(CONFIG_TCG_PASS_AREG0) && TARGET_LONG_BITS == 64) ++# if (TARGET_LONG_BITS == 32) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A1); + # endif + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A2); +-# if defined(CONFIG_TCG_PASS_AREG0) && TARGET_LONG_BITS == 64 ++# if TARGET_LONG_BITS == 64 + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A3); + # endif + #endif +@@ -821,7 +820,6 @@ static void tcg_out_setcond2(TCGContext *s, TCGCond cond, int ret, + + #include "../../softmmu_defs.h" + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void * const qemu_ld_helpers[4] = { +@@ -839,25 +837,6 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +- +-/* legacy helper signature: __st_mmu(target_ulong addr, uintxx_t val, +- int mmu_idx) */ +-static void *qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + #endif + + static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, +@@ -942,9 +921,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + + /* slow path */ + arg_num = 0; +-# ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_call_iarg_reg32(s, &arg_num, TCG_AREG0); +-# endif + # if TARGET_LONG_BITS == 64 + tcg_out_call_iarg_reg64(s, &arg_num, addr_regl, addr_regh); + # else +@@ -1127,9 +1104,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + + /* slow path */ + arg_num = 0; +-# ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_call_iarg_reg32(s, &arg_num, TCG_AREG0); +-# endif + # if TARGET_LONG_BITS == 64 + tcg_out_call_iarg_reg64(s, &arg_num, addr_regl, addr_regh); + # else +diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h +index d3c804d..1c61931 100644 +--- a/tcg/mips/tcg-target.h ++++ b/tcg/mips/tcg-target.h +@@ -96,7 +96,6 @@ typedef enum { + #define TCG_TARGET_HAS_ext8u_i32 0 /* andi rt, rs, 0xff */ + #define TCG_TARGET_HAS_ext16u_i32 0 /* andi rt, rs, 0xffff */ + +-/* Note: must be synced with dyngen-exec.h */ + #define TCG_AREG0 TCG_REG_S0 + + /* guest base is supported */ +diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c +index 0cff181..26c4b33 100644 +--- a/tcg/ppc/tcg-target.c ++++ b/tcg/ppc/tcg-target.c +@@ -248,7 +248,6 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_set32(ct->u.regs, 0, 0xffffffff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R3); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R4); +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5); + #if TARGET_LONG_BITS == 64 + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6); +@@ -256,11 +255,6 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R7); + #endif + #endif +-#else /* !AREG0 */ +-#if TARGET_LONG_BITS == 64 +- tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5); +-#endif +-#endif + break; + case 'K': /* qemu_st[8..32] constraint */ + ct->ct |= TCG_CT_REG; +@@ -268,7 +262,6 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R3); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R4); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5); +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6); + #if TARGET_LONG_BITS == 64 + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R7); +@@ -276,11 +269,6 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R8); + #endif + #endif +-#else /* !AREG0 */ +-#if TARGET_LONG_BITS == 64 +- tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6); +-#endif +-#endif + break; + case 'M': /* qemu_st64 constraint */ + ct->ct |= TCG_CT_REG; +@@ -290,12 +278,10 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R7); +-#if defined(CONFIG_TCG_PASS_AREG0) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R8); + #ifdef TCG_TARGET_CALL_ALIGN_ARGS + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R9); + #endif +-#endif + break; + #else + case 'L': +@@ -541,7 +527,6 @@ static void tcg_out_call (TCGContext *s, tcg_target_long arg, int const_arg) + + #include "../../softmmu_defs.h" + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void * const qemu_ld_helpers[4] = { +@@ -559,25 +544,6 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +- +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + #endif + + static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) +@@ -647,9 +613,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) + + /* slow path */ + ir = 3; +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_mov (s, TCG_TYPE_I32, ir++, TCG_AREG0); +-#endif + #if TARGET_LONG_BITS == 32 + tcg_out_mov (s, TCG_TYPE_I32, ir++, addr_reg); + #else +@@ -849,9 +813,7 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) + + /* slow path */ + ir = 3; +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_mov (s, TCG_TYPE_I32, ir++, TCG_AREG0); +-#endif + #if TARGET_LONG_BITS == 32 + tcg_out_mov (s, TCG_TYPE_I32, ir++, addr_reg); + #else +diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c +index 27a0ae8..337cd41 100644 +--- a/tcg/ppc64/tcg-target.c ++++ b/tcg/ppc64/tcg-target.c +@@ -235,10 +235,8 @@ static int target_parse_constraint (TCGArgConstraint *ct, const char **pct_str) + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R3); + #ifdef CONFIG_SOFTMMU + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R4); +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R5); + #endif +-#endif + break; + case 'S': /* qemu_st constraint */ + ct->ct |= TCG_CT_REG; +@@ -247,10 +245,8 @@ static int target_parse_constraint (TCGArgConstraint *ct, const char **pct_str) + #ifdef CONFIG_SOFTMMU + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R4); + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R5); +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R6); + #endif +-#endif + break; + case 'Z': + ct->ct |= TCG_CT_CONST_U32; +@@ -558,7 +554,6 @@ static void tcg_out_ldsta (TCGContext *s, int ret, int addr, + + #include "../../softmmu_defs.h" + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void * const qemu_ld_helpers[4] = { +@@ -576,25 +571,6 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +- +-/* legacy helper signature: __st_mmu(target_ulong addr, uintxx_t val, +- int mmu_idx) */ +-static void *qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + + static void tcg_out_tlb_read (TCGContext *s, int r0, int r1, int r2, + int addr_reg, int s_bits, int offset) +@@ -676,9 +652,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) + + /* slow path */ + ir = 3; +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_mov (s, TCG_TYPE_I64, ir++, TCG_AREG0); +-#endif + tcg_out_mov (s, TCG_TYPE_I64, ir++, addr_reg); + tcg_out_movi (s, TCG_TYPE_I64, ir++, mem_index); + +@@ -827,9 +801,7 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) + + /* slow path */ + ir = 3; +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_mov (s, TCG_TYPE_I64, ir++, TCG_AREG0); +-#endif + tcg_out_mov (s, TCG_TYPE_I64, ir++, addr_reg); + tcg_out_rld (s, RLDICL, ir++, data_reg, 0, 64 - (1 << (3 + opc))); + tcg_out_movi (s, TCG_TYPE_I64, ir++, mem_index); +diff --git a/tcg/s390/tcg-target.c b/tcg/s390/tcg-target.c +index 99b5339..aac11d9 100644 +--- a/tcg/s390/tcg-target.c ++++ b/tcg/s390/tcg-target.c +@@ -301,7 +301,6 @@ static const uint8_t tcg_cond_to_ltr_cond[10] = { + + #include "../../softmmu_defs.h" + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void * const qemu_ld_helpers[4] = { +@@ -319,25 +318,6 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static void *qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +- +-/* legacy helper signature: __st_mmu(target_ulong addr, uintxx_t val, +- int mmu_idx) */ +-static void *qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + #endif + + static uint8_t *tb_ret_addr; +@@ -1507,7 +1487,6 @@ static void tcg_prepare_qemu_ldst(TCGContext* s, TCGReg data_reg, + tcg_abort(); + } + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R4, mem_index); +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[3], + tcg_target_call_iarg_regs[2]); +@@ -1517,11 +1496,9 @@ static void tcg_prepare_qemu_ldst(TCGContext* s, TCGReg data_reg, + tcg_target_call_iarg_regs[0]); + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[0], + TCG_AREG0); +-#endif + tgen_calli(s, (tcg_target_ulong)qemu_st_helpers[s_bits]); + } else { + tcg_out_movi(s, TCG_TYPE_I32, arg1, mem_index); +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[2], + tcg_target_call_iarg_regs[1]); +@@ -1529,7 +1506,6 @@ static void tcg_prepare_qemu_ldst(TCGContext* s, TCGReg data_reg, + tcg_target_call_iarg_regs[0]); + tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[0], + TCG_AREG0); +-#endif + tgen_calli(s, (tcg_target_ulong)qemu_ld_helpers[s_bits]); + + /* sign extension */ +diff --git a/tcg/s390/tcg-target.h b/tcg/s390/tcg-target.h +index d12f90b..4f7dfab 100644 +--- a/tcg/s390/tcg-target.h ++++ b/tcg/s390/tcg-target.h +@@ -96,7 +96,6 @@ typedef enum TCGReg { + #define TCG_TARGET_EXTEND_ARGS 1 + + enum { +- /* Note: must be synced with dyngen-exec.h */ + TCG_AREG0 = TCG_REG_R10, + }; + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index 247a278..baed3b4 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -59,11 +59,7 @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + }; + #endif + +-#ifdef CONFIG_TCG_PASS_AREG0 + #define ARG_OFFSET 1 +-#else +-#define ARG_OFFSET 0 +-#endif + + static const int tcg_target_reg_alloc_order[] = { + TCG_REG_L0, +@@ -161,9 +157,7 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O0); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O1); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O2); +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O3); +-#endif + break; + case 'I': + ct->ct |= TCG_CT_CONST_S11; +@@ -715,7 +709,6 @@ static void tcg_target_qemu_prologue(TCGContext *s) + + #include "../../softmmu_defs.h" + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + int mmu_idx) */ + static const void * const qemu_ld_helpers[4] = { +@@ -733,25 +726,6 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#else +-/* legacy helper signature: __ld_mmu(target_ulong addr, int +- mmu_idx) */ +-static const void * const qemu_ld_helpers[4] = { +- __ldb_mmu, +- __ldw_mmu, +- __ldl_mmu, +- __ldq_mmu, +-}; +- +-/* legacy helper signature: __st_mmu(target_ulong addr, uintxx_t val, +- int mmu_idx) */ +-static const void * const qemu_st_helpers[4] = { +- __stb_mmu, +- __stw_mmu, +- __stl_mmu, +- __stq_mmu, +-}; +-#endif + #endif + + #if TARGET_LONG_BITS == 32 +@@ -834,7 +808,6 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + + /* mov */ + tcg_out_movi(s, TCG_TYPE_I32, arg1, mem_index); +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3], + tcg_target_call_iarg_regs[2]); +@@ -844,7 +817,6 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + tcg_target_call_iarg_regs[0]); + tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], + TCG_AREG0); +-#endif + + /* XXX: move that code at the end of the TB */ + /* qemu_ld_helper[s_bits](arg0, arg1) */ +@@ -1061,7 +1033,6 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + /* mov */ + tcg_out_movi(s, TCG_TYPE_I32, arg2, mem_index); + +-#ifdef CONFIG_TCG_PASS_AREG0 + /* XXX/FIXME: suboptimal */ + tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3], + tcg_target_call_iarg_regs[2]); +@@ -1071,7 +1042,6 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + tcg_target_call_iarg_regs[0]); + tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], + TCG_AREG0); +-#endif + /* XXX: move that code at the end of the TB */ + /* qemu_st_helper[s_bits](arg0, arg1, arg2) */ + tcg_out32(s, CALL | ((((tcg_target_ulong)qemu_st_helpers[s_bits] +diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h +index ee2274d..0ea87be 100644 +--- a/tcg/sparc/tcg-target.h ++++ b/tcg/sparc/tcg-target.h +@@ -125,7 +125,6 @@ typedef enum { + #define TCG_TARGET_HAS_deposit_i64 0 + #endif + +-/* Note: must be synced with dyngen-exec.h */ + #ifdef CONFIG_SOLARIS + #define TCG_AREG0 TCG_REG_G2 + #elif defined(__sparc_v9__) +diff --git a/tcg/tci/tcg-target.c b/tcg/tci/tcg-target.c +index ef8580f..003244c 100644 +--- a/tcg/tci/tcg-target.c ++++ b/tcg/tci/tcg-target.c +@@ -798,9 +798,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + case INDEX_op_qemu_st8: + case INDEX_op_qemu_st16: + case INDEX_op_qemu_st32: +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_r(s, TCG_AREG0); +-#endif + tcg_out_r(s, *args++); + tcg_out_r(s, *args++); + #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS +@@ -811,9 +809,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + #endif + break; + case INDEX_op_qemu_st64: +-#ifdef CONFIG_TCG_PASS_AREG0 + tcg_out_r(s, TCG_AREG0); +-#endif + tcg_out_r(s, *args++); + #if TCG_TARGET_REG_BITS == 32 + tcg_out_r(s, *args++); +diff --git a/tci.c b/tci.c +index c79350d..ce8a988 100644 +--- a/tci.c ++++ b/tci.c +@@ -25,7 +25,6 @@ + #endif + + #include "qemu-common.h" +-#include "dyngen-exec.h" /* env */ + #include "exec-all.h" /* MAX_OPC_PARAM_IARGS */ + #include "tcg-op.h" + +@@ -63,17 +62,6 @@ uintptr_t tci_tb_ptr; + + static tcg_target_ulong tci_reg[TCG_TARGET_NB_REGS]; + +-#if !defined(CONFIG_TCG_PASS_AREG0) +-# define helper_ldb_mmu(env, addr, mmu_idx) __ldb_mmu(addr, mmu_idx) +-# define helper_ldw_mmu(env, addr, mmu_idx) __ldw_mmu(addr, mmu_idx) +-# define helper_ldl_mmu(env, addr, mmu_idx) __ldl_mmu(addr, mmu_idx) +-# define helper_ldq_mmu(env, addr, mmu_idx) __ldq_mmu(addr, mmu_idx) +-# define helper_stb_mmu(env, addr, val, mmu_idx) __stb_mmu(addr, val, mmu_idx) +-# define helper_stw_mmu(env, addr, val, mmu_idx) __stw_mmu(addr, val, mmu_idx) +-# define helper_stl_mmu(env, addr, val, mmu_idx) __stl_mmu(addr, val, mmu_idx) +-# define helper_stq_mmu(env, addr, val, mmu_idx) __stq_mmu(addr, val, mmu_idx) +-#endif /* !CONFIG_TCG_PASS_AREG0 */ +- + static tcg_target_ulong tci_read_reg(TCGReg index) + { + assert(index < ARRAY_SIZE(tci_reg)); +diff --git a/user-exec.c b/user-exec.c +index b9ea9dd..ef9b172 100644 +--- a/user-exec.c ++++ b/user-exec.c +@@ -18,9 +18,6 @@ + */ + #include "config.h" + #include "cpu.h" +-#ifndef CONFIG_TCG_PASS_AREG0 +-#include "dyngen-exec.h" +-#endif + #include "disas.h" + #include "tcg.h" + +@@ -60,12 +57,6 @@ void cpu_resume_from_signal(CPUArchState *env1, void *puc) + struct sigcontext *uc = puc; + #endif + +-#ifndef CONFIG_TCG_PASS_AREG0 +- env = env1; +- +- /* XXX: restore cpu registers saved in host registers */ +-#endif +- + if (puc) { + /* XXX: use siglongjmp ? */ + #ifdef __linux__ +@@ -93,11 +84,6 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address, + TranslationBlock *tb; + int ret; + +-#ifndef CONFIG_TCG_PASS_AREG0 +- if (cpu_single_env) { +- env = cpu_single_env; /* XXX: find a correct solution for multithread */ +- } +-#endif + #if defined(DEBUG_SIGNAL) + qemu_printf("qemu: SIGSEGV pc=0x%08lx address=%08lx w=%d oldset=0x%08lx\n", + pc, address, is_write, *(unsigned long *)old_set); +-- +1.7.12.1 + diff --git a/0040-tcg-i386-allow-constants-in-load-store-ops.patch b/0040-tcg-i386-allow-constants-in-load-store-ops.patch new file mode 100644 index 0000000..0c9066c --- /dev/null +++ b/0040-tcg-i386-allow-constants-in-load-store-ops.patch @@ -0,0 +1,114 @@ +From 83b25655bcd988054a2bb2a0a38dc662d4901b08 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Mon, 10 Sep 2012 13:56:24 +0200 +Subject: [PATCH] tcg/i386: allow constants in load/store ops + +On x86, it is possible to move a constant value to memory. Add code to +handle a constant argument to load/store ops. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/i386/tcg-target.c | 50 +++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 37 insertions(+), 13 deletions(-) + +diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c +index 34c2df8..3017858 100644 +--- a/tcg/i386/tcg-target.c ++++ b/tcg/i386/tcg-target.c +@@ -263,6 +263,7 @@ static inline int tcg_target_const_match(tcg_target_long val, + #define OPC_MOVB_EvGv (0x88) /* stores, more or less */ + #define OPC_MOVL_EvGv (0x89) /* stores, more or less */ + #define OPC_MOVL_GvEv (0x8b) /* loads, more or less */ ++#define OPC_MOVB_EvIz (0xc6) + #define OPC_MOVL_EvIz (0xc7) + #define OPC_MOVL_Iv (0xb8) + #define OPC_MOVSBL (0xbe | P_EXT) +@@ -1543,18 +1544,35 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + break; + + OP_32_64(st8): +- tcg_out_modrm_offset(s, OPC_MOVB_EvGv | P_REXB_R, +- args[0], args[1], args[2]); ++ if (const_args[0]) { ++ tcg_out_modrm_offset(s, OPC_MOVB_EvIz, ++ 0, args[1], args[2]); ++ tcg_out8(s, args[0]); ++ } else { ++ tcg_out_modrm_offset(s, OPC_MOVB_EvGv | P_REXB_R, ++ args[0], args[1], args[2]); ++ } + break; + OP_32_64(st16): +- tcg_out_modrm_offset(s, OPC_MOVL_EvGv | P_DATA16, +- args[0], args[1], args[2]); ++ if (const_args[0]) { ++ tcg_out_modrm_offset(s, OPC_MOVL_EvIz | P_DATA16, ++ 0, args[1], args[2]); ++ tcg_out16(s, args[0]); ++ } else { ++ tcg_out_modrm_offset(s, OPC_MOVL_EvGv | P_DATA16, ++ args[0], args[1], args[2]); ++ } + break; + #if TCG_TARGET_REG_BITS == 64 + case INDEX_op_st32_i64: + #endif + case INDEX_op_st_i32: +- tcg_out_st(s, TCG_TYPE_I32, args[0], args[1], args[2]); ++ if (const_args[0]) { ++ tcg_out_modrm_offset(s, OPC_MOVL_EvIz, 0, args[1], args[2]); ++ tcg_out32(s, args[0]); ++ } else { ++ tcg_out_st(s, TCG_TYPE_I32, args[0], args[1], args[2]); ++ } + break; + + OP_32_64(add): +@@ -1758,7 +1776,13 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + tcg_out_ld(s, TCG_TYPE_I64, args[0], args[1], args[2]); + break; + case INDEX_op_st_i64: +- tcg_out_st(s, TCG_TYPE_I64, args[0], args[1], args[2]); ++ if (const_args[0]) { ++ tcg_out_modrm_offset(s, OPC_MOVL_EvIz | P_REXW, ++ 0, args[1], args[2]); ++ tcg_out32(s, args[0]); ++ } else { ++ tcg_out_st(s, TCG_TYPE_I64, args[0], args[1], args[2]); ++ } + break; + case INDEX_op_qemu_ld32s: + tcg_out_qemu_ld(s, args, 2 | 4); +@@ -1820,9 +1844,9 @@ static const TCGTargetOpDef x86_op_defs[] = { + { INDEX_op_ld16u_i32, { "r", "r" } }, + { INDEX_op_ld16s_i32, { "r", "r" } }, + { INDEX_op_ld_i32, { "r", "r" } }, +- { INDEX_op_st8_i32, { "q", "r" } }, +- { INDEX_op_st16_i32, { "r", "r" } }, +- { INDEX_op_st_i32, { "r", "r" } }, ++ { INDEX_op_st8_i32, { "qi", "r" } }, ++ { INDEX_op_st16_i32, { "ri", "r" } }, ++ { INDEX_op_st_i32, { "ri", "r" } }, + + { INDEX_op_add_i32, { "r", "r", "ri" } }, + { INDEX_op_sub_i32, { "r", "0", "ri" } }, +@@ -1873,10 +1897,10 @@ static const TCGTargetOpDef x86_op_defs[] = { + { INDEX_op_ld32u_i64, { "r", "r" } }, + { INDEX_op_ld32s_i64, { "r", "r" } }, + { INDEX_op_ld_i64, { "r", "r" } }, +- { INDEX_op_st8_i64, { "r", "r" } }, +- { INDEX_op_st16_i64, { "r", "r" } }, +- { INDEX_op_st32_i64, { "r", "r" } }, +- { INDEX_op_st_i64, { "r", "r" } }, ++ { INDEX_op_st8_i64, { "ri", "r" } }, ++ { INDEX_op_st16_i64, { "ri", "r" } }, ++ { INDEX_op_st32_i64, { "ri", "r" } }, ++ { INDEX_op_st_i64, { "re", "r" } }, + + { INDEX_op_add_i64, { "r", "0", "re" } }, + { INDEX_op_mul_i64, { "r", "0", "re" } }, +-- +1.7.12.1 + diff --git a/0041-tcg-mark-set_label-with-TCG_OPF_BB_END-flag.patch b/0041-tcg-mark-set_label-with-TCG_OPF_BB_END-flag.patch new file mode 100644 index 0000000..bfab53b --- /dev/null +++ b/0041-tcg-mark-set_label-with-TCG_OPF_BB_END-flag.patch @@ -0,0 +1,53 @@ +From 1610a0e56c0be3e4bfd3034e5323188b1d05badd Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Mon, 10 Sep 2012 14:23:49 +0200 +Subject: [PATCH] tcg: mark set_label with TCG_OPF_BB_END flag + +set_label is effectively the end of a basic block, as no optimization +can be made accross it. It was treated as such in the liveness analysis +code, but as a special case. + +Mark it with TCG_OPF_BB_END flag so that this information can be used +by other parts of the TCG code, and remove the special case in the liveness +analysis code. + +Cc: Blue Swirl +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/tcg-opc.h | 2 +- + tcg/tcg.c | 5 ----- + 2 files changed, 1 insertion(+), 6 deletions(-) + +diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h +index 8e06d03..d12e8d0 100644 +--- a/tcg/tcg-opc.h ++++ b/tcg/tcg-opc.h +@@ -36,7 +36,7 @@ DEF(nopn, 0, 0, 1, 0) /* variable number of parameters */ + + DEF(discard, 1, 0, 0, 0) + +-DEF(set_label, 0, 0, 1, 0) ++DEF(set_label, 0, 0, 1, TCG_OPF_BB_END) + DEF(call, 0, 1, 2, TCG_OPF_SIDE_EFFECTS) /* variable number of parameters */ + DEF(jmp, 0, 1, 0, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS) + DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS) +diff --git a/tcg/tcg.c b/tcg/tcg.c +index 8386b70..c002a88 100644 +--- a/tcg/tcg.c ++++ b/tcg/tcg.c +@@ -1297,11 +1297,6 @@ static void tcg_liveness_analysis(TCGContext *s) + args--; + } + break; +- case INDEX_op_set_label: +- args--; +- /* mark end of basic block */ +- tcg_la_bb_end(s, dead_temps); +- break; + case INDEX_op_debug_insn_start: + args -= def->nb_args; + break; +-- +1.7.12.1 + diff --git a/0042-revert-TCG-fix-copy-propagation.patch b/0042-revert-TCG-fix-copy-propagation.patch new file mode 100644 index 0000000..9e0a169 --- /dev/null +++ b/0042-revert-TCG-fix-copy-propagation.patch @@ -0,0 +1,85 @@ +From 2b8d0049e88c17749ccb978509d3f8fda180d35f Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Mon, 10 Sep 2012 13:14:12 +0200 +Subject: [PATCH] revert "TCG: fix copy propagation" + +Given the copy propagation breakage on 32-bit hosts has been fixed +commit e31b0a7c050711884ad570fe73df806520953618 can be reverted. + +Cc: Blue Swirl +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 15 ++++++--------- + tcg/tcg.h | 5 ----- + 2 files changed, 6 insertions(+), 14 deletions(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index fba0ed9..10d9773 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -107,15 +107,12 @@ static TCGOpcode op_to_movi(TCGOpcode op) + } + } + +-static void tcg_opt_gen_mov(TCGContext *s, TCGArg *gen_args, TCGArg dst, +- TCGArg src, int nb_temps, int nb_globals) ++static void tcg_opt_gen_mov(TCGArg *gen_args, TCGArg dst, TCGArg src, ++ int nb_temps, int nb_globals) + { + reset_temp(dst, nb_temps, nb_globals); + assert(temps[src].state != TCG_TEMP_COPY); +- /* Don't try to copy if one of temps is a global or either one +- is local and another is register */ +- if (src >= nb_globals && dst >= nb_globals && +- tcg_arg_is_local(s, src) == tcg_arg_is_local(s, dst)) { ++ if (src >= nb_globals) { + assert(temps[src].state != TCG_TEMP_CONST); + if (temps[src].state != TCG_TEMP_HAS_COPY) { + temps[src].state = TCG_TEMP_HAS_COPY; +@@ -444,7 +441,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_opc_buf[op_index] = INDEX_op_nop; + } else { + gen_opc_buf[op_index] = op_to_mov(op); +- tcg_opt_gen_mov(s, gen_args, args[0], args[1], ++ tcg_opt_gen_mov(gen_args, args[0], args[1], + nb_temps, nb_globals); + gen_args += 2; + } +@@ -482,7 +479,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_opc_buf[op_index] = INDEX_op_nop; + } else { + gen_opc_buf[op_index] = op_to_mov(op); +- tcg_opt_gen_mov(s, gen_args, args[0], args[1], nb_temps, ++ tcg_opt_gen_mov(gen_args, args[0], args[1], nb_temps, + nb_globals); + gen_args += 2; + } +@@ -507,7 +504,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + break; + } + if (temps[args[1]].state != TCG_TEMP_CONST) { +- tcg_opt_gen_mov(s, gen_args, args[0], args[1], ++ tcg_opt_gen_mov(gen_args, args[0], args[1], + nb_temps, nb_globals); + gen_args += 2; + args += 2; +diff --git a/tcg/tcg.h b/tcg/tcg.h +index d710694..8fbbc81 100644 +--- a/tcg/tcg.h ++++ b/tcg/tcg.h +@@ -458,11 +458,6 @@ static inline TCGv_i64 tcg_temp_local_new_i64(void) + void tcg_temp_free_i64(TCGv_i64 arg); + char *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg); + +-static inline bool tcg_arg_is_local(TCGContext *s, TCGArg arg) +-{ +- return s->temps[arg].temp_local; +-} +- + #if defined(CONFIG_DEBUG_TCG) + /* If you call tcg_clear_temp_count() at the start of a section of + * code which is not supposed to leak any TCG temporaries, then +-- +1.7.12.1 + diff --git a/0043-target-mips-Set-opn-in-gen_ldst_multiple.patch b/0043-target-mips-Set-opn-in-gen_ldst_multiple.patch new file mode 100644 index 0000000..874c31e --- /dev/null +++ b/0043-target-mips-Set-opn-in-gen_ldst_multiple.patch @@ -0,0 +1,55 @@ +From 3380afc68a701604e51fa22637ef48d93514d678 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Tue, 18 Sep 2012 21:55:32 -0700 +Subject: [PATCH] target-mips: Set opn in gen_ldst_multiple. + +Used by MIPS_DEBUG, when enabled. + +Signed-off-by: Richard Henderson +Acked-by: Aurelien Jarno +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + target-mips/translate.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/target-mips/translate.c b/target-mips/translate.c +index 7ab769f..c31f91c 100644 +--- a/target-mips/translate.c ++++ b/target-mips/translate.c +@@ -9855,6 +9855,7 @@ static void gen_andi16 (CPUMIPSState *env, DisasContext *ctx) + static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist, + int base, int16_t offset) + { ++ const char *opn = "ldst_multiple"; + TCGv t0, t1; + TCGv_i32 t2; + +@@ -9874,19 +9875,24 @@ static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist, + switch (opc) { + case LWM32: + gen_helper_lwm(cpu_env, t0, t1, t2); ++ opn = "lwm"; + break; + case SWM32: + gen_helper_swm(cpu_env, t0, t1, t2); ++ opn = "swm"; + break; + #ifdef TARGET_MIPS64 + case LDM: + gen_helper_ldm(cpu_env, t0, t1, t2); ++ opn = "ldm"; + break; + case SDM: + gen_helper_sdm(cpu_env, t0, t1, t2); ++ opn = "sdm"; + break; + #endif + } ++ (void)opn; + MIPS_DEBUG("%s, %x, %d(%s)", opn, reglist, offset, regnames[base]); + tcg_temp_free(t0); + tcg_temp_free(t1); +-- +1.7.12.1 + diff --git a/0044-target-mips-Fix-MIPS_DEBUG.patch b/0044-target-mips-Fix-MIPS_DEBUG.patch new file mode 100644 index 0000000..0fa094a --- /dev/null +++ b/0044-target-mips-Fix-MIPS_DEBUG.patch @@ -0,0 +1,288 @@ +From 5dd8e9207a39d8fe41eaa110edfdba5e37064562 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Tue, 18 Sep 2012 21:55:33 -0700 +Subject: [PATCH] target-mips: Fix MIPS_DEBUG. + +The macro uses the DisasContext. Pass it around as needed. + +Signed-off-by: Richard Henderson +Acked-by: Aurelien Jarno +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + target-mips/translate.c | 74 +++++++++++++++++++++++++------------------------ + 1 file changed, 38 insertions(+), 36 deletions(-) + +diff --git a/target-mips/translate.c b/target-mips/translate.c +index c31f91c..4937f6b 100644 +--- a/target-mips/translate.c ++++ b/target-mips/translate.c +@@ -1431,7 +1431,8 @@ static void gen_arith_imm (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, + } + + /* Logic with immediate operand */ +-static void gen_logic_imm (CPUMIPSState *env, uint32_t opc, int rt, int rs, int16_t imm) ++static void gen_logic_imm(CPUMIPSState *env, DisasContext *ctx, uint32_t opc, ++ int rt, int rs, int16_t imm) + { + target_ulong uimm; + const char *opn = "imm logic"; +@@ -1474,7 +1475,8 @@ static void gen_logic_imm (CPUMIPSState *env, uint32_t opc, int rt, int rs, int1 + } + + /* Set on less than with immediate operand */ +-static void gen_slt_imm (CPUMIPSState *env, uint32_t opc, int rt, int rs, int16_t imm) ++static void gen_slt_imm(CPUMIPSState *env, DisasContext *ctx, uint32_t opc, ++ int rt, int rs, int16_t imm) + { + target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */ + const char *opn = "imm arith"; +@@ -1775,7 +1777,8 @@ static void gen_arith (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, + } + + /* Conditional move */ +-static void gen_cond_move (CPUMIPSState *env, uint32_t opc, int rd, int rs, int rt) ++static void gen_cond_move(CPUMIPSState *env, DisasContext *ctx, uint32_t opc, ++ int rd, int rs, int rt) + { + const char *opn = "cond move"; + int l1; +@@ -1813,7 +1816,8 @@ static void gen_cond_move (CPUMIPSState *env, uint32_t opc, int rd, int rs, int + } + + /* Logic */ +-static void gen_logic (CPUMIPSState *env, uint32_t opc, int rd, int rs, int rt) ++static void gen_logic(CPUMIPSState *env, DisasContext *ctx, uint32_t opc, ++ int rd, int rs, int rt) + { + const char *opn = "logic"; + +@@ -1874,7 +1878,8 @@ static void gen_logic (CPUMIPSState *env, uint32_t opc, int rd, int rs, int rt) + } + + /* Set on lower than */ +-static void gen_slt (CPUMIPSState *env, uint32_t opc, int rd, int rs, int rt) ++static void gen_slt(CPUMIPSState *env, DisasContext *ctx, uint32_t opc, ++ int rd, int rs, int rt) + { + const char *opn = "slt"; + TCGv t0, t1; +@@ -8778,10 +8783,10 @@ static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx, + gen_arith_imm(env, ctx, OPC_ADDIU, rx, rx, imm); + break; + case M16_OPC_SLTI: +- gen_slt_imm(env, OPC_SLTI, 24, rx, imm); ++ gen_slt_imm(env, ctx, OPC_SLTI, 24, rx, imm); + break; + case M16_OPC_SLTIU: +- gen_slt_imm(env, OPC_SLTIU, 24, rx, imm); ++ gen_slt_imm(env, ctx, OPC_SLTIU, 24, rx, imm); + break; + case M16_OPC_I8: + switch (funct) { +@@ -8992,15 +8997,13 @@ static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx, + case M16_OPC_SLTI: + { + int16_t imm = (uint8_t) ctx->opcode; +- +- gen_slt_imm(env, OPC_SLTI, 24, rx, imm); ++ gen_slt_imm(env, ctx, OPC_SLTI, 24, rx, imm); + } + break; + case M16_OPC_SLTIU: + { + int16_t imm = (uint8_t) ctx->opcode; +- +- gen_slt_imm(env, OPC_SLTIU, 24, rx, imm); ++ gen_slt_imm(env, ctx, OPC_SLTIU, 24, rx, imm); + } + break; + case M16_OPC_I8: +@@ -9075,8 +9078,7 @@ static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx, + case M16_OPC_CMPI: + { + int16_t imm = (uint8_t) ctx->opcode; +- +- gen_logic_imm(env, OPC_XORI, 24, rx, imm); ++ gen_logic_imm(env, ctx, OPC_XORI, 24, rx, imm); + } + break; + #if defined(TARGET_MIPS64) +@@ -9188,10 +9190,10 @@ static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx, + } + break; + case RR_SLT: +- gen_slt(env, OPC_SLT, 24, rx, ry); ++ gen_slt(env, ctx, OPC_SLT, 24, rx, ry); + break; + case RR_SLTU: +- gen_slt(env, OPC_SLTU, 24, rx, ry); ++ gen_slt(env, ctx, OPC_SLTU, 24, rx, ry); + break; + case RR_BREAK: + generate_exception(ctx, EXCP_BREAK); +@@ -9212,22 +9214,22 @@ static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx, + break; + #endif + case RR_CMP: +- gen_logic(env, OPC_XOR, 24, rx, ry); ++ gen_logic(env, ctx, OPC_XOR, 24, rx, ry); + break; + case RR_NEG: + gen_arith(env, ctx, OPC_SUBU, rx, 0, ry); + break; + case RR_AND: +- gen_logic(env, OPC_AND, rx, rx, ry); ++ gen_logic(env, ctx, OPC_AND, rx, rx, ry); + break; + case RR_OR: +- gen_logic(env, OPC_OR, rx, rx, ry); ++ gen_logic(env, ctx, OPC_OR, rx, rx, ry); + break; + case RR_XOR: +- gen_logic(env, OPC_XOR, rx, rx, ry); ++ gen_logic(env, ctx, OPC_XOR, rx, rx, ry); + break; + case RR_NOT: +- gen_logic(env, OPC_NOR, rx, ry, 0); ++ gen_logic(env, ctx, OPC_NOR, rx, ry, 0); + break; + case RR_MFHI: + gen_HILO(ctx, OPC_MFHI, rx); +@@ -9849,7 +9851,7 @@ static void gen_andi16 (CPUMIPSState *env, DisasContext *ctx) + int rs = mmreg(uMIPS_RS(ctx->opcode)); + int encoded = ZIMM(ctx->opcode, 0, 4); + +- gen_logic_imm(env, OPC_ANDI, rd, rs, decoded_imm[encoded]); ++ gen_logic_imm(env, ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]); + } + + static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist, +@@ -9911,25 +9913,25 @@ static void gen_pool16c_insn (CPUMIPSState *env, DisasContext *ctx, int *is_bran + case NOT16 + 1: + case NOT16 + 2: + case NOT16 + 3: +- gen_logic(env, OPC_NOR, rd, rs, 0); ++ gen_logic(env, ctx, OPC_NOR, rd, rs, 0); + break; + case XOR16 + 0: + case XOR16 + 1: + case XOR16 + 2: + case XOR16 + 3: +- gen_logic(env, OPC_XOR, rd, rd, rs); ++ gen_logic(env, ctx, OPC_XOR, rd, rd, rs); + break; + case AND16 + 0: + case AND16 + 1: + case AND16 + 2: + case AND16 + 3: +- gen_logic(env, OPC_AND, rd, rd, rs); ++ gen_logic(env, ctx, OPC_AND, rd, rd, rs); + break; + case OR16 + 0: + case OR16 + 1: + case OR16 + 2: + case OR16 + 3: +- gen_logic(env, OPC_OR, rd, rd, rs); ++ gen_logic(env, ctx, OPC_OR, rd, rd, rs); + break; + case LWM16 + 0: + case LWM16 + 1: +@@ -10743,7 +10745,7 @@ static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx, + case XOR32: + mips32_op = OPC_XOR; + do_logic: +- gen_logic(env, mips32_op, rd, rs, rt); ++ gen_logic(env, ctx, mips32_op, rd, rs, rt); + break; + /* Set less than */ + case SLT: +@@ -10752,7 +10754,7 @@ static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx, + case SLTU: + mips32_op = OPC_SLTU; + do_slt: +- gen_slt(env, mips32_op, rd, rs, rt); ++ gen_slt(env, ctx, mips32_op, rd, rs, rt); + break; + default: + goto pool32a_invalid; +@@ -10768,7 +10770,7 @@ static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx, + case MOVZ: + mips32_op = OPC_MOVZ; + do_cmov: +- gen_cond_move(env, mips32_op, rd, rs, rt); ++ gen_cond_move(env, ctx, mips32_op, rd, rs, rt); + break; + case LWXS: + gen_ldxs(ctx, rs, rt, rd); +@@ -11181,7 +11183,7 @@ static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx, + target. */ + break; + case LUI: +- gen_logic_imm(env, OPC_LUI, rs, -1, imm); ++ gen_logic_imm(env, ctx, OPC_LUI, rs, -1, imm); + break; + case SYNCI: + break; +@@ -11300,7 +11302,7 @@ static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx, + case ANDI32: + mips32_op = OPC_ANDI; + do_logici: +- gen_logic_imm(env, mips32_op, rt, rs, imm); ++ gen_logic_imm(env, ctx, mips32_op, rt, rs, imm); + break; + + /* Set less than immediate */ +@@ -11310,7 +11312,7 @@ static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx, + case SLTIU32: + mips32_op = OPC_SLTIU; + do_slti: +- gen_slt_imm(env, mips32_op, rt, rs, imm); ++ gen_slt_imm(env, ctx, mips32_op, rt, rs, imm); + break; + case JALX32: + offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2; +@@ -11787,7 +11789,7 @@ static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch) + case OPC_MOVZ: + check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32 | + INSN_LOONGSON2E | INSN_LOONGSON2F); +- gen_cond_move(env, op1, rd, rs, rt); ++ gen_cond_move(env, ctx, op1, rd, rs, rt); + break; + case OPC_ADD ... OPC_SUBU: + gen_arith(env, ctx, op1, rd, rs, rt); +@@ -11814,13 +11816,13 @@ static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch) + break; + case OPC_SLT: /* Set on less than */ + case OPC_SLTU: +- gen_slt(env, op1, rd, rs, rt); ++ gen_slt(env, ctx, op1, rd, rs, rt); + break; + case OPC_AND: /* Logic*/ + case OPC_OR: + case OPC_NOR: + case OPC_XOR: +- gen_logic(env, op1, rd, rs, rt); ++ gen_logic(env, ctx, op1, rd, rs, rt); + break; + case OPC_MULT ... OPC_DIVU: + if (sa) { +@@ -12221,13 +12223,13 @@ static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch) + break; + case OPC_SLTI: /* Set on less than with immediate opcode */ + case OPC_SLTIU: +- gen_slt_imm(env, op, rt, rs, imm); ++ gen_slt_imm(env, ctx, op, rt, rs, imm); + break; + case OPC_ANDI: /* Arithmetic with immediate opcode */ + case OPC_LUI: + case OPC_ORI: + case OPC_XORI: +- gen_logic_imm(env, op, rt, rs, imm); ++ gen_logic_imm(env, ctx, op, rt, rs, imm); + break; + case OPC_J ... OPC_JAL: /* Jump */ + offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2; +-- +1.7.12.1 + diff --git a/0045-target-mips-Always-evaluate-debugging-macro-argument.patch b/0045-target-mips-Always-evaluate-debugging-macro-argument.patch new file mode 100644 index 0000000..e424bcf --- /dev/null +++ b/0045-target-mips-Always-evaluate-debugging-macro-argument.patch @@ -0,0 +1,70 @@ +From e6f923b4e3e71661343f6d2eecd7f102022e5635 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Tue, 18 Sep 2012 21:55:34 -0700 +Subject: [PATCH] target-mips: Always evaluate debugging macro arguments + +this will prevent some of the compilation errors with debugging +enabled from creeping back in. + +Signed-off-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + target-mips/translate.c | 31 +++++++++++++++++-------------- + 1 file changed, 17 insertions(+), 14 deletions(-) + +diff --git a/target-mips/translate.c b/target-mips/translate.c +index 4937f6b..aba7935 100644 +--- a/target-mips/translate.c ++++ b/target-mips/translate.c +@@ -28,7 +28,7 @@ + #define GEN_HELPER 1 + #include "helper.h" + +-//#define MIPS_DEBUG_DISAS ++#define MIPS_DEBUG_DISAS 0 + //#define MIPS_DEBUG_SIGN_EXTENSIONS + + /* MIPS major opcodes */ +@@ -566,22 +566,25 @@ static const char *fregnames[] = + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", }; + +-#ifdef MIPS_DEBUG_DISAS +-#define MIPS_DEBUG(fmt, ...) \ +- qemu_log_mask(CPU_LOG_TB_IN_ASM, \ +- TARGET_FMT_lx ": %08x " fmt "\n", \ +- ctx->pc, ctx->opcode , ## __VA_ARGS__) +-#define LOG_DISAS(...) qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__) +-#else +-#define MIPS_DEBUG(fmt, ...) do { } while(0) +-#define LOG_DISAS(...) do { } while (0) +-#endif ++#define MIPS_DEBUG(fmt, ...) \ ++ do { \ ++ if (MIPS_DEBUG_DISAS) { \ ++ qemu_log_mask(CPU_LOG_TB_IN_ASM, \ ++ TARGET_FMT_lx ": %08x " fmt "\n", \ ++ ctx->pc, ctx->opcode , ## __VA_ARGS__); \ ++ } \ ++ } while (0) ++ ++#define LOG_DISAS(...) \ ++ do { \ ++ if (MIPS_DEBUG_DISAS) { \ ++ qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__); \ ++ } \ ++ } while (0) + + #define MIPS_INVAL(op) \ +-do { \ + MIPS_DEBUG("Invalid %s %03x %03x %03x", op, ctx->opcode >> 26, \ +- ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F)); \ +-} while (0) ++ ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F)) + + /* General purpose registers moves. */ + static inline void gen_load_gpr (TCGv t, int reg) +-- +1.7.12.1 + diff --git a/0046-tcg-optimize-fix-end-of-basic-block-detection.patch b/0046-tcg-optimize-fix-end-of-basic-block-detection.patch new file mode 100644 index 0000000..c498962 --- /dev/null +++ b/0046-tcg-optimize-fix-end-of-basic-block-detection.patch @@ -0,0 +1,62 @@ +From 4ce7a1e0aaecb220016af9b4f390b76f7fffcce8 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Wed, 19 Sep 2012 21:40:30 +0200 +Subject: [PATCH] tcg/optimize: fix end of basic block detection + +Commit e31b0a7c050711884ad570fe73df806520953618 fixed copy propagation on +32-bit host by restricting the copy between different types. This was the +wrong fix. + +The real problem is that the all temps states should be reset at the end +of a basic block. This was done by adding such operations in the switch, +but brcond2 was forgotten (that's why the crash was only observed on 32-bit +hosts). + +Fix that by looking at the TCG_OPF_BB_END instead. We need to keep the case +for op_set_label as temps might be modified through another path. + +Cc: Blue Swirl +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 10d9773..9da333c 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -632,21 +632,17 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + i--; + } + break; +- case INDEX_op_set_label: +- case INDEX_op_jmp: +- case INDEX_op_br: +- memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); +- for (i = 0; i < def->nb_args; i++) { +- *gen_args = *args; +- args++; +- gen_args++; +- } +- break; + default: + /* Default case: we do know nothing about operation so no +- propagation is done. We only trash output args. */ +- for (i = 0; i < def->nb_oargs; i++) { +- reset_temp(args[i], nb_temps, nb_globals); ++ propagation is done. We trash everything if the operation ++ is the end of a basic block, otherwise we only trash the ++ output args. */ ++ if (def->flags & TCG_OPF_BB_END) { ++ memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); ++ } else { ++ for (i = 0; i < def->nb_oargs; i++) { ++ reset_temp(args[i], nb_temps, nb_globals); ++ } + } + for (i = 0; i < def->nb_args; i++) { + gen_args[i] = args[i]; +-- +1.7.12.1 + diff --git a/0047-target-xtensa-fix-extui-shift-amount.patch b/0047-target-xtensa-fix-extui-shift-amount.patch new file mode 100644 index 0000000..c654322 --- /dev/null +++ b/0047-target-xtensa-fix-extui-shift-amount.patch @@ -0,0 +1,57 @@ +From 1c596a9498830485a1b2f4a4445643a149179b99 Mon Sep 17 00:00:00 2001 +From: Max Filippov +Date: Fri, 21 Sep 2012 02:59:49 +0400 +Subject: [PATCH] target-xtensa: fix extui shift amount + +extui opcode only uses lowermost op1 bit for sa4. + +Reported-by: malc +Signed-off-by: Max Filippov +Cc: qemu-stable +Signed-off-by: malc +Signed-off-by: Michael Roth +--- + target-xtensa/translate.c | 24 +++++++++++++++++++++--- + 1 file changed, 21 insertions(+), 3 deletions(-) + +diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c +index 1900bd5..7a1c528 100644 +--- a/target-xtensa/translate.c ++++ b/target-xtensa/translate.c +@@ -1778,12 +1778,30 @@ static void disas_xtensa_insn(DisasContext *dc) + case 5: + gen_window_check2(dc, RRR_R, RRR_T); + { +- int shiftimm = RRR_S | (OP1 << 4); ++ int shiftimm = RRR_S | ((OP1 & 1) << 4); + int maskimm = (1 << (OP2 + 1)) - 1; + + TCGv_i32 tmp = tcg_temp_new_i32(); +- tcg_gen_shri_i32(tmp, cpu_R[RRR_T], shiftimm); +- tcg_gen_andi_i32(cpu_R[RRR_R], tmp, maskimm); ++ ++ if (shiftimm) { ++ tcg_gen_shri_i32(tmp, cpu_R[RRR_T], shiftimm); ++ } else { ++ tcg_gen_mov_i32(tmp, cpu_R[RRR_T]); ++ } ++ ++ switch (maskimm) { ++ case 0xff: ++ tcg_gen_ext8u_i32(cpu_R[RRR_R], tmp); ++ break; ++ ++ case 0xffff: ++ tcg_gen_ext16u_i32(cpu_R[RRR_R], tmp); ++ break; ++ ++ default: ++ tcg_gen_andi_i32(cpu_R[RRR_R], tmp, maskimm); ++ break; ++ } + tcg_temp_free(tmp); + } + break; +-- +1.7.12.1 + diff --git a/0048-target-xtensa-don-t-emit-extra-tcg_gen_goto_tb.patch b/0048-target-xtensa-don-t-emit-extra-tcg_gen_goto_tb.patch new file mode 100644 index 0000000..2e8e219 --- /dev/null +++ b/0048-target-xtensa-don-t-emit-extra-tcg_gen_goto_tb.patch @@ -0,0 +1,35 @@ +From ba9c2acb955f0453ae80077a791a4d1c27b5d6e6 Mon Sep 17 00:00:00 2001 +From: Max Filippov +Date: Fri, 21 Sep 2012 02:59:50 +0400 +Subject: [PATCH] target-xtensa: don't emit extra tcg_gen_goto_tb + +Unconditional gen_check_loop_end at the end of disas_xtensa_insn +can emit tcg_gen_goto_tb with slot id already used in the TB (e.g. when +TB ends at LEND with a branch). + +Signed-off-by: Max Filippov +Cc: qemu-stable +Signed-off-by: malc +Signed-off-by: Michael Roth +--- + target-xtensa/translate.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c +index 7a1c528..b6643eb 100644 +--- a/target-xtensa/translate.c ++++ b/target-xtensa/translate.c +@@ -2520,7 +2520,9 @@ static void disas_xtensa_insn(DisasContext *dc) + break; + } + +- gen_check_loop_end(dc, 0); ++ if (dc->is_jmp == DISAS_NEXT) { ++ gen_check_loop_end(dc, 0); ++ } + dc->pc = dc->next_pc; + + return; +-- +1.7.12.1 + diff --git a/0049-tcg-Introduce-movcond.patch b/0049-tcg-Introduce-movcond.patch new file mode 100644 index 0000000..3ead932 --- /dev/null +++ b/0049-tcg-Introduce-movcond.patch @@ -0,0 +1,333 @@ +From a977d2c7f02eb2ed7fc879979d6f5525c017a881 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 10:13:34 -0700 +Subject: [PATCH] tcg: Introduce movcond + +Implemented with setcond if the target does not provide +the optional opcode. + +Signed-off-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/README | 6 ++++++ + tcg/arm/tcg-target.h | 1 + + tcg/hppa/tcg-target.h | 1 + + tcg/i386/tcg-target.h | 2 ++ + tcg/ia64/tcg-target.h | 2 ++ + tcg/mips/tcg-target.h | 1 + + tcg/ppc/tcg-target.h | 1 + + tcg/ppc64/tcg-target.h | 2 ++ + tcg/s390/tcg-target.h | 2 ++ + tcg/sparc/tcg-target.h | 2 ++ + tcg/tcg-op.h | 40 ++++++++++++++++++++++++++++++++++++++++ + tcg/tcg-opc.h | 2 ++ + tcg/tcg.c | 11 +++++------ + tcg/tcg.h | 1 + + tcg/tci/tcg-target.h | 2 ++ + 15 files changed, 70 insertions(+), 6 deletions(-) + +diff --git a/tcg/README b/tcg/README +index cfdfd96..d03ae05 100644 +--- a/tcg/README ++++ b/tcg/README +@@ -307,6 +307,12 @@ dest = (t1 cond t2) + + Set DEST to 1 if (T1 cond T2) is true, otherwise set to 0. + ++* movcond_i32/i64 cond, dest, c1, c2, v1, v2 ++ ++dest = (c1 cond c2 ? v1 : v2) ++ ++Set DEST to V1 if (C1 cond C2) is true, otherwise set to V2. ++ + ********* Type conversions + + * ext_i32_i64 t0, t1 +diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h +index c0b8f72..e2299ca 100644 +--- a/tcg/arm/tcg-target.h ++++ b/tcg/arm/tcg-target.h +@@ -73,6 +73,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 0 + #define TCG_TARGET_HAS_nor_i32 0 + #define TCG_TARGET_HAS_deposit_i32 0 ++#define TCG_TARGET_HAS_movcond_i32 0 + + #define TCG_TARGET_HAS_GUEST_BASE + +diff --git a/tcg/hppa/tcg-target.h b/tcg/hppa/tcg-target.h +index 01ef960..4defd28 100644 +--- a/tcg/hppa/tcg-target.h ++++ b/tcg/hppa/tcg-target.h +@@ -96,6 +96,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 0 + #define TCG_TARGET_HAS_nor_i32 0 + #define TCG_TARGET_HAS_deposit_i32 1 ++#define TCG_TARGET_HAS_movcond_i32 0 + + /* optional instructions automatically implemented */ + #define TCG_TARGET_HAS_neg_i32 0 /* sub rd, 0, rs */ +diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h +index 8be42f3..504f953 100644 +--- a/tcg/i386/tcg-target.h ++++ b/tcg/i386/tcg-target.h +@@ -86,6 +86,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 0 + #define TCG_TARGET_HAS_nor_i32 0 + #define TCG_TARGET_HAS_deposit_i32 1 ++#define TCG_TARGET_HAS_movcond_i32 0 + + #if TCG_TARGET_REG_BITS == 64 + #define TCG_TARGET_HAS_div2_i64 1 +@@ -107,6 +108,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i64 0 + #define TCG_TARGET_HAS_nor_i64 0 + #define TCG_TARGET_HAS_deposit_i64 1 ++#define TCG_TARGET_HAS_movcond_i64 0 + #endif + + #define TCG_TARGET_deposit_i32_valid(ofs, len) \ +diff --git a/tcg/ia64/tcg-target.h b/tcg/ia64/tcg-target.h +index c22962a..368aee4 100644 +--- a/tcg/ia64/tcg-target.h ++++ b/tcg/ia64/tcg-target.h +@@ -133,6 +133,8 @@ typedef enum { + #define TCG_TARGET_HAS_rot_i64 1 + #define TCG_TARGET_HAS_deposit_i32 0 + #define TCG_TARGET_HAS_deposit_i64 0 ++#define TCG_TARGET_HAS_movcond_i32 0 ++#define TCG_TARGET_HAS_movcond_i64 0 + + /* optional instructions automatically implemented */ + #define TCG_TARGET_HAS_neg_i32 0 /* sub r1, r0, r3 */ +diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h +index 1c61931..9c68a32 100644 +--- a/tcg/mips/tcg-target.h ++++ b/tcg/mips/tcg-target.h +@@ -90,6 +90,7 @@ typedef enum { + #define TCG_TARGET_HAS_eqv_i32 0 + #define TCG_TARGET_HAS_nand_i32 0 + #define TCG_TARGET_HAS_deposit_i32 0 ++#define TCG_TARGET_HAS_movcond_i32 0 + + /* optional instructions automatically implemented */ + #define TCG_TARGET_HAS_neg_i32 0 /* sub rd, zero, rt */ +diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h +index 2f37fd2..177eea1 100644 +--- a/tcg/ppc/tcg-target.h ++++ b/tcg/ppc/tcg-target.h +@@ -92,6 +92,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 1 + #define TCG_TARGET_HAS_nor_i32 1 + #define TCG_TARGET_HAS_deposit_i32 1 ++#define TCG_TARGET_HAS_movcond_i32 0 + + #define TCG_AREG0 TCG_REG_R27 + +diff --git a/tcg/ppc64/tcg-target.h b/tcg/ppc64/tcg-target.h +index 97eec08..57569e8 100644 +--- a/tcg/ppc64/tcg-target.h ++++ b/tcg/ppc64/tcg-target.h +@@ -83,6 +83,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 0 + #define TCG_TARGET_HAS_nor_i32 0 + #define TCG_TARGET_HAS_deposit_i32 0 ++#define TCG_TARGET_HAS_movcond_i32 0 + + #define TCG_TARGET_HAS_div_i64 1 + #define TCG_TARGET_HAS_rot_i64 0 +@@ -103,6 +104,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i64 0 + #define TCG_TARGET_HAS_nor_i64 0 + #define TCG_TARGET_HAS_deposit_i64 0 ++#define TCG_TARGET_HAS_movcond_i64 0 + + #define TCG_AREG0 TCG_REG_R27 + +diff --git a/tcg/s390/tcg-target.h b/tcg/s390/tcg-target.h +index 4f7dfab..ed55c33 100644 +--- a/tcg/s390/tcg-target.h ++++ b/tcg/s390/tcg-target.h +@@ -63,6 +63,7 @@ typedef enum TCGReg { + #define TCG_TARGET_HAS_nand_i32 0 + #define TCG_TARGET_HAS_nor_i32 0 + #define TCG_TARGET_HAS_deposit_i32 0 ++#define TCG_TARGET_HAS_movcond_i32 0 + + #if TCG_TARGET_REG_BITS == 64 + #define TCG_TARGET_HAS_div2_i64 1 +@@ -84,6 +85,7 @@ typedef enum TCGReg { + #define TCG_TARGET_HAS_nand_i64 0 + #define TCG_TARGET_HAS_nor_i64 0 + #define TCG_TARGET_HAS_deposit_i64 0 ++#define TCG_TARGET_HAS_movcond_i64 0 + #endif + + #define TCG_TARGET_HAS_GUEST_BASE +diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h +index 0ea87be..d762574 100644 +--- a/tcg/sparc/tcg-target.h ++++ b/tcg/sparc/tcg-target.h +@@ -102,6 +102,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 0 + #define TCG_TARGET_HAS_nor_i32 0 + #define TCG_TARGET_HAS_deposit_i32 0 ++#define TCG_TARGET_HAS_movcond_i32 0 + + #if TCG_TARGET_REG_BITS == 64 + #define TCG_TARGET_HAS_div_i64 1 +@@ -123,6 +124,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i64 0 + #define TCG_TARGET_HAS_nor_i64 0 + #define TCG_TARGET_HAS_deposit_i64 0 ++#define TCG_TARGET_HAS_movcond_i64 0 + #endif + + #ifdef CONFIG_SOLARIS +diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h +index 169d3b2..6d28f82 100644 +--- a/tcg/tcg-op.h ++++ b/tcg/tcg-op.h +@@ -2118,6 +2118,44 @@ static inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1, + tcg_temp_free_i64(t1); + } + ++static inline void tcg_gen_movcond_i32(TCGCond cond, TCGv_i32 ret, ++ TCGv_i32 c1, TCGv_i32 c2, ++ TCGv_i32 v1, TCGv_i32 v2) ++{ ++ if (TCG_TARGET_HAS_movcond_i32) { ++ tcg_gen_op6i_i32(INDEX_op_movcond_i32, ret, c1, c2, v1, v2, cond); ++ } else { ++ TCGv_i32 t0 = tcg_temp_new_i32(); ++ TCGv_i32 t1 = tcg_temp_new_i32(); ++ tcg_gen_setcond_i32(cond, t0, c1, c2); ++ tcg_gen_neg_i32(t0, t0); ++ tcg_gen_and_i32(t1, v1, t0); ++ tcg_gen_andc_i32(ret, v2, t0); ++ tcg_gen_or_i32(ret, ret, t1); ++ tcg_temp_free_i32(t0); ++ tcg_temp_free_i32(t1); ++ } ++} ++ ++static inline void tcg_gen_movcond_i64(TCGCond cond, TCGv_i64 ret, ++ TCGv_i64 c1, TCGv_i64 c2, ++ TCGv_i64 v1, TCGv_i64 v2) ++{ ++ if (TCG_TARGET_HAS_movcond_i64) { ++ tcg_gen_op6i_i64(INDEX_op_movcond_i64, ret, c1, c2, v1, v2, cond); ++ } else { ++ TCGv_i64 t0 = tcg_temp_new_i64(); ++ TCGv_i64 t1 = tcg_temp_new_i64(); ++ tcg_gen_setcond_i64(cond, t0, c1, c2); ++ tcg_gen_neg_i64(t0, t0); ++ tcg_gen_and_i64(t1, v1, t0); ++ tcg_gen_andc_i64(ret, v2, t0); ++ tcg_gen_or_i64(ret, ret, t1); ++ tcg_temp_free_i64(t0); ++ tcg_temp_free_i64(t1); ++ } ++} ++ + /***************************************/ + /* QEMU specific operations. Their type depend on the QEMU CPU + type. */ +@@ -2434,6 +2472,7 @@ static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index) + #define tcg_gen_deposit_tl tcg_gen_deposit_i64 + #define tcg_const_tl tcg_const_i64 + #define tcg_const_local_tl tcg_const_local_i64 ++#define tcg_gen_movcond_tl tcg_gen_movcond_i64 + #else + #define tcg_gen_movi_tl tcg_gen_movi_i32 + #define tcg_gen_mov_tl tcg_gen_mov_i32 +@@ -2505,6 +2544,7 @@ static inline void tcg_gen_qemu_st64(TCGv_i64 arg, TCGv addr, int mem_index) + #define tcg_gen_deposit_tl tcg_gen_deposit_i32 + #define tcg_const_tl tcg_const_i32 + #define tcg_const_local_tl tcg_const_local_i32 ++#define tcg_gen_movcond_tl tcg_gen_movcond_i32 + #endif + + #if TCG_TARGET_REG_BITS == 32 +diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h +index d12e8d0..dbb0e39 100644 +--- a/tcg/tcg-opc.h ++++ b/tcg/tcg-opc.h +@@ -51,6 +51,7 @@ DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS) + DEF(mov_i32, 1, 1, 0, 0) + DEF(movi_i32, 1, 0, 1, 0) + DEF(setcond_i32, 1, 2, 1, 0) ++DEF(movcond_i32, 1, 4, 1, IMPL(TCG_TARGET_HAS_movcond_i32)) + /* load/store */ + DEF(ld8u_i32, 1, 1, 1, 0) + DEF(ld8s_i32, 1, 1, 1, 0) +@@ -107,6 +108,7 @@ DEF(nor_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_nor_i32)) + DEF(mov_i64, 1, 1, 0, IMPL64) + DEF(movi_i64, 1, 0, 1, IMPL64) + DEF(setcond_i64, 1, 2, 1, IMPL64) ++DEF(movcond_i64, 1, 4, 1, IMPL64 | IMPL(TCG_TARGET_HAS_movcond_i64)) + /* load/store */ + DEF(ld8u_i64, 1, 1, 1, IMPL64) + DEF(ld8s_i64, 1, 1, 1, IMPL64) +diff --git a/tcg/tcg.c b/tcg/tcg.c +index c002a88..24ce830 100644 +--- a/tcg/tcg.c ++++ b/tcg/tcg.c +@@ -991,16 +991,15 @@ void tcg_dump_ops(TCGContext *s) + } + switch (c) { + case INDEX_op_brcond_i32: +-#if TCG_TARGET_REG_BITS == 32 +- case INDEX_op_brcond2_i32: +-#elif TCG_TARGET_REG_BITS == 64 +- case INDEX_op_brcond_i64: +-#endif + case INDEX_op_setcond_i32: ++ case INDEX_op_movcond_i32: + #if TCG_TARGET_REG_BITS == 32 ++ case INDEX_op_brcond2_i32: + case INDEX_op_setcond2_i32: +-#elif TCG_TARGET_REG_BITS == 64 ++#else ++ case INDEX_op_brcond_i64: + case INDEX_op_setcond_i64: ++ case INDEX_op_movcond_i64: + #endif + if (args[k] < ARRAY_SIZE(cond_name) && cond_name[args[k]]) { + qemu_log(",%s", cond_name[args[k++]]); +diff --git a/tcg/tcg.h b/tcg/tcg.h +index 8fbbc81..f454107 100644 +--- a/tcg/tcg.h ++++ b/tcg/tcg.h +@@ -79,6 +79,7 @@ typedef uint64_t TCGRegSet; + #define TCG_TARGET_HAS_nand_i64 0 + #define TCG_TARGET_HAS_nor_i64 0 + #define TCG_TARGET_HAS_deposit_i64 0 ++#define TCG_TARGET_HAS_movcond_i64 0 + #endif + + #ifndef TCG_TARGET_deposit_i32_valid +diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h +index 30a0f21..6d89495 100644 +--- a/tcg/tci/tcg-target.h ++++ b/tcg/tci/tcg-target.h +@@ -75,6 +75,7 @@ + #define TCG_TARGET_HAS_not_i32 1 + #define TCG_TARGET_HAS_orc_i32 0 + #define TCG_TARGET_HAS_rot_i32 1 ++#define TCG_TARGET_HAS_movcond_i32 0 + + #if TCG_TARGET_REG_BITS == 64 + #define TCG_TARGET_HAS_bswap16_i64 1 +@@ -98,6 +99,7 @@ + #define TCG_TARGET_HAS_not_i64 1 + #define TCG_TARGET_HAS_orc_i64 0 + #define TCG_TARGET_HAS_rot_i64 1 ++#define TCG_TARGET_HAS_movcond_i64 0 + #endif /* TCG_TARGET_REG_BITS == 64 */ + + /* Offset to user memory in user mode. */ +-- +1.7.12.1 + diff --git a/0050-target-alpha-Use-movcond.patch b/0050-target-alpha-Use-movcond.patch new file mode 100644 index 0000000..0bd5272 --- /dev/null +++ b/0050-target-alpha-Use-movcond.patch @@ -0,0 +1,160 @@ +From 4bf321d3f494134fe2e03c9cbc042e28ec3a1045 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 10:13:35 -0700 +Subject: [PATCH] target-alpha: Use movcond + +For proper cmov insns, as well as the non-goto-tb case +of conditional branch. + +Signed-off-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + target-alpha/translate.c | 102 ++++++++++++++++++++++------------------------- + 1 file changed, 48 insertions(+), 54 deletions(-) + +diff --git a/target-alpha/translate.c b/target-alpha/translate.c +index 12de6a3..4a9011a 100644 +--- a/target-alpha/translate.c ++++ b/target-alpha/translate.c +@@ -426,27 +426,15 @@ static ExitStatus gen_bcond_internal(DisasContext *ctx, TCGCond cond, + + return EXIT_GOTO_TB; + } else { +- int lab_over = gen_new_label(); +- +- /* ??? Consider using either +- movi pc, next +- addi tmp, pc, disp +- movcond pc, cond, 0, tmp, pc +- or +- setcond tmp, cond, 0 +- movi pc, next +- neg tmp, tmp +- andi tmp, tmp, disp +- add pc, pc, tmp +- The current diamond subgraph surely isn't efficient. */ ++ TCGv_i64 z = tcg_const_i64(0); ++ TCGv_i64 d = tcg_const_i64(dest); ++ TCGv_i64 p = tcg_const_i64(ctx->pc); + +- tcg_gen_brcondi_i64(cond, cmp, 0, lab_true); +- tcg_gen_movi_i64(cpu_pc, ctx->pc); +- tcg_gen_br(lab_over); +- gen_set_label(lab_true); +- tcg_gen_movi_i64(cpu_pc, dest); +- gen_set_label(lab_over); ++ tcg_gen_movcond_i64(cond, cpu_pc, cmp, z, d, p); + ++ tcg_temp_free_i64(z); ++ tcg_temp_free_i64(d); ++ tcg_temp_free_i64(p); + return EXIT_PC_UPDATED; + } + } +@@ -521,61 +509,67 @@ static ExitStatus gen_fbcond(DisasContext *ctx, TCGCond cond, int ra, + static void gen_cmov(TCGCond cond, int ra, int rb, int rc, + int islit, uint8_t lit, int mask) + { +- TCGCond inv_cond = tcg_invert_cond(cond); +- int l1; ++ TCGv_i64 c1, z, v1; + +- if (unlikely(rc == 31)) ++ if (unlikely(rc == 31)) { + return; ++ } + +- l1 = gen_new_label(); +- +- if (ra != 31) { +- if (mask) { +- TCGv tmp = tcg_temp_new(); +- tcg_gen_andi_i64(tmp, cpu_ir[ra], 1); +- tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1); +- tcg_temp_free(tmp); +- } else +- tcg_gen_brcondi_i64(inv_cond, cpu_ir[ra], 0, l1); +- } else { ++ if (ra == 31) { + /* Very uncommon case - Do not bother to optimize. */ +- TCGv tmp = tcg_const_i64(0); +- tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1); +- tcg_temp_free(tmp); ++ c1 = tcg_const_i64(0); ++ } else if (mask) { ++ c1 = tcg_const_i64(1); ++ tcg_gen_and_i64(c1, c1, cpu_ir[ra]); ++ } else { ++ c1 = cpu_ir[ra]; + } ++ if (islit) { ++ v1 = tcg_const_i64(lit); ++ } else { ++ v1 = cpu_ir[rb]; ++ } ++ z = tcg_const_i64(0); + +- if (islit) +- tcg_gen_movi_i64(cpu_ir[rc], lit); +- else +- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]); +- gen_set_label(l1); ++ tcg_gen_movcond_i64(cond, cpu_ir[rc], c1, z, v1, cpu_ir[rc]); ++ ++ tcg_temp_free_i64(z); ++ if (ra == 31 || mask) { ++ tcg_temp_free_i64(c1); ++ } ++ if (islit) { ++ tcg_temp_free_i64(v1); ++ } + } + + static void gen_fcmov(TCGCond cond, int ra, int rb, int rc) + { +- TCGv cmp_tmp; +- int l1; ++ TCGv_i64 c1, z, v1; + + if (unlikely(rc == 31)) { + return; + } + +- cmp_tmp = tcg_temp_new(); ++ c1 = tcg_temp_new_i64(); + if (unlikely(ra == 31)) { +- tcg_gen_movi_i64(cmp_tmp, 0); ++ tcg_gen_movi_i64(c1, 0); ++ } else { ++ gen_fold_mzero(cond, c1, cpu_fir[ra]); ++ } ++ if (rb == 31) { ++ v1 = tcg_const_i64(0); + } else { +- gen_fold_mzero(cond, cmp_tmp, cpu_fir[ra]); ++ v1 = cpu_fir[rb]; + } ++ z = tcg_const_i64(0); + +- l1 = gen_new_label(); +- tcg_gen_brcondi_i64(tcg_invert_cond(cond), cmp_tmp, 0, l1); +- tcg_temp_free(cmp_tmp); ++ tcg_gen_movcond_i64(cond, cpu_fir[rc], c1, z, v1, cpu_fir[rc]); + +- if (rb != 31) +- tcg_gen_mov_i64(cpu_fir[rc], cpu_fir[rb]); +- else +- tcg_gen_movi_i64(cpu_fir[rc], 0); +- gen_set_label(l1); ++ tcg_temp_free_i64(z); ++ tcg_temp_free_i64(c1); ++ if (rb == 31) { ++ tcg_temp_free_i64(v1); ++ } + } + + #define QUAL_RM_N 0x080 /* Round mode nearest even */ +-- +1.7.12.1 + diff --git a/0051-tcg-i386-Implement-movcond.patch b/0051-tcg-i386-Implement-movcond.patch new file mode 100644 index 0000000..4d3983f --- /dev/null +++ b/0051-tcg-i386-Implement-movcond.patch @@ -0,0 +1,118 @@ +From 7a6273e2995b6c439441316467ab19bd6a48f03f Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 10:13:36 -0700 +Subject: [PATCH] tcg-i386: Implement movcond + +Signed-off-by: Richard Henderson +Reviewed-by: Aurelien Jarno +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/i386/tcg-target.c | 29 +++++++++++++++++++++++++++++ + tcg/i386/tcg-target.h | 7 ++++++- + 2 files changed, 35 insertions(+), 1 deletion(-) + +diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c +index 3017858..aa1fa9f 100644 +--- a/tcg/i386/tcg-target.c ++++ b/tcg/i386/tcg-target.c +@@ -249,6 +249,7 @@ static inline int tcg_target_const_match(tcg_target_long val, + #define OPC_ADD_GvEv (OPC_ARITH_GvEv | (ARITH_ADD << 3)) + #define OPC_BSWAP (0xc8 | P_EXT) + #define OPC_CALL_Jz (0xe8) ++#define OPC_CMOVCC (0x40 | P_EXT) /* ... plus condition code */ + #define OPC_CMP_GvEv (OPC_ARITH_GvEv | (ARITH_CMP << 3)) + #define OPC_DEC_r32 (0x48) + #define OPC_IMUL_GvEv (0xaf | P_EXT) +@@ -936,6 +937,24 @@ static void tcg_out_setcond2(TCGContext *s, const TCGArg *args, + } + #endif + ++static void tcg_out_movcond32(TCGContext *s, TCGCond cond, TCGArg dest, ++ TCGArg c1, TCGArg c2, int const_c2, ++ TCGArg v1) ++{ ++ tcg_out_cmp(s, c1, c2, const_c2, 0); ++ tcg_out_modrm(s, OPC_CMOVCC | tcg_cond_to_jcc[cond], dest, v1); ++} ++ ++#if TCG_TARGET_REG_BITS == 64 ++static void tcg_out_movcond64(TCGContext *s, TCGCond cond, TCGArg dest, ++ TCGArg c1, TCGArg c2, int const_c2, ++ TCGArg v1) ++{ ++ tcg_out_cmp(s, c1, c2, const_c2, P_REXW); ++ tcg_out_modrm(s, OPC_CMOVCC | tcg_cond_to_jcc[cond] | P_REXW, dest, v1); ++} ++#endif ++ + static void tcg_out_branch(TCGContext *s, int call, tcg_target_long dest) + { + tcg_target_long disp = dest - (tcg_target_long)s->code_ptr - 5; +@@ -1668,6 +1687,10 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + tcg_out_setcond32(s, args[3], args[0], args[1], + args[2], const_args[2]); + break; ++ case INDEX_op_movcond_i32: ++ tcg_out_movcond32(s, args[5], args[0], args[1], ++ args[2], const_args[2], args[3]); ++ break; + + OP_32_64(bswap16): + tcg_out_rolw_8(s, args[0]); +@@ -1796,6 +1819,10 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + tcg_out_setcond64(s, args[3], args[0], args[1], + args[2], const_args[2]); + break; ++ case INDEX_op_movcond_i64: ++ tcg_out_movcond64(s, args[5], args[0], args[1], ++ args[2], const_args[2], args[3]); ++ break; + + case INDEX_op_bswap64_i64: + tcg_out_bswap64(s, args[0]); +@@ -1880,6 +1907,7 @@ static const TCGTargetOpDef x86_op_defs[] = { + { INDEX_op_setcond_i32, { "q", "r", "ri" } }, + + { INDEX_op_deposit_i32, { "Q", "0", "Q" } }, ++ { INDEX_op_movcond_i32, { "r", "r", "ri", "r", "0" } }, + + #if TCG_TARGET_REG_BITS == 32 + { INDEX_op_mulu2_i32, { "a", "d", "a", "r" } }, +@@ -1934,6 +1962,7 @@ static const TCGTargetOpDef x86_op_defs[] = { + { INDEX_op_ext32u_i64, { "r", "r" } }, + + { INDEX_op_deposit_i64, { "Q", "0", "Q" } }, ++ { INDEX_op_movcond_i64, { "r", "r", "re", "r", "0" } }, + #endif + + #if TCG_TARGET_REG_BITS == 64 +diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h +index 504f953..b356d76 100644 +--- a/tcg/i386/tcg-target.h ++++ b/tcg/i386/tcg-target.h +@@ -86,7 +86,12 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 0 + #define TCG_TARGET_HAS_nor_i32 0 + #define TCG_TARGET_HAS_deposit_i32 1 ++#if defined(__x86_64__) || defined(__i686__) ++/* Use cmov only if the compiler is already doing so. */ ++#define TCG_TARGET_HAS_movcond_i32 1 ++#else + #define TCG_TARGET_HAS_movcond_i32 0 ++#endif + + #if TCG_TARGET_REG_BITS == 64 + #define TCG_TARGET_HAS_div2_i64 1 +@@ -108,7 +113,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i64 0 + #define TCG_TARGET_HAS_nor_i64 0 + #define TCG_TARGET_HAS_deposit_i64 1 +-#define TCG_TARGET_HAS_movcond_i64 0 ++#define TCG_TARGET_HAS_movcond_i64 1 + #endif + + #define TCG_TARGET_deposit_i32_valid(ofs, len) \ +-- +1.7.12.1 + diff --git a/0052-tcg-Optimize-movcond-for-constant-comparisons.patch b/0052-tcg-Optimize-movcond-for-constant-comparisons.patch new file mode 100644 index 0000000..ce0f00b --- /dev/null +++ b/0052-tcg-Optimize-movcond-for-constant-comparisons.patch @@ -0,0 +1,73 @@ +From c489b380d3f827be91b5f8b80b88585fb4014fbb Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 10:13:37 -0700 +Subject: [PATCH] tcg: Optimize movcond for constant comparisons + +Signed-off-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 40 ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 40 insertions(+) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 9da333c..26038a6 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -394,6 +394,14 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + args[3] = tcg_swap_cond(args[3]); + } + break; ++ CASE_OP_32_64(movcond): ++ if (temps[args[1]].state == TCG_TEMP_CONST ++ && temps[args[2]].state != TCG_TEMP_CONST) { ++ tmp = args[1]; ++ args[1] = args[2]; ++ args[2] = tmp; ++ args[5] = tcg_swap_cond(args[5]); ++ } + default: + break; + } +@@ -614,6 +622,38 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + } + args += 4; + break; ++ CASE_OP_32_64(movcond): ++ if (temps[args[1]].state == TCG_TEMP_CONST ++ && temps[args[2]].state == TCG_TEMP_CONST) { ++ tmp = do_constant_folding_cond(op, temps[args[1]].val, ++ temps[args[2]].val, args[5]); ++ if (args[0] == args[4-tmp] ++ || (temps[args[4-tmp]].state == TCG_TEMP_COPY ++ && temps[args[4-tmp]].val == args[0])) { ++ gen_opc_buf[op_index] = INDEX_op_nop; ++ } else if (temps[args[4-tmp]].state == TCG_TEMP_CONST) { ++ gen_opc_buf[op_index] = op_to_movi(op); ++ tcg_opt_gen_movi(gen_args, args[0], temps[args[4-tmp]].val, ++ nb_temps, nb_globals); ++ gen_args += 2; ++ } else { ++ gen_opc_buf[op_index] = op_to_mov(op); ++ tcg_opt_gen_mov(gen_args, args[0], args[4-tmp], ++ nb_temps, nb_globals); ++ gen_args += 2; ++ } ++ } else { ++ reset_temp(args[0], nb_temps, nb_globals); ++ gen_args[0] = args[0]; ++ gen_args[1] = args[1]; ++ gen_args[2] = args[2]; ++ gen_args[3] = args[3]; ++ gen_args[4] = args[4]; ++ gen_args[5] = args[5]; ++ gen_args += 6; ++ } ++ args += 6; ++ break; + case INDEX_op_call: + nb_call_args = (args[0] >> 16) + (args[0] & 0xffff); + if (!(args[nb_call_args + 1] & (TCG_CALL_CONST | TCG_CALL_PURE))) { +-- +1.7.12.1 + diff --git a/0053-tcg-Optimize-two-address-commutative-operations.patch b/0053-tcg-Optimize-two-address-commutative-operations.patch new file mode 100644 index 0000000..adacbb8 --- /dev/null +++ b/0053-tcg-Optimize-two-address-commutative-operations.patch @@ -0,0 +1,57 @@ +From af2bf6bcc6614622c87d28e9d763b57408c17500 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 10:13:38 -0700 +Subject: [PATCH] tcg: Optimize two-address commutative operations + +While swapping constants to the second operand, swap +sources matching destinations to the first operand. + +Signed-off-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 26038a6..1be7631 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -334,6 +334,8 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + const TCGOpDef *def; + TCGArg *gen_args; + TCGArg tmp; ++ TCGCond cond; ++ + /* Array VALS has an element for each temp. + If this temp holds a constant then its value is kept in VALS' element. + If this temp is a copy of other ones then this equivalence class' +@@ -395,13 +397,24 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + } + break; + CASE_OP_32_64(movcond): ++ cond = args[5]; + if (temps[args[1]].state == TCG_TEMP_CONST + && temps[args[2]].state != TCG_TEMP_CONST) { + tmp = args[1]; + args[1] = args[2]; + args[2] = tmp; +- args[5] = tcg_swap_cond(args[5]); ++ cond = tcg_swap_cond(cond); ++ } ++ /* For movcond, we canonicalize the "false" input reg to match ++ the destination reg so that the tcg backend can implement ++ a "move if true" operation. */ ++ if (args[0] == args[3]) { ++ tmp = args[3]; ++ args[3] = args[4]; ++ args[4] = tmp; ++ cond = tcg_invert_cond(cond); + } ++ args[5] = cond; + default: + break; + } +-- +1.7.12.1 + diff --git a/0054-gdbstub-sh4-fix-build-with-USE_SOFTFLOAT_STRUCT_TYPE.patch b/0054-gdbstub-sh4-fix-build-with-USE_SOFTFLOAT_STRUCT_TYPE.patch new file mode 100644 index 0000000..250f893 --- /dev/null +++ b/0054-gdbstub-sh4-fix-build-with-USE_SOFTFLOAT_STRUCT_TYPE.patch @@ -0,0 +1,192 @@ +From b6407e30c30268cdeddec6e2b115f419647cc07f Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Sun, 16 Sep 2012 13:12:21 +0200 +Subject: [PATCH] gdbstub/sh4: fix build with USE_SOFTFLOAT_STRUCT_TYPES + +We have to use different type to access float values when +USE_SOFTFLOAT_STRUCT_TYPES is defined. + +Rework SH4 version of cpu_gdb_{read,write}_register() using +a single case, and fixing the coding style. Use ldll_p() and +stfl_p() to access float values. + +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + gdbstub.c | 144 +++++++++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 90 insertions(+), 54 deletions(-) + +diff --git a/gdbstub.c b/gdbstub.c +index 5d37dd9..a91709f 100644 +--- a/gdbstub.c ++++ b/gdbstub.c +@@ -1226,33 +1226,48 @@ static int cpu_gdb_write_register(CPUOpenRISCState *env, + + static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n) + { +- if (n < 8) { ++ switch (n) { ++ case 0 ... 7: + if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) { + GET_REGL(env->gregs[n + 16]); + } else { + GET_REGL(env->gregs[n]); + } +- } else if (n < 16) { ++ case 8 ... 15: + GET_REGL(env->gregs[n]); +- } else if (n >= 25 && n < 41) { +- GET_REGL(env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)]); +- } else if (n >= 43 && n < 51) { +- GET_REGL(env->gregs[n - 43]); +- } else if (n >= 51 && n < 59) { +- GET_REGL(env->gregs[n - (51 - 16)]); +- } +- switch (n) { +- case 16: GET_REGL(env->pc); +- case 17: GET_REGL(env->pr); +- case 18: GET_REGL(env->gbr); +- case 19: GET_REGL(env->vbr); +- case 20: GET_REGL(env->mach); +- case 21: GET_REGL(env->macl); +- case 22: GET_REGL(env->sr); +- case 23: GET_REGL(env->fpul); +- case 24: GET_REGL(env->fpscr); +- case 41: GET_REGL(env->ssr); +- case 42: GET_REGL(env->spc); ++ case 16: ++ GET_REGL(env->pc); ++ case 17: ++ GET_REGL(env->pr); ++ case 18: ++ GET_REGL(env->gbr); ++ case 19: ++ GET_REGL(env->vbr); ++ case 20: ++ GET_REGL(env->mach); ++ case 21: ++ GET_REGL(env->macl); ++ case 22: ++ GET_REGL(env->sr); ++ case 23: ++ GET_REGL(env->fpul); ++ case 24: ++ GET_REGL(env->fpscr); ++ case 25 ... 40: ++ if (env->fpscr & FPSCR_FR) { ++ stfl_p(mem_buf, env->fregs[n - 9]); ++ } else { ++ stfl_p(mem_buf, env->fregs[n - 25]); ++ } ++ return 4; ++ case 41: ++ GET_REGL(env->ssr); ++ case 42: ++ GET_REGL(env->spc); ++ case 43 ... 50: ++ GET_REGL(env->gregs[n - 43]); ++ case 51 ... 58: ++ GET_REGL(env->gregs[n - (51 - 16)]); + } + + return 0; +@@ -1260,42 +1275,63 @@ static int cpu_gdb_read_register(CPUSH4State *env, uint8_t *mem_buf, int n) + + static int cpu_gdb_write_register(CPUSH4State *env, uint8_t *mem_buf, int n) + { +- uint32_t tmp; +- +- tmp = ldl_p(mem_buf); +- +- if (n < 8) { ++ switch (n) { ++ case 0 ... 7: + if ((env->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB)) { +- env->gregs[n + 16] = tmp; ++ env->gregs[n + 16] = ldl_p(mem_buf); + } else { +- env->gregs[n] = tmp; ++ env->gregs[n] = ldl_p(mem_buf); + } +- return 4; +- } else if (n < 16) { +- env->gregs[n] = tmp; +- return 4; +- } else if (n >= 25 && n < 41) { +- env->fregs[(n - 25) + ((env->fpscr & FPSCR_FR) ? 16 : 0)] = tmp; +- return 4; +- } else if (n >= 43 && n < 51) { +- env->gregs[n - 43] = tmp; +- return 4; +- } else if (n >= 51 && n < 59) { +- env->gregs[n - (51 - 16)] = tmp; +- return 4; +- } +- switch (n) { +- case 16: env->pc = tmp; break; +- case 17: env->pr = tmp; break; +- case 18: env->gbr = tmp; break; +- case 19: env->vbr = tmp; break; +- case 20: env->mach = tmp; break; +- case 21: env->macl = tmp; break; +- case 22: env->sr = tmp; break; +- case 23: env->fpul = tmp; break; +- case 24: env->fpscr = tmp; break; +- case 41: env->ssr = tmp; break; +- case 42: env->spc = tmp; break; ++ break; ++ case 8 ... 15: ++ env->gregs[n] = ldl_p(mem_buf); ++ break; ++ case 16: ++ env->pc = ldl_p(mem_buf); ++ break; ++ case 17: ++ env->pr = ldl_p(mem_buf); ++ break; ++ case 18: ++ env->gbr = ldl_p(mem_buf); ++ break; ++ case 19: ++ env->vbr = ldl_p(mem_buf); ++ break; ++ case 20: ++ env->mach = ldl_p(mem_buf); ++ break; ++ case 21: ++ env->macl = ldl_p(mem_buf); ++ break; ++ case 22: ++ env->sr = ldl_p(mem_buf); ++ break; ++ case 23: ++ env->fpul = ldl_p(mem_buf); ++ break; ++ case 24: ++ env->fpscr = ldl_p(mem_buf); ++ break; ++ case 25 ... 40: ++ if (env->fpscr & FPSCR_FR) { ++ env->fregs[n - 9] = ldfl_p(mem_buf); ++ } else { ++ env->fregs[n - 25] = ldfl_p(mem_buf); ++ } ++ break; ++ case 41: ++ env->ssr = ldl_p(mem_buf); ++ break; ++ case 42: ++ env->spc = ldl_p(mem_buf); ++ break; ++ case 43 ... 50: ++ env->gregs[n - 43] = ldl_p(mem_buf); ++ break; ++ case 51 ... 58: ++ env->gregs[n - (51 - 16)] = ldl_p(mem_buf); ++ break; + default: return 0; + } + +-- +1.7.12.1 + diff --git a/0055-tcg-Fix-USE_DIRECT_JUMP.patch b/0055-tcg-Fix-USE_DIRECT_JUMP.patch new file mode 100644 index 0000000..3f88ee8 --- /dev/null +++ b/0055-tcg-Fix-USE_DIRECT_JUMP.patch @@ -0,0 +1,35 @@ +From 03ddebf0c48dc78070c846b7cfdc2665fe7df854 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Mon, 17 Sep 2012 08:28:52 -0700 +Subject: [PATCH] tcg: Fix !USE_DIRECT_JUMP +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit 6375e09e changed the type of TranslationBlock.tb_next, +but failed to change the type of TCGContext.tb_next. + +Signed-off-by: Richard Henderson +Reviewed-by: Andreas Färber +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/tcg.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tcg/tcg.h b/tcg/tcg.h +index f454107..609ed86 100644 +--- a/tcg/tcg.h ++++ b/tcg/tcg.h +@@ -344,7 +344,7 @@ struct TCGContext { + + /* goto_tb support */ + uint8_t *code_buf; +- unsigned long *tb_next; ++ uintptr_t *tb_next; + uint16_t *tb_next_offset; + uint16_t *tb_jmp_offset; /* != NULL if USE_DIRECT_JUMP */ + +-- +1.7.12.1 + diff --git a/0056-tcg-hppa-Fix-brcond2-and-setcond2.patch b/0056-tcg-hppa-Fix-brcond2-and-setcond2.patch new file mode 100644 index 0000000..fa1f7cb --- /dev/null +++ b/0056-tcg-hppa-Fix-brcond2-and-setcond2.patch @@ -0,0 +1,108 @@ +From 3616400bc0065f7114172ad7801d9d88332ef981 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Tue, 18 Sep 2012 19:59:47 -0700 +Subject: [PATCH] tcg-hppa: Fix brcond2 and setcond2 + +Neither of these functions were performing double-word +compares properly. + +Signed-off-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/hppa/tcg-target.c | 51 ++++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 42 insertions(+), 9 deletions(-) + +diff --git a/tcg/hppa/tcg-target.c b/tcg/hppa/tcg-target.c +index 8b81b70..a76569d 100644 +--- a/tcg/hppa/tcg-target.c ++++ b/tcg/hppa/tcg-target.c +@@ -820,19 +820,34 @@ static void tcg_out_comclr(TCGContext *s, int cond, TCGArg ret, + tcg_out32(s, op); + } + ++static TCGCond const tcg_high_cond[] = { ++ [TCG_COND_EQ] = TCG_COND_EQ, ++ [TCG_COND_NE] = TCG_COND_NE, ++ [TCG_COND_LT] = TCG_COND_LT, ++ [TCG_COND_LE] = TCG_COND_LT, ++ [TCG_COND_GT] = TCG_COND_GT, ++ [TCG_COND_GE] = TCG_COND_GT, ++ [TCG_COND_LTU] = TCG_COND_LTU, ++ [TCG_COND_LEU] = TCG_COND_LTU, ++ [TCG_COND_GTU] = TCG_COND_GTU, ++ [TCG_COND_GEU] = TCG_COND_GTU ++}; ++ + static void tcg_out_brcond2(TCGContext *s, int cond, TCGArg al, TCGArg ah, + TCGArg bl, int blconst, TCGArg bh, int bhconst, + int label_index) + { + switch (cond) { + case TCG_COND_EQ: ++ tcg_out_comclr(s, TCG_COND_NE, TCG_REG_R0, al, bl, blconst); ++ tcg_out_brcond(s, TCG_COND_EQ, ah, bh, bhconst, label_index); ++ break; + case TCG_COND_NE: +- tcg_out_comclr(s, tcg_invert_cond(cond), TCG_REG_R0, al, bl, blconst); +- tcg_out_brcond(s, cond, ah, bh, bhconst, label_index); ++ tcg_out_brcond(s, TCG_COND_NE, al, bl, bhconst, label_index); ++ tcg_out_brcond(s, TCG_COND_NE, ah, bh, bhconst, label_index); + break; +- + default: +- tcg_out_brcond(s, cond, ah, bh, bhconst, label_index); ++ tcg_out_brcond(s, tcg_high_cond[cond], ah, bh, bhconst, label_index); + tcg_out_comclr(s, TCG_COND_NE, TCG_REG_R0, ah, bh, bhconst); + tcg_out_brcond(s, tcg_unsigned_cond(cond), + al, bl, blconst, label_index); +@@ -853,9 +868,8 @@ static void tcg_out_setcond2(TCGContext *s, int cond, TCGArg ret, + { + int scratch = TCG_REG_R20; + +- if (ret != al && ret != ah +- && (blconst || ret != bl) +- && (bhconst || ret != bh)) { ++ /* Note that the low parts are fully consumed before scratch is set. */ ++ if (ret != ah && (bhconst || ret != bh)) { + scratch = ret; + } + +@@ -867,13 +881,32 @@ static void tcg_out_setcond2(TCGContext *s, int cond, TCGArg ret, + tcg_out_movi(s, TCG_TYPE_I32, scratch, cond == TCG_COND_NE); + break; + +- default: ++ case TCG_COND_GE: ++ case TCG_COND_GEU: ++ case TCG_COND_LT: ++ case TCG_COND_LTU: ++ /* Optimize compares with low part zero. */ ++ if (bl == 0) { ++ tcg_out_setcond(s, cond, ret, ah, bh, bhconst); ++ return; ++ } ++ /* FALLTHRU */ ++ ++ case TCG_COND_LE: ++ case TCG_COND_LEU: ++ case TCG_COND_GT: ++ case TCG_COND_GTU: ++ /* <= : ah < bh | (ah == bh && al <= bl) */ + tcg_out_setcond(s, tcg_unsigned_cond(cond), scratch, al, bl, blconst); + tcg_out_comclr(s, TCG_COND_EQ, TCG_REG_R0, ah, bh, bhconst); + tcg_out_movi(s, TCG_TYPE_I32, scratch, 0); +- tcg_out_comclr(s, cond, TCG_REG_R0, ah, bh, bhconst); ++ tcg_out_comclr(s, tcg_invert_cond(tcg_high_cond[cond]), ++ TCG_REG_R0, ah, bh, bhconst); + tcg_out_movi(s, TCG_TYPE_I32, scratch, 1); + break; ++ ++ default: ++ tcg_abort(); + } + + tcg_out_mov(s, TCG_TYPE_I32, ret, scratch); +-- +1.7.12.1 + diff --git a/0057-tcg-hppa-Fix-broken-load-store-helpers.patch b/0057-tcg-hppa-Fix-broken-load-store-helpers.patch new file mode 100644 index 0000000..3666a95 --- /dev/null +++ b/0057-tcg-hppa-Fix-broken-load-store-helpers.patch @@ -0,0 +1,249 @@ +From c13ecfea174994d3f7f7d392f0faaed6d40efd9e Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Tue, 18 Sep 2012 19:59:48 -0700 +Subject: [PATCH] tcg-hppa: Fix broken load/store helpers + +The CONFIG_TCG_PASS_AREG0 code for calling ld/st helpers +was not respecting the ABI requirement for 64-bit values +being aligned in registers. + +Mirror the ARM port in use of helper functions to marshal +arguments into the correct registers. + +Signed-off-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/hppa/tcg-target.c | 136 +++++++++++++++++++++++++++----------------------- + 1 file changed, 74 insertions(+), 62 deletions(-) + +diff --git a/tcg/hppa/tcg-target.c b/tcg/hppa/tcg-target.c +index a76569d..5385d45 100644 +--- a/tcg/hppa/tcg-target.c ++++ b/tcg/hppa/tcg-target.c +@@ -976,10 +976,11 @@ static int tcg_out_tlb_read(TCGContext *s, int r0, int r1, int addrlo, + tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R20, r1, offset); + } + +- /* Compute the value that ought to appear in the TLB for a hit, namely, the page +- of the address. We include the low N bits of the address to catch unaligned +- accesses and force them onto the slow path. Do this computation after having +- issued the load from the TLB slot to give the load time to complete. */ ++ /* Compute the value that ought to appear in the TLB for a hit, namely, ++ the page of the address. We include the low N bits of the address ++ to catch unaligned accesses and force them onto the slow path. Do ++ this computation after having issued the load from the TLB slot to ++ give the load time to complete. */ + tcg_out_andi(s, r0, addrlo, TARGET_PAGE_MASK | ((1 << s_bits) - 1)); + + /* If not equal, jump to lab_miss. */ +@@ -992,6 +993,36 @@ static int tcg_out_tlb_read(TCGContext *s, int r0, int r1, int addrlo, + + return ret; + } ++ ++static int tcg_out_arg_reg32(TCGContext *s, int argno, TCGArg v, bool vconst) ++{ ++ if (argno < 4) { ++ if (vconst) { ++ tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[argno], v); ++ } else { ++ tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[argno], v); ++ } ++ } else { ++ if (vconst && v != 0) { ++ tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R20, v); ++ v = TCG_REG_R20; ++ } ++ tcg_out_st(s, TCG_TYPE_I32, v, TCG_REG_CALL_STACK, ++ TCG_TARGET_CALL_STACK_OFFSET - ((argno - 3) * 4)); ++ } ++ return argno + 1; ++} ++ ++static int tcg_out_arg_reg64(TCGContext *s, int argno, TCGArg vl, TCGArg vh) ++{ ++ /* 64-bit arguments must go in even reg pairs and stack slots. */ ++ if (argno & 1) { ++ argno++; ++ } ++ argno = tcg_out_arg_reg32(s, argno, vl, false); ++ argno = tcg_out_arg_reg32(s, argno, vh, false); ++ return argno; ++} + #endif + + static void tcg_out_qemu_ld_direct(TCGContext *s, int datalo_reg, int datahi_reg, +@@ -1072,39 +1103,36 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + /* Note that addrhi_reg is only used for 64-bit guests. */ + int addrhi_reg = (TARGET_LONG_BITS == 64 ? *args++ : TCG_REG_R0); + int mem_index = *args; +- int lab1, lab2, argreg, offset; ++ int lab1, lab2, argno, offset; + + lab1 = gen_new_label(); + lab2 = gen_new_label(); + + offset = offsetof(CPUArchState, tlb_table[mem_index][0].addr_read); +- offset = tcg_out_tlb_read(s, TCG_REG_R26, TCG_REG_R25, addrlo_reg, addrhi_reg, +- opc & 3, lab1, offset); ++ offset = tcg_out_tlb_read(s, TCG_REG_R26, TCG_REG_R25, addrlo_reg, ++ addrhi_reg, opc & 3, lab1, offset); + + /* TLB Hit. */ +- tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R20, (offset ? TCG_REG_R1 : TCG_REG_R25), ++ tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R20, ++ (offset ? TCG_REG_R1 : TCG_REG_R25), + offsetof(CPUArchState, tlb_table[mem_index][0].addend) - offset); +- tcg_out_qemu_ld_direct(s, datalo_reg, datahi_reg, addrlo_reg, TCG_REG_R20, opc); ++ tcg_out_qemu_ld_direct(s, datalo_reg, datahi_reg, addrlo_reg, ++ TCG_REG_R20, opc); + tcg_out_branch(s, lab2, 1); + + /* TLB Miss. */ + /* label1: */ + tcg_out_label(s, lab1, s->code_ptr); + +- argreg = TCG_REG_R26; +- tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrlo_reg); ++ argno = 0; ++ argno = tcg_out_arg_reg32(s, argno, TCG_AREG0, false); + if (TARGET_LONG_BITS == 64) { +- tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrhi_reg); ++ argno = tcg_out_arg_reg64(s, argno, addrlo_reg, addrhi_reg); ++ } else { ++ argno = tcg_out_arg_reg32(s, argno, addrlo_reg, false); + } +- tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); +- +- /* XXX/FIXME: suboptimal */ +- tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[2], +- tcg_target_call_iarg_regs[1]); +- tcg_out_mov(s, TCG_TYPE_TL, tcg_target_call_iarg_regs[1], +- tcg_target_call_iarg_regs[0]); +- tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], +- TCG_AREG0); ++ argno = tcg_out_arg_reg32(s, argno, mem_index, true); ++ + tcg_out_call(s, qemu_ld_helpers[opc & 3]); + + switch (opc) { +@@ -1140,8 +1168,8 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int opc) + #endif + } + +-static void tcg_out_qemu_st_direct(TCGContext *s, int datalo_reg, int datahi_reg, +- int addr_reg, int opc) ++static void tcg_out_qemu_st_direct(TCGContext *s, int datalo_reg, ++ int datahi_reg, int addr_reg, int opc) + { + #ifdef TARGET_WORDS_BIGENDIAN + const int bswap = 0; +@@ -1194,17 +1222,18 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) + /* Note that addrhi_reg is only used for 64-bit guests. */ + int addrhi_reg = (TARGET_LONG_BITS == 64 ? *args++ : TCG_REG_R0); + int mem_index = *args; +- int lab1, lab2, argreg, offset; ++ int lab1, lab2, argno, next, offset; + + lab1 = gen_new_label(); + lab2 = gen_new_label(); + + offset = offsetof(CPUArchState, tlb_table[mem_index][0].addr_write); +- offset = tcg_out_tlb_read(s, TCG_REG_R26, TCG_REG_R25, addrlo_reg, addrhi_reg, +- opc, lab1, offset); ++ offset = tcg_out_tlb_read(s, TCG_REG_R26, TCG_REG_R25, addrlo_reg, ++ addrhi_reg, opc, lab1, offset); + + /* TLB Hit. */ +- tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R20, (offset ? TCG_REG_R1 : TCG_REG_R25), ++ tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R20, ++ (offset ? TCG_REG_R1 : TCG_REG_R25), + offsetof(CPUArchState, tlb_table[mem_index][0].addend) - offset); + + /* There are no indexed stores, so we must do this addition explitly. +@@ -1217,63 +1246,46 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int opc) + /* label1: */ + tcg_out_label(s, lab1, s->code_ptr); + +- argreg = TCG_REG_R26; +- tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrlo_reg); ++ argno = 0; ++ argno = tcg_out_arg_reg32(s, argno, TCG_AREG0, false); + if (TARGET_LONG_BITS == 64) { +- tcg_out_mov(s, TCG_TYPE_I32, argreg--, addrhi_reg); ++ argno = tcg_out_arg_reg64(s, argno, addrlo_reg, addrhi_reg); ++ } else { ++ argno = tcg_out_arg_reg32(s, argno, addrlo_reg, false); + } + ++ next = (argno < 4 ? tcg_target_call_iarg_regs[argno] : TCG_REG_R20); + switch(opc) { + case 0: +- tcg_out_andi(s, argreg--, datalo_reg, 0xff); +- tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); ++ tcg_out_andi(s, next, datalo_reg, 0xff); ++ argno = tcg_out_arg_reg32(s, argno, next, false); + break; + case 1: +- tcg_out_andi(s, argreg--, datalo_reg, 0xffff); +- tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); ++ tcg_out_andi(s, next, datalo_reg, 0xffff); ++ argno = tcg_out_arg_reg32(s, argno, next, false); + break; + case 2: +- tcg_out_mov(s, TCG_TYPE_I32, argreg--, datalo_reg); +- tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); ++ argno = tcg_out_arg_reg32(s, argno, datalo_reg, false); + break; + case 3: +- /* Because of the alignment required by the 64-bit data argument, +- we will always use R23/R24. Also, we will always run out of +- argument registers for storing mem_index, so that will have +- to go on the stack. */ +- if (mem_index == 0) { +- argreg = TCG_REG_R0; +- } else { +- argreg = TCG_REG_R20; +- tcg_out_movi(s, TCG_TYPE_I32, argreg, mem_index); +- } +- tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_R23, datahi_reg); +- tcg_out_mov(s, TCG_TYPE_I32, TCG_REG_R24, datalo_reg); +- tcg_out_st(s, TCG_TYPE_I32, argreg, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - 4); ++ argno = tcg_out_arg_reg64(s, argno, datalo_reg, datahi_reg); + break; + default: + tcg_abort(); + } ++ argno = tcg_out_arg_reg32(s, argno, mem_index, true); + +- /* XXX/FIXME: suboptimal */ +- tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3], +- tcg_target_call_iarg_regs[2]); +- tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[2], +- tcg_target_call_iarg_regs[1]); +- tcg_out_mov(s, TCG_TYPE_TL, tcg_target_call_iarg_regs[1], +- tcg_target_call_iarg_regs[0]); +- tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], +- TCG_AREG0); + tcg_out_call(s, qemu_st_helpers[opc]); + + /* label2: */ + tcg_out_label(s, lab2, s->code_ptr); + #else +- /* There are no indexed stores, so if GUEST_BASE is set we must do the add +- explicitly. Careful to avoid R20, which is used for the bswaps to follow. */ ++ /* There are no indexed stores, so if GUEST_BASE is set we must do ++ the add explicitly. Careful to avoid R20, which is used for the ++ bswaps to follow. */ + if (GUEST_BASE != 0) { +- tcg_out_arith(s, TCG_REG_R31, addrlo_reg, TCG_GUEST_BASE_REG, INSN_ADDL); ++ tcg_out_arith(s, TCG_REG_R31, addrlo_reg, ++ TCG_GUEST_BASE_REG, INSN_ADDL); + addrlo_reg = TCG_REG_R31; + } + tcg_out_qemu_st_direct(s, datalo_reg, datahi_reg, addrlo_reg, opc); +-- +1.7.12.1 + diff --git a/0058-tcg-mips-fix-wrong-usage-of-Z-constraint.patch b/0058-tcg-mips-fix-wrong-usage-of-Z-constraint.patch new file mode 100644 index 0000000..a4e1059 --- /dev/null +++ b/0058-tcg-mips-fix-wrong-usage-of-Z-constraint.patch @@ -0,0 +1,65 @@ +From 061d22ad76512e8ec10af89eda1dcc7c185360d2 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:25 +0200 +Subject: [PATCH] tcg-mips: fix wrong usage of 'Z' constraint + +The 'Z' constraint has been introduced to map the zero register. However +when the op also accept a constant, there is no point to accept the zero +register in addition. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index 74db83d..9293745 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -1453,24 +1453,24 @@ static const TCGTargetOpDef mips_op_defs[] = { + { INDEX_op_st16_i32, { "rZ", "r" } }, + { INDEX_op_st_i32, { "rZ", "r" } }, + +- { INDEX_op_add_i32, { "r", "rZ", "rJZ" } }, ++ { INDEX_op_add_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_mul_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_mulu2_i32, { "r", "r", "rZ", "rZ" } }, + { INDEX_op_div_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_divu_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_rem_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_remu_i32, { "r", "rZ", "rZ" } }, +- { INDEX_op_sub_i32, { "r", "rZ", "rJZ" } }, ++ { INDEX_op_sub_i32, { "r", "rZ", "rJ" } }, + +- { INDEX_op_and_i32, { "r", "rZ", "rIZ" } }, ++ { INDEX_op_and_i32, { "r", "rZ", "rI" } }, + { INDEX_op_nor_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_not_i32, { "r", "rZ" } }, + { INDEX_op_or_i32, { "r", "rZ", "rIZ" } }, + { INDEX_op_xor_i32, { "r", "rZ", "rIZ" } }, + +- { INDEX_op_shl_i32, { "r", "rZ", "riZ" } }, +- { INDEX_op_shr_i32, { "r", "rZ", "riZ" } }, +- { INDEX_op_sar_i32, { "r", "rZ", "riZ" } }, ++ { INDEX_op_shl_i32, { "r", "rZ", "ri" } }, ++ { INDEX_op_shr_i32, { "r", "rZ", "ri" } }, ++ { INDEX_op_sar_i32, { "r", "rZ", "ri" } }, + + { INDEX_op_ext8s_i32, { "r", "rZ" } }, + { INDEX_op_ext16s_i32, { "r", "rZ" } }, +@@ -1479,8 +1479,8 @@ static const TCGTargetOpDef mips_op_defs[] = { + { INDEX_op_setcond_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_setcond2_i32, { "r", "rZ", "rZ", "rZ", "rZ" } }, + +- { INDEX_op_add2_i32, { "r", "r", "rZ", "rZ", "rJZ", "rJZ" } }, +- { INDEX_op_sub2_i32, { "r", "r", "rZ", "rZ", "rJZ", "rJZ" } }, ++ { INDEX_op_add2_i32, { "r", "r", "rZ", "rZ", "rJ", "rJ" } }, ++ { INDEX_op_sub2_i32, { "r", "r", "rZ", "rZ", "rJ", "rJ" } }, + { INDEX_op_brcond2_i32, { "rZ", "rZ", "rZ", "rZ" } }, + + #if TARGET_LONG_BITS == 32 +-- +1.7.12.1 + diff --git a/0059-tcg-mips-kill-warnings-in-user-mode.patch b/0059-tcg-mips-kill-warnings-in-user-mode.patch new file mode 100644 index 0000000..96de9cb --- /dev/null +++ b/0059-tcg-mips-kill-warnings-in-user-mode.patch @@ -0,0 +1,166 @@ +From e63a3c6c70c9933320c6d8b23c3ea4cf4724d316 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:25 +0200 +Subject: [PATCH] tcg/mips: kill warnings in user mode + +Recent versions of GCC emit warnings when compiling user mode targets. +Kill them by reordering a bit the #ifdef. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 84 ++++++++++++++++++++++++++------------------------- + 1 file changed, 43 insertions(+), 41 deletions(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index 9293745..a09c0d6 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -842,18 +842,16 @@ static const void * const qemu_st_helpers[4] = { + static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + int opc) + { +- int addr_regl, addr_meml; +- int data_regl, data_regh, data_reg1, data_reg2; +- int mem_index, s_bits; ++ int addr_regl, data_regl, data_regh, data_reg1, data_reg2; + #if defined(CONFIG_SOFTMMU) + void *label1_ptr, *label2_ptr; + int arg_num; +-#endif +-#if TARGET_LONG_BITS == 64 +-# if defined(CONFIG_SOFTMMU) ++ int mem_index, s_bits; ++ int addr_meml; ++# if TARGET_LONG_BITS == 64 + uint8_t *label3_ptr; +-# endif + int addr_regh, addr_memh; ++# endif + #endif + data_regl = *args++; + if (opc == 3) +@@ -861,11 +859,22 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + else + data_regh = 0; + addr_regl = *args++; +-#if TARGET_LONG_BITS == 64 ++#if defined(CONFIG_SOFTMMU) ++# if TARGET_LONG_BITS == 64 + addr_regh = *args++; +-#endif ++# if defined(TCG_TARGET_WORDS_BIGENDIAN) ++ addr_memh = 0; ++ addr_meml = 4; ++# else ++ addr_memh = 4; ++ addr_meml = 0; ++# endif ++# else ++ addr_meml = 0; ++# endif + mem_index = *args; + s_bits = opc & 3; ++#endif + + if (opc == 3) { + #if defined(TCG_TARGET_WORDS_BIGENDIAN) +@@ -879,18 +888,6 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + data_reg1 = data_regl; + data_reg2 = 0; + } +-#if TARGET_LONG_BITS == 64 +-# if defined(TCG_TARGET_WORDS_BIGENDIAN) +- addr_memh = 0; +- addr_meml = 4; +-# else +- addr_memh = 4; +- addr_meml = 0; +-# endif +-#else +- addr_meml = 0; +-#endif +- + #if defined(CONFIG_SOFTMMU) + tcg_out_opc_sa(s, OPC_SRL, TCG_REG_A0, addr_regl, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); + tcg_out_opc_imm(s, OPC_ANDI, TCG_REG_A0, TCG_REG_A0, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); +@@ -1029,50 +1026,55 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + int opc) + { +- int addr_regl, addr_meml; +- int data_regl, data_regh, data_reg1, data_reg2; +- int mem_index, s_bits; ++ int addr_regl, data_regl, data_regh, data_reg1, data_reg2; + #if defined(CONFIG_SOFTMMU) + uint8_t *label1_ptr, *label2_ptr; + int arg_num; ++ int mem_index, s_bits; ++ int addr_meml; + #endif + #if TARGET_LONG_BITS == 64 + # if defined(CONFIG_SOFTMMU) + uint8_t *label3_ptr; +-# endif + int addr_regh, addr_memh; ++# endif + #endif +- + data_regl = *args++; + if (opc == 3) { + data_regh = *args++; +-#if defined(TCG_TARGET_WORDS_BIGENDIAN) +- data_reg1 = data_regh; +- data_reg2 = data_regl; +-#else +- data_reg1 = data_regl; +- data_reg2 = data_regh; +-#endif + } else { +- data_reg1 = data_regl; +- data_reg2 = 0; + data_regh = 0; + } + addr_regl = *args++; +-#if TARGET_LONG_BITS == 64 ++#if defined(CONFIG_SOFTMMU) ++# if TARGET_LONG_BITS == 64 + addr_regh = *args++; +-# if defined(TCG_TARGET_WORDS_BIGENDIAN) ++# if defined(TCG_TARGET_WORDS_BIGENDIAN) + addr_memh = 0; + addr_meml = 4; +-# else ++# else + addr_memh = 4; + addr_meml = 0; +-# endif +-#else ++# endif ++# else + addr_meml = 0; +-#endif ++# endif + mem_index = *args; + s_bits = opc; ++#endif ++ ++ if (opc == 3) { ++#if defined(TCG_TARGET_WORDS_BIGENDIAN) ++ data_reg1 = data_regh; ++ data_reg2 = data_regl; ++#else ++ data_reg1 = data_regl; ++ data_reg2 = data_regh; ++#endif ++ } else { ++ data_reg1 = data_regl; ++ data_reg2 = 0; ++ } + + #if defined(CONFIG_SOFTMMU) + tcg_out_opc_sa(s, OPC_SRL, TCG_REG_A0, addr_regl, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); +-- +1.7.12.1 + diff --git a/0060-tcg-mips-use-TCGArg-or-TCGReg-instead-of-int.patch b/0060-tcg-mips-use-TCGArg-or-TCGReg-instead-of-int.patch new file mode 100644 index 0000000..a6eb42f --- /dev/null +++ b/0060-tcg-mips-use-TCGArg-or-TCGReg-instead-of-int.patch @@ -0,0 +1,246 @@ +From 7b817977fbb87ee2e34018d92b64907197974a75 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:26 +0200 +Subject: [PATCH] tcg/mips: use TCGArg or TCGReg instead of int + +Instead of int, use the correct TCGArg and TCGReg type: TCGReg when +representing a TCG target register, TCGArg when representing the latter +or a constant. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 63 ++++++++++++++++++++++++++++----------------------- + 1 file changed, 35 insertions(+), 28 deletions(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index a09c0d6..8b38f98 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -68,7 +68,7 @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + #endif + + /* check if we really need so many registers :P */ +-static const int tcg_target_reg_alloc_order[] = { ++static const TCGReg tcg_target_reg_alloc_order[] = { + TCG_REG_S0, + TCG_REG_S1, + TCG_REG_S2, +@@ -94,14 +94,14 @@ static const int tcg_target_reg_alloc_order[] = { + TCG_REG_V1 + }; + +-static const int tcg_target_call_iarg_regs[4] = { ++static const TCGReg tcg_target_call_iarg_regs[4] = { + TCG_REG_A0, + TCG_REG_A1, + TCG_REG_A2, + TCG_REG_A3 + }; + +-static const int tcg_target_call_oarg_regs[2] = { ++static const TCGReg tcg_target_call_oarg_regs[2] = { + TCG_REG_V0, + TCG_REG_V1 + }; +@@ -327,7 +327,8 @@ enum { + /* + * Type reg + */ +-static inline void tcg_out_opc_reg(TCGContext *s, int opc, int rd, int rs, int rt) ++static inline void tcg_out_opc_reg(TCGContext *s, int opc, ++ TCGReg rd, TCGReg rs, TCGReg rt) + { + int32_t inst; + +@@ -341,7 +342,8 @@ static inline void tcg_out_opc_reg(TCGContext *s, int opc, int rd, int rs, int r + /* + * Type immediate + */ +-static inline void tcg_out_opc_imm(TCGContext *s, int opc, int rt, int rs, int imm) ++static inline void tcg_out_opc_imm(TCGContext *s, int opc, ++ TCGReg rt, TCGReg rs, TCGArg imm) + { + int32_t inst; + +@@ -355,7 +357,8 @@ static inline void tcg_out_opc_imm(TCGContext *s, int opc, int rt, int rs, int i + /* + * Type branch + */ +-static inline void tcg_out_opc_br(TCGContext *s, int opc, int rt, int rs) ++static inline void tcg_out_opc_br(TCGContext *s, int opc, ++ TCGReg rt, TCGReg rs) + { + /* We pay attention here to not modify the branch target by reading + the existing value and using it again. This ensure that caches and +@@ -368,7 +371,8 @@ static inline void tcg_out_opc_br(TCGContext *s, int opc, int rt, int rs) + /* + * Type sa + */ +-static inline void tcg_out_opc_sa(TCGContext *s, int opc, int rd, int rt, int sa) ++static inline void tcg_out_opc_sa(TCGContext *s, int opc, ++ TCGReg rd, TCGReg rt, TCGArg sa) + { + int32_t inst; + +@@ -407,7 +411,7 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, + } + } + +-static inline void tcg_out_bswap16(TCGContext *s, int ret, int arg) ++static inline void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg) + { + /* ret and arg can't be register at */ + if (ret == TCG_REG_AT || arg == TCG_REG_AT) { +@@ -422,7 +426,7 @@ static inline void tcg_out_bswap16(TCGContext *s, int ret, int arg) + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_REG_AT); + } + +-static inline void tcg_out_bswap16s(TCGContext *s, int ret, int arg) ++static inline void tcg_out_bswap16s(TCGContext *s, TCGReg ret, TCGReg arg) + { + /* ret and arg can't be register at */ + if (ret == TCG_REG_AT || arg == TCG_REG_AT) { +@@ -437,7 +441,7 @@ static inline void tcg_out_bswap16s(TCGContext *s, int ret, int arg) + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_REG_AT); + } + +-static inline void tcg_out_bswap32(TCGContext *s, int ret, int arg) ++static inline void tcg_out_bswap32(TCGContext *s, TCGReg ret, TCGReg arg) + { + /* ret and arg must be different and can't be register at */ + if (ret == arg || ret == TCG_REG_AT || arg == TCG_REG_AT) { +@@ -458,7 +462,7 @@ static inline void tcg_out_bswap32(TCGContext *s, int ret, int arg) + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_REG_AT); + } + +-static inline void tcg_out_ext8s(TCGContext *s, int ret, int arg) ++static inline void tcg_out_ext8s(TCGContext *s, TCGReg ret, TCGReg arg) + { + #ifdef _MIPS_ARCH_MIPS32R2 + tcg_out_opc_reg(s, OPC_SEB, ret, 0, arg); +@@ -468,7 +472,7 @@ static inline void tcg_out_ext8s(TCGContext *s, int ret, int arg) + #endif + } + +-static inline void tcg_out_ext16s(TCGContext *s, int ret, int arg) ++static inline void tcg_out_ext16s(TCGContext *s, TCGReg ret, TCGReg arg) + { + #ifdef _MIPS_ARCH_MIPS32R2 + tcg_out_opc_reg(s, OPC_SEH, ret, 0, arg); +@@ -478,8 +482,8 @@ static inline void tcg_out_ext16s(TCGContext *s, int ret, int arg) + #endif + } + +-static inline void tcg_out_ldst(TCGContext *s, int opc, int arg, +- int arg1, tcg_target_long arg2) ++static inline void tcg_out_ldst(TCGContext *s, int opc, TCGArg arg, ++ TCGReg arg1, TCGArg arg2) + { + if (arg2 == (int16_t) arg2) { + tcg_out_opc_imm(s, opc, arg, arg1, arg2); +@@ -502,7 +506,7 @@ static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + tcg_out_ldst(s, OPC_SW, arg, arg1, arg2); + } + +-static inline void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val) ++static inline void tcg_out_addi(TCGContext *s, TCGReg reg, TCGArg val) + { + if (val == (int16_t)val) { + tcg_out_opc_imm(s, OPC_ADDIU, reg, reg, val); +@@ -543,7 +547,7 @@ DEFINE_TCG_OUT_CALL_IARG(tcg_out_call_iarg_reg16, TCGReg arg) + #undef DEFINE_TCG_OUT_CALL_IARG_GET_ARG + #define DEFINE_TCG_OUT_CALL_IARG_GET_ARG(A) \ + tcg_out_movi(s, TCG_TYPE_I32, A, arg); +-DEFINE_TCG_OUT_CALL_IARG(tcg_out_call_iarg_imm32, uint32_t arg) ++DEFINE_TCG_OUT_CALL_IARG(tcg_out_call_iarg_imm32, TCGArg arg) + #undef DEFINE_TCG_OUT_CALL_IARG_GET_ARG + + /* We don't use the macro for this one to avoid an unnecessary reg-reg +@@ -573,8 +577,8 @@ static inline void tcg_out_call_iarg_reg64(TCGContext *s, int *arg_num, + #endif + } + +-static void tcg_out_brcond(TCGContext *s, TCGCond cond, int arg1, +- int arg2, int label_index) ++static void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGArg arg1, ++ TCGArg arg2, int label_index) + { + TCGLabel *l = &s->labels[label_index]; + +@@ -631,8 +635,9 @@ static void tcg_out_brcond(TCGContext *s, TCGCond cond, int arg1, + + /* XXX: we implement it at the target level to avoid having to + handle cross basic blocks temporaries */ +-static void tcg_out_brcond2(TCGContext *s, TCGCond cond, int arg1, +- int arg2, int arg3, int arg4, int label_index) ++static void tcg_out_brcond2(TCGContext *s, TCGCond cond, TCGArg arg1, ++ TCGArg arg2, TCGArg arg3, TCGArg arg4, ++ int label_index) + { + void *label_ptr; + +@@ -694,8 +699,8 @@ static void tcg_out_brcond2(TCGContext *s, TCGCond cond, int arg1, + reloc_pc16(label_ptr, (tcg_target_long) s->code_ptr); + } + +-static void tcg_out_setcond(TCGContext *s, TCGCond cond, int ret, +- int arg1, int arg2) ++static void tcg_out_setcond(TCGContext *s, TCGCond cond, TCGReg ret, ++ TCGArg arg1, TCGArg arg2) + { + switch (cond) { + case TCG_COND_EQ: +@@ -754,8 +759,8 @@ static void tcg_out_setcond(TCGContext *s, TCGCond cond, int ret, + + /* XXX: we implement it at the target level to avoid having to + handle cross basic blocks temporaries */ +-static void tcg_out_setcond2(TCGContext *s, TCGCond cond, int ret, +- int arg1, int arg2, int arg3, int arg4) ++static void tcg_out_setcond2(TCGContext *s, TCGCond cond, TCGReg ret, ++ TCGArg arg1, TCGArg arg2, TCGArg arg3, TCGArg arg4) + { + switch (cond) { + case TCG_COND_EQ: +@@ -842,7 +847,7 @@ static const void * const qemu_st_helpers[4] = { + static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + int opc) + { +- int addr_regl, data_regl, data_regh, data_reg1, data_reg2; ++ TCGReg addr_regl, data_regl, data_regh, data_reg1, data_reg2; + #if defined(CONFIG_SOFTMMU) + void *label1_ptr, *label2_ptr; + int arg_num; +@@ -850,7 +855,8 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + int addr_meml; + # if TARGET_LONG_BITS == 64 + uint8_t *label3_ptr; +- int addr_regh, addr_memh; ++ TCGReg addr_regh; ++ int addr_memh; + # endif + #endif + data_regl = *args++; +@@ -1026,7 +1032,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, + static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + int opc) + { +- int addr_regl, data_regl, data_regh, data_reg1, data_reg2; ++ TCGReg addr_regl, data_regl, data_regh, data_reg1, data_reg2; + #if defined(CONFIG_SOFTMMU) + uint8_t *label1_ptr, *label2_ptr; + int arg_num; +@@ -1036,7 +1042,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + #if TARGET_LONG_BITS == 64 + # if defined(CONFIG_SOFTMMU) + uint8_t *label3_ptr; +- int addr_regh, addr_memh; ++ TCGReg addr_regh; ++ int addr_memh; + # endif + #endif + data_regl = *args++; +-- +1.7.12.1 + diff --git a/0061-tcg-mips-don-t-use-global-pointer.patch b/0061-tcg-mips-don-t-use-global-pointer.patch new file mode 100644 index 0000000..a9aaf69 --- /dev/null +++ b/0061-tcg-mips-don-t-use-global-pointer.patch @@ -0,0 +1,37 @@ +From 9a4f545e4526f946613548a427fcab4c2a089ac0 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:26 +0200 +Subject: [PATCH] tcg/mips: don't use global pointer + +Don't use the global pointer in TCG, in case helpers try access global +variables. + +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index 8b38f98..0ea6a76 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -1529,7 +1529,6 @@ static int tcg_target_callee_save_regs[] = { + TCG_REG_S5, + TCG_REG_S6, + TCG_REG_S7, +- TCG_REG_GP, + TCG_REG_FP, + TCG_REG_RA, /* should be last for ABI compliance */ + }; +@@ -1595,6 +1594,7 @@ static void tcg_target_init(TCGContext *s) + tcg_regset_set_reg(s->reserved_regs, TCG_REG_T0); /* internal use */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_RA); /* return address */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_SP); /* stack pointer */ ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_GP); /* global pointer */ + + tcg_add_target_add_op_defs(mips_op_defs); + tcg_set_frame(s, TCG_AREG0, offsetof(CPUArchState, temp_buf), +-- +1.7.12.1 + diff --git a/0062-tcg-mips-use-stack-for-TCG-temps.patch b/0062-tcg-mips-use-stack-for-TCG-temps.patch new file mode 100644 index 0000000..09ea3fb --- /dev/null +++ b/0062-tcg-mips-use-stack-for-TCG-temps.patch @@ -0,0 +1,47 @@ +From c914ae50df4dc2f2ab589c87c0cd2ce2f14d9639 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:26 +0200 +Subject: [PATCH] tcg/mips: use stack for TCG temps + +Use stack instead of temp_buf array in CPUState for TCG +temps. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index 0ea6a76..c05169f 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -1538,11 +1538,15 @@ static void tcg_target_qemu_prologue(TCGContext *s) + { + int i, frame_size; + +- /* reserve some stack space */ ++ /* reserve some stack space, also for TCG temps. */ + frame_size = ARRAY_SIZE(tcg_target_callee_save_regs) * 4 +- + TCG_STATIC_CALL_ARGS_SIZE; ++ + TCG_STATIC_CALL_ARGS_SIZE ++ + CPU_TEMP_BUF_NLONGS * sizeof(long); + frame_size = (frame_size + TCG_TARGET_STACK_ALIGN - 1) & + ~(TCG_TARGET_STACK_ALIGN - 1); ++ tcg_set_frame(s, TCG_REG_SP, ARRAY_SIZE(tcg_target_callee_save_regs) * 4 ++ + TCG_STATIC_CALL_ARGS_SIZE, ++ CPU_TEMP_BUF_NLONGS * sizeof(long)); + + /* TB prologue */ + tcg_out_addi(s, TCG_REG_SP, -frame_size); +@@ -1597,6 +1601,4 @@ static void tcg_target_init(TCGContext *s) + tcg_regset_set_reg(s->reserved_regs, TCG_REG_GP); /* global pointer */ + + tcg_add_target_add_op_defs(mips_op_defs); +- tcg_set_frame(s, TCG_AREG0, offsetof(CPUArchState, temp_buf), +- CPU_TEMP_BUF_NLONGS * sizeof(long)); + } +-- +1.7.12.1 + diff --git a/0063-tcg-mips-optimize-brcond-arg-0.patch b/0063-tcg-mips-optimize-brcond-arg-0.patch new file mode 100644 index 0000000..e21fcac --- /dev/null +++ b/0063-tcg-mips-optimize-brcond-arg-0.patch @@ -0,0 +1,99 @@ +From e30cf829e9d8200364b53b9189c76d2155a32876 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:26 +0200 +Subject: [PATCH] tcg/mips: optimize brcond arg, 0 + +MIPS has some conditional branch instructions when comparing with zero. +Use them. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 38 ++++++++++++++++++++++++++++++-------- + 1 file changed, 30 insertions(+), 8 deletions(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index c05169f..6aa4527 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -278,6 +278,8 @@ static inline int tcg_target_const_match(tcg_target_long val, + enum { + OPC_BEQ = 0x04 << 26, + OPC_BNE = 0x05 << 26, ++ OPC_BLEZ = 0x06 << 26, ++ OPC_BGTZ = 0x07 << 26, + OPC_ADDIU = 0x09 << 26, + OPC_SLTI = 0x0A << 26, + OPC_SLTIU = 0x0B << 26, +@@ -319,6 +321,10 @@ enum { + OPC_SLT = OPC_SPECIAL | 0x2A, + OPC_SLTU = OPC_SPECIAL | 0x2B, + ++ OPC_REGIMM = 0x01 << 26, ++ OPC_BLTZ = OPC_REGIMM | (0x00 << 16), ++ OPC_BGEZ = OPC_REGIMM | (0x01 << 16), ++ + OPC_SPECIAL3 = 0x1f << 26, + OPC_SEB = OPC_SPECIAL3 | 0x420, + OPC_SEH = OPC_SPECIAL3 | 0x620, +@@ -590,32 +596,48 @@ static void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGArg arg1, + tcg_out_opc_br(s, OPC_BNE, arg1, arg2); + break; + case TCG_COND_LT: +- tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, arg1, arg2); +- tcg_out_opc_br(s, OPC_BNE, TCG_REG_AT, TCG_REG_ZERO); ++ if (arg2 == 0) { ++ tcg_out_opc_br(s, OPC_BLTZ, 0, arg1); ++ } else { ++ tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, arg1, arg2); ++ tcg_out_opc_br(s, OPC_BNE, TCG_REG_AT, TCG_REG_ZERO); ++ } + break; + case TCG_COND_LTU: + tcg_out_opc_reg(s, OPC_SLTU, TCG_REG_AT, arg1, arg2); + tcg_out_opc_br(s, OPC_BNE, TCG_REG_AT, TCG_REG_ZERO); + break; + case TCG_COND_GE: +- tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, arg1, arg2); +- tcg_out_opc_br(s, OPC_BEQ, TCG_REG_AT, TCG_REG_ZERO); ++ if (arg2 == 0) { ++ tcg_out_opc_br(s, OPC_BGEZ, 0, arg1); ++ } else { ++ tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, arg1, arg2); ++ tcg_out_opc_br(s, OPC_BEQ, TCG_REG_AT, TCG_REG_ZERO); ++ } + break; + case TCG_COND_GEU: + tcg_out_opc_reg(s, OPC_SLTU, TCG_REG_AT, arg1, arg2); + tcg_out_opc_br(s, OPC_BEQ, TCG_REG_AT, TCG_REG_ZERO); + break; + case TCG_COND_LE: +- tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, arg2, arg1); +- tcg_out_opc_br(s, OPC_BEQ, TCG_REG_AT, TCG_REG_ZERO); ++ if (arg2 == 0) { ++ tcg_out_opc_br(s, OPC_BLEZ, 0, arg1); ++ } else { ++ tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, arg2, arg1); ++ tcg_out_opc_br(s, OPC_BEQ, TCG_REG_AT, TCG_REG_ZERO); ++ } + break; + case TCG_COND_LEU: + tcg_out_opc_reg(s, OPC_SLTU, TCG_REG_AT, arg2, arg1); + tcg_out_opc_br(s, OPC_BEQ, TCG_REG_AT, TCG_REG_ZERO); + break; + case TCG_COND_GT: +- tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, arg2, arg1); +- tcg_out_opc_br(s, OPC_BNE, TCG_REG_AT, TCG_REG_ZERO); ++ if (arg2 == 0) { ++ tcg_out_opc_br(s, OPC_BGTZ, 0, arg1); ++ } else { ++ tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, arg2, arg1); ++ tcg_out_opc_br(s, OPC_BNE, TCG_REG_AT, TCG_REG_ZERO); ++ } + break; + case TCG_COND_GTU: + tcg_out_opc_reg(s, OPC_SLTU, TCG_REG_AT, arg2, arg1); +-- +1.7.12.1 + diff --git a/0064-tcg-mips-optimize-bswap-16-16s-32-on-MIPS32R2.patch b/0064-tcg-mips-optimize-bswap-16-16s-32-on-MIPS32R2.patch new file mode 100644 index 0000000..45a881d --- /dev/null +++ b/0064-tcg-mips-optimize-bswap-16-16s-32-on-MIPS32R2.patch @@ -0,0 +1,161 @@ +From 879794c3d3974b1206bbc52011c8f2525709f396 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:26 +0200 +Subject: [PATCH] tcg/mips: optimize bswap{16,16s,32} on MIPS32R2 + +bswap operations can be optimized on MIPS32 Release 2 using the ROTR, +WSBH and SEH instructions. We can't use the non-R2 code to implement the +ops due to registers constraints, so don't define the corresponding +TCG_TARGET_HAS_bswap* values. + +Also bswap16* operations are supposed to be called with the 16 high bits +zeroed. This is the case everywhere (including for TCG by definition) +except when called from the store helper. Remove the AND instructions from +bswap16* and move it there. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 34 +++++++++++++++++++++++++++++----- + tcg/mips/tcg-target.h | 11 +++++++++-- + 2 files changed, 38 insertions(+), 7 deletions(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index 6aa4527..8b2f9fc 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -326,6 +326,7 @@ enum { + OPC_BGEZ = OPC_REGIMM | (0x01 << 16), + + OPC_SPECIAL3 = 0x1f << 26, ++ OPC_WSBH = OPC_SPECIAL3 | 0x0a0, + OPC_SEB = OPC_SPECIAL3 | 0x420, + OPC_SEH = OPC_SPECIAL3 | 0x620, + }; +@@ -419,36 +420,45 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, + + static inline void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg) + { ++#ifdef _MIPS_ARCH_MIPS32R2 ++ tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); ++#else + /* ret and arg can't be register at */ + if (ret == TCG_REG_AT || arg == TCG_REG_AT) { + tcg_abort(); + } + + tcg_out_opc_sa(s, OPC_SRL, TCG_REG_AT, arg, 8); +- tcg_out_opc_imm(s, OPC_ANDI, TCG_REG_AT, TCG_REG_AT, 0x00ff); +- + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 8); + tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xff00); + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_REG_AT); ++#endif + } + + static inline void tcg_out_bswap16s(TCGContext *s, TCGReg ret, TCGReg arg) + { ++#ifdef _MIPS_ARCH_MIPS32R2 ++ tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); ++ tcg_out_opc_reg(s, OPC_SEH, ret, 0, ret); ++#else + /* ret and arg can't be register at */ + if (ret == TCG_REG_AT || arg == TCG_REG_AT) { + tcg_abort(); + } + + tcg_out_opc_sa(s, OPC_SRL, TCG_REG_AT, arg, 8); +- tcg_out_opc_imm(s, OPC_ANDI, TCG_REG_AT, TCG_REG_AT, 0xff); +- + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 24); + tcg_out_opc_sa(s, OPC_SRA, ret, ret, 16); + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_REG_AT); ++#endif + } + + static inline void tcg_out_bswap32(TCGContext *s, TCGReg ret, TCGReg arg) + { ++#ifdef _MIPS_ARCH_MIPS32R2 ++ tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); ++ tcg_out_opc_sa(s, OPC_ROTR, ret, ret, 16); ++#else + /* ret and arg must be different and can't be register at */ + if (ret == arg || ret == TCG_REG_AT || arg == TCG_REG_AT) { + tcg_abort(); +@@ -466,6 +476,7 @@ static inline void tcg_out_bswap32(TCGContext *s, TCGReg ret, TCGReg arg) + tcg_out_opc_sa(s, OPC_SRL, TCG_REG_AT, arg, 8); + tcg_out_opc_imm(s, OPC_ANDI, TCG_REG_AT, TCG_REG_AT, 0xff00); + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_REG_AT); ++#endif + } + + static inline void tcg_out_ext8s(TCGContext *s, TCGReg ret, TCGReg arg) +@@ -1188,7 +1199,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, + break; + case 1: + if (TCG_NEED_BSWAP) { +- tcg_out_bswap16(s, TCG_REG_T0, data_reg1); ++ tcg_out_opc_imm(s, OPC_ANDI, TCG_REG_T0, data_reg1, 0xffff); ++ tcg_out_bswap16(s, TCG_REG_T0, TCG_REG_T0); + tcg_out_opc_imm(s, OPC_SH, TCG_REG_T0, TCG_REG_A0, 0); + } else { + tcg_out_opc_imm(s, OPC_SH, data_reg1, TCG_REG_A0, 0); +@@ -1409,6 +1421,15 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + } + break; + ++ /* The bswap routines do not work on non-R2 CPU. In that case ++ we let TCG generating the corresponding code. */ ++ case INDEX_op_bswap16_i32: ++ tcg_out_bswap16(s, args[0], args[1]); ++ break; ++ case INDEX_op_bswap32_i32: ++ tcg_out_bswap32(s, args[0], args[1]); ++ break; ++ + case INDEX_op_ext8s_i32: + tcg_out_ext8s(s, args[0], args[1]); + break; +@@ -1503,6 +1524,9 @@ static const TCGTargetOpDef mips_op_defs[] = { + { INDEX_op_shr_i32, { "r", "rZ", "ri" } }, + { INDEX_op_sar_i32, { "r", "rZ", "ri" } }, + ++ { INDEX_op_bswap16_i32, { "r", "r" } }, ++ { INDEX_op_bswap32_i32, { "r", "r" } }, ++ + { INDEX_op_ext8s_i32, { "r", "rZ" } }, + { INDEX_op_ext16s_i32, { "r", "rZ" } }, + +diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h +index 9c68a32..c5c13f7 100644 +--- a/tcg/mips/tcg-target.h ++++ b/tcg/mips/tcg-target.h +@@ -83,8 +83,6 @@ typedef enum { + #define TCG_TARGET_HAS_rot_i32 0 + #define TCG_TARGET_HAS_ext8s_i32 1 + #define TCG_TARGET_HAS_ext16s_i32 1 +-#define TCG_TARGET_HAS_bswap32_i32 0 +-#define TCG_TARGET_HAS_bswap16_i32 0 + #define TCG_TARGET_HAS_andc_i32 0 + #define TCG_TARGET_HAS_orc_i32 0 + #define TCG_TARGET_HAS_eqv_i32 0 +@@ -92,6 +90,15 @@ typedef enum { + #define TCG_TARGET_HAS_deposit_i32 0 + #define TCG_TARGET_HAS_movcond_i32 0 + ++/* optional instructions only implemented on MIPS32R2 */ ++#ifdef _MIPS_ARCH_MIPS32R2 ++#define TCG_TARGET_HAS_bswap16_i32 1 ++#define TCG_TARGET_HAS_bswap32_i32 1 ++#else ++#define TCG_TARGET_HAS_bswap16_i32 0 ++#define TCG_TARGET_HAS_bswap32_i32 0 ++#endif ++ + /* optional instructions automatically implemented */ + #define TCG_TARGET_HAS_neg_i32 0 /* sub rd, zero, rt */ + #define TCG_TARGET_HAS_ext8u_i32 0 /* andi rt, rs, 0xff */ +-- +1.7.12.1 + diff --git a/0065-tcg-mips-implement-rotl-rotr-ops-on-MIPS32R2.patch b/0065-tcg-mips-implement-rotl-rotr-ops-on-MIPS32R2.patch new file mode 100644 index 0000000..6134676 --- /dev/null +++ b/0065-tcg-mips-implement-rotl-rotr-ops-on-MIPS32R2.patch @@ -0,0 +1,92 @@ +From d19858a5515cd15dabf88b8f180754c1c3f3eb76 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:26 +0200 +Subject: [PATCH] tcg/mips: implement rotl/rotr ops on MIPS32R2 + +rotr operations can be optimized on MIPS32 Release 2 using the ROTR and +ROTRV instructions. Also implemented rotl operations by subtracting the +shift from 32. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 20 ++++++++++++++++++++ + tcg/mips/tcg-target.h | 3 ++- + 2 files changed, 22 insertions(+), 1 deletion(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index 8b2f9fc..592e42a 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -300,9 +300,11 @@ enum { + OPC_SPECIAL = 0x00 << 26, + OPC_SLL = OPC_SPECIAL | 0x00, + OPC_SRL = OPC_SPECIAL | 0x02, ++ OPC_ROTR = OPC_SPECIAL | (0x01 << 21) | 0x02, + OPC_SRA = OPC_SPECIAL | 0x03, + OPC_SLLV = OPC_SPECIAL | 0x04, + OPC_SRLV = OPC_SPECIAL | 0x06, ++ OPC_ROTRV = OPC_SPECIAL | (0x01 << 6) | 0x06, + OPC_SRAV = OPC_SPECIAL | 0x07, + OPC_JR = OPC_SPECIAL | 0x08, + OPC_JALR = OPC_SPECIAL | 0x09, +@@ -1420,6 +1422,22 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + tcg_out_opc_reg(s, OPC_SRLV, args[0], args[2], args[1]); + } + break; ++ case INDEX_op_rotl_i32: ++ if (const_args[2]) { ++ tcg_out_opc_sa(s, OPC_ROTR, args[0], args[1], 0x20 - args[2]); ++ } else { ++ tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_AT, 32); ++ tcg_out_opc_reg(s, OPC_SUBU, TCG_REG_AT, TCG_REG_AT, args[2]); ++ tcg_out_opc_reg(s, OPC_ROTRV, args[0], TCG_REG_AT, args[1]); ++ } ++ break; ++ case INDEX_op_rotr_i32: ++ if (const_args[2]) { ++ tcg_out_opc_sa(s, OPC_ROTR, args[0], args[1], args[2]); ++ } else { ++ tcg_out_opc_reg(s, OPC_ROTRV, args[0], args[2], args[1]); ++ } ++ break; + + /* The bswap routines do not work on non-R2 CPU. In that case + we let TCG generating the corresponding code. */ +@@ -1523,6 +1541,8 @@ static const TCGTargetOpDef mips_op_defs[] = { + { INDEX_op_shl_i32, { "r", "rZ", "ri" } }, + { INDEX_op_shr_i32, { "r", "rZ", "ri" } }, + { INDEX_op_sar_i32, { "r", "rZ", "ri" } }, ++ { INDEX_op_rotr_i32, { "r", "rZ", "ri" } }, ++ { INDEX_op_rotl_i32, { "r", "rZ", "ri" } }, + + { INDEX_op_bswap16_i32, { "r", "r" } }, + { INDEX_op_bswap32_i32, { "r", "r" } }, +diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h +index c5c13f7..470314c 100644 +--- a/tcg/mips/tcg-target.h ++++ b/tcg/mips/tcg-target.h +@@ -80,7 +80,6 @@ typedef enum { + #define TCG_TARGET_HAS_div_i32 1 + #define TCG_TARGET_HAS_not_i32 1 + #define TCG_TARGET_HAS_nor_i32 1 +-#define TCG_TARGET_HAS_rot_i32 0 + #define TCG_TARGET_HAS_ext8s_i32 1 + #define TCG_TARGET_HAS_ext16s_i32 1 + #define TCG_TARGET_HAS_andc_i32 0 +@@ -94,9 +93,11 @@ typedef enum { + #ifdef _MIPS_ARCH_MIPS32R2 + #define TCG_TARGET_HAS_bswap16_i32 1 + #define TCG_TARGET_HAS_bswap32_i32 1 ++#define TCG_TARGET_HAS_rot_i32 1 + #else + #define TCG_TARGET_HAS_bswap16_i32 0 + #define TCG_TARGET_HAS_bswap32_i32 0 ++#define TCG_TARGET_HAS_rot_i32 0 + #endif + + /* optional instructions automatically implemented */ +-- +1.7.12.1 + diff --git a/0066-tcg-mips-implement-deposit-op-on-MIPS32R2.patch b/0066-tcg-mips-implement-deposit-op-on-MIPS32R2.patch new file mode 100644 index 0000000..fe54bc0 --- /dev/null +++ b/0066-tcg-mips-implement-deposit-op-on-MIPS32R2.patch @@ -0,0 +1,77 @@ +From 7c3e573b364a65d4abce5266c376f4e77624b039 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:26 +0200 +Subject: [PATCH] tcg/mips: implement deposit op on MIPS32R2 + +deposit operations can be optimized on MIPS32 Release 2 using the INS +instruction. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 8 ++++++++ + tcg/mips/tcg-target.h | 3 ++- + 2 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index 592e42a..b2e1056 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -328,6 +328,7 @@ enum { + OPC_BGEZ = OPC_REGIMM | (0x01 << 16), + + OPC_SPECIAL3 = 0x1f << 26, ++ OPC_INS = OPC_SPECIAL3 | 0x004, + OPC_WSBH = OPC_SPECIAL3 | 0x0a0, + OPC_SEB = OPC_SPECIAL3 | 0x420, + OPC_SEH = OPC_SPECIAL3 | 0x620, +@@ -1455,6 +1456,11 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + tcg_out_ext16s(s, args[0], args[1]); + break; + ++ case INDEX_op_deposit_i32: ++ tcg_out_opc_imm(s, OPC_INS, args[0], args[2], ++ ((args[3] + args[4] - 1) << 11) | (args[3] << 6)); ++ break; ++ + case INDEX_op_brcond_i32: + tcg_out_brcond(s, args[2], args[0], args[1], args[3]); + break; +@@ -1550,6 +1556,8 @@ static const TCGTargetOpDef mips_op_defs[] = { + { INDEX_op_ext8s_i32, { "r", "rZ" } }, + { INDEX_op_ext16s_i32, { "r", "rZ" } }, + ++ { INDEX_op_deposit_i32, { "r", "0", "rZ" } }, ++ + { INDEX_op_brcond_i32, { "rZ", "rZ" } }, + { INDEX_op_setcond_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_setcond2_i32, { "r", "rZ", "rZ", "rZ", "rZ" } }, +diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h +index 470314c..897a737 100644 +--- a/tcg/mips/tcg-target.h ++++ b/tcg/mips/tcg-target.h +@@ -86,7 +86,6 @@ typedef enum { + #define TCG_TARGET_HAS_orc_i32 0 + #define TCG_TARGET_HAS_eqv_i32 0 + #define TCG_TARGET_HAS_nand_i32 0 +-#define TCG_TARGET_HAS_deposit_i32 0 + #define TCG_TARGET_HAS_movcond_i32 0 + + /* optional instructions only implemented on MIPS32R2 */ +@@ -94,10 +93,12 @@ typedef enum { + #define TCG_TARGET_HAS_bswap16_i32 1 + #define TCG_TARGET_HAS_bswap32_i32 1 + #define TCG_TARGET_HAS_rot_i32 1 ++#define TCG_TARGET_HAS_deposit_i32 1 + #else + #define TCG_TARGET_HAS_bswap16_i32 0 + #define TCG_TARGET_HAS_bswap32_i32 0 + #define TCG_TARGET_HAS_rot_i32 0 ++#define TCG_TARGET_HAS_deposit_i32 0 + #endif + + /* optional instructions automatically implemented */ +-- +1.7.12.1 + diff --git a/0067-tcg-mips-implement-movcond-op-on-MIPS32R2.patch b/0067-tcg-mips-implement-movcond-op-on-MIPS32R2.patch new file mode 100644 index 0000000..7f06797 --- /dev/null +++ b/0067-tcg-mips-implement-movcond-op-on-MIPS32R2.patch @@ -0,0 +1,140 @@ +From 552720cea4c1ca99dd1919cb8a80b6b8f3b13cda Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 18:20:26 +0200 +Subject: [PATCH] tcg/mips: implement movcond op on MIPS32R2 + +movcond operation can be implemented on MIPS32 Release 2 using the MOVN, +MOVZ, SLT and SLTU instructions. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ + tcg/mips/tcg-target.h | 8 ++++++ + 2 files changed, 77 insertions(+) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index b2e1056..c272b38 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -308,6 +308,8 @@ enum { + OPC_SRAV = OPC_SPECIAL | 0x07, + OPC_JR = OPC_SPECIAL | 0x08, + OPC_JALR = OPC_SPECIAL | 0x09, ++ OPC_MOVZ = OPC_SPECIAL | 0x0A, ++ OPC_MOVN = OPC_SPECIAL | 0x0B, + OPC_MFHI = OPC_SPECIAL | 0x10, + OPC_MFLO = OPC_SPECIAL | 0x12, + OPC_MULT = OPC_SPECIAL | 0x18, +@@ -735,6 +737,68 @@ static void tcg_out_brcond2(TCGContext *s, TCGCond cond, TCGArg arg1, + reloc_pc16(label_ptr, (tcg_target_long) s->code_ptr); + } + ++static void tcg_out_movcond(TCGContext *s, TCGCond cond, TCGReg ret, ++ TCGArg c1, TCGArg c2, TCGArg v) ++{ ++ switch (cond) { ++ case TCG_COND_EQ: ++ if (c1 == 0) { ++ tcg_out_opc_reg(s, OPC_MOVZ, ret, v, c2); ++ } else if (c2 == 0) { ++ tcg_out_opc_reg(s, OPC_MOVZ, ret, v, c1); ++ } else { ++ tcg_out_opc_reg(s, OPC_XOR, TCG_REG_AT, c1, c2); ++ tcg_out_opc_reg(s, OPC_MOVZ, ret, v, TCG_REG_AT); ++ } ++ break; ++ case TCG_COND_NE: ++ if (c1 == 0) { ++ tcg_out_opc_reg(s, OPC_MOVN, ret, v, c2); ++ } else if (c2 == 0) { ++ tcg_out_opc_reg(s, OPC_MOVN, ret, v, c1); ++ } else { ++ tcg_out_opc_reg(s, OPC_XOR, TCG_REG_AT, c1, c2); ++ tcg_out_opc_reg(s, OPC_MOVN, ret, v, TCG_REG_AT); ++ } ++ break; ++ case TCG_COND_LT: ++ tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, c1, c2); ++ tcg_out_opc_reg(s, OPC_MOVN, ret, v, TCG_REG_AT); ++ break; ++ case TCG_COND_LTU: ++ tcg_out_opc_reg(s, OPC_SLTU, TCG_REG_AT, c1, c2); ++ tcg_out_opc_reg(s, OPC_MOVN, ret, v, TCG_REG_AT); ++ break; ++ case TCG_COND_GE: ++ tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, c1, c2); ++ tcg_out_opc_reg(s, OPC_MOVZ, ret, v, TCG_REG_AT); ++ break; ++ case TCG_COND_GEU: ++ tcg_out_opc_reg(s, OPC_SLTU, TCG_REG_AT, c1, c2); ++ tcg_out_opc_reg(s, OPC_MOVZ, ret, v, TCG_REG_AT); ++ break; ++ case TCG_COND_LE: ++ tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, c2, c1); ++ tcg_out_opc_reg(s, OPC_MOVZ, ret, v, TCG_REG_AT); ++ break; ++ case TCG_COND_LEU: ++ tcg_out_opc_reg(s, OPC_SLTU, TCG_REG_AT, c2, c1); ++ tcg_out_opc_reg(s, OPC_MOVZ, ret, v, TCG_REG_AT); ++ break; ++ case TCG_COND_GT: ++ tcg_out_opc_reg(s, OPC_SLT, TCG_REG_AT, c2, c1); ++ tcg_out_opc_reg(s, OPC_MOVN, ret, v, TCG_REG_AT); ++ break; ++ case TCG_COND_GTU: ++ tcg_out_opc_reg(s, OPC_SLTU, TCG_REG_AT, c2, c1); ++ tcg_out_opc_reg(s, OPC_MOVN, ret, v, TCG_REG_AT); ++ break; ++ default: ++ tcg_abort(); ++ break; ++ } ++} ++ + static void tcg_out_setcond(TCGContext *s, TCGCond cond, TCGReg ret, + TCGArg arg1, TCGArg arg2) + { +@@ -1468,6 +1532,10 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + tcg_out_brcond2(s, args[4], args[0], args[1], args[2], args[3], args[5]); + break; + ++ case INDEX_op_movcond_i32: ++ tcg_out_movcond(s, args[5], args[0], args[1], args[2], args[3]); ++ break; ++ + case INDEX_op_setcond_i32: + tcg_out_setcond(s, args[3], args[0], args[1], args[2]); + break; +@@ -1559,6 +1627,7 @@ static const TCGTargetOpDef mips_op_defs[] = { + { INDEX_op_deposit_i32, { "r", "0", "rZ" } }, + + { INDEX_op_brcond_i32, { "rZ", "rZ" } }, ++ { INDEX_op_movcond_i32, { "r", "rZ", "rZ", "rZ", "0" } }, + { INDEX_op_setcond_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_setcond2_i32, { "r", "rZ", "rZ", "rZ", "rZ" } }, + +diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h +index 897a737..d147e70 100644 +--- a/tcg/mips/tcg-target.h ++++ b/tcg/mips/tcg-target.h +@@ -86,7 +86,15 @@ typedef enum { + #define TCG_TARGET_HAS_orc_i32 0 + #define TCG_TARGET_HAS_eqv_i32 0 + #define TCG_TARGET_HAS_nand_i32 0 ++ ++/* optional instructions only implemented on MIPS4, MIPS32 and Loongson 2 */ ++#if defined(_MIPS_ARCH_MIPS4) || defined(_MIPS_ARCH_MIPS32) || \ ++ defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_LOONGSON2E) || \ ++ defined(_MIPS_ARCH_LOONGSON2F) ++#define TCG_TARGET_HAS_movcond_i32 1 ++#else + #define TCG_TARGET_HAS_movcond_i32 0 ++#endif + + /* optional instructions only implemented on MIPS32R2 */ + #ifdef _MIPS_ARCH_MIPS32R2 +-- +1.7.12.1 + diff --git a/0068-tcg-optimize-remove-TCG_TEMP_ANY.patch b/0068-tcg-optimize-remove-TCG_TEMP_ANY.patch new file mode 100644 index 0000000..0702187 --- /dev/null +++ b/0068-tcg-optimize-remove-TCG_TEMP_ANY.patch @@ -0,0 +1,62 @@ +From 848750a4acf9ea5c473be596d41720e702d770f0 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Mon, 10 Sep 2012 23:51:42 +0200 +Subject: [PATCH] tcg/optimize: remove TCG_TEMP_ANY + +TCG_TEMP_ANY has no different meaning than TCG_TEMP_UNDEF, so use +the later instead. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 1be7631..308b7f9 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -39,8 +39,7 @@ typedef enum { + TCG_TEMP_UNDEF = 0, + TCG_TEMP_CONST, + TCG_TEMP_COPY, +- TCG_TEMP_HAS_COPY, +- TCG_TEMP_ANY ++ TCG_TEMP_HAS_COPY + } tcg_temp_state; + + struct tcg_temp_info { +@@ -52,7 +51,7 @@ struct tcg_temp_info { + + static struct tcg_temp_info temps[TCG_MAX_TEMPS]; + +-/* Reset TEMP's state to TCG_TEMP_ANY. If TEMP was a representative of some ++/* Reset TEMP's state to TCG_TEMP_UNDEF. If TEMP was a representative of some + class of equivalent temp's, a new representative should be chosen in this + class. */ + static void reset_temp(TCGArg temp, int nb_temps, int nb_globals) +@@ -69,7 +68,7 @@ static void reset_temp(TCGArg temp, int nb_temps, int nb_globals) + } + for (i = temps[temp].next_copy; i != temp; i = temps[i].next_copy) { + if (new_base == (TCGArg)-1) { +- temps[i].state = TCG_TEMP_ANY; ++ temps[i].state = TCG_TEMP_UNDEF; + } else { + temps[i].val = new_base; + } +@@ -81,9 +80,9 @@ static void reset_temp(TCGArg temp, int nb_temps, int nb_globals) + temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy; + new_base = temps[temp].val; + } +- temps[temp].state = TCG_TEMP_ANY; ++ temps[temp].state = TCG_TEMP_UNDEF; + if (new_base != (TCGArg)-1 && temps[new_base].next_copy == new_base) { +- temps[new_base].state = TCG_TEMP_ANY; ++ temps[new_base].state = TCG_TEMP_UNDEF; + } + } + +-- +1.7.12.1 + diff --git a/0069-tcg-optimize-check-types-in-copy-propagation.patch b/0069-tcg-optimize-check-types-in-copy-propagation.patch new file mode 100644 index 0000000..6627679 --- /dev/null +++ b/0069-tcg-optimize-check-types-in-copy-propagation.patch @@ -0,0 +1,78 @@ +From 71f0bcf065ddd00d5659e846ddfdffb9a06ee896 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Tue, 11 Sep 2012 12:26:23 +0200 +Subject: [PATCH] tcg/optimize: check types in copy propagation + +The copy propagation doesn't check the types of the temps during copy +propagation. However TCG is using the mov_i32 for the i64 to i32 +conversion and thus the two are not equivalent. + +With this patch tcg_opt_gen_mov() doesn't consider two temps of +different type as copies anymore. + +So far it seems the optimization was not aggressive enough to trigger +this bug, but it will be triggered later in this series once the copy +propagation is improved. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 308b7f9..da8dffe 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -106,12 +106,13 @@ static TCGOpcode op_to_movi(TCGOpcode op) + } + } + +-static void tcg_opt_gen_mov(TCGArg *gen_args, TCGArg dst, TCGArg src, +- int nb_temps, int nb_globals) ++static void tcg_opt_gen_mov(TCGContext *s, TCGArg *gen_args, ++ TCGArg dst, TCGArg src) + { +- reset_temp(dst, nb_temps, nb_globals); ++ reset_temp(dst, s->nb_temps, s->nb_globals); + assert(temps[src].state != TCG_TEMP_COPY); +- if (src >= nb_globals) { ++ /* Only consider temps with the same type (width) as copies. */ ++ if (src >= s->nb_globals && s->temps[dst].type == s->temps[src].type) { + assert(temps[src].state != TCG_TEMP_CONST); + if (temps[src].state != TCG_TEMP_HAS_COPY) { + temps[src].state = TCG_TEMP_HAS_COPY; +@@ -461,8 +462,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_opc_buf[op_index] = INDEX_op_nop; + } else { + gen_opc_buf[op_index] = op_to_mov(op); +- tcg_opt_gen_mov(gen_args, args[0], args[1], +- nb_temps, nb_globals); ++ tcg_opt_gen_mov(s, gen_args, args[0], args[1]); + gen_args += 2; + } + args += 3; +@@ -499,8 +499,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_opc_buf[op_index] = INDEX_op_nop; + } else { + gen_opc_buf[op_index] = op_to_mov(op); +- tcg_opt_gen_mov(gen_args, args[0], args[1], nb_temps, +- nb_globals); ++ tcg_opt_gen_mov(s, gen_args, args[0], args[1]); + gen_args += 2; + } + args += 3; +@@ -524,8 +523,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + break; + } + if (temps[args[1]].state != TCG_TEMP_CONST) { +- tcg_opt_gen_mov(gen_args, args[0], args[1], +- nb_temps, nb_globals); ++ tcg_opt_gen_mov(s, gen_args, args[0], args[1]); + gen_args += 2; + args += 2; + break; +-- +1.7.12.1 + diff --git a/0070-tcg-optimize-rework-copy-progagation.patch b/0070-tcg-optimize-rework-copy-progagation.patch new file mode 100644 index 0000000..ca39c5a --- /dev/null +++ b/0070-tcg-optimize-rework-copy-progagation.patch @@ -0,0 +1,377 @@ +From bf408071104de13f79a0c3c8cac892f440462e7c Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Tue, 11 Sep 2012 12:31:21 +0200 +Subject: [PATCH] tcg/optimize: rework copy progagation + +The copy propagation pass tries to keep track what is a copy of what +and what has copy of what, and in addition it keep a circular list of +of all the copies. Unfortunately this doesn't fully work: a mov from +a temp which has a state "COPY" changed it into a state "HAS_COPY". +Later when this temp is used again, it is considered has not having +copy and thus no propagation is done. + +This patch fixes that by removing the hiearchy between copies, and thus +only keeping a "COPY" state both meaning "is a copy" and "has a copy". +The decision of which copy to use is deferred to the actual temp +replacement. At this stage there is not one best choice to do, but only +better choices than others. For doing the best choice the operation +would have to be parsed in reversed to know if a temp is going to be +used later or not. That what is done by the liveness analysis. At this +stage it is known that globals will be always live, that local temps +will be dead at the end of the translation block, and that the temps +will be dead at the end of the basic block. This means that this stage +should try to replace temps by local temps or globals and local temps +by globals. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 167 +++++++++++++++++++++++++++++++-------------------------- + 1 file changed, 92 insertions(+), 75 deletions(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index da8dffe..1904b39 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -39,7 +39,6 @@ typedef enum { + TCG_TEMP_UNDEF = 0, + TCG_TEMP_CONST, + TCG_TEMP_COPY, +- TCG_TEMP_HAS_COPY + } tcg_temp_state; + + struct tcg_temp_info { +@@ -51,39 +50,19 @@ struct tcg_temp_info { + + static struct tcg_temp_info temps[TCG_MAX_TEMPS]; + +-/* Reset TEMP's state to TCG_TEMP_UNDEF. If TEMP was a representative of some +- class of equivalent temp's, a new representative should be chosen in this +- class. */ +-static void reset_temp(TCGArg temp, int nb_temps, int nb_globals) ++/* Reset TEMP's state to TCG_TEMP_UNDEF. If TEMP only had one copy, remove ++ the copy flag from the left temp. */ ++static void reset_temp(TCGArg temp) + { +- int i; +- TCGArg new_base = (TCGArg)-1; +- if (temps[temp].state == TCG_TEMP_HAS_COPY) { +- for (i = temps[temp].next_copy; i != temp; i = temps[i].next_copy) { +- if (i >= nb_globals) { +- temps[i].state = TCG_TEMP_HAS_COPY; +- new_base = i; +- break; +- } +- } +- for (i = temps[temp].next_copy; i != temp; i = temps[i].next_copy) { +- if (new_base == (TCGArg)-1) { +- temps[i].state = TCG_TEMP_UNDEF; +- } else { +- temps[i].val = new_base; +- } ++ if (temps[temp].state == TCG_TEMP_COPY) { ++ if (temps[temp].prev_copy == temps[temp].next_copy) { ++ temps[temps[temp].next_copy].state = TCG_TEMP_UNDEF; ++ } else { ++ temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy; ++ temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy; + } +- temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy; +- temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy; +- } else if (temps[temp].state == TCG_TEMP_COPY) { +- temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy; +- temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy; +- new_base = temps[temp].val; + } + temps[temp].state = TCG_TEMP_UNDEF; +- if (new_base != (TCGArg)-1 && temps[new_base].next_copy == new_base) { +- temps[new_base].state = TCG_TEMP_UNDEF; +- } + } + + static int op_bits(TCGOpcode op) +@@ -106,34 +85,83 @@ static TCGOpcode op_to_movi(TCGOpcode op) + } + } + ++static TCGArg find_better_copy(TCGContext *s, TCGArg temp) ++{ ++ TCGArg i; ++ ++ /* If this is already a global, we can't do better. */ ++ if (temp < s->nb_globals) { ++ return temp; ++ } ++ ++ /* Search for a global first. */ ++ for (i = temps[temp].next_copy ; i != temp ; i = temps[i].next_copy) { ++ if (i < s->nb_globals) { ++ return i; ++ } ++ } ++ ++ /* If it is a temp, search for a temp local. */ ++ if (!s->temps[temp].temp_local) { ++ for (i = temps[temp].next_copy ; i != temp ; i = temps[i].next_copy) { ++ if (s->temps[i].temp_local) { ++ return i; ++ } ++ } ++ } ++ ++ /* Failure to find a better representation, return the same temp. */ ++ return temp; ++} ++ ++static bool temps_are_copies(TCGArg arg1, TCGArg arg2) ++{ ++ TCGArg i; ++ ++ if (arg1 == arg2) { ++ return true; ++ } ++ ++ if (temps[arg1].state != TCG_TEMP_COPY ++ || temps[arg2].state != TCG_TEMP_COPY) { ++ return false; ++ } ++ ++ for (i = temps[arg1].next_copy ; i != arg1 ; i = temps[i].next_copy) { ++ if (i == arg2) { ++ return true; ++ } ++ } ++ ++ return false; ++} ++ + static void tcg_opt_gen_mov(TCGContext *s, TCGArg *gen_args, + TCGArg dst, TCGArg src) + { +- reset_temp(dst, s->nb_temps, s->nb_globals); +- assert(temps[src].state != TCG_TEMP_COPY); +- /* Only consider temps with the same type (width) as copies. */ +- if (src >= s->nb_globals && s->temps[dst].type == s->temps[src].type) { +- assert(temps[src].state != TCG_TEMP_CONST); +- if (temps[src].state != TCG_TEMP_HAS_COPY) { +- temps[src].state = TCG_TEMP_HAS_COPY; ++ reset_temp(dst); ++ assert(temps[src].state != TCG_TEMP_CONST); ++ ++ if (s->temps[src].type == s->temps[dst].type) { ++ if (temps[src].state != TCG_TEMP_COPY) { ++ temps[src].state = TCG_TEMP_COPY; + temps[src].next_copy = src; + temps[src].prev_copy = src; + } + temps[dst].state = TCG_TEMP_COPY; +- temps[dst].val = src; + temps[dst].next_copy = temps[src].next_copy; + temps[dst].prev_copy = src; + temps[temps[dst].next_copy].prev_copy = dst; + temps[src].next_copy = dst; + } ++ + gen_args[0] = dst; + gen_args[1] = src; + } + +-static void tcg_opt_gen_movi(TCGArg *gen_args, TCGArg dst, TCGArg val, +- int nb_temps, int nb_globals) ++static void tcg_opt_gen_movi(TCGArg *gen_args, TCGArg dst, TCGArg val) + { +- reset_temp(dst, nb_temps, nb_globals); ++ reset_temp(dst); + temps[dst].state = TCG_TEMP_CONST; + temps[dst].val = val; + gen_args[0] = dst; +@@ -324,7 +352,6 @@ static TCGArg do_constant_folding_cond(TCGOpcode op, TCGArg x, + tcg_abort(); + } + +- + /* Propagate constants and copies, fold constant expressions. */ + static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + TCGArg *args, TCGOpDef *tcg_op_defs) +@@ -338,10 +365,8 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + + /* Array VALS has an element for each temp. + If this temp holds a constant then its value is kept in VALS' element. +- If this temp is a copy of other ones then this equivalence class' +- representative is kept in VALS' element. +- If this temp is neither copy nor constant then corresponding VALS' +- element is unused. */ ++ If this temp is a copy of other ones then the other copies are ++ available through the doubly linked circular list. */ + + nb_temps = s->nb_temps; + nb_globals = s->nb_globals; +@@ -357,7 +382,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + assert(op != INDEX_op_call); + for (i = def->nb_oargs; i < def->nb_oargs + def->nb_iargs; i++) { + if (temps[args[i]].state == TCG_TEMP_COPY) { +- args[i] = temps[args[i]].val; ++ args[i] = find_better_copy(s, args[i]); + } + } + } +@@ -429,7 +454,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + if (temps[args[1]].state == TCG_TEMP_CONST + && temps[args[1]].val == 0) { + gen_opc_buf[op_index] = op_to_movi(op); +- tcg_opt_gen_movi(gen_args, args[0], 0, nb_temps, nb_globals); ++ tcg_opt_gen_movi(gen_args, args[0], 0); + args += 3; + gen_args += 2; + continue; +@@ -456,9 +481,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + } + if (temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0) { +- if ((temps[args[0]].state == TCG_TEMP_COPY +- && temps[args[0]].val == args[1]) +- || args[0] == args[1]) { ++ if (temps_are_copies(args[0], args[1])) { + gen_opc_buf[op_index] = INDEX_op_nop; + } else { + gen_opc_buf[op_index] = op_to_mov(op); +@@ -480,7 +503,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + if ((temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0)) { + gen_opc_buf[op_index] = op_to_movi(op); +- tcg_opt_gen_movi(gen_args, args[0], 0, nb_temps, nb_globals); ++ tcg_opt_gen_movi(gen_args, args[0], 0); + args += 3; + gen_args += 2; + continue; +@@ -495,7 +518,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + CASE_OP_32_64(or): + CASE_OP_32_64(and): + if (args[1] == args[2]) { +- if (args[1] == args[0]) { ++ if (temps_are_copies(args[0], args[1])) { + gen_opc_buf[op_index] = INDEX_op_nop; + } else { + gen_opc_buf[op_index] = op_to_mov(op); +@@ -515,9 +538,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + allocator where needed and possible. Also detect copies. */ + switch (op) { + CASE_OP_32_64(mov): +- if ((temps[args[1]].state == TCG_TEMP_COPY +- && temps[args[1]].val == args[0]) +- || args[0] == args[1]) { ++ if (temps_are_copies(args[0], args[1])) { + args += 2; + gen_opc_buf[op_index] = INDEX_op_nop; + break; +@@ -535,7 +556,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + args[1] = temps[args[1]].val; + /* fallthrough */ + CASE_OP_32_64(movi): +- tcg_opt_gen_movi(gen_args, args[0], args[1], nb_temps, nb_globals); ++ tcg_opt_gen_movi(gen_args, args[0], args[1]); + gen_args += 2; + args += 2; + break; +@@ -550,9 +571,9 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + if (temps[args[1]].state == TCG_TEMP_CONST) { + gen_opc_buf[op_index] = op_to_movi(op); + tmp = do_constant_folding(op, temps[args[1]].val, 0); +- tcg_opt_gen_movi(gen_args, args[0], tmp, nb_temps, nb_globals); ++ tcg_opt_gen_movi(gen_args, args[0], tmp); + } else { +- reset_temp(args[0], nb_temps, nb_globals); ++ reset_temp(args[0]); + gen_args[0] = args[0]; + gen_args[1] = args[1]; + } +@@ -580,10 +601,10 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_opc_buf[op_index] = op_to_movi(op); + tmp = do_constant_folding(op, temps[args[1]].val, + temps[args[2]].val); +- tcg_opt_gen_movi(gen_args, args[0], tmp, nb_temps, nb_globals); ++ tcg_opt_gen_movi(gen_args, args[0], tmp); + gen_args += 2; + } else { +- reset_temp(args[0], nb_temps, nb_globals); ++ reset_temp(args[0]); + gen_args[0] = args[0]; + gen_args[1] = args[1]; + gen_args[2] = args[2]; +@@ -597,10 +618,10 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + gen_opc_buf[op_index] = op_to_movi(op); + tmp = do_constant_folding_cond(op, temps[args[1]].val, + temps[args[2]].val, args[3]); +- tcg_opt_gen_movi(gen_args, args[0], tmp, nb_temps, nb_globals); ++ tcg_opt_gen_movi(gen_args, args[0], tmp); + gen_args += 2; + } else { +- reset_temp(args[0], nb_temps, nb_globals); ++ reset_temp(args[0]); + gen_args[0] = args[0]; + gen_args[1] = args[1]; + gen_args[2] = args[2]; +@@ -623,7 +644,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + } + } else { + memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); +- reset_temp(args[0], nb_temps, nb_globals); ++ reset_temp(args[0]); + gen_args[0] = args[0]; + gen_args[1] = args[1]; + gen_args[2] = args[2]; +@@ -637,23 +658,19 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + && temps[args[2]].state == TCG_TEMP_CONST) { + tmp = do_constant_folding_cond(op, temps[args[1]].val, + temps[args[2]].val, args[5]); +- if (args[0] == args[4-tmp] +- || (temps[args[4-tmp]].state == TCG_TEMP_COPY +- && temps[args[4-tmp]].val == args[0])) { ++ if (temps_are_copies(args[0], args[4-tmp])) { + gen_opc_buf[op_index] = INDEX_op_nop; + } else if (temps[args[4-tmp]].state == TCG_TEMP_CONST) { + gen_opc_buf[op_index] = op_to_movi(op); +- tcg_opt_gen_movi(gen_args, args[0], temps[args[4-tmp]].val, +- nb_temps, nb_globals); ++ tcg_opt_gen_movi(gen_args, args[0], temps[args[4-tmp]].val); + gen_args += 2; + } else { + gen_opc_buf[op_index] = op_to_mov(op); +- tcg_opt_gen_mov(gen_args, args[0], args[4-tmp], +- nb_temps, nb_globals); ++ tcg_opt_gen_mov(s, gen_args, args[0], args[4-tmp]); + gen_args += 2; + } + } else { +- reset_temp(args[0], nb_temps, nb_globals); ++ reset_temp(args[0]); + gen_args[0] = args[0]; + gen_args[1] = args[1]; + gen_args[2] = args[2]; +@@ -668,11 +685,11 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + nb_call_args = (args[0] >> 16) + (args[0] & 0xffff); + if (!(args[nb_call_args + 1] & (TCG_CALL_CONST | TCG_CALL_PURE))) { + for (i = 0; i < nb_globals; i++) { +- reset_temp(i, nb_temps, nb_globals); ++ reset_temp(i); + } + } + for (i = 0; i < (args[0] >> 16); i++) { +- reset_temp(args[i + 1], nb_temps, nb_globals); ++ reset_temp(args[i + 1]); + } + i = nb_call_args + 3; + while (i) { +@@ -691,7 +708,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); + } else { + for (i = 0; i < def->nb_oargs; i++) { +- reset_temp(args[i], nb_temps, nb_globals); ++ reset_temp(args[i]); + } + } + for (i = 0; i < def->nb_args; i++) { +-- +1.7.12.1 + diff --git a/0071-tcg-optimize-do-copy-propagation-for-all-operations.patch b/0071-tcg-optimize-do-copy-propagation-for-all-operations.patch new file mode 100644 index 0000000..62a4efb --- /dev/null +++ b/0071-tcg-optimize-do-copy-propagation-for-all-operations.patch @@ -0,0 +1,42 @@ +From 7c1a67bb734f364ea0643b549e030f04d4eed798 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Tue, 11 Sep 2012 16:18:49 +0200 +Subject: [PATCH] tcg/optimize: do copy propagation for all operations + +It is possible to due copy propagation for all operations, even the one +that have side effects or clobber arguments (it only concerns input +arguments). That said, the call operation should be handled differently +due to the variable number of arguments. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index 1904b39..aeb2225 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -378,8 +378,15 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + op = gen_opc_buf[op_index]; + def = &tcg_op_defs[op]; + /* Do copy propagation */ +- if (!(def->flags & (TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS))) { +- assert(op != INDEX_op_call); ++ if (op == INDEX_op_call) { ++ int nb_oargs = args[0] >> 16; ++ int nb_iargs = args[0] & 0xffff; ++ for (i = nb_oargs + 1; i < nb_oargs + nb_iargs + 1; i++) { ++ if (temps[args[i]].state == TCG_TEMP_COPY) { ++ args[i] = find_better_copy(s, args[i]); ++ } ++ } ++ } else { + for (i = def->nb_oargs; i < def->nb_oargs + def->nb_iargs; i++) { + if (temps[args[i]].state == TCG_TEMP_COPY) { + args[i] = find_better_copy(s, args[i]); +-- +1.7.12.1 + diff --git a/0072-tcg-optimize-optimize-op-r-a-a-mov-r-a.patch b/0072-tcg-optimize-optimize-op-r-a-a-mov-r-a.patch new file mode 100644 index 0000000..65f5c50 --- /dev/null +++ b/0072-tcg-optimize-optimize-op-r-a-a-mov-r-a.patch @@ -0,0 +1,31 @@ +From e38329760e40a354e37d11c7f5d8c86cdb90736c Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Tue, 18 Sep 2012 19:11:32 +0200 +Subject: [PATCH] tcg/optimize: optimize "op r, a, a => mov r, a" + +Now that we can easily detect all copies, we can optimize the +"op r, a, a => mov r, a" case a bit more. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index aeb2225..b9a7da9 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -524,7 +524,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + switch (op) { + CASE_OP_32_64(or): + CASE_OP_32_64(and): +- if (args[1] == args[2]) { ++ if (temps_are_copies(args[1], args[2])) { + if (temps_are_copies(args[0], args[1])) { + gen_opc_buf[op_index] = INDEX_op_nop; + } else { +-- +1.7.12.1 + diff --git a/0073-tcg-optimize-optimize-op-r-a-a-movi-r-0.patch b/0073-tcg-optimize-optimize-op-r-a-a-movi-r-0.patch new file mode 100644 index 0000000..48ad5fe --- /dev/null +++ b/0073-tcg-optimize-optimize-op-r-a-a-movi-r-0.patch @@ -0,0 +1,46 @@ +From 363479b4d4f729959eafb1209d48ad75e928c00a Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Tue, 18 Sep 2012 19:12:36 +0200 +Subject: [PATCH] tcg/optimize: optimize "op r, a, a => movi r, 0" + +Now that it's possible to detect copies, we can optimize the case +the "op r, a, a => movi r, 0". This helps in the computation of +overflow flags when one of the two args is 0. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index b9a7da9..ceea644 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -540,6 +540,22 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + break; + } + ++ /* Simplify expression for "op r, a, a => movi r, 0" cases */ ++ switch (op) { ++ CASE_OP_32_64(sub): ++ CASE_OP_32_64(xor): ++ if (temps_are_copies(args[1], args[2])) { ++ gen_opc_buf[op_index] = op_to_movi(op); ++ tcg_opt_gen_movi(gen_args, args[0], 0); ++ gen_args += 2; ++ args += 3; ++ continue; ++ } ++ break; ++ default: ++ break; ++ } ++ + /* Propagate constants through copy operations and do constant + folding. Constants will be substituted to arguments by register + allocator where needed and possible. Also detect copies. */ +-- +1.7.12.1 + diff --git a/0074-tcg-optimize-further-optimize-brcond-movcond-setcond.patch b/0074-tcg-optimize-further-optimize-brcond-movcond-setcond.patch new file mode 100644 index 0000000..9b9180d --- /dev/null +++ b/0074-tcg-optimize-further-optimize-brcond-movcond-setcond.patch @@ -0,0 +1,192 @@ +From 8d5f3ca9ccace2374fd73d46fad56decc02e0a44 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Tue, 18 Sep 2012 19:37:00 +0200 +Subject: [PATCH] tcg/optimize: further optimize brcond/movcond/setcond + +When both argument of brcond/movcond/setcond are the same or when one +of the two values is a constant equal to zero, it's possible to do +further optimizations. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 127 ++++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 76 insertions(+), 51 deletions(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index ceea644..abe016a 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -292,58 +292,88 @@ static TCGArg do_constant_folding(TCGOpcode op, TCGArg x, TCGArg y) + return res; + } + ++/* Return 2 if the condition can't be simplified, and the result ++ of the condition (0 or 1) if it can */ + static TCGArg do_constant_folding_cond(TCGOpcode op, TCGArg x, + TCGArg y, TCGCond c) + { +- switch (op_bits(op)) { +- case 32: ++ if (temps[x].state == TCG_TEMP_CONST && temps[y].state == TCG_TEMP_CONST) { ++ switch (op_bits(op)) { ++ case 32: ++ switch (c) { ++ case TCG_COND_EQ: ++ return (uint32_t)temps[x].val == (uint32_t)temps[y].val; ++ case TCG_COND_NE: ++ return (uint32_t)temps[x].val != (uint32_t)temps[y].val; ++ case TCG_COND_LT: ++ return (int32_t)temps[x].val < (int32_t)temps[y].val; ++ case TCG_COND_GE: ++ return (int32_t)temps[x].val >= (int32_t)temps[y].val; ++ case TCG_COND_LE: ++ return (int32_t)temps[x].val <= (int32_t)temps[y].val; ++ case TCG_COND_GT: ++ return (int32_t)temps[x].val > (int32_t)temps[y].val; ++ case TCG_COND_LTU: ++ return (uint32_t)temps[x].val < (uint32_t)temps[y].val; ++ case TCG_COND_GEU: ++ return (uint32_t)temps[x].val >= (uint32_t)temps[y].val; ++ case TCG_COND_LEU: ++ return (uint32_t)temps[x].val <= (uint32_t)temps[y].val; ++ case TCG_COND_GTU: ++ return (uint32_t)temps[x].val > (uint32_t)temps[y].val; ++ } ++ break; ++ case 64: ++ switch (c) { ++ case TCG_COND_EQ: ++ return (uint64_t)temps[x].val == (uint64_t)temps[y].val; ++ case TCG_COND_NE: ++ return (uint64_t)temps[x].val != (uint64_t)temps[y].val; ++ case TCG_COND_LT: ++ return (int64_t)temps[x].val < (int64_t)temps[y].val; ++ case TCG_COND_GE: ++ return (int64_t)temps[x].val >= (int64_t)temps[y].val; ++ case TCG_COND_LE: ++ return (int64_t)temps[x].val <= (int64_t)temps[y].val; ++ case TCG_COND_GT: ++ return (int64_t)temps[x].val > (int64_t)temps[y].val; ++ case TCG_COND_LTU: ++ return (uint64_t)temps[x].val < (uint64_t)temps[y].val; ++ case TCG_COND_GEU: ++ return (uint64_t)temps[x].val >= (uint64_t)temps[y].val; ++ case TCG_COND_LEU: ++ return (uint64_t)temps[x].val <= (uint64_t)temps[y].val; ++ case TCG_COND_GTU: ++ return (uint64_t)temps[x].val > (uint64_t)temps[y].val; ++ } ++ break; ++ } ++ } else if (temps_are_copies(x, y)) { + switch (c) { +- case TCG_COND_EQ: +- return (uint32_t)x == (uint32_t)y; +- case TCG_COND_NE: +- return (uint32_t)x != (uint32_t)y; +- case TCG_COND_LT: +- return (int32_t)x < (int32_t)y; +- case TCG_COND_GE: +- return (int32_t)x >= (int32_t)y; +- case TCG_COND_LE: +- return (int32_t)x <= (int32_t)y; + case TCG_COND_GT: +- return (int32_t)x > (int32_t)y; + case TCG_COND_LTU: +- return (uint32_t)x < (uint32_t)y; +- case TCG_COND_GEU: +- return (uint32_t)x >= (uint32_t)y; +- case TCG_COND_LEU: +- return (uint32_t)x <= (uint32_t)y; ++ case TCG_COND_LT: + case TCG_COND_GTU: +- return (uint32_t)x > (uint32_t)y; +- } +- break; +- case 64: +- switch (c) { +- case TCG_COND_EQ: +- return (uint64_t)x == (uint64_t)y; + case TCG_COND_NE: +- return (uint64_t)x != (uint64_t)y; +- case TCG_COND_LT: +- return (int64_t)x < (int64_t)y; ++ return 0; + case TCG_COND_GE: +- return (int64_t)x >= (int64_t)y; ++ case TCG_COND_GEU: + case TCG_COND_LE: +- return (int64_t)x <= (int64_t)y; +- case TCG_COND_GT: +- return (int64_t)x > (int64_t)y; ++ case TCG_COND_LEU: ++ case TCG_COND_EQ: ++ return 1; ++ } ++ } else if (temps[y].state == TCG_TEMP_CONST && temps[y].val == 0) { ++ switch (c) { + case TCG_COND_LTU: +- return (uint64_t)x < (uint64_t)y; ++ return 0; + case TCG_COND_GEU: +- return (uint64_t)x >= (uint64_t)y; +- case TCG_COND_LEU: +- return (uint64_t)x <= (uint64_t)y; +- case TCG_COND_GTU: +- return (uint64_t)x > (uint64_t)y; ++ return 1; ++ default: ++ return 2; + } +- break; ++ } else { ++ return 2; + } + + fprintf(stderr, +@@ -636,11 +666,9 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + args += 3; + break; + CASE_OP_32_64(setcond): +- if (temps[args[1]].state == TCG_TEMP_CONST +- && temps[args[2]].state == TCG_TEMP_CONST) { ++ tmp = do_constant_folding_cond(op, args[1], args[2], args[3]); ++ if (tmp != 2) { + gen_opc_buf[op_index] = op_to_movi(op); +- tmp = do_constant_folding_cond(op, temps[args[1]].val, +- temps[args[2]].val, args[3]); + tcg_opt_gen_movi(gen_args, args[0], tmp); + gen_args += 2; + } else { +@@ -654,10 +682,9 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + args += 4; + break; + CASE_OP_32_64(brcond): +- if (temps[args[0]].state == TCG_TEMP_CONST +- && temps[args[1]].state == TCG_TEMP_CONST) { +- if (do_constant_folding_cond(op, temps[args[0]].val, +- temps[args[1]].val, args[2])) { ++ tmp = do_constant_folding_cond(op, args[0], args[1], args[2]); ++ if (tmp != 2) { ++ if (tmp) { + memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info)); + gen_opc_buf[op_index] = INDEX_op_br; + gen_args[0] = args[3]; +@@ -677,10 +704,8 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + args += 4; + break; + CASE_OP_32_64(movcond): +- if (temps[args[1]].state == TCG_TEMP_CONST +- && temps[args[2]].state == TCG_TEMP_CONST) { +- tmp = do_constant_folding_cond(op, temps[args[1]].val, +- temps[args[2]].val, args[5]); ++ tmp = do_constant_folding_cond(op, args[1], args[2], args[5]); ++ if (tmp != 2) { + if (temps_are_copies(args[0], args[4-tmp])) { + gen_opc_buf[op_index] = INDEX_op_nop; + } else if (temps[args[4-tmp]].state == TCG_TEMP_CONST) { +-- +1.7.12.1 + diff --git a/0075-tcg-optimize-prefer-the-op-a-a-b-form-for-commutativ.patch b/0075-tcg-optimize-prefer-the-op-a-a-b-form-for-commutativ.patch new file mode 100644 index 0000000..4cb003b --- /dev/null +++ b/0075-tcg-optimize-prefer-the-op-a-a-b-form-for-commutativ.patch @@ -0,0 +1,38 @@ +From a0b71ad6a3f8aeb8b5ea6d112a7afeadc7c004a4 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Wed, 19 Sep 2012 22:00:22 +0200 +Subject: [PATCH] tcg/optimize: prefer the "op a, a, b" form for commutative + ops + +The "op a, a, b" form is better handled on non-RISC host than the "op +a, b, a" form, so swap the arguments to this form when possible, and +when b is not a constant. + +This reduces the number of generated instructions by a tiny bit. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index abe016a..c8ae50b 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -434,7 +434,10 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + CASE_OP_32_64(eqv): + CASE_OP_32_64(nand): + CASE_OP_32_64(nor): +- if (temps[args[1]].state == TCG_TEMP_CONST) { ++ /* Prefer the constant in second argument, and then the form ++ op a, a, b, which is better handled on non-RISC hosts. */ ++ if (temps[args[1]].state == TCG_TEMP_CONST || (args[0] == args[2] ++ && temps[args[2]].state != TCG_TEMP_CONST)) { + tmp = args[1]; + args[1] = args[2]; + args[2] = tmp; +-- +1.7.12.1 + diff --git a/0076-tcg-remove-ifdef-endif-around-TCGOpcode-tests.patch b/0076-tcg-remove-ifdef-endif-around-TCGOpcode-tests.patch new file mode 100644 index 0000000..214a022 --- /dev/null +++ b/0076-tcg-remove-ifdef-endif-around-TCGOpcode-tests.patch @@ -0,0 +1,68 @@ +From 3942910a66f682b98ac53ac2d2fba65b9c75eefd Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 10:02:45 +0200 +Subject: [PATCH] tcg: remove #ifdef #endif around TCGOpcode tests + +Commit 25c4d9cc changed all TCGOpcode enums to be available, so we don't +need to #ifdef #endif the one that are available only on some targets. +This makes the code easier to read. + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/tcg.c | 13 +------------ + 1 file changed, 1 insertion(+), 12 deletions(-) + +diff --git a/tcg/tcg.c b/tcg/tcg.c +index 24ce830..93421cd 100644 +--- a/tcg/tcg.c ++++ b/tcg/tcg.c +@@ -937,11 +937,7 @@ void tcg_dump_ops(TCGContext *s) + args[nb_oargs + i])); + } + } +- } else if (c == INDEX_op_movi_i32 +-#if TCG_TARGET_REG_BITS == 64 +- || c == INDEX_op_movi_i64 +-#endif +- ) { ++ } else if (c == INDEX_op_movi_i32 || c == INDEX_op_movi_i64) { + tcg_target_ulong val; + TCGHelperInfo *th; + +@@ -993,14 +989,11 @@ void tcg_dump_ops(TCGContext *s) + case INDEX_op_brcond_i32: + case INDEX_op_setcond_i32: + case INDEX_op_movcond_i32: +-#if TCG_TARGET_REG_BITS == 32 + case INDEX_op_brcond2_i32: + case INDEX_op_setcond2_i32: +-#else + case INDEX_op_brcond_i64: + case INDEX_op_setcond_i64: + case INDEX_op_movcond_i64: +-#endif + if (args[k] < ARRAY_SIZE(cond_name) && cond_name[args[k]]) { + qemu_log(",%s", cond_name[args[k++]]); + } else { +@@ -2095,16 +2088,12 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf, + #endif + switch(opc) { + case INDEX_op_mov_i32: +-#if TCG_TARGET_REG_BITS == 64 + case INDEX_op_mov_i64: +-#endif + dead_args = s->op_dead_args[op_index]; + tcg_reg_alloc_mov(s, def, args, dead_args); + break; + case INDEX_op_movi_i32: +-#if TCG_TARGET_REG_BITS == 64 + case INDEX_op_movi_i64: +-#endif + tcg_reg_alloc_movi(s, args); + break; + case INDEX_op_debug_insn_start: +-- +1.7.12.1 + diff --git a/0077-tcg-optimize-add-constant-folding-for-deposit.patch b/0077-tcg-optimize-add-constant-folding-for-deposit.patch new file mode 100644 index 0000000..63566ce --- /dev/null +++ b/0077-tcg-optimize-add-constant-folding-for-deposit.patch @@ -0,0 +1,46 @@ +From 04edfbcf025b5588e0f3b86c74356a4339745f35 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Fri, 21 Sep 2012 11:07:29 +0200 +Subject: [PATCH] tcg/optimize: add constant folding for deposit + +Reviewed-by: Richard Henderson +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/optimize.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +diff --git a/tcg/optimize.c b/tcg/optimize.c +index c8ae50b..35532a1 100644 +--- a/tcg/optimize.c ++++ b/tcg/optimize.c +@@ -668,6 +668,26 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + } + args += 3; + break; ++ CASE_OP_32_64(deposit): ++ if (temps[args[1]].state == TCG_TEMP_CONST ++ && temps[args[2]].state == TCG_TEMP_CONST) { ++ gen_opc_buf[op_index] = op_to_movi(op); ++ tmp = ((1ull << args[4]) - 1); ++ tmp = (temps[args[1]].val & ~(tmp << args[3])) ++ | ((temps[args[2]].val & tmp) << args[3]); ++ tcg_opt_gen_movi(gen_args, args[0], tmp); ++ gen_args += 2; ++ } else { ++ reset_temp(args[0]); ++ gen_args[0] = args[0]; ++ gen_args[1] = args[1]; ++ gen_args[2] = args[2]; ++ gen_args[3] = args[3]; ++ gen_args[4] = args[4]; ++ gen_args += 5; ++ } ++ args += 5; ++ break; + CASE_OP_32_64(setcond): + tmp = do_constant_folding_cond(op, args[1], args[2], args[3]); + if (tmp != 2) { +-- +1.7.12.1 + diff --git a/0078-tcg-README-document-tcg_gen_goto_tb-restrictions.patch b/0078-tcg-README-document-tcg_gen_goto_tb-restrictions.patch new file mode 100644 index 0000000..b47b1f1 --- /dev/null +++ b/0078-tcg-README-document-tcg_gen_goto_tb-restrictions.patch @@ -0,0 +1,33 @@ +From 08de143bdd34e906c3e89443cb6b24665f7c088d Mon Sep 17 00:00:00 2001 +From: Max Filippov +Date: Fri, 21 Sep 2012 04:18:07 +0400 +Subject: [PATCH] tcg/README: document tcg_gen_goto_tb restrictions + +See +http://lists.nongnu.org/archive/html/qemu-devel/2012-09/msg03196.html +for the whole story. + +Signed-off-by: Max Filippov +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/README | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tcg/README b/tcg/README +index d03ae05..33783ee 100644 +--- a/tcg/README ++++ b/tcg/README +@@ -392,7 +392,8 @@ Exit the current TB and return the value t0 (word type). + + Exit the current TB and jump to the TB index 'index' (constant) if the + current TB was linked to this TB. Otherwise execute the next +-instructions. ++instructions. Only indices 0 and 1 are valid and tcg_gen_goto_tb may be issued ++at most once with each slot index per TB. + + * qemu_ld8u t0, t1, flags + qemu_ld8s t0, t1, flags +-- +1.7.12.1 + diff --git a/0079-w64-Fix-TCG-helper-functions-with-5-arguments.patch b/0079-w64-Fix-TCG-helper-functions-with-5-arguments.patch new file mode 100644 index 0000000..3cea914 --- /dev/null +++ b/0079-w64-Fix-TCG-helper-functions-with-5-arguments.patch @@ -0,0 +1,57 @@ +From e35e8b9bb446ff2693962151b8c80c5c88294959 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Thu, 13 Sep 2012 19:37:43 +0200 +Subject: [PATCH] w64: Fix TCG helper functions with 5 arguments + +TCG uses 6 registers for function arguments on 64 bit Linux hosts, +but only 4 registers on W64 hosts. + +Commit 2999a0b20074a7e4a58f56572bb1436749368f59 increased the number +of arguments for some important helper functions from 4 to 5 +which triggered a bug for W64 hosts: QEMU aborts when executing +helper_lcall_real in the guest's BIOS because function +tcg_target_get_call_iarg_regs_count always returned 6. + +As W64 has only 4 registers for arguments, the 5th argument must be +passed on the stack using a correct stack offset. + +Signed-off-by: Stefan Weil +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/i386/tcg-target.c | 2 +- + tcg/i386/tcg-target.h | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c +index aa1fa9f..85c6b81 100644 +--- a/tcg/i386/tcg-target.c ++++ b/tcg/i386/tcg-target.c +@@ -118,7 +118,7 @@ static void patch_reloc(uint8_t *code_ptr, int type, + static inline int tcg_target_get_call_iarg_regs_count(int flags) + { + if (TCG_TARGET_REG_BITS == 64) { +- return 6; ++ return ARRAY_SIZE(tcg_target_call_iarg_regs); + } + + return 0; +diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h +index b356d76..ace63ba 100644 +--- a/tcg/i386/tcg-target.h ++++ b/tcg/i386/tcg-target.h +@@ -67,7 +67,11 @@ typedef enum { + /* used for function call generation */ + #define TCG_REG_CALL_STACK TCG_REG_ESP + #define TCG_TARGET_STACK_ALIGN 16 ++#if defined(_WIN64) ++#define TCG_TARGET_CALL_STACK_OFFSET 32 ++#else + #define TCG_TARGET_CALL_STACK_OFFSET 0 ++#endif + + /* optional instructions */ + #define TCG_TARGET_HAS_div2_i32 1 +-- +1.7.12.1 + diff --git a/0080-tcg-ppc32-Implement-movcond32.patch b/0080-tcg-ppc32-Implement-movcond32.patch new file mode 100644 index 0000000..2877379 --- /dev/null +++ b/0080-tcg-ppc32-Implement-movcond32.patch @@ -0,0 +1,137 @@ +From d65d20819ac52207befffa9a7aa858cc7de9cbaf Mon Sep 17 00:00:00 2001 +From: malc +Date: Sat, 22 Sep 2012 19:14:33 +0400 +Subject: [PATCH] tcg/ppc32: Implement movcond32 + +Thanks to Richard Henderson + +Signed-off-by: malc +Signed-off-by: Michael Roth +--- + tcg/ppc/tcg-target.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + tcg/ppc/tcg-target.h | 2 +- + 2 files changed, 76 insertions(+), 1 deletion(-) + +diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c +index 26c4b33..8f8b193 100644 +--- a/tcg/ppc/tcg-target.c ++++ b/tcg/ppc/tcg-target.c +@@ -390,6 +390,7 @@ static int tcg_target_const_match(tcg_target_long val, + #define ORC XO31(412) + #define EQV XO31(284) + #define NAND XO31(476) ++#define ISEL XO31( 15) + + #define LBZX XO31( 87) + #define LHZX XO31(279) +@@ -1269,6 +1270,72 @@ static void tcg_out_setcond2 (TCGContext *s, const TCGArg *args, + ); + } + ++static void tcg_out_movcond (TCGContext *s, TCGCond cond, ++ TCGArg dest, ++ TCGArg c1, TCGArg c2, ++ TCGArg v1, TCGArg v2, ++ int const_c2) ++{ ++ tcg_out_cmp (s, cond, c1, c2, const_c2, 7); ++ ++ if (1) { ++ /* At least here on 7747A bit twiddling hacks are outperformed ++ by jumpy code (the testing was not scientific) */ ++ if (dest == v2) { ++ cond = tcg_invert_cond (cond); ++ v2 = v1; ++ } ++ else { ++ if (dest != v1) { ++ tcg_out_mov (s, TCG_TYPE_I32, dest, v1); ++ } ++ } ++ /* Branch forward over one insn */ ++ tcg_out32 (s, tcg_to_bc[cond] | 8); ++ tcg_out_mov (s, TCG_TYPE_I32, dest, v2); ++ } ++ else { ++ /* isel version, "if (1)" above should be replaced once a way ++ to figure out availability of isel on the underlying ++ hardware is found */ ++ int tab, bc; ++ ++ switch (cond) { ++ case TCG_COND_EQ: ++ tab = TAB (dest, v1, v2); ++ bc = CR_EQ; ++ break; ++ case TCG_COND_NE: ++ tab = TAB (dest, v2, v1); ++ bc = CR_EQ; ++ break; ++ case TCG_COND_LTU: ++ case TCG_COND_LT: ++ tab = TAB (dest, v1, v2); ++ bc = CR_LT; ++ break; ++ case TCG_COND_GEU: ++ case TCG_COND_GE: ++ tab = TAB (dest, v2, v1); ++ bc = CR_LT; ++ break; ++ case TCG_COND_LEU: ++ case TCG_COND_LE: ++ tab = TAB (dest, v2, v1); ++ bc = CR_GT; ++ break; ++ case TCG_COND_GTU: ++ case TCG_COND_GT: ++ tab = TAB (dest, v1, v2); ++ bc = CR_GT; ++ break; ++ default: ++ tcg_abort (); ++ } ++ tcg_out32 (s, ISEL | tab | ((bc + 28) << 6)); ++ } ++} ++ + static void tcg_out_brcond (TCGContext *s, TCGCond cond, + TCGArg arg1, TCGArg arg2, int const_arg2, + int label_index) +@@ -1826,6 +1893,13 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + ); + break; + ++ case INDEX_op_movcond_i32: ++ tcg_out_movcond (s, args[5], args[0], ++ args[1], args[2], ++ args[3], args[4], ++ const_args[2]); ++ break; ++ + default: + tcg_dump_ops (s); + tcg_abort (); +@@ -1922,6 +1996,7 @@ static const TCGTargetOpDef ppc_op_defs[] = { + { INDEX_op_ext16u_i32, { "r", "r" } }, + + { INDEX_op_deposit_i32, { "r", "0", "r" } }, ++ { INDEX_op_movcond_i32, { "r", "r", "ri", "r", "r" } }, + + { -1 }, + }; +diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h +index 177eea1..3259d89 100644 +--- a/tcg/ppc/tcg-target.h ++++ b/tcg/ppc/tcg-target.h +@@ -92,7 +92,7 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 1 + #define TCG_TARGET_HAS_nor_i32 1 + #define TCG_TARGET_HAS_deposit_i32 1 +-#define TCG_TARGET_HAS_movcond_i32 0 ++#define TCG_TARGET_HAS_movcond_i32 1 + + #define TCG_AREG0 TCG_REG_R27 + +-- +1.7.12.1 + diff --git a/0081-tcg-sparc-Hack-in-qemu_ld-st64-for-32-bit.patch b/0081-tcg-sparc-Hack-in-qemu_ld-st64-for-32-bit.patch new file mode 100644 index 0000000..f84d719 --- /dev/null +++ b/0081-tcg-sparc-Hack-in-qemu_ld-st64-for-32-bit.patch @@ -0,0 +1,30 @@ +From da65fa6c51ef1c999ffc75a162e95285d4cb915b Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Sat, 24 Mar 2012 21:30:20 +0100 +Subject: [PATCH] tcg-sparc: Hack in qemu_ld/st64 for 32-bit. + +Not actually implemented, but at least we avoid the tcg assert at startup. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + tcg/sparc/tcg-target.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index baed3b4..608fc46 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -1556,6 +1556,9 @@ static const TCGTargetOpDef sparc_op_defs[] = { + + { INDEX_op_brcond_i64, { "r", "rJ" } }, + { INDEX_op_setcond_i64, { "r", "r", "rJ" } }, ++#else ++ { INDEX_op_qemu_ld64, { "L", "L", "L" } }, ++ { INDEX_op_qemu_st64, { "L", "L", "L" } }, + #endif + { -1 }, + }; +-- +1.7.12.1 + diff --git a/0082-tcg-sparc-Fix-ADDX-opcode.patch b/0082-tcg-sparc-Fix-ADDX-opcode.patch new file mode 100644 index 0000000..af3a51a --- /dev/null +++ b/0082-tcg-sparc-Fix-ADDX-opcode.patch @@ -0,0 +1,27 @@ +From b92aceeb9604c74e4a66db8ea5dd399d892e94bc Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 23 Mar 2012 23:57:12 +0100 +Subject: [PATCH] tcg-sparc: Fix ADDX opcode. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + tcg/sparc/tcg-target.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index 608fc46..0a19313 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -236,7 +236,7 @@ static inline int tcg_target_const_match(tcg_target_long val, + #define ARITH_XOR (INSN_OP(2) | INSN_OP3(0x03)) + #define ARITH_SUB (INSN_OP(2) | INSN_OP3(0x04)) + #define ARITH_SUBCC (INSN_OP(2) | INSN_OP3(0x14)) +-#define ARITH_ADDX (INSN_OP(2) | INSN_OP3(0x10)) ++#define ARITH_ADDX (INSN_OP(2) | INSN_OP3(0x08)) + #define ARITH_SUBX (INSN_OP(2) | INSN_OP3(0x0c)) + #define ARITH_UMUL (INSN_OP(2) | INSN_OP3(0x0a)) + #define ARITH_UDIV (INSN_OP(2) | INSN_OP3(0x0e)) +-- +1.7.12.1 + diff --git a/0083-tcg-sparc-Don-t-MAP_FIXED-on-top-of-the-program.patch b/0083-tcg-sparc-Don-t-MAP_FIXED-on-top-of-the-program.patch new file mode 100644 index 0000000..3e7946c --- /dev/null +++ b/0083-tcg-sparc-Don-t-MAP_FIXED-on-top-of-the-program.patch @@ -0,0 +1,45 @@ +From 59aadb4f5b15eff968ed00ad29816ac19bef507d Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 10:40:48 -0700 +Subject: [PATCH] tcg-sparc: Don't MAP_FIXED on top of the program + +The address we pick in sparc64.ld is also 0x60000000, so doing a fixed map +on top of that is guaranteed to blow up. Choosing 0x40000000 is exactly +right for the max of code_gen_buffer_size set below. + +No need to ever use MAP_FIXED. While getting our desired address helps +optimize the generated code, we won't fail if we don't get it. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + exec.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/exec.c b/exec.c +index 5834766..871a68a 100644 +--- a/exec.c ++++ b/exec.c +@@ -543,8 +543,7 @@ static void code_gen_alloc(unsigned long tb_size) + code_gen_buffer_size = (800 * 1024 * 1024); + #elif defined(__sparc_v9__) + // Map the buffer below 2G, so we can use direct calls and branches +- flags |= MAP_FIXED; +- start = (void *) 0x60000000UL; ++ start = (void *) 0x40000000UL; + if (code_gen_buffer_size > (512 * 1024 * 1024)) + code_gen_buffer_size = (512 * 1024 * 1024); + #elif defined(__arm__) +@@ -584,8 +583,7 @@ static void code_gen_alloc(unsigned long tb_size) + code_gen_buffer_size = (800 * 1024 * 1024); + #elif defined(__sparc_v9__) + // Map the buffer below 2G, so we can use direct calls and branches +- flags |= MAP_FIXED; +- addr = (void *) 0x60000000UL; ++ addr = (void *) 0x40000000UL; + if (code_gen_buffer_size > (512 * 1024 * 1024)) { + code_gen_buffer_size = (512 * 1024 * 1024); + } +-- +1.7.12.1 + diff --git a/0084-tcg-sparc-Assume-v9-cpu-always-i.e.-force-v8plus-in-.patch b/0084-tcg-sparc-Assume-v9-cpu-always-i.e.-force-v8plus-in-.patch new file mode 100644 index 0000000..a68474a --- /dev/null +++ b/0084-tcg-sparc-Assume-v9-cpu-always-i.e.-force-v8plus-in-.patch @@ -0,0 +1,286 @@ +From cf873edf4227be439a9ffa5abb3da61ff1fd6527 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 10:34:21 -0700 +Subject: [PATCH] tcg-sparc: Assume v9 cpu always, i.e. force v8plus in 32-bit + mode. + +Current code doesn't actually work in 32-bit mode at all. Since +no one really noticed, drop the complication of v7 and v8 cpus. +Eliminate the --sparc_cpu configure option and standardize macro +testing on TCG_TARGET_REG_BITS / HOST_LONG_BITS + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + configure | 40 ++++------------------------------------ + disas.c | 2 -- + exec.c | 6 +++--- + qemu-timer.h | 8 +++++--- + tcg/sparc/tcg-target.c | 20 +++++--------------- + tcg/sparc/tcg-target.h | 7 ++++--- + tcg/tcg.c | 3 ++- + 7 files changed, 23 insertions(+), 63 deletions(-) + +diff --git a/configure b/configure +index 816f0f9..0590f16 100755 +--- a/configure ++++ b/configure +@@ -111,7 +111,6 @@ source_path=`dirname "$0"` + cpu="" + interp_prefix="/usr/gnemul/qemu-%M" + static="no" +-sparc_cpu="" + cross_prefix="" + audio_drv_list="" + audio_card_list="ac97 es1370 sb16 hda" +@@ -249,21 +248,6 @@ for opt do + ;; + --disable-debug-info) debug_info="no" + ;; +- --sparc_cpu=*) +- sparc_cpu="$optarg" +- case $sparc_cpu in +- v7|v8|v8plus|v8plusa) +- cpu="sparc" +- ;; +- v9) +- cpu="sparc64" +- ;; +- *) +- echo "undefined SPARC architecture. Exiting"; +- exit 1 +- ;; +- esac +- ;; + esac + done + # OS specific +@@ -351,8 +335,6 @@ elif check_define __i386__ ; then + elif check_define __x86_64__ ; then + cpu="x86_64" + elif check_define __sparc__ ; then +- # We can't check for 64 bit (when gcc is biarch) or V8PLUSA +- # They must be specified using --sparc_cpu + if check_define __arch64__ ; then + cpu="sparc64" + else +@@ -798,8 +780,6 @@ for opt do + ;; + --enable-uname-release=*) uname_release="$optarg" + ;; +- --sparc_cpu=*) +- ;; + --enable-werror) werror="yes" + ;; + --disable-werror) werror="no" +@@ -883,31 +863,19 @@ for opt do + esac + done + +-# +-# If cpu ~= sparc and sparc_cpu hasn't been defined, plug in the right +-# QEMU_CFLAGS/LDFLAGS (assume sparc_v8plus for 32-bit and sparc_v9 for 64-bit) +-# + host_guest_base="no" + case "$cpu" in +- sparc) case $sparc_cpu in +- v7|v8) +- QEMU_CFLAGS="-mcpu=${sparc_cpu} -D__sparc_${sparc_cpu}__ $QEMU_CFLAGS" +- ;; +- v8plus|v8plusa) +- QEMU_CFLAGS="-mcpu=ultrasparc -D__sparc_${sparc_cpu}__ $QEMU_CFLAGS" +- ;; +- *) # sparc_cpu not defined in the command line +- QEMU_CFLAGS="-mcpu=ultrasparc -D__sparc_v8plus__ $QEMU_CFLAGS" +- esac ++ sparc) + LDFLAGS="-m32 $LDFLAGS" +- QEMU_CFLAGS="-m32 -ffixed-g2 -ffixed-g3 $QEMU_CFLAGS" ++ QEMU_CFLAGS="-m32 -mcpu=ultrasparc $QEMU_CFLAGS" ++ QEMU_CFLAGS="-ffixed-g2 -ffixed-g3 $QEMU_CFLAGS" + if test "$solaris" = "no" ; then + QEMU_CFLAGS="-ffixed-g1 -ffixed-g6 $QEMU_CFLAGS" + fi + ;; + sparc64) +- QEMU_CFLAGS="-m64 -mcpu=ultrasparc -D__sparc_v9__ $QEMU_CFLAGS" + LDFLAGS="-m64 $LDFLAGS" ++ QEMU_CFLAGS="-m64 -mcpu=ultrasparc $QEMU_CFLAGS" + QEMU_CFLAGS="-ffixed-g5 -ffixed-g6 -ffixed-g7 $QEMU_CFLAGS" + if test "$solaris" != "no" ; then + QEMU_CFLAGS="-ffixed-g1 $QEMU_CFLAGS" +diff --git a/disas.c b/disas.c +index 7b2acc9..b801c8f 100644 +--- a/disas.c ++++ b/disas.c +@@ -316,9 +316,7 @@ void disas(FILE *out, void *code, unsigned long size) + print_insn = print_insn_alpha; + #elif defined(__sparc__) + print_insn = print_insn_sparc; +-#if defined(__sparc_v8plus__) || defined(__sparc_v8plusa__) || defined(__sparc_v9__) + disasm_info.mach = bfd_mach_sparc_v9b; +-#endif + #elif defined(__arm__) + print_insn = print_insn_arm; + #elif defined(__MIPSEB__) +diff --git a/exec.c b/exec.c +index 871a68a..ad175db 100644 +--- a/exec.c ++++ b/exec.c +@@ -86,7 +86,7 @@ static int nb_tbs; + /* any access to the tbs or the page table must use this lock */ + spinlock_t tb_lock = SPIN_LOCK_UNLOCKED; + +-#if defined(__arm__) || defined(__sparc_v9__) ++#if defined(__arm__) || defined(__sparc__) + /* The prologue must be reachable with a direct jump. ARM and Sparc64 + have limited branch ranges (possibly also PPC) so place it in a + section close to code segment. */ +@@ -541,7 +541,7 @@ static void code_gen_alloc(unsigned long tb_size) + /* Cannot map more than that */ + if (code_gen_buffer_size > (800 * 1024 * 1024)) + code_gen_buffer_size = (800 * 1024 * 1024); +-#elif defined(__sparc_v9__) ++#elif defined(__sparc__) && HOST_LONG_BITS == 64 + // Map the buffer below 2G, so we can use direct calls and branches + start = (void *) 0x40000000UL; + if (code_gen_buffer_size > (512 * 1024 * 1024)) +@@ -581,7 +581,7 @@ static void code_gen_alloc(unsigned long tb_size) + /* Cannot map more than that */ + if (code_gen_buffer_size > (800 * 1024 * 1024)) + code_gen_buffer_size = (800 * 1024 * 1024); +-#elif defined(__sparc_v9__) ++#elif defined(__sparc__) && HOST_LONG_BITS == 64 + // Map the buffer below 2G, so we can use direct calls and branches + addr = (void *) 0x40000000UL; + if (code_gen_buffer_size > (512 * 1024 * 1024)) { +diff --git a/qemu-timer.h b/qemu-timer.h +index f8af595..da7e97c 100644 +--- a/qemu-timer.h ++++ b/qemu-timer.h +@@ -218,7 +218,7 @@ static inline int64_t cpu_get_real_ticks(void) + return val; + } + +-#elif defined(__sparc_v8plus__) || defined(__sparc_v8plusa__) || defined(__sparc_v9__) ++#elif defined(__sparc__) + + static inline int64_t cpu_get_real_ticks (void) + { +@@ -227,6 +227,8 @@ static inline int64_t cpu_get_real_ticks (void) + asm volatile("rd %%tick,%0" : "=r"(rval)); + return rval; + #else ++ /* We need an %o or %g register for this. For recent enough gcc ++ there is an "h" constraint for that. Don't bother with that. */ + union { + uint64_t i64; + struct { +@@ -234,8 +236,8 @@ static inline int64_t cpu_get_real_ticks (void) + uint32_t low; + } i32; + } rval; +- asm volatile("rd %%tick,%1; srlx %1,32,%0" +- : "=r"(rval.i32.high), "=r"(rval.i32.low)); ++ asm volatile("rd %%tick,%%g1; srlx %%g1,32,%0; mov %%g1,%1" ++ : "=r"(rval.i32.high), "=r"(rval.i32.low) : : "g1"); + return rval.i64; + #endif + } +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index 0a19313..23c2fda 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -621,18 +621,10 @@ static void tcg_out_setcond_i32(TCGContext *s, TCGCond cond, TCGArg ret, + + default: + tcg_out_cmp(s, c1, c2, c2const); +-#if defined(__sparc_v9__) || defined(__sparc_v8plus__) + tcg_out_movi_imm13(s, ret, 0); +- tcg_out32 (s, ARITH_MOVCC | INSN_RD(ret) +- | INSN_RS1(tcg_cond_to_bcond[cond]) +- | MOVCC_ICC | INSN_IMM11(1)); +-#else +- t = gen_new_label(); +- tcg_out_branch_i32(s, INSN_COND(tcg_cond_to_bcond[cond], 1), t); +- tcg_out_movi_imm13(s, ret, 1); +- tcg_out_movi_imm13(s, ret, 0); +- tcg_out_label(s, t, s->code_ptr); +-#endif ++ tcg_out32(s, ARITH_MOVCC | INSN_RD(ret) ++ | INSN_RS1(tcg_cond_to_bcond[cond]) ++ | MOVCC_ICC | INSN_IMM11(1)); + return; + } + +@@ -742,7 +734,7 @@ static const void * const qemu_st_helpers[4] = { + #endif + #endif + +-#ifdef __arch64__ ++#if TCG_TARGET_REG_BITS == 64 + #define HOST_LD_OP LDX + #define HOST_ST_OP STX + #define HOST_SLL_OP SHIFT_SLLX +@@ -1600,11 +1592,9 @@ static void tcg_target_init(TCGContext *s) + + #if TCG_TARGET_REG_BITS == 64 + # define ELF_HOST_MACHINE EM_SPARCV9 +-#elif defined(__sparc_v8plus__) ++#else + # define ELF_HOST_MACHINE EM_SPARC32PLUS + # define ELF_HOST_FLAGS EF_SPARC_32PLUS +-#else +-# define ELF_HOST_MACHINE EM_SPARC + #endif + + typedef struct { +diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h +index d762574..adca1d2 100644 +--- a/tcg/sparc/tcg-target.h ++++ b/tcg/sparc/tcg-target.h +@@ -67,7 +67,8 @@ typedef enum { + + /* used for function call generation */ + #define TCG_REG_CALL_STACK TCG_REG_I6 +-#ifdef __arch64__ ++ ++#if TCG_TARGET_REG_BITS == 64 + // Reserve space for AREG0 + #define TCG_TARGET_STACK_MINFRAME (176 + 4 * (int)sizeof(long) + \ + TCG_STATIC_CALL_ARGS_SIZE) +@@ -81,7 +82,7 @@ typedef enum { + #define TCG_TARGET_STACK_ALIGN 8 + #endif + +-#ifdef __arch64__ ++#if TCG_TARGET_REG_BITS == 64 + #define TCG_TARGET_EXTEND_ARGS 1 + #endif + +@@ -129,7 +130,7 @@ typedef enum { + + #ifdef CONFIG_SOLARIS + #define TCG_AREG0 TCG_REG_G2 +-#elif defined(__sparc_v9__) ++#elif HOST_LONG_BITS == 64 + #define TCG_AREG0 TCG_REG_G5 + #else + #define TCG_AREG0 TCG_REG_G6 +diff --git a/tcg/tcg.c b/tcg/tcg.c +index 93421cd..16c4e1d 100644 +--- a/tcg/tcg.c ++++ b/tcg/tcg.c +@@ -1450,7 +1450,8 @@ static void temp_allocate_frame(TCGContext *s, int temp) + { + TCGTemp *ts; + ts = &s->temps[temp]; +-#ifndef __sparc_v9__ /* Sparc64 stack is accessed with offset of 2047 */ ++#if !(defined(__sparc__) && TCG_TARGET_REG_BITS == 64) ++ /* Sparc64 stack is accessed with offset of 2047 */ + s->current_frame_offset = (s->current_frame_offset + + (tcg_target_long)sizeof(tcg_target_long) - 1) & + ~(sizeof(tcg_target_long) - 1); +-- +1.7.12.1 + diff --git a/0085-tcg-sparc-Fix-qemu_ld-st-to-handle-32-bit-host.patch b/0085-tcg-sparc-Fix-qemu_ld-st-to-handle-32-bit-host.patch new file mode 100644 index 0000000..beaf45b --- /dev/null +++ b/0085-tcg-sparc-Fix-qemu_ld-st-to-handle-32-bit-host.patch @@ -0,0 +1,967 @@ +From 138dfa905538bf918af390ff365a27de49364578 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 23 Mar 2012 23:27:39 +0100 +Subject: [PATCH] tcg-sparc: Fix qemu_ld/st to handle 32-bit host. + +At the same time, split out the tlb load logic to a new function. +Fixes the cases of two data registers and two address registers. +Fixes the signature of, and adds missing, qemu_ld/st opcodes. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + tcg/sparc/tcg-target.c | 777 ++++++++++++++++++++++--------------------------- + 1 file changed, 348 insertions(+), 429 deletions(-) + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index 23c2fda..d89c19b 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -59,8 +59,6 @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + }; + #endif + +-#define ARG_OFFSET 1 +- + static const int tcg_target_reg_alloc_order[] = { + TCG_REG_L0, + TCG_REG_L1, +@@ -288,6 +286,16 @@ static inline int tcg_target_const_match(tcg_target_long val, + #define ASI_PRIMARY_LITTLE 0x88 + #endif + ++#define LDUH_LE (LDUHA | INSN_ASI(ASI_PRIMARY_LITTLE)) ++#define LDSH_LE (LDSHA | INSN_ASI(ASI_PRIMARY_LITTLE)) ++#define LDUW_LE (LDUWA | INSN_ASI(ASI_PRIMARY_LITTLE)) ++#define LDSW_LE (LDSWA | INSN_ASI(ASI_PRIMARY_LITTLE)) ++#define LDX_LE (LDXA | INSN_ASI(ASI_PRIMARY_LITTLE)) ++ ++#define STH_LE (STHA | INSN_ASI(ASI_PRIMARY_LITTLE)) ++#define STW_LE (STWA | INSN_ASI(ASI_PRIMARY_LITTLE)) ++#define STX_LE (STXA | INSN_ASI(ASI_PRIMARY_LITTLE)) ++ + static inline void tcg_out_arith(TCGContext *s, int rd, int rs1, int rs2, + int op) + { +@@ -360,64 +368,43 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, + } + } + +-static inline void tcg_out_ld_raw(TCGContext *s, int ret, +- tcg_target_long arg) +-{ +- tcg_out_sethi(s, ret, arg); +- tcg_out32(s, LDUW | INSN_RD(ret) | INSN_RS1(ret) | +- INSN_IMM13(arg & 0x3ff)); +-} +- +-static inline void tcg_out_ld_ptr(TCGContext *s, int ret, +- tcg_target_long arg) ++static inline void tcg_out_ldst_rr(TCGContext *s, int data, int a1, ++ int a2, int op) + { +- if (!check_fit_tl(arg, 10)) +- tcg_out_movi(s, TCG_TYPE_PTR, ret, arg & ~0x3ffULL); +- if (TCG_TARGET_REG_BITS == 64) { +- tcg_out32(s, LDX | INSN_RD(ret) | INSN_RS1(ret) | +- INSN_IMM13(arg & 0x3ff)); +- } else { +- tcg_out32(s, LDUW | INSN_RD(ret) | INSN_RS1(ret) | +- INSN_IMM13(arg & 0x3ff)); +- } ++ tcg_out32(s, op | INSN_RD(data) | INSN_RS1(a1) | INSN_RS2(a2)); + } + +-static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, int offset, int op) ++static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, ++ int offset, int op) + { +- if (check_fit_tl(offset, 13)) ++ if (check_fit_tl(offset, 13)) { + tcg_out32(s, op | INSN_RD(ret) | INSN_RS1(addr) | + INSN_IMM13(offset)); +- else { ++ } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_I5, offset); +- tcg_out32(s, op | INSN_RD(ret) | INSN_RS1(TCG_REG_I5) | +- INSN_RS2(addr)); ++ tcg_out_ldst_rr(s, ret, addr, TCG_REG_I5, op); + } + } + +-static inline void tcg_out_ldst_asi(TCGContext *s, int ret, int addr, +- int offset, int op, int asi) +-{ +- tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_I5, offset); +- tcg_out32(s, op | INSN_RD(ret) | INSN_RS1(TCG_REG_I5) | +- INSN_ASI(asi) | INSN_RS2(addr)); +-} +- + static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, + TCGReg arg1, tcg_target_long arg2) + { +- if (type == TCG_TYPE_I32) +- tcg_out_ldst(s, ret, arg1, arg2, LDUW); +- else +- tcg_out_ldst(s, ret, arg1, arg2, LDX); ++ tcg_out_ldst(s, ret, arg1, arg2, (type == TCG_TYPE_I32 ? LDUW : LDX)); + } + + static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, tcg_target_long arg2) + { +- if (type == TCG_TYPE_I32) +- tcg_out_ldst(s, arg, arg1, arg2, STW); +- else +- tcg_out_ldst(s, arg, arg1, arg2, STX); ++ tcg_out_ldst(s, arg, arg1, arg2, (type == TCG_TYPE_I32 ? STW : STX)); ++} ++ ++static inline void tcg_out_ld_ptr(TCGContext *s, int ret, ++ tcg_target_long arg) ++{ ++ if (!check_fit_tl(arg, 10)) { ++ tcg_out_movi(s, TCG_TYPE_PTR, ret, arg & ~0x3ff); ++ } ++ tcg_out_ld(s, TCG_TYPE_PTR, ret, ret, arg & 0x3ff); + } + + static inline void tcg_out_sety(TCGContext *s, int rs) +@@ -442,14 +429,15 @@ static inline void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val) + } + } + +-static inline void tcg_out_andi(TCGContext *s, int reg, tcg_target_long val) ++static inline void tcg_out_andi(TCGContext *s, int rd, int rs, ++ tcg_target_long val) + { + if (val != 0) { + if (check_fit_tl(val, 13)) +- tcg_out_arithi(s, reg, reg, val, ARITH_AND); ++ tcg_out_arithi(s, rd, rs, val, ARITH_AND); + else { + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_I5, val); +- tcg_out_arith(s, reg, reg, TCG_REG_I5, ARITH_AND); ++ tcg_out_arith(s, rd, rs, TCG_REG_I5, ARITH_AND); + } + } + } +@@ -718,418 +706,328 @@ static const void * const qemu_st_helpers[4] = { + helper_stl_mmu, + helper_stq_mmu, + }; +-#endif + +-#if TARGET_LONG_BITS == 32 +-#define TARGET_LD_OP LDUW +-#else +-#define TARGET_LD_OP LDX +-#endif ++/* Perform the TLB load and compare. + +-#if defined(CONFIG_SOFTMMU) +-#if HOST_LONG_BITS == 32 +-#define TARGET_ADDEND_LD_OP LDUW ++ Inputs: ++ ADDRLO_IDX contains the index into ARGS of the low part of the ++ address; the high part of the address is at ADDR_LOW_IDX+1. ++ ++ MEM_INDEX and S_BITS are the memory context and log2 size of the load. ++ ++ WHICH is the offset into the CPUTLBEntry structure of the slot to read. ++ This should be offsetof addr_read or addr_write. ++ ++ The result of the TLB comparison is in %[ix]cc. The sanitized address ++ is in the returned register, maybe %o0. The TLB addend is in %o1. */ ++ ++static int tcg_out_tlb_load(TCGContext *s, int addrlo_idx, int mem_index, ++ int s_bits, const TCGArg *args, int which) ++{ ++ const int addrlo = args[addrlo_idx]; ++ const int r0 = TCG_REG_O0; ++ const int r1 = TCG_REG_O1; ++ const int r2 = TCG_REG_O2; ++ int addr = addrlo; ++ int tlb_ofs; ++ ++ if (TCG_TARGET_REG_BITS == 32 && TARGET_LONG_BITS == 64) { ++ /* Assemble the 64-bit address in R0. */ ++ tcg_out_arithi(s, r0, addrlo, 0, SHIFT_SRL); ++ tcg_out_arithi(s, r1, args[addrlo_idx + 1], 32, SHIFT_SLLX); ++ tcg_out_arith(s, r0, r0, r1, ARITH_OR); ++ } ++ ++ /* Shift the page number down to tlb-entry. */ ++ tcg_out_arithi(s, r1, addrlo, ++ TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS, SHIFT_SRL); ++ ++ /* Mask out the page offset, except for the required alignment. */ ++ tcg_out_andi(s, r0, addr, TARGET_PAGE_MASK | ((1 << s_bits) - 1)); ++ ++ /* Compute tlb index, modulo tlb size. */ ++ tcg_out_andi(s, r1, r1, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); ++ ++ /* Relative to the current ENV. */ ++ tcg_out_arith(s, r1, TCG_AREG0, r1, ARITH_ADD); ++ ++ /* Find a base address that can load both tlb comparator and addend. */ ++ tlb_ofs = offsetof(CPUArchState, tlb_table[mem_index][0]); ++ if (!check_fit_tl(tlb_ofs + sizeof(CPUTLBEntry), 13)) { ++ tcg_out_addi(s, r1, tlb_ofs); ++ tlb_ofs = 0; ++ } ++ ++ /* Load the tlb comparator and the addend. */ ++ tcg_out_ld(s, TCG_TYPE_TL, r2, r1, tlb_ofs + which); ++ tcg_out_ld(s, TCG_TYPE_PTR, r1, r1, tlb_ofs+offsetof(CPUTLBEntry, addend)); ++ ++ /* subcc arg0, arg2, %g0 */ ++ tcg_out_cmp(s, r0, r2, 0); ++ ++ /* If the guest address must be zero-extended, do so now. */ ++ if (TCG_TARGET_REG_BITS == 64 && TARGET_LONG_BITS == 32) { ++ tcg_out_arithi(s, r0, addrlo, 0, SHIFT_SRL); ++ return r0; ++ } ++ return addrlo; ++} ++#endif /* CONFIG_SOFTMMU */ ++ ++static const int qemu_ld_opc[8] = { ++#ifdef TARGET_WORDS_BIGENDIAN ++ LDUB, LDUH, LDUW, LDX, LDSB, LDSH, LDSW, LDX + #else +-#define TARGET_ADDEND_LD_OP LDX +-#endif ++ LDUB, LDUH_LE, LDUW_LE, LDX_LE, LDSB, LDSH_LE, LDSW_LE, LDX_LE + #endif ++}; + +-#if TCG_TARGET_REG_BITS == 64 +-#define HOST_LD_OP LDX +-#define HOST_ST_OP STX +-#define HOST_SLL_OP SHIFT_SLLX +-#define HOST_SRA_OP SHIFT_SRAX ++static const int qemu_st_opc[4] = { ++#ifdef TARGET_WORDS_BIGENDIAN ++ STB, STH, STW, STX + #else +-#define HOST_LD_OP LDUW +-#define HOST_ST_OP STW +-#define HOST_SLL_OP SHIFT_SLL +-#define HOST_SRA_OP SHIFT_SRA ++ STB, STH_LE, STW_LE, STX_LE + #endif ++}; + +-static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, +- int opc) ++static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int sizeop) + { +- int addr_reg, data_reg, arg0, arg1, arg2, mem_index, s_bits; ++ int addrlo_idx = 1, datalo, datahi, addr_reg; + #if defined(CONFIG_SOFTMMU) +- uint32_t *label1_ptr, *label2_ptr; ++ int memi_idx, memi, s_bits, n; ++ uint32_t *label_ptr[2]; + #endif + +- data_reg = *args++; +- addr_reg = *args++; +- mem_index = *args; +- s_bits = opc & 3; +- +- arg0 = TCG_REG_O0; +- arg1 = TCG_REG_O1; +- arg2 = TCG_REG_O2; ++ datahi = datalo = args[0]; ++ if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { ++ datahi = args[1]; ++ addrlo_idx = 2; ++ } + + #if defined(CONFIG_SOFTMMU) +- /* srl addr_reg, x, arg1 */ +- tcg_out_arithi(s, arg1, addr_reg, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS, +- SHIFT_SRL); +- /* and addr_reg, x, arg0 */ +- tcg_out_arithi(s, arg0, addr_reg, TARGET_PAGE_MASK | ((1 << s_bits) - 1), +- ARITH_AND); ++ memi_idx = addrlo_idx + 1 + (TARGET_LONG_BITS > TCG_TARGET_REG_BITS); ++ memi = args[memi_idx]; ++ s_bits = sizeop & 3; ++ ++ addr_reg = tcg_out_tlb_load(s, addrlo_idx, memi, s_bits, args, ++ offsetof(CPUTLBEntry, addr_read)); ++ ++ if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { ++ int reg64; ++ ++ /* bne,pn %[xi]cc, label0 */ ++ label_ptr[0] = (uint32_t *)s->code_ptr; ++ tcg_out32(s, (INSN_OP(0) | INSN_COND(COND_NE, 0) | INSN_OP2(0x1) ++ | ((TARGET_LONG_BITS == 64) << 21))); ++ ++ /* TLB Hit. */ ++ /* Load all 64-bits into an O/G register. */ ++ reg64 = (datalo < 16 ? datalo : TCG_REG_O0); ++ tcg_out_ldst_rr(s, reg64, addr_reg, TCG_REG_O1, qemu_ld_opc[sizeop]); ++ ++ /* Move the two 32-bit pieces into the destination registers. */ ++ tcg_out_arithi(s, datahi, reg64, 32, SHIFT_SRLX); ++ if (reg64 != datalo) { ++ tcg_out_mov(s, TCG_TYPE_I32, datalo, reg64); ++ } + +- /* and arg1, x, arg1 */ +- tcg_out_andi(s, arg1, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); ++ /* b,a,pt label1 */ ++ label_ptr[1] = (uint32_t *)s->code_ptr; ++ tcg_out32(s, (INSN_OP(0) | INSN_COND(COND_A, 0) | INSN_OP2(0x1) ++ | (1 << 29) | (1 << 19))); ++ } else { ++ /* The fast path is exactly one insn. Thus we can perform the ++ entire TLB Hit in the (annulled) delay slot of the branch ++ over the TLB Miss case. */ ++ ++ /* beq,a,pt %[xi]cc, label0 */ ++ label_ptr[0] = NULL; ++ label_ptr[1] = (uint32_t *)s->code_ptr; ++ tcg_out32(s, (INSN_OP(0) | INSN_COND(COND_E, 0) | INSN_OP2(0x1) ++ | ((TARGET_LONG_BITS == 64) << 21) ++ | (1 << 29) | (1 << 19))); ++ /* delay slot */ ++ tcg_out_ldst_rr(s, datalo, addr_reg, TCG_REG_O1, qemu_ld_opc[sizeop]); ++ } + +- /* add arg1, x, arg1 */ +- tcg_out_addi(s, arg1, offsetof(CPUArchState, +- tlb_table[mem_index][0].addr_read)); ++ /* TLB Miss. */ + +- /* add env, arg1, arg1 */ +- tcg_out_arith(s, arg1, TCG_AREG0, arg1, ARITH_ADD); ++ if (label_ptr[0]) { ++ *label_ptr[0] |= INSN_OFF19((unsigned long)s->code_ptr - ++ (unsigned long)label_ptr[0]); ++ } ++ n = 0; ++ tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[n++], TCG_AREG0); ++ if (TARGET_LONG_BITS > TCG_TARGET_REG_BITS) { ++ tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n++], ++ args[addrlo_idx + 1]); ++ } ++ tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n++], ++ args[addrlo_idx]); + +- /* ld [arg1], arg2 */ +- tcg_out32(s, TARGET_LD_OP | INSN_RD(arg2) | INSN_RS1(arg1) | +- INSN_RS2(TCG_REG_G0)); ++ /* Store AREG0 in stack to avoid ugly glibc bugs that mangle ++ global registers */ ++ tcg_out_st(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, ++ TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - ++ sizeof(long)); + +- /* subcc arg0, arg2, %g0 */ +- tcg_out_arith(s, TCG_REG_G0, arg0, arg2, ARITH_SUBCC); +- +- /* will become: +- be label1 +- or +- be,pt %xcc label1 */ +- label1_ptr = (uint32_t *)s->code_ptr; +- tcg_out32(s, 0); +- +- /* mov (delay slot) */ +- tcg_out_mov(s, TCG_TYPE_PTR, arg0, addr_reg); +- +- /* mov */ +- tcg_out_movi(s, TCG_TYPE_I32, arg1, mem_index); +- /* XXX/FIXME: suboptimal */ +- tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3], +- tcg_target_call_iarg_regs[2]); +- tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[2], +- tcg_target_call_iarg_regs[1]); +- tcg_out_mov(s, TCG_TYPE_TL, tcg_target_call_iarg_regs[1], +- tcg_target_call_iarg_regs[0]); +- tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], +- TCG_AREG0); +- +- /* XXX: move that code at the end of the TB */ + /* qemu_ld_helper[s_bits](arg0, arg1) */ + tcg_out32(s, CALL | ((((tcg_target_ulong)qemu_ld_helpers[s_bits] + - (tcg_target_ulong)s->code_ptr) >> 2) + & 0x3fffffff)); +- /* Store AREG0 in stack to avoid ugly glibc bugs that mangle +- global registers */ +- // delay slot +- tcg_out_ldst(s, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long), HOST_ST_OP); +- tcg_out_ldst(s, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long), HOST_LD_OP); +- +- /* data_reg = sign_extend(arg0) */ +- switch(opc) { ++ /* delay slot */ ++ tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[n], memi); ++ ++ /* Reload AREG0. */ ++ tcg_out_ld(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, ++ TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - ++ sizeof(long)); ++ ++ n = tcg_target_call_oarg_regs[0]; ++ /* datalo = sign_extend(arg0) */ ++ switch (sizeop) { + case 0 | 4: +- /* sll arg0, 24/56, data_reg */ +- tcg_out_arithi(s, data_reg, arg0, (int)sizeof(tcg_target_long) * 8 - 8, +- HOST_SLL_OP); +- /* sra data_reg, 24/56, data_reg */ +- tcg_out_arithi(s, data_reg, data_reg, +- (int)sizeof(tcg_target_long) * 8 - 8, HOST_SRA_OP); ++ /* Recall that SRA sign extends from bit 31 through bit 63. */ ++ tcg_out_arithi(s, datalo, n, 24, SHIFT_SLL); ++ tcg_out_arithi(s, datalo, datalo, 24, SHIFT_SRA); + break; + case 1 | 4: +- /* sll arg0, 16/48, data_reg */ +- tcg_out_arithi(s, data_reg, arg0, +- (int)sizeof(tcg_target_long) * 8 - 16, HOST_SLL_OP); +- /* sra data_reg, 16/48, data_reg */ +- tcg_out_arithi(s, data_reg, data_reg, +- (int)sizeof(tcg_target_long) * 8 - 16, HOST_SRA_OP); ++ tcg_out_arithi(s, datalo, n, 16, SHIFT_SLL); ++ tcg_out_arithi(s, datalo, datalo, 16, SHIFT_SRA); + break; + case 2 | 4: +- /* sll arg0, 32, data_reg */ +- tcg_out_arithi(s, data_reg, arg0, 32, HOST_SLL_OP); +- /* sra data_reg, 32, data_reg */ +- tcg_out_arithi(s, data_reg, data_reg, 32, HOST_SRA_OP); ++ tcg_out_arithi(s, datalo, n, 0, SHIFT_SRA); + break; ++ case 3: ++ if (TCG_TARGET_REG_BITS == 32) { ++ tcg_out_mov(s, TCG_TYPE_REG, datahi, n); ++ tcg_out_mov(s, TCG_TYPE_REG, datalo, n + 1); ++ break; ++ } ++ /* FALLTHRU */ + case 0: + case 1: + case 2: +- case 3: + default: + /* mov */ +- tcg_out_mov(s, TCG_TYPE_REG, data_reg, arg0); ++ tcg_out_mov(s, TCG_TYPE_REG, datalo, n); + break; + } + +- /* will become: +- ba label2 */ +- label2_ptr = (uint32_t *)s->code_ptr; +- tcg_out32(s, 0); +- +- /* nop (delay slot */ +- tcg_out_nop(s); +- +- /* label1: */ +-#if TARGET_LONG_BITS == 32 +- /* be label1 */ +- *label1_ptr = (INSN_OP(0) | INSN_COND(COND_E, 0) | INSN_OP2(0x2) | +- INSN_OFF22((unsigned long)s->code_ptr - +- (unsigned long)label1_ptr)); +-#else +- /* be,pt %xcc label1 */ +- *label1_ptr = (INSN_OP(0) | INSN_COND(COND_E, 0) | INSN_OP2(0x1) | +- (0x5 << 19) | INSN_OFF19((unsigned long)s->code_ptr - +- (unsigned long)label1_ptr)); +-#endif +- +- /* ld [arg1 + x], arg1 */ +- tcg_out_ldst(s, arg1, arg1, offsetof(CPUTLBEntry, addend) - +- offsetof(CPUTLBEntry, addr_read), TARGET_ADDEND_LD_OP); +- +-#if TARGET_LONG_BITS == 32 +- /* and addr_reg, x, arg0 */ +- tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_I5, 0xffffffff); +- tcg_out_arith(s, arg0, addr_reg, TCG_REG_I5, ARITH_AND); +- /* add arg0, arg1, arg0 */ +- tcg_out_arith(s, arg0, arg0, arg1, ARITH_ADD); ++ *label_ptr[1] |= INSN_OFF19((unsigned long)s->code_ptr - ++ (unsigned long)label_ptr[1]); + #else +- /* add addr_reg, arg1, arg0 */ +- tcg_out_arith(s, arg0, addr_reg, arg1, ARITH_ADD); +-#endif ++ addr_reg = args[addrlo_idx]; ++ if (TCG_TARGET_REG_BITS == 64 && TARGET_LONG_BITS == 32) { ++ tcg_out_arithi(s, TCG_REG_I5, addr_reg, 0, SHIFT_SRL); ++ addr_reg = TCG_REG_I5; ++ } ++ if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { ++ int reg64 = (datalo < 16 ? datalo : TCG_REG_O0); + +-#else +- arg0 = addr_reg; +-#endif ++ tcg_out_ldst_rr(s, reg64, addr_reg, TCG_REG_G0, qemu_ld_opc[sizeop]); + +- switch(opc) { +- case 0: +- /* ldub [arg0], data_reg */ +- tcg_out_ldst(s, data_reg, arg0, 0, LDUB); +- break; +- case 0 | 4: +- /* ldsb [arg0], data_reg */ +- tcg_out_ldst(s, data_reg, arg0, 0, LDSB); +- break; +- case 1: +-#ifdef TARGET_WORDS_BIGENDIAN +- /* lduh [arg0], data_reg */ +- tcg_out_ldst(s, data_reg, arg0, 0, LDUH); +-#else +- /* lduha [arg0] ASI_PRIMARY_LITTLE, data_reg */ +- tcg_out_ldst_asi(s, data_reg, arg0, 0, LDUHA, ASI_PRIMARY_LITTLE); +-#endif +- break; +- case 1 | 4: +-#ifdef TARGET_WORDS_BIGENDIAN +- /* ldsh [arg0], data_reg */ +- tcg_out_ldst(s, data_reg, arg0, 0, LDSH); +-#else +- /* ldsha [arg0] ASI_PRIMARY_LITTLE, data_reg */ +- tcg_out_ldst_asi(s, data_reg, arg0, 0, LDSHA, ASI_PRIMARY_LITTLE); +-#endif +- break; +- case 2: +-#ifdef TARGET_WORDS_BIGENDIAN +- /* lduw [arg0], data_reg */ +- tcg_out_ldst(s, data_reg, arg0, 0, LDUW); +-#else +- /* lduwa [arg0] ASI_PRIMARY_LITTLE, data_reg */ +- tcg_out_ldst_asi(s, data_reg, arg0, 0, LDUWA, ASI_PRIMARY_LITTLE); +-#endif +- break; +- case 2 | 4: +-#ifdef TARGET_WORDS_BIGENDIAN +- /* ldsw [arg0], data_reg */ +- tcg_out_ldst(s, data_reg, arg0, 0, LDSW); +-#else +- /* ldswa [arg0] ASI_PRIMARY_LITTLE, data_reg */ +- tcg_out_ldst_asi(s, data_reg, arg0, 0, LDSWA, ASI_PRIMARY_LITTLE); +-#endif +- break; +- case 3: +-#ifdef TARGET_WORDS_BIGENDIAN +- /* ldx [arg0], data_reg */ +- tcg_out_ldst(s, data_reg, arg0, 0, LDX); +-#else +- /* ldxa [arg0] ASI_PRIMARY_LITTLE, data_reg */ +- tcg_out_ldst_asi(s, data_reg, arg0, 0, LDXA, ASI_PRIMARY_LITTLE); +-#endif +- break; +- default: +- tcg_abort(); ++ tcg_out_arithi(s, datahi, reg64, 32, SHIFT_SRLX); ++ if (reg64 != datalo) { ++ tcg_out_mov(s, TCG_TYPE_I32, datalo, reg64); ++ } ++ } else { ++ tcg_out_ldst_rr(s, datalo, addr_reg, TCG_REG_G0, qemu_ld_opc[sizeop]); + } +- +-#if defined(CONFIG_SOFTMMU) +- /* label2: */ +- *label2_ptr = (INSN_OP(0) | INSN_COND(COND_A, 0) | INSN_OP2(0x2) | +- INSN_OFF22((unsigned long)s->code_ptr - +- (unsigned long)label2_ptr)); +-#endif ++#endif /* CONFIG_SOFTMMU */ + } + +-static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, +- int opc) ++static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int sizeop) + { +- int addr_reg, data_reg, arg0, arg1, arg2, mem_index, s_bits; ++ int addrlo_idx = 1, datalo, datahi, addr_reg; + #if defined(CONFIG_SOFTMMU) +- uint32_t *label1_ptr, *label2_ptr; ++ int memi_idx, memi, n; ++ uint32_t *label_ptr; + #endif + +- data_reg = *args++; +- addr_reg = *args++; +- mem_index = *args; +- +- s_bits = opc; +- +- arg0 = TCG_REG_O0; +- arg1 = TCG_REG_O1; +- arg2 = TCG_REG_O2; ++ datahi = datalo = args[0]; ++ if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { ++ datahi = args[1]; ++ addrlo_idx = 2; ++ } + + #if defined(CONFIG_SOFTMMU) +- /* srl addr_reg, x, arg1 */ +- tcg_out_arithi(s, arg1, addr_reg, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS, +- SHIFT_SRL); +- +- /* and addr_reg, x, arg0 */ +- tcg_out_arithi(s, arg0, addr_reg, TARGET_PAGE_MASK | ((1 << s_bits) - 1), +- ARITH_AND); +- +- /* and arg1, x, arg1 */ +- tcg_out_andi(s, arg1, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); +- +- /* add arg1, x, arg1 */ +- tcg_out_addi(s, arg1, offsetof(CPUArchState, +- tlb_table[mem_index][0].addr_write)); ++ memi_idx = addrlo_idx + 1 + (TARGET_LONG_BITS > TCG_TARGET_REG_BITS); ++ memi = args[memi_idx]; ++ ++ addr_reg = tcg_out_tlb_load(s, addrlo_idx, memi, sizeop, args, ++ offsetof(CPUTLBEntry, addr_write)); ++ ++ if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { ++ /* Reconstruct the full 64-bit value in %g1, using %o2 as temp. */ ++ /* ??? Redefine the temps from %i4/%i5 so that we have a o/g temp. */ ++ tcg_out_arithi(s, TCG_REG_G1, datalo, 0, SHIFT_SRL); ++ tcg_out_arithi(s, TCG_REG_O2, datahi, 32, SHIFT_SLLX); ++ tcg_out_arith(s, TCG_REG_G1, TCG_REG_G1, TCG_REG_O2, ARITH_OR); ++ datalo = TCG_REG_G1; ++ } + +- /* add env, arg1, arg1 */ +- tcg_out_arith(s, arg1, TCG_AREG0, arg1, ARITH_ADD); ++ /* The fast path is exactly one insn. Thus we can perform the entire ++ TLB Hit in the (annulled) delay slot of the branch over TLB Miss. */ ++ /* beq,a,pt %[xi]cc, label0 */ ++ label_ptr = (uint32_t *)s->code_ptr; ++ tcg_out32(s, (INSN_OP(0) | INSN_COND(COND_E, 0) | INSN_OP2(0x1) ++ | ((TARGET_LONG_BITS == 64) << 21) ++ | (1 << 29) | (1 << 19))); ++ /* delay slot */ ++ tcg_out_ldst_rr(s, datalo, addr_reg, TCG_REG_O1, qemu_st_opc[sizeop]); ++ ++ /* TLB Miss. */ ++ ++ n = 0; ++ tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[n++], TCG_AREG0); ++ if (TARGET_LONG_BITS > TCG_TARGET_REG_BITS) { ++ tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n++], ++ args[addrlo_idx + 1]); ++ } ++ tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n++], ++ args[addrlo_idx]); ++ if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { ++ tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n++], datahi); ++ } ++ tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n++], datalo); + +- /* ld [arg1], arg2 */ +- tcg_out32(s, TARGET_LD_OP | INSN_RD(arg2) | INSN_RS1(arg1) | +- INSN_RS2(TCG_REG_G0)); ++ /* Store AREG0 in stack to avoid ugly glibc bugs that mangle ++ global registers */ ++ tcg_out_st(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, ++ TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - ++ sizeof(long)); + +- /* subcc arg0, arg2, %g0 */ +- tcg_out_arith(s, TCG_REG_G0, arg0, arg2, ARITH_SUBCC); +- +- /* will become: +- be label1 +- or +- be,pt %xcc label1 */ +- label1_ptr = (uint32_t *)s->code_ptr; +- tcg_out32(s, 0); +- +- /* mov (delay slot) */ +- tcg_out_mov(s, TCG_TYPE_PTR, arg0, addr_reg); +- +- /* mov */ +- tcg_out_mov(s, TCG_TYPE_REG, arg1, data_reg); +- +- /* mov */ +- tcg_out_movi(s, TCG_TYPE_I32, arg2, mem_index); +- +- /* XXX/FIXME: suboptimal */ +- tcg_out_mov(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3], +- tcg_target_call_iarg_regs[2]); +- tcg_out_mov(s, TCG_TYPE_I64, tcg_target_call_iarg_regs[2], +- tcg_target_call_iarg_regs[1]); +- tcg_out_mov(s, TCG_TYPE_TL, tcg_target_call_iarg_regs[1], +- tcg_target_call_iarg_regs[0]); +- tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], +- TCG_AREG0); +- /* XXX: move that code at the end of the TB */ + /* qemu_st_helper[s_bits](arg0, arg1, arg2) */ +- tcg_out32(s, CALL | ((((tcg_target_ulong)qemu_st_helpers[s_bits] ++ tcg_out32(s, CALL | ((((tcg_target_ulong)qemu_st_helpers[sizeop] + - (tcg_target_ulong)s->code_ptr) >> 2) + & 0x3fffffff)); +- /* Store AREG0 in stack to avoid ugly glibc bugs that mangle +- global registers */ +- // delay slot +- tcg_out_ldst(s, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long), HOST_ST_OP); +- tcg_out_ldst(s, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long), HOST_LD_OP); +- +- /* will become: +- ba label2 */ +- label2_ptr = (uint32_t *)s->code_ptr; +- tcg_out32(s, 0); +- +- /* nop (delay slot) */ +- tcg_out_nop(s); ++ /* delay slot */ ++ tcg_out_movi(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n], memi); + +-#if TARGET_LONG_BITS == 32 +- /* be label1 */ +- *label1_ptr = (INSN_OP(0) | INSN_COND(COND_E, 0) | INSN_OP2(0x2) | +- INSN_OFF22((unsigned long)s->code_ptr - +- (unsigned long)label1_ptr)); +-#else +- /* be,pt %xcc label1 */ +- *label1_ptr = (INSN_OP(0) | INSN_COND(COND_E, 0) | INSN_OP2(0x1) | +- (0x5 << 19) | INSN_OFF19((unsigned long)s->code_ptr - +- (unsigned long)label1_ptr)); +-#endif +- +- /* ld [arg1 + x], arg1 */ +- tcg_out_ldst(s, arg1, arg1, offsetof(CPUTLBEntry, addend) - +- offsetof(CPUTLBEntry, addr_write), TARGET_ADDEND_LD_OP); ++ /* Reload AREG0. */ ++ tcg_out_ld(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, ++ TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - ++ sizeof(long)); + +-#if TARGET_LONG_BITS == 32 +- /* and addr_reg, x, arg0 */ +- tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_I5, 0xffffffff); +- tcg_out_arith(s, arg0, addr_reg, TCG_REG_I5, ARITH_AND); +- /* add arg0, arg1, arg0 */ +- tcg_out_arith(s, arg0, arg0, arg1, ARITH_ADD); ++ *label_ptr |= INSN_OFF19((unsigned long)s->code_ptr - ++ (unsigned long)label_ptr); + #else +- /* add addr_reg, arg1, arg0 */ +- tcg_out_arith(s, arg0, addr_reg, arg1, ARITH_ADD); +-#endif +- +-#else +- arg0 = addr_reg; +-#endif +- +- switch(opc) { +- case 0: +- /* stb data_reg, [arg0] */ +- tcg_out_ldst(s, data_reg, arg0, 0, STB); +- break; +- case 1: +-#ifdef TARGET_WORDS_BIGENDIAN +- /* sth data_reg, [arg0] */ +- tcg_out_ldst(s, data_reg, arg0, 0, STH); +-#else +- /* stha data_reg, [arg0] ASI_PRIMARY_LITTLE */ +- tcg_out_ldst_asi(s, data_reg, arg0, 0, STHA, ASI_PRIMARY_LITTLE); +-#endif +- break; +- case 2: +-#ifdef TARGET_WORDS_BIGENDIAN +- /* stw data_reg, [arg0] */ +- tcg_out_ldst(s, data_reg, arg0, 0, STW); +-#else +- /* stwa data_reg, [arg0] ASI_PRIMARY_LITTLE */ +- tcg_out_ldst_asi(s, data_reg, arg0, 0, STWA, ASI_PRIMARY_LITTLE); +-#endif +- break; +- case 3: +-#ifdef TARGET_WORDS_BIGENDIAN +- /* stx data_reg, [arg0] */ +- tcg_out_ldst(s, data_reg, arg0, 0, STX); +-#else +- /* stxa data_reg, [arg0] ASI_PRIMARY_LITTLE */ +- tcg_out_ldst_asi(s, data_reg, arg0, 0, STXA, ASI_PRIMARY_LITTLE); +-#endif +- break; +- default: +- tcg_abort(); ++ addr_reg = args[addrlo_idx]; ++ if (TCG_TARGET_REG_BITS == 64 && TARGET_LONG_BITS == 32) { ++ tcg_out_arithi(s, TCG_REG_I5, addr_reg, 0, SHIFT_SRL); ++ addr_reg = TCG_REG_I5; + } +- +-#if defined(CONFIG_SOFTMMU) +- /* label2: */ +- *label2_ptr = (INSN_OP(0) | INSN_COND(COND_A, 0) | INSN_OP2(0x2) | +- INSN_OFF22((unsigned long)s->code_ptr - +- (unsigned long)label2_ptr)); +-#endif ++ if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { ++ /* Reconstruct the full 64-bit value in %g1, using %o2 as temp. */ ++ /* ??? Redefine the temps from %i4/%i5 so that we have a o/g temp. */ ++ tcg_out_arithi(s, TCG_REG_G1, datalo, 0, SHIFT_SRL); ++ tcg_out_arithi(s, TCG_REG_O2, datahi, 32, SHIFT_SLLX); ++ tcg_out_arith(s, TCG_REG_G1, TCG_REG_G1, TCG_REG_O2, ARITH_OR); ++ datalo = TCG_REG_G1; ++ } ++ tcg_out_ldst_rr(s, datalo, addr_reg, TCG_REG_G0, qemu_st_opc[sizeop]); ++#endif /* CONFIG_SOFTMMU */ + } + + static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, +@@ -1175,12 +1073,12 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + /* Store AREG0 in stack to avoid ugly glibc bugs that mangle + global registers */ + // delay slot +- tcg_out_ldst(s, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long), HOST_ST_OP); +- tcg_out_ldst(s, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long), HOST_LD_OP); ++ tcg_out_st(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, ++ TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - ++ sizeof(long)); ++ tcg_out_ld(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, ++ TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - ++ sizeof(long)); + break; + case INDEX_op_jmp: + case INDEX_op_br: +@@ -1348,6 +1246,9 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + tcg_out_qemu_ld(s, args, 2 | 4); + break; + #endif ++ case INDEX_op_qemu_ld64: ++ tcg_out_qemu_ld(s, args, 3); ++ break; + case INDEX_op_qemu_st8: + tcg_out_qemu_st(s, args, 0); + break; +@@ -1357,6 +1258,9 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + case INDEX_op_qemu_st32: + tcg_out_qemu_st(s, args, 2); + break; ++ case INDEX_op_qemu_st64: ++ tcg_out_qemu_st(s, args, 3); ++ break; + + #if TCG_TARGET_REG_BITS == 64 + case INDEX_op_movi_i64: +@@ -1421,13 +1325,6 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + args[2], const_args[2]); + break; + +- case INDEX_op_qemu_ld64: +- tcg_out_qemu_ld(s, args, 3); +- break; +- case INDEX_op_qemu_st64: +- tcg_out_qemu_st(s, args, 3); +- break; +- + #endif + gen_arith: + tcg_out_arithc(s, args[0], args[1], args[2], const_args[2], c); +@@ -1492,20 +1389,6 @@ static const TCGTargetOpDef sparc_op_defs[] = { + { INDEX_op_mulu2_i32, { "r", "r", "r", "rJ" } }, + #endif + +- { INDEX_op_qemu_ld8u, { "r", "L" } }, +- { INDEX_op_qemu_ld8s, { "r", "L" } }, +- { INDEX_op_qemu_ld16u, { "r", "L" } }, +- { INDEX_op_qemu_ld16s, { "r", "L" } }, +- { INDEX_op_qemu_ld32, { "r", "L" } }, +-#if TCG_TARGET_REG_BITS == 64 +- { INDEX_op_qemu_ld32u, { "r", "L" } }, +- { INDEX_op_qemu_ld32s, { "r", "L" } }, +-#endif +- +- { INDEX_op_qemu_st8, { "L", "L" } }, +- { INDEX_op_qemu_st16, { "L", "L" } }, +- { INDEX_op_qemu_st32, { "L", "L" } }, +- + #if TCG_TARGET_REG_BITS == 64 + { INDEX_op_mov_i64, { "r", "r" } }, + { INDEX_op_movi_i64, { "r" } }, +@@ -1520,8 +1403,6 @@ static const TCGTargetOpDef sparc_op_defs[] = { + { INDEX_op_st16_i64, { "r", "r" } }, + { INDEX_op_st32_i64, { "r", "r" } }, + { INDEX_op_st_i64, { "r", "r" } }, +- { INDEX_op_qemu_ld64, { "L", "L" } }, +- { INDEX_op_qemu_st64, { "L", "L" } }, + + { INDEX_op_add_i64, { "r", "r", "rJ" } }, + { INDEX_op_mul_i64, { "r", "r", "rJ" } }, +@@ -1548,10 +1429,48 @@ static const TCGTargetOpDef sparc_op_defs[] = { + + { INDEX_op_brcond_i64, { "r", "rJ" } }, + { INDEX_op_setcond_i64, { "r", "r", "rJ" } }, +-#else +- { INDEX_op_qemu_ld64, { "L", "L", "L" } }, ++#endif ++ ++#if TCG_TARGET_REG_BITS == 64 ++ { INDEX_op_qemu_ld8u, { "r", "L" } }, ++ { INDEX_op_qemu_ld8s, { "r", "L" } }, ++ { INDEX_op_qemu_ld16u, { "r", "L" } }, ++ { INDEX_op_qemu_ld16s, { "r", "L" } }, ++ { INDEX_op_qemu_ld32, { "r", "L" } }, ++ { INDEX_op_qemu_ld32u, { "r", "L" } }, ++ { INDEX_op_qemu_ld32s, { "r", "L" } }, ++ { INDEX_op_qemu_ld64, { "r", "L" } }, ++ ++ { INDEX_op_qemu_st8, { "L", "L" } }, ++ { INDEX_op_qemu_st16, { "L", "L" } }, ++ { INDEX_op_qemu_st32, { "L", "L" } }, ++ { INDEX_op_qemu_st64, { "L", "L" } }, ++#elif TARGET_LONG_BITS <= TCG_TARGET_REG_BITS ++ { INDEX_op_qemu_ld8u, { "r", "L" } }, ++ { INDEX_op_qemu_ld8s, { "r", "L" } }, ++ { INDEX_op_qemu_ld16u, { "r", "L" } }, ++ { INDEX_op_qemu_ld16s, { "r", "L" } }, ++ { INDEX_op_qemu_ld32, { "r", "L" } }, ++ { INDEX_op_qemu_ld64, { "r", "r", "L" } }, ++ ++ { INDEX_op_qemu_st8, { "L", "L" } }, ++ { INDEX_op_qemu_st16, { "L", "L" } }, ++ { INDEX_op_qemu_st32, { "L", "L" } }, + { INDEX_op_qemu_st64, { "L", "L", "L" } }, ++#else ++ { INDEX_op_qemu_ld8u, { "r", "L", "L" } }, ++ { INDEX_op_qemu_ld8s, { "r", "L", "L" } }, ++ { INDEX_op_qemu_ld16u, { "r", "L", "L" } }, ++ { INDEX_op_qemu_ld16s, { "r", "L", "L" } }, ++ { INDEX_op_qemu_ld32, { "r", "L", "L" } }, ++ { INDEX_op_qemu_ld64, { "L", "L", "L", "L" } }, ++ ++ { INDEX_op_qemu_st8, { "L", "L", "L" } }, ++ { INDEX_op_qemu_st16, { "L", "L", "L" } }, ++ { INDEX_op_qemu_st32, { "L", "L", "L" } }, ++ { INDEX_op_qemu_st64, { "L", "L", "L", "L" } }, + #endif ++ + { -1 }, + }; + +-- +1.7.12.1 + diff --git a/0086-tcg-sparc-Support-GUEST_BASE.patch b/0086-tcg-sparc-Support-GUEST_BASE.patch new file mode 100644 index 0000000..3e8a175 --- /dev/null +++ b/0086-tcg-sparc-Support-GUEST_BASE.patch @@ -0,0 +1,113 @@ +From fecc7bd255206876152baab622c61902133066bd Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Sat, 24 Mar 2012 22:11:25 +0100 +Subject: [PATCH] tcg-sparc: Support GUEST_BASE. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + configure | 2 ++ + tcg/sparc/tcg-target.c | 26 +++++++++++++++++++++++--- + tcg/sparc/tcg-target.h | 2 ++ + 3 files changed, 27 insertions(+), 3 deletions(-) + +diff --git a/configure b/configure +index 0590f16..9139b5c 100755 +--- a/configure ++++ b/configure +@@ -872,6 +872,7 @@ case "$cpu" in + if test "$solaris" = "no" ; then + QEMU_CFLAGS="-ffixed-g1 -ffixed-g6 $QEMU_CFLAGS" + fi ++ host_guest_base="yes" + ;; + sparc64) + LDFLAGS="-m64 $LDFLAGS" +@@ -880,6 +881,7 @@ case "$cpu" in + if test "$solaris" != "no" ; then + QEMU_CFLAGS="-ffixed-g1 $QEMU_CFLAGS" + fi ++ host_guest_base="yes" + ;; + s390) + QEMU_CFLAGS="-m31 -march=z990 $QEMU_CFLAGS" +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index d89c19b..5acfeba 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -59,6 +59,12 @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + }; + #endif + ++#ifdef CONFIG_USE_GUEST_BASE ++# define TCG_GUEST_BASE_REG TCG_REG_I3 ++#else ++# define TCG_GUEST_BASE_REG TCG_REG_G0 ++#endif ++ + static const int tcg_target_reg_alloc_order[] = { + TCG_REG_L0, + TCG_REG_L1, +@@ -680,6 +686,14 @@ static void tcg_target_qemu_prologue(TCGContext *s) + tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) | + INSN_IMM13(-(TCG_TARGET_STACK_MINFRAME + + CPU_TEMP_BUF_NLONGS * (int)sizeof(long)))); ++ ++#ifdef CONFIG_USE_GUEST_BASE ++ if (GUEST_BASE != 0) { ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, GUEST_BASE); ++ tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG); ++ } ++#endif ++ + tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_I1) | + INSN_RS2(TCG_REG_G0)); + tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, TCG_REG_I0); +@@ -925,14 +939,18 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int sizeop) + if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { + int reg64 = (datalo < 16 ? datalo : TCG_REG_O0); + +- tcg_out_ldst_rr(s, reg64, addr_reg, TCG_REG_G0, qemu_ld_opc[sizeop]); ++ tcg_out_ldst_rr(s, reg64, addr_reg, ++ (GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_G0), ++ qemu_ld_opc[sizeop]); + + tcg_out_arithi(s, datahi, reg64, 32, SHIFT_SRLX); + if (reg64 != datalo) { + tcg_out_mov(s, TCG_TYPE_I32, datalo, reg64); + } + } else { +- tcg_out_ldst_rr(s, datalo, addr_reg, TCG_REG_G0, qemu_ld_opc[sizeop]); ++ tcg_out_ldst_rr(s, datalo, addr_reg, ++ (GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_G0), ++ qemu_ld_opc[sizeop]); + } + #endif /* CONFIG_SOFTMMU */ + } +@@ -1026,7 +1044,9 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int sizeop) + tcg_out_arith(s, TCG_REG_G1, TCG_REG_G1, TCG_REG_O2, ARITH_OR); + datalo = TCG_REG_G1; + } +- tcg_out_ldst_rr(s, datalo, addr_reg, TCG_REG_G0, qemu_st_opc[sizeop]); ++ tcg_out_ldst_rr(s, datalo, addr_reg, ++ (GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_G0), ++ qemu_st_opc[sizeop]); + #endif /* CONFIG_SOFTMMU */ + } + +diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h +index adca1d2..99e9f57 100644 +--- a/tcg/sparc/tcg-target.h ++++ b/tcg/sparc/tcg-target.h +@@ -128,6 +128,8 @@ typedef enum { + #define TCG_TARGET_HAS_movcond_i64 0 + #endif + ++#define TCG_TARGET_HAS_GUEST_BASE ++ + #ifdef CONFIG_SOLARIS + #define TCG_AREG0 TCG_REG_G2 + #elif HOST_LONG_BITS == 64 +-- +1.7.12.1 + diff --git a/0087-tcg-sparc-Change-AREG0-in-generated-code-to-i0.patch b/0087-tcg-sparc-Change-AREG0-in-generated-code-to-i0.patch new file mode 100644 index 0000000..336d7fe --- /dev/null +++ b/0087-tcg-sparc-Change-AREG0-in-generated-code-to-i0.patch @@ -0,0 +1,51 @@ +From d526285d4339f02e3be64a7287d1e009dd5bff3d Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Sun, 25 Mar 2012 19:52:11 +0200 +Subject: [PATCH] tcg-sparc: Change AREG0 in generated code to %i0. + +We can now move the TCG variable from %g[56] to a call-preserved +windowed register. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + tcg/sparc/tcg-target.c | 3 ++- + tcg/sparc/tcg-target.h | 8 +------- + 2 files changed, 3 insertions(+), 8 deletions(-) + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index 5acfeba..9ab5746 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -696,7 +696,8 @@ static void tcg_target_qemu_prologue(TCGContext *s) + + tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_I1) | + INSN_RS2(TCG_REG_G0)); +- tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, TCG_REG_I0); ++ /* delay slot */ ++ tcg_out_nop(s); + } + + #if defined(CONFIG_SOFTMMU) +diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h +index 99e9f57..ee154d0 100644 +--- a/tcg/sparc/tcg-target.h ++++ b/tcg/sparc/tcg-target.h +@@ -130,13 +130,7 @@ typedef enum { + + #define TCG_TARGET_HAS_GUEST_BASE + +-#ifdef CONFIG_SOLARIS +-#define TCG_AREG0 TCG_REG_G2 +-#elif HOST_LONG_BITS == 64 +-#define TCG_AREG0 TCG_REG_G5 +-#else +-#define TCG_AREG0 TCG_REG_G6 +-#endif ++#define TCG_AREG0 TCG_REG_I0 + + static inline void flush_icache_range(tcg_target_ulong start, + tcg_target_ulong stop) +-- +1.7.12.1 + diff --git a/0088-tcg-sparc-Clean-up-cruft-stemming-from-attempts-to-u.patch b/0088-tcg-sparc-Clean-up-cruft-stemming-from-attempts-to-u.patch new file mode 100644 index 0000000..15c4571 --- /dev/null +++ b/0088-tcg-sparc-Clean-up-cruft-stemming-from-attempts-to-u.patch @@ -0,0 +1,203 @@ +From 5767c23140f2c92b899d9caeaa8e08711cb63868 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Sun, 25 Mar 2012 21:21:46 +0200 +Subject: [PATCH] tcg-sparc: Clean up cruft stemming from attempts to use + global registers. + +Don't use -ffixed-gN. Don't link statically. Don't save/restore +AREG0 around calls. Don't allocate space on the stack for AREG0 save. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + configure | 12 ----------- + tcg/sparc/tcg-target.c | 55 +++++++++++++++++--------------------------------- + tcg/sparc/tcg-target.h | 18 +++++++---------- + 3 files changed, 26 insertions(+), 59 deletions(-) + +diff --git a/configure b/configure +index 9139b5c..8ffddf4 100755 +--- a/configure ++++ b/configure +@@ -868,19 +868,11 @@ case "$cpu" in + sparc) + LDFLAGS="-m32 $LDFLAGS" + QEMU_CFLAGS="-m32 -mcpu=ultrasparc $QEMU_CFLAGS" +- QEMU_CFLAGS="-ffixed-g2 -ffixed-g3 $QEMU_CFLAGS" +- if test "$solaris" = "no" ; then +- QEMU_CFLAGS="-ffixed-g1 -ffixed-g6 $QEMU_CFLAGS" +- fi + host_guest_base="yes" + ;; + sparc64) + LDFLAGS="-m64 $LDFLAGS" + QEMU_CFLAGS="-m64 -mcpu=ultrasparc $QEMU_CFLAGS" +- QEMU_CFLAGS="-ffixed-g5 -ffixed-g6 -ffixed-g7 $QEMU_CFLAGS" +- if test "$solaris" != "no" ; then +- QEMU_CFLAGS="-ffixed-g1 $QEMU_CFLAGS" +- fi + host_guest_base="yes" + ;; + s390) +@@ -4055,10 +4047,6 @@ fi + + if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then + case "$ARCH" in +- sparc) +- # -static is used to avoid g1/g3 usage by the dynamic linker +- ldflags="$linker_script -static $ldflags" +- ;; + alpha | s390x) + # The default placement of the application is fine. + ;; +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index 9ab5746..e625aa3 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -161,7 +161,6 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O0); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O1); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O2); +- tcg_regset_reset_reg(ct->u.regs, TCG_REG_O3); + break; + case 'I': + ct->ct |= TCG_CT_CONST_S11; +@@ -681,11 +680,22 @@ static void tcg_out_setcond2_i32(TCGContext *s, TCGCond cond, TCGArg ret, + /* Generate global QEMU prologue and epilogue code */ + static void tcg_target_qemu_prologue(TCGContext *s) + { +- tcg_set_frame(s, TCG_REG_I6, TCG_TARGET_CALL_STACK_OFFSET, +- CPU_TEMP_BUF_NLONGS * (int)sizeof(long)); ++ int tmp_buf_size, frame_size; ++ ++ /* The TCG temp buffer is at the top of the frame, immediately ++ below the frame pointer. */ ++ tmp_buf_size = CPU_TEMP_BUF_NLONGS * (int)sizeof(long); ++ tcg_set_frame(s, TCG_REG_I6, TCG_TARGET_STACK_BIAS - tmp_buf_size, ++ tmp_buf_size); ++ ++ /* TCG_TARGET_CALL_STACK_OFFSET includes the stack bias, but is ++ otherwise the minimal frame usable by callees. */ ++ frame_size = TCG_TARGET_CALL_STACK_OFFSET - TCG_TARGET_STACK_BIAS; ++ frame_size += TCG_STATIC_CALL_ARGS_SIZE + tmp_buf_size; ++ frame_size += TCG_TARGET_STACK_ALIGN - 1; ++ frame_size &= -TCG_TARGET_STACK_ALIGN; + tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) | +- INSN_IMM13(-(TCG_TARGET_STACK_MINFRAME + +- CPU_TEMP_BUF_NLONGS * (int)sizeof(long)))); ++ INSN_IMM13(-frame_size)); + + #ifdef CONFIG_USE_GUEST_BASE + if (GUEST_BASE != 0) { +@@ -698,6 +708,8 @@ static void tcg_target_qemu_prologue(TCGContext *s) + INSN_RS2(TCG_REG_G0)); + /* delay slot */ + tcg_out_nop(s); ++ ++ /* No epilogue required. We issue ret + restore directly in the TB. */ + } + + #if defined(CONFIG_SOFTMMU) +@@ -880,12 +892,6 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int sizeop) + tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n++], + args[addrlo_idx]); + +- /* Store AREG0 in stack to avoid ugly glibc bugs that mangle +- global registers */ +- tcg_out_st(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long)); +- + /* qemu_ld_helper[s_bits](arg0, arg1) */ + tcg_out32(s, CALL | ((((tcg_target_ulong)qemu_ld_helpers[s_bits] + - (tcg_target_ulong)s->code_ptr) >> 2) +@@ -893,11 +899,6 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int sizeop) + /* delay slot */ + tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[n], memi); + +- /* Reload AREG0. */ +- tcg_out_ld(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long)); +- + n = tcg_target_call_oarg_regs[0]; + /* datalo = sign_extend(arg0) */ + switch (sizeop) { +@@ -1011,12 +1012,6 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int sizeop) + } + tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n++], datalo); + +- /* Store AREG0 in stack to avoid ugly glibc bugs that mangle +- global registers */ +- tcg_out_st(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long)); +- + /* qemu_st_helper[s_bits](arg0, arg1, arg2) */ + tcg_out32(s, CALL | ((((tcg_target_ulong)qemu_st_helpers[sizeop] + - (tcg_target_ulong)s->code_ptr) >> 2) +@@ -1024,11 +1019,6 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int sizeop) + /* delay slot */ + tcg_out_movi(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[n], memi); + +- /* Reload AREG0. */ +- tcg_out_ld(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long)); +- + *label_ptr |= INSN_OFF19((unsigned long)s->code_ptr - + (unsigned long)label_ptr); + #else +@@ -1091,15 +1081,8 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + tcg_out32(s, JMPL | INSN_RD(TCG_REG_O7) | INSN_RS1(TCG_REG_I5) | + INSN_RS2(TCG_REG_G0)); + } +- /* Store AREG0 in stack to avoid ugly glibc bugs that mangle +- global registers */ +- // delay slot +- tcg_out_st(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long)); +- tcg_out_ld(s, TCG_TYPE_REG, TCG_AREG0, TCG_REG_CALL_STACK, +- TCG_TARGET_CALL_STACK_OFFSET - TCG_STATIC_CALL_ARGS_SIZE - +- sizeof(long)); ++ /* delay slot */ ++ tcg_out_nop(s); + break; + case INDEX_op_jmp: + case INDEX_op_br: +diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h +index ee154d0..6314ffb 100644 +--- a/tcg/sparc/tcg-target.h ++++ b/tcg/sparc/tcg-target.h +@@ -66,20 +66,16 @@ typedef enum { + #define TCG_CT_CONST_S13 0x200 + + /* used for function call generation */ +-#define TCG_REG_CALL_STACK TCG_REG_I6 ++#define TCG_REG_CALL_STACK TCG_REG_O6 + + #if TCG_TARGET_REG_BITS == 64 +-// Reserve space for AREG0 +-#define TCG_TARGET_STACK_MINFRAME (176 + 4 * (int)sizeof(long) + \ +- TCG_STATIC_CALL_ARGS_SIZE) +-#define TCG_TARGET_CALL_STACK_OFFSET (2047 - 16) +-#define TCG_TARGET_STACK_ALIGN 16 ++#define TCG_TARGET_STACK_BIAS 2047 ++#define TCG_TARGET_STACK_ALIGN 16 ++#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS) + #else +-// AREG0 + one word for alignment +-#define TCG_TARGET_STACK_MINFRAME (92 + (2 + 1) * (int)sizeof(long) + \ +- TCG_STATIC_CALL_ARGS_SIZE) +-#define TCG_TARGET_CALL_STACK_OFFSET TCG_TARGET_STACK_MINFRAME +-#define TCG_TARGET_STACK_ALIGN 8 ++#define TCG_TARGET_STACK_BIAS 0 ++#define TCG_TARGET_STACK_ALIGN 8 ++#define TCG_TARGET_CALL_STACK_OFFSET (64 + 4 + 6*4) + #endif + + #if TCG_TARGET_REG_BITS == 64 +-- +1.7.12.1 + diff --git a/0089-tcg-sparc-Mask-shift-immediates-to-avoid-illegal-ins.patch b/0089-tcg-sparc-Mask-shift-immediates-to-avoid-illegal-ins.patch new file mode 100644 index 0000000..7ce69d1 --- /dev/null +++ b/0089-tcg-sparc-Mask-shift-immediates-to-avoid-illegal-ins.patch @@ -0,0 +1,62 @@ +From 12e60f780a097837840ab1e7bb7d54b8c15112e8 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Sun, 25 Mar 2012 21:36:28 +0200 +Subject: [PATCH] tcg-sparc: Mask shift immediates to avoid illegal insns. + +The xtensa-test image generates a sra_i32 with count 0x40. +Whether this is accident of tcg constant propagation or +originating directly from the instruction stream is immaterial. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + tcg/sparc/tcg-target.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index e625aa3..be5c170 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -1154,13 +1154,16 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + goto gen_arith; + case INDEX_op_shl_i32: + c = SHIFT_SLL; +- goto gen_arith; ++ do_shift32: ++ /* Limit immediate shift count lest we create an illegal insn. */ ++ tcg_out_arithc(s, args[0], args[1], args[2] & 31, const_args[2], c); ++ break; + case INDEX_op_shr_i32: + c = SHIFT_SRL; +- goto gen_arith; ++ goto do_shift32; + case INDEX_op_sar_i32: + c = SHIFT_SRA; +- goto gen_arith; ++ goto do_shift32; + case INDEX_op_mul_i32: + c = ARITH_UMUL; + goto gen_arith; +@@ -1281,13 +1284,16 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + break; + case INDEX_op_shl_i64: + c = SHIFT_SLLX; +- goto gen_arith; ++ do_shift64: ++ /* Limit immediate shift count lest we create an illegal insn. */ ++ tcg_out_arithc(s, args[0], args[1], args[2] & 63, const_args[2], c); ++ break; + case INDEX_op_shr_i64: + c = SHIFT_SRLX; +- goto gen_arith; ++ goto do_shift64; + case INDEX_op_sar_i64: + c = SHIFT_SRAX; +- goto gen_arith; ++ goto do_shift64; + case INDEX_op_mul_i64: + c = ARITH_MULX; + goto gen_arith; +-- +1.7.12.1 + diff --git a/0090-tcg-sparc-Use-defines-for-temporaries.patch b/0090-tcg-sparc-Use-defines-for-temporaries.patch new file mode 100644 index 0000000..c837d22 --- /dev/null +++ b/0090-tcg-sparc-Use-defines-for-temporaries.patch @@ -0,0 +1,275 @@ +From fc9726f880dea515a2cf98456c5f03a1388e4e14 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Sun, 25 Mar 2012 22:04:59 +0200 +Subject: [PATCH] tcg-sparc: Use defines for temporaries. + +And change from %i4/%i5 to %g1/%o7 to remove a v8plus fixme. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + tcg/sparc/tcg-target.c | 115 +++++++++++++++++++++++++------------------------ + 1 file changed, 59 insertions(+), 56 deletions(-) + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index be5c170..d401f8e 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -59,8 +59,12 @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + }; + #endif + ++/* Define some temporary registers. T2 is used for constant generation. */ ++#define TCG_REG_T1 TCG_REG_G1 ++#define TCG_REG_T2 TCG_REG_O7 ++ + #ifdef CONFIG_USE_GUEST_BASE +-# define TCG_GUEST_BASE_REG TCG_REG_I3 ++# define TCG_GUEST_BASE_REG TCG_REG_I5 + #else + # define TCG_GUEST_BASE_REG TCG_REG_G0 + #endif +@@ -79,6 +83,7 @@ static const int tcg_target_reg_alloc_order[] = { + TCG_REG_I2, + TCG_REG_I3, + TCG_REG_I4, ++ TCG_REG_I5, + }; + + static const int tcg_target_call_iarg_regs[6] = { +@@ -366,10 +371,10 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, + tcg_out_sethi(s, ret, ~arg); + tcg_out_arithi(s, ret, ret, (arg & 0x3ff) | -0x400, ARITH_XOR); + } else { +- tcg_out_movi_imm32(s, TCG_REG_I4, arg >> (TCG_TARGET_REG_BITS / 2)); +- tcg_out_arithi(s, TCG_REG_I4, TCG_REG_I4, 32, SHIFT_SLLX); +- tcg_out_movi_imm32(s, ret, arg); +- tcg_out_arith(s, ret, ret, TCG_REG_I4, ARITH_OR); ++ tcg_out_movi_imm32(s, ret, arg >> (TCG_TARGET_REG_BITS / 2)); ++ tcg_out_arithi(s, ret, ret, 32, SHIFT_SLLX); ++ tcg_out_movi_imm32(s, TCG_REG_T2, arg); ++ tcg_out_arith(s, ret, ret, TCG_REG_T2, ARITH_OR); + } + } + +@@ -386,8 +391,8 @@ static inline void tcg_out_ldst(TCGContext *s, int ret, int addr, + tcg_out32(s, op | INSN_RD(ret) | INSN_RS1(addr) | + INSN_IMM13(offset)); + } else { +- tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_I5, offset); +- tcg_out_ldst_rr(s, ret, addr, TCG_REG_I5, op); ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T1, offset); ++ tcg_out_ldst_rr(s, ret, addr, TCG_REG_T1, op); + } + } + +@@ -428,8 +433,8 @@ static inline void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val) + if (check_fit_tl(val, 13)) + tcg_out_arithi(s, reg, reg, val, ARITH_ADD); + else { +- tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_I5, val); +- tcg_out_arith(s, reg, reg, TCG_REG_I5, ARITH_ADD); ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T1, val); ++ tcg_out_arith(s, reg, reg, TCG_REG_T1, ARITH_ADD); + } + } + } +@@ -441,8 +446,8 @@ static inline void tcg_out_andi(TCGContext *s, int rd, int rs, + if (check_fit_tl(val, 13)) + tcg_out_arithi(s, rd, rs, val, ARITH_AND); + else { +- tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_I5, val); +- tcg_out_arith(s, rd, rs, TCG_REG_I5, ARITH_AND); ++ tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_T1, val); ++ tcg_out_arith(s, rd, rs, TCG_REG_T1, ARITH_AND); + } + } + } +@@ -454,8 +459,8 @@ static void tcg_out_div32(TCGContext *s, int rd, int rs1, + if (uns) { + tcg_out_sety(s, TCG_REG_G0); + } else { +- tcg_out_arithi(s, TCG_REG_I5, rs1, 31, SHIFT_SRA); +- tcg_out_sety(s, TCG_REG_I5); ++ tcg_out_arithi(s, TCG_REG_T1, rs1, 31, SHIFT_SRA); ++ tcg_out_sety(s, TCG_REG_T1); + } + + tcg_out_arithc(s, rd, rs1, val2, val2const, +@@ -601,8 +606,8 @@ static void tcg_out_setcond_i32(TCGContext *s, TCGCond cond, TCGArg ret, + case TCG_COND_GTU: + case TCG_COND_GEU: + if (c2const && c2 != 0) { +- tcg_out_movi_imm13(s, TCG_REG_I5, c2); +- c2 = TCG_REG_I5; ++ tcg_out_movi_imm13(s, TCG_REG_T1, c2); ++ c2 = TCG_REG_T1; + } + t = c1, c1 = c2, c2 = t, c2const = 0; + cond = tcg_swap_cond(cond); +@@ -649,15 +654,15 @@ static void tcg_out_setcond2_i32(TCGContext *s, TCGCond cond, TCGArg ret, + + switch (cond) { + case TCG_COND_EQ: +- tcg_out_setcond_i32(s, TCG_COND_EQ, TCG_REG_I5, al, bl, blconst); ++ tcg_out_setcond_i32(s, TCG_COND_EQ, TCG_REG_T1, al, bl, blconst); + tcg_out_setcond_i32(s, TCG_COND_EQ, ret, ah, bh, bhconst); +- tcg_out_arith(s, ret, ret, TCG_REG_I5, ARITH_AND); ++ tcg_out_arith(s, ret, ret, TCG_REG_T1, ARITH_AND); + break; + + case TCG_COND_NE: +- tcg_out_setcond_i32(s, TCG_COND_NE, TCG_REG_I5, al, al, blconst); ++ tcg_out_setcond_i32(s, TCG_COND_NE, TCG_REG_T1, al, al, blconst); + tcg_out_setcond_i32(s, TCG_COND_NE, ret, ah, bh, bhconst); +- tcg_out_arith(s, ret, ret, TCG_REG_I5, ARITH_OR); ++ tcg_out_arith(s, ret, ret, TCG_REG_T1, ARITH_OR); + break; + + default: +@@ -935,8 +940,8 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, int sizeop) + #else + addr_reg = args[addrlo_idx]; + if (TCG_TARGET_REG_BITS == 64 && TARGET_LONG_BITS == 32) { +- tcg_out_arithi(s, TCG_REG_I5, addr_reg, 0, SHIFT_SRL); +- addr_reg = TCG_REG_I5; ++ tcg_out_arithi(s, TCG_REG_T1, addr_reg, 0, SHIFT_SRL); ++ addr_reg = TCG_REG_T1; + } + if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { + int reg64 = (datalo < 16 ? datalo : TCG_REG_O0); +@@ -979,12 +984,11 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int sizeop) + offsetof(CPUTLBEntry, addr_write)); + + if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { +- /* Reconstruct the full 64-bit value in %g1, using %o2 as temp. */ +- /* ??? Redefine the temps from %i4/%i5 so that we have a o/g temp. */ +- tcg_out_arithi(s, TCG_REG_G1, datalo, 0, SHIFT_SRL); ++ /* Reconstruct the full 64-bit value. */ ++ tcg_out_arithi(s, TCG_REG_T1, datalo, 0, SHIFT_SRL); + tcg_out_arithi(s, TCG_REG_O2, datahi, 32, SHIFT_SLLX); +- tcg_out_arith(s, TCG_REG_G1, TCG_REG_G1, TCG_REG_O2, ARITH_OR); +- datalo = TCG_REG_G1; ++ tcg_out_arith(s, TCG_REG_O2, TCG_REG_T1, TCG_REG_O2, ARITH_OR); ++ datalo = TCG_REG_O2; + } + + /* The fast path is exactly one insn. Thus we can perform the entire +@@ -1024,16 +1028,14 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, int sizeop) + #else + addr_reg = args[addrlo_idx]; + if (TCG_TARGET_REG_BITS == 64 && TARGET_LONG_BITS == 32) { +- tcg_out_arithi(s, TCG_REG_I5, addr_reg, 0, SHIFT_SRL); +- addr_reg = TCG_REG_I5; ++ tcg_out_arithi(s, TCG_REG_T1, addr_reg, 0, SHIFT_SRL); ++ addr_reg = TCG_REG_T1; + } + if (TCG_TARGET_REG_BITS == 32 && sizeop == 3) { +- /* Reconstruct the full 64-bit value in %g1, using %o2 as temp. */ +- /* ??? Redefine the temps from %i4/%i5 so that we have a o/g temp. */ +- tcg_out_arithi(s, TCG_REG_G1, datalo, 0, SHIFT_SRL); ++ tcg_out_arithi(s, TCG_REG_T1, datalo, 0, SHIFT_SRL); + tcg_out_arithi(s, TCG_REG_O2, datahi, 32, SHIFT_SLLX); +- tcg_out_arith(s, TCG_REG_G1, TCG_REG_G1, TCG_REG_O2, ARITH_OR); +- datalo = TCG_REG_G1; ++ tcg_out_arith(s, TCG_REG_O2, TCG_REG_T1, TCG_REG_O2, ARITH_OR); ++ datalo = TCG_REG_O2; + } + tcg_out_ldst_rr(s, datalo, addr_reg, + (GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_G0), +@@ -1057,28 +1059,29 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + case INDEX_op_goto_tb: + if (s->tb_jmp_offset) { + /* direct jump method */ +- tcg_out_sethi(s, TCG_REG_I5, args[0] & 0xffffe000); +- tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_I5) | ++ tcg_out_sethi(s, TCG_REG_T1, args[0] & 0xffffe000); ++ tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_T1) | + INSN_IMM13((args[0] & 0x1fff))); + s->tb_jmp_offset[args[0]] = s->code_ptr - s->code_buf; + } else { + /* indirect jump method */ +- tcg_out_ld_ptr(s, TCG_REG_I5, (tcg_target_long)(s->tb_next + args[0])); +- tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_I5) | ++ tcg_out_ld_ptr(s, TCG_REG_T1, ++ (tcg_target_long)(s->tb_next + args[0])); ++ tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_T1) | + INSN_RS2(TCG_REG_G0)); + } + tcg_out_nop(s); + s->tb_next_offset[args[0]] = s->code_ptr - s->code_buf; + break; + case INDEX_op_call: +- if (const_args[0]) ++ if (const_args[0]) { + tcg_out32(s, CALL | ((((tcg_target_ulong)args[0] + - (tcg_target_ulong)s->code_ptr) >> 2) + & 0x3fffffff)); +- else { +- tcg_out_ld_ptr(s, TCG_REG_I5, ++ } else { ++ tcg_out_ld_ptr(s, TCG_REG_T1, + (tcg_target_long)(s->tb_next + args[0])); +- tcg_out32(s, JMPL | INSN_RD(TCG_REG_O7) | INSN_RS1(TCG_REG_I5) | ++ tcg_out32(s, JMPL | INSN_RD(TCG_REG_O7) | INSN_RS1(TCG_REG_T1) | + INSN_RS2(TCG_REG_G0)); + } + /* delay slot */ +@@ -1184,11 +1187,11 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + + case INDEX_op_rem_i32: + case INDEX_op_remu_i32: +- tcg_out_div32(s, TCG_REG_I5, args[1], args[2], const_args[2], ++ tcg_out_div32(s, TCG_REG_T1, args[1], args[2], const_args[2], + opc == INDEX_op_remu_i32); +- tcg_out_arithc(s, TCG_REG_I5, TCG_REG_I5, args[2], const_args[2], ++ tcg_out_arithc(s, TCG_REG_T1, TCG_REG_T1, args[2], const_args[2], + ARITH_UMUL); +- tcg_out_arith(s, args[0], args[1], TCG_REG_I5, ARITH_SUB); ++ tcg_out_arith(s, args[0], args[1], TCG_REG_T1, ARITH_SUB); + break; + + case INDEX_op_brcond_i32: +@@ -1305,11 +1308,11 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + goto gen_arith; + case INDEX_op_rem_i64: + case INDEX_op_remu_i64: +- tcg_out_arithc(s, TCG_REG_I5, args[1], args[2], const_args[2], ++ tcg_out_arithc(s, TCG_REG_T1, args[1], args[2], const_args[2], + opc == INDEX_op_rem_i64 ? ARITH_SDIVX : ARITH_UDIVX); +- tcg_out_arithc(s, TCG_REG_I5, TCG_REG_I5, args[2], const_args[2], ++ tcg_out_arithc(s, TCG_REG_T1, TCG_REG_T1, args[2], const_args[2], + ARITH_MULX); +- tcg_out_arith(s, args[0], args[1], TCG_REG_I5, ARITH_SUB); ++ tcg_out_arith(s, args[0], args[1], TCG_REG_T1, ARITH_SUB); + break; + case INDEX_op_ext32s_i64: + if (const_args[1]) { +@@ -1507,15 +1510,15 @@ static void tcg_target_init(TCGContext *s) + (1 << TCG_REG_O7)); + + tcg_regset_clear(s->reserved_regs); +- tcg_regset_set_reg(s->reserved_regs, TCG_REG_G0); +-#if TCG_TARGET_REG_BITS == 64 +- tcg_regset_set_reg(s->reserved_regs, TCG_REG_I4); // for internal use +-#endif +- tcg_regset_set_reg(s->reserved_regs, TCG_REG_I5); // for internal use +- tcg_regset_set_reg(s->reserved_regs, TCG_REG_I6); +- tcg_regset_set_reg(s->reserved_regs, TCG_REG_I7); +- tcg_regset_set_reg(s->reserved_regs, TCG_REG_O6); +- tcg_regset_set_reg(s->reserved_regs, TCG_REG_O7); ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_G0); /* zero */ ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_G6); /* reserved for os */ ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_G7); /* thread pointer */ ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_I6); /* frame pointer */ ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_I7); /* return address */ ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_O6); /* stack pointer */ ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_T1); /* for internal use */ ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_T2); /* for internal use */ ++ + tcg_add_target_add_op_defs(sparc_op_defs); + } + +-- +1.7.12.1 + diff --git a/0091-tcg-sparc-Add-g-o-registers-to-alloc_order.patch b/0091-tcg-sparc-Add-g-o-registers-to-alloc_order.patch new file mode 100644 index 0000000..2bf9e95 --- /dev/null +++ b/0091-tcg-sparc-Add-g-o-registers-to-alloc_order.patch @@ -0,0 +1,44 @@ +From ca72cdf648b56d851c4bc9145a1abfcbeeec0579 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Sun, 25 Mar 2012 22:43:17 +0200 +Subject: [PATCH] tcg-sparc: Add %g/%o registers to alloc_order + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + tcg/sparc/tcg-target.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index d401f8e..03c385a 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -78,12 +78,25 @@ static const int tcg_target_reg_alloc_order[] = { + TCG_REG_L5, + TCG_REG_L6, + TCG_REG_L7, ++ + TCG_REG_I0, + TCG_REG_I1, + TCG_REG_I2, + TCG_REG_I3, + TCG_REG_I4, + TCG_REG_I5, ++ ++ TCG_REG_G2, ++ TCG_REG_G3, ++ TCG_REG_G4, ++ TCG_REG_G5, ++ ++ TCG_REG_O0, ++ TCG_REG_O1, ++ TCG_REG_O2, ++ TCG_REG_O3, ++ TCG_REG_O4, ++ TCG_REG_O5, + }; + + static const int tcg_target_call_iarg_regs[6] = { +-- +1.7.12.1 + diff --git a/0092-tcg-sparc-Fix-and-enable-direct-TB-chaining.patch b/0092-tcg-sparc-Fix-and-enable-direct-TB-chaining.patch new file mode 100644 index 0000000..7b876c0 --- /dev/null +++ b/0092-tcg-sparc-Fix-and-enable-direct-TB-chaining.patch @@ -0,0 +1,79 @@ +From 1338a6f18ff9b651c12ee1f7edd1d2b7684bd6aa Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 10:48:51 -0700 +Subject: [PATCH] tcg-sparc: Fix and enable direct TB chaining. + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + exec-all.h | 9 ++++++--- + tcg/sparc/tcg-target.c | 21 ++++++++++++++++++--- + 2 files changed, 24 insertions(+), 6 deletions(-) + +diff --git a/exec-all.h b/exec-all.h +index c5d3a13..1f81da7 100644 +--- a/exec-all.h ++++ b/exec-all.h +@@ -132,9 +132,10 @@ static inline void tlb_flush(CPUArchState *env, int flush_global) + #define CODE_GEN_AVG_BLOCK_SIZE 64 + #endif + +-#if defined(_ARCH_PPC) || defined(__x86_64__) || defined(__arm__) || defined(__i386__) +-#define USE_DIRECT_JUMP +-#elif defined(CONFIG_TCG_INTERPRETER) ++#if defined(__arm__) || defined(_ARCH_PPC) \ ++ || defined(__x86_64__) || defined(__i386__) \ ++ || defined(__sparc__) \ ++ || defined(CONFIG_TCG_INTERPRETER) + #define USE_DIRECT_JUMP + #endif + +@@ -244,6 +245,8 @@ static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) + __asm __volatile__ ("swi 0x9f0002" : : "r" (_beg), "r" (_end), "r" (_flg)); + #endif + } ++#elif defined(__sparc__) ++void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr); + #else + #error tb_set_jmp_target1 is missing + #endif +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index 03c385a..1db0c9d 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -1072,10 +1072,10 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + case INDEX_op_goto_tb: + if (s->tb_jmp_offset) { + /* direct jump method */ +- tcg_out_sethi(s, TCG_REG_T1, args[0] & 0xffffe000); +- tcg_out32(s, JMPL | INSN_RD(TCG_REG_G0) | INSN_RS1(TCG_REG_T1) | +- INSN_IMM13((args[0] & 0x1fff))); ++ uint32_t old_insn = *(uint32_t *)s->code_ptr; + s->tb_jmp_offset[args[0]] = s->code_ptr - s->code_buf; ++ /* Make sure to preserve links during retranslation. */ ++ tcg_out32(s, CALL | (old_insn & ~INSN_OP(-1))); + } else { + /* indirect jump method */ + tcg_out_ld_ptr(s, TCG_REG_T1, +@@ -1595,3 +1595,18 @@ void tcg_register_jit(void *buf, size_t buf_size) + + tcg_register_jit_int(buf, buf_size, &debug_frame, sizeof(debug_frame)); + } ++ ++void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) ++{ ++ uint32_t *ptr = (uint32_t *)jmp_addr; ++ tcg_target_long disp = (tcg_target_long)(addr - jmp_addr) >> 2; ++ ++ /* We can reach the entire address space for 32-bit. For 64-bit ++ the code_gen_buffer can't be larger than 2GB. */ ++ if (TCG_TARGET_REG_BITS == 64 && !check_fit_tl(disp, 30)) { ++ tcg_abort(); ++ } ++ ++ *ptr = CALL | (disp & 0x3fffffff); ++ flush_icache_range(jmp_addr, jmp_addr + 4); ++} +-- +1.7.12.1 + diff --git a/0093-tcg-sparc-Preserve-branch-destinations-during-retran.patch b/0093-tcg-sparc-Preserve-branch-destinations-during-retran.patch new file mode 100644 index 0000000..167dc41 --- /dev/null +++ b/0093-tcg-sparc-Preserve-branch-destinations-during-retran.patch @@ -0,0 +1,60 @@ +From 2cbc27913eb9eb7cdc4a41fc6efafccf3db7ebe6 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 11:00:23 -0700 +Subject: [PATCH] tcg-sparc: Preserve branch destinations during retranslation + +Signed-off-by: Richard Henderson +Signed-off-by: Michael Roth +--- + tcg/sparc/tcg-target.c | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +diff --git a/tcg/sparc/tcg-target.c b/tcg/sparc/tcg-target.c +index 1db0c9d..876da4f 100644 +--- a/tcg/sparc/tcg-target.c ++++ b/tcg/sparc/tcg-target.c +@@ -488,30 +488,33 @@ static inline void tcg_out_nop(TCGContext *s) + static void tcg_out_branch_i32(TCGContext *s, int opc, int label_index) + { + TCGLabel *l = &s->labels[label_index]; ++ uint32_t off22; + + if (l->has_value) { +- tcg_out32(s, (INSN_OP(0) | INSN_COND(opc, 0) | INSN_OP2(0x2) +- | INSN_OFF22(l->u.value - (unsigned long)s->code_ptr))); ++ off22 = INSN_OFF22(l->u.value - (unsigned long)s->code_ptr); + } else { ++ /* Make sure to preserve destinations during retranslation. */ ++ off22 = *(uint32_t *)s->code_ptr & INSN_OFF22(-1); + tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP22, label_index, 0); +- tcg_out32(s, (INSN_OP(0) | INSN_COND(opc, 0) | INSN_OP2(0x2) | 0)); + } ++ tcg_out32(s, INSN_OP(0) | INSN_COND(opc, 0) | INSN_OP2(0x2) | off22); + } + + #if TCG_TARGET_REG_BITS == 64 + static void tcg_out_branch_i64(TCGContext *s, int opc, int label_index) + { + TCGLabel *l = &s->labels[label_index]; ++ uint32_t off19; + + if (l->has_value) { +- tcg_out32(s, (INSN_OP(0) | INSN_COND(opc, 0) | INSN_OP2(0x1) | +- (0x5 << 19) | +- INSN_OFF19(l->u.value - (unsigned long)s->code_ptr))); ++ off19 = INSN_OFF19(l->u.value - (unsigned long)s->code_ptr); + } else { ++ /* Make sure to preserve destinations during retranslation. */ ++ off19 = *(uint32_t *)s->code_ptr & INSN_OFF19(-1); + tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP19, label_index, 0); +- tcg_out32(s, (INSN_OP(0) | INSN_COND(opc, 0) | INSN_OP2(0x1) | +- (0x5 << 19) | 0)); + } ++ tcg_out32(s, (INSN_OP(0) | INSN_COND(opc, 0) | INSN_OP2(0x1) | ++ (0x5 << 19) | off19)); + } + #endif + +-- +1.7.12.1 + diff --git a/0094-target-alpha-Initialize-env-cpu_model_str.patch b/0094-target-alpha-Initialize-env-cpu_model_str.patch new file mode 100644 index 0000000..9734b0e --- /dev/null +++ b/0094-target-alpha-Initialize-env-cpu_model_str.patch @@ -0,0 +1,33 @@ +From fcf8cef0c7d8d197e863c1e8b7bcb567fa1fe729 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 14:15:36 +0200 +Subject: [PATCH] target-alpha: Initialize env->cpu_model_str +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Save the cpu_model_str so that we have a non-null value when +creating a new cpu during clone. + +Signed-off-by: Richard Henderson +Signed-off-by: Andreas Färber +Signed-off-by: Michael Roth +--- + target-alpha/translate.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/target-alpha/translate.c b/target-alpha/translate.c +index 4a9011a..3f9aee1 100644 +--- a/target-alpha/translate.c ++++ b/target-alpha/translate.c +@@ -3543,6 +3543,7 @@ CPUAlphaState * cpu_alpha_init (const char *cpu_model) + } + env->implver = implver; + env->amask = amask; ++ env->cpu_model_str = cpu_model; + + qemu_init_vcpu(env); + return env; +-- +1.7.12.1 + diff --git a/0095-tcg-mips-fix-MIPS32-R2-detection.patch b/0095-tcg-mips-fix-MIPS32-R2-detection.patch new file mode 100644 index 0000000..e145e3b --- /dev/null +++ b/0095-tcg-mips-fix-MIPS32-R2-detection.patch @@ -0,0 +1,93 @@ +From 66588d01b8cb710d746c249a34f31f7f353bc697 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Sat, 22 Sep 2012 23:08:38 +0200 +Subject: [PATCH] tcg/mips: fix MIPS32(R2) detection + +Fix the MIPS32(R2) cpu detection so that it also works with +-march=octeon. Thanks to Andrew Pinski for the hint. + +Cc: Andrew Pinski +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/mips/tcg-target.c | 10 +++++----- + tcg/mips/tcg-target.h | 8 ++++---- + 2 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/tcg/mips/tcg-target.c b/tcg/mips/tcg-target.c +index c272b38..e9a1ffb 100644 +--- a/tcg/mips/tcg-target.c ++++ b/tcg/mips/tcg-target.c +@@ -425,7 +425,7 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, + + static inline void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg) + { +-#ifdef _MIPS_ARCH_MIPS32R2 ++#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) + tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); + #else + /* ret and arg can't be register at */ +@@ -442,7 +442,7 @@ static inline void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg) + + static inline void tcg_out_bswap16s(TCGContext *s, TCGReg ret, TCGReg arg) + { +-#ifdef _MIPS_ARCH_MIPS32R2 ++#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) + tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); + tcg_out_opc_reg(s, OPC_SEH, ret, 0, ret); + #else +@@ -460,7 +460,7 @@ static inline void tcg_out_bswap16s(TCGContext *s, TCGReg ret, TCGReg arg) + + static inline void tcg_out_bswap32(TCGContext *s, TCGReg ret, TCGReg arg) + { +-#ifdef _MIPS_ARCH_MIPS32R2 ++#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) + tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); + tcg_out_opc_sa(s, OPC_ROTR, ret, ret, 16); + #else +@@ -486,7 +486,7 @@ static inline void tcg_out_bswap32(TCGContext *s, TCGReg ret, TCGReg arg) + + static inline void tcg_out_ext8s(TCGContext *s, TCGReg ret, TCGReg arg) + { +-#ifdef _MIPS_ARCH_MIPS32R2 ++#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) + tcg_out_opc_reg(s, OPC_SEB, ret, 0, arg); + #else + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 24); +@@ -496,7 +496,7 @@ static inline void tcg_out_ext8s(TCGContext *s, TCGReg ret, TCGReg arg) + + static inline void tcg_out_ext16s(TCGContext *s, TCGReg ret, TCGReg arg) + { +-#ifdef _MIPS_ARCH_MIPS32R2 ++#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) + tcg_out_opc_reg(s, OPC_SEH, ret, 0, arg); + #else + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 16); +diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h +index d147e70..7020d65 100644 +--- a/tcg/mips/tcg-target.h ++++ b/tcg/mips/tcg-target.h +@@ -88,16 +88,16 @@ typedef enum { + #define TCG_TARGET_HAS_nand_i32 0 + + /* optional instructions only implemented on MIPS4, MIPS32 and Loongson 2 */ +-#if defined(_MIPS_ARCH_MIPS4) || defined(_MIPS_ARCH_MIPS32) || \ +- defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_LOONGSON2E) || \ +- defined(_MIPS_ARCH_LOONGSON2F) ++#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \ ++ defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \ ++ defined(_MIPS_ARCH_MIPS4) + #define TCG_TARGET_HAS_movcond_i32 1 + #else + #define TCG_TARGET_HAS_movcond_i32 0 + #endif + + /* optional instructions only implemented on MIPS32R2 */ +-#ifdef _MIPS_ARCH_MIPS32R2 ++#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) + #define TCG_TARGET_HAS_bswap16_i32 1 + #define TCG_TARGET_HAS_bswap32_i32 1 + #define TCG_TARGET_HAS_rot_i32 1 +-- +1.7.12.1 + diff --git a/0096-tcg-Adjust-descriptions-of-cond-opcodes.patch b/0096-tcg-Adjust-descriptions-of-cond-opcodes.patch new file mode 100644 index 0000000..64c62cb --- /dev/null +++ b/0096-tcg-Adjust-descriptions-of-cond-opcodes.patch @@ -0,0 +1,67 @@ +From a2c90b264762d3ddcc9a830653315a6fe9107055 Mon Sep 17 00:00:00 2001 +From: Richard Henderson +Date: Fri, 21 Sep 2012 17:18:09 -0700 +Subject: [PATCH] tcg: Adjust descriptions of *cond opcodes + +The README file documented the operand ordering of the tcg_gen_* +functions. Since we're documenting opcodes here, use the true +operand ordering. + +Signed-off-by: Richard Henderson +Cc: malc +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/README | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/tcg/README b/tcg/README +index 33783ee..27846f1 100644 +--- a/tcg/README ++++ b/tcg/README +@@ -141,7 +141,7 @@ Define label 'label' at the current program point. + + Jump to label. + +-* brcond_i32/i64 cond, t0, t1, label ++* brcond_i32/i64 t0, t1, cond, label + + Conditional jump if t0 cond t1 is true. cond can be: + TCG_COND_EQ +@@ -301,13 +301,13 @@ This operation would be equivalent to + + ********* Conditional moves + +-* setcond_i32/i64 cond, dest, t1, t2 ++* setcond_i32/i64 dest, t1, t2, cond + + dest = (t1 cond t2) + + Set DEST to 1 if (T1 cond T2) is true, otherwise set to 0. + +-* movcond_i32/i64 cond, dest, c1, c2, v1, v2 ++* movcond_i32/i64 dest, c1, c2, v1, v2, cond + + dest = (c1 cond c2 ? v1 : v2) + +@@ -360,7 +360,7 @@ The following opcodes are internal to TCG. Thus they are to be implemented by + 32-bit host code generators, but are not to be emitted by guest translators. + They are emitted as needed by inline functions within "tcg-op.h". + +-* brcond2_i32 cond, t0_low, t0_high, t1_low, t1_high, label ++* brcond2_i32 t0_low, t0_high, t1_low, t1_high, cond, label + + Similar to brcond, except that the 64-bit values T0 and T1 + are formed from two 32-bit arguments. +@@ -377,7 +377,7 @@ is returned in two 32-bit outputs. + Similar to mul, except two 32-bit (unsigned) inputs T1 and T2 yielding + the full 64-bit product T0. The later is returned in two 32-bit outputs. + +-* setcond2_i32 cond, dest, t1_low, t1_high, t2_low, t2_high ++* setcond2_i32 dest, t1_low, t1_high, t2_low, t2_high, cond + + Similar to setcond, except that the 64-bit values T1 and T2 are + formed from two 32-bit arguments. The result is a 32-bit value. +-- +1.7.12.1 + diff --git a/0097-tcg-i386-fix-build-with-march-i686.patch b/0097-tcg-i386-fix-build-with-march-i686.patch new file mode 100644 index 0000000..a841086 --- /dev/null +++ b/0097-tcg-i386-fix-build-with-march-i686.patch @@ -0,0 +1,34 @@ +From 5d3868bb343df0c13240521e36d0cc942c7a2d04 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Wed, 26 Sep 2012 00:30:12 +0200 +Subject: [PATCH] tcg/i386: fix build with -march < i686 + +The movcond_i32 op has to be protected with TCG_TARGET_HAS_movcond_i32 +to fix the build with -march < i686. + +Thanks to Richard Henderson for the hint. + +Reported-by: Alex Barcelo +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/i386/tcg-target.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tcg/i386/tcg-target.c b/tcg/i386/tcg-target.c +index 85c6b81..616ef23 100644 +--- a/tcg/i386/tcg-target.c ++++ b/tcg/i386/tcg-target.c +@@ -1907,7 +1907,9 @@ static const TCGTargetOpDef x86_op_defs[] = { + { INDEX_op_setcond_i32, { "q", "r", "ri" } }, + + { INDEX_op_deposit_i32, { "Q", "0", "Q" } }, ++#if TCG_TARGET_HAS_movcond_i32 + { INDEX_op_movcond_i32, { "r", "r", "ri", "r", "0" } }, ++#endif + + #if TCG_TARGET_REG_BITS == 32 + { INDEX_op_mulu2_i32, { "a", "d", "a", "r" } }, +-- +1.7.12.1 + diff --git a/0098-tcg-Fix-MAX_OPC_PARAM_IARGS.patch b/0098-tcg-Fix-MAX_OPC_PARAM_IARGS.patch new file mode 100644 index 0000000..dfc44fa --- /dev/null +++ b/0098-tcg-Fix-MAX_OPC_PARAM_IARGS.patch @@ -0,0 +1,52 @@ +From 86aeba1e72542270a2ae2570cdfcfa6b9e59eeb8 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Wed, 12 Sep 2012 19:18:55 +0200 +Subject: [PATCH] tcg: Fix MAX_OPC_PARAM_IARGS + +DEF_HELPER_FLAGS_5 was added some time ago without adjusting +MAX_OPC_PARAM_IARGS. + +Fixing the definition becomes more important as QEMU is using +an increasing number of helper functions called with 5 arguments. + +Add also a comment to avoid future problems when DEF_HELPER_FLAGS_6 +will be added. + +Signed-off-by: Stefan Weil +Reviewed-by: Richard Henderson +Signed-off-by: Blue Swirl +Signed-off-by: Michael Roth +--- + def-helper.h | 2 ++ + exec-all.h | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/def-helper.h b/def-helper.h +index b98ff69..022a9ce 100644 +--- a/def-helper.h ++++ b/def-helper.h +@@ -128,6 +128,8 @@ + #define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ + DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) + ++/* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ ++ + #endif /* DEF_HELPER_H */ + + #ifndef GEN_HELPER +diff --git a/exec-all.h b/exec-all.h +index 1f81da7..6516da0 100644 +--- a/exec-all.h ++++ b/exec-all.h +@@ -51,7 +51,7 @@ typedef struct TranslationBlock TranslationBlock; + #else + #define MAX_OPC_PARAM_PER_ARG 1 + #endif +-#define MAX_OPC_PARAM_IARGS 4 ++#define MAX_OPC_PARAM_IARGS 5 + #define MAX_OPC_PARAM_OARGS 1 + #define MAX_OPC_PARAM_ARGS (MAX_OPC_PARAM_IARGS + MAX_OPC_PARAM_OARGS) + +-- +1.7.12.1 + diff --git a/0099-tci-Fix-for-AREG0-free-mode.patch b/0099-tci-Fix-for-AREG0-free-mode.patch new file mode 100644 index 0000000..c67e4a3 --- /dev/null +++ b/0099-tci-Fix-for-AREG0-free-mode.patch @@ -0,0 +1,119 @@ +From 2acbc7d596b022dca4fc147eb89e3d5f297acb1f Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Tue, 18 Sep 2012 22:43:38 +0200 +Subject: [PATCH] tci: Fix for AREG0 free mode + +Support for helper functions with 5 arguments was missing +in the code generator and in the interpreter. + +There is no need to pass the constant TCG_AREG0 from the +code generator to the interpreter. Remove that code for +the INDEX_op_qemu_st* opcodes. + +Signed-off-by: Stefan Weil +Signed-off-by: Aurelien Jarno +Signed-off-by: Michael Roth +--- + tcg/tci/tcg-target.c | 10 +++++----- + tci.c | 13 +++++++++---- + 2 files changed, 14 insertions(+), 9 deletions(-) + +diff --git a/tcg/tci/tcg-target.c b/tcg/tci/tcg-target.c +index 003244c..c8c2f1d 100644 +--- a/tcg/tci/tcg-target.c ++++ b/tcg/tci/tcg-target.c +@@ -300,7 +300,7 @@ static const int tcg_target_reg_alloc_order[] = { + #endif + }; + +-#if MAX_OPC_PARAM_IARGS != 4 ++#if MAX_OPC_PARAM_IARGS != 5 + # error Fix needed, number of supported input arguments changed! + #endif + +@@ -309,16 +309,18 @@ static const int tcg_target_call_iarg_regs[] = { + TCG_REG_R1, + TCG_REG_R2, + TCG_REG_R3, +-#if TCG_TARGET_REG_BITS == 32 +- /* 32 bit hosts need 2 * MAX_OPC_PARAM_IARGS registers. */ + #if 0 /* used for TCG_REG_CALL_STACK */ + TCG_REG_R4, + #endif + TCG_REG_R5, ++#if TCG_TARGET_REG_BITS == 32 ++ /* 32 bit hosts need 2 * MAX_OPC_PARAM_IARGS registers. */ + TCG_REG_R6, + TCG_REG_R7, + #if TCG_TARGET_NB_REGS >= 16 + TCG_REG_R8, ++ TCG_REG_R9, ++ TCG_REG_R10, + #else + # error Too few input registers available + #endif +@@ -798,7 +800,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + case INDEX_op_qemu_st8: + case INDEX_op_qemu_st16: + case INDEX_op_qemu_st32: +- tcg_out_r(s, TCG_AREG0); + tcg_out_r(s, *args++); + tcg_out_r(s, *args++); + #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS +@@ -809,7 +810,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + #endif + break; + case INDEX_op_qemu_st64: +- tcg_out_r(s, TCG_AREG0); + tcg_out_r(s, *args++); + #if TCG_TARGET_REG_BITS == 32 + tcg_out_r(s, *args++); +diff --git a/tci.c b/tci.c +index ce8a988..a4f7b78 100644 +--- a/tci.c ++++ b/tci.c +@@ -36,17 +36,19 @@ + tcg_abort(); \ + } while (0) + +-#if MAX_OPC_PARAM_IARGS != 4 ++#if MAX_OPC_PARAM_IARGS != 5 + # error Fix needed, number of supported input arguments changed! + #endif + #if TCG_TARGET_REG_BITS == 32 + typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong, + tcg_target_ulong, tcg_target_ulong, + tcg_target_ulong, tcg_target_ulong, ++ tcg_target_ulong, tcg_target_ulong, + tcg_target_ulong, tcg_target_ulong); + #else + typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong, +- tcg_target_ulong, tcg_target_ulong); ++ tcg_target_ulong, tcg_target_ulong, ++ tcg_target_ulong); + #endif + + /* TCI can optionally use a global register variable for env. */ +@@ -489,14 +491,17 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *cpustate, uint8_t *tb_ptr) + tci_read_reg(TCG_REG_R5), + tci_read_reg(TCG_REG_R6), + tci_read_reg(TCG_REG_R7), +- tci_read_reg(TCG_REG_R8)); ++ tci_read_reg(TCG_REG_R8), ++ tci_read_reg(TCG_REG_R9), ++ tci_read_reg(TCG_REG_R10)); + tci_write_reg(TCG_REG_R0, tmp64); + tci_write_reg(TCG_REG_R1, tmp64 >> 32); + #else + tmp64 = ((helper_function)t0)(tci_read_reg(TCG_REG_R0), + tci_read_reg(TCG_REG_R1), + tci_read_reg(TCG_REG_R2), +- tci_read_reg(TCG_REG_R3)); ++ tci_read_reg(TCG_REG_R3), ++ tci_read_reg(TCG_REG_R5)); + tci_write_reg(TCG_REG_R0, tmp64); + #endif + break; +-- +1.7.12.1 + diff --git a/0100-spice-abort-on-invalid-streaming-cmdline-params.patch b/0100-spice-abort-on-invalid-streaming-cmdline-params.patch new file mode 100644 index 0000000..d73d347 --- /dev/null +++ b/0100-spice-abort-on-invalid-streaming-cmdline-params.patch @@ -0,0 +1,41 @@ +From 9fa75115d0f300817a372dd8b9460d6b65a30b20 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Mon, 13 Aug 2012 10:32:32 +0200 +Subject: [PATCH] spice: abort on invalid streaming cmdline params + +When parsing its command line parameters, spice aborts when it +finds unexpected values, except for the 'streaming-video' option. +This happens because the parsing of the parameters for this option +is done using the 'name2enum' helper, which does not error out +on unknown values. Using the 'parse_name' helper makes sure we +error out in this case. Looking at git history, the use of +'name2enum' instead of 'parse_name' seems to have been an oversight, +so let's change to that now. + +Fixes rhbz#831708 + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 835cab85ad83ed8dfe1c13243aeda5959b153e3e) + +Signed-off-by: Michael Roth +--- + ui/spice-core.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/ui/spice-core.c b/ui/spice-core.c +index 4fc48f8..bb4f585 100644 +--- a/ui/spice-core.c ++++ b/ui/spice-core.c +@@ -344,7 +344,8 @@ static const char *stream_video_names[] = { + [ SPICE_STREAM_VIDEO_FILTER ] = "filter", + }; + #define parse_stream_video(_name) \ +- name2enum(_name, stream_video_names, ARRAY_SIZE(stream_video_names)) ++ parse_name(_name, "stream video control", \ ++ stream_video_names, ARRAY_SIZE(stream_video_names)) + + static const char *compression_names[] = { + [ SPICE_IMAGE_COMPRESS_OFF ] = "off", +-- +1.7.12.1 + diff --git a/0101-spice-notify-spice-server-on-vm-start-stop.patch b/0101-spice-notify-spice-server-on-vm-start-stop.patch new file mode 100644 index 0000000..708bfe0 --- /dev/null +++ b/0101-spice-notify-spice-server-on-vm-start-stop.patch @@ -0,0 +1,55 @@ +From 7fbcbd48d2898935369b443a489ea79d49fe19c4 Mon Sep 17 00:00:00 2001 +From: Yonit Halperin +Date: Tue, 21 Aug 2012 11:51:55 +0300 +Subject: [PATCH] spice: notify spice server on vm start/stop + +Spice server needs to know about the vm state in order to prevent +attempts to write to devices when they are stopped, mainly during +the non-live stage of migration. +Instead, spice will take care of restoring this writes, on the migration +target side, after migration completes. + +Signed-off-by: Yonit Halperin +Signed-off-by: Gerd Hoffmann +(cherry picked from commit f5bb039c6d97ef3e664094eab3c9a4dc1824ed73) + +Signed-off-by: Michael Roth +--- + ui/spice-core.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/ui/spice-core.c b/ui/spice-core.c +index bb4f585..a515c94 100644 +--- a/ui/spice-core.c ++++ b/ui/spice-core.c +@@ -546,6 +546,18 @@ static int add_channel(const char *name, const char *value, void *opaque) + return 0; + } + ++static void vm_change_state_handler(void *opaque, int running, ++ RunState state) ++{ ++#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */ ++ if (running) { ++ spice_server_vm_start(spice_server); ++ } else { ++ spice_server_vm_stop(spice_server); ++ } ++#endif ++} ++ + void qemu_spice_init(void) + { + QemuOpts *opts = QTAILQ_FIRST(&qemu_spice_opts.head); +@@ -719,6 +731,8 @@ void qemu_spice_init(void) + qemu_spice_input_init(); + qemu_spice_audio_init(); + ++ qemu_add_vm_change_state_handler(vm_change_state_handler, &spice_server); ++ + g_free(x509_key_file); + g_free(x509_cert_file); + g_free(x509_cacert_file); +-- +1.7.12.1 + diff --git a/0102-spice-notify-on-vm-state-change-only-via-spice_serve.patch b/0102-spice-notify-on-vm-state-change-only-via-spice_serve.patch new file mode 100644 index 0000000..c599743 --- /dev/null +++ b/0102-spice-notify-on-vm-state-change-only-via-spice_serve.patch @@ -0,0 +1,173 @@ +From c50f358fbd549b5ec3b5dd82e29ed06ce969e50a Mon Sep 17 00:00:00 2001 +From: Yonit Halperin +Date: Tue, 21 Aug 2012 11:51:56 +0300 +Subject: [PATCH] spice: notify on vm state change only via + spice_server_vm_start/stop + +QXLWorker->start/stop are deprecated since spice-server 0.11.2 + +Signed-off-by: Yonit Halperin +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 71d388d420e68ac77cd42f15f7e68cf5a6fb01b2) + +Signed-off-by: Michael Roth +--- + hw/qxl.c | 7 ++++--- + ui/spice-core.c | 4 ++++ + ui/spice-display.c | 32 ++++++++++++++++++++++++++++++-- + ui/spice-display.h | 9 +++++++-- + 4 files changed, 45 insertions(+), 7 deletions(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index c2dd3b4..95bbc03 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -958,9 +958,10 @@ static void qxl_update_irq(PCIQXLDevice *d) + static void qxl_check_state(PCIQXLDevice *d) + { + QXLRam *ram = d->ram; ++ int spice_display_running = qemu_spice_display_is_running(&d->ssd); + +- assert(!d->ssd.running || SPICE_RING_IS_EMPTY(&ram->cmd_ring)); +- assert(!d->ssd.running || SPICE_RING_IS_EMPTY(&ram->cursor_ring)); ++ assert(!spice_display_running || SPICE_RING_IS_EMPTY(&ram->cmd_ring)); ++ assert(!spice_display_running || SPICE_RING_IS_EMPTY(&ram->cursor_ring)); + } + + static void qxl_reset_state(PCIQXLDevice *d) +@@ -1538,7 +1539,7 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events) + uint32_t old_pending; + uint32_t le_events = cpu_to_le32(events); + +- assert(d->ssd.running); ++ assert(qemu_spice_display_is_running(&d->ssd)); + old_pending = __sync_fetch_and_or(&d->ram->int_pending, le_events); + if ((old_pending & le_events) == le_events) { + return; +diff --git a/ui/spice-core.c b/ui/spice-core.c +index a515c94..1a7a773 100644 +--- a/ui/spice-core.c ++++ b/ui/spice-core.c +@@ -37,6 +37,7 @@ + #include "migration.h" + #include "monitor.h" + #include "hw/hw.h" ++#include "spice-display.h" + + /* core bits */ + +@@ -551,9 +552,11 @@ static void vm_change_state_handler(void *opaque, int running, + { + #if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */ + if (running) { ++ qemu_spice_display_start(); + spice_server_vm_start(spice_server); + } else { + spice_server_vm_stop(spice_server); ++ qemu_spice_display_stop(); + } + #endif + } +@@ -755,6 +758,7 @@ int qemu_spice_add_interface(SpiceBaseInstance *sin) + spice_server = spice_server_new(); + spice_server_init(spice_server, &core_interface); + } ++ + return spice_server_add_interface(spice_server, sin); + } + +diff --git a/ui/spice-display.c b/ui/spice-display.c +index 3e8f0b3..1c31418 100644 +--- a/ui/spice-display.c ++++ b/ui/spice-display.c +@@ -126,18 +126,44 @@ void qemu_spice_wakeup(SimpleSpiceDisplay *ssd) + ssd->worker->wakeup(ssd->worker); + } + +-void qemu_spice_start(SimpleSpiceDisplay *ssd) ++#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */ ++static void qemu_spice_start(SimpleSpiceDisplay *ssd) + { + trace_qemu_spice_start(ssd->qxl.id); + ssd->worker->start(ssd->worker); + } + +-void qemu_spice_stop(SimpleSpiceDisplay *ssd) ++static void qemu_spice_stop(SimpleSpiceDisplay *ssd) + { + trace_qemu_spice_stop(ssd->qxl.id); + ssd->worker->stop(ssd->worker); + } + ++#else ++ ++static int spice_display_is_running; ++ ++void qemu_spice_display_start(void) ++{ ++ spice_display_is_running = true; ++} ++ ++void qemu_spice_display_stop(void) ++{ ++ spice_display_is_running = false; ++} ++ ++#endif ++ ++int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd) ++{ ++#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */ ++ return ssd->running; ++#else ++ return spice_display_is_running; ++#endif ++} ++ + static SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) + { + SimpleSpiceUpdate *update; +@@ -272,6 +298,7 @@ void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd) + void qemu_spice_vm_change_state_handler(void *opaque, int running, + RunState state) + { ++#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */ + SimpleSpiceDisplay *ssd = opaque; + + if (running) { +@@ -281,6 +308,7 @@ void qemu_spice_vm_change_state_handler(void *opaque, int running, + qemu_spice_stop(ssd); + ssd->running = false; + } ++#endif + } + + void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds) +diff --git a/ui/spice-display.h b/ui/spice-display.h +index 12e50b6..672d65e 100644 +--- a/ui/spice-display.h ++++ b/ui/spice-display.h +@@ -82,7 +82,9 @@ struct SimpleSpiceDisplay { + + QXLRect dirty; + int notify; ++#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */ + int running; ++#endif + + /* + * All struct members below this comment can be accessed from +@@ -129,5 +131,8 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id, + void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd, + uint32_t id, qxl_async_io async); + void qemu_spice_wakeup(SimpleSpiceDisplay *ssd); +-void qemu_spice_start(SimpleSpiceDisplay *ssd); +-void qemu_spice_stop(SimpleSpiceDisplay *ssd); ++#if SPICE_SERVER_VERSION >= 0x000b02 /* before 0.11.2 */ ++void qemu_spice_display_start(void); ++void qemu_spice_display_stop(void); ++#endif ++int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd); +-- +1.7.12.1 + diff --git a/0103-spice-migration-add-QEVENT_SPICE_MIGRATE_COMPLETED.patch b/0103-spice-migration-add-QEVENT_SPICE_MIGRATE_COMPLETED.patch new file mode 100644 index 0000000..e8580c2 --- /dev/null +++ b/0103-spice-migration-add-QEVENT_SPICE_MIGRATE_COMPLETED.patch @@ -0,0 +1,93 @@ +From 8470a0f943e8605739b7bc0081507f787bed412d Mon Sep 17 00:00:00 2001 +From: Yonit Halperin +Date: Tue, 21 Aug 2012 11:51:57 +0300 +Subject: [PATCH] spice migration: add QEVENT_SPICE_MIGRATE_COMPLETED + +When migrating, libvirt queries the migration status, and upon migration +completions, it closes the migration src. On the other hand, when +migration is completed, spice transfers data from the src to destination +via the client. This data is required for keeping the spice session +after migration, without suffering from data loss and inconsistencies. +In order to allow this data transfer, we add QEVENT for signaling +libvirt that spice migration has completed, and libvirt needs to wait +for this event before quitting the src process. + +Signed-off-by: Yonit Halperin +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 2fdd16e239c2a2763aa3266e637718123328688c) + +Signed-off-by: Michael Roth +--- + monitor.c | 1 + + monitor.h | 1 + + ui/spice-core.c | 9 ++++++++- + 3 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/monitor.c b/monitor.c +index 29e4287..f45cf92 100644 +--- a/monitor.c ++++ b/monitor.c +@@ -455,6 +455,7 @@ static const char *monitor_event_names[] = { + [QEVENT_SUSPEND_DISK] = "SUSPEND_DISK", + [QEVENT_WAKEUP] = "WAKEUP", + [QEVENT_BALLOON_CHANGE] = "BALLOON_CHANGE", ++ [QEVENT_SPICE_MIGRATE_COMPLETED] = "SPICE_MIGRATE_COMPLETED", + }; + QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX) + +diff --git a/monitor.h b/monitor.h +index 47d556b..5fc2983 100644 +--- a/monitor.h ++++ b/monitor.h +@@ -43,6 +43,7 @@ typedef enum MonitorEvent { + QEVENT_SUSPEND_DISK, + QEVENT_WAKEUP, + QEVENT_BALLOON_CHANGE, ++ QEVENT_SPICE_MIGRATE_COMPLETED, + + /* Add to 'monitor_event_names' array in monitor.c when + * defining new events here */ +diff --git a/ui/spice-core.c b/ui/spice-core.c +index 1a7a773..851e869 100644 +--- a/ui/spice-core.c ++++ b/ui/spice-core.c +@@ -285,6 +285,7 @@ typedef struct SpiceMigration { + } SpiceMigration; + + static void migrate_connect_complete_cb(SpiceMigrateInstance *sin); ++static void migrate_end_complete_cb(SpiceMigrateInstance *sin); + + static const SpiceMigrateInterface migrate_interface = { + .base.type = SPICE_INTERFACE_MIGRATION, +@@ -292,7 +293,7 @@ static const SpiceMigrateInterface migrate_interface = { + .base.major_version = SPICE_INTERFACE_MIGRATION_MAJOR, + .base.minor_version = SPICE_INTERFACE_MIGRATION_MINOR, + .migrate_connect_complete = migrate_connect_complete_cb, +- .migrate_end_complete = NULL, ++ .migrate_end_complete = migrate_end_complete_cb, + }; + + static SpiceMigration spice_migrate; +@@ -305,6 +306,11 @@ static void migrate_connect_complete_cb(SpiceMigrateInstance *sin) + } + sm->connect_complete.cb = NULL; + } ++ ++static void migrate_end_complete_cb(SpiceMigrateInstance *sin) ++{ ++ monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL); ++} + #endif + + /* config string parsing */ +@@ -489,6 +495,7 @@ static void migration_state_notifier(Notifier *notifier, void *data) + } else if (migration_has_finished(s)) { + #ifndef SPICE_INTERFACE_MIGRATION + spice_server_migrate_switch(spice_server); ++ monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL); + #else + spice_server_migrate_end(spice_server, true); + } else if (migration_has_failed(s)) { +-- +1.7.12.1 + diff --git a/0104-spice-add-migrated-flag-to-spice-info.patch b/0104-spice-add-migrated-flag-to-spice-info.patch new file mode 100644 index 0000000..0247edd --- /dev/null +++ b/0104-spice-add-migrated-flag-to-spice-info.patch @@ -0,0 +1,97 @@ +From a4155f1a9fac362bfc1558790de9ea4cdb0a3c8a Mon Sep 17 00:00:00 2001 +From: Yonit Halperin +Date: Tue, 21 Aug 2012 11:51:58 +0300 +Subject: [PATCH] spice: add 'migrated' flag to spice info + +The flag is 'true' when spice migration has completed on the src side. +It is needed for a case where libvirt dies before migration completes +and it misses the event QEVENT_SPICE_MIGRATE_COMPLETED. +When libvirt is restored and queries the migration status, it also needs +to query spice and check if its migration has completed. + +Signed-off-by: Yonit Halperin +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 61c4efe2cb85b0a9c6bc68f6a2dd107c8d7ec080) + +Signed-off-by: Michael Roth +--- + hmp.c | 2 ++ + qapi-schema.json | 5 ++++- + ui/spice-core.c | 4 ++++ + 3 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/hmp.c b/hmp.c +index 81c8acb..ec4274b 100644 +--- a/hmp.c ++++ b/hmp.c +@@ -413,6 +413,8 @@ void hmp_info_spice(Monitor *mon) + monitor_printf(mon, " address: %s:%" PRId64 " [tls]\n", + info->host, info->tls_port); + } ++ monitor_printf(mon, " migrated: %s\n", ++ info->migrated ? "true" : "false"); + monitor_printf(mon, " auth: %s\n", info->auth); + monitor_printf(mon, " compiled: %s\n", info->compiled_version); + monitor_printf(mon, " mouse-mode: %s\n", +diff --git a/qapi-schema.json b/qapi-schema.json +index bd8ad74..8ddde12 100644 +--- a/qapi-schema.json ++++ b/qapi-schema.json +@@ -808,6 +808,9 @@ + # + # @enabled: true if the SPICE server is enabled, false otherwise + # ++# @migrated: true if the last guest migration completed and spice ++# migration had completed as well. false otherwise. ++# + # @host: #optional The hostname the SPICE server is bound to. This depends on + # the name resolution on the host and may be an IP address. + # +@@ -833,7 +836,7 @@ + # Since: 0.14.0 + ## + { 'type': 'SpiceInfo', +- 'data': {'enabled': 'bool', '*host': 'str', '*port': 'int', ++ 'data': {'enabled': 'bool', 'migrated': 'bool', '*host': 'str', '*port': 'int', + '*tls-port': 'int', '*auth': 'str', '*compiled-version': 'str', + 'mouse-mode': 'SpiceQueryMouseMode', '*channels': ['SpiceChannel']} } + +diff --git a/ui/spice-core.c b/ui/spice-core.c +index 851e869..ab069c5 100644 +--- a/ui/spice-core.c ++++ b/ui/spice-core.c +@@ -46,6 +46,7 @@ static Notifier migration_state; + static const char *auth = "spice"; + static char *auth_passwd; + static time_t auth_expires = TIME_MAX; ++static int spice_migration_completed; + int using_spice = 0; + + static QemuThread me; +@@ -310,6 +311,7 @@ static void migrate_connect_complete_cb(SpiceMigrateInstance *sin) + static void migrate_end_complete_cb(SpiceMigrateInstance *sin) + { + monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL); ++ spice_migration_completed = true; + } + #endif + +@@ -443,6 +445,7 @@ SpiceInfo *qmp_query_spice(Error **errp) + } + + info->enabled = true; ++ info->migrated = spice_migration_completed; + + addr = qemu_opt_get(opts, "addr"); + port = qemu_opt_get_number(opts, "port", 0); +@@ -496,6 +499,7 @@ static void migration_state_notifier(Notifier *notifier, void *data) + #ifndef SPICE_INTERFACE_MIGRATION + spice_server_migrate_switch(spice_server); + monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL); ++ spice_migration_completed = true; + #else + spice_server_migrate_end(spice_server, true); + } else if (migration_has_failed(s)) { +-- +1.7.12.1 + diff --git a/0105-spice-adding-seamless-migration-option-to-the-comman.patch b/0105-spice-adding-seamless-migration-option-to-the-comman.patch new file mode 100644 index 0000000..70eb7c0 --- /dev/null +++ b/0105-spice-adding-seamless-migration-option-to-the-comman.patch @@ -0,0 +1,79 @@ +From b15c26620bb765e25c96163383d79c1c56df7901 Mon Sep 17 00:00:00 2001 +From: Yonit Halperin +Date: Tue, 21 Aug 2012 11:51:59 +0300 +Subject: [PATCH] spice: adding seamless-migration option to the command line + +The seamless-migration flag is required in order to identify +whether libvirt supports the new QEVENT_SPICE_MIGRATE_COMPLETED or not +(by default the flag is off). +New libvirt versions that wait for QEVENT_SPICE_MIGRATE_COMPLETED should turn on this flag. +When this flag is off, spice fallbacks to its old migration method, which +can result in data loss. + +Signed-off-by: Yonit Halperin +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 8c9570530c819821b9b5cc3113d2b2966afe7621) + +Signed-off-by: Michael Roth +--- + qemu-config.c | 3 +++ + qemu-options.hx | 3 +++ + ui/spice-core.c | 7 +++++++ + 3 files changed, 13 insertions(+) + +diff --git a/qemu-config.c b/qemu-config.c +index 238390e..3eaee48 100644 +--- a/qemu-config.c ++++ b/qemu-config.c +@@ -541,6 +541,9 @@ QemuOptsList qemu_spice_opts = { + },{ + .name = "playback-compression", + .type = QEMU_OPT_BOOL, ++ }, { ++ .name = "seamless-migration", ++ .type = QEMU_OPT_BOOL, + }, + { /* end of list */ } + }, +diff --git a/qemu-options.hx b/qemu-options.hx +index ea06324..dd7aa63 100644 +--- a/qemu-options.hx ++++ b/qemu-options.hx +@@ -920,6 +920,9 @@ Enable/disable passing mouse events via vdagent. Default is on. + @item playback-compression=[on|off] + Enable/disable audio stream compression (using celt 0.5.1). Default is on. + ++@item seamless-migration=[on|off] ++Enable/disable spice seamless migration. Default is off. ++ + @end table + ETEXI + +diff --git a/ui/spice-core.c b/ui/spice-core.c +index ab069c5..ba0d0bd 100644 +--- a/ui/spice-core.c ++++ b/ui/spice-core.c +@@ -585,6 +585,9 @@ void qemu_spice_init(void) + int port, tls_port, len, addr_flags; + spice_image_compression_t compression; + spice_wan_compression_t wan_compr; ++#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */ ++ bool seamless_migration; ++#endif + + qemu_thread_get_self(&me); + +@@ -728,6 +731,10 @@ void qemu_spice_init(void) + spice_server_set_uuid(spice_server, qemu_uuid); + #endif + ++#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */ ++ seamless_migration = qemu_opt_get_bool(opts, "seamless-migration", 0); ++ spice_server_set_seamless_migration(spice_server, seamless_migration); ++#endif + if (0 != spice_server_init(spice_server, &core_interface)) { + error_report("failed to initialize spice server"); + exit(1); +-- +1.7.12.1 + diff --git a/0106-spice-increase-the-verbosity-of-spice-section-in-qem.patch b/0106-spice-increase-the-verbosity-of-spice-section-in-qem.patch new file mode 100644 index 0000000..24ad9ff --- /dev/null +++ b/0106-spice-increase-the-verbosity-of-spice-section-in-qem.patch @@ -0,0 +1,50 @@ +From 589cb6a669e11e1ce4b077e8ba0fbb9fc8d5bd40 Mon Sep 17 00:00:00 2001 +From: Yonit Halperin +Date: Tue, 21 Aug 2012 13:54:20 +0300 +Subject: [PATCH] spice: increase the verbosity of spice section in "qemu + --help" + +Added all spice options to the help string. This can be used by libvirt +to determine which spice related features are supported by qemu. + +Signed-off-by: Yonit Halperin +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 27af778828db9aa893fa1de928744141e5de20e5) + +Signed-off-by: Michael Roth +--- + qemu-options.hx | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +diff --git a/qemu-options.hx b/qemu-options.hx +index dd7aa63..1af4fec 100644 +--- a/qemu-options.hx ++++ b/qemu-options.hx +@@ -838,7 +838,23 @@ Enable SDL. + ETEXI + + DEF("spice", HAS_ARG, QEMU_OPTION_spice, +- "-spice enable spice\n", QEMU_ARCH_ALL) ++ "-spice [port=port][,tls-port=secured-port][,x509-dir=]\n" ++ " [,x509-key-file=][,x509-key-password=]\n" ++ " [,x509-cert-file=][,x509-cacert-file=]\n" ++ " [,x509-dh-key-file=][,addr=addr][,ipv4|ipv6]\n" ++ " [,tls-ciphers=]\n" ++ " [,tls-channel=[main|display|cursor|inputs|record|playback]]\n" ++ " [,plaintext-channel=[main|display|cursor|inputs|record|playback]]\n" ++ " [,sasl][,password=][,disable-ticketing]\n" ++ " [,image-compression=[auto_glz|auto_lz|quic|glz|lz|off]]\n" ++ " [,jpeg-wan-compression=[auto|never|always]]\n" ++ " [,zlib-glz-wan-compression=[auto|never|always]]\n" ++ " [,streaming-video=[off|all|filter]][,disable-copy-paste]\n" ++ " [,agent-mouse=[on|off]][,playback-compression=[on|off]]\n" ++ " [,seamless-migration=[on|off]]\n" ++ " enable spice\n" ++ " at least one of {port, tls-port} is mandatory\n", ++ QEMU_ARCH_ALL) + STEXI + @item -spice @var{option}[,@var{option}[,...]] + @findex -spice +-- +1.7.12.1 + diff --git a/0107-qxl-update_area_io-guest_bug-on-invalid-parameters.patch b/0107-qxl-update_area_io-guest_bug-on-invalid-parameters.patch new file mode 100644 index 0000000..7572299 --- /dev/null +++ b/0107-qxl-update_area_io-guest_bug-on-invalid-parameters.patch @@ -0,0 +1,40 @@ +From 8a3d428e1e0f3e4793b1a1353c638e155a3a8a86 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Tue, 21 Aug 2012 13:51:31 +0300 +Subject: [PATCH] qxl/update_area_io: guest_bug on invalid parameters + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 511b13e2c9b426b3c56060909693de5097f0b496) + +Signed-off-by: Michael Roth +--- + hw/qxl.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 95bbc03..baf9bb4 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1386,6 +1386,18 @@ async_common: + QXLCookie *cookie = NULL; + QXLRect update = d->ram->update_area; + ++ if (d->ram->update_surface > NUM_SURFACES) { ++ qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: invalid surface id %d\n", ++ d->ram->update_surface); ++ return; ++ } ++ if (update.left >= update.right || update.top >= update.bottom) { ++ qxl_set_guest_bug(d, ++ "QXL_IO_UPDATE_AREA: invalid area (%ux%u)x(%ux%u)\n", ++ update.left, update.top, update.right, update.bottom); ++ return; ++ } ++ + if (async == QXL_ASYNC) { + cookie = qxl_cookie_new(QXL_COOKIE_TYPE_IO, + QXL_IO_UPDATE_AREA_ASYNC); +-- +1.7.12.1 + diff --git a/0108-qxl-add-QXL_IO_MONITORS_CONFIG_ASYNC.patch b/0108-qxl-add-QXL_IO_MONITORS_CONFIG_ASYNC.patch new file mode 100644 index 0000000..50dbee0 --- /dev/null +++ b/0108-qxl-add-QXL_IO_MONITORS_CONFIG_ASYNC.patch @@ -0,0 +1,327 @@ +From e9062966428416da41ec5f9ace3d2ef58b3265b1 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Wed, 22 Aug 2012 11:16:25 +0300 +Subject: [PATCH] qxl: add QXL_IO_MONITORS_CONFIG_ASYNC + +Revision bumped to 4 for new IO support, enabled for spice-server >= +0.11.1. New io enabled if revision is 4. Revision can be set to 4. + +[ kraxel: 3 continues to be the default revision. Once we have a new + stable spice-server release and the qemu patches to enable + the new bits merged we'll go flip the switch and make rev4 + the default ] + +This io calls the corresponding new spice api +spice_qxl_monitors_config_async to let spice-server read a new guest set +monitors config and notify the client. + +On migration reissue spice_qxl_monitors_config_async. + +RHBZ: 770842 + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann + +fixup + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 020af1c45fec664d5d4cf3b8e5117f8bc1d691f2) + +Conflicts: + + hw/qxl.c + +Signed-off-by: Michael Roth +--- + configure | 7 ++++ + hw/qxl.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + hw/qxl.h | 7 ++++ + trace-events | 1 + + ui/spice-display.h | 1 + + 5 files changed, 111 insertions(+), 3 deletions(-) + +diff --git a/configure b/configure +index 8ffddf4..b5cea26 100755 +--- a/configure ++++ b/configure +@@ -2670,6 +2670,9 @@ EOF + spice="yes" + libs_softmmu="$libs_softmmu $spice_libs" + QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags" ++ if $pkg_config --atleast-version=0.12.0 spice-protocol >/dev/null 2>&1; then ++ spice_qxl_io_monitors_config_async="yes" ++ fi + else + if test "$spice" = "yes" ; then + feature_not_found "spice" +@@ -3407,6 +3410,10 @@ if test "$spice" = "yes" ; then + echo "CONFIG_SPICE=y" >> $config_host_mak + fi + ++if test "$spice_qxl_io_monitors_config_async" = "yes" ; then ++ echo "CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC=y" >> $config_host_mak ++fi ++ + if test "$smartcard" = "yes" ; then + echo "CONFIG_SMARTCARD=y" >> $config_host_mak + fi +diff --git a/hw/qxl.c b/hw/qxl.c +index baf9bb4..27f3779 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -27,6 +27,11 @@ + + #include "qxl.h" + ++#ifndef CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC ++/* spice-protocol is too old, add missing definitions */ ++#define QXL_IO_MONITORS_CONFIG_ASYNC (QXL_IO_FLUSH_RELEASE + 1) ++#endif ++ + /* + * NOTE: SPICE_RING_PROD_ITEM accesses memory on the pci bar and as + * such can be changed by the guest, so to avoid a guest trigerrable +@@ -249,6 +254,39 @@ static void qxl_spice_destroy_surfaces(PCIQXLDevice *qxl, qxl_async_io async) + } + } + ++static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay) ++{ ++ trace_qxl_spice_monitors_config(qxl->id); ++/* 0x000b01 == 0.11.1 */ ++#if SPICE_SERVER_VERSION >= 0x000b01 && \ ++ defined(CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC) ++ if (replay) { ++ /* ++ * don't use QXL_COOKIE_TYPE_IO: ++ * - we are not running yet (post_load), we will assert ++ * in send_events ++ * - this is not a guest io, but a reply, so async_io isn't set. ++ */ ++ spice_qxl_monitors_config_async(&qxl->ssd.qxl, ++ qxl->guest_monitors_config, ++ MEMSLOT_GROUP_GUEST, ++ (uintptr_t)qxl_cookie_new( ++ QXL_COOKIE_TYPE_POST_LOAD_MONITORS_CONFIG, ++ 0)); ++ } else { ++ qxl->guest_monitors_config = qxl->ram->monitors_config; ++ spice_qxl_monitors_config_async(&qxl->ssd.qxl, ++ qxl->ram->monitors_config, ++ MEMSLOT_GROUP_GUEST, ++ (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO, ++ QXL_IO_MONITORS_CONFIG_ASYNC)); ++ } ++#else ++ fprintf(stderr, "qxl: too old spice-protocol/spice-server for " ++ "QXL_IO_MONITORS_CONFIG_ASYNC\n"); ++#endif ++} ++ + void qxl_spice_reset_image_cache(PCIQXLDevice *qxl) + { + trace_qxl_spice_reset_image_cache(qxl->id); +@@ -538,6 +576,7 @@ static const char *io_port_to_string(uint32_t io_port) + = "QXL_IO_DESTROY_ALL_SURFACES_ASYNC", + [QXL_IO_FLUSH_SURFACES_ASYNC] = "QXL_IO_FLUSH_SURFACES_ASYNC", + [QXL_IO_FLUSH_RELEASE] = "QXL_IO_FLUSH_RELEASE", ++ [QXL_IO_MONITORS_CONFIG_ASYNC] = "QXL_IO_MONITORS_CONFIG_ASYNC", + }; + return io_port_to_string[io_port]; + } +@@ -819,6 +858,7 @@ static void interface_async_complete_io(PCIQXLDevice *qxl, QXLCookie *cookie) + case QXL_IO_DESTROY_PRIMARY_ASYNC: + case QXL_IO_UPDATE_AREA_ASYNC: + case QXL_IO_FLUSH_SURFACES_ASYNC: ++ case QXL_IO_MONITORS_CONFIG_ASYNC: + break; + case QXL_IO_CREATE_PRIMARY_ASYNC: + qxl_create_guest_primary_complete(qxl); +@@ -894,6 +934,8 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token) + case QXL_COOKIE_TYPE_RENDER_UPDATE_AREA: + qxl_render_update_area_done(qxl, cookie); + break; ++ case QXL_COOKIE_TYPE_POST_LOAD_MONITORS_CONFIG: ++ break; + default: + fprintf(stderr, "qxl: %s: unexpected cookie type %d\n", + __func__, cookie->type); +@@ -1315,6 +1357,13 @@ static void ioport_write(void *opaque, target_phys_addr_t addr, + return; + } + ++ if (d->revision <= QXL_REVISION_STABLE_V10 && ++ io_port >= QXL_IO_FLUSH_SURFACES_ASYNC) { ++ qxl_set_guest_bug(d, "unsupported io %d for revision %d\n", ++ io_port, d->revision); ++ return; ++ } ++ + switch (io_port) { + case QXL_IO_RESET: + case QXL_IO_SET_MODE: +@@ -1334,7 +1383,7 @@ static void ioport_write(void *opaque, target_phys_addr_t addr, + io_port, io_port_to_string(io_port)); + /* be nice to buggy guest drivers */ + if (io_port >= QXL_IO_UPDATE_AREA_ASYNC && +- io_port <= QXL_IO_DESTROY_ALL_SURFACES_ASYNC) { ++ io_port < QXL_IO_RANGE_SIZE) { + qxl_send_events(d, QXL_INTERRUPT_IO_CMD); + } + return; +@@ -1362,6 +1411,7 @@ static void ioport_write(void *opaque, target_phys_addr_t addr, + io_port = QXL_IO_DESTROY_ALL_SURFACES; + goto async_common; + case QXL_IO_FLUSH_SURFACES_ASYNC: ++ case QXL_IO_MONITORS_CONFIG_ASYNC: + async_common: + async = QXL_ASYNC; + qemu_mutex_lock(&d->async_lock); +@@ -1503,6 +1553,9 @@ async_common: + d->mode = QXL_MODE_UNDEFINED; + qxl_spice_destroy_surfaces(d, async); + break; ++ case QXL_IO_MONITORS_CONFIG_ASYNC: ++ qxl_spice_monitors_config_async(d, 0); ++ break; + default: + qxl_set_guest_bug(d, "%s: unexpected ioport=0x%x\n", __func__, io_port); + } +@@ -1798,6 +1851,17 @@ static int qxl_init_common(PCIQXLDevice *qxl) + io_size = 16; + break; + case 3: /* qxl-3 */ ++ pci_device_rev = QXL_REVISION_STABLE_V10; ++ io_size = 32; /* PCI region size must be pow2 */ ++ break; ++/* 0x000b01 == 0.11.1 */ ++#if SPICE_SERVER_VERSION >= 0x000b01 && \ ++ defined(CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC) ++ case 4: /* qxl-4 */ ++ pci_device_rev = QXL_REVISION_STABLE_V12; ++ io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1); ++ break; ++#endif + default: + pci_device_rev = QXL_DEFAULT_REVISION; + io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1); +@@ -1996,7 +2060,9 @@ static int qxl_post_load(void *opaque, int version) + } + qxl_spice_loadvm_commands(d, cmds, out); + g_free(cmds); +- ++ if (d->guest_monitors_config) { ++ qxl_spice_monitors_config_async(d, 1); ++ } + break; + case QXL_MODE_COMPAT: + /* note: no need to call qxl_create_memslots, qxl_set_mode +@@ -2009,6 +2075,14 @@ static int qxl_post_load(void *opaque, int version) + + #define QXL_SAVE_VERSION 21 + ++static bool qxl_monitors_config_needed(void *opaque) ++{ ++ PCIQXLDevice *qxl = opaque; ++ ++ return qxl->guest_monitors_config != 0; ++} ++ ++ + static VMStateDescription qxl_memslot = { + .name = "qxl-memslot", + .version_id = QXL_SAVE_VERSION, +@@ -2039,6 +2113,16 @@ static VMStateDescription qxl_surface = { + } + }; + ++static VMStateDescription qxl_vmstate_monitors_config = { ++ .name = "qxl/monitors-config", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = (VMStateField[]) { ++ VMSTATE_UINT64(guest_monitors_config, PCIQXLDevice), ++ VMSTATE_END_OF_LIST() ++ }, ++}; ++ + static VMStateDescription qxl_vmstate = { + .name = "qxl", + .version_id = QXL_SAVE_VERSION, +@@ -2046,7 +2130,7 @@ static VMStateDescription qxl_vmstate = { + .pre_save = qxl_pre_save, + .pre_load = qxl_pre_load, + .post_load = qxl_post_load, +- .fields = (VMStateField []) { ++ .fields = (VMStateField[]) { + VMSTATE_PCI_DEVICE(pci, PCIQXLDevice), + VMSTATE_STRUCT(vga, PCIQXLDevice, 0, vmstate_vga_common, VGACommonState), + VMSTATE_UINT32(shadow_rom.mode, PCIQXLDevice), +@@ -2065,6 +2149,14 @@ static VMStateDescription qxl_vmstate = { + VMSTATE_UINT64(guest_cursor, PCIQXLDevice), + VMSTATE_END_OF_LIST() + }, ++ .subsections = (VMStateSubsection[]) { ++ { ++ .vmsd = &qxl_vmstate_monitors_config, ++ .needed = qxl_monitors_config_needed, ++ }, { ++ /* empty */ ++ } ++ } + }; + + static Property qxl_properties[] = { +diff --git a/hw/qxl.h b/hw/qxl.h +index 172baf6..9cfedb7 100644 +--- a/hw/qxl.h ++++ b/hw/qxl.h +@@ -71,6 +71,8 @@ typedef struct PCIQXLDevice { + } guest_surfaces; + QXLPHYSICAL guest_cursor; + ++ QXLPHYSICAL guest_monitors_config; ++ + QemuMutex track_lock; + + /* thread signaling */ +@@ -128,7 +130,12 @@ typedef struct PCIQXLDevice { + } \ + } while (0) + ++#if 0 ++/* spice-server 0.12 is still in development */ ++#define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V12 ++#else + #define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V10 ++#endif + + /* qxl.c */ + void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id); +diff --git a/trace-events b/trace-events +index 04b0723..8fcbc50 100644 +--- a/trace-events ++++ b/trace-events +@@ -956,6 +956,7 @@ qxl_spice_destroy_surfaces(int qid, int async) "%d async=%d" + qxl_spice_destroy_surface_wait_complete(int qid, uint32_t id) "%d sid=%d" + qxl_spice_destroy_surface_wait(int qid, uint32_t id, int async) "%d sid=%d async=%d" + qxl_spice_flush_surfaces_async(int qid, uint32_t surface_count, uint32_t num_free_res) "%d s#=%d, res#=%d" ++qxl_spice_monitors_config(int id) "%d" + qxl_spice_loadvm_commands(int qid, void *ext, uint32_t count) "%d ext=%p count=%d" + qxl_spice_oom(int qid) "%d" + qxl_spice_reset_cursor(int qid) "%d" +diff --git a/ui/spice-display.h b/ui/spice-display.h +index 672d65e..bcff114 100644 +--- a/ui/spice-display.h ++++ b/ui/spice-display.h +@@ -51,6 +51,7 @@ typedef enum qxl_async_io { + enum { + QXL_COOKIE_TYPE_IO, + QXL_COOKIE_TYPE_RENDER_UPDATE_AREA, ++ QXL_COOKIE_TYPE_POST_LOAD_MONITORS_CONFIG, + }; + + typedef struct QXLCookie { +-- +1.7.12.1 + diff --git a/0109-configure-print-spice-protocol-and-spice-server-vers.patch b/0109-configure-print-spice-protocol-and-spice-server-vers.patch new file mode 100644 index 0000000..9e7f529 --- /dev/null +++ b/0109-configure-print-spice-protocol-and-spice-server-vers.patch @@ -0,0 +1,39 @@ +From b132bd0cdb4d684105b91a8173c172296cd191af Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Wed, 22 Aug 2012 11:16:26 +0300 +Subject: [PATCH] configure: print spice-protocol and spice-server versions + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 2e0e3c399aa8067148055b9ea0edb822c5b584d2) + +Signed-off-by: Michael Roth +--- + configure | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/configure b/configure +index b5cea26..d7a948f 100755 +--- a/configure ++++ b/configure +@@ -2670,6 +2670,8 @@ EOF + spice="yes" + libs_softmmu="$libs_softmmu $spice_libs" + QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags" ++ spice_protocol_version=$($pkg_config --modversion spice-protocol) ++ spice_server_version=$($pkg_config --modversion spice-server) + if $pkg_config --atleast-version=0.12.0 spice-protocol >/dev/null 2>&1; then + spice_qxl_io_monitors_config_async="yes" + fi +@@ -3128,7 +3130,7 @@ echo "libcap-ng support $cap_ng" + echo "vhost-net support $vhost_net" + echo "Trace backend $trace_backend" + echo "Trace output file $trace_file-" +-echo "spice support $spice" ++echo "spice support $spice ($spice_protocol_version/$spice_server_version)" + echo "rbd support $rbd" + echo "xfsctl support $xfs" + echo "nss used $smartcard_nss" +-- +1.7.12.1 + diff --git a/0110-fix-doc-of-using-raw-values-with-sendkey.patch b/0110-fix-doc-of-using-raw-values-with-sendkey.patch new file mode 100644 index 0000000..9e59097 --- /dev/null +++ b/0110-fix-doc-of-using-raw-values-with-sendkey.patch @@ -0,0 +1,42 @@ +From 211b2548bfbdab72051a7ef1e9982ff4ec0fd98f Mon Sep 17 00:00:00 2001 +From: Amos Kong +Date: Fri, 31 Aug 2012 10:56:20 +0800 +Subject: [PATCH] fix doc of using raw values with sendkey + +(qemu) sendkey a +(qemu) sendkey 0x1e +(qemu) sendkey #0x1e + unknown key: '#0x1e' + +The last command doesn't work, '#' is not requested before +raw values, and the raw value in decimal format is not supported. + +Signed-off-by: Amos Kong +Signed-off-by: Luiz Capitulino +(cherry picked from commit 886cc706ce5d4d3d1c296f028ddc2991cfbe3bbe) + +Signed-off-by: Michael Roth +--- + hmp-commands.hx | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/hmp-commands.hx b/hmp-commands.hx +index 13f28cf..a72614d 100644 +--- a/hmp-commands.hx ++++ b/hmp-commands.hx +@@ -512,9 +512,9 @@ STEXI + @item sendkey @var{keys} + @findex sendkey + +-Send @var{keys} to the emulator. @var{keys} could be the name of the +-key or @code{#} followed by the raw value in either decimal or hexadecimal +-format. Use @code{-} to press several keys simultaneously. Example: ++Send @var{keys} to the guest. @var{keys} could be the name of the ++key or the raw value in hexadecimal format. Use @code{-} to press ++several keys simultaneously. Example: + @example + sendkey ctrl-alt-f1 + @end example +-- +1.7.12.1 + diff --git a/0111-qapi-Fix-potential-NULL-pointer-segfault.patch b/0111-qapi-Fix-potential-NULL-pointer-segfault.patch new file mode 100644 index 0000000..8f15921 --- /dev/null +++ b/0111-qapi-Fix-potential-NULL-pointer-segfault.patch @@ -0,0 +1,38 @@ +From d01c76a8d9d0d80ba00a407103e7b79112a21fce Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 1 Sep 2012 09:30:39 +0200 +Subject: [PATCH] qapi: Fix potential NULL pointer segfault + +Report from smatch: + +qapi-visit.c:1640 visit_type_BlockdevAction(8) error: + we previously assumed 'obj' could be null (see line 1639) +qapi-visit.c:2432 visit_type_NetClientOptions(8) error: + we previously assumed 'obj' could be null (see line 2431) + +Signed-off-by: Stefan Weil +Reviewed-by: Paolo Bonzini +Signed-off-by: Luiz Capitulino +(cherry picked from commit 227ccf6bff234c29974c2c18ecd3a29e6b965e3d) + +Signed-off-by: Michael Roth +--- + scripts/qapi-visit.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py +index 04ef7c4..5b15ee3 100644 +--- a/scripts/qapi-visit.py ++++ b/scripts/qapi-visit.py +@@ -157,7 +157,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error ** + if (!error_is_set(errp)) { + visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err); + if (!err) { +- if (!obj || *obj) { ++ if (obj && *obj) { + visit_type_%(name)sKind(m, &(*obj)->kind, "type", &err); + if (!err) { + switch ((*obj)->kind) { +-- +1.7.12.1 + diff --git a/0112-json-parser-Fix-potential-NULL-pointer-segfault.patch b/0112-json-parser-Fix-potential-NULL-pointer-segfault.patch new file mode 100644 index 0000000..8198f24 --- /dev/null +++ b/0112-json-parser-Fix-potential-NULL-pointer-segfault.patch @@ -0,0 +1,40 @@ +From f6df33dc89bfa16645e3a8b76e9457986c07b271 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Mon, 3 Sep 2012 21:19:11 +0200 +Subject: [PATCH] json-parser: Fix potential NULL pointer segfault + +Report from smatch: +json-parser.c:474 parse_object(62) error: potential null derefence 'dict'. +json-parser.c:553 parse_array(75) error: potential null derefence 'list'. + +Label 'out' in json-parser.c can be called with list == NULL +which is passed to QDECREF. + +Modify QDECREF to handle a NULL argument (inline function qobject_decref +already handles them, too). + +Signed-off-by: Stefan Weil +Signed-off-by: Luiz Capitulino +(cherry picked from commit 149474c93490e1c66f838391bd491db83136d91d) + +Signed-off-by: Michael Roth +--- + qobject.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/qobject.h b/qobject.h +index d42386d..9124649 100644 +--- a/qobject.h ++++ b/qobject.h +@@ -71,7 +71,7 @@ typedef struct QObject { + + /* High-level interface for qobject_decref() */ + #define QDECREF(obj) \ +- qobject_decref(QOBJECT(obj)) ++ qobject_decref(obj ? QOBJECT(obj) : NULL) + + /* Initialize an object to default values */ + #define QOBJECT_INIT(obj, qtype_type) \ +-- +1.7.12.1 + diff --git a/0113-pcie-drop-version_id-field-for-live-migration.patch b/0113-pcie-drop-version_id-field-for-live-migration.patch new file mode 100644 index 0000000..c3a469f --- /dev/null +++ b/0113-pcie-drop-version_id-field-for-live-migration.patch @@ -0,0 +1,79 @@ +From 7544abf3b783fc82b031d40d0685d2047709492a Mon Sep 17 00:00:00 2001 +From: Jason Baron +Date: Wed, 8 Aug 2012 14:29:12 -0400 +Subject: [PATCH] pcie: drop version_id field for live migration + +While testing q35 live migration, I found that the migration would abort with +the following error: "Unknown savevm section type 76". + +The error is due to this check failing in 'vmstate_load_state()': + + while(field->name) { + if ((field->field_exists && + field->field_exists(opaque, version_id)) || + (!field->field_exists && + field->version_id <= version_id)) { + +The VMSTATE_PCIE_DEVICE() currently has a 'version_id' set to 2. However, +'version_id' in the above check is 1. And thus we fail to load the pcie device +field. Further the code returns to 'qemu_loadvm_state()' which produces the +error that I saw. + +I'm proposing to fix this by simply dropping the 'version_id' field from +VMSTATE_PCIE_DEVICE(). VMSTATE_PCI_DEVICE() defines no such field and further +the vmstate_pcie_device that VMSTATE_PCI_DEVICE() refers to is already +versioned. Thus, any versioning issues could be detected at the vmsd level. + +Taking a step back, I think that the 'field->version_id' should be compared +against a saved version number for the field not the 'version_id'. Futhermore, +once vmstate_load_state() is called recursively on another vmsd, the check of: + + if (version_id > vmsd->version_id) { + return -EINVAL; + } + +Will never fail since version_id is always equal to vmsd->version_id. So I'm +wondering why we aren't storing the vmsd version id of the source in the +migration stream? + +This patch also renames the 'name' field of vmstate_pcie_device from: +PCIDevice -> PCIEDevice to differentiate it from vmstate_pci_device. + +Signed-off-by: Jason Baron +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 1de53459272d89c52bb21b45d5d970de40fbb642) + +Signed-off-by: Michael Roth +--- + hw/pci.c | 2 +- + hw/pcie.h | 1 - + 2 files changed, 1 insertion(+), 2 deletions(-) + +diff --git a/hw/pci.c b/hw/pci.c +index 4d95984..f855cf3 100644 +--- a/hw/pci.c ++++ b/hw/pci.c +@@ -439,7 +439,7 @@ const VMStateDescription vmstate_pci_device = { + }; + + const VMStateDescription vmstate_pcie_device = { +- .name = "PCIDevice", ++ .name = "PCIEDevice", + .version_id = 2, + .minimum_version_id = 1, + .minimum_version_id_old = 1, +diff --git a/hw/pcie.h b/hw/pcie.h +index b8ab0c7..4889194 100644 +--- a/hw/pcie.h ++++ b/hw/pcie.h +@@ -133,7 +133,6 @@ extern const VMStateDescription vmstate_pcie_device; + + #define VMSTATE_PCIE_DEVICE(_field, _state) { \ + .name = (stringify(_field)), \ +- .version_id = 2, \ + .size = sizeof(PCIDevice), \ + .vmsd = &vmstate_pcie_device, \ + .flags = VMS_STRUCT, \ +-- +1.7.12.1 + diff --git a/0114-pcie_aer-clear-cmask-for-Advanced-Error-Interrupt-Me.patch b/0114-pcie_aer-clear-cmask-for-Advanced-Error-Interrupt-Me.patch new file mode 100644 index 0000000..80aad2b --- /dev/null +++ b/0114-pcie_aer-clear-cmask-for-Advanced-Error-Interrupt-Me.patch @@ -0,0 +1,40 @@ +From 89df4609568433f67999c27f9b9cd12e91a7d0b5 Mon Sep 17 00:00:00 2001 +From: Jason Baron +Date: Tue, 4 Sep 2012 16:22:46 -0400 +Subject: [PATCH] pcie_aer: clear cmask for Advanced Error Interrupt Message + Number + +The Advanced Error Interrupt Message Number (bits 31:27 of the Root +Error Status Register) is updated when the number of msi messages assigned to a +device changes. Migration of windows 7 on q35 chipset failed because the check +in get_pci_config_device() fails due to cmask being set on these bits. Its valid +to update these bits and we must restore this state across migration. + +Signed-off-by: Jason Baron +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 0e180d9c8a7429c55d23d2e7855f1e490a063aaa) + +Signed-off-by: Michael Roth +--- + hw/pcie_aer.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/hw/pcie_aer.c b/hw/pcie_aer.c +index 3b6981c..b04c164 100644 +--- a/hw/pcie_aer.c ++++ b/hw/pcie_aer.c +@@ -738,6 +738,11 @@ void pcie_aer_root_init(PCIDevice *dev) + PCI_ERR_ROOT_CMD_EN_MASK); + pci_set_long(dev->w1cmask + pos + PCI_ERR_ROOT_STATUS, + PCI_ERR_ROOT_STATUS_REPORT_MASK); ++ /* PCI_ERR_ROOT_IRQ is RO but devices change it using a ++ * device-specific method. ++ */ ++ pci_set_long(dev->cmask + pos + PCI_ERR_ROOT_STATUS, ++ ~PCI_ERR_ROOT_IRQ); + } + + void pcie_aer_root_reset(PCIDevice *dev) +-- +1.7.12.1 + diff --git a/0115-fix-entry-pointer-for-ELF-kernels-loaded-with-kernel.patch b/0115-fix-entry-pointer-for-ELF-kernels-loaded-with-kernel.patch new file mode 100644 index 0000000..4488d60 --- /dev/null +++ b/0115-fix-entry-pointer-for-ELF-kernels-loaded-with-kernel.patch @@ -0,0 +1,42 @@ +From 3d24d0452bb11e371c710a68b88f09c3accee51f Mon Sep 17 00:00:00 2001 +From: Henning Schild +Date: Wed, 5 Sep 2012 14:56:39 +0200 +Subject: [PATCH] fix entry pointer for ELF kernels loaded with -kernel option + + Find a hopefully proper patch attached. Take it or leave it. + +Reviewed-by: Kevin Wolf +Signed-off-by: Henning Schild +Signed-off-by: Aurelien Jarno +(cherry picked from commit 7e9c7ffe9fd9dfc3d0168dd584936db8144b230b) + +Signed-off-by: Michael Roth +--- + hw/elf_ops.h | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/hw/elf_ops.h b/hw/elf_ops.h +index fa65ce2..731a983 100644 +--- a/hw/elf_ops.h ++++ b/hw/elf_ops.h +@@ -269,6 +269,17 @@ static int glue(load_elf, SZ)(const char *name, int fd, + addr = ph->p_paddr; + } + ++ /* the entry pointer in the ELF header is a virtual ++ * address, if the text segments paddr and vaddr differ ++ * we need to adjust the entry */ ++ if (pentry && !translate_fn && ++ ph->p_vaddr != ph->p_paddr && ++ ehdr.e_entry >= ph->p_vaddr && ++ ehdr.e_entry < ph->p_vaddr + ph->p_filesz && ++ ph->p_flags & PF_X) { ++ *pentry = ehdr.e_entry - ph->p_vaddr + ph->p_paddr; ++ } ++ + snprintf(label, sizeof(label), "phdr #%d: %s", i, name); + rom_add_blob_fixed(label, data, mem_size, addr); + +-- +1.7.12.1 + diff --git a/0116-lan9118-fix-multicast-filtering.patch b/0116-lan9118-fix-multicast-filtering.patch new file mode 100644 index 0000000..19cb229 --- /dev/null +++ b/0116-lan9118-fix-multicast-filtering.patch @@ -0,0 +1,37 @@ +From 0ea96930bcd85734da46de0cd44d1d0408cbb9be Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Sun, 10 Jun 2012 23:18:44 +0200 +Subject: [PATCH] lan9118: fix multicast filtering + +The lan9118 emulation tries to compute the multicast index by calling +directly the crc32() function from zlib, but fails to get the correct +result. + +Use the common compute_mcast_idx() function instead, which gives the +correct result. This fixes IPv6 support. + +Reviewed-by: Peter Maydell +Signed-off-by: Aurelien Jarno +(cherry picked from commit 449bc90e1f2e2fbafb64eb0c76d16c9352b0d2df) + +Signed-off-by: Michael Roth +--- + hw/lan9118.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/lan9118.c b/hw/lan9118.c +index ff0a50b..ceaf96f 100644 +--- a/hw/lan9118.c ++++ b/hw/lan9118.c +@@ -500,7 +500,7 @@ static int lan9118_filter(lan9118_state *s, const uint8_t *addr) + } + } else { + /* Hash matching */ +- hash = (crc32(~0, addr, 6) >> 26); ++ hash = compute_mcast_idx(addr); + if (hash & 0x20) { + return (s->mac_hashh >> (hash & 0x1f)) & 1; + } else { +-- +1.7.12.1 + diff --git a/0117-MIPS-user-Fix-reset-CPU-state-initialization.patch b/0117-MIPS-user-Fix-reset-CPU-state-initialization.patch new file mode 100644 index 0000000..e98d248 --- /dev/null +++ b/0117-MIPS-user-Fix-reset-CPU-state-initialization.patch @@ -0,0 +1,196 @@ +From 608a36df28b4db83124d06081029023e01901fc9 Mon Sep 17 00:00:00 2001 +From: "Maciej W. Rozycki" +Date: Fri, 8 Jun 2012 02:04:40 +0100 +Subject: [PATCH] MIPS/user: Fix reset CPU state initialization + + This change updates the CPU reset sequence to use a common piece of code +that figures out CPU state flags, fixing the problem with MIPS_HFLAG_COP1X +not being set where applicable that causes floating-point MADD family +instructions (and other instructions from the MIPS IV FP subset) to trap. + + As compute_hflags is now shared between op_helper.c and translate.c, the +function is now moved to a common header. There are no changes to this +function. + + The problem was seen with the 24Kf MIPS32r2 processor in user emulation. +The new approach prevents system and user emulation from diverging -- all +the hflags state is initialized in one place now. + +Signed-off-by: Maciej W. Rozycki +Signed-off-by: Aurelien Jarno +(cherry picked from commit 03e6e5017757645f00b2f3b4f3a257973985e455) + +Signed-off-by: Michael Roth +--- + target-mips/cpu.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ + target-mips/op_helper.c | 49 ------------------------------------------------- + target-mips/translate.c | 16 +++------------- + 3 files changed, 52 insertions(+), 62 deletions(-) + +diff --git a/target-mips/cpu.h b/target-mips/cpu.h +index be4f805..b7a5112 100644 +--- a/target-mips/cpu.h ++++ b/target-mips/cpu.h +@@ -742,4 +742,53 @@ static inline void cpu_pc_from_tb(CPUMIPSState *env, TranslationBlock *tb) + env->hflags |= tb->flags & MIPS_HFLAG_BMASK; + } + ++static inline void compute_hflags(CPUMIPSState *env) ++{ ++ env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 | ++ MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU | ++ MIPS_HFLAG_UX); ++ if (!(env->CP0_Status & (1 << CP0St_EXL)) && ++ !(env->CP0_Status & (1 << CP0St_ERL)) && ++ !(env->hflags & MIPS_HFLAG_DM)) { ++ env->hflags |= (env->CP0_Status >> CP0St_KSU) & MIPS_HFLAG_KSU; ++ } ++#if defined(TARGET_MIPS64) ++ if (((env->hflags & MIPS_HFLAG_KSU) != MIPS_HFLAG_UM) || ++ (env->CP0_Status & (1 << CP0St_PX)) || ++ (env->CP0_Status & (1 << CP0St_UX))) { ++ env->hflags |= MIPS_HFLAG_64; ++ } ++ if (env->CP0_Status & (1 << CP0St_UX)) { ++ env->hflags |= MIPS_HFLAG_UX; ++ } ++#endif ++ if ((env->CP0_Status & (1 << CP0St_CU0)) || ++ !(env->hflags & MIPS_HFLAG_KSU)) { ++ env->hflags |= MIPS_HFLAG_CP0; ++ } ++ if (env->CP0_Status & (1 << CP0St_CU1)) { ++ env->hflags |= MIPS_HFLAG_FPU; ++ } ++ if (env->CP0_Status & (1 << CP0St_FR)) { ++ env->hflags |= MIPS_HFLAG_F64; ++ } ++ if (env->insn_flags & ISA_MIPS32R2) { ++ if (env->active_fpu.fcr0 & (1 << FCR0_F64)) { ++ env->hflags |= MIPS_HFLAG_COP1X; ++ } ++ } else if (env->insn_flags & ISA_MIPS32) { ++ if (env->hflags & MIPS_HFLAG_64) { ++ env->hflags |= MIPS_HFLAG_COP1X; ++ } ++ } else if (env->insn_flags & ISA_MIPS4) { ++ /* All supported MIPS IV CPUs use the XX (CU3) to enable ++ and disable the MIPS IV extensions to the MIPS III ISA. ++ Some other MIPS IV CPUs ignore the bit, so the check here ++ would be too restrictive for them. */ ++ if (env->CP0_Status & (1 << CP0St_CU3)) { ++ env->hflags |= MIPS_HFLAG_COP1X; ++ } ++ } ++} ++ + #endif /* !defined (__MIPS_CPU_H__) */ +diff --git a/target-mips/op_helper.c b/target-mips/op_helper.c +index d2a8a55..ce5ddaf 100644 +--- a/target-mips/op_helper.c ++++ b/target-mips/op_helper.c +@@ -30,55 +30,6 @@ + static inline void cpu_mips_tlb_flush (CPUMIPSState *env, int flush_global); + #endif + +-static inline void compute_hflags(CPUMIPSState *env) +-{ +- env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 | +- MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU | +- MIPS_HFLAG_UX); +- if (!(env->CP0_Status & (1 << CP0St_EXL)) && +- !(env->CP0_Status & (1 << CP0St_ERL)) && +- !(env->hflags & MIPS_HFLAG_DM)) { +- env->hflags |= (env->CP0_Status >> CP0St_KSU) & MIPS_HFLAG_KSU; +- } +-#if defined(TARGET_MIPS64) +- if (((env->hflags & MIPS_HFLAG_KSU) != MIPS_HFLAG_UM) || +- (env->CP0_Status & (1 << CP0St_PX)) || +- (env->CP0_Status & (1 << CP0St_UX))) { +- env->hflags |= MIPS_HFLAG_64; +- } +- if (env->CP0_Status & (1 << CP0St_UX)) { +- env->hflags |= MIPS_HFLAG_UX; +- } +-#endif +- if ((env->CP0_Status & (1 << CP0St_CU0)) || +- !(env->hflags & MIPS_HFLAG_KSU)) { +- env->hflags |= MIPS_HFLAG_CP0; +- } +- if (env->CP0_Status & (1 << CP0St_CU1)) { +- env->hflags |= MIPS_HFLAG_FPU; +- } +- if (env->CP0_Status & (1 << CP0St_FR)) { +- env->hflags |= MIPS_HFLAG_F64; +- } +- if (env->insn_flags & ISA_MIPS32R2) { +- if (env->active_fpu.fcr0 & (1 << FCR0_F64)) { +- env->hflags |= MIPS_HFLAG_COP1X; +- } +- } else if (env->insn_flags & ISA_MIPS32) { +- if (env->hflags & MIPS_HFLAG_64) { +- env->hflags |= MIPS_HFLAG_COP1X; +- } +- } else if (env->insn_flags & ISA_MIPS4) { +- /* All supported MIPS IV CPUs use the XX (CU3) to enable +- and disable the MIPS IV extensions to the MIPS III ISA. +- Some other MIPS IV CPUs ignore the bit, so the check here +- would be too restrictive for them. */ +- if (env->CP0_Status & (1 << CP0St_CU3)) { +- env->hflags |= MIPS_HFLAG_COP1X; +- } +- } +-} +- + /*****************************************************************************/ + /* Exceptions processing helpers */ + +diff --git a/target-mips/translate.c b/target-mips/translate.c +index aba7935..4e04e97 100644 +--- a/target-mips/translate.c ++++ b/target-mips/translate.c +@@ -12816,18 +12816,13 @@ void cpu_state_reset(CPUMIPSState *env) + env->insn_flags = env->cpu_model->insn_flags; + + #if defined(CONFIG_USER_ONLY) +- env->hflags = MIPS_HFLAG_UM; ++ env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU); + /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR + hardware registers. */ + env->CP0_HWREna |= 0x0000000F; + if (env->CP0_Config1 & (1 << CP0C1_FP)) { +- env->hflags |= MIPS_HFLAG_FPU; ++ env->CP0_Status |= (1 << CP0St_CU1); + } +-#ifdef TARGET_MIPS64 +- if (env->active_fpu.fcr0 & (1 << FCR0_F64)) { +- env->hflags |= MIPS_HFLAG_F64; +- } +-#endif + #else + if (env->hflags & MIPS_HFLAG_BMASK) { + /* If the exception was raised from a delay slot, +@@ -12857,7 +12852,6 @@ void cpu_state_reset(CPUMIPSState *env) + } + /* Count register increments in debug mode, EJTAG version 1 */ + env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER); +- env->hflags = MIPS_HFLAG_CP0; + + if (env->CP0_Config3 & (1 << CP0C3_MT)) { + int i; +@@ -12885,11 +12879,7 @@ void cpu_state_reset(CPUMIPSState *env) + } + } + #endif +-#if defined(TARGET_MIPS64) +- if (env->cpu_model->insn_flags & ISA_MIPS3) { +- env->hflags |= MIPS_HFLAG_64; +- } +-#endif ++ compute_hflags(env); + env->exception_index = EXCP_NONE; + } + +-- +1.7.12.1 + diff --git a/0118-Add-MAINTAINERS-entry-for-leon3.patch b/0118-Add-MAINTAINERS-entry-for-leon3.patch new file mode 100644 index 0000000..cbc0ff8 --- /dev/null +++ b/0118-Add-MAINTAINERS-entry-for-leon3.patch @@ -0,0 +1,34 @@ +From 6bfc31b2f98dabc0e636cd8955c8de93bcac0961 Mon Sep 17 00:00:00 2001 +From: Fabien Chouteau +Date: Tue, 22 May 2012 10:14:28 +0200 +Subject: [PATCH] Add MAINTAINERS entry for leon3 + +Signed-off-by: Fabien Chouteau +Signed-off-by: Blue Swirl +(cherry picked from commit ce6c760c37b9a88db87c5b9b9bf39ca866e570f6) + +Signed-off-by: Michael Roth +--- + MAINTAINERS | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/MAINTAINERS b/MAINTAINERS +index 6d864c1..61f8b45 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -398,6 +398,12 @@ M: Blue Swirl + S: Maintained + F: hw/sun4u.c + ++Leon3 ++M: Fabien Chouteau ++S: Maintained ++F: hw/leon3.c ++F: hw/grlib* ++ + S390 Machines + ------------- + S390 Virtio +-- +1.7.12.1 + diff --git a/0119-musicpal-Fix-flash-mapping.patch b/0119-musicpal-Fix-flash-mapping.patch new file mode 100644 index 0000000..9c95c49 --- /dev/null +++ b/0119-musicpal-Fix-flash-mapping.patch @@ -0,0 +1,42 @@ +From 2182aa5c2ca5a5a6bf9c2d06d18b3e2db3aa3c7a Mon Sep 17 00:00:00 2001 +From: Jan Kiszka +Date: Sat, 8 Sep 2012 11:52:39 +0200 +Subject: [PATCH] musicpal: Fix flash mapping + +The old arithmetic assumed 32 physical address bits which is no longer +true for ARM since 3cc0cd61f4. + +Signed-off-by: Jan Kiszka +Signed-off-by: Blue Swirl +(cherry picked from commit 0c267217ca9985e6d118ec8368bebd382db7a099) + +Signed-off-by: Michael Roth +--- + hw/musicpal.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/hw/musicpal.c b/hw/musicpal.c +index ad725b5..f305e21 100644 +--- a/hw/musicpal.c ++++ b/hw/musicpal.c +@@ -1583,7 +1583,7 @@ static void musicpal_init(ram_addr_t ram_size, + * image is smaller than 32 MB. + */ + #ifdef TARGET_WORDS_BIGENDIAN +- pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, NULL, ++ pflash_cfi02_register(0x100000000ULL-MP_FLASH_SIZE_MAX, NULL, + "musicpal.flash", flash_size, + dinfo->bdrv, 0x10000, + (flash_size + 0xffff) >> 16, +@@ -1591,7 +1591,7 @@ static void musicpal_init(ram_addr_t ram_size, + 2, 0x00BF, 0x236D, 0x0000, 0x0000, + 0x5555, 0x2AAA, 1); + #else +- pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, NULL, ++ pflash_cfi02_register(0x100000000ULL-MP_FLASH_SIZE_MAX, NULL, + "musicpal.flash", flash_size, + dinfo->bdrv, 0x10000, + (flash_size + 0xffff) >> 16, +-- +1.7.12.1 + diff --git a/0120-qemu-Use-valgrind-annotations-to-mark-kvm-guest-memo.patch b/0120-qemu-Use-valgrind-annotations-to-mark-kvm-guest-memo.patch new file mode 100644 index 0000000..40caa2c --- /dev/null +++ b/0120-qemu-Use-valgrind-annotations-to-mark-kvm-guest-memo.patch @@ -0,0 +1,84 @@ +From e688bfbda0f6893b08d1e51f4fb26d4b38e922d4 Mon Sep 17 00:00:00 2001 +From: Christian Borntraeger +Date: Fri, 10 Aug 2012 15:11:45 +0200 +Subject: [PATCH] qemu: Use valgrind annotations to mark kvm guest memory as + defined + +valgrind with kvm produces a big amount of false positives regarding +"Conditional jump or move depends on uninitialised value(s)". This +happens because the guest memory is allocated with qemu_vmalloc which +boils down posix_memalign etc. This function is (correctly) considered +by valgrind as returning undefined memory. + +Since valgrind is based on jitting code, it will not be able to see +changes made by the guest to guest memory if this is done by KVM_RUN, +thus keeping most of the guest memory undefined. + +Now lots of places in qemu will then use guest memory to change behaviour. +To avoid the flood of these messages, lets declare the whole guest +memory as defined. This will reduce the noise and allows us to see real +problems. + +In the future we might want to make this conditional, since there +is actually something that we can use those false positives for: +These messages will point to code that depends on guest memory, so +we can use these backtraces to actually make an audit that is focussed +only at those code places. For normal development we dont want to +see those messages, though. + +Signed-off-by: Christian Borntraeger +Signed-off-by: Avi Kivity +(cherry picked from commit 62fe83318d2fc5b31f473d66326910d94c1c4907) + +Signed-off-by: Michael Roth +--- + configure | 3 ++- + kvm-all.c | 7 +++++++ + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/configure b/configure +index d7a948f..8874eff 100755 +--- a/configure ++++ b/configure +@@ -2937,11 +2937,12 @@ if compile_prog "-Werror" "" ; then + fi + + ######################################## +-# check if we have valgrind/valgrind.h ++# check if we have valgrind/valgrind.h and valgrind/memcheck.h + + valgrind_h=no + cat > $TMPC << EOF + #include ++#include + int main(void) { + return 0; + } +diff --git a/kvm-all.c b/kvm-all.c +index badf1d8..90c71f9 100644 +--- a/kvm-all.c ++++ b/kvm-all.c +@@ -39,6 +39,10 @@ + #include + #endif + ++#ifdef CONFIG_VALGRIND_H ++#include ++#endif ++ + /* KVM uses PAGE_SIZE in its definition of COALESCED_MMIO_MAX */ + #define PAGE_SIZE TARGET_PAGE_SIZE + +@@ -1769,6 +1773,9 @@ void *kvm_vmalloc(ram_addr_t size) + + void kvm_setup_guest_memory(void *start, size_t size) + { ++#ifdef CONFIG_VALGRIND_H ++ VALGRIND_MAKE_MEM_DEFINED(start, size); ++#endif + if (!kvm_has_sync_mmu()) { + int ret = qemu_madvise(start, size, QEMU_MADV_DONTFORK); + +-- +1.7.12.1 + diff --git a/0121-hw-wm8750-Fix-potential-buffer-overflow.patch b/0121-hw-wm8750-Fix-potential-buffer-overflow.patch new file mode 100644 index 0000000..2b3acbe --- /dev/null +++ b/0121-hw-wm8750-Fix-potential-buffer-overflow.patch @@ -0,0 +1,43 @@ +From 044cadadb3bb63396a1e8d72a0c90673ccd7be98 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Mon, 3 Sep 2012 22:56:00 +0200 +Subject: [PATCH] hw/wm8750: Fix potential buffer overflow + +Report from smatch: + +hw/wm8750.c:369 wm8750_tx(12) error: buffer overflow 's->i2c_data' 2 <= 2 + +It looks like the preprocessor statements were simply misplaced. + +Replace also __FUNCTION__ by __func__ to please checkpatch.pl. + +Signed-off-by: Stefan Weil +Reviewed-by: Peter Maydell +Signed-off-by: Aurelien Jarno +(cherry picked from commit 149eeb5fe57b853081e8059575d91b8a58a4f96c) + +Signed-off-by: Michael Roth +--- + hw/wm8750.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/hw/wm8750.c b/hw/wm8750.c +index 11bcec3..44f138f 100644 +--- a/hw/wm8750.c ++++ b/hw/wm8750.c +@@ -361,10 +361,10 @@ static int wm8750_tx(I2CSlave *i2c, uint8_t data) + uint16_t value; + + if (s->i2c_len >= 2) { +- printf("%s: long message (%i bytes)\n", __FUNCTION__, s->i2c_len); + #ifdef VERBOSE +- return 1; ++ printf("%s: long message (%i bytes)\n", __func__, s->i2c_len); + #endif ++ return 1; + } + s->i2c_data[s->i2c_len ++] = data; + if (s->i2c_len != 2) +-- +1.7.12.1 + diff --git a/0122-hw-mcf5206-Fix-buffer-overflow-for-MBAR-read-write.patch b/0122-hw-mcf5206-Fix-buffer-overflow-for-MBAR-read-write.patch new file mode 100644 index 0000000..c5fe15f --- /dev/null +++ b/0122-hw-mcf5206-Fix-buffer-overflow-for-MBAR-read-write.patch @@ -0,0 +1,87 @@ +From 90c742c7f36f45249c62c0c5db2e138a604e44ac Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Tue, 4 Sep 2012 19:37:39 +0200 +Subject: [PATCH] hw/mcf5206: Fix buffer overflow for MBAR read / write + +Report from smatch: + +mcf5206.c:384 m5206_mbar_readb(7) error: buffer overflow 'm5206_mbar_width' 128 <= 128 +mcf5206.c:403 m5206_mbar_readw(8) error: buffer overflow 'm5206_mbar_width' 128 <= 128 +mcf5206.c:427 m5206_mbar_readl(8) error: buffer overflow 'm5206_mbar_width' 128 <= 128 +mcf5206.c:451 m5206_mbar_writeb(9) error: buffer overflow 'm5206_mbar_width' 128 <= 128 +mcf5206.c:475 m5206_mbar_writew(9) error: buffer overflow 'm5206_mbar_width' 128 <= 128 +mcf5206.c:503 m5206_mbar_writel(9) error: buffer overflow 'm5206_mbar_width' 128 <= 128 + +m5206_mbar_width has 0x80 elements and supports 0 <= offset < 0x200. + +Signed-off-by: Stefan Weil +Reviewed-by: Peter Maydell +Signed-off-by: Aurelien Jarno +(cherry picked from commit a32354e206895400d17c3de9a8df1de96d3df289) + +Signed-off-by: Michael Roth +--- + hw/mcf5206.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/hw/mcf5206.c b/hw/mcf5206.c +index 539b391..27753e2 100644 +--- a/hw/mcf5206.c ++++ b/hw/mcf5206.c +@@ -378,7 +378,7 @@ static uint32_t m5206_mbar_readb(void *opaque, target_phys_addr_t offset) + { + m5206_mbar_state *s = (m5206_mbar_state *)opaque; + offset &= 0x3ff; +- if (offset > 0x200) { ++ if (offset >= 0x200) { + hw_error("Bad MBAR read offset 0x%x", (int)offset); + } + if (m5206_mbar_width[offset >> 2] > 1) { +@@ -397,7 +397,7 @@ static uint32_t m5206_mbar_readw(void *opaque, target_phys_addr_t offset) + m5206_mbar_state *s = (m5206_mbar_state *)opaque; + int width; + offset &= 0x3ff; +- if (offset > 0x200) { ++ if (offset >= 0x200) { + hw_error("Bad MBAR read offset 0x%x", (int)offset); + } + width = m5206_mbar_width[offset >> 2]; +@@ -421,7 +421,7 @@ static uint32_t m5206_mbar_readl(void *opaque, target_phys_addr_t offset) + m5206_mbar_state *s = (m5206_mbar_state *)opaque; + int width; + offset &= 0x3ff; +- if (offset > 0x200) { ++ if (offset >= 0x200) { + hw_error("Bad MBAR read offset 0x%x", (int)offset); + } + width = m5206_mbar_width[offset >> 2]; +@@ -445,7 +445,7 @@ static void m5206_mbar_writeb(void *opaque, target_phys_addr_t offset, + m5206_mbar_state *s = (m5206_mbar_state *)opaque; + int width; + offset &= 0x3ff; +- if (offset > 0x200) { ++ if (offset >= 0x200) { + hw_error("Bad MBAR write offset 0x%x", (int)offset); + } + width = m5206_mbar_width[offset >> 2]; +@@ -469,7 +469,7 @@ static void m5206_mbar_writew(void *opaque, target_phys_addr_t offset, + m5206_mbar_state *s = (m5206_mbar_state *)opaque; + int width; + offset &= 0x3ff; +- if (offset > 0x200) { ++ if (offset >= 0x200) { + hw_error("Bad MBAR write offset 0x%x", (int)offset); + } + width = m5206_mbar_width[offset >> 2]; +@@ -497,7 +497,7 @@ static void m5206_mbar_writel(void *opaque, target_phys_addr_t offset, + m5206_mbar_state *s = (m5206_mbar_state *)opaque; + int width; + offset &= 0x3ff; +- if (offset > 0x200) { ++ if (offset >= 0x200) { + hw_error("Bad MBAR write offset 0x%x", (int)offset); + } + width = m5206_mbar_width[offset >> 2]; +-- +1.7.12.1 + diff --git a/0123-use-libexecdir-instead-of-ignoring-it-first-and-rein.patch b/0123-use-libexecdir-instead-of-ignoring-it-first-and-rein.patch new file mode 100644 index 0000000..9764f22 --- /dev/null +++ b/0123-use-libexecdir-instead-of-ignoring-it-first-and-rein.patch @@ -0,0 +1,94 @@ +From 6762c144443bca8fa97a389289bda7693bd4c8d4 Mon Sep 17 00:00:00 2001 +From: Michael Tokarev +Date: Thu, 7 Jun 2012 01:11:00 +0400 +Subject: [PATCH] use --libexecdir instead of ignoring it first and + reinventing it later +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit 7b93fadf3a38d1ed65ea5536a52efc2772c6e3b8 "Add basic version +of bridge helper" put the bridge helper executable into a fixed +${prefix}/libexec/ location, instead of using ${libexecdir} for +this. At the same time, --libexecdir is being happily ignored +by ./configure. Even more, the same patch sets unused $libexecdir +variable in the generated config-host.mak, and uses fixed string +(\${prefix}/libexecdir) for the bridge helper binary. + +Fix this braindamage by introducing $libexecdir variable, using +it for the bridge helper binary, and recognizing --libexecdir. + +This patch is applicable to stable-1.1. + +Reviewed-by: Andreas Färber +Reviewed-by: Corey Bryant +Signed-off-by: Michael Tokarev +Cc: Corey Bryant +Cc: Richa Marwaha +Cc: qemu-stable@nongnu.org +Signed-off-by: Anthony Liguori +(cherry picked from commit 8bf188aa18ef7a8355d9edbd43871d590468c4ed) + +Signed-off-by: Michael Roth +--- + configure | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/configure b/configure +index 8874eff..d01f9dc 100755 +--- a/configure ++++ b/configure +@@ -191,6 +191,7 @@ datadir="\${prefix}/share" + qemu_docdir="\${prefix}/share/doc/qemu" + bindir="\${prefix}/bin" + libdir="\${prefix}/lib" ++libexecdir="\${prefix}/libexec" + includedir="\${prefix}/include" + sysconfdir="\${prefix}/etc" + confsuffix="/qemu" +@@ -624,6 +625,8 @@ for opt do + ;; + --libdir=*) libdir="$optarg" + ;; ++ --libexecdir=*) libexecdir="$optarg" ++ ;; + --includedir=*) includedir="$optarg" + ;; + --datadir=*) datadir="$optarg" +@@ -634,7 +637,7 @@ for opt do + ;; + --sysconfdir=*) sysconfdir="$optarg" + ;; +- --sbindir=*|--libexecdir=*|--sharedstatedir=*|--localstatedir=*|\ ++ --sbindir=*|--sharedstatedir=*|--localstatedir=*|\ + --oldincludedir=*|--datarootdir=*|--infodir=*|--localedir=*|\ + --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*) + # These switches are silently ignored, for compatibility with +@@ -3055,6 +3058,7 @@ echo "Install prefix $prefix" + echo "BIOS directory `eval echo $qemu_datadir`" + echo "binary directory `eval echo $bindir`" + echo "library directory `eval echo $libdir`" ++echo "libexec directory `eval echo $libexecdir`" + echo "include directory `eval echo $includedir`" + echo "config directory `eval echo $sysconfdir`" + if test "$mingw32" = "no" ; then +@@ -3158,14 +3162,14 @@ echo all: >> $config_host_mak + echo "prefix=$prefix" >> $config_host_mak + echo "bindir=$bindir" >> $config_host_mak + echo "libdir=$libdir" >> $config_host_mak ++echo "libexecdir=$libexecdir" >> $config_host_mak + echo "includedir=$includedir" >> $config_host_mak + echo "mandir=$mandir" >> $config_host_mak + echo "sysconfdir=$sysconfdir" >> $config_host_mak + echo "qemu_confdir=$qemu_confdir" >> $config_host_mak + echo "qemu_datadir=$qemu_datadir" >> $config_host_mak + echo "qemu_docdir=$qemu_docdir" >> $config_host_mak +-echo "libexecdir=\${prefix}/libexec" >> $config_host_mak +-echo "CONFIG_QEMU_HELPERDIR=\"$prefix/libexec\"" >> $config_host_mak ++echo "CONFIG_QEMU_HELPERDIR=\"$libexecdir\"" >> $config_host_mak + + echo "ARCH=$ARCH" >> $config_host_mak + if test "$debug_tcg" = "yes" ; then +-- +1.7.12.1 + diff --git a/0124-socket-don-t-attempt-to-reconnect-a-TCP-socket-in-se.patch b/0124-socket-don-t-attempt-to-reconnect-a-TCP-socket-in-se.patch new file mode 100644 index 0000000..cff77f8 --- /dev/null +++ b/0124-socket-don-t-attempt-to-reconnect-a-TCP-socket-in-se.patch @@ -0,0 +1,43 @@ +From 40874e295225675fec7b42bb8e015fb3f2065a69 Mon Sep 17 00:00:00 2001 +From: Anthony Liguori +Date: Wed, 5 Sep 2012 13:52:49 -0500 +Subject: [PATCH] socket: don't attempt to reconnect a TCP socket in server + mode + +Commit c3767ed0eb5d0bb25fe409ae5dec06e3411ff1b6 introduced a possible SEGV when +using a socket chardev with server=on because it assumes that all TCP sockets +are in client mode. + +This patch adds a check to only reconnect when in client mode. + +Cc: Lei Li +Reported-by: Michael Roth +Signed-off-by: Anthony Liguori +(cherry picked from commit 455aa1e0818653c41fd794435b982426ce21ba2f) + +Signed-off-by: Michael Roth +--- + qemu-char.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/qemu-char.c b/qemu-char.c +index 398baf1..767da93 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -2148,10 +2148,12 @@ static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + TCPCharDriver *s = chr->opaque; + if (s->connected) { + return send_all(s->fd, buf, len); +- } else { ++ } else if (s->listen_fd == -1) { + /* (Re-)connect for unconnected writing */ + tcp_chr_connect(chr); + return 0; ++ } else { ++ return len; + } + } + +-- +1.7.12.1 + diff --git a/0125-Add-ability-to-force-enable-disable-of-tools-build.patch b/0125-Add-ability-to-force-enable-disable-of-tools-build.patch new file mode 100644 index 0000000..35e05ee --- /dev/null +++ b/0125-Add-ability-to-force-enable-disable-of-tools-build.patch @@ -0,0 +1,83 @@ +From d9f498f4b7b7ca2ff96b4d87827713caea3743b5 Mon Sep 17 00:00:00 2001 +From: "Daniel P. Berrange" +Date: Mon, 10 Sep 2012 12:26:29 +0100 +Subject: [PATCH] Add ability to force enable/disable of tools build + +The qemu-img, qemu-nbd and qemu-io tools are built conditionally +based on whether any softmmu target is enabled. These are useful +self-contained tools which can be used in many other scenarios. +Add new --enable-tools/--disable-tools args to configure to allow +the user to explicitly turn on / off their build. The default +behaviour is now to build these tools are all times, regardless +of whether any softmmu target is enabled + +Signed-off-by: Daniel P. Berrange +Signed-off-by: Anthony Liguori +(cherry picked from commit 4b1c11fd20e8901f04a2d9c225cd10fc05a762ff) + +Signed-off-by: Michael Roth +--- + configure | 21 +++++++++++++++------ + 1 file changed, 15 insertions(+), 6 deletions(-) + +diff --git a/configure b/configure +index d01f9dc..a8061c1 100755 +--- a/configure ++++ b/configure +@@ -225,6 +225,7 @@ usb_redir="" + opengl="" + zlib="yes" + guest_agent="yes" ++want_tools="yes" + libiscsi="" + coroutine="" + seccomp="" +@@ -857,6 +858,10 @@ for opt do + ;; + --disable-guest-agent) guest_agent="no" + ;; ++ --enable-tools) want_tools="yes" ++ ;; ++ --disable-tools) want_tools="no" ++ ;; + --enable-seccomp) seccomp="yes" + ;; + --disable-seccomp) seccomp="no" +@@ -3017,9 +3022,14 @@ fi + qemu_confdir=$sysconfdir$confsuffix + qemu_datadir=$datadir$confsuffix + +-tools= +-if test "$softmmu" = yes ; then ++tools="" ++if test "$want_tools" = "yes" ; then + tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) $tools" ++ if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then ++ tools="qemu-nbd\$(EXESUF) $tools" ++ fi ++fi ++if test "$softmmu" = yes ; then + if test "$virtfs" != no ; then + if test "$cap" = yes && test "$linux" = yes && test "$attr" = yes ; then + virtfs=yes +@@ -3033,14 +3043,13 @@ if test "$softmmu" = yes ; then + fi + fi + if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then +- tools="qemu-nbd\$(EXESUF) $tools" + if [ "$guest_agent" = "yes" ]; then + tools="qemu-ga\$(EXESUF) $tools" + fi + fi +-fi +-if test "$smartcard_nss" = "yes" ; then +- tools="vscclient\$(EXESUF) $tools" ++ if test "$smartcard_nss" = "yes" ; then ++ tools="vscclient\$(EXESUF) $tools" ++ fi + fi + + # Mac OS X ships with a broken assembler +-- +1.7.12.1 + diff --git a/0126-usb-controllers-do-not-need-to-check-for-babble-them.patch b/0126-usb-controllers-do-not-need-to-check-for-babble-them.patch new file mode 100644 index 0000000..2630139 --- /dev/null +++ b/0126-usb-controllers-do-not-need-to-check-for-babble-them.patch @@ -0,0 +1,58 @@ +From 074f49c02e7f2fd50533a246b4060051f95f8b09 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Fri, 17 Aug 2012 11:39:16 +0200 +Subject: [PATCH] usb: controllers do not need to check for babble themselves + +If an (emulated) usb-device tries to write more data to a packet then +its iov len, this will trigger an assert in usb_packet_copy(), and if +a driver somehow circumvents that check and writes more data to the +iov then there is space, we have a much bigger problem then not correctly +reporting babble to the guest. + +In practice babble will only happen with (real) redirected devices, and there +both the usb-host os and the qemu usb-device code already check for it. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 45b339b18c660eb85af2ba25bfcaed5469660d77) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 4 ---- + hw/usb/hcd-uhci.c | 5 ----- + 2 files changed, 9 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 017342b..9523247 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -1481,10 +1481,6 @@ static void ehci_execute_complete(EHCIQueue *q) + assert(0); + break; + } +- } else if ((p->usb_status > p->tbytes) && (p->pid == USB_TOKEN_IN)) { +- p->usb_status = USB_RET_BABBLE; +- q->qh.token |= (QTD_TOKEN_HALT | QTD_TOKEN_BABBLE); +- ehci_raise_irq(q->ehci, USBSTS_ERRINT); + } else { + // TODO check 4.12 for splits + +diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c +index b0db921..c7c8786 100644 +--- a/hw/usb/hcd-uhci.c ++++ b/hw/usb/hcd-uhci.c +@@ -729,11 +729,6 @@ static int uhci_complete_td(UHCIState *s, UHCI_TD *td, UHCIAsync *async, uint32_ + *int_mask |= 0x01; + + if (pid == USB_TOKEN_IN) { +- if (len > max_len) { +- ret = USB_RET_BABBLE; +- goto out; +- } +- + if ((td->ctrl & TD_CTRL_SPD) && len < max_len) { + *int_mask |= 0x02; + /* short packet: do not update QH */ +-- +1.7.12.1 + diff --git a/0127-usb-core-Don-t-set-packet-state-to-complete-on-a-nak.patch b/0127-usb-core-Don-t-set-packet-state-to-complete-on-a-nak.patch new file mode 100644 index 0000000..1bbaed0 --- /dev/null +++ b/0127-usb-core-Don-t-set-packet-state-to-complete-on-a-nak.patch @@ -0,0 +1,37 @@ +From bcd7c845fbfbafe03e320fbffcaa32417cfd5267 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 12:33:44 +0200 +Subject: [PATCH] usb-core: Don't set packet state to complete on a nak + +This way the hcd can re-use the same packet to retry without needing +to re-init it. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit cc40997489260f405aecccd30d4626ceee862502) + +Signed-off-by: Michael Roth +--- + hw/usb/core.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/hw/usb/core.c b/hw/usb/core.c +index 2da38e7..be6d936 100644 +--- a/hw/usb/core.c ++++ b/hw/usb/core.c +@@ -399,8 +399,10 @@ int usb_handle_packet(USBDevice *dev, USBPacket *p) + * otherwise packets can complete out of order! + */ + assert(!p->ep->pipeline); +- p->result = ret; +- usb_packet_set_state(p, USB_PACKET_COMPLETE); ++ if (ret != USB_RET_NAK) { ++ p->result = ret; ++ usb_packet_set_state(p, USB_PACKET_COMPLETE); ++ } + } + } else { + ret = USB_RET_ASYNC; +-- +1.7.12.1 + diff --git a/0128-usb-core-Add-a-usb_ep_find_packet_by_id-helper-funct.patch b/0128-usb-core-Add-a-usb_ep_find_packet_by_id-helper-funct.patch new file mode 100644 index 0000000..994e450 --- /dev/null +++ b/0128-usb-core-Add-a-usb_ep_find_packet_by_id-helper-funct.patch @@ -0,0 +1,54 @@ +From 3c2f94fdc5e776ee66bccc704884f3b1b090b4c6 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 28 Aug 2012 09:43:18 +0200 +Subject: [PATCH] usb-core: Add a usb_ep_find_packet_by_id() helper function + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit c13a9e61366cc3e28299d8faeb65e65c6e5964cf) + +Signed-off-by: Michael Roth +--- + hw/usb.h | 2 ++ + hw/usb/core.c | 15 +++++++++++++++ + 2 files changed, 17 insertions(+) + +diff --git a/hw/usb.h b/hw/usb.h +index b8fceec..684e3f4 100644 +--- a/hw/usb.h ++++ b/hw/usb.h +@@ -377,6 +377,8 @@ void usb_ep_set_max_packet_size(USBDevice *dev, int pid, int ep, + uint16_t raw); + int usb_ep_get_max_packet_size(USBDevice *dev, int pid, int ep); + void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled); ++USBPacket *usb_ep_find_packet_by_id(USBDevice *dev, int pid, int ep, ++ uint64_t id); + + void usb_attach(USBPort *port); + void usb_detach(USBPort *port); +diff --git a/hw/usb/core.c b/hw/usb/core.c +index be6d936..fe431d0 100644 +--- a/hw/usb/core.c ++++ b/hw/usb/core.c +@@ -726,3 +726,18 @@ void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled) + struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); + uep->pipeline = enabled; + } ++ ++USBPacket *usb_ep_find_packet_by_id(USBDevice *dev, int pid, int ep, ++ uint64_t id) ++{ ++ struct USBEndpoint *uep = usb_ep_get(dev, pid, ep); ++ USBPacket *p; ++ ++ while ((p = QTAILQ_FIRST(&uep->queue)) != NULL) { ++ if (p->id == id) { ++ return p; ++ } ++ } ++ ++ return NULL; ++} +-- +1.7.12.1 + diff --git a/0129-usb-core-Allow-the-first-packet-of-a-pipelined-ep-to.patch b/0129-usb-core-Allow-the-first-packet-of-a-pipelined-ep-to.patch new file mode 100644 index 0000000..c264ca1 --- /dev/null +++ b/0129-usb-core-Allow-the-first-packet-of-a-pipelined-ep-to.patch @@ -0,0 +1,35 @@ +From 2a2b40b145764ece12d0872ae5bb7b7ec2dc271f Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 12:48:49 +0200 +Subject: [PATCH] usb-core: Allow the first packet of a pipelined ep to + complete immediately + +This can happen with usb-redir live-migration when the packet gets re-queued +after the migration and the original queuing from the migration source side +has already finished. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 9c1f67654ab611553bbfca54a1e0922728c25760) + +Signed-off-by: Michael Roth +--- + hw/usb/core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/usb/core.c b/hw/usb/core.c +index fe431d0..b9f1f7a 100644 +--- a/hw/usb/core.c ++++ b/hw/usb/core.c +@@ -398,7 +398,7 @@ int usb_handle_packet(USBDevice *dev, USBPacket *p) + * When pipelining is enabled usb-devices must always return async, + * otherwise packets can complete out of order! + */ +- assert(!p->ep->pipeline); ++ assert(!p->ep->pipeline || QTAILQ_EMPTY(&p->ep->queue)); + if (ret != USB_RET_NAK) { + p->result = ret; + usb_packet_set_state(p, USB_PACKET_COMPLETE); +-- +1.7.12.1 + diff --git a/0130-Revert-ehci-don-t-flush-cache-on-doorbell-rings.patch b/0130-Revert-ehci-don-t-flush-cache-on-doorbell-rings.patch new file mode 100644 index 0000000..ae5d4d3 --- /dev/null +++ b/0130-Revert-ehci-don-t-flush-cache-on-doorbell-rings.patch @@ -0,0 +1,124 @@ +From 4547897358a12c0f31d688da9922236984742242 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 29 Aug 2012 10:12:52 +0200 +Subject: [PATCH] Revert "ehci: don't flush cache on doorbell rings." + +This reverts commit 9bc3a3a216e2689bfcdd36c3e079333bbdbf3ba0, which got +added to fix an issue where the real, underlying cause was not stopping +the ep queue on an error. + +Now that the underlying cause is fixed by the "usb: Halt ep queue and +cancel pending packets on a packet error" patch, the "don't flush" fix +is no longer needed. + +Not only is it not needed, it causes us to see cancellations (unlinks) +done by the Linux EHCI driver too late, which in combination with the new +usb-core packet-id generation where qtd addresses are used as ids, causes +duplicate ids for in flight packets. + +Signed-off-by: Hans de Goede +(cherry picked from commit 66f092d25697e11847b61d761c38ddebedaed8d1) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 35 ++++++----------------------------- + 1 file changed, 6 insertions(+), 29 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 9523247..e7c36f4 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -365,7 +365,6 @@ struct EHCIQueue { + uint32_t seen; + uint64_t ts; + int async; +- int revalidate; + + /* cached data from guest - needs to be flushed + * when guest removes an entry (doorbell, handshake sequence) +@@ -805,18 +804,7 @@ static EHCIQueue *ehci_find_queue_by_qh(EHCIState *ehci, uint32_t addr, + return NULL; + } + +-static void ehci_queues_tag_unused_async(EHCIState *ehci) +-{ +- EHCIQueue *q; +- +- QTAILQ_FOREACH(q, &ehci->aqueues, next) { +- if (!q->seen) { +- q->revalidate = 1; +- } +- } +-} +- +-static void ehci_queues_rip_unused(EHCIState *ehci, int async) ++static void ehci_queues_rip_unused(EHCIState *ehci, int async, int flush) + { + EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues; + uint64_t maxage = FRAME_TIMER_NS * ehci->maxframes * 4; +@@ -828,7 +816,7 @@ static void ehci_queues_rip_unused(EHCIState *ehci, int async) + q->ts = ehci->last_run_ns; + continue; + } +- if (ehci->last_run_ns < q->ts + maxage) { ++ if (!flush && ehci->last_run_ns < q->ts + maxage) { + continue; + } + ehci_free_queue(q); +@@ -1684,7 +1672,7 @@ static int ehci_state_waitlisthead(EHCIState *ehci, int async) + ehci_set_usbsts(ehci, USBSTS_REC); + } + +- ehci_queues_rip_unused(ehci, async); ++ ehci_queues_rip_unused(ehci, async, 0); + + /* Find the head of the list (4.9.1.1) */ + for(i = 0; i < MAX_QH; i++) { +@@ -1769,7 +1757,6 @@ static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int async) + EHCIPacket *p; + uint32_t entry, devaddr; + EHCIQueue *q; +- EHCIqh qh; + + entry = ehci_get_fetch_addr(ehci, async); + q = ehci_find_queue_by_qh(ehci, entry, async); +@@ -1787,17 +1774,7 @@ static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int async) + } + + get_dwords(ehci, NLPTR_GET(q->qhaddr), +- (uint32_t *) &qh, sizeof(EHCIqh) >> 2); +- if (q->revalidate && (q->qh.epchar != qh.epchar || +- q->qh.epcap != qh.epcap || +- q->qh.current_qtd != qh.current_qtd)) { +- ehci_free_queue(q); +- q = ehci_alloc_queue(ehci, entry, async); +- q->seen++; +- p = NULL; +- } +- q->qh = qh; +- q->revalidate = 0; ++ (uint32_t *) &q->qh, sizeof(EHCIqh) >> 2); + ehci_trace_qh(q, NLPTR_GET(q->qhaddr), &q->qh); + + devaddr = get_field(q->qh.epchar, QH_EPCHAR_DEVADDR); +@@ -2306,7 +2283,7 @@ static void ehci_advance_async_state(EHCIState *ehci) + */ + if (ehci->usbcmd & USBCMD_IAAD) { + /* Remove all unseen qhs from the async qhs queue */ +- ehci_queues_tag_unused_async(ehci); ++ ehci_queues_rip_unused(ehci, async, 1); + DPRINTF("ASYNC: doorbell request acknowledged\n"); + ehci->usbcmd &= ~USBCMD_IAAD; + ehci_raise_irq(ehci, USBSTS_IAA); +@@ -2359,7 +2336,7 @@ static void ehci_advance_periodic_state(EHCIState *ehci) + ehci_set_fetch_addr(ehci, async,entry); + ehci_set_state(ehci, async, EST_FETCHENTRY); + ehci_advance_state(ehci, async); +- ehci_queues_rip_unused(ehci, async); ++ ehci_queues_rip_unused(ehci, async, 0); + break; + + default: +-- +1.7.12.1 + diff --git a/0131-ehci-Validate-qh-is-not-changed-unexpectedly-by-the-.patch b/0131-ehci-Validate-qh-is-not-changed-unexpectedly-by-the-.patch new file mode 100644 index 0000000..a0b0897 --- /dev/null +++ b/0131-ehci-Validate-qh-is-not-changed-unexpectedly-by-the-.patch @@ -0,0 +1,86 @@ +From 46bfd14f89404e4a0eb93c3d9c5b9745724cee2d Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 29 Aug 2012 10:37:37 +0200 +Subject: [PATCH] ehci: Validate qh is not changed unexpectedly by the guest + +-combine the qh check with the check for devaddr changes +-also ensure that p gets set to NULL when the queue gets cancelled on + devaddr change, which was not done properly before this patch + +Signed-off-by: Hans de Goede +(cherry picked from commit dafe31fc2a8653b535d58f8c7b250c0827b14420) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 39 ++++++++++++++++++++++++++++----------- + 1 file changed, 28 insertions(+), 11 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index e7c36f4..35eb441 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -780,6 +780,14 @@ static void ehci_cancel_queue(EHCIQueue *q) + } while ((p = QTAILQ_FIRST(&q->packets)) != NULL); + } + ++static void ehci_reset_queue(EHCIQueue *q) ++{ ++ trace_usb_ehci_queue_action(q, "reset"); ++ ehci_cancel_queue(q); ++ q->dev = NULL; ++ q->qtdaddr = 0; ++} ++ + static void ehci_free_queue(EHCIQueue *q) + { + EHCIQueueHead *head = q->async ? &q->ehci->aqueues : &q->ehci->pqueues; +@@ -1755,8 +1763,9 @@ out: + static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int async) + { + EHCIPacket *p; +- uint32_t entry, devaddr; ++ uint32_t entry, devaddr, endp; + EHCIQueue *q; ++ EHCIqh qh; + + entry = ehci_get_fetch_addr(ehci, async); + q = ehci_find_queue_by_qh(ehci, entry, async); +@@ -1774,17 +1783,25 @@ static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int async) + } + + get_dwords(ehci, NLPTR_GET(q->qhaddr), +- (uint32_t *) &q->qh, sizeof(EHCIqh) >> 2); +- ehci_trace_qh(q, NLPTR_GET(q->qhaddr), &q->qh); ++ (uint32_t *) &qh, sizeof(EHCIqh) >> 2); ++ ehci_trace_qh(q, NLPTR_GET(q->qhaddr), &qh); ++ ++ /* ++ * The overlay area of the qh should never be changed by the guest, ++ * except when idle, in which case the reset is a nop. ++ */ ++ devaddr = get_field(qh.epchar, QH_EPCHAR_DEVADDR); ++ endp = get_field(qh.epchar, QH_EPCHAR_EP); ++ if ((devaddr != get_field(q->qh.epchar, QH_EPCHAR_DEVADDR)) || ++ (endp != get_field(q->qh.epchar, QH_EPCHAR_EP)) || ++ (memcmp(&qh.current_qtd, &q->qh.current_qtd, ++ 9 * sizeof(uint32_t)) != 0) || ++ (q->dev != NULL && q->dev->addr != devaddr)) { ++ ehci_reset_queue(q); ++ p = NULL; ++ } ++ q->qh = qh; + +- devaddr = get_field(q->qh.epchar, QH_EPCHAR_DEVADDR); +- if (q->dev != NULL && q->dev->addr != devaddr) { +- if (!QTAILQ_EMPTY(&q->packets)) { +- /* should not happen (guest bug) */ +- ehci_cancel_queue(q); +- } +- q->dev = NULL; +- } + if (q->dev == NULL) { + q->dev = ehci_find_device(q->ehci, devaddr); + } +-- +1.7.12.1 + diff --git a/0132-ehci-Update-copyright-headers-to-reflect-recent-work.patch b/0132-ehci-Update-copyright-headers-to-reflect-recent-work.patch new file mode 100644 index 0000000..020cb38 --- /dev/null +++ b/0132-ehci-Update-copyright-headers-to-reflect-recent-work.patch @@ -0,0 +1,35 @@ +From cd7309e7fdd000a9b595ab24e6b03d66100c6fde Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 28 Aug 2012 16:21:12 +0200 +Subject: [PATCH] ehci: Update copyright headers to reflect recent work + +Update copyright headers to reflect all the work Gerd and I have been doing +on the EHCI emulation. + +Signed-off-by: Hans de Goede +(cherry picked from commit 522079dd4461c38b9a88bf31a65ea038c5b2be45) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 35eb441..78a248f 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -2,6 +2,11 @@ + * QEMU USB EHCI Emulation + * + * Copyright(c) 2008 Emutex Ltd. (address@hidden) ++ * Copyright(c) 2011-2012 Red Hat, Inc. ++ * ++ * Red Hat Authors: ++ * Gerd Hoffmann ++ * Hans de Goede + * + * EHCI project was started by Mark Burkley, with contributions by + * Niels de Vos. David S. Ahern continued working on it. Kevin Wolf, +-- +1.7.12.1 + diff --git a/0133-ehci-Properly-cleanup-packets-on-cancel.patch b/0133-ehci-Properly-cleanup-packets-on-cancel.patch new file mode 100644 index 0000000..1e20c4f --- /dev/null +++ b/0133-ehci-Properly-cleanup-packets-on-cancel.patch @@ -0,0 +1,29 @@ +From 35fe185a5455160db638820211bad5aed45a669f Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 30 Aug 2012 15:00:33 +0200 +Subject: [PATCH] ehci: Properly cleanup packets on cancel + +Signed-off-by: Hans de Goede +(cherry picked from commit 0e7953525f52aa6c098dc0c1ce0b4a80ce82da45) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 78a248f..4fe85c8 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -747,6 +747,8 @@ static void ehci_free_packet(EHCIPacket *p) + trace_usb_ehci_packet_action(p->queue, p, "free"); + if (p->async == EHCI_ASYNC_INFLIGHT) { + usb_cancel_packet(&p->packet); ++ usb_packet_unmap(&p->packet, &p->sgl); ++ qemu_sglist_destroy(&p->sgl); + } + QTAILQ_REMOVE(&p->queue->packets, p, next); + usb_packet_cleanup(&p->packet); +-- +1.7.12.1 + diff --git a/0134-ehci-Properly-report-completed-but-not-yet-processed.patch b/0134-ehci-Properly-report-completed-but-not-yet-processed.patch new file mode 100644 index 0000000..e70d469 --- /dev/null +++ b/0134-ehci-Properly-report-completed-but-not-yet-processed.patch @@ -0,0 +1,52 @@ +From c7251f2557d09ce4b8466eeccd0f3264c297c515 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 30 Aug 2012 15:18:24 +0200 +Subject: [PATCH] ehci: Properly report completed but not yet processed + packets to the guest + +Reported packets which have completed before being cancelled as such to the +host. Note that the new code path this patch adds is untested since it I've +been unable to actually trigger the race which needs this code path. + +Signed-off-by: Hans de Goede +(cherry picked from commit 4b63a0df3bda8a2c278e45d9d94d9ba6d5791d8d) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 4fe85c8..0a6c9ef 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -489,6 +489,9 @@ static const char *ehci_mmio_names[] = { + [CONFIGFLAG] = "CONFIGFLAG", + }; + ++static int ehci_state_executing(EHCIQueue *q); ++static int ehci_state_writeback(EHCIQueue *q); ++ + static const char *nr2str(const char **n, size_t len, uint32_t nr) + { + if (nr < len && n[nr] != NULL) { +@@ -750,6 +753,16 @@ static void ehci_free_packet(EHCIPacket *p) + usb_packet_unmap(&p->packet, &p->sgl); + qemu_sglist_destroy(&p->sgl); + } ++ if (p->async == EHCI_ASYNC_FINISHED) { ++ int state = ehci_get_state(p->queue->ehci, p->queue->async); ++ /* This is a normal, but rare condition (cancel racing completion) */ ++ fprintf(stderr, "EHCI: Warning packet completed but not processed\n"); ++ ehci_state_executing(p->queue); ++ ehci_state_writeback(p->queue); ++ ehci_set_state(p->queue->ehci, p->queue->async, state); ++ /* state_writeback recurses into us with async == EHCI_ASYNC_NONE!! */ ++ return; ++ } + QTAILQ_REMOVE(&p->queue->packets, p, next); + usb_packet_cleanup(&p->packet); + g_free(p); +-- +1.7.12.1 + diff --git a/0135-ehci-check-for-EHCI_ASYNC_FINISHED-first-in-ehci_fre.patch b/0135-ehci-check-for-EHCI_ASYNC_FINISHED-first-in-ehci_fre.patch new file mode 100644 index 0000000..f53bbe2 --- /dev/null +++ b/0135-ehci-check-for-EHCI_ASYNC_FINISHED-first-in-ehci_fre.patch @@ -0,0 +1,50 @@ +From b3950fe894e2b26f9dba0888af092cb43d01a466 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 31 Aug 2012 10:31:54 +0200 +Subject: [PATCH] ehci: check for EHCI_ASYNC_FINISHED first in + ehci_free_packet + +Otherwise we'll see the packet free twice in the trace log even though +it actually happens only once. + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 616789cde2a83fad5e634880fd20214f0c984fd5) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 0a6c9ef..23221d0 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -747,12 +747,6 @@ static EHCIPacket *ehci_alloc_packet(EHCIQueue *q) + + static void ehci_free_packet(EHCIPacket *p) + { +- trace_usb_ehci_packet_action(p->queue, p, "free"); +- if (p->async == EHCI_ASYNC_INFLIGHT) { +- usb_cancel_packet(&p->packet); +- usb_packet_unmap(&p->packet, &p->sgl); +- qemu_sglist_destroy(&p->sgl); +- } + if (p->async == EHCI_ASYNC_FINISHED) { + int state = ehci_get_state(p->queue->ehci, p->queue->async); + /* This is a normal, but rare condition (cancel racing completion) */ +@@ -763,6 +757,12 @@ static void ehci_free_packet(EHCIPacket *p) + /* state_writeback recurses into us with async == EHCI_ASYNC_NONE!! */ + return; + } ++ trace_usb_ehci_packet_action(p->queue, p, "free"); ++ if (p->async == EHCI_ASYNC_INFLIGHT) { ++ usb_cancel_packet(&p->packet); ++ usb_packet_unmap(&p->packet, &p->sgl); ++ qemu_sglist_destroy(&p->sgl); ++ } + QTAILQ_REMOVE(&p->queue->packets, p, next); + usb_packet_cleanup(&p->packet); + g_free(p); +-- +1.7.12.1 + diff --git a/0136-ehci-trace-guest-bugs.patch b/0136-ehci-trace-guest-bugs.patch new file mode 100644 index 0000000..52c2f4a --- /dev/null +++ b/0136-ehci-trace-guest-bugs.patch @@ -0,0 +1,109 @@ +From 82b29b635d26ad0f5e14fabdf0956e9b8e7dbbfb Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 31 Aug 2012 10:44:21 +0200 +Subject: [PATCH] ehci: trace guest bugs + +make qemu_queue_{cancel,reset} return the number of packets released, +so the caller can figure whenever there have been active packets even +though there shouldn't have been any. Add tracepoint to log this. + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 5c514681abbb3ae2f61f517c1aa3197f2f3ca93c) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 26 ++++++++++++++++++++------ + trace-events | 1 + + 2 files changed, 21 insertions(+), 6 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 23221d0..4564615 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -716,6 +716,12 @@ static void ehci_trace_sitd(EHCIState *s, target_phys_addr_t addr, + (bool)(sitd->results & SITD_RESULTS_ACTIVE)); + } + ++static void ehci_trace_guest_bug(EHCIState *s, const char *message) ++{ ++ trace_usb_ehci_guest_bug(message); ++ fprintf(stderr, "ehci warning: %s\n", message); ++} ++ + static inline bool ehci_enabled(EHCIState *s) + { + return s->usbcmd & USBCMD_RUNSTOP; +@@ -785,27 +791,33 @@ static EHCIQueue *ehci_alloc_queue(EHCIState *ehci, uint32_t addr, int async) + return q; + } + +-static void ehci_cancel_queue(EHCIQueue *q) ++static int ehci_cancel_queue(EHCIQueue *q) + { + EHCIPacket *p; ++ int packets = 0; + + p = QTAILQ_FIRST(&q->packets); + if (p == NULL) { +- return; ++ return 0; + } + + trace_usb_ehci_queue_action(q, "cancel"); + do { + ehci_free_packet(p); ++ packets++; + } while ((p = QTAILQ_FIRST(&q->packets)) != NULL); ++ return packets; + } + +-static void ehci_reset_queue(EHCIQueue *q) ++static int ehci_reset_queue(EHCIQueue *q) + { ++ int packets; ++ + trace_usb_ehci_queue_action(q, "reset"); +- ehci_cancel_queue(q); ++ packets = ehci_cancel_queue(q); + q->dev = NULL; + q->qtdaddr = 0; ++ return packets; + } + + static void ehci_free_queue(EHCIQueue *q) +@@ -1817,7 +1829,9 @@ static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int async) + (memcmp(&qh.current_qtd, &q->qh.current_qtd, + 9 * sizeof(uint32_t)) != 0) || + (q->dev != NULL && q->dev->addr != devaddr)) { +- ehci_reset_queue(q); ++ if (ehci_reset_queue(q) > 0) { ++ ehci_trace_guest_bug(ehci, "guest updated active QH"); ++ } + p = NULL; + } + q->qh = qh; +@@ -1979,8 +1993,8 @@ static int ehci_state_fetchqtd(EHCIQueue *q) + (!NLPTR_TBIT(p->qtd.next) && (p->qtd.next != qtd.next)) || + (!NLPTR_TBIT(p->qtd.altnext) && (p->qtd.altnext != qtd.altnext)) || + p->qtd.bufptr[0] != qtd.bufptr[0]) { +- /* guest bug: guest updated active QH or qTD underneath us */ + ehci_cancel_queue(q); ++ ehci_trace_guest_bug(q->ehci, "guest updated active QH or qTD"); + p = NULL; + } else { + p->qtd = qtd; +diff --git a/trace-events b/trace-events +index 8fcbc50..5112a47 100644 +--- a/trace-events ++++ b/trace-events +@@ -263,6 +263,7 @@ usb_ehci_data(int rw, uint32_t cpage, uint32_t offset, uint32_t addr, uint32_t l + usb_ehci_queue_action(void *q, const char *action) "q %p: %s" + usb_ehci_packet_action(void *q, void *p, const char *action) "q %p p %p: %s" + usb_ehci_irq(uint32_t level, uint32_t frindex, uint32_t sts, uint32_t mask) "level %d, frindex 0x%04x, sts 0x%x, mask 0x%x" ++usb_ehci_guest_bug(const char *reason) "%s" + + # hw/usb/hcd-uhci.c + usb_uhci_reset(void) "=== RESET ===" +-- +1.7.12.1 + diff --git a/0137-ehci-add-doorbell-trace-events.patch b/0137-ehci-add-doorbell-trace-events.patch new file mode 100644 index 0000000..33fb2a2 --- /dev/null +++ b/0137-ehci-add-doorbell-trace-events.patch @@ -0,0 +1,51 @@ +From bd1c78528cbd45629fe31127f5bde708263d6e17 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 31 Aug 2012 12:41:43 +0200 +Subject: [PATCH] ehci: add doorbell trace events + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 1defcbd1e81d67476b6e4e486bcd4d869162900d) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 3 ++- + trace-events | 2 ++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 4564615..398f5e0 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -1241,6 +1241,7 @@ static void ehci_mem_writel(void *ptr, target_phys_addr_t addr, uint32_t val) + */ + s->async_stepdown = 0; + qemu_bh_schedule(s->async_bh); ++ trace_usb_ehci_doorbell_ring(); + } + + if (((USBCMD_RUNSTOP | USBCMD_PSE | USBCMD_ASE) & val) != +@@ -2335,7 +2336,7 @@ static void ehci_advance_async_state(EHCIState *ehci) + if (ehci->usbcmd & USBCMD_IAAD) { + /* Remove all unseen qhs from the async qhs queue */ + ehci_queues_rip_unused(ehci, async, 1); +- DPRINTF("ASYNC: doorbell request acknowledged\n"); ++ trace_usb_ehci_doorbell_ack(); + ehci->usbcmd &= ~USBCMD_IAAD; + ehci_raise_irq(ehci, USBSTS_IAA); + } +diff --git a/trace-events b/trace-events +index 5112a47..10bc04e 100644 +--- a/trace-events ++++ b/trace-events +@@ -264,6 +264,8 @@ usb_ehci_queue_action(void *q, const char *action) "q %p: %s" + usb_ehci_packet_action(void *q, void *p, const char *action) "q %p p %p: %s" + usb_ehci_irq(uint32_t level, uint32_t frindex, uint32_t sts, uint32_t mask) "level %d, frindex 0x%04x, sts 0x%x, mask 0x%x" + usb_ehci_guest_bug(const char *reason) "%s" ++usb_ehci_doorbell_ring(void) "" ++usb_ehci_doorbell_ack(void) "" + + # hw/usb/hcd-uhci.c + usb_uhci_reset(void) "=== RESET ===" +-- +1.7.12.1 + diff --git a/0138-ehci-Add-some-additional-ehci_trace_guest_bug-calls.patch b/0138-ehci-Add-some-additional-ehci_trace_guest_bug-calls.patch new file mode 100644 index 0000000..8a62ee7 --- /dev/null +++ b/0138-ehci-Add-some-additional-ehci_trace_guest_bug-calls.patch @@ -0,0 +1,88 @@ +From 9dc252544b41a626bbdf436a3e6f229fa0014143 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 10:22:16 +0200 +Subject: [PATCH] ehci: Add some additional ehci_trace_guest_bug() calls + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 3a8ca08e01ea4baafff2a513655008cdd00feebf) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 398f5e0..5a88268 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -820,12 +820,16 @@ static int ehci_reset_queue(EHCIQueue *q) + return packets; + } + +-static void ehci_free_queue(EHCIQueue *q) ++static void ehci_free_queue(EHCIQueue *q, const char *warn) + { + EHCIQueueHead *head = q->async ? &q->ehci->aqueues : &q->ehci->pqueues; ++ int cancelled; + + trace_usb_ehci_queue_action(q, "free"); +- ehci_cancel_queue(q); ++ cancelled = ehci_cancel_queue(q); ++ if (warn && cancelled > 0) { ++ ehci_trace_guest_bug(q->ehci, warn); ++ } + QTAILQ_REMOVE(head, q, next); + g_free(q); + } +@@ -847,6 +851,7 @@ static EHCIQueue *ehci_find_queue_by_qh(EHCIState *ehci, uint32_t addr, + static void ehci_queues_rip_unused(EHCIState *ehci, int async, int flush) + { + EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues; ++ const char *warn = (async && !flush) ? "guest unlinked busy QH" : NULL; + uint64_t maxage = FRAME_TIMER_NS * ehci->maxframes * 4; + EHCIQueue *q, *tmp; + +@@ -859,7 +864,7 @@ static void ehci_queues_rip_unused(EHCIState *ehci, int async, int flush) + if (!flush && ehci->last_run_ns < q->ts + maxage) { + continue; + } +- ehci_free_queue(q); ++ ehci_free_queue(q, warn); + } + } + +@@ -872,17 +877,18 @@ static void ehci_queues_rip_device(EHCIState *ehci, USBDevice *dev, int async) + if (q->dev != dev) { + continue; + } +- ehci_free_queue(q); ++ ehci_free_queue(q, NULL); + } + } + + static void ehci_queues_rip_all(EHCIState *ehci, int async) + { + EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues; ++ const char *warn = async ? "guest stopped busy async schedule" : NULL; + EHCIQueue *q, *tmp; + + QTAILQ_FOREACH_SAFE(q, head, next, tmp) { +- ehci_free_queue(q); ++ ehci_free_queue(q, warn); + } + } + +@@ -1549,7 +1555,8 @@ static int ehci_execute(EHCIPacket *p, const char *action) + + p->tbytes = (p->qtd.token & QTD_TOKEN_TBYTES_MASK) >> QTD_TOKEN_TBYTES_SH; + if (p->tbytes > BUFF_SIZE) { +- fprintf(stderr, "Request for more bytes than allowed\n"); ++ ehci_trace_guest_bug(p->queue->ehci, ++ "guest requested more bytes than allowed"); + return USB_RET_PROCERR; + } + +-- +1.7.12.1 + diff --git a/0139-ehci-Fix-memory-leak-in-handling-of-NAK-ed-packets.patch b/0139-ehci-Fix-memory-leak-in-handling-of-NAK-ed-packets.patch new file mode 100644 index 0000000..b144ab4 --- /dev/null +++ b/0139-ehci-Fix-memory-leak-in-handling-of-NAK-ed-packets.patch @@ -0,0 +1,120 @@ +From 5d369bd44cf2611f47fec52c7402472cd2436b4a Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 11:01:13 +0200 +Subject: [PATCH] ehci: Fix memory leak in handling of NAK-ed packets + +Currently each time we try to execute a NAK-ed packet we redo +ehci_init_transfer, and usb_packet_map, re-allocing (without freeing) the +sg list every time. + +This patch fixes this, it does this by introducing another async state, so +that we also properly cleanup a NAK-ed packet on cancel. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit ef5b234477df80700b128f561f5877a0688a70c8) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 38 +++++++++++++++++++++++++++----------- + 1 file changed, 27 insertions(+), 11 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 5a88268..d87aca8 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -345,6 +345,7 @@ typedef struct EHCIState EHCIState; + + enum async_state { + EHCI_ASYNC_NONE = 0, ++ EHCI_ASYNC_INITIALIZED, + EHCI_ASYNC_INFLIGHT, + EHCI_ASYNC_FINISHED, + }; +@@ -764,6 +765,10 @@ static void ehci_free_packet(EHCIPacket *p) + return; + } + trace_usb_ehci_packet_action(p->queue, p, "free"); ++ if (p->async == EHCI_ASYNC_INITIALIZED) { ++ usb_packet_unmap(&p->packet, &p->sgl); ++ qemu_sglist_destroy(&p->sgl); ++ } + if (p->async == EHCI_ASYNC_INFLIGHT) { + usb_cancel_packet(&p->packet); + usb_packet_unmap(&p->packet, &p->sgl); +@@ -1485,8 +1490,8 @@ static void ehci_execute_complete(EHCIQueue *q) + + assert(p != NULL); + assert(p->qtdaddr == q->qtdaddr); +- assert(p->async != EHCI_ASYNC_INFLIGHT); +- p->async = EHCI_ASYNC_NONE; ++ assert(p->async == EHCI_ASYNC_INITIALIZED || ++ p->async == EHCI_ASYNC_FINISHED); + + DPRINTF("execute_complete: qhaddr 0x%x, next %x, qtdaddr 0x%x, status %d\n", + q->qhaddr, q->qh.next, q->qtdaddr, q->usb_status); +@@ -1531,6 +1536,7 @@ static void ehci_execute_complete(EHCIQueue *q) + ehci_finish_transfer(q, p->usb_status); + usb_packet_unmap(&p->packet, &p->sgl); + qemu_sglist_destroy(&p->sgl); ++ p->async = EHCI_ASYNC_NONE; + + q->qh.token ^= QTD_TOKEN_DTOGGLE; + q->qh.token &= ~QTD_TOKEN_ACTIVE; +@@ -1548,6 +1554,9 @@ static int ehci_execute(EHCIPacket *p, const char *action) + int ret; + int endp; + ++ assert(p->async == EHCI_ASYNC_NONE || ++ p->async == EHCI_ASYNC_INITIALIZED); ++ + if (!(p->qtd.token & QTD_TOKEN_ACTIVE)) { + fprintf(stderr, "Attempting to execute inactive qtd\n"); + return USB_RET_PROCERR; +@@ -1576,15 +1585,18 @@ static int ehci_execute(EHCIPacket *p, const char *action) + break; + } + +- if (ehci_init_transfer(p) != 0) { +- return USB_RET_PROCERR; +- } +- + endp = get_field(p->queue->qh.epchar, QH_EPCHAR_EP); + ep = usb_ep_get(p->queue->dev, p->pid, endp); + +- usb_packet_setup(&p->packet, p->pid, ep, p->qtdaddr); +- usb_packet_map(&p->packet, &p->sgl); ++ if (p->async == EHCI_ASYNC_NONE) { ++ if (ehci_init_transfer(p) != 0) { ++ return USB_RET_PROCERR; ++ } ++ ++ usb_packet_setup(&p->packet, p->pid, ep, p->qtdaddr); ++ usb_packet_map(&p->packet, &p->sgl); ++ p->async = EHCI_ASYNC_INITIALIZED; ++ } + + trace_usb_ehci_packet_action(p->queue, p, action); + ret = usb_handle_packet(p->queue->dev, &p->packet); +@@ -2021,11 +2033,15 @@ static int ehci_state_fetchqtd(EHCIQueue *q) + } else if (p != NULL) { + switch (p->async) { + case EHCI_ASYNC_NONE: ++ /* Should never happen packet should at least be initialized */ ++ assert(0); ++ break; ++ case EHCI_ASYNC_INITIALIZED: + /* Previously nacked packet (likely interrupt ep) */ +- ehci_set_state(q->ehci, q->async, EST_EXECUTE); +- break; ++ ehci_set_state(q->ehci, q->async, EST_EXECUTE); ++ break; + case EHCI_ASYNC_INFLIGHT: +- /* Unfinyshed async handled packet, go horizontal */ ++ /* Unfinished async handled packet, go horizontal */ + ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH); + break; + case EHCI_ASYNC_FINISHED: +-- +1.7.12.1 + diff --git a/0140-ehci-Handle-USB_RET_PROCERR-in-ehci_fill_queue.patch b/0140-ehci-Handle-USB_RET_PROCERR-in-ehci_fill_queue.patch new file mode 100644 index 0000000..74b2853 --- /dev/null +++ b/0140-ehci-Handle-USB_RET_PROCERR-in-ehci_fill_queue.patch @@ -0,0 +1,57 @@ +From 90905dca56de07f7c394ef8cbe480a0d08e0d8cd Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 11:35:58 +0200 +Subject: [PATCH] ehci: Handle USB_RET_PROCERR in ehci_fill_queue + +USB_RET_PROCERR can be triggered by the guest (by for example requesting more +then BUFFSIZE bytes), so don't assert on it. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit eff6dce79bd7ad3c16d75c5e55b5a2a137ba6a60) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index d87aca8..2534394 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -2076,7 +2076,7 @@ static int ehci_state_horizqh(EHCIQueue *q) + return again; + } + +-static void ehci_fill_queue(EHCIPacket *p) ++static int ehci_fill_queue(EHCIPacket *p) + { + EHCIQueue *q = p->queue; + EHCIqtd qtd = p->qtd; +@@ -2100,9 +2100,13 @@ static void ehci_fill_queue(EHCIPacket *p) + p->qtdaddr = qtdaddr; + p->qtd = qtd; + p->usb_status = ehci_execute(p, "queue"); ++ if (p->usb_status == USB_RET_PROCERR) { ++ break; ++ } + assert(p->usb_status == USB_RET_ASYNC); + p->async = EHCI_ASYNC_INFLIGHT; + } ++ return p->usb_status; + } + + static int ehci_state_execute(EHCIQueue *q) +@@ -2144,8 +2148,7 @@ static int ehci_state_execute(EHCIQueue *q) + trace_usb_ehci_packet_action(p->queue, p, "async"); + p->async = EHCI_ASYNC_INFLIGHT; + ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH); +- again = 1; +- ehci_fill_queue(p); ++ again = (ehci_fill_queue(p) == USB_RET_PROCERR) ? -1 : 1; + goto out; + } + +-- +1.7.12.1 + diff --git a/0141-ehci-Correct-a-comment-in-fetchqtd-packet-processing.patch b/0141-ehci-Correct-a-comment-in-fetchqtd-packet-processing.patch new file mode 100644 index 0000000..99c1351 --- /dev/null +++ b/0141-ehci-Correct-a-comment-in-fetchqtd-packet-processing.patch @@ -0,0 +1,37 @@ +From e598e28401bb25d4d639b29f297a549badbf0cfa Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 12:17:48 +0200 +Subject: [PATCH] ehci: Correct a comment in fetchqtd packet processing + +Since my previous comment said "Should never happen", I tried changing the +next line to an assert(0), which did not go well, which as the new comments +explains is logical if you think about it for a moment. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit cf1f81691d1998fa8fe5bfcb8b498fb3723cf3c3) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 2534394..2f3e9c0 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -2045,7 +2045,10 @@ static int ehci_state_fetchqtd(EHCIQueue *q) + ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH); + break; + case EHCI_ASYNC_FINISHED: +- /* Should never happen, as this case is caught by fetchqh */ ++ /* ++ * We get here when advqueue moves to a packet which is already ++ * finished, which can happen with packets queued up by fill_queue ++ */ + ehci_set_state(q->ehci, q->async, EST_EXECUTING); + break; + } +-- +1.7.12.1 + diff --git a/0142-usb-redir-Never-return-USB_RET_NAK-for-async-handled.patch b/0142-usb-redir-Never-return-USB_RET_NAK-for-async-handled.patch new file mode 100644 index 0000000..f2723ac --- /dev/null +++ b/0142-usb-redir-Never-return-USB_RET_NAK-for-async-handled.patch @@ -0,0 +1,47 @@ +From 262c9bb1e59c2cd561dad1cf9d47c50f07af0e0f Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Fri, 17 Aug 2012 17:27:08 +0200 +Subject: [PATCH] usb-redir: Never return USB_RET_NAK for async handled + packets + +USB_RET_NAK is not a valid response for async handled packets (and will +trigger an assert as such). + +Also drop the warning when receiving a status of cancelled for packets not +cancelled by qemu itself, this can happen when a device gets unredirected +by the usbredir-host while transfers are pending. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 181133404f520fab40a3ad40d935d91cf3cf546c) + +Signed-off-by: Michael Roth +--- + hw/usb/redirect.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 10b4fbb..7f3719b 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -1028,11 +1028,14 @@ static int usbredir_handle_status(USBRedirDevice *dev, + case usb_redir_stall: + return USB_RET_STALL; + case usb_redir_cancelled: +- WARNING("returning cancelled packet to HC?\n"); +- return USB_RET_NAK; ++ /* ++ * When the usbredir-host unredirects a device, it will report a status ++ * of cancelled for all pending packets, followed by a disconnect msg. ++ */ ++ return USB_RET_IOERROR; + case usb_redir_inval: + WARNING("got invalid param error from usb-host?\n"); +- return USB_RET_NAK; ++ return USB_RET_IOERROR; + case usb_redir_babble: + return USB_RET_BABBLE; + case usb_redir_ioerror: +-- +1.7.12.1 + diff --git a/0143-usb-redir-Don-t-delay-handling-of-open-events-to-a-b.patch b/0143-usb-redir-Don-t-delay-handling-of-open-events-to-a-b.patch new file mode 100644 index 0000000..33f3ae9 --- /dev/null +++ b/0143-usb-redir-Don-t-delay-handling-of-open-events-to-a-b.patch @@ -0,0 +1,184 @@ +From b89a0cc1ec9dbe30cbe002f12d487a52950da166 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 23 Aug 2012 16:37:19 +0200 +Subject: [PATCH] usb-redir: Don't delay handling of open events to a bottom + half + +There is no need for this, and doing so means that a backend trying to +write immediately after an open event will see qemu_chr_be_can_write +returning 0, which not all backends handle well as there is no wakeup +mechanism to detect when the frontend does become writable. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit ed9873bfbf145c084d039baab08c63b9d67e7bd3) + +Signed-off-by: Michael Roth +--- + hw/usb/redirect.c | 100 +++++++++++++++++++++++++++++------------------------- + 1 file changed, 53 insertions(+), 47 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 7f3719b..5cc3334 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -79,8 +79,8 @@ struct USBRedirDevice { + /* Data passed from chardev the fd_read cb to the usbredirparser read cb */ + const uint8_t *read_buf; + int read_buf_size; +- /* For async handling of open/close */ +- QEMUBH *open_close_bh; ++ /* For async handling of close */ ++ QEMUBH *chardev_close_bh; + /* To delay the usb attach in case of quick chardev close + open */ + QEMUTimer *attach_timer; + int64_t next_attach_time; +@@ -784,18 +784,11 @@ static int usbredir_handle_control(USBDevice *udev, USBPacket *p, + * from within the USBDevice data / control packet callbacks and doing a + * usb_detach from within these callbacks is not a good idea. + * +- * So we use a bh handler to take care of close events. We also handle +- * open events from this callback to make sure that a close directly followed +- * by an open gets handled in the right order. ++ * So we use a bh handler to take care of close events. + */ +-static void usbredir_open_close_bh(void *opaque) ++static void usbredir_chardev_close_bh(void *opaque) + { + USBRedirDevice *dev = opaque; +- uint32_t caps[USB_REDIR_CAPS_SIZE] = { 0, }; +- char version[32]; +- +- strcpy(version, "qemu usb-redir guest "); +- pstrcat(version, sizeof(version), qemu_get_version()); + + usbredir_device_disconnect(dev); + +@@ -803,36 +796,47 @@ static void usbredir_open_close_bh(void *opaque) + usbredirparser_destroy(dev->parser); + dev->parser = NULL; + } ++} + +- if (dev->cs->opened) { +- dev->parser = qemu_oom_check(usbredirparser_create()); +- dev->parser->priv = dev; +- dev->parser->log_func = usbredir_log; +- dev->parser->read_func = usbredir_read; +- dev->parser->write_func = usbredir_write; +- dev->parser->hello_func = usbredir_hello; +- dev->parser->device_connect_func = usbredir_device_connect; +- dev->parser->device_disconnect_func = usbredir_device_disconnect; +- dev->parser->interface_info_func = usbredir_interface_info; +- dev->parser->ep_info_func = usbredir_ep_info; +- dev->parser->configuration_status_func = usbredir_configuration_status; +- dev->parser->alt_setting_status_func = usbredir_alt_setting_status; +- dev->parser->iso_stream_status_func = usbredir_iso_stream_status; +- dev->parser->interrupt_receiving_status_func = +- usbredir_interrupt_receiving_status; +- dev->parser->bulk_streams_status_func = usbredir_bulk_streams_status; +- dev->parser->control_packet_func = usbredir_control_packet; +- dev->parser->bulk_packet_func = usbredir_bulk_packet; +- dev->parser->iso_packet_func = usbredir_iso_packet; +- dev->parser->interrupt_packet_func = usbredir_interrupt_packet; +- dev->read_buf = NULL; +- dev->read_buf_size = 0; ++static void usbredir_chardev_open(USBRedirDevice *dev) ++{ ++ uint32_t caps[USB_REDIR_CAPS_SIZE] = { 0, }; ++ char version[32]; + +- usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version); +- usbredirparser_caps_set_cap(caps, usb_redir_cap_filter); +- usbredirparser_init(dev->parser, version, caps, USB_REDIR_CAPS_SIZE, 0); +- usbredirparser_do_write(dev->parser); +- } ++ /* Make sure any pending closes are handled (no-op if none pending) */ ++ usbredir_chardev_close_bh(dev); ++ qemu_bh_cancel(dev->chardev_close_bh); ++ ++ strcpy(version, "qemu usb-redir guest "); ++ pstrcat(version, sizeof(version), qemu_get_version()); ++ ++ dev->parser = qemu_oom_check(usbredirparser_create()); ++ dev->parser->priv = dev; ++ dev->parser->log_func = usbredir_log; ++ dev->parser->read_func = usbredir_read; ++ dev->parser->write_func = usbredir_write; ++ dev->parser->hello_func = usbredir_hello; ++ dev->parser->device_connect_func = usbredir_device_connect; ++ dev->parser->device_disconnect_func = usbredir_device_disconnect; ++ dev->parser->interface_info_func = usbredir_interface_info; ++ dev->parser->ep_info_func = usbredir_ep_info; ++ dev->parser->configuration_status_func = usbredir_configuration_status; ++ dev->parser->alt_setting_status_func = usbredir_alt_setting_status; ++ dev->parser->iso_stream_status_func = usbredir_iso_stream_status; ++ dev->parser->interrupt_receiving_status_func = ++ usbredir_interrupt_receiving_status; ++ dev->parser->bulk_streams_status_func = usbredir_bulk_streams_status; ++ dev->parser->control_packet_func = usbredir_control_packet; ++ dev->parser->bulk_packet_func = usbredir_bulk_packet; ++ dev->parser->iso_packet_func = usbredir_iso_packet; ++ dev->parser->interrupt_packet_func = usbredir_interrupt_packet; ++ dev->read_buf = NULL; ++ dev->read_buf_size = 0; ++ ++ usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version); ++ usbredirparser_caps_set_cap(caps, usb_redir_cap_filter); ++ usbredirparser_init(dev->parser, version, caps, USB_REDIR_CAPS_SIZE, 0); ++ usbredirparser_do_write(dev->parser); + } + + static void usbredir_do_attach(void *opaque) +@@ -856,13 +860,13 @@ static int usbredir_chardev_can_read(void *opaque) + { + USBRedirDevice *dev = opaque; + +- if (dev->parser) { +- /* usbredir_parser_do_read will consume *all* data we give it */ +- return 1024 * 1024; +- } else { +- /* usbredir_open_close_bh hasn't handled the open event yet */ ++ if (!dev->parser) { ++ WARNING("chardev_can_read called on non open chardev!\n"); + return 0; + } ++ ++ /* usbredir_parser_do_read will consume *all* data we give it */ ++ return 1024 * 1024; + } + + static void usbredir_chardev_read(void *opaque, const uint8_t *buf, int size) +@@ -886,8 +890,10 @@ static void usbredir_chardev_event(void *opaque, int event) + + switch (event) { + case CHR_EVENT_OPENED: ++ usbredir_chardev_open(dev); ++ break; + case CHR_EVENT_CLOSED: +- qemu_bh_schedule(dev->open_close_bh); ++ qemu_bh_schedule(dev->chardev_close_bh); + break; + } + } +@@ -917,7 +923,7 @@ static int usbredir_initfn(USBDevice *udev) + } + } + +- dev->open_close_bh = qemu_bh_new(usbredir_open_close_bh, dev); ++ dev->chardev_close_bh = qemu_bh_new(usbredir_chardev_close_bh, dev); + dev->attach_timer = qemu_new_timer_ms(vm_clock, usbredir_do_attach, dev); + + QTAILQ_INIT(&dev->asyncq); +@@ -957,7 +963,7 @@ static void usbredir_handle_destroy(USBDevice *udev) + qemu_chr_fe_close(dev->cs); + qemu_chr_delete(dev->cs); + /* Note must be done after qemu_chr_close, as that causes a close event */ +- qemu_bh_delete(dev->open_close_bh); ++ qemu_bh_delete(dev->chardev_close_bh); + + qemu_del_timer(dev->attach_timer); + qemu_free_timer(dev->attach_timer); +-- +1.7.12.1 + diff --git a/0144-usb-redir-Get-rid-of-async-struct-get-member.patch b/0144-usb-redir-Get-rid-of-async-struct-get-member.patch new file mode 100644 index 0000000..7ac41ee --- /dev/null +++ b/0144-usb-redir-Get-rid-of-async-struct-get-member.patch @@ -0,0 +1,76 @@ +From a9fd3192a956ed1bce0f945f6b35bf9b162b30c3 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 27 Aug 2012 16:33:08 +0200 +Subject: [PATCH] usb-redir: Get rid of async-struct get member + +This is a preparation patch for completely getting rid of the async-packet +struct in usb-redir, instead relying on the (new) per ep queues in the +qemu usb core. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit cb897117cdedd488f19985c8ec5ea05971103a27) + +Signed-off-by: Michael Roth +--- + hw/usb/redirect.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 5cc3334..2cae8c5 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -1,7 +1,7 @@ + /* + * USB redirector usb-guest + * +- * Copyright (c) 2011 Red Hat, Inc. ++ * Copyright (c) 2011-2012 Red Hat, Inc. + * + * Red Hat Authors: + * Hans de Goede +@@ -99,7 +99,6 @@ struct AsyncURB { + USBRedirDevice *dev; + USBPacket *packet; + uint32_t packet_id; +- int get; + union { + struct usb_redir_control_packet_header control_packet; + struct usb_redir_bulk_packet_header bulk_packet; +@@ -672,7 +671,6 @@ static int usbredir_get_config(USBRedirDevice *dev, USBPacket *p) + + DPRINTF("get config id %u\n", aurb->packet_id); + +- aurb->get = 1; + usbredirparser_send_get_configuration(dev->parser, aurb->packet_id); + usbredirparser_do_write(dev->parser); + return USB_RET_ASYNC; +@@ -721,7 +719,6 @@ static int usbredir_get_interface(USBRedirDevice *dev, USBPacket *p, + DPRINTF("get interface %d id %u\n", interface, aurb->packet_id); + + get_alt.interface = interface; +- aurb->get = 1; + usbredirparser_send_get_alt_setting(dev->parser, aurb->packet_id, + &get_alt); + usbredirparser_do_write(dev->parser); +@@ -1226,7 +1223,7 @@ static void usbredir_configuration_status(void *priv, uint32_t id, + return; + } + if (aurb->packet) { +- if (aurb->get) { ++ if (dev->dev.setup_buf[0] & USB_DIR_IN) { + dev->dev.data_buf[0] = config_status->configuration; + len = 1; + } +@@ -1254,7 +1251,7 @@ static void usbredir_alt_setting_status(void *priv, uint32_t id, + return; + } + if (aurb->packet) { +- if (aurb->get) { ++ if (dev->dev.setup_buf[0] & USB_DIR_IN) { + dev->dev.data_buf[0] = alt_setting_status->alt; + len = 1; + } +-- +1.7.12.1 + diff --git a/0145-usb-redir-Get-rid-of-local-shadow-copy-of-packet-hea.patch b/0145-usb-redir-Get-rid-of-local-shadow-copy-of-packet-hea.patch new file mode 100644 index 0000000..eb581df --- /dev/null +++ b/0145-usb-redir-Get-rid-of-local-shadow-copy-of-packet-hea.patch @@ -0,0 +1,109 @@ +From 40d22426e0e12f26c7bfa5848cf0a9857d52dc99 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 28 Aug 2012 09:05:38 +0200 +Subject: [PATCH] usb-redir: Get rid of local shadow copy of packet headers + +The shadow copy only serves as an extra check (besides the packet-id) to +ensure the packet we get back is a reply to the packet we think it is. + +This check has never triggered in all the time usb-redir is in use now, +and since the verified data in the returned packet-header is not used +otherwise, removing the check does not open any possibilities for the +usbredirhost to confuse us. + +This is a preparation patch for completely getting rid of the async-packet +struct in usb-redir, instead relying on the (new) per ep queues in the +qemu usb core. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 104981d52b63dc3d68f39d4442881c667f44bbb9) + +Signed-off-by: Michael Roth +--- + hw/usb/redirect.c | 27 --------------------------- + 1 file changed, 27 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 2cae8c5..e4ef372 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -99,11 +99,6 @@ struct AsyncURB { + USBRedirDevice *dev; + USBPacket *packet; + uint32_t packet_id; +- union { +- struct usb_redir_control_packet_header control_packet; +- struct usb_redir_bulk_packet_header bulk_packet; +- struct usb_redir_interrupt_packet_header interrupt_packet; +- }; + QTAILQ_ENTRY(AsyncURB)next; + }; + +@@ -500,7 +495,6 @@ static int usbredir_handle_bulk_data(USBRedirDevice *dev, USBPacket *p, + bulk_packet.endpoint = ep; + bulk_packet.length = p->iov.size; + bulk_packet.stream_id = 0; +- aurb->bulk_packet = bulk_packet; + + if (ep & USB_DIR_IN) { + usbredirparser_send_bulk_packet(dev->parser, aurb->packet_id, +@@ -581,7 +575,6 @@ static int usbredir_handle_interrupt_data(USBRedirDevice *dev, + + interrupt_packet.endpoint = ep; + interrupt_packet.length = p->iov.size; +- aurb->interrupt_packet = interrupt_packet; + + usb_packet_copy(p, buf, p->iov.size); + usbredir_log_data(dev, "interrupt data out:", buf, p->iov.size); +@@ -762,7 +755,6 @@ static int usbredir_handle_control(USBDevice *udev, USBPacket *p, + control_packet.value = value; + control_packet.index = index; + control_packet.length = length; +- aurb->control_packet = control_packet; + + if (control_packet.requesttype & USB_DIR_IN) { + usbredirparser_send_control_packet(dev->parser, aurb->packet_id, +@@ -1326,14 +1318,6 @@ static void usbredir_control_packet(void *priv, uint32_t id, + return; + } + +- aurb->control_packet.status = control_packet->status; +- aurb->control_packet.length = control_packet->length; +- if (memcmp(&aurb->control_packet, control_packet, +- sizeof(*control_packet))) { +- ERROR("return control packet mismatch, please report this!\n"); +- len = USB_RET_NAK; +- } +- + if (aurb->packet) { + len = usbredir_handle_status(dev, control_packet->status, len); + if (len > 0) { +@@ -1371,12 +1355,6 @@ static void usbredir_bulk_packet(void *priv, uint32_t id, + return; + } + +- if (aurb->bulk_packet.endpoint != bulk_packet->endpoint || +- aurb->bulk_packet.stream_id != bulk_packet->stream_id) { +- ERROR("return bulk packet mismatch, please report this!\n"); +- len = USB_RET_NAK; +- } +- + if (aurb->packet) { + len = usbredir_handle_status(dev, bulk_packet->status, len); + if (len > 0) { +@@ -1455,11 +1433,6 @@ static void usbredir_interrupt_packet(void *priv, uint32_t id, + return; + } + +- if (aurb->interrupt_packet.endpoint != interrupt_packet->endpoint) { +- ERROR("return int packet mismatch, please report this!\n"); +- len = USB_RET_NAK; +- } +- + if (aurb->packet) { + aurb->packet->result = usbredir_handle_status(dev, + interrupt_packet->status, len); +-- +1.7.12.1 + diff --git a/0146-usb-redir-Get-rid-of-unused-async-struct-dev-member.patch b/0146-usb-redir-Get-rid-of-unused-async-struct-dev-member.patch new file mode 100644 index 0000000..18c7c1f --- /dev/null +++ b/0146-usb-redir-Get-rid-of-unused-async-struct-dev-member.patch @@ -0,0 +1,41 @@ +From 008e2fcbeea527c3aff3078ed5a178d59757bc28 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 28 Aug 2012 09:08:45 +0200 +Subject: [PATCH] usb-redir: Get rid of unused async-struct dev member + +This is a preparation patch for completely getting rid of the async-packet +struct in usb-redir, instead relying on the (new) per ep queues in the +qemu usb core. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 206e7f20fe7b920b362bcc02608680c5d5527f2a) + +Signed-off-by: Michael Roth +--- + hw/usb/redirect.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index e4ef372..6593d50 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -96,7 +96,6 @@ struct USBRedirDevice { + }; + + struct AsyncURB { +- USBRedirDevice *dev; + USBPacket *packet; + uint32_t packet_id; + QTAILQ_ENTRY(AsyncURB)next; +@@ -245,7 +244,6 @@ static int usbredir_write(void *priv, uint8_t *data, int count) + static AsyncURB *async_alloc(USBRedirDevice *dev, USBPacket *p) + { + AsyncURB *aurb = (AsyncURB *) g_malloc0(sizeof(AsyncURB)); +- aurb->dev = dev; + aurb->packet = p; + aurb->packet_id = dev->packet_id; + QTAILQ_INSERT_TAIL(&dev->asyncq, aurb, next); +-- +1.7.12.1 + diff --git a/0147-usb-redir-Move-to-core-packet-id-and-queue-handling.patch b/0147-usb-redir-Move-to-core-packet-id-and-queue-handling.patch new file mode 100644 index 0000000..f32e6cc --- /dev/null +++ b/0147-usb-redir-Move-to-core-packet-id-and-queue-handling.patch @@ -0,0 +1,502 @@ +From 111194442fa38ba6dc26bc695ba0d3b76584663b Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 28 Aug 2012 11:30:13 +0200 +Subject: [PATCH] usb-redir: Move to core packet id and queue handling + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit de550a6afb468ed3b8171019e19b63ae8254886d) + +Signed-off-by: Michael Roth +--- + hw/usb/redirect.c | 226 ++++++++++++++++++++++-------------------------------- + 1 file changed, 92 insertions(+), 134 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 6593d50..fd1f8cc 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -43,7 +43,7 @@ + #define EP2I(ep_address) (((ep_address & 0x80) >> 3) | (ep_address & 0x0f)) + #define I2EP(i) (((i & 0x10) << 3) | (i & 0x0f)) + +-typedef struct AsyncURB AsyncURB; ++typedef struct Cancelled Cancelled; + typedef struct USBRedirDevice USBRedirDevice; + + /* Struct to hold buffered packets (iso or int input packets) */ +@@ -86,8 +86,7 @@ struct USBRedirDevice { + int64_t next_attach_time; + struct usbredirparser *parser; + struct endp_data endpoint[MAX_ENDPOINTS]; +- uint32_t packet_id; +- QTAILQ_HEAD(, AsyncURB) asyncq; ++ QTAILQ_HEAD(, Cancelled) cancelled; + /* Data for device filtering */ + struct usb_redir_device_connect_header device_info; + struct usb_redir_interface_info_header interface_info; +@@ -95,10 +94,9 @@ struct USBRedirDevice { + int filter_rules_count; + }; + +-struct AsyncURB { +- USBPacket *packet; +- uint32_t packet_id; +- QTAILQ_ENTRY(AsyncURB)next; ++struct Cancelled { ++ uint64_t id; ++ QTAILQ_ENTRY(Cancelled)next; + }; + + static void usbredir_hello(void *priv, struct usb_redir_hello_header *h); +@@ -238,57 +236,58 @@ static int usbredir_write(void *priv, uint8_t *data, int count) + } + + /* +- * Async and buffered packets helpers ++ * Cancelled and buffered packets helpers + */ + +-static AsyncURB *async_alloc(USBRedirDevice *dev, USBPacket *p) ++static void usbredir_cancel_packet(USBDevice *udev, USBPacket *p) + { +- AsyncURB *aurb = (AsyncURB *) g_malloc0(sizeof(AsyncURB)); +- aurb->packet = p; +- aurb->packet_id = dev->packet_id; +- QTAILQ_INSERT_TAIL(&dev->asyncq, aurb, next); +- dev->packet_id++; ++ USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); ++ Cancelled *c; + +- return aurb; +-} ++ DPRINTF("cancel packet id %"PRIu64"\n", p->id); + +-static void async_free(USBRedirDevice *dev, AsyncURB *aurb) +-{ +- QTAILQ_REMOVE(&dev->asyncq, aurb, next); +- g_free(aurb); ++ c = g_malloc0(sizeof(Cancelled)); ++ c->id = p->id; ++ QTAILQ_INSERT_TAIL(&dev->cancelled, c, next); ++ ++ usbredirparser_send_cancel_data_packet(dev->parser, p->id); ++ usbredirparser_do_write(dev->parser); + } + +-static AsyncURB *async_find(USBRedirDevice *dev, uint32_t packet_id) ++static int usbredir_is_cancelled(USBRedirDevice *dev, uint64_t id) + { +- AsyncURB *aurb; ++ Cancelled *c; ++ ++ if (!dev->dev.attached) { ++ return 1; /* Treat everything as cancelled after a disconnect */ ++ } + +- QTAILQ_FOREACH(aurb, &dev->asyncq, next) { +- if (aurb->packet_id == packet_id) { +- return aurb; ++ QTAILQ_FOREACH(c, &dev->cancelled, next) { ++ if (c->id == id) { ++ QTAILQ_REMOVE(&dev->cancelled, c, next); ++ g_free(c); ++ return 1; + } + } +- DPRINTF("could not find async urb for packet_id %u\n", packet_id); +- return NULL; ++ return 0; + } + +-static void usbredir_cancel_packet(USBDevice *udev, USBPacket *p) ++static USBPacket *usbredir_find_packet_by_id(USBRedirDevice *dev, ++ uint8_t ep, uint64_t id) + { +- USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); +- AsyncURB *aurb; +- +- QTAILQ_FOREACH(aurb, &dev->asyncq, next) { +- if (p != aurb->packet) { +- continue; +- } ++ USBPacket *p; + +- DPRINTF("async cancel id %u\n", aurb->packet_id); +- usbredirparser_send_cancel_data_packet(dev->parser, aurb->packet_id); +- usbredirparser_do_write(dev->parser); ++ if (usbredir_is_cancelled(dev, id)) { ++ return NULL; ++ } + +- /* Mark it as dead */ +- aurb->packet = NULL; +- break; ++ p = usb_ep_find_packet_by_id(&dev->dev, ++ (ep & USB_DIR_IN) ? USB_TOKEN_IN : USB_TOKEN_OUT, ++ ep & 0x0f, id); ++ if (p == NULL) { ++ ERROR("could not find packet with id %"PRIu64"\n", id); + } ++ return p; + } + + static void bufp_alloc(USBRedirDevice *dev, +@@ -484,24 +483,22 @@ static void usbredir_stop_iso_stream(USBRedirDevice *dev, uint8_t ep) + static int usbredir_handle_bulk_data(USBRedirDevice *dev, USBPacket *p, + uint8_t ep) + { +- AsyncURB *aurb = async_alloc(dev, p); + struct usb_redir_bulk_packet_header bulk_packet; + +- DPRINTF("bulk-out ep %02X len %zd id %u\n", ep, +- p->iov.size, aurb->packet_id); ++ DPRINTF("bulk-out ep %02X len %zd id %"PRIu64"\n", ep, p->iov.size, p->id); + + bulk_packet.endpoint = ep; + bulk_packet.length = p->iov.size; + bulk_packet.stream_id = 0; + + if (ep & USB_DIR_IN) { +- usbredirparser_send_bulk_packet(dev->parser, aurb->packet_id, ++ usbredirparser_send_bulk_packet(dev->parser, p->id, + &bulk_packet, NULL, 0); + } else { + uint8_t buf[p->iov.size]; + usb_packet_copy(p, buf, p->iov.size); + usbredir_log_data(dev, "bulk data out:", buf, p->iov.size); +- usbredirparser_send_bulk_packet(dev->parser, aurb->packet_id, ++ usbredirparser_send_bulk_packet(dev->parser, p->id, + &bulk_packet, buf, p->iov.size); + } + usbredirparser_do_write(dev->parser); +@@ -564,19 +561,18 @@ static int usbredir_handle_interrupt_data(USBRedirDevice *dev, + return len; + } else { + /* Output interrupt endpoint, normal async operation */ +- AsyncURB *aurb = async_alloc(dev, p); + struct usb_redir_interrupt_packet_header interrupt_packet; + uint8_t buf[p->iov.size]; + +- DPRINTF("interrupt-out ep %02X len %zd id %u\n", ep, p->iov.size, +- aurb->packet_id); ++ DPRINTF("interrupt-out ep %02X len %zd id %"PRIu64"\n", ep, ++ p->iov.size, p->id); + + interrupt_packet.endpoint = ep; + interrupt_packet.length = p->iov.size; + + usb_packet_copy(p, buf, p->iov.size); + usbredir_log_data(dev, "interrupt data out:", buf, p->iov.size); +- usbredirparser_send_interrupt_packet(dev->parser, aurb->packet_id, ++ usbredirparser_send_interrupt_packet(dev->parser, p->id, + &interrupt_packet, buf, p->iov.size); + usbredirparser_do_write(dev->parser); + return USB_RET_ASYNC; +@@ -630,10 +626,9 @@ static int usbredir_set_config(USBRedirDevice *dev, USBPacket *p, + int config) + { + struct usb_redir_set_configuration_header set_config; +- AsyncURB *aurb = async_alloc(dev, p); + int i; + +- DPRINTF("set config %d id %u\n", config, aurb->packet_id); ++ DPRINTF("set config %d id %"PRIu64"\n", config, p->id); + + for (i = 0; i < MAX_ENDPOINTS; i++) { + switch (dev->endpoint[i].type) { +@@ -650,19 +645,16 @@ static int usbredir_set_config(USBRedirDevice *dev, USBPacket *p, + } + + set_config.configuration = config; +- usbredirparser_send_set_configuration(dev->parser, aurb->packet_id, +- &set_config); ++ usbredirparser_send_set_configuration(dev->parser, p->id, &set_config); + usbredirparser_do_write(dev->parser); + return USB_RET_ASYNC; + } + + static int usbredir_get_config(USBRedirDevice *dev, USBPacket *p) + { +- AsyncURB *aurb = async_alloc(dev, p); +- +- DPRINTF("get config id %u\n", aurb->packet_id); ++ DPRINTF("get config id %"PRIu64"\n", p->id); + +- usbredirparser_send_get_configuration(dev->parser, aurb->packet_id); ++ usbredirparser_send_get_configuration(dev->parser, p->id); + usbredirparser_do_write(dev->parser); + return USB_RET_ASYNC; + } +@@ -671,11 +663,9 @@ static int usbredir_set_interface(USBRedirDevice *dev, USBPacket *p, + int interface, int alt) + { + struct usb_redir_set_alt_setting_header set_alt; +- AsyncURB *aurb = async_alloc(dev, p); + int i; + +- DPRINTF("set interface %d alt %d id %u\n", interface, alt, +- aurb->packet_id); ++ DPRINTF("set interface %d alt %d id %"PRIu64"\n", interface, alt, p->id); + + for (i = 0; i < MAX_ENDPOINTS; i++) { + if (dev->endpoint[i].interface == interface) { +@@ -695,8 +685,7 @@ static int usbredir_set_interface(USBRedirDevice *dev, USBPacket *p, + + set_alt.interface = interface; + set_alt.alt = alt; +- usbredirparser_send_set_alt_setting(dev->parser, aurb->packet_id, +- &set_alt); ++ usbredirparser_send_set_alt_setting(dev->parser, p->id, &set_alt); + usbredirparser_do_write(dev->parser); + return USB_RET_ASYNC; + } +@@ -705,13 +694,11 @@ static int usbredir_get_interface(USBRedirDevice *dev, USBPacket *p, + int interface) + { + struct usb_redir_get_alt_setting_header get_alt; +- AsyncURB *aurb = async_alloc(dev, p); + +- DPRINTF("get interface %d id %u\n", interface, aurb->packet_id); ++ DPRINTF("get interface %d id %"PRIu64"\n", interface, p->id); + + get_alt.interface = interface; +- usbredirparser_send_get_alt_setting(dev->parser, aurb->packet_id, +- &get_alt); ++ usbredirparser_send_get_alt_setting(dev->parser, p->id, &get_alt); + usbredirparser_do_write(dev->parser); + return USB_RET_ASYNC; + } +@@ -721,7 +708,6 @@ static int usbredir_handle_control(USBDevice *udev, USBPacket *p, + { + USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); + struct usb_redir_control_packet_header control_packet; +- AsyncURB *aurb; + + /* Special cases for certain standard device requests */ + switch (request) { +@@ -739,13 +725,10 @@ static int usbredir_handle_control(USBDevice *udev, USBPacket *p, + return usbredir_get_interface(dev, p, index); + } + +- /* "Normal" ctrl requests */ +- aurb = async_alloc(dev, p); +- +- /* Note request is (bRequestType << 8) | bRequest */ +- DPRINTF("ctrl-out type 0x%x req 0x%x val 0x%x index %d len %d id %u\n", +- request >> 8, request & 0xff, value, index, length, +- aurb->packet_id); ++ /* Normal ctrl requests, note request is (bRequestType << 8) | bRequest */ ++ DPRINTF( ++ "ctrl-out type 0x%x req 0x%x val 0x%x index %d len %d id %"PRIu64"\n", ++ request >> 8, request & 0xff, value, index, length, p->id); + + control_packet.request = request & 0xFF; + control_packet.requesttype = request >> 8; +@@ -755,11 +738,11 @@ static int usbredir_handle_control(USBDevice *udev, USBPacket *p, + control_packet.length = length; + + if (control_packet.requesttype & USB_DIR_IN) { +- usbredirparser_send_control_packet(dev->parser, aurb->packet_id, ++ usbredirparser_send_control_packet(dev->parser, p->id, + &control_packet, NULL, 0); + } else { + usbredir_log_data(dev, "ctrl data out:", data, length); +- usbredirparser_send_control_packet(dev->parser, aurb->packet_id, ++ usbredirparser_send_control_packet(dev->parser, p->id, + &control_packet, data, length); + } + usbredirparser_do_write(dev->parser); +@@ -913,7 +896,7 @@ static int usbredir_initfn(USBDevice *udev) + dev->chardev_close_bh = qemu_bh_new(usbredir_chardev_close_bh, dev); + dev->attach_timer = qemu_new_timer_ms(vm_clock, usbredir_do_attach, dev); + +- QTAILQ_INIT(&dev->asyncq); ++ QTAILQ_INIT(&dev->cancelled); + for (i = 0; i < MAX_ENDPOINTS; i++) { + QTAILQ_INIT(&dev->endpoint[i].bufpq); + } +@@ -932,11 +915,12 @@ static int usbredir_initfn(USBDevice *udev) + + static void usbredir_cleanup_device_queues(USBRedirDevice *dev) + { +- AsyncURB *aurb, *next_aurb; ++ Cancelled *c, *next_c; + int i; + +- QTAILQ_FOREACH_SAFE(aurb, &dev->asyncq, next, next_aurb) { +- async_free(dev, aurb); ++ QTAILQ_FOREACH_SAFE(c, &dev->cancelled, next, next_c) { ++ QTAILQ_REMOVE(&dev->cancelled, c, next); ++ g_free(c); + } + for (i = 0; i < MAX_ENDPOINTS; i++) { + usbredir_free_bufpq(dev, I2EP(i)); +@@ -1202,33 +1186,28 @@ static void usbredir_configuration_status(void *priv, uint32_t id, + struct usb_redir_configuration_status_header *config_status) + { + USBRedirDevice *dev = priv; +- AsyncURB *aurb; ++ USBPacket *p; + int len = 0; + + DPRINTF("set config status %d config %d id %u\n", config_status->status, + config_status->configuration, id); + +- aurb = async_find(dev, id); +- if (!aurb) { +- return; +- } +- if (aurb->packet) { ++ p = usbredir_find_packet_by_id(dev, 0, id); ++ if (p) { + if (dev->dev.setup_buf[0] & USB_DIR_IN) { + dev->dev.data_buf[0] = config_status->configuration; + len = 1; + } +- aurb->packet->result = +- usbredir_handle_status(dev, config_status->status, len); +- usb_generic_async_ctrl_complete(&dev->dev, aurb->packet); ++ p->result = usbredir_handle_status(dev, config_status->status, len); ++ usb_generic_async_ctrl_complete(&dev->dev, p); + } +- async_free(dev, aurb); + } + + static void usbredir_alt_setting_status(void *priv, uint32_t id, + struct usb_redir_alt_setting_status_header *alt_setting_status) + { + USBRedirDevice *dev = priv; +- AsyncURB *aurb; ++ USBPacket *p; + int len = 0; + + DPRINTF("alt status %d intf %d alt %d id: %u\n", +@@ -1236,20 +1215,16 @@ static void usbredir_alt_setting_status(void *priv, uint32_t id, + alt_setting_status->interface, + alt_setting_status->alt, id); + +- aurb = async_find(dev, id); +- if (!aurb) { +- return; +- } +- if (aurb->packet) { ++ p = usbredir_find_packet_by_id(dev, 0, id); ++ if (p) { + if (dev->dev.setup_buf[0] & USB_DIR_IN) { + dev->dev.data_buf[0] = alt_setting_status->alt; + len = 1; + } +- aurb->packet->result = ++ p->result = + usbredir_handle_status(dev, alt_setting_status->status, len); +- usb_generic_async_ctrl_complete(&dev->dev, aurb->packet); ++ usb_generic_async_ctrl_complete(&dev->dev, p); + } +- async_free(dev, aurb); + } + + static void usbredir_iso_stream_status(void *priv, uint32_t id, +@@ -1304,19 +1279,14 @@ static void usbredir_control_packet(void *priv, uint32_t id, + uint8_t *data, int data_len) + { + USBRedirDevice *dev = priv; ++ USBPacket *p; + int len = control_packet->length; +- AsyncURB *aurb; + + DPRINTF("ctrl-in status %d len %d id %u\n", control_packet->status, + len, id); + +- aurb = async_find(dev, id); +- if (!aurb) { +- free(data); +- return; +- } +- +- if (aurb->packet) { ++ p = usbredir_find_packet_by_id(dev, 0, id); ++ if (p) { + len = usbredir_handle_status(dev, control_packet->status, len); + if (len > 0) { + usbredir_log_data(dev, "ctrl data in:", data, data_len); +@@ -1328,10 +1298,9 @@ static void usbredir_control_packet(void *priv, uint32_t id, + len = USB_RET_STALL; + } + } +- aurb->packet->result = len; +- usb_generic_async_ctrl_complete(&dev->dev, aurb->packet); ++ p->result = len; ++ usb_generic_async_ctrl_complete(&dev->dev, p); + } +- async_free(dev, aurb); + free(data); + } + +@@ -1342,33 +1311,27 @@ static void usbredir_bulk_packet(void *priv, uint32_t id, + USBRedirDevice *dev = priv; + uint8_t ep = bulk_packet->endpoint; + int len = bulk_packet->length; +- AsyncURB *aurb; ++ USBPacket *p; + + DPRINTF("bulk-in status %d ep %02X len %d id %u\n", bulk_packet->status, + ep, len, id); + +- aurb = async_find(dev, id); +- if (!aurb) { +- free(data); +- return; +- } +- +- if (aurb->packet) { ++ p = usbredir_find_packet_by_id(dev, ep, id); ++ if (p) { + len = usbredir_handle_status(dev, bulk_packet->status, len); + if (len > 0) { + usbredir_log_data(dev, "bulk data in:", data, data_len); +- if (data_len <= aurb->packet->iov.size) { +- usb_packet_copy(aurb->packet, data, data_len); ++ if (data_len <= p->iov.size) { ++ usb_packet_copy(p, data, data_len); + } else { + ERROR("bulk buffer too small (%d > %zd)\n", data_len, +- aurb->packet->iov.size); ++ p->iov.size); + len = USB_RET_STALL; + } + } +- aurb->packet->result = len; +- usb_packet_complete(&dev->dev, aurb->packet); ++ p->result = len; ++ usb_packet_complete(&dev->dev, p); + } +- async_free(dev, aurb); + free(data); + } + +@@ -1426,17 +1389,12 @@ static void usbredir_interrupt_packet(void *priv, uint32_t id, + } else { + int len = interrupt_packet->length; + +- AsyncURB *aurb = async_find(dev, id); +- if (!aurb) { +- return; +- } +- +- if (aurb->packet) { +- aurb->packet->result = usbredir_handle_status(dev, ++ USBPacket *p = usbredir_find_packet_by_id(dev, ep, id); ++ if (p) { ++ p->result = usbredir_handle_status(dev, + interrupt_packet->status, len); +- usb_packet_complete(&dev->dev, aurb->packet); ++ usb_packet_complete(&dev->dev, p); + } +- async_free(dev, aurb); + } + } + +-- +1.7.12.1 + diff --git a/0148-usb-redir-Return-babble-when-getting-more-bulk-data-.patch b/0148-usb-redir-Return-babble-when-getting-more-bulk-data-.patch new file mode 100644 index 0000000..4c4e98b --- /dev/null +++ b/0148-usb-redir-Return-babble-when-getting-more-bulk-data-.patch @@ -0,0 +1,37 @@ +From 138e9d997e487dafbf686e0e1eba44a8b26dcaf7 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 28 Aug 2012 11:33:47 +0200 +Subject: [PATCH] usb-redir: Return babble when getting more bulk data then + requested + +Babble is the appropriate error in this case (rather then signalling a stall). + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 2979a36183a3902cd75665e7c6bbc8668668fd17) + +Signed-off-by: Michael Roth +--- + hw/usb/redirect.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index fd1f8cc..ee75217 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -1324,9 +1324,9 @@ static void usbredir_bulk_packet(void *priv, uint32_t id, + if (data_len <= p->iov.size) { + usb_packet_copy(p, data, data_len); + } else { +- ERROR("bulk buffer too small (%d > %zd)\n", data_len, +- p->iov.size); +- len = USB_RET_STALL; ++ ERROR("bulk got more data then requested (%d > %zd)\n", ++ data_len, p->iov.size); ++ len = USB_RET_BABBLE; + } + } + p->result = len; +-- +1.7.12.1 + diff --git a/0149-Better-name-usb-braille-device.patch b/0149-Better-name-usb-braille-device.patch new file mode 100644 index 0000000..00c8599 --- /dev/null +++ b/0149-Better-name-usb-braille-device.patch @@ -0,0 +1,33 @@ +From 23d25cd58aa7da678cad0ad98d52efe37d0be4e6 Mon Sep 17 00:00:00 2001 +From: Samuel Thibault +Date: Thu, 23 Aug 2012 09:59:27 +0200 +Subject: [PATCH] Better name usb braille device + +Windows users need to know that they have to use the Baum driver to make +the qemu braille device work. + +Signed-off-by: Samuel Thibault +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 2964cd9bfa5100e433471d3e3fedcc9d62891894) + +Signed-off-by: Michael Roth +--- + hw/usb/dev-serial.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c +index 8aa6552..69b6e48 100644 +--- a/hw/usb/dev-serial.c ++++ b/hw/usb/dev-serial.c +@@ -113,7 +113,7 @@ enum { + static const USBDescStrings desc_strings = { + [STR_MANUFACTURER] = "QEMU", + [STR_PRODUCT_SERIAL] = "QEMU USB SERIAL", +- [STR_PRODUCT_BRAILLE] = "QEMU USB BRAILLE", ++ [STR_PRODUCT_BRAILLE] = "QEMU USB BAUM BRAILLE", + [STR_SERIALNUMBER] = "1", + }; + +-- +1.7.12.1 + diff --git a/0150-usb-audio-fix-usb-version.patch b/0150-usb-audio-fix-usb-version.patch new file mode 100644 index 0000000..ceeb70d --- /dev/null +++ b/0150-usb-audio-fix-usb-version.patch @@ -0,0 +1,32 @@ +From 3f8a570db1637c0e7e2dd7a3bd997c92c69efc65 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 28 Aug 2012 16:43:34 +0200 +Subject: [PATCH] usb-audio: fix usb version + +usb-audio is a full speed (1.1) device, +but bcdUSB claims it is usb 2.0. Fix it. + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 2bbd086c41a00dc4384727ec895a94890c688eb5) + +Signed-off-by: Michael Roth +--- + hw/usb/dev-audio.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/usb/dev-audio.c b/hw/usb/dev-audio.c +index 79b75fb..2594c78 100644 +--- a/hw/usb/dev-audio.c ++++ b/hw/usb/dev-audio.c +@@ -217,7 +217,7 @@ static const USBDescIface desc_iface[] = { + }; + + static const USBDescDevice desc_device = { +- .bcdUSB = 0x0200, ++ .bcdUSB = 0x0100, + .bMaxPacketSize0 = 64, + .bNumConfigurations = 1, + .confs = (USBDescConfig[]) { +-- +1.7.12.1 + diff --git a/0151-xhci-rip-out-background-transfer-code.patch b/0151-xhci-rip-out-background-transfer-code.patch new file mode 100644 index 0000000..e728029 --- /dev/null +++ b/0151-xhci-rip-out-background-transfer-code.patch @@ -0,0 +1,327 @@ +From f9416f401c9eac3f69b4705a999c6ea1ff457016 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 17 Aug 2012 14:05:21 +0200 +Subject: [PATCH] xhci: rip out background transfer code + +original xhci code (the one which used libusb directly) used to use +'background transfers' for iso streams. In upstream qemu the iso +stream buffering is handled by usb-host & usb-redir, so we will +never ever need this. It has been left in as reference, but is dead +code anyway. Rip it out. + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 331e9406f152b6bae6859a153d36e5076c58901d) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-xhci.c | 223 +----------------------------------------------------- + 1 file changed, 4 insertions(+), 219 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 3eb27fa..c0a2476 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -45,8 +45,6 @@ + #define MAXPORTS (USB2_PORTS+USB3_PORTS) + + #define TD_QUEUE 24 +-#define BG_XFERS 8 +-#define BG_PKTS 8 + + /* Very pessimistic, let's hope it's enough for all cases */ + #define EV_QUEUE (((3*TD_QUEUE)+16)*MAXSLOTS) +@@ -311,13 +309,11 @@ typedef struct XHCITransfer { + bool running_retry; + bool cancelled; + bool complete; +- bool backgrounded; + unsigned int iso_pkts; + unsigned int slotid; + unsigned int epid; + bool in_xfer; + bool iso_xfer; +- bool bg_xfer; + + unsigned int trb_count; + unsigned int trb_alloced; +@@ -340,14 +336,9 @@ typedef struct XHCIEPContext { + unsigned int comp_xfer; + XHCITransfer transfers[TD_QUEUE]; + XHCITransfer *retry; +- bool bg_running; +- bool bg_updating; +- unsigned int next_bg; +- XHCITransfer bg_transfers[BG_XFERS]; + EPType type; + dma_addr_t pctx; + unsigned int max_psize; +- bool has_bg; + uint32_t state; + } XHCIEPContext; + +@@ -866,10 +857,6 @@ static TRBCCode xhci_enable_ep(XHCIState *xhci, unsigned int slotid, + epctx->pctx = pctx; + epctx->max_psize = ctx[1]>>16; + epctx->max_psize *= 1+((ctx[1]>>8)&0xff); +- epctx->has_bg = false; +- if (epctx->type == ET_ISO_IN) { +- epctx->has_bg = true; +- } + DPRINTF("xhci: endpoint %d.%d max transaction (burst) size is %d\n", + epid/2, epid%2, epctx->max_psize); + for (i = 0; i < ARRAY_SIZE(epctx->transfers); i++) { +@@ -916,9 +903,6 @@ static int xhci_ep_nuke_xfers(XHCIState *xhci, unsigned int slotid, + t->running_retry = 0; + epctx->retry = NULL; + } +- if (t->backgrounded) { +- t->backgrounded = 0; +- } + if (t->trbs) { + g_free(t->trbs); + } +@@ -932,25 +916,6 @@ static int xhci_ep_nuke_xfers(XHCIState *xhci, unsigned int slotid, + t->data_length = t->data_alloced = 0; + xferi = (xferi + 1) % TD_QUEUE; + } +- if (epctx->has_bg) { +- xferi = epctx->next_bg; +- for (i = 0; i < BG_XFERS; i++) { +- XHCITransfer *t = &epctx->bg_transfers[xferi]; +- if (t->running_async) { +- usb_cancel_packet(&t->packet); +- t->running_async = 0; +- t->cancelled = 1; +- DPRINTF("xhci: cancelling bg transfer %d, waiting for it to complete...\n", i); +- killed++; +- } +- if (t->data) { +- g_free(t->data); +- } +- +- t->data = NULL; +- xferi = (xferi + 1) % BG_XFERS; +- } +- } + return killed; + } + +@@ -1231,160 +1196,6 @@ static void xhci_stall_ep(XHCITransfer *xfer) + static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, + XHCIEPContext *epctx); + +-static void xhci_bg_update(XHCIState *xhci, XHCIEPContext *epctx) +-{ +- if (epctx->bg_updating) { +- return; +- } +- DPRINTF("xhci_bg_update(%p, %p)\n", xhci, epctx); +- assert(epctx->has_bg); +- DPRINTF("xhci: fg=%d bg=%d\n", epctx->comp_xfer, epctx->next_bg); +- epctx->bg_updating = 1; +- while (epctx->transfers[epctx->comp_xfer].backgrounded && +- epctx->bg_transfers[epctx->next_bg].complete) { +- XHCITransfer *fg = &epctx->transfers[epctx->comp_xfer]; +- XHCITransfer *bg = &epctx->bg_transfers[epctx->next_bg]; +-#if 0 +- DPRINTF("xhci: completing fg %d from bg %d.%d (stat: %d)\n", +- epctx->comp_xfer, epctx->next_bg, bg->cur_pkt, +- bg->usbxfer->iso_packet_desc[bg->cur_pkt].status +- ); +-#endif +- assert(epctx->type == ET_ISO_IN); +- assert(bg->iso_xfer); +- assert(bg->in_xfer); +- uint8_t *p = bg->data + bg->cur_pkt * bg->pktsize; +-#if 0 +- int len = bg->usbxfer->iso_packet_desc[bg->cur_pkt].actual_length; +- fg->status = libusb_to_ccode(bg->usbxfer->iso_packet_desc[bg->cur_pkt].status); +-#else +- int len = 0; +- FIXME(); +-#endif +- fg->complete = 1; +- fg->backgrounded = 0; +- +- if (fg->status == CC_STALL_ERROR) { +- xhci_stall_ep(fg); +- } +- +- xhci_xfer_data(fg, p, len, 1, 0, 1); +- +- epctx->comp_xfer++; +- if (epctx->comp_xfer == TD_QUEUE) { +- epctx->comp_xfer = 0; +- } +- DPRINTF("next fg xfer: %d\n", epctx->comp_xfer); +- bg->cur_pkt++; +- if (bg->cur_pkt == bg->pkts) { +- bg->complete = 0; +- if (xhci_submit(xhci, bg, epctx) < 0) { +- fprintf(stderr, "xhci: bg resubmit failed\n"); +- } +- epctx->next_bg++; +- if (epctx->next_bg == BG_XFERS) { +- epctx->next_bg = 0; +- } +- DPRINTF("next bg xfer: %d\n", epctx->next_bg); +- +- xhci_kick_ep(xhci, fg->slotid, fg->epid); +- } +- } +- epctx->bg_updating = 0; +-} +- +-#if 0 +-static void xhci_xfer_cb(struct libusb_transfer *transfer) +-{ +- XHCIState *xhci; +- XHCITransfer *xfer; +- +- xfer = (XHCITransfer *)transfer->user_data; +- xhci = xfer->xhci; +- +- DPRINTF("xhci_xfer_cb(slot=%d, ep=%d, status=%d)\n", xfer->slotid, +- xfer->epid, transfer->status); +- +- assert(xfer->slotid >= 1 && xfer->slotid <= MAXSLOTS); +- assert(xfer->epid >= 1 && xfer->epid <= 31); +- +- if (xfer->cancelled) { +- DPRINTF("xhci: transfer cancelled, not reporting anything\n"); +- xfer->running = 0; +- return; +- } +- +- XHCIEPContext *epctx; +- XHCISlot *slot; +- slot = &xhci->slots[xfer->slotid-1]; +- assert(slot->eps[xfer->epid-1]); +- epctx = slot->eps[xfer->epid-1]; +- +- if (xfer->bg_xfer) { +- DPRINTF("xhci: background transfer, updating\n"); +- xfer->complete = 1; +- xfer->running = 0; +- xhci_bg_update(xhci, epctx); +- return; +- } +- +- if (xfer->iso_xfer) { +- transfer->status = transfer->iso_packet_desc[0].status; +- transfer->actual_length = transfer->iso_packet_desc[0].actual_length; +- } +- +- xfer->status = libusb_to_ccode(transfer->status); +- +- xfer->complete = 1; +- xfer->running = 0; +- +- if (transfer->status == LIBUSB_TRANSFER_STALL) +- xhci_stall_ep(xhci, epctx, xfer); +- +- DPRINTF("xhci: transfer actual length = %d\n", transfer->actual_length); +- +- if (xfer->in_xfer) { +- if (xfer->epid == 1) { +- xhci_xfer_data(xhci, xfer, xfer->data + 8, +- transfer->actual_length, 1, 0, 1); +- } else { +- xhci_xfer_data(xhci, xfer, xfer->data, +- transfer->actual_length, 1, 0, 1); +- } +- } else { +- xhci_xfer_data(xhci, xfer, NULL, transfer->actual_length, 0, 0, 1); +- } +- +- xhci_kick_ep(xhci, xfer->slotid, xfer->epid); +-} +- +-static int xhci_hle_control(XHCIState *xhci, XHCITransfer *xfer, +- uint8_t bmRequestType, uint8_t bRequest, +- uint16_t wValue, uint16_t wIndex, uint16_t wLength) +-{ +- uint16_t type_req = (bmRequestType << 8) | bRequest; +- +- switch (type_req) { +- case 0x0000 | USB_REQ_SET_CONFIGURATION: +- DPRINTF("xhci: HLE switch configuration\n"); +- return xhci_switch_config(xhci, xfer->slotid, wValue) == 0; +- case 0x0100 | USB_REQ_SET_INTERFACE: +- DPRINTF("xhci: HLE set interface altsetting\n"); +- return xhci_set_iface_alt(xhci, xfer->slotid, wIndex, wValue) == 0; +- case 0x0200 | USB_REQ_CLEAR_FEATURE: +- if (wValue == 0) { // endpoint halt +- DPRINTF("xhci: HLE clear halt\n"); +- return xhci_clear_halt(xhci, xfer->slotid, wIndex); +- } +- case 0x0000 | USB_REQ_SET_ADDRESS: +- fprintf(stderr, "xhci: warn: illegal SET_ADDRESS request\n"); +- return 0; +- default: +- return 0; +- } +-} +-#endif +- + static int xhci_setup_packet(XHCITransfer *xfer, USBDevice *dev) + { + USBEndpoint *ep; +@@ -1559,9 +1370,7 @@ static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx + xfer->data_alloced = xfer->data_length; + } + if (epctx->type == ET_ISO_IN || epctx->type == ET_ISO_OUT) { +- if (!xfer->bg_xfer) { +- xfer->pkts = 1; +- } ++ xfer->pkts = 1; + } else { + xfer->pkts = 0; + } +@@ -1620,32 +1429,8 @@ static int xhci_fire_transfer(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext + + trace_usb_xhci_xfer_start(xfer, xfer->slotid, xfer->epid, length); + +- if (!epctx->has_bg) { +- xfer->data_length = length; +- xfer->backgrounded = 0; +- return xhci_submit(xhci, xfer, epctx); +- } else { +- if (!epctx->bg_running) { +- for (i = 0; i < BG_XFERS; i++) { +- XHCITransfer *t = &epctx->bg_transfers[i]; +- t->xhci = xhci; +- t->epid = xfer->epid; +- t->slotid = xfer->slotid; +- t->pkts = BG_PKTS; +- t->pktsize = epctx->max_psize; +- t->data_length = t->pkts * t->pktsize; +- t->bg_xfer = 1; +- if (xhci_submit(xhci, t, epctx) < 0) { +- fprintf(stderr, "xhci: bg submit failed\n"); +- return -1; +- } +- } +- epctx->bg_running = 1; +- } +- xfer->backgrounded = 1; +- xhci_bg_update(xhci, epctx); +- return 0; +- } ++ xfer->data_length = length; ++ return xhci_submit(xhci, xfer, epctx); + } + + static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid) +@@ -1695,7 +1480,7 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid + + while (1) { + XHCITransfer *xfer = &epctx->transfers[epctx->next_xfer]; +- if (xfer->running_async || xfer->running_retry || xfer->backgrounded) { ++ if (xfer->running_async || xfer->running_retry) { + break; + } + length = xhci_ring_chain_length(xhci, &epctx->ring); +-- +1.7.12.1 + diff --git a/0152-xhci-drop-buffering.patch b/0152-xhci-drop-buffering.patch new file mode 100644 index 0000000..af60c86 --- /dev/null +++ b/0152-xhci-drop-buffering.patch @@ -0,0 +1,386 @@ +From 985807ab66338c6a9cab8d68a2b52b0cff0423ee Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 17 Aug 2012 11:04:36 +0200 +Subject: [PATCH] xhci: drop buffering + +This patch splits the xhci_xfer_data function into three. +The xhci_xfer_data function used to do does two things: + + (1) copy transfer data between guest memory and a temporary buffer. + (2) report transfer results to the guest using events. + +Now we three functions to handle this: + + (1) xhci_xfer_map creates a scatter list for the transfer and + uses that (instead of the temporary buffer) to build a + USBPacket. + (2) xhci_xfer_unmap undoes the mapping. + (3) xhci_xfer_report sends out events. + +The patch also fixes reporting of transaction errors which must be +reported unconditinally, not only in case the guest asks for it +using the ISP flag. + +[ v2: fix warning ] + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit d5a15814b413869667b2a3215772986885be574a) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-xhci.c | 185 +++++++++++++++++++++--------------------------------- + trace-events | 2 +- + 2 files changed, 72 insertions(+), 115 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index c0a2476..446d692 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -305,6 +305,7 @@ typedef struct XHCIState XHCIState; + typedef struct XHCITransfer { + XHCIState *xhci; + USBPacket packet; ++ QEMUSGList sgl; + bool running_async; + bool running_retry; + bool cancelled; +@@ -319,10 +320,6 @@ typedef struct XHCITransfer { + unsigned int trb_alloced; + XHCITRB *trbs; + +- unsigned int data_length; +- unsigned int data_alloced; +- uint8_t *data; +- + TRBCCode status; + + unsigned int pkts; +@@ -906,14 +903,9 @@ static int xhci_ep_nuke_xfers(XHCIState *xhci, unsigned int slotid, + if (t->trbs) { + g_free(t->trbs); + } +- if (t->data) { +- g_free(t->data); +- } + + t->trbs = NULL; +- t->data = NULL; + t->trb_count = t->trb_alloced = 0; +- t->data_length = t->data_alloced = 0; + xferi = (xferi + 1) % TD_QUEUE; + } + return killed; +@@ -1072,24 +1064,13 @@ static TRBCCode xhci_set_ep_dequeue(XHCIState *xhci, unsigned int slotid, + return CC_SUCCESS; + } + +-static int xhci_xfer_data(XHCITransfer *xfer, uint8_t *data, +- unsigned int length, bool in_xfer, bool out_xfer, +- bool report) ++static int xhci_xfer_map(XHCITransfer *xfer) + { +- int i; +- uint32_t edtla = 0; +- unsigned int transferred = 0; +- unsigned int left = length; +- bool reported = 0; +- bool shortpkt = 0; +- XHCIEvent event = {ER_TRANSFER, CC_SUCCESS}; ++ int in_xfer = (xfer->packet.pid == USB_TOKEN_IN); + XHCIState *xhci = xfer->xhci; ++ int i; + +- DPRINTF("xhci_xfer_data(len=%d, in_xfer=%d, out_xfer=%d, report=%d)\n", +- length, in_xfer, out_xfer, report); +- +- assert(!(in_xfer && out_xfer)); +- ++ pci_dma_sglist_init(&xfer->sgl, &xhci->pci_dev, xfer->trb_count); + for (i = 0; i < xfer->trb_count; i++) { + XHCITRB *trb = &xfer->trbs[i]; + dma_addr_t addr; +@@ -1099,54 +1080,70 @@ static int xhci_xfer_data(XHCITransfer *xfer, uint8_t *data, + case TR_DATA: + if ((!(trb->control & TRB_TR_DIR)) != (!in_xfer)) { + fprintf(stderr, "xhci: data direction mismatch for TR_DATA\n"); +- xhci_die(xhci); +- return transferred; ++ goto err; + } + /* fallthrough */ + case TR_NORMAL: + case TR_ISOCH: + addr = xhci_mask64(trb->parameter); + chunk = trb->status & 0x1ffff; ++ if (trb->control & TRB_TR_IDT) { ++ if (chunk > 8 || in_xfer) { ++ fprintf(stderr, "xhci: invalid immediate data TRB\n"); ++ goto err; ++ } ++ qemu_sglist_add(&xfer->sgl, trb->addr, chunk); ++ } else { ++ qemu_sglist_add(&xfer->sgl, addr, chunk); ++ } ++ break; ++ } ++ } ++ ++ usb_packet_map(&xfer->packet, &xfer->sgl); ++ return 0; ++ ++err: ++ qemu_sglist_destroy(&xfer->sgl); ++ xhci_die(xhci); ++ return -1; ++} ++ ++static void xhci_xfer_unmap(XHCITransfer *xfer) ++{ ++ usb_packet_unmap(&xfer->packet, &xfer->sgl); ++ qemu_sglist_destroy(&xfer->sgl); ++} ++ ++static void xhci_xfer_report(XHCITransfer *xfer) ++{ ++ uint32_t edtla = 0; ++ unsigned int left; ++ bool reported = 0; ++ bool shortpkt = 0; ++ XHCIEvent event = {ER_TRANSFER, CC_SUCCESS}; ++ XHCIState *xhci = xfer->xhci; ++ int i; ++ ++ left = xfer->packet.result < 0 ? 0 : xfer->packet.result; ++ ++ for (i = 0; i < xfer->trb_count; i++) { ++ XHCITRB *trb = &xfer->trbs[i]; ++ unsigned int chunk = 0; ++ ++ switch (TRB_TYPE(*trb)) { ++ case TR_DATA: ++ case TR_NORMAL: ++ case TR_ISOCH: ++ chunk = trb->status & 0x1ffff; + if (chunk > left) { + chunk = left; +- shortpkt = 1; +- } +- if (in_xfer || out_xfer) { +- if (trb->control & TRB_TR_IDT) { +- uint64_t idata; +- if (chunk > 8 || in_xfer) { +- fprintf(stderr, "xhci: invalid immediate data TRB\n"); +- xhci_die(xhci); +- return transferred; +- } +- idata = le64_to_cpu(trb->parameter); +- memcpy(data, &idata, chunk); +- } else { +- DPRINTF("xhci_xfer_data: r/w(%d) %d bytes at " +- DMA_ADDR_FMT "\n", in_xfer, chunk, addr); +- if (in_xfer) { +- pci_dma_write(&xhci->pci_dev, addr, data, chunk); +- } else { +- pci_dma_read(&xhci->pci_dev, addr, data, chunk); +- } +-#ifdef DEBUG_DATA +- unsigned int count = chunk; +- int i; +- if (count > 16) { +- count = 16; +- } +- DPRINTF(" ::"); +- for (i = 0; i < count; i++) { +- DPRINTF(" %02x", data[i]); +- } +- DPRINTF("\n"); +-#endif ++ if (xfer->status == CC_SUCCESS) { ++ shortpkt = 1; + } + } + left -= chunk; +- data += chunk; + edtla += chunk; +- transferred += chunk; + break; + case TR_STATUS: + reported = 0; +@@ -1154,8 +1151,9 @@ static int xhci_xfer_data(XHCITransfer *xfer, uint8_t *data, + break; + } + +- if (report && !reported && (trb->control & TRB_TR_IOC || +- (shortpkt && (trb->control & TRB_TR_ISP)))) { ++ if (!reported && ((trb->control & TRB_TR_IOC) || ++ (shortpkt && (trb->control & TRB_TR_ISP)) || ++ (xfer->status != CC_SUCCESS))) { + event.slotid = xfer->slotid; + event.epid = xfer->epid; + event.length = (trb->status & 0x1ffff) - chunk; +@@ -1175,9 +1173,11 @@ static int xhci_xfer_data(XHCITransfer *xfer, uint8_t *data, + } + xhci_event(xhci, &event); + reported = 1; ++ if (xfer->status != CC_SUCCESS) { ++ return; ++ } + } + } +- return transferred; + } + + static void xhci_stall_ep(XHCITransfer *xfer) +@@ -1204,7 +1204,7 @@ static int xhci_setup_packet(XHCITransfer *xfer, USBDevice *dev) + dir = xfer->in_xfer ? USB_TOKEN_IN : USB_TOKEN_OUT; + ep = usb_ep_get(dev, dir, xfer->epid >> 1); + usb_packet_setup(&xfer->packet, dir, ep, xfer->trbs[0].addr); +- usb_packet_addbuf(&xfer->packet, xfer->data, xfer->data_length); ++ xhci_xfer_map(xfer); + DPRINTF("xhci: setup packet pid 0x%x addr %d ep %d\n", + xfer->packet.pid, dev->addr, ep->nr); + return 0; +@@ -1230,12 +1230,13 @@ static int xhci_complete_packet(XHCITransfer *xfer, int ret) + xfer->running_async = 0; + xfer->running_retry = 0; + xfer->complete = 1; ++ xhci_xfer_unmap(xfer); + } + + if (ret >= 0) { +- xfer->status = CC_SUCCESS; +- xhci_xfer_data(xfer, xfer->data, ret, xfer->in_xfer, 0, 1); + trace_usb_xhci_xfer_success(xfer, ret); ++ xfer->status = CC_SUCCESS; ++ xhci_xfer_report(xfer); + return 0; + } + +@@ -1244,12 +1245,12 @@ static int xhci_complete_packet(XHCITransfer *xfer, int ret) + switch (ret) { + case USB_RET_NODEV: + xfer->status = CC_USB_TRANSACTION_ERROR; +- xhci_xfer_data(xfer, xfer->data, 0, xfer->in_xfer, 0, 1); ++ xhci_xfer_report(xfer); + xhci_stall_ep(xfer); + break; + case USB_RET_STALL: + xfer->status = CC_STALL_ERROR; +- xhci_xfer_data(xfer, xfer->data, 0, xfer->in_xfer, 0, 1); ++ xhci_xfer_report(xfer); + xhci_stall_ep(xfer); + break; + default: +@@ -1271,7 +1272,6 @@ static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer) + { + XHCITRB *trb_setup, *trb_status; + uint8_t bmRequestType; +- uint16_t wLength; + XHCIPort *port; + USBDevice *dev; + int ret; +@@ -1279,8 +1279,7 @@ static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer) + trb_setup = &xfer->trbs[0]; + trb_status = &xfer->trbs[xfer->trb_count-1]; + +- trace_usb_xhci_xfer_start(xfer, xfer->slotid, xfer->epid, +- trb_setup->parameter >> 48); ++ trace_usb_xhci_xfer_start(xfer, xfer->slotid, xfer->epid); + + /* at most one Event Data TRB allowed after STATUS */ + if (TRB_TYPE(*trb_status) == TR_EVDATA && xfer->trb_count > 2) { +@@ -1309,19 +1308,6 @@ static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer) + } + + bmRequestType = trb_setup->parameter; +- wLength = trb_setup->parameter >> 48; +- +- if (xfer->data && xfer->data_alloced < wLength) { +- xfer->data_alloced = 0; +- g_free(xfer->data); +- xfer->data = NULL; +- } +- if (!xfer->data) { +- DPRINTF("xhci: alloc %d bytes data\n", wLength); +- xfer->data = g_malloc(wLength+1); +- xfer->data_alloced = wLength; +- } +- xfer->data_length = wLength; + + port = &xhci->ports[xhci->slots[xfer->slotid-1].port-1]; + dev = xhci_find_device(port, xhci->slots[xfer->slotid-1].devaddr); +@@ -1336,9 +1322,6 @@ static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer) + + xhci_setup_packet(xfer, dev); + xfer->packet.parameter = trb_setup->parameter; +- if (!xfer->in_xfer) { +- xhci_xfer_data(xfer, xfer->data, wLength, 0, 1, 0); +- } + + ret = usb_handle_packet(dev, &xfer->packet); + +@@ -1359,16 +1342,6 @@ static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx + + xfer->in_xfer = epctx->type>>2; + +- if (xfer->data && xfer->data_alloced < xfer->data_length) { +- xfer->data_alloced = 0; +- g_free(xfer->data); +- xfer->data = NULL; +- } +- if (!xfer->data && xfer->data_length) { +- DPRINTF("xhci: alloc %d bytes data\n", xfer->data_length); +- xfer->data = g_malloc(xfer->data_length); +- xfer->data_alloced = xfer->data_length; +- } + if (epctx->type == ET_ISO_IN || epctx->type == ET_ISO_OUT) { + xfer->pkts = 1; + } else { +@@ -1402,9 +1375,6 @@ static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx + return -1; + } + +- if (!xfer->in_xfer) { +- xhci_xfer_data(xfer, xfer->data, xfer->data_length, 0, 1, 0); +- } + ret = usb_handle_packet(dev, &xfer->packet); + + xhci_complete_packet(xfer, ret); +@@ -1416,20 +1386,7 @@ static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx + + static int xhci_fire_transfer(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx) + { +- int i; +- unsigned int length = 0; +- XHCITRB *trb; +- +- for (i = 0; i < xfer->trb_count; i++) { +- trb = &xfer->trbs[i]; +- if (TRB_TYPE(*trb) == TR_NORMAL || TRB_TYPE(*trb) == TR_ISOCH) { +- length += trb->status & 0x1ffff; +- } +- } +- +- trace_usb_xhci_xfer_start(xfer, xfer->slotid, xfer->epid, length); +- +- xfer->data_length = length; ++ trace_usb_xhci_xfer_start(xfer, xfer->slotid, xfer->epid); + return xhci_submit(xhci, xfer, epctx); + } + +diff --git a/trace-events b/trace-events +index 10bc04e..c83d65e 100644 +--- a/trace-events ++++ b/trace-events +@@ -326,7 +326,7 @@ usb_xhci_ep_disable(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" + usb_xhci_ep_kick(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" + usb_xhci_ep_stop(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" + usb_xhci_ep_reset(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" +-usb_xhci_xfer_start(void *xfer, uint32_t slotid, uint32_t epid, uint32_t length) "%p: slotid %d, epid %d, length %d" ++usb_xhci_xfer_start(void *xfer, uint32_t slotid, uint32_t epid) "%p: slotid %d, epid %d" + usb_xhci_xfer_async(void *xfer) "%p" + usb_xhci_xfer_nak(void *xfer) "%p" + usb_xhci_xfer_retry(void *xfer) "%p" +-- +1.7.12.1 + diff --git a/0153-xhci-fix-runtime-write-tracepoint.patch b/0153-xhci-fix-runtime-write-tracepoint.patch new file mode 100644 index 0000000..133df2e --- /dev/null +++ b/0153-xhci-fix-runtime-write-tracepoint.patch @@ -0,0 +1,29 @@ +From 6dacb38ce3cb2ffe8c6e3a3a1bc86eee49d1e07c Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 30 Aug 2012 12:42:32 +0200 +Subject: [PATCH] xhci: fix runtime write tracepoint + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 8e9f18b6db1cd67f0a7efd7d0285bee489445197) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-xhci.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 446d692..24b1f87 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -2348,7 +2348,7 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + + static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val) + { +- trace_usb_xhci_runtime_read(reg, val); ++ trace_usb_xhci_runtime_write(reg, val); + + switch (reg) { + case 0x20: /* IMAN */ +-- +1.7.12.1 + diff --git a/0154-xhci-allow-bytewise-capability-register-reads.patch b/0154-xhci-allow-bytewise-capability-register-reads.patch new file mode 100644 index 0000000..0870f14 --- /dev/null +++ b/0154-xhci-allow-bytewise-capability-register-reads.patch @@ -0,0 +1,39 @@ +From 0233069eb2724255f03253f0afe814773eaf345c Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 4 Sep 2012 14:48:03 +0200 +Subject: [PATCH] xhci: allow bytewise capability register reads + +Some guests need this according to +Alejandro Martinez Ruiz + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 6ee021d41078844df60a3a466e3829a3e82776f3) + +Conflicts: + + hw/usb/hcd-xhci.c + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-xhci.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 24b1f87..333df59 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -2474,8 +2474,10 @@ static void xhci_mem_write(void *ptr, target_phys_addr_t addr, + static const MemoryRegionOps xhci_mem_ops = { + .read = xhci_mem_read, + .write = xhci_mem_write, +- .valid.min_access_size = 4, ++ .valid.min_access_size = 1, + .valid.max_access_size = 4, ++ .impl.min_access_size = 4, ++ .impl.max_access_size = 4, + .endianness = DEVICE_LITTLE_ENDIAN, + }; + +-- +1.7.12.1 + diff --git a/0155-qxl-dont-update-invalid-area.patch b/0155-qxl-dont-update-invalid-area.patch new file mode 100644 index 0000000..902566d --- /dev/null +++ b/0155-qxl-dont-update-invalid-area.patch @@ -0,0 +1,44 @@ +From 4007ba909e0188ed03d5a1fc1dde094d0ac14488 Mon Sep 17 00:00:00 2001 +From: Dunrong Huang +Date: Fri, 31 Aug 2012 00:44:44 +0800 +Subject: [PATCH] qxl: dont update invalid area + +This patch fixes the following error: + +$ ~/usr/bin/qemu-system-x86_64 -enable-kvm -m 1024 -spice port=5900,disable-ticketing -vga qxl -cdrom ~/Images/linuxmint-13-mate-dvd-32bit.iso +(/home/mathslinux/usr/bin/qemu-system-x86_64:10068): SpiceWorker-CRITICAL **: red_worker.c:4599:red_update_area: condition `area->left >= 0 && area->top >= 0 && area->left < area->right && area->top < area->bottom' failed +Aborted + +spice server terminates QEMU process if we pass invalid area to it, +so dont update those invalid areas. + +Signed-off-by: Dunrong Huang +Signed-off-by: Gerd Hoffmann +(cherry picked from commit ccc2960d654a233a6ed415b37d8ff41728d817c5) + +Signed-off-by: Michael Roth +--- + hw/qxl.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 27f3779..038a8bb 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1448,6 +1448,13 @@ async_common: + return; + } + ++ if (update.left < 0 || update.top < 0 || update.left >= update.right || ++ update.top >= update.bottom) { ++ qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: " ++ "invalid area(%d,%d,%d,%d)\n", update.left, ++ update.right, update.top, update.bottom); ++ break; ++ } + if (async == QXL_ASYNC) { + cookie = qxl_cookie_new(QXL_COOKIE_TYPE_IO, + QXL_IO_UPDATE_AREA_ASYNC); +-- +1.7.12.1 + diff --git a/0156-usb-host-allow-emulated-non-async-control-requests-w.patch b/0156-usb-host-allow-emulated-non-async-control-requests-w.patch new file mode 100644 index 0000000..11fcb3f --- /dev/null +++ b/0156-usb-host-allow-emulated-non-async-control-requests-w.patch @@ -0,0 +1,40 @@ +From e84037892a04dac64104b43d0a6342aee4c4e6f4 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 6 Sep 2012 12:03:41 +0200 +Subject: [PATCH] usb-host: allow emulated (non-async) control requests + without USBPacket + +xhci needs this for USB_REQ_SET_ADDRESS due to the way +usb addressing is handled by the xhci hardware. + +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 63587e31353b6652cadfcfb869f5692a2b69daeb) + +Signed-off-by: Michael Roth +--- + hw/usb/host-linux.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/usb/host-linux.c b/hw/usb/host-linux.c +index 8df9207..44f1a64 100644 +--- a/hw/usb/host-linux.c ++++ b/hw/usb/host-linux.c +@@ -1045,7 +1045,6 @@ static int usb_host_handle_control(USBDevice *dev, USBPacket *p, + + /* Note request is (bRequestType << 8) | bRequest */ + trace_usb_host_req_control(s->bus_num, s->addr, p, request, value, index); +- assert(p->result == 0); + + switch (request) { + case DeviceOutRequest | USB_REQ_SET_ADDRESS: +@@ -1074,6 +1073,7 @@ static int usb_host_handle_control(USBDevice *dev, USBPacket *p, + } + + /* The rest are asynchronous */ ++ assert(p && p->result == 0); + + if (length > sizeof(dev->data_buf)) { + fprintf(stderr, "husb: ctrl buffer too small (%d > %zu)\n", +-- +1.7.12.1 + diff --git a/0157-qxl-better-cleanup-for-surface-destroy.patch b/0157-qxl-better-cleanup-for-surface-destroy.patch new file mode 100644 index 0000000..b796173 --- /dev/null +++ b/0157-qxl-better-cleanup-for-surface-destroy.patch @@ -0,0 +1,35 @@ +From 57ec733394ec42f8a144751de3b9406fb7e17217 Mon Sep 17 00:00:00 2001 +From: Uri Lublin +Date: Tue, 11 Sep 2012 10:09:58 +0300 +Subject: [PATCH] qxl: better cleanup for surface destroy + +Add back a call to qxl_spice_destroy_surface_wait_complete() in qxl_spice_destroy_surface_wait(), +that was removed by commit c480bb7da465186b84d8427e068ef7502e47ffbf + +It is needed to complete surface-removal cleanup, for non async. +For async, qxl_spice_destroy_surface_wait_complete is called upon operation completion. + +Signed-off-by: Uri Lublin +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 753b8b0d77ba1b343a35f9679cc777ea10a62bba) + +Signed-off-by: Michael Roth +--- + hw/qxl.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 038a8bb..67f7100 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -201,6 +201,7 @@ static void qxl_spice_destroy_surface_wait(PCIQXLDevice *qxl, uint32_t id, + spice_qxl_destroy_surface_async(&qxl->ssd.qxl, id, (uintptr_t)cookie); + } else { + qxl->ssd.worker->destroy_surface_wait(qxl->ssd.worker, id); ++ qxl_spice_destroy_surface_wait_complete(qxl, id); + } + } + +-- +1.7.12.1 + diff --git a/0158-ehci-switch-to-new-style-memory-ops.patch b/0158-ehci-switch-to-new-style-memory-ops.patch new file mode 100644 index 0000000..4932df4 --- /dev/null +++ b/0158-ehci-switch-to-new-style-memory-ops.patch @@ -0,0 +1,370 @@ +From 093374b8c759db877691fde602912a7cafd72a2e Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 6 Sep 2012 11:24:51 +0200 +Subject: [PATCH] ehci: switch to new-style memory ops + +Also register different memory regions for capabilities, +operational registers and port status registers. Create +separate tracepoints for operational regs and port status +regs. Ditch a bunch of sanity checks because the memory +core will do this for us now. + +Offloading the byte, word and dword access handling to the +memory core also has the side effect of fixing ehci register +access on bigendian hosts. + +Cc: David Gibson +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 3e4f910c8d490a1490409a7e381dbbb229f9d272) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 173 ++++++++++++++++++++++++++---------------------------- + trace-events | 9 ++- + 2 files changed, 90 insertions(+), 92 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 2f3e9c0..f5ba8e1 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -389,6 +389,9 @@ struct EHCIState { + USBBus bus; + qemu_irq irq; + MemoryRegion mem; ++ MemoryRegion mem_caps; ++ MemoryRegion mem_opreg; ++ MemoryRegion mem_ports; + int companion_count; + + /* properties */ +@@ -398,10 +401,10 @@ struct EHCIState { + * EHCI spec version 1.0 Section 2.3 + * Host Controller Operational Registers + */ ++ uint8_t caps[OPREGBASE]; + union { +- uint8_t mmio[MMIO_SIZE]; ++ uint32_t opreg[(PORTSC_BEGIN-OPREGBASE)/sizeof(uint32_t)]; + struct { +- uint8_t cap[OPREGBASE]; + uint32_t usbcmd; + uint32_t usbsts; + uint32_t usbintr; +@@ -411,9 +414,9 @@ struct EHCIState { + uint32_t asynclistaddr; + uint32_t notused[9]; + uint32_t configflag; +- uint32_t portsc[NB_PORTS]; + }; + }; ++ uint32_t portsc[NB_PORTS]; + + /* + * Internal states, shadow registers, etc +@@ -471,22 +474,12 @@ static const char *ehci_state_names[] = { + }; + + static const char *ehci_mmio_names[] = { +- [CAPLENGTH] = "CAPLENGTH", +- [HCIVERSION] = "HCIVERSION", +- [HCSPARAMS] = "HCSPARAMS", +- [HCCPARAMS] = "HCCPARAMS", + [USBCMD] = "USBCMD", + [USBSTS] = "USBSTS", + [USBINTR] = "USBINTR", + [FRINDEX] = "FRINDEX", + [PERIODICLISTBASE] = "P-LIST BASE", + [ASYNCLISTADDR] = "A-LIST ADDR", +- [PORTSC_BEGIN] = "PORTSC #0", +- [PORTSC_BEGIN + 4] = "PORTSC #1", +- [PORTSC_BEGIN + 8] = "PORTSC #2", +- [PORTSC_BEGIN + 12] = "PORTSC #3", +- [PORTSC_BEGIN + 16] = "PORTSC #4", +- [PORTSC_BEGIN + 20] = "PORTSC #5", + [CONFIGFLAG] = "CONFIGFLAG", + }; + +@@ -509,7 +502,8 @@ static const char *state2str(uint32_t state) + + static const char *addr2str(target_phys_addr_t addr) + { +- return nr2str(ehci_mmio_names, ARRAY_SIZE(ehci_mmio_names), addr); ++ return nr2str(ehci_mmio_names, ARRAY_SIZE(ehci_mmio_names), ++ addr + OPREGBASE); + } + + static void ehci_trace_usbsts(uint32_t mask, int state) +@@ -1018,7 +1012,7 @@ static int ehci_register_companion(USBBus *bus, USBPort *ports[], + } + + s->companion_count++; +- s->mmio[0x05] = (s->companion_count << 4) | portcount; ++ s->caps[0x05] = (s->companion_count << 4) | portcount; + + return 0; + } +@@ -1063,7 +1057,8 @@ static void ehci_reset(void *opaque) + } + } + +- memset(&s->mmio[OPREGBASE], 0x00, MMIO_SIZE - OPREGBASE); ++ memset(&s->opreg, 0x00, sizeof(s->opreg)); ++ memset(&s->portsc, 0x00, sizeof(s->portsc)); + + s->usbcmd = NB_MAXINTRATE << USBCMD_ITC_SH; + s->usbsts = USBSTS_HALT; +@@ -1090,50 +1085,35 @@ static void ehci_reset(void *opaque) + qemu_bh_cancel(s->async_bh); + } + +-static uint32_t ehci_mem_readb(void *ptr, target_phys_addr_t addr) ++static uint64_t ehci_caps_read(void *ptr, target_phys_addr_t addr, ++ unsigned size) + { + EHCIState *s = ptr; +- uint32_t val; +- +- val = s->mmio[addr]; +- +- return val; ++ return s->caps[addr]; + } + +-static uint32_t ehci_mem_readw(void *ptr, target_phys_addr_t addr) ++static uint64_t ehci_opreg_read(void *ptr, target_phys_addr_t addr, ++ unsigned size) + { + EHCIState *s = ptr; + uint32_t val; + +- val = s->mmio[addr] | (s->mmio[addr+1] << 8); +- ++ val = s->opreg[addr >> 2]; ++ trace_usb_ehci_opreg_read(addr + OPREGBASE, addr2str(addr), val); + return val; + } + +-static uint32_t ehci_mem_readl(void *ptr, target_phys_addr_t addr) ++static uint64_t ehci_port_read(void *ptr, target_phys_addr_t addr, ++ unsigned size) + { + EHCIState *s = ptr; + uint32_t val; + +- val = s->mmio[addr] | (s->mmio[addr+1] << 8) | +- (s->mmio[addr+2] << 16) | (s->mmio[addr+3] << 24); +- +- trace_usb_ehci_mmio_readl(addr, addr2str(addr), val); ++ val = s->portsc[addr >> 2]; ++ trace_usb_ehci_portsc_read(addr + PORTSC_BEGIN, addr >> 2, val); + return val; + } + +-static void ehci_mem_writeb(void *ptr, target_phys_addr_t addr, uint32_t val) +-{ +- fprintf(stderr, "EHCI doesn't handle byte writes to MMIO\n"); +- exit(1); +-} +- +-static void ehci_mem_writew(void *ptr, target_phys_addr_t addr, uint32_t val) +-{ +- fprintf(stderr, "EHCI doesn't handle 16-bit writes to MMIO\n"); +- exit(1); +-} +- + static void handle_port_owner_write(EHCIState *s, int port, uint32_t owner) + { + USBDevice *dev = s->ports[port].dev; +@@ -1162,11 +1142,17 @@ static void handle_port_owner_write(EHCIState *s, int port, uint32_t owner) + } + } + +-static void handle_port_status_write(EHCIState *s, int port, uint32_t val) ++static void ehci_port_write(void *ptr, target_phys_addr_t addr, ++ uint64_t val, unsigned size) + { ++ EHCIState *s = ptr; ++ int port = addr >> 2; + uint32_t *portsc = &s->portsc[port]; ++ uint32_t old = *portsc; + USBDevice *dev = s->ports[port].dev; + ++ trace_usb_ehci_portsc_write(addr + PORTSC_BEGIN, addr >> 2, val); ++ + /* Clear rwc bits */ + *portsc &= ~(val & PORTSC_RWC_MASK); + /* The guest may clear, but not set the PED bit */ +@@ -1198,39 +1184,20 @@ static void handle_port_status_write(EHCIState *s, int port, uint32_t val) + + *portsc &= ~PORTSC_RO_MASK; + *portsc |= val; ++ trace_usb_ehci_portsc_change(addr + PORTSC_BEGIN, addr >> 2, *portsc, old); + } + +-static void ehci_mem_writel(void *ptr, target_phys_addr_t addr, uint32_t val) ++static void ehci_opreg_write(void *ptr, target_phys_addr_t addr, ++ uint64_t val, unsigned size) + { + EHCIState *s = ptr; +- uint32_t *mmio = (uint32_t *)(&s->mmio[addr]); ++ uint32_t *mmio = s->opreg + (addr >> 2); + uint32_t old = *mmio; + int i; + +- trace_usb_ehci_mmio_writel(addr, addr2str(addr), val); +- +- /* Only aligned reads are allowed on OHCI */ +- if (addr & 3) { +- fprintf(stderr, "usb-ehci: Mis-aligned write to addr 0x" +- TARGET_FMT_plx "\n", addr); +- return; +- } +- +- if (addr >= PORTSC && addr < PORTSC + 4 * NB_PORTS) { +- handle_port_status_write(s, (addr-PORTSC)/4, val); +- trace_usb_ehci_mmio_change(addr, addr2str(addr), *mmio, old); +- return; +- } +- +- if (addr < OPREGBASE) { +- fprintf(stderr, "usb-ehci: write attempt to read-only register" +- TARGET_FMT_plx "\n", addr); +- return; +- } +- ++ trace_usb_ehci_opreg_write(addr + OPREGBASE, addr2str(addr), val); + +- /* Do any register specific pre-write processing here. */ +- switch(addr) { ++ switch (addr + OPREGBASE) { + case USBCMD: + if (val & USBCMD_HCRESET) { + ehci_reset(s); +@@ -1241,7 +1208,7 @@ static void ehci_mem_writel(void *ptr, target_phys_addr_t addr, uint32_t val) + /* not supporting dynamic frame list size at the moment */ + if ((val & USBCMD_FLS) && !(s->usbcmd & USBCMD_FLS)) { + fprintf(stderr, "attempt to set frame list size -- value %d\n", +- val & USBCMD_FLS); ++ (int)val & USBCMD_FLS); + val &= ~USBCMD_FLS; + } + +@@ -1308,7 +1275,7 @@ static void ehci_mem_writel(void *ptr, target_phys_addr_t addr, uint32_t val) + } + + *mmio = val; +- trace_usb_ehci_mmio_change(addr, addr2str(addr), *mmio, old); ++ trace_usb_ehci_opreg_change(addr + OPREGBASE, addr2str(addr), *mmio, old); + } + + +@@ -2520,11 +2487,28 @@ static void ehci_async_bh(void *opaque) + ehci_advance_async_state(ehci); + } + +-static const MemoryRegionOps ehci_mem_ops = { +- .old_mmio = { +- .read = { ehci_mem_readb, ehci_mem_readw, ehci_mem_readl }, +- .write = { ehci_mem_writeb, ehci_mem_writew, ehci_mem_writel }, +- }, ++static const MemoryRegionOps ehci_mmio_caps_ops = { ++ .read = ehci_caps_read, ++ .valid.min_access_size = 1, ++ .valid.max_access_size = 4, ++ .impl.min_access_size = 1, ++ .impl.max_access_size = 1, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; ++ ++static const MemoryRegionOps ehci_mmio_opreg_ops = { ++ .read = ehci_opreg_read, ++ .write = ehci_opreg_write, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; ++ ++static const MemoryRegionOps ehci_mmio_port_ops = { ++ .read = ehci_port_read, ++ .write = ehci_port_write, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, + .endianness = DEVICE_LITTLE_ENDIAN, + }; + +@@ -2681,19 +2665,19 @@ static int usb_ehci_initfn(PCIDevice *dev) + pci_conf[0x6e] = 0x00; + pci_conf[0x6f] = 0xc0; // USBLEFCTLSTS + +- // 2.2 host controller interface version +- s->mmio[0x00] = (uint8_t) OPREGBASE; +- s->mmio[0x01] = 0x00; +- s->mmio[0x02] = 0x00; +- s->mmio[0x03] = 0x01; // HC version +- s->mmio[0x04] = NB_PORTS; // Number of downstream ports +- s->mmio[0x05] = 0x00; // No companion ports at present +- s->mmio[0x06] = 0x00; +- s->mmio[0x07] = 0x00; +- s->mmio[0x08] = 0x80; // We can cache whole frame, not 64-bit capable +- s->mmio[0x09] = 0x68; // EECP +- s->mmio[0x0a] = 0x00; +- s->mmio[0x0b] = 0x00; ++ /* 2.2 host controller interface version */ ++ s->caps[0x00] = (uint8_t) OPREGBASE; ++ s->caps[0x01] = 0x00; ++ s->caps[0x02] = 0x00; ++ s->caps[0x03] = 0x01; /* HC version */ ++ s->caps[0x04] = NB_PORTS; /* Number of downstream ports */ ++ s->caps[0x05] = 0x00; /* No companion ports at present */ ++ s->caps[0x06] = 0x00; ++ s->caps[0x07] = 0x00; ++ s->caps[0x08] = 0x80; /* We can cache whole frame, no 64-bit */ ++ s->caps[0x09] = 0x68; /* EECP */ ++ s->caps[0x0a] = 0x00; ++ s->caps[0x0b] = 0x00; + + s->irq = s->dev.irq[3]; + +@@ -2712,7 +2696,18 @@ static int usb_ehci_initfn(PCIDevice *dev) + + qemu_register_reset(ehci_reset, s); + +- memory_region_init_io(&s->mem, &ehci_mem_ops, s, "ehci", MMIO_SIZE); ++ memory_region_init(&s->mem, "ehci", MMIO_SIZE); ++ memory_region_init_io(&s->mem_caps, &ehci_mmio_caps_ops, s, ++ "capabilities", OPREGBASE); ++ memory_region_init_io(&s->mem_opreg, &ehci_mmio_opreg_ops, s, ++ "operational", PORTSC_BEGIN - OPREGBASE); ++ memory_region_init_io(&s->mem_ports, &ehci_mmio_port_ops, s, ++ "ports", PORTSC_END - PORTSC_BEGIN); ++ ++ memory_region_add_subregion(&s->mem, 0, &s->mem_caps); ++ memory_region_add_subregion(&s->mem, OPREGBASE, &s->mem_opreg); ++ memory_region_add_subregion(&s->mem, PORTSC_BEGIN, &s->mem_ports); ++ + pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mem); + + return 0; +diff --git a/trace-events b/trace-events +index c83d65e..cf05414 100644 +--- a/trace-events ++++ b/trace-events +@@ -243,9 +243,12 @@ usb_port_release(int bus, const char *port) "bus %d, port %s" + + # hw/usb/hcd-ehci.c + usb_ehci_reset(void) "=== RESET ===" +-usb_ehci_mmio_readl(uint32_t addr, const char *str, uint32_t val) "rd mmio %04x [%s] = %x" +-usb_ehci_mmio_writel(uint32_t addr, const char *str, uint32_t val) "wr mmio %04x [%s] = %x" +-usb_ehci_mmio_change(uint32_t addr, const char *str, uint32_t new, uint32_t old) "ch mmio %04x [%s] = %x (old: %x)" ++usb_ehci_opreg_read(uint32_t addr, const char *str, uint32_t val) "rd mmio %04x [%s] = %x" ++usb_ehci_opreg_write(uint32_t addr, const char *str, uint32_t val) "wr mmio %04x [%s] = %x" ++usb_ehci_opreg_change(uint32_t addr, const char *str, uint32_t new, uint32_t old) "ch mmio %04x [%s] = %x (old: %x)" ++usb_ehci_portsc_read(uint32_t addr, uint32_t port, uint32_t val) "rd mmio %04x [port %d] = %x" ++usb_ehci_portsc_write(uint32_t addr, uint32_t port, uint32_t val) "wr mmio %04x [port %d] = %x" ++usb_ehci_portsc_change(uint32_t addr, uint32_t port, uint32_t new, uint32_t old) "ch mmio %04x [port %d] = %x (old: %x)" + usb_ehci_usbsts(const char *sts, int state) "usbsts %s %d" + usb_ehci_state(const char *schedule, const char *state) "%s schedule %s" + usb_ehci_qh_ptrs(void *q, uint32_t addr, uint32_t nxt, uint32_t c_qtd, uint32_t n_qtd, uint32_t a_qtd) "q %p - QH @ %08x: next %08x qtds %08x,%08x,%08x" +-- +1.7.12.1 + diff --git a/0159-ehci-Fix-interrupts-stopping-when-Interrupt-Threshol.patch b/0159-ehci-Fix-interrupts-stopping-when-Interrupt-Threshol.patch new file mode 100644 index 0000000..bd8d88b --- /dev/null +++ b/0159-ehci-Fix-interrupts-stopping-when-Interrupt-Threshol.patch @@ -0,0 +1,38 @@ +From c84ed39e601ff69d93e0ad81d92cb7234ad5d4cd Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 10 Sep 2012 12:44:10 +0200 +Subject: [PATCH] ehci: Fix interrupts stopping when Interrupt Threshold + Control is 8 + +If Interrupt Threshold Control is 8 or a multiple of 8, then +s->usbsts_frindex can become exactly 0x4000, at which point +(s->usbsts_frindex > s->frindex) will never become true, as +s->usbsts_frindex will not be lowered / reset in this case. + +This patch fixes this. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit ffa1f2e088eb7e3d57f2fc35f21e7bdb23e592c5) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index f5ba8e1..54273d7 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -2413,7 +2413,7 @@ static void ehci_update_frindex(EHCIState *ehci, int frames) + if (ehci->frindex == 0x00004000) { + ehci_raise_irq(ehci, USBSTS_FLR); + ehci->frindex = 0; +- if (ehci->usbsts_frindex > 0x00004000) { ++ if (ehci->usbsts_frindex >= 0x00004000) { + ehci->usbsts_frindex -= 0x00004000; + } else { + ehci->usbsts_frindex = 0; +-- +1.7.12.1 + diff --git a/0160-ehci-Don-t-process-too-much-frames-in-1-timer-tick-v.patch b/0160-ehci-Don-t-process-too-much-frames-in-1-timer-tick-v.patch new file mode 100644 index 0000000..f0a4b00 --- /dev/null +++ b/0160-ehci-Don-t-process-too-much-frames-in-1-timer-tick-v.patch @@ -0,0 +1,60 @@ +From a5022829821b27e00790f8fe2fd9cd8090a47e36 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 10 Sep 2012 12:44:11 +0200 +Subject: [PATCH] ehci: Don't process too much frames in 1 timer tick (v2) + +The Linux ehci isoc scheduling code fills the entire schedule ahead of +time minus 80 frames. If we make a large jump in where we are in the +schedule, ie 40 frames, then the scheduler all of a sudden will only have +40 frames left to work in, causing it to fail packet submissions +with error -27 (-EFBIG). + +Changes in v2: +-Don't hardcode a maximum number of frames to process in one tick, instead: + -Process a minimum number of frames to ensure we do eventually catch up + -Stop (after the minimum number) when the guest has requested an irq + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 8f74ed1e43263293301031a10e440549bab19a6e) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 54273d7..017a01d 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -139,6 +139,7 @@ + #define NB_PORTS 6 // Number of downstream ports + #define BUFF_SIZE 5*4096 // Max bytes to transfer per transaction + #define MAX_QH 100 // Max allowable queue heads in a chain ++#define MIN_FR_PER_TICK 3 // Min frames to process when catching up + + /* Internal periodic / asynchronous schedule state machine states + */ +@@ -2448,6 +2449,19 @@ static void ehci_frame_timer(void *opaque) + } + + for (i = 0; i < frames; i++) { ++ /* ++ * If we're running behind schedule, we should not catch up ++ * too fast, as that will make some guests unhappy: ++ * 1) We must process a minimum of MIN_FR_PER_TICK frames, ++ * otherwise we will never catch up ++ * 2) Process frames until the guest has requested an irq (IOC) ++ */ ++ if (i >= MIN_FR_PER_TICK) { ++ ehci_commit_irq(ehci); ++ if ((ehci->usbsts & USBINTR_MASK) & ehci->usbintr) { ++ break; ++ } ++ } + ehci_update_frindex(ehci, 1); + ehci_advance_periodic_state(ehci); + ehci->last_run_ns += FRAME_TIMER_NS; +-- +1.7.12.1 + diff --git a/0161-sheepdog-fix-savevm-and-loadvm.patch b/0161-sheepdog-fix-savevm-and-loadvm.patch new file mode 100644 index 0000000..f85cc0b --- /dev/null +++ b/0161-sheepdog-fix-savevm-and-loadvm.patch @@ -0,0 +1,41 @@ +From f065553b45322bb0ba14a4c9d1fb65554ae3e325 Mon Sep 17 00:00:00 2001 +From: MORITA Kazutaka +Date: Thu, 30 Aug 2012 03:39:45 +0900 +Subject: [PATCH] sheepdog: fix savevm and loadvm + +This patch sets data to be sent to Sheepdog correctly and fixes savevm +and loadvm operations on a Sheepdog image. + +Signed-off-by: MORITA Kazutaka +Signed-off-by: Kevin Wolf +(cherry picked from commit 1f7a48de4467f31afc51169122453318efdb0f33) + +Signed-off-by: Michael Roth +--- + block/sheepdog.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/block/sheepdog.c b/block/sheepdog.c +index df4f441..e0753ee 100644 +--- a/block/sheepdog.c ++++ b/block/sheepdog.c +@@ -1986,7 +1986,7 @@ static int do_load_save_vmstate(BDRVSheepdogState *s, uint8_t *data, + vdi_index = pos / SD_DATA_OBJ_SIZE; + offset = pos % SD_DATA_OBJ_SIZE; + +- data_len = MIN(remaining, SD_DATA_OBJ_SIZE); ++ data_len = MIN(remaining, SD_DATA_OBJ_SIZE - offset); + + vmstate_oid = vid_to_vmstate_oid(s->inode.vdi_id, vdi_index); + +@@ -2007,6 +2007,7 @@ static int do_load_save_vmstate(BDRVSheepdogState *s, uint8_t *data, + } + + pos += data_len; ++ data += data_len; + remaining -= data_len; + } + ret = size; +-- +1.7.12.1 + diff --git a/0162-ide-Fix-error-messages-from-static-code-analysis-no-.patch b/0162-ide-Fix-error-messages-from-static-code-analysis-no-.patch new file mode 100644 index 0000000..62a21ce --- /dev/null +++ b/0162-ide-Fix-error-messages-from-static-code-analysis-no-.patch @@ -0,0 +1,67 @@ +From 8557d38b8d660d07c7b6fd1bfa62182cc6c52400 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Mon, 3 Sep 2012 22:13:56 +0200 +Subject: [PATCH] ide: Fix error messages from static code analysis (no real + error) + +Report from smatch: +hw/ide/core.c:1472 ide_exec_cmd(423) error: buffer overflow 'smart_attributes' 8 <= 29 +hw/ide/core.c:1474 ide_exec_cmd(425) error: buffer overflow 'smart_attributes' 8 <= 29 +hw/ide/core.c:1475 ide_exec_cmd(426) error: buffer overflow 'smart_attributes' 8 <= 29 +... + +The upper limit of 30 was never reached because both for loops terminated +when 'smart_attributes' reached end of list, so there was no real buffer +overflow. + +Nevertheless, changing the code not only fixes the error report, but also +reduces the size of smart_attributes and simplifies the for loops. + +Signed-off-by: Stefan Weil +Signed-off-by: Kevin Wolf +(cherry picked from commit 1e53537fdaa4657d11f130a0f2673fcfb1956381) + +Signed-off-by: Michael Roth +--- + hw/ide/core.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +diff --git a/hw/ide/core.c b/hw/ide/core.c +index d65ef3d..d6fb69c 100644 +--- a/hw/ide/core.c ++++ b/hw/ide/core.c +@@ -53,8 +53,6 @@ static const int smart_attributes[][12] = { + { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + /* airflow-temperature-celsius */ + { 190, 0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32}, +- /* end of list */ +- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + }; + + static int ide_handle_rw_error(IDEState *s, int error, int op); +@@ -1468,9 +1466,7 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val) + case SMART_READ_THRESH: + memset(s->io_buffer, 0, 0x200); + s->io_buffer[0] = 0x01; /* smart struct version */ +- for (n=0; n<30; n++) { +- if (smart_attributes[n][0] == 0) +- break; ++ for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) { + s->io_buffer[2+0+(n*12)] = smart_attributes[n][0]; + s->io_buffer[2+1+(n*12)] = smart_attributes[n][11]; + } +@@ -1484,10 +1480,7 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val) + case SMART_READ_DATA: + memset(s->io_buffer, 0, 0x200); + s->io_buffer[0] = 0x01; /* smart struct version */ +- for (n=0; n<30; n++) { +- if (smart_attributes[n][0] == 0) { +- break; +- } ++ for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) { + int i; + for(i = 0; i < 11; i++) { + s->io_buffer[2+i+(n*12)] = smart_attributes[n][i]; +-- +1.7.12.1 + diff --git a/0163-block-curl-Fix-wrong-free-statement.patch b/0163-block-curl-Fix-wrong-free-statement.patch new file mode 100644 index 0000000..a37ad7f --- /dev/null +++ b/0163-block-curl-Fix-wrong-free-statement.patch @@ -0,0 +1,37 @@ +From a29b7f5390e33d089dcdbf75d6e92c20bbedc562 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 1 Sep 2012 11:06:45 +0200 +Subject: [PATCH] block/curl: Fix wrong free statement + +Report from smatch: +block/curl.c:546 curl_close(21) info: redundant null check on s->url calling free() + +The check was redundant, and free was also wrong because the memory +was allocated using g_strdup. + +Signed-off-by: Stefan Weil +Signed-off-by: Kevin Wolf +(cherry picked from commit 45724d6d02383b0d7d4a90e05787fca7c55cb070) + +Signed-off-by: Michael Roth +--- + block/curl.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/block/curl.c b/block/curl.c +index e7c3634..c1074cd 100644 +--- a/block/curl.c ++++ b/block/curl.c +@@ -542,8 +542,7 @@ static void curl_close(BlockDriverState *bs) + } + if (s->multi) + curl_multi_cleanup(s->multi); +- if (s->url) +- free(s->url); ++ g_free(s->url); + } + + static int64_t curl_getlength(BlockDriverState *bs) +-- +1.7.12.1 + diff --git a/0164-vdi-Fix-warning-from-clang.patch b/0164-vdi-Fix-warning-from-clang.patch new file mode 100644 index 0000000..c8e751d --- /dev/null +++ b/0164-vdi-Fix-warning-from-clang.patch @@ -0,0 +1,75 @@ +From 928865de80da6a23e6f0d4d86187c52f6c940255 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Fri, 17 Aug 2012 15:23:24 +0200 +Subject: [PATCH] vdi: Fix warning from clang + +ccc-analyzer reports these warnings: + +block/vdi.c:704:13: warning: Dereference of null pointer + bmap[i] = VDI_UNALLOCATED; + ^ +block/vdi.c:702:13: warning: Dereference of null pointer + bmap[i] = i; + ^ + +Moving some code into the if block fixes this. +It also avoids calling function write with 0 bytes of data. + +Signed-off-by: Stefan Weil +Signed-off-by: Kevin Wolf +(cherry picked from commit 514f21a5d4613e495adc2e2dd48f18091454efb8) + +Signed-off-by: Michael Roth +--- + block/vdi.c | 25 ++++++++++++------------- + 1 file changed, 12 insertions(+), 13 deletions(-) + +diff --git a/block/vdi.c b/block/vdi.c +index c4f1529..550cf58 100644 +--- a/block/vdi.c ++++ b/block/vdi.c +@@ -628,7 +628,6 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options) + VdiHeader header; + size_t i; + size_t bmap_size; +- uint32_t *bmap; + + logout("\n"); + +@@ -693,21 +692,21 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options) + result = -errno; + } + +- bmap = NULL; + if (bmap_size > 0) { +- bmap = (uint32_t *)g_malloc0(bmap_size); +- } +- for (i = 0; i < blocks; i++) { +- if (image_type == VDI_TYPE_STATIC) { +- bmap[i] = i; +- } else { +- bmap[i] = VDI_UNALLOCATED; ++ uint32_t *bmap = g_malloc0(bmap_size); ++ for (i = 0; i < blocks; i++) { ++ if (image_type == VDI_TYPE_STATIC) { ++ bmap[i] = i; ++ } else { ++ bmap[i] = VDI_UNALLOCATED; ++ } + } ++ if (write(fd, bmap, bmap_size) < 0) { ++ result = -errno; ++ } ++ g_free(bmap); + } +- if (write(fd, bmap, bmap_size) < 0) { +- result = -errno; +- } +- g_free(bmap); ++ + if (image_type == VDI_TYPE_STATIC) { + if (ftruncate(fd, sizeof(header) + bmap_size + blocks * block_size)) { + result = -errno; +-- +1.7.12.1 + diff --git a/0165-block-fix-block-tray-status.patch b/0165-block-fix-block-tray-status.patch new file mode 100644 index 0000000..6db09b8 --- /dev/null +++ b/0165-block-fix-block-tray-status.patch @@ -0,0 +1,36 @@ +From 8794685f3ebb2d0001ab01bc8692d99242aedb4f Mon Sep 17 00:00:00 2001 +From: Pavel Hrdina +Date: Thu, 9 Aug 2012 12:44:48 +0200 +Subject: [PATCH] block: fix block tray status + +The tray status should change also if you eject empty block device. + +Signed-off-by: Pavel Hrdina +Signed-off-by: Kevin Wolf +(cherry picked from commit 9ca111544c64b5abed2e79cf52e19a8f227b347b) + +Signed-off-by: Michael Roth +--- + block.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/block.c b/block.c +index 470bdcc..c754353 100644 +--- a/block.c ++++ b/block.c +@@ -897,10 +897,10 @@ void bdrv_close(BlockDriverState *bs) + bdrv_delete(bs->file); + bs->file = NULL; + } +- +- bdrv_dev_change_media_cb(bs, false); + } + ++ bdrv_dev_change_media_cb(bs, false); ++ + /*throttling disk I/O limits*/ + if (bs->io_limits_enabled) { + bdrv_io_limits_disable(bs); +-- +1.7.12.1 + diff --git a/0166-ahci-properly-reset-PxCMD-on-HBA-reset.patch b/0166-ahci-properly-reset-PxCMD-on-HBA-reset.patch new file mode 100644 index 0000000..ad2d6b5 --- /dev/null +++ b/0166-ahci-properly-reset-PxCMD-on-HBA-reset.patch @@ -0,0 +1,64 @@ +From 3248d5fbbf9c0fbfd8d42af08aa81fe1e3fe2841 Mon Sep 17 00:00:00 2001 +From: Jason Baron +Date: Tue, 4 Sep 2012 16:08:08 -0400 +Subject: [PATCH] ahci: properly reset PxCMD on HBA reset + +While testing q35, I found that windows 7 (specifically, windows 7 ultimate +with sp1 x64), wouldn't install because it can't find the cdrom or disk drive. +The failure message is: 'A required cd/dvd device driver is missing. If you +have a driver floppy disk, CD, DVD, or USB flash drive, please insert it now.' +This can also be reproduced on piix by adding an ahci controller, and +observing that windows 7 does not see any devices behind it. + +The problem is that when windows issues a HBA reset, qemu does not reset the +individual ports' PxCMD register. Windows 7 then reads back the PxCMD register +and presumably assumes that the ahci controller has already been initialized. +Windows then never sets up the PxIE register to enable interrupts, and thus it +never gets irqs back when it sends ata device inquiry commands. + +This change brings qemu into ahci 1.3 specification compliance. + +Section 10.4.3 HBA Reset: + +" +When GHC.HR is set to '1', GHC.AE, GHC.IE, the IS register, and all port +register fields (except PxFB/PxFBU/PxCLB/PxCLBU) that are not HwInit in the +HBA's register memory space are reset. +" + +I've also re-tested Fedora 16 and 17 to verify that they continue to work with +this change. + +Signed-off-by: Jason Baron +Acked-by: Alexander Graf +Signed-off-by: Kevin Wolf +(cherry picked from commit 2a4f4f34e6fe55f4c82507c3e7ec9b58c2e24ad4) + +Signed-off-by: Michael Roth +--- + hw/ide/ahci.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c +index 5ea3cad..68671bc 100644 +--- a/hw/ide/ahci.c ++++ b/hw/ide/ahci.c +@@ -1175,7 +1175,6 @@ void ahci_init(AHCIState *s, DeviceState *qdev, DMAContext *dma, int ports) + ad->port_no = i; + ad->port.dma = &ad->dma; + ad->port.dma->ops = &ahci_dma_ops; +- ad->port_regs.cmd = PORT_CMD_SPIN_UP | PORT_CMD_POWER_ON; + } + } + +@@ -1199,6 +1198,7 @@ void ahci_reset(AHCIState *s) + pr->irq_stat = 0; + pr->irq_mask = 0; + pr->scr_ctl = 0; ++ pr->cmd = PORT_CMD_SPIN_UP | PORT_CMD_POWER_ON; + ahci_reset_port(s, i); + } + } +-- +1.7.12.1 + diff --git a/0167-Don-t-require-encryption-password-for-qemu-img-info-.patch b/0167-Don-t-require-encryption-password-for-qemu-img-info-.patch new file mode 100644 index 0000000..6b9d67f --- /dev/null +++ b/0167-Don-t-require-encryption-password-for-qemu-img-info-.patch @@ -0,0 +1,121 @@ +From 4812a358ff2d7442c33a517a6c80d7d3c301ec56 Mon Sep 17 00:00:00 2001 +From: "Daniel P. Berrange" +Date: Mon, 10 Sep 2012 12:11:31 +0100 +Subject: [PATCH] Don't require encryption password for 'qemu-img info' + command + +The encryption password is only required if I/O is going to be +performed on a disk image. The 'qemu-img info' command merely +reports metadata, so it should not ask for a decryption password + +Signed-off-by: Daniel P. Berrange +Signed-off-by: Kevin Wolf +(cherry picked from commit f0536bb848ad6eb2709a7dc675f261bd160c751b) + +Conflicts: + + qemu-img.c + +Signed-off-by: Michael Roth +--- + qemu-img.c | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +diff --git a/qemu-img.c b/qemu-img.c +index b41e670..0d208e8 100644 +--- a/qemu-img.c ++++ b/qemu-img.c +@@ -221,7 +221,8 @@ static int print_block_option_help(const char *filename, const char *fmt) + + static BlockDriverState *bdrv_new_open(const char *filename, + const char *fmt, +- int flags) ++ int flags, ++ bool require_io) + { + BlockDriverState *bs; + BlockDriver *drv; +@@ -246,7 +247,7 @@ static BlockDriverState *bdrv_new_open(const char *filename, + goto fail; + } + +- if (bdrv_is_encrypted(bs)) { ++ if (bdrv_is_encrypted(bs) && require_io) { + printf("Disk image '%s' is encrypted.\n", filename); + if (read_password(password, sizeof(password)) < 0) { + error_report("No password given"); +@@ -413,7 +414,7 @@ static int img_check(int argc, char **argv) + } + filename = argv[optind++]; + +- bs = bdrv_new_open(filename, fmt, flags); ++ bs = bdrv_new_open(filename, fmt, flags, true); + if (!bs) { + return 1; + } +@@ -520,7 +521,7 @@ static int img_commit(int argc, char **argv) + return -1; + } + +- bs = bdrv_new_open(filename, fmt, flags); ++ bs = bdrv_new_open(filename, fmt, flags, true); + if (!bs) { + return 1; + } +@@ -762,7 +763,7 @@ static int img_convert(int argc, char **argv) + + total_sectors = 0; + for (bs_i = 0; bs_i < bs_n; bs_i++) { +- bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS); ++ bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BDRV_O_FLAGS, true); + if (!bs[bs_i]) { + error_report("Could not open '%s'", argv[optind + bs_i]); + ret = -1; +@@ -881,7 +882,7 @@ static int img_convert(int argc, char **argv) + return -1; + } + +- out_bs = bdrv_new_open(out_filename, out_fmt, flags); ++ out_bs = bdrv_new_open(out_filename, out_fmt, flags, true); + if (!out_bs) { + ret = -1; + goto out; +@@ -1135,7 +1136,7 @@ static int img_info(int argc, char **argv) + } + filename = argv[optind++]; + +- bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING); ++ bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_NO_BACKING, false); + if (!bs) { + return 1; + } +@@ -1248,7 +1249,7 @@ static int img_snapshot(int argc, char **argv) + filename = argv[optind++]; + + /* Open the image */ +- bs = bdrv_new_open(filename, NULL, bdrv_oflags); ++ bs = bdrv_new_open(filename, NULL, bdrv_oflags, true); + if (!bs) { + return 1; + } +@@ -1366,7 +1367,7 @@ static int img_rebase(int argc, char **argv) + * Ignore the old backing file for unsafe rebase in case we want to correct + * the reference to a renamed or moved backing file. + */ +- bs = bdrv_new_open(filename, fmt, flags); ++ bs = bdrv_new_open(filename, fmt, flags, true); + if (!bs) { + return 1; + } +@@ -1639,7 +1640,7 @@ static int img_resize(int argc, char **argv) + n = qemu_opt_get_size(param, BLOCK_OPT_SIZE, 0); + qemu_opts_del(param); + +- bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR); ++ bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR, true); + if (!bs) { + ret = -1; + goto out; +-- +1.7.12.1 + diff --git a/0168-block-Don-t-forget-to-delete-temporary-file.patch b/0168-block-Don-t-forget-to-delete-temporary-file.patch new file mode 100644 index 0000000..90d07b9 --- /dev/null +++ b/0168-block-Don-t-forget-to-delete-temporary-file.patch @@ -0,0 +1,36 @@ +From 3306981d5631182fb1384b05d66be26918521511 Mon Sep 17 00:00:00 2001 +From: Dunrong Huang +Date: Wed, 5 Sep 2012 21:26:22 +0800 +Subject: [PATCH] block: Don't forget to delete temporary file + +The caller would not delete temporary file after failed get_tmp_filename(). + +Signed-off-by: Dunrong Huang +Signed-off-by: Kevin Wolf +(cherry picked from commit fe235a06e1e008dedd2ac3cc0a3a655169ce9b33) + +Signed-off-by: Michael Roth +--- + block.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/block.c b/block.c +index c754353..e78039b 100644 +--- a/block.c ++++ b/block.c +@@ -433,7 +433,11 @@ int get_tmp_filename(char *filename, int size) + return -EOVERFLOW; + } + fd = mkstemp(filename); +- if (fd < 0 || close(fd)) { ++ if (fd < 0) { ++ return -errno; ++ } ++ if (close(fd) != 0) { ++ unlink(filename); + return -errno; + } + return 0; +-- +1.7.12.1 + diff --git a/0169-hw-qxl-tracing-fixes.patch b/0169-hw-qxl-tracing-fixes.patch new file mode 100644 index 0000000..74c400f --- /dev/null +++ b/0169-hw-qxl-tracing-fixes.patch @@ -0,0 +1,99 @@ +From e4a803d8ebd69719f4d997052e5bc3a5a7d91124 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Wed, 12 Sep 2012 16:13:26 +0300 +Subject: [PATCH] hw/qxl: tracing fixes + +Add two new trace events: +qxl_send_events(int qid, uint32_t events) "%d %d" +qxl_set_guest_bug(int qid) "%d" + +Change qxl_io_unexpected_vga_mode parameters to be equivalent to those +of qxl_io_write for easier grouping under a single systemtap probe. + +Change d to qxl in one place. + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 917ae08ca1565aab2d10c8b6269cd905d6c5c05b) + +Signed-off-by: Michael Roth +--- + hw/qxl.c | 8 +++++--- + trace-events | 6 ++++-- + 2 files changed, 9 insertions(+), 5 deletions(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 67f7100..59bf822 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -141,6 +141,7 @@ static void qxl_ring_set_dirty(PCIQXLDevice *qxl); + + void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...) + { ++ trace_qxl_set_guest_bug(qxl->id); + qxl_send_events(qxl, QXL_INTERRUPT_ERROR); + qxl->guest_bug = 1; + if (qxl->guestdebug) { +@@ -1381,7 +1382,7 @@ static void ioport_write(void *opaque, target_phys_addr_t addr, + break; + } + trace_qxl_io_unexpected_vga_mode(d->id, +- io_port, io_port_to_string(io_port)); ++ addr, val, io_port_to_string(io_port)); + /* be nice to buggy guest drivers */ + if (io_port >= QXL_IO_UPDATE_AREA_ASYNC && + io_port < QXL_IO_RANGE_SIZE) { +@@ -1580,9 +1581,9 @@ cancel_async: + static uint64_t ioport_read(void *opaque, target_phys_addr_t addr, + unsigned size) + { +- PCIQXLDevice *d = opaque; ++ PCIQXLDevice *qxl = opaque; + +- trace_qxl_io_read_unexpected(d->id); ++ trace_qxl_io_read_unexpected(qxl->id); + return 0xff; + } + +@@ -1612,6 +1613,7 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events) + uint32_t old_pending; + uint32_t le_events = cpu_to_le32(events); + ++ trace_qxl_send_events(d->id, events); + assert(qemu_spice_display_is_running(&d->ssd)); + old_pending = __sync_fetch_and_or(&d->ram->int_pending, le_events); + if ((old_pending & le_events) == le_events) { +diff --git a/trace-events b/trace-events +index cf05414..aa79836 100644 +--- a/trace-events ++++ b/trace-events +@@ -931,7 +931,7 @@ qxl_interface_update_area_complete_overflow(int qid, int max) "%d max=%d" + qxl_interface_update_area_complete_schedule_bh(int qid, uint32_t num_dirty) "%d #dirty=%d" + qxl_io_destroy_primary_ignored(int qid, const char *mode) "%d %s" + qxl_io_read_unexpected(int qid) "%d" +-qxl_io_unexpected_vga_mode(int qid, uint32_t io_port, const char *desc) "%d 0x%x (%s)" ++qxl_io_unexpected_vga_mode(int qid, uint64_t addr, uint64_t val, const char *desc) "%d 0x%"PRIx64"=%"PRIu64" (%s)" + qxl_io_write(int qid, const char *mode, uint64_t addr, uint64_t val, unsigned size, int async) "%d %s addr=%"PRIu64 " val=%"PRIu64" size=%u async=%d" + qxl_memslot_add_guest(int qid, uint32_t slot_id, uint64_t guest_start, uint64_t guest_end) "%d %u: guest phys 0x%"PRIx64 " - 0x%" PRIx64 + qxl_post_load(int qid, const char *mode) "%d %s" +@@ -962,7 +962,7 @@ qxl_spice_destroy_surfaces(int qid, int async) "%d async=%d" + qxl_spice_destroy_surface_wait_complete(int qid, uint32_t id) "%d sid=%d" + qxl_spice_destroy_surface_wait(int qid, uint32_t id, int async) "%d sid=%d async=%d" + qxl_spice_flush_surfaces_async(int qid, uint32_t surface_count, uint32_t num_free_res) "%d s#=%d, res#=%d" +-qxl_spice_monitors_config(int id) "%d" ++qxl_spice_monitors_config(int qid) "%d" + qxl_spice_loadvm_commands(int qid, void *ext, uint32_t count) "%d ext=%p count=%d" + qxl_spice_oom(int qid) "%d" + qxl_spice_reset_cursor(int qid) "%d" +@@ -971,6 +971,8 @@ qxl_spice_reset_memslots(int qid) "%d" + qxl_spice_update_area(int qid, uint32_t surface_id, uint32_t left, uint32_t right, uint32_t top, uint32_t bottom) "%d sid=%d [%d,%d,%d,%d]" + qxl_spice_update_area_rest(int qid, uint32_t num_dirty_rects, uint32_t clear_dirty_region) "%d #d=%d clear=%d" + qxl_surfaces_dirty(int qid, int surface, int offset, int size) "%d surface=%d offset=%d size=%d" ++qxl_send_events(int qid, uint32_t events) "%d %d" ++qxl_set_guest_bug(int qid) "%d" + + # hw/qxl-render.c + qxl_render_blit_guest_primary_initialized(void) "" +-- +1.7.12.1 + diff --git a/0170-configure-usbredir-fixes.patch b/0170-configure-usbredir-fixes.patch new file mode 100644 index 0000000..cf87afa --- /dev/null +++ b/0170-configure-usbredir-fixes.patch @@ -0,0 +1,36 @@ +From 00d9118be03020d3a905bd0a61f74eccd76edee9 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Tue, 11 Sep 2012 20:57:58 +0200 +Subject: [PATCH] configure: usbredir fixes + +usbredir is only used by system emulation, so add the libraries to +libs_softmmu instead of LIBS. + +Cc: Michael Tokarev +Cc: Gerd Hoffmann +Signed-off-by: Aurelien Jarno +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 56ab2ad177dc43d474dc0a0bd84e81ef00f31e11) + +Signed-off-by: Michael Roth +--- + configure | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure b/configure +index a8061c1..dcd8e7b 100755 +--- a/configure ++++ b/configure +@@ -2737,7 +2737,7 @@ if test "$usb_redir" != "no" ; then + usb_redir_cflags=$($pkg_config --cflags libusbredirparser 2>/dev/null) + usb_redir_libs=$($pkg_config --libs libusbredirparser 2>/dev/null) + QEMU_CFLAGS="$QEMU_CFLAGS $usb_redir_cflags" +- LIBS="$LIBS $usb_redir_libs" ++ libs_softmmu="$libs_softmmu $usb_redir_libs" + else + if test "$usb_redir" = "yes"; then + feature_not_found "usb-redir" +-- +1.7.12.1 + diff --git a/0171-ehci-Don-t-set-seen-to-0-when-removing-unseen-queue-.patch b/0171-ehci-Don-t-set-seen-to-0-when-removing-unseen-queue-.patch new file mode 100644 index 0000000..de9f4ac --- /dev/null +++ b/0171-ehci-Don-t-set-seen-to-0-when-removing-unseen-queue-.patch @@ -0,0 +1,104 @@ +From ade9c6dfbbf573c22800d7ff6df7f0de933e7c96 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 12 Sep 2012 15:08:32 +0200 +Subject: [PATCH] ehci: Don't set seen to 0 when removing unseen queue-heads + +When removing unseen queue-heads from the async queue list, we should not +set the seen flag to 0, as this may cause them to be removed by +ehci_queues_rip_unused() during the next call to ehci_advance_async_state() +if the timer is late or running at a low frequency. + +Note: +1) This *may* have caused the instant unlink / relinks described in commit + 9bc3a3a216e2689bfcdd36c3e079333bbdbf3ba0 + +2) Rather then putting more if-s inside ehci_queues_rip_unused, this patch + instead introduces a new ehci_queues_rip_unseen function. + +3) This patch also makes it save to call ehci_queues_rip_unseen() multiple + times, which gets used in the folluw up patch titled: + "ehci: Walk async schedule before and after migration" + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 8f5457eb04140714eaf57a99bc08dc661d83fa87) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 24 ++++++++++++++++++------ + 1 file changed, 18 insertions(+), 6 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 017a01d..bc86460 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -848,10 +848,10 @@ static EHCIQueue *ehci_find_queue_by_qh(EHCIState *ehci, uint32_t addr, + return NULL; + } + +-static void ehci_queues_rip_unused(EHCIState *ehci, int async, int flush) ++static void ehci_queues_rip_unused(EHCIState *ehci, int async) + { + EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues; +- const char *warn = (async && !flush) ? "guest unlinked busy QH" : NULL; ++ const char *warn = async ? "guest unlinked busy QH" : NULL; + uint64_t maxage = FRAME_TIMER_NS * ehci->maxframes * 4; + EHCIQueue *q, *tmp; + +@@ -861,13 +861,25 @@ static void ehci_queues_rip_unused(EHCIState *ehci, int async, int flush) + q->ts = ehci->last_run_ns; + continue; + } +- if (!flush && ehci->last_run_ns < q->ts + maxage) { ++ if (ehci->last_run_ns < q->ts + maxage) { + continue; + } + ehci_free_queue(q, warn); + } + } + ++static void ehci_queues_rip_unseen(EHCIState *ehci, int async) ++{ ++ EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues; ++ EHCIQueue *q, *tmp; ++ ++ QTAILQ_FOREACH_SAFE(q, head, next, tmp) { ++ if (!q->seen) { ++ ehci_free_queue(q, NULL); ++ } ++ } ++} ++ + static void ehci_queues_rip_device(EHCIState *ehci, USBDevice *dev, int async) + { + EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues; +@@ -1700,7 +1712,7 @@ static int ehci_state_waitlisthead(EHCIState *ehci, int async) + ehci_set_usbsts(ehci, USBSTS_REC); + } + +- ehci_queues_rip_unused(ehci, async, 0); ++ ehci_queues_rip_unused(ehci, async); + + /* Find the head of the list (4.9.1.1) */ + for(i = 0; i < MAX_QH; i++) { +@@ -2332,7 +2344,7 @@ static void ehci_advance_async_state(EHCIState *ehci) + */ + if (ehci->usbcmd & USBCMD_IAAD) { + /* Remove all unseen qhs from the async qhs queue */ +- ehci_queues_rip_unused(ehci, async, 1); ++ ehci_queues_rip_unseen(ehci, async); + trace_usb_ehci_doorbell_ack(); + ehci->usbcmd &= ~USBCMD_IAAD; + ehci_raise_irq(ehci, USBSTS_IAA); +@@ -2385,7 +2397,7 @@ static void ehci_advance_periodic_state(EHCIState *ehci) + ehci_set_fetch_addr(ehci, async,entry); + ehci_set_state(ehci, async, EST_FETCHENTRY); + ehci_advance_state(ehci, async); +- ehci_queues_rip_unused(ehci, async, 0); ++ ehci_queues_rip_unused(ehci, async); + break; + + default: +-- +1.7.12.1 + diff --git a/0172-ehci-Walk-async-schedule-before-and-after-migration.patch b/0172-ehci-Walk-async-schedule-before-and-after-migration.patch new file mode 100644 index 0000000..476e41e --- /dev/null +++ b/0172-ehci-Walk-async-schedule-before-and-after-migration.patch @@ -0,0 +1,70 @@ +From 6b145e32e9e219c723b4911aac0a96ea2aa70e77 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 12 Sep 2012 15:08:33 +0200 +Subject: [PATCH] ehci: Walk async schedule before and after migration + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit ceab6f96454fe6589d1b09ce64403c041d79f9d9) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-ehci.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index bc86460..6a5da84 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -34,6 +34,7 @@ + #include "monitor.h" + #include "trace.h" + #include "dma.h" ++#include "sysemu.h" + + #define EHCI_DEBUG 0 + +@@ -2572,6 +2573,32 @@ static int usb_ehci_post_load(void *opaque, int version_id) + return 0; + } + ++static void usb_ehci_vm_state_change(void *opaque, int running, RunState state) ++{ ++ EHCIState *ehci = opaque; ++ ++ /* ++ * We don't migrate the EHCIQueue-s, instead we rebuild them for the ++ * schedule in guest memory. We must do the rebuilt ASAP, so that ++ * USB-devices which have async handled packages have a packet in the ++ * ep queue to match the completion with. ++ */ ++ if (state == RUN_STATE_RUNNING) { ++ ehci_advance_async_state(ehci); ++ } ++ ++ /* ++ * The schedule rebuilt from guest memory could cause the migration dest ++ * to miss a QH unlink, and fail to cancel packets, since the unlinked QH ++ * will never have existed on the destination. Therefor we must flush the ++ * async schedule on savevm to catch any not yet noticed unlinks. ++ */ ++ if (state == RUN_STATE_SAVE_VM) { ++ ehci_advance_async_state(ehci); ++ ehci_queues_rip_unseen(ehci, 1); ++ } ++} ++ + static const VMStateDescription vmstate_ehci = { + .name = "ehci", + .version_id = 2, +@@ -2721,6 +2748,7 @@ static int usb_ehci_initfn(PCIDevice *dev) + usb_packet_init(&s->ipacket); + + qemu_register_reset(ehci_reset, s); ++ qemu_add_vm_change_state_handler(usb_ehci_vm_state_change, s); + + memory_region_init(&s->mem, "ehci", MMIO_SIZE); + memory_region_init_io(&s->mem_caps, &ehci_mmio_caps_ops, s, +-- +1.7.12.1 + diff --git a/0173-usb-redir-Revert-usb-redir-part-of-commit-93bfef4c.patch b/0173-usb-redir-Revert-usb-redir-part-of-commit-93bfef4c.patch new file mode 100644 index 0000000..11125f2 --- /dev/null +++ b/0173-usb-redir-Revert-usb-redir-part-of-commit-93bfef4c.patch @@ -0,0 +1,63 @@ +From 9f6674cd9bf6e0e3bafa8b8ec8388576756a6d13 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 12 Sep 2012 15:08:39 +0200 +Subject: [PATCH] usb-redir: Revert usb-redir part of commit 93bfef4c + +Commit 93bfef4c6e4b23caea9d51e1099d06433d8835a4 makes qemu-devices +which report the qemu version string to the guest in some way use a +qemu_get_version function which reports a machine-specific version string. + +However usb-redir does not expose the qemu version to the guest, only to +the usbredir-host as part of the initial handshake. This can then be logged +on the usbredir-host side for debugging purposes and is otherwise completely +unused! For debugging purposes it is important to have the real qemu version +in there, rather then the machine-specific version. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 35efba2cc6812dc980c336d7b9bf81dbfb5daf00) + +Conflicts: + + hw/usb/redirect.c + +Signed-off-by: Michael Roth +--- + hw/usb/redirect.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index ee75217..ab8d79a 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -134,6 +134,8 @@ static void usbredir_interrupt_packet(void *priv, uint32_t id, + static int usbredir_handle_status(USBRedirDevice *dev, + int status, int actual_len); + ++#define VERSION "qemu usb-redir guest " QEMU_VERSION ++ + /* + * Logging stuff + */ +@@ -777,9 +779,6 @@ static void usbredir_chardev_open(USBRedirDevice *dev) + usbredir_chardev_close_bh(dev); + qemu_bh_cancel(dev->chardev_close_bh); + +- strcpy(version, "qemu usb-redir guest "); +- pstrcat(version, sizeof(version), qemu_get_version()); +- + dev->parser = qemu_oom_check(usbredirparser_create()); + dev->parser->priv = dev; + dev->parser->log_func = usbredir_log; +@@ -805,7 +804,7 @@ static void usbredir_chardev_open(USBRedirDevice *dev) + + usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version); + usbredirparser_caps_set_cap(caps, usb_redir_cap_filter); +- usbredirparser_init(dev->parser, version, caps, USB_REDIR_CAPS_SIZE, 0); ++ usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE, 0); + usbredirparser_do_write(dev->parser); + } + +-- +1.7.12.1 + diff --git a/0174-uhci-Don-t-queue-up-packets-after-one-with-the-SPD-f.patch b/0174-uhci-Don-t-queue-up-packets-after-one-with-the-SPD-f.patch new file mode 100644 index 0000000..a135563 --- /dev/null +++ b/0174-uhci-Don-t-queue-up-packets-after-one-with-the-SPD-f.patch @@ -0,0 +1,47 @@ +From 48dbbecb0b010ff1c6a64a3a18a7272cce314bf8 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 12 Sep 2012 15:08:40 +0200 +Subject: [PATCH] uhci: Don't queue up packets after one with the SPD flag set + +Don't queue up packets after a packet with the SPD (short packet detect) +flag set. Since we won't know if the packet will actually be short until it +has completed, and if it is short we should stop the queue. + +This fixes a miniature photoframe emulating a USB cdrom with the windows +software for it not working. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +(cherry picked from commit 72a04d0c178f01908d74539230d9de64ffc6da19) + +Signed-off-by: Michael Roth +--- + hw/usb/hcd-uhci.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c +index c7c8786..cdc8bc3 100644 +--- a/hw/usb/hcd-uhci.c ++++ b/hw/usb/hcd-uhci.c +@@ -1000,6 +1000,9 @@ static void uhci_fill_queue(UHCIState *s, UHCI_TD *td) + } + assert(ret == TD_RESULT_ASYNC_START); + assert(int_mask == 0); ++ if (ptd.ctrl & TD_CTRL_SPD) { ++ break; ++ } + plink = ptd.link; + } + } +@@ -1097,7 +1100,7 @@ static void uhci_process_frame(UHCIState *s) + + case TD_RESULT_ASYNC_START: + trace_usb_uhci_td_async(curr_qh & ~0xf, link & ~0xf); +- if (is_valid(td.link)) { ++ if (is_valid(td.link) && !(td.ctrl & TD_CTRL_SPD)) { + uhci_fill_queue(s, &td); + } + link = curr_qh ? qh.link : td.link; +-- +1.7.12.1 + diff --git a/0175-slirp-Remove-wrong-type-casts-ins-debug-statements.patch b/0175-slirp-Remove-wrong-type-casts-ins-debug-statements.patch new file mode 100644 index 0000000..365d586 --- /dev/null +++ b/0175-slirp-Remove-wrong-type-casts-ins-debug-statements.patch @@ -0,0 +1,37 @@ +From 3196332dd2ca39a9b06562856b80b825217e3c96 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Tue, 4 Sep 2012 23:20:35 +0200 +Subject: [PATCH] slirp: Remove wrong type casts ins debug statements + +The type casts of pointers to long are not allowed +when sizeof(pointer) != sizeof(long). + +Signed-off-by: Stefan Weil +Signed-off-by: Jan Kiszka +(cherry picked from commit c4d12a743c73a5b88a8705ca68ff620ce0f8bba7) + +Signed-off-by: Michael Roth +--- + slirp/tcp_subr.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c +index 025b374..5890d7a 100644 +--- a/slirp/tcp_subr.c ++++ b/slirp/tcp_subr.c +@@ -114,9 +114,9 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m, + int win = 0; + + DEBUG_CALL("tcp_respond"); +- DEBUG_ARG("tp = %lx", (long)tp); +- DEBUG_ARG("ti = %lx", (long)ti); +- DEBUG_ARG("m = %lx", (long)m); ++ DEBUG_ARG("tp = %p", tp); ++ DEBUG_ARG("ti = %p", ti); ++ DEBUG_ARG("m = %p", m); + DEBUG_ARG("ack = %u", ack); + DEBUG_ARG("seq = %u", seq); + DEBUG_ARG("flags = %x", flags); +-- +1.7.12.1 + diff --git a/0176-slirp-Fix-error-reported-by-static-code-analysis.patch b/0176-slirp-Fix-error-reported-by-static-code-analysis.patch new file mode 100644 index 0000000..7f2a90a --- /dev/null +++ b/0176-slirp-Fix-error-reported-by-static-code-analysis.patch @@ -0,0 +1,37 @@ +From b88c1cb2b263de9ffc3dcaa2822ef7b1fbd8575a Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Tue, 4 Sep 2012 23:20:36 +0200 +Subject: [PATCH] slirp: Fix error reported by static code analysis + +Report from smatch: + +slirp/tcp_subr.c:127 tcp_respond(17) error: + we previously assumed 'tp' could be null (see line 124) + +Return if 'tp' is NULL. + +Signed-off-by: Stefan Weil +Signed-off-by: Jan Kiszka +(cherry picked from commit e56afbc54a2132c56931f44bae1992c28119944f) + +Signed-off-by: Michael Roth +--- + slirp/tcp_subr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c +index 5890d7a..1542e43 100644 +--- a/slirp/tcp_subr.c ++++ b/slirp/tcp_subr.c +@@ -124,7 +124,7 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m, + if (tp) + win = sbspace(&tp->t_socket->so_rcv); + if (m == NULL) { +- if ((m = m_get(tp->t_socket->slirp)) == NULL) ++ if (!tp || (m = m_get(tp->t_socket->slirp)) == NULL) + return; + tlen = 0; + m->m_data += IF_MAXLINKHDR; +-- +1.7.12.1 + diff --git a/0177-slirp-improve-TFTP-performance.patch b/0177-slirp-improve-TFTP-performance.patch new file mode 100644 index 0000000..65dce5d --- /dev/null +++ b/0177-slirp-improve-TFTP-performance.patch @@ -0,0 +1,106 @@ +From c1b408d0c9d836e0a95d1e0695c0c6c605ceb368 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= +Date: Mon, 10 Sep 2012 20:52:25 +0200 +Subject: [PATCH] slirp: improve TFTP performance +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When transferring a file, keep it open during the whole transfer, +instead of opening/closing it for each block. + +Signed-off-by: Hervé Poussineau +Reviewed-by: Aurelien Jarno +Signed-off-by: Jan Kiszka +(cherry picked from commit 78be056628c76ff73eedeade86fde44b97343c79) + +Signed-off-by: Michael Roth +--- + slirp/tftp.c | 32 ++++++++++++++++++-------------- + slirp/tftp.h | 1 + + 2 files changed, 19 insertions(+), 14 deletions(-) + +diff --git a/slirp/tftp.c b/slirp/tftp.c +index b78765f..520dbd6 100644 +--- a/slirp/tftp.c ++++ b/slirp/tftp.c +@@ -37,6 +37,10 @@ static inline void tftp_session_update(struct tftp_session *spt) + + static void tftp_session_terminate(struct tftp_session *spt) + { ++ if (spt->fd >= 0) { ++ close(spt->fd); ++ spt->fd = -1; ++ } + g_free(spt->filename); + spt->slirp = NULL; + } +@@ -54,7 +58,7 @@ static int tftp_session_allocate(Slirp *slirp, struct tftp_t *tp) + + /* sessions time out after 5 inactive seconds */ + if ((int)(curtime - spt->timestamp) > 5000) { +- g_free(spt->filename); ++ tftp_session_terminate(spt); + goto found; + } + } +@@ -64,6 +68,7 @@ static int tftp_session_allocate(Slirp *slirp, struct tftp_t *tp) + found: + memset(spt, 0, sizeof(*spt)); + memcpy(&spt->client_ip, &tp->ip.ip_src, sizeof(spt->client_ip)); ++ spt->fd = -1; + spt->client_port = tp->udp.uh_sport; + spt->slirp = slirp; + +@@ -95,24 +100,23 @@ static int tftp_session_find(Slirp *slirp, struct tftp_t *tp) + static int tftp_read_data(struct tftp_session *spt, uint16_t block_nr, + uint8_t *buf, int len) + { +- int fd; +- int bytes_read = 0; +- +- fd = open(spt->filename, O_RDONLY | O_BINARY); ++ int bytes_read = 0; + +- if (fd < 0) { +- return -1; +- } ++ if (spt->fd < 0) { ++ spt->fd = open(spt->filename, O_RDONLY | O_BINARY); ++ } + +- if (len) { +- lseek(fd, block_nr * 512, SEEK_SET); ++ if (spt->fd < 0) { ++ return -1; ++ } + +- bytes_read = read(fd, buf, len); +- } ++ if (len) { ++ lseek(spt->fd, block_nr * 512, SEEK_SET); + +- close(fd); ++ bytes_read = read(spt->fd, buf, len); ++ } + +- return bytes_read; ++ return bytes_read; + } + + static int tftp_send_oack(struct tftp_session *spt, +diff --git a/slirp/tftp.h b/slirp/tftp.h +index 72e5e91..9c364ea 100644 +--- a/slirp/tftp.h ++++ b/slirp/tftp.h +@@ -33,6 +33,7 @@ struct tftp_t { + struct tftp_session { + Slirp *slirp; + char *filename; ++ int fd; + + struct in_addr client_ip; + uint16_t client_port; +-- +1.7.12.1 + diff --git a/0178-slirp-Handle-more-than-65535-blocks-in-TFTP-transfer.patch b/0178-slirp-Handle-more-than-65535-blocks-in-TFTP-transfer.patch new file mode 100644 index 0000000..0a87572 --- /dev/null +++ b/0178-slirp-Handle-more-than-65535-blocks-in-TFTP-transfer.patch @@ -0,0 +1,121 @@ +From 5579c7740b29be4766ace824af36acb9ab254ecb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= +Date: Thu, 13 Sep 2012 12:39:36 +0200 +Subject: [PATCH] slirp: Handle more than 65535 blocks in TFTP transfers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +RFC 1350 does not mention block count roll-over. However, a lot of TFTP servers +implement it to be able to transmit big files, so do it also. + +Current block size is 512 bytes, so TFTP files were limited to 32 MB. + +Signed-off-by: Hervé Poussineau +Signed-off-by: Jan Kiszka +(cherry picked from commit 4aa401f39e048e71020cceb59f126ab941095a42) + +Signed-off-by: Michael Roth +--- + slirp/tftp.c | 24 ++++++++++-------------- + slirp/tftp.h | 1 + + 2 files changed, 11 insertions(+), 14 deletions(-) + +diff --git a/slirp/tftp.c b/slirp/tftp.c +index 520dbd6..c6a5df2 100644 +--- a/slirp/tftp.c ++++ b/slirp/tftp.c +@@ -97,7 +97,7 @@ static int tftp_session_find(Slirp *slirp, struct tftp_t *tp) + return -1; + } + +-static int tftp_read_data(struct tftp_session *spt, uint16_t block_nr, ++static int tftp_read_data(struct tftp_session *spt, uint32_t block_nr, + uint8_t *buf, int len) + { + int bytes_read = 0; +@@ -197,19 +197,14 @@ out: + tftp_session_terminate(spt); + } + +-static int tftp_send_data(struct tftp_session *spt, +- uint16_t block_nr, +- struct tftp_t *recv_tp) ++static int tftp_send_next_block(struct tftp_session *spt, ++ struct tftp_t *recv_tp) + { + struct sockaddr_in saddr, daddr; + struct mbuf *m; + struct tftp_t *tp; + int nobytes; + +- if (block_nr < 1) { +- return -1; +- } +- + m = m_get(spt->slirp); + + if (!m) { +@@ -223,7 +218,7 @@ static int tftp_send_data(struct tftp_session *spt, + m->m_data += sizeof(struct udpiphdr); + + tp->tp_op = htons(TFTP_DATA); +- tp->x.tp_data.tp_block_nr = htons(block_nr); ++ tp->x.tp_data.tp_block_nr = htons((spt->block_nr + 1) & 0xffff); + + saddr.sin_addr = recv_tp->ip.ip_dst; + saddr.sin_port = recv_tp->udp.uh_dport; +@@ -231,7 +226,7 @@ static int tftp_send_data(struct tftp_session *spt, + daddr.sin_addr = spt->client_ip; + daddr.sin_port = spt->client_port; + +- nobytes = tftp_read_data(spt, block_nr - 1, tp->x.tp_data.tp_buf, 512); ++ nobytes = tftp_read_data(spt, spt->block_nr, tp->x.tp_data.tp_buf, 512); + + if (nobytes < 0) { + m_free(m); +@@ -255,6 +250,7 @@ static int tftp_send_data(struct tftp_session *spt, + tftp_session_terminate(spt); + } + ++ spt->block_nr++; + return 0; + } + +@@ -373,7 +369,8 @@ static void tftp_handle_rrq(Slirp *slirp, struct tftp_t *tp, int pktlen) + } + } + +- tftp_send_data(spt, 1, tp); ++ spt->block_nr = 0; ++ tftp_send_next_block(spt, tp); + } + + static void tftp_handle_ack(Slirp *slirp, struct tftp_t *tp, int pktlen) +@@ -386,9 +383,8 @@ static void tftp_handle_ack(Slirp *slirp, struct tftp_t *tp, int pktlen) + return; + } + +- if (tftp_send_data(&slirp->tftp_sessions[s], +- ntohs(tp->x.tp_data.tp_block_nr) + 1, +- tp) < 0) { ++ if (tftp_send_next_block(&slirp->tftp_sessions[s], ++ tp) < 0) { + return; + } + } +diff --git a/slirp/tftp.h b/slirp/tftp.h +index 9c364ea..51704e4 100644 +--- a/slirp/tftp.h ++++ b/slirp/tftp.h +@@ -37,6 +37,7 @@ struct tftp_session { + + struct in_addr client_ip; + uint16_t client_port; ++ uint32_t block_nr; + + int timestamp; + }; +-- +1.7.12.1 + diff --git a/0179-slirp-Implement-TFTP-Blocksize-option.patch b/0179-slirp-Implement-TFTP-Blocksize-option.patch new file mode 100644 index 0000000..38ebba3 --- /dev/null +++ b/0179-slirp-Implement-TFTP-Blocksize-option.patch @@ -0,0 +1,123 @@ +From e070dc7276c7958c322ca0fbf5ac10e639502b4d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= +Date: Thu, 13 Sep 2012 07:55:01 +0200 +Subject: [PATCH] slirp: Implement TFTP Blocksize option +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This option is described in RFC 1783. As this is only an optional field, +we may ignore it in some situations and handle it in some others. + +However, MS Windows 2003 PXE boot client requests a block size of the MTU +(most of the times 1472 bytes), and doesn't work if the option is not +acknowledged (with whatever value). + +According to the RFC 1783, we cannot acknowledge the option with a bigger +value than the requested one. + +As current implementation is using 512 bytes by block, accept the option +with a value of 512 if the option was specified, and don't acknowledge it +if it is not present or less than 512 bytes. + +Signed-off-by: Hervé Poussineau +Signed-off-by: Jan Kiszka +(cherry picked from commit 95b1ad7ad86793c27ab8e9987be69571937900d1) + +Signed-off-by: Michael Roth +--- + slirp/tftp.c | 42 +++++++++++++++++++++++++++++++++--------- + 1 file changed, 33 insertions(+), 9 deletions(-) + +diff --git a/slirp/tftp.c b/slirp/tftp.c +index c6a5df2..37b0387 100644 +--- a/slirp/tftp.c ++++ b/slirp/tftp.c +@@ -120,13 +120,13 @@ static int tftp_read_data(struct tftp_session *spt, uint32_t block_nr, + } + + static int tftp_send_oack(struct tftp_session *spt, +- const char *key, uint32_t value, ++ const char *keys[], uint32_t values[], int nb, + struct tftp_t *recv_tp) + { + struct sockaddr_in saddr, daddr; + struct mbuf *m; + struct tftp_t *tp; +- int n = 0; ++ int i, n = 0; + + m = m_get(spt->slirp); + +@@ -140,10 +140,12 @@ static int tftp_send_oack(struct tftp_session *spt, + m->m_data += sizeof(struct udpiphdr); + + tp->tp_op = htons(TFTP_OACK); +- n += snprintf(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%s", +- key) + 1; +- n += snprintf(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%u", +- value) + 1; ++ for (i = 0; i < nb; i++) { ++ n += snprintf(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%s", ++ keys[i]) + 1; ++ n += snprintf(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%u", ++ values[i]) + 1; ++ } + + saddr.sin_addr = recv_tp->ip.ip_dst; + saddr.sin_port = recv_tp->udp.uh_dport; +@@ -260,6 +262,9 @@ static void tftp_handle_rrq(Slirp *slirp, struct tftp_t *tp, int pktlen) + int s, k; + size_t prefix_len; + char *req_fname; ++ const char *option_name[2]; ++ uint32_t option_value[2]; ++ int nb_options = 0; + + /* check if a session already exists and if so terminate it */ + s = tftp_session_find(slirp, tp); +@@ -337,7 +342,7 @@ static void tftp_handle_rrq(Slirp *slirp, struct tftp_t *tp, int pktlen) + return; + } + +- while (k < pktlen) { ++ while (k < pktlen && nb_options < ARRAY_SIZE(option_name)) { + const char *key, *value; + + key = &tp->x.tp_buf[k]; +@@ -364,11 +369,30 @@ static void tftp_handle_rrq(Slirp *slirp, struct tftp_t *tp, int pktlen) + } + } + +- tftp_send_oack(spt, "tsize", tsize, tp); +- return; ++ option_name[nb_options] = "tsize"; ++ option_value[nb_options] = tsize; ++ nb_options++; ++ } else if (strcasecmp(key, "blksize") == 0) { ++ int blksize = atoi(value); ++ ++ /* If blksize option is bigger than what we will ++ * emit, accept the option with our packet size. ++ * Otherwise, simply do as we didn't see the option. ++ */ ++ if (blksize >= 512) { ++ option_name[nb_options] = "blksize"; ++ option_value[nb_options] = 512; ++ nb_options++; ++ } + } + } + ++ if (nb_options > 0) { ++ assert(nb_options <= ARRAY_SIZE(option_name)); ++ tftp_send_oack(spt, option_name, option_value, nb_options, tp); ++ return; ++ } ++ + spt->block_nr = 0; + tftp_send_next_block(spt, tp); + } +-- +1.7.12.1 + diff --git a/0180-srp-Don-t-use-QEMU_PACKED-for-single-elements-of-a-s.patch b/0180-srp-Don-t-use-QEMU_PACKED-for-single-elements-of-a-s.patch new file mode 100644 index 0000000..00cb718 --- /dev/null +++ b/0180-srp-Don-t-use-QEMU_PACKED-for-single-elements-of-a-s.patch @@ -0,0 +1,63 @@ +From 66cbaa761bc0f6d528957f9e3bc5762acb7f5f1c Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Fri, 10 Aug 2012 22:03:27 +0200 +Subject: [PATCH] srp: Don't use QEMU_PACKED for single elements of a + structured type + +QEMU_PACKED results in a MinGW compiler warning when it is +used for single structure elements: + +warning: 'gcc_struct' attribute ignored + +Using QEMU_PACKED for the whole structure avoids the compiler warning +without changing the memory layout. + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 93d3ad2a8048469d2b2bb157697425b66b2a37aa) + +Signed-off-by: Michael Roth +--- + hw/srp.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/hw/srp.h b/hw/srp.h +index 3009bd5..5e0cad5 100644 +--- a/hw/srp.h ++++ b/hw/srp.h +@@ -177,13 +177,13 @@ struct srp_tsk_mgmt { + uint8_t reserved1[6]; + uint64_t tag; + uint8_t reserved2[4]; +- uint64_t lun QEMU_PACKED; ++ uint64_t lun; + uint8_t reserved3[2]; + uint8_t tsk_mgmt_func; + uint8_t reserved4; + uint64_t task_tag; + uint8_t reserved5[8]; +-}; ++} QEMU_PACKED; + + /* + * We need the packed attribute because the SRP spec only aligns the +@@ -198,14 +198,14 @@ struct srp_cmd { + uint8_t data_in_desc_cnt; + uint64_t tag; + uint8_t reserved2[4]; +- uint64_t lun QEMU_PACKED; ++ uint64_t lun; + uint8_t reserved3; + uint8_t task_attr; + uint8_t reserved4; + uint8_t add_cdb_len; + uint8_t cdb[16]; + uint8_t add_data[0]; +-}; ++} QEMU_PACKED; + + enum { + SRP_RSP_FLAG_RSPVALID = 1 << 0, +-- +1.7.12.1 + diff --git a/0181-Spelling-fixes-in-comments-and-documentation.patch b/0181-Spelling-fixes-in-comments-and-documentation.patch new file mode 100644 index 0000000..5b696ed --- /dev/null +++ b/0181-Spelling-fixes-in-comments-and-documentation.patch @@ -0,0 +1,183 @@ +From ca94ceccca88d284e5d638961b21bd83eac944db Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Fri, 10 Aug 2012 22:03:25 +0200 +Subject: [PATCH] Spelling fixes in comments and documentation + +These wrong spellings were detected by codespell: + +* successully -> successfully + +* alot -> a lot + +* wanna -> want to + +* infomation -> information + +* occured -> occurred + +["also is" -> "is also" and "ressources" -> "resources" suggested by +Peter Maydell ] + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 0546b8c2f089867cd7606ff47e026e8931157828) + +Signed-off-by: Michael Roth +--- + docs/specs/ppc-spapr-hcalls.txt | 2 +- + docs/usb2.txt | 4 ++-- + hw/xen_pt.h | 4 ++-- + hw/xen_pt_config_init.c | 14 +++++++------- + qemu-img.c | 2 +- + qemu-img.texi | 2 +- + 6 files changed, 14 insertions(+), 14 deletions(-) + +diff --git a/docs/specs/ppc-spapr-hcalls.txt b/docs/specs/ppc-spapr-hcalls.txt +index 52ba8d4..667b3fa 100644 +--- a/docs/specs/ppc-spapr-hcalls.txt ++++ b/docs/specs/ppc-spapr-hcalls.txt +@@ -31,7 +31,7 @@ Arguments: + + Returns: + +- H_SUCCESS : Successully called the RTAS function (RTAS result ++ H_SUCCESS : Successfully called the RTAS function (RTAS result + will have been stored in the parameter block) + H_PARAMETER : Unknown token + +diff --git a/docs/usb2.txt b/docs/usb2.txt +index d17e3c0..43dacde 100644 +--- a/docs/usb2.txt ++++ b/docs/usb2.txt +@@ -58,11 +58,11 @@ try ... + xhci controller support + ----------------------- + +-There also is xhci host controller support available. It got alot ++There is also xhci host controller support available. It got a lot + less testing than ehci and there are a bunch of known limitations, so + ehci may work better for you. On the other hand the xhci hardware + design is much more virtualization-friendly, thus xhci emulation uses +-less ressources (especially cpu). If you wanna give xhci a try ++less resources (especially cpu). If you want to give xhci a try + use this to add the host controller ... + + qemu -device nec-usb-xhci,id=xhci +diff --git a/hw/xen_pt.h b/hw/xen_pt.h +index 41904ec..112477a 100644 +--- a/hw/xen_pt.h ++++ b/hw/xen_pt.h +@@ -96,7 +96,7 @@ typedef struct XenPTRegion { + * - do NOT use ALL F for init_val, otherwise the tbl will not be registered. + */ + +-/* emulated register infomation */ ++/* emulated register information */ + struct XenPTRegInfo { + uint32_t offset; + uint32_t size; +@@ -140,7 +140,7 @@ typedef int (*xen_pt_reg_size_init_fn) + (XenPCIPassthroughState *, const XenPTRegGroupInfo *, + uint32_t base_offset, uint8_t *size); + +-/* emulated register group infomation */ ++/* emulated register group information */ + struct XenPTRegGroupInfo { + uint8_t grp_id; + XenPTRegisterGroupType grp_type; +diff --git a/hw/xen_pt_config_init.c b/hw/xen_pt_config_init.c +index 00eb3d9..e524a40 100644 +--- a/hw/xen_pt_config_init.c ++++ b/hw/xen_pt_config_init.c +@@ -562,7 +562,7 @@ static int xen_pt_exp_rom_bar_reg_write(XenPCIPassthroughState *s, + return 0; + } + +-/* Header Type0 reg static infomation table */ ++/* Header Type0 reg static information table */ + static XenPTRegInfo xen_pt_emu_reg_header0[] = { + /* Vendor ID reg */ + { +@@ -753,7 +753,7 @@ static XenPTRegInfo xen_pt_emu_reg_header0[] = { + * Vital Product Data Capability + */ + +-/* Vital Product Data Capability Structure reg static infomation table */ ++/* Vital Product Data Capability Structure reg static information table */ + static XenPTRegInfo xen_pt_emu_reg_vpd[] = { + { + .offset = PCI_CAP_LIST_NEXT, +@@ -775,7 +775,7 @@ static XenPTRegInfo xen_pt_emu_reg_vpd[] = { + * Vendor Specific Capability + */ + +-/* Vendor Specific Capability Structure reg static infomation table */ ++/* Vendor Specific Capability Structure reg static information table */ + static XenPTRegInfo xen_pt_emu_reg_vendor[] = { + { + .offset = PCI_CAP_LIST_NEXT, +@@ -866,7 +866,7 @@ static int xen_pt_linkctrl2_reg_init(XenPCIPassthroughState *s, + return 0; + } + +-/* PCI Express Capability Structure reg static infomation table */ ++/* PCI Express Capability Structure reg static information table */ + static XenPTRegInfo xen_pt_emu_reg_pcie[] = { + /* Next Pointer reg */ + { +@@ -981,7 +981,7 @@ static int xen_pt_pmcsr_reg_write(XenPCIPassthroughState *s, + return 0; + } + +-/* Power Management Capability reg static infomation table */ ++/* Power Management Capability reg static information table */ + static XenPTRegInfo xen_pt_emu_reg_pm[] = { + /* Next Pointer reg */ + { +@@ -1259,7 +1259,7 @@ static int xen_pt_msgdata_reg_write(XenPCIPassthroughState *s, + return 0; + } + +-/* MSI Capability Structure reg static infomation table */ ++/* MSI Capability Structure reg static information table */ + static XenPTRegInfo xen_pt_emu_reg_msi[] = { + /* Next Pointer reg */ + { +@@ -1396,7 +1396,7 @@ static int xen_pt_msixctrl_reg_write(XenPCIPassthroughState *s, + return 0; + } + +-/* MSI-X Capability Structure reg static infomation table */ ++/* MSI-X Capability Structure reg static information table */ + static XenPTRegInfo xen_pt_emu_reg_msix[] = { + /* Next Pointer reg */ + { +diff --git a/qemu-img.c b/qemu-img.c +index 0d208e8..7615e91 100644 +--- a/qemu-img.c ++++ b/qemu-img.c +@@ -89,7 +89,7 @@ static void help(void) + " '-r' tries to repair any inconsistencies that are found during the check.\n" + " '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all\n" + " kinds of errors, with a higher risk of choosing the wrong fix or\n" +- " hiding corruption that has already occured.\n" ++ " hiding corruption that has already occurred.\n" + "\n" + "Parameters to snapshot subcommand:\n" + " 'snapshot' is the name of the snapshot to create, apply or delete\n" +diff --git a/qemu-img.texi b/qemu-img.texi +index 6b42e35..360543b 100644 +--- a/qemu-img.texi ++++ b/qemu-img.texi +@@ -87,7 +87,7 @@ Perform a consistency check on the disk image @var{filename}. + If @code{-r} is specified, qemu-img tries to repair any inconsistencies found + during the check. @code{-r leaks} repairs only cluster leaks, whereas + @code{-r all} fixes all kinds of errors, with a higher risk of choosing the +-wrong fix or hiding corruption that has already occured. ++wrong fix or hiding corruption that has already occurred. + + Only the formats @code{qcow2}, @code{qed} and @code{vdi} support + consistency checks. +-- +1.7.12.1 + diff --git a/0182-console-Clean-up-bytes-per-pixel-calculation.patch b/0182-console-Clean-up-bytes-per-pixel-calculation.patch new file mode 100644 index 0000000..7815a2d --- /dev/null +++ b/0182-console-Clean-up-bytes-per-pixel-calculation.patch @@ -0,0 +1,51 @@ +From 9c6751bf2b2c817c3f52a638566b99125a0ba0f1 Mon Sep 17 00:00:00 2001 +From: BALATON Zoltan +Date: Wed, 22 Aug 2012 17:19:42 +0200 +Subject: [PATCH] console: Clean up bytes per pixel calculation + +Division with round up is the correct way to compute this even if the +only case where division with round down gives incorrect result is +probably 15 bpp. This case was explicitely patched up in one of these +functions but was unhandled in the other. (I'm not sure about setting +16 bpp for the 15bpp case either but I left that there for now.) + +Signed-off-by: BALATON Zoltan +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit feadf1a4de0d7468ffb671a2b9f681925469fa58) + +Signed-off-by: Michael Roth +--- + console.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/console.c b/console.c +index 3b5cabb..8b5e21d 100644 +--- a/console.c ++++ b/console.c +@@ -1611,7 +1611,7 @@ PixelFormat qemu_different_endianness_pixelformat(int bpp) + memset(&pf, 0x00, sizeof(PixelFormat)); + + pf.bits_per_pixel = bpp; +- pf.bytes_per_pixel = bpp / 8; ++ pf.bytes_per_pixel = DIV_ROUND_UP(bpp, 8); + pf.depth = bpp == 32 ? 24 : bpp; + + switch (bpp) { +@@ -1660,13 +1660,12 @@ PixelFormat qemu_default_pixelformat(int bpp) + memset(&pf, 0x00, sizeof(PixelFormat)); + + pf.bits_per_pixel = bpp; +- pf.bytes_per_pixel = bpp / 8; ++ pf.bytes_per_pixel = DIV_ROUND_UP(bpp, 8); + pf.depth = bpp == 32 ? 24 : bpp; + + switch (bpp) { + case 15: + pf.bits_per_pixel = 16; +- pf.bytes_per_pixel = 2; + pf.rmask = 0x00007c00; + pf.gmask = 0x000003E0; + pf.bmask = 0x0000001F; +-- +1.7.12.1 + diff --git a/0183-qapi-Fix-enumeration-typo-error.patch b/0183-qapi-Fix-enumeration-typo-error.patch new file mode 100644 index 0000000..8fc3e9f --- /dev/null +++ b/0183-qapi-Fix-enumeration-typo-error.patch @@ -0,0 +1,54 @@ +From 0ac82308def3b77162f0d9cecb11e6ffd2bd7939 Mon Sep 17 00:00:00 2001 +From: Lei Li +Date: Thu, 23 Aug 2012 13:14:25 +0800 +Subject: [PATCH] qapi: Fix enumeration typo error + +Signed-off-by: Lei Li +Reviewed-by: Luiz Capitulino +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 6932a69b20a88428c531805cdd20eec8acf05b27) + +Signed-off-by: Michael Roth +--- + qapi-schema-guest.json | 2 +- + qapi-schema.json | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/qapi-schema-guest.json b/qapi-schema-guest.json +index d955cf1..ed0eb69 100644 +--- a/qapi-schema-guest.json ++++ b/qapi-schema-guest.json +@@ -293,7 +293,7 @@ + ## + # @GuestFsFreezeStatus + # +-# An enumation of filesystem freeze states ++# An enumeration of filesystem freeze states + # + # @thawed: filesystems thawed/unfrozen + # +diff --git a/qapi-schema.json b/qapi-schema.json +index 8ddde12..29dacb5 100644 +--- a/qapi-schema.json ++++ b/qapi-schema.json +@@ -118,7 +118,7 @@ + ## + # @RunState + # +-# An enumation of VM run states. ++# An enumeration of VM run states. + # + # @debug: QEMU is running on a debugger + # +@@ -785,7 +785,7 @@ + ## + # @SpiceQueryMouseMode + # +-# An enumation of Spice mouse states. ++# An enumeration of Spice mouse states. + # + # @client: Mouse cursor position is determined by the client. + # +-- +1.7.12.1 + diff --git a/0184-kvm-Fix-warning-from-static-code-analysis.patch b/0184-kvm-Fix-warning-from-static-code-analysis.patch new file mode 100644 index 0000000..87ad81d --- /dev/null +++ b/0184-kvm-Fix-warning-from-static-code-analysis.patch @@ -0,0 +1,49 @@ +From 0a8b8d39763f05c7862dceec9d4f44e902a9d192 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Mon, 3 Sep 2012 22:40:40 +0200 +Subject: [PATCH] kvm: Fix warning from static code analysis + +Report from smatch: + +kvm-all.c:1373 kvm_init(135) warn: + variable dereferenced before check 's' (see line 1360) + +'s' cannot by NULL (it was alloced using g_malloc0), so there is no need +to check it here. + +Signed-off-by: Stefan Weil +Reviewed-by: Peter Maydell +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 6d1cc3210ccc4372ffa337c187da9db68314c0c4) + +Signed-off-by: Michael Roth +--- + kvm-all.c | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +diff --git a/kvm-all.c b/kvm-all.c +index 90c71f9..08d6051 100644 +--- a/kvm-all.c ++++ b/kvm-all.c +@@ -1419,13 +1419,11 @@ int kvm_init(void) + return 0; + + err: +- if (s) { +- if (s->vmfd >= 0) { +- close(s->vmfd); +- } +- if (s->fd != -1) { +- close(s->fd); +- } ++ if (s->vmfd >= 0) { ++ close(s->vmfd); ++ } ++ if (s->fd != -1) { ++ close(s->fd); + } + g_free(s); + +-- +1.7.12.1 + diff --git a/0185-arch_init.c-add-missing-symbols-before-PRIu64-in-deb.patch b/0185-arch_init.c-add-missing-symbols-before-PRIu64-in-deb.patch new file mode 100644 index 0000000..7fcc366 --- /dev/null +++ b/0185-arch_init.c-add-missing-symbols-before-PRIu64-in-deb.patch @@ -0,0 +1,54 @@ +From df075bd97f2d88969e3178ec9cb302f955d31737 Mon Sep 17 00:00:00 2001 +From: Igor Mitsyanko +Date: Wed, 5 Sep 2012 13:04:56 +0400 +Subject: [PATCH] arch_init.c: add missing '%' symbols before PRIu64 in debug + printfs + +'%' symbols were missing in front of PRIu64 macros in DPRINTF() messages in +arch_init.c, this caused compilation warnings when compiled with DEBUG_ARCH_INIT defined. + +Signed-off-by: Igor Mitsyanko +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit ef37a699a06f96e098ee00683b7052b5fbb6ad7d) + +Signed-off-by: Michael Roth +--- + arch_init.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch_init.c b/arch_init.c +index 5a1173e..47977de 100644 +--- a/arch_init.c ++++ b/arch_init.c +@@ -562,7 +562,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) + if ((i & 63) == 0) { + uint64_t t1 = (qemu_get_clock_ns(rt_clock) - bwidth) / 1000000; + if (t1 > MAX_WAIT) { +- DPRINTF("big wait: " PRIu64 " milliseconds, %d iterations\n", ++ DPRINTF("big wait: %" PRIu64 " milliseconds, %d iterations\n", + t1, i); + break; + } +@@ -587,7 +587,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) + + expected_time = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth; + +- DPRINTF("ram_save_live: expected(" PRIu64 ") <= max(" PRIu64 ")?\n", ++ DPRINTF("ram_save_live: expected(%" PRIu64 ") <= max(%" PRIu64 ")?\n", + expected_time, migrate_max_downtime()); + + if (expected_time <= migrate_max_downtime()) { +@@ -799,8 +799,8 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) + } while (!(flags & RAM_SAVE_FLAG_EOS)); + + done: +- DPRINTF("Completed load of VM with exit code %d seq iteration " PRIu64 "\n", +- ret, seq_iter); ++ DPRINTF("Completed load of VM with exit code %d seq iteration " ++ "%" PRIu64 "\n", ret, seq_iter); + return ret; + } + +-- +1.7.12.1 + diff --git a/0186-net-notify-iothread-after-flushing-queue.patch b/0186-net-notify-iothread-after-flushing-queue.patch new file mode 100644 index 0000000..b6a9f65 --- /dev/null +++ b/0186-net-notify-iothread-after-flushing-queue.patch @@ -0,0 +1,105 @@ +From 7d797af90c5293b518a072da9b23ec14a1a917f7 Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Thu, 9 Aug 2012 16:45:55 +0200 +Subject: [PATCH] net: notify iothread after flushing queue + +virtio-net has code to flush the queue and notify the iothread +whenever new receive buffers are added by the guest. That is +fine, and indeed we need to do the same in all other drivers. +However, notifying the iothread should be work for the network +subsystem. And since we are at it we can add a little smartness: +if some of the queued packets already could not be delivered, +there is no need to notify the iothread. + +Reported-by: Luigi Rizzo +Cc: Stefan Hajnoczi +Cc: Jan Kiszka +Signed-off-by: Paolo Bonzini +Reviewed-by: Amos Kong +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 987a9b4800003567b1a47a379255e886a77d57ea) + +Signed-off-by: Michael Roth +--- + hw/virtio-net.c | 4 ---- + net.c | 7 ++++++- + net/queue.c | 5 +++-- + net/queue.h | 2 +- + 4 files changed, 10 insertions(+), 8 deletions(-) + +diff --git a/hw/virtio-net.c b/hw/virtio-net.c +index b1998b2..6490743 100644 +--- a/hw/virtio-net.c ++++ b/hw/virtio-net.c +@@ -447,10 +447,6 @@ static void virtio_net_handle_rx(VirtIODevice *vdev, VirtQueue *vq) + VirtIONet *n = to_virtio_net(vdev); + + qemu_flush_queued_packets(&n->nic->nc); +- +- /* We now have RX buffers, signal to the IO thread to break out of the +- * select to re-poll the tap file descriptor */ +- qemu_notify_event(); + } + + static int virtio_net_can_receive(NetClientState *nc) +diff --git a/net.c b/net.c +index 60043dd..76a8336 100644 +--- a/net.c ++++ b/net.c +@@ -357,7 +357,12 @@ void qemu_flush_queued_packets(NetClientState *nc) + { + nc->receive_disabled = 0; + +- qemu_net_queue_flush(nc->send_queue); ++ if (qemu_net_queue_flush(nc->send_queue)) { ++ /* We emptied the queue successfully, signal to the IO thread to repoll ++ * the file descriptor (for tap, for example). ++ */ ++ qemu_notify_event(); ++ } + } + + static ssize_t qemu_send_packet_async_with_flags(NetClientState *sender, +diff --git a/net/queue.c b/net/queue.c +index e8030aa..6e64091 100644 +--- a/net/queue.c ++++ b/net/queue.c +@@ -228,7 +228,7 @@ void qemu_net_queue_purge(NetQueue *queue, NetClientState *from) + } + } + +-void qemu_net_queue_flush(NetQueue *queue) ++bool qemu_net_queue_flush(NetQueue *queue) + { + while (!QTAILQ_EMPTY(&queue->packets)) { + NetPacket *packet; +@@ -244,7 +244,7 @@ void qemu_net_queue_flush(NetQueue *queue) + packet->size); + if (ret == 0) { + QTAILQ_INSERT_HEAD(&queue->packets, packet, entry); +- break; ++ return false; + } + + if (packet->sent_cb) { +@@ -253,4 +253,5 @@ void qemu_net_queue_flush(NetQueue *queue) + + g_free(packet); + } ++ return true; + } +diff --git a/net/queue.h b/net/queue.h +index 9d44a9b..fc02b33 100644 +--- a/net/queue.h ++++ b/net/queue.h +@@ -53,6 +53,6 @@ ssize_t qemu_net_queue_send_iov(NetQueue *queue, + NetPacketSent *sent_cb); + + void qemu_net_queue_purge(NetQueue *queue, NetClientState *from); +-void qemu_net_queue_flush(NetQueue *queue); ++bool qemu_net_queue_flush(NetQueue *queue); + + #endif /* QEMU_NET_QUEUE_H */ +-- +1.7.12.1 + diff --git a/0187-e1000-flush-queue-whenever-can_receive-can-go-from-f.patch b/0187-e1000-flush-queue-whenever-can_receive-can-go-from-f.patch new file mode 100644 index 0000000..9d61ff8 --- /dev/null +++ b/0187-e1000-flush-queue-whenever-can_receive-can-go-from-f.patch @@ -0,0 +1,51 @@ +From a71b6050a88402c3f388b8f13afed51e6ba6f41a Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Thu, 9 Aug 2012 16:45:56 +0200 +Subject: [PATCH] e1000: flush queue whenever can_receive can go from false to + true + +When the guests replenish the receive ring buffer, the network device +should flush its queue of pending packets. This is done with +qemu_flush_queued_packets. + +e1000's can_receive can go from false to true when RCTL or RDT are +modified. + +Reported-by: Luigi Rizzo +Cc: Stefan Hajnoczi +Cc: Jan Kiszka +Signed-off-by: Paolo Bonzini +Reviewed-by: Amos Kong +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit e8b4c680b41bd960ecccd9ff076b7b058e0afcd4) + +Signed-off-by: Michael Roth +--- + hw/e1000.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/hw/e1000.c b/hw/e1000.c +index ae8a6c5..ec3a7c4 100644 +--- a/hw/e1000.c ++++ b/hw/e1000.c +@@ -295,6 +295,7 @@ set_rx_control(E1000State *s, int index, uint32_t val) + s->rxbuf_min_shift = ((val / E1000_RCTL_RDMTS_QUAT) & 3) + 1; + DBGOUT(RX, "RCTL: %d, mac_reg[RCTL] = 0x%x\n", s->mac_reg[RDT], + s->mac_reg[RCTL]); ++ qemu_flush_queued_packets(&s->nic->nc); + } + + static void +@@ -926,6 +927,9 @@ set_rdt(E1000State *s, int index, uint32_t val) + { + s->check_rxov = 0; + s->mac_reg[index] = val & 0xffff; ++ if (e1000_has_rxbufs(s, 1)) { ++ qemu_flush_queued_packets(&s->nic->nc); ++ } + } + + static void +-- +1.7.12.1 + diff --git a/0188-xen-flush-queue-when-getting-an-event.patch b/0188-xen-flush-queue-when-getting-an-event.patch new file mode 100644 index 0000000..6c52eb4 --- /dev/null +++ b/0188-xen-flush-queue-when-getting-an-event.patch @@ -0,0 +1,37 @@ +From 7fc16be815b8ff85f174fc93d67f82400da08120 Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Thu, 9 Aug 2012 16:45:57 +0200 +Subject: [PATCH] xen: flush queue when getting an event + +xen does not have a register that, when written, will cause can_receive +to go from false to true. However, flushing the queue can be attempted +whenever the front-end raises its side of the Xen event channel. There +is a single event channel for tx and rx. + +Cc: Stefano Stabellini +Cc: Stefan Hajnoczi +Signed-off-by: Paolo Bonzini +Reviewed-by: Amos Kong +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit a98b140223d3a627eab7ee3ddec645bab630d756) + +Signed-off-by: Michael Roth +--- + hw/xen_nic.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/hw/xen_nic.c b/hw/xen_nic.c +index 8b79bfb..cf7d559 100644 +--- a/hw/xen_nic.c ++++ b/hw/xen_nic.c +@@ -415,6 +415,7 @@ static void net_event(struct XenDevice *xendev) + { + struct XenNetDev *netdev = container_of(xendev, struct XenNetDev, xendev); + net_tx_packets(netdev); ++ qemu_flush_queued_packets(&netdev->nic->nc); + } + + static int net_free(struct XenDevice *xendev) +-- +1.7.12.1 + diff --git a/0189-eepro100-Fix-network-hang-when-rx-buffers-run-out.patch b/0189-eepro100-Fix-network-hang-when-rx-buffers-run-out.patch new file mode 100644 index 0000000..4e2df82 --- /dev/null +++ b/0189-eepro100-Fix-network-hang-when-rx-buffers-run-out.patch @@ -0,0 +1,72 @@ +From 154f1e30c09d261b12937c385632c05474989b02 Mon Sep 17 00:00:00 2001 +From: Bo Yang +Date: Wed, 29 Aug 2012 19:26:11 +0800 +Subject: [PATCH] eepro100: Fix network hang when rx buffers run out + +This is reported by QA. When installing os with pxe, after the initial +kernel and initrd are loaded, the procedure tries to copy files from install +server to local harddisk, the network becomes stall because of running out of +receive descriptor. + +[Whitespace fixes and removed qemu_notify_event() because Paolo's +earlier net patches have moved it into qemu_flush_queued_packets(). + +Additional info: + +I can reproduce the network hang with a tap device doing a iPXE HTTP +boot as follows: + + $ qemu -enable-kvm -m 1024 \ + -netdev tap,id=netdev0,script=no,downscript=no \ + -device i82559er,netdev=netdev0,romfile=80861209.rom \ + -drive if=virtio,cache=none,file=test.img + iPXE> ifopen net0 + iPXE> config # set static network configuration + iPXE> kernel http://mirror.bytemark.co.uk/fedora/linux/releases/17/Fedora/x86_64/os/images/pxeboot/vmlinuz + +I needed a vanilla iPXE ROM to get to the iPXE prompt. I think the boot +prompt has been disabled in the ROMs that ship with QEMU to reduce boot +time. + +During the vmlinuz HTTP download there is a network hang. hw/eepro100.c +has reached the end of the rx descriptor list. When the iPXE driver +replenishes the rx descriptor list we don't kick the QEMU net subsystem +and event loop, thereby leaving the tap netdev without its file +descriptor in select(2). + +Stefan Hajnoczi ] + +Signed-off-by: Bo Yang +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 1069985fb132cd4324fc02d371f1e61492a1823f) + +Signed-off-by: Michael Roth +--- + hw/eepro100.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/hw/eepro100.c b/hw/eepro100.c +index 50d117e..5b23116 100644 +--- a/hw/eepro100.c ++++ b/hw/eepro100.c +@@ -1036,6 +1036,7 @@ static void eepro100_ru_command(EEPRO100State * s, uint8_t val) + } + set_ru_state(s, ru_ready); + s->ru_offset = e100_read_reg4(s, SCBPointer); ++ qemu_flush_queued_packets(&s->nic->nc); + TRACE(OTHER, logout("val=0x%02x (rx start)\n", val)); + break; + case RX_RESUME: +@@ -1770,7 +1771,8 @@ static ssize_t nic_receive(NetClientState *nc, const uint8_t * buf, size_t size) + if (rfd_command & COMMAND_EL) { + /* EL bit is set, so this was the last frame. */ + logout("receive: Running out of frames\n"); +- set_ru_state(s, ru_suspended); ++ set_ru_state(s, ru_no_resources); ++ eepro100_rnr_interrupt(s); + } + if (rfd_command & COMMAND_S) { + /* S bit is set. */ +-- +1.7.12.1 + diff --git a/0190-net-add-receive_disabled-logic-to-iov-delivery-path.patch b/0190-net-add-receive_disabled-logic-to-iov-delivery-path.patch new file mode 100644 index 0000000..f94a29e --- /dev/null +++ b/0190-net-add-receive_disabled-logic-to-iov-delivery-path.patch @@ -0,0 +1,65 @@ +From eccdc01e744cf3a389a527406f4d529420133e89 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Fri, 17 Aug 2012 21:16:42 +0100 +Subject: [PATCH] net: add receive_disabled logic to iov delivery path + +This patch adds the missing NetClient->receive_disabled logic in the +sendv delivery code path. It seems that commit +893379efd0e1b84ceb0c42a713293f3dbd27b1bd ("net: disable receiving if +client returns zero") only added the logic to qemu_deliver_packet() and +not qemu_deliver_packet_iov(). + +The receive_disabled flag should be automatically set when .receive(), +.receive_raw(), or .receive_iov() return 0. No further packets will be +delivered to the NetClient until the receive_disabled flag is cleared +again by calling qemu_flush_queued_packets(). + +Typically the NetClient will wait until its file descriptor becomes +writable and then invoke qemu_flush_queued_packets() to resume +transmission. + +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit c67f5dc10573687497f0f5c3aec19b15c35c63d7) + +Signed-off-by: Michael Roth +--- + net.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +diff --git a/net.c b/net.c +index 76a8336..1303819 100644 +--- a/net.c ++++ b/net.c +@@ -423,16 +423,27 @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender, + void *opaque) + { + NetClientState *nc = opaque; ++ int ret; + + if (nc->link_down) { + return iov_size(iov, iovcnt); + } + ++ if (nc->receive_disabled) { ++ return 0; ++ } ++ + if (nc->info->receive_iov) { +- return nc->info->receive_iov(nc, iov, iovcnt); ++ ret = nc->info->receive_iov(nc, iov, iovcnt); + } else { +- return nc_sendv_compat(nc, iov, iovcnt); ++ ret = nc_sendv_compat(nc, iov, iovcnt); + } ++ ++ if (ret == 0) { ++ nc->receive_disabled = 1; ++ } ++ ++ return ret; + } + + ssize_t qemu_sendv_packet_async(NetClientState *sender, +-- +1.7.12.1 + diff --git a/0191-net-do-not-report-queued-packets-as-sent.patch b/0191-net-do-not-report-queued-packets-as-sent.patch new file mode 100644 index 0000000..b6deca0 --- /dev/null +++ b/0191-net-do-not-report-queued-packets-as-sent.patch @@ -0,0 +1,103 @@ +From 17df2130cd8be0cd6892b86103947746f95efc2c Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Mon, 20 Aug 2012 13:35:23 +0100 +Subject: [PATCH] net: do not report queued packets as sent + +Net send functions have a return value where 0 means the packet has not +been sent and will be queued. A non-zero value means the packet was +sent or an error caused the packet to be dropped. + +This patch fixes two instances where packets are queued but we return +their size. This causes callers to believe the packets were sent. When +the caller uses the async send interface this creates a real problem +because the callback will be invoked for a packet that the caller +believed to be already sent. This bug can cause double-frees in the +caller. + +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 06b5f36d052b540a59b52150582d65674199b2ce) + +Signed-off-by: Michael Roth +--- + net/queue.c | 35 ++++++++++++++++------------------- + 1 file changed, 16 insertions(+), 19 deletions(-) + +diff --git a/net/queue.c b/net/queue.c +index 6e64091..254f280 100644 +--- a/net/queue.c ++++ b/net/queue.c +@@ -83,12 +83,12 @@ void qemu_del_net_queue(NetQueue *queue) + g_free(queue); + } + +-static ssize_t qemu_net_queue_append(NetQueue *queue, +- NetClientState *sender, +- unsigned flags, +- const uint8_t *buf, +- size_t size, +- NetPacketSent *sent_cb) ++static void qemu_net_queue_append(NetQueue *queue, ++ NetClientState *sender, ++ unsigned flags, ++ const uint8_t *buf, ++ size_t size, ++ NetPacketSent *sent_cb) + { + NetPacket *packet; + +@@ -100,16 +100,14 @@ static ssize_t qemu_net_queue_append(NetQueue *queue, + memcpy(packet->data, buf, size); + + QTAILQ_INSERT_TAIL(&queue->packets, packet, entry); +- +- return size; + } + +-static ssize_t qemu_net_queue_append_iov(NetQueue *queue, +- NetClientState *sender, +- unsigned flags, +- const struct iovec *iov, +- int iovcnt, +- NetPacketSent *sent_cb) ++static void qemu_net_queue_append_iov(NetQueue *queue, ++ NetClientState *sender, ++ unsigned flags, ++ const struct iovec *iov, ++ int iovcnt, ++ NetPacketSent *sent_cb) + { + NetPacket *packet; + size_t max_len = 0; +@@ -133,8 +131,6 @@ static ssize_t qemu_net_queue_append_iov(NetQueue *queue, + } + + QTAILQ_INSERT_TAIL(&queue->packets, packet, entry); +- +- return packet->size; + } + + static ssize_t qemu_net_queue_deliver(NetQueue *queue, +@@ -177,7 +173,8 @@ ssize_t qemu_net_queue_send(NetQueue *queue, + ssize_t ret; + + if (queue->delivering || !qemu_can_send_packet(sender)) { +- return qemu_net_queue_append(queue, sender, flags, data, size, sent_cb); ++ qemu_net_queue_append(queue, sender, flags, data, size, sent_cb); ++ return 0; + } + + ret = qemu_net_queue_deliver(queue, sender, flags, data, size); +@@ -201,8 +198,8 @@ ssize_t qemu_net_queue_send_iov(NetQueue *queue, + ssize_t ret; + + if (queue->delivering || !qemu_can_send_packet(sender)) { +- return qemu_net_queue_append_iov(queue, sender, flags, +- iov, iovcnt, sent_cb); ++ qemu_net_queue_append_iov(queue, sender, flags, iov, iovcnt, sent_cb); ++ return 0; + } + + ret = qemu_net_queue_deliver_iov(queue, sender, flags, iov, iovcnt); +-- +1.7.12.1 + diff --git a/0192-net-add-netdev-options-to-man-page.patch b/0192-net-add-netdev-options-to-man-page.patch new file mode 100644 index 0000000..b0272da --- /dev/null +++ b/0192-net-add-netdev-options-to-man-page.patch @@ -0,0 +1,81 @@ +From 773b0a456b236ccdcf1e5329992c0d4669f0af26 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Tue, 14 Aug 2012 14:14:27 +0100 +Subject: [PATCH] net: add -netdev options to man page + +Document the -netdev syntax which supercedes the older -net syntax. +This patch is a first step to making -netdev prominent in the QEMU +manual. + +Reported-by: Anatoly Techtonik +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 08d12022c7f1aba6acccc75150659c6e4c9dff23) + +Signed-off-by: Michael Roth +--- + qemu-options.hx | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/qemu-options.hx b/qemu-options.hx +index 1af4fec..1021ab7 100644 +--- a/qemu-options.hx ++++ b/qemu-options.hx +@@ -1357,6 +1357,7 @@ Valid values for @var{type} are + Not all devices are supported on all targets. Use -net nic,model=? + for a list of available devices for your target. + ++@item -netdev user,id=@var{id}[,@var{option}][,@var{option}][,...] + @item -net user[,@var{option}][,@var{option}][,...] + Use the user mode network stack which requires no administrator + privilege to run. Valid options are: +@@ -1365,6 +1366,7 @@ privilege to run. Valid options are: + @item vlan=@var{n} + Connect user mode stack to VLAN @var{n} (@var{n} = 0 is the default). + ++@item id=@var{id} + @item name=@var{name} + Assign symbolic name for use in monitor commands. + +@@ -1490,6 +1492,7 @@ processed and applied to -net user. Mixing them with the new configuration + syntax gives undefined results. Their use for new applications is discouraged + as they will be removed from future versions. + ++@item -netdev tap,id=@var{id}[,fd=@var{h}][,ifname=@var{name}][,script=@var{file}][,downscript=@var{dfile}][,helper=@var{helper}] + @item -net tap[,vlan=@var{n}][,name=@var{name}][,fd=@var{h}][,ifname=@var{name}][,script=@var{file}][,downscript=@var{dfile}][,helper=@var{helper}] + Connect the host TAP network interface @var{name} to VLAN @var{n}. + +@@ -1529,6 +1532,7 @@ qemu-system-i386 linux.img \ + -net nic -net tap,"helper=/usr/local/libexec/qemu-bridge-helper" + @end example + ++@item -netdev bridge,id=@var{id}[,br=@var{bridge}][,helper=@var{helper}] + @item -net bridge[,vlan=@var{n}][,name=@var{name}][,br=@var{bridge}][,helper=@var{helper}] + Connect a host TAP network interface to a host bridge device. + +@@ -1551,6 +1555,7 @@ qemu-system-i386 linux.img -net bridge -net nic,model=virtio + qemu-system-i386 linux.img -net bridge,br=qemubr0 -net nic,model=virtio + @end example + ++@item -netdev socket,id=@var{id}[,fd=@var{h}][,listen=[@var{host}]:@var{port}][,connect=@var{host}:@var{port}] + @item -net socket[,vlan=@var{n}][,name=@var{name}][,fd=@var{h}] [,listen=[@var{host}]:@var{port}][,connect=@var{host}:@var{port}] + + Connect the VLAN @var{n} to a remote VLAN in another QEMU virtual +@@ -1573,6 +1578,7 @@ qemu-system-i386 linux.img \ + -net socket,connect=127.0.0.1:1234 + @end example + ++@item -netdev socket,id=@var{id}[,fd=@var{h}][,mcast=@var{maddr}:@var{port}[,localaddr=@var{addr}]] + @item -net socket[,vlan=@var{n}][,name=@var{name}][,fd=@var{h}][,mcast=@var{maddr}:@var{port}[,localaddr=@var{addr}]] + + Create a VLAN @var{n} shared with another QEMU virtual +@@ -1624,6 +1630,7 @@ qemu-system-i386 linux.img \ + -net socket,mcast=239.192.168.1:1102,localaddr=1.2.3.4 + @end example + ++@item -netdev vde,id=@var{id}[,sock=@var{socketpath}][,port=@var{n}][,group=@var{groupname}][,mode=@var{octalmode}] + @item -net vde[,vlan=@var{n}][,name=@var{name}][,sock=@var{socketpath}] [,port=@var{n}][,group=@var{groupname}][,mode=@var{octalmode}] + Connect VLAN @var{n} to PORT @var{n} of a vde switch running on host and + listening for incoming connections on @var{socketpath}. Use GROUP @var{groupname} +-- +1.7.12.1 + diff --git a/0193-net-clean-up-usbnet_receive.patch b/0193-net-clean-up-usbnet_receive.patch new file mode 100644 index 0000000..c92890e --- /dev/null +++ b/0193-net-clean-up-usbnet_receive.patch @@ -0,0 +1,80 @@ +From f3f975860db11101ccef2f75238032328de00ce0 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Fri, 24 Aug 2012 13:32:16 +0100 +Subject: [PATCH] net: clean up usbnet_receive() + +The USB network interface has two code paths depending on whether or not +RNDIS mode is enabled. Refactor usbnet_receive() so that there is a +common path throughout the function instead of duplicating everything +across if (is_rndis(s)) ... else ... code paths. + +Clean up coding style and 80 character line wrap along the way. + +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit f237ddbb89142c6948a2257c459e49dee7500a7c) + +Signed-off-by: Michael Roth +--- + hw/usb/dev-network.c | 30 +++++++++++++++++------------- + 1 file changed, 17 insertions(+), 13 deletions(-) + +diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c +index c84892c..0b5cb71 100644 +--- a/hw/usb/dev-network.c ++++ b/hw/usb/dev-network.c +@@ -1250,20 +1250,27 @@ static int usb_net_handle_data(USBDevice *dev, USBPacket *p) + static ssize_t usbnet_receive(NetClientState *nc, const uint8_t *buf, size_t size) + { + USBNetState *s = DO_UPCAST(NICState, nc, nc)->opaque; +- struct rndis_packet_msg_type *msg; ++ uint8_t *in_buf = s->in_buf; ++ size_t total_size = size; + + if (is_rndis(s)) { +- msg = (struct rndis_packet_msg_type *) s->in_buf; + if (s->rndis_state != RNDIS_DATA_INITIALIZED) { + return -1; + } +- if (size + sizeof(struct rndis_packet_msg_type) > sizeof(s->in_buf)) +- return -1; ++ total_size += sizeof(struct rndis_packet_msg_type); ++ } ++ if (total_size > sizeof(s->in_buf)) { ++ return -1; ++ } + ++ if (is_rndis(s)) { ++ struct rndis_packet_msg_type *msg; ++ ++ msg = (struct rndis_packet_msg_type *)in_buf; + memset(msg, 0, sizeof(struct rndis_packet_msg_type)); + msg->MessageType = cpu_to_le32(RNDIS_PACKET_MSG); +- msg->MessageLength = cpu_to_le32(size + sizeof(struct rndis_packet_msg_type)); +- msg->DataOffset = cpu_to_le32(sizeof(struct rndis_packet_msg_type) - 8); ++ msg->MessageLength = cpu_to_le32(size + sizeof(*msg)); ++ msg->DataOffset = cpu_to_le32(sizeof(*msg) - 8); + msg->DataLength = cpu_to_le32(size); + /* msg->OOBDataOffset; + * msg->OOBDataLength; +@@ -1273,14 +1280,11 @@ static ssize_t usbnet_receive(NetClientState *nc, const uint8_t *buf, size_t siz + * msg->VcHandle; + * msg->Reserved; + */ +- memcpy(msg + 1, buf, size); +- s->in_len = size + sizeof(struct rndis_packet_msg_type); +- } else { +- if (size > sizeof(s->in_buf)) +- return -1; +- memcpy(s->in_buf, buf, size); +- s->in_len = size; ++ in_buf += sizeof(*msg); + } ++ ++ memcpy(in_buf, buf, size); ++ s->in_len = total_size; + s->in_ptr = 0; + return size; + } +-- +1.7.12.1 + diff --git a/0194-net-fix-usbnet_receive-packet-drops.patch b/0194-net-fix-usbnet_receive-packet-drops.patch new file mode 100644 index 0000000..bbe1c76 --- /dev/null +++ b/0194-net-fix-usbnet_receive-packet-drops.patch @@ -0,0 +1,81 @@ +From 14294fa1c903ab239bce3d2839e9e1883141b4f1 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Fri, 24 Aug 2012 13:37:29 +0100 +Subject: [PATCH] net: fix usbnet_receive() packet drops + +The USB network interface has a single buffer which the guest reads +from. This patch prevents multiple calls to usbnet_receive() from +clobbering the input buffer. Instead we queue packets until buffer +space becomes available again. + +This is inspired by virtio-net and e1000 rxbuf handling. + +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 190563f9a90c9df8ad32fc7f3e4b166deda949a6) + +Signed-off-by: Michael Roth +--- + hw/usb/dev-network.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c +index 0b5cb71..e4a4359 100644 +--- a/hw/usb/dev-network.c ++++ b/hw/usb/dev-network.c +@@ -1001,6 +1001,13 @@ static int rndis_keepalive_response(USBNetState *s, + return 0; + } + ++/* Prepare to receive the next packet */ ++static void usb_net_reset_in_buf(USBNetState *s) ++{ ++ s->in_ptr = s->in_len = 0; ++ qemu_flush_queued_packets(&s->nic->nc); ++} ++ + static int rndis_parse(USBNetState *s, uint8_t *data, int length) + { + uint32_t msg_type; +@@ -1025,7 +1032,8 @@ static int rndis_parse(USBNetState *s, uint8_t *data, int length) + + case RNDIS_RESET_MSG: + rndis_clear_responsequeue(s); +- s->out_ptr = s->in_ptr = s->in_len = 0; ++ s->out_ptr = 0; ++ usb_net_reset_in_buf(s); + return rndis_reset_response(s, (rndis_reset_msg_type *) data); + + case RNDIS_KEEPALIVE_MSG: +@@ -1135,7 +1143,7 @@ static int usb_net_handle_datain(USBNetState *s, USBPacket *p) + int ret = USB_RET_NAK; + + if (s->in_ptr > s->in_len) { +- s->in_ptr = s->in_len = 0; ++ usb_net_reset_in_buf(s); + ret = USB_RET_NAK; + return ret; + } +@@ -1152,7 +1160,7 @@ static int usb_net_handle_datain(USBNetState *s, USBPacket *p) + if (s->in_ptr >= s->in_len && + (is_rndis(s) || (s->in_len & (64 - 1)) || !ret)) { + /* no short packet necessary */ +- s->in_ptr = s->in_len = 0; ++ usb_net_reset_in_buf(s); + } + + #ifdef TRAFFIC_DEBUG +@@ -1263,6 +1271,11 @@ static ssize_t usbnet_receive(NetClientState *nc, const uint8_t *buf, size_t siz + return -1; + } + ++ /* Only accept packet if input buffer is empty */ ++ if (s->in_len > 0) { ++ return 0; ++ } ++ + if (is_rndis(s)) { + struct rndis_packet_msg_type *msg; + +-- +1.7.12.1 + diff --git a/0195-net-broadcast-hub-packets-if-at-least-one-port-can-r.patch b/0195-net-broadcast-hub-packets-if-at-least-one-port-can-r.patch new file mode 100644 index 0000000..5cb7e1c --- /dev/null +++ b/0195-net-broadcast-hub-packets-if-at-least-one-port-can-r.patch @@ -0,0 +1,51 @@ +From 25ade2154673396e432de2b3c413865d1552c9b3 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Fri, 24 Aug 2012 13:50:30 +0100 +Subject: [PATCH] net: broadcast hub packets if at least one port can receive + +In commit 60c07d933c66c4b30a83b7ccbc8a0cb3df1b2d0e ("net: fix +qemu_can_send_packet logic") the "VLAN" broadcast behavior was changed +to queue packets if any net client cannot receive. It turns out that +this was not actually the right fix and just hides the real bug that +hw/usb/dev-network.c:usbnet_receive() clobbers its receive buffer when +called multiple times in a row. The commit also introduced a new bug +that "VLAN" packets would not be sent if one of multiple net clients was +down. + +The hw/usb/dev-network.c bug has since been fixed, so this patch reverts +broadcast behavior to send packets as long as one net client can +receive. Packets simply get queued for the net clients that are +temporarily unable to receive. + +Reported-by: Roy.Li +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 61518a74ca98870e8ff132f91dd5dda252e31f58) + +Signed-off-by: Michael Roth +--- + net/hub.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/net/hub.c b/net/hub.c +index ac157e3..650a8b4 100644 +--- a/net/hub.c ++++ b/net/hub.c +@@ -97,12 +97,12 @@ static int net_hub_port_can_receive(NetClientState *nc) + continue; + } + +- if (!qemu_can_send_packet(&port->nc)) { +- return 0; ++ if (qemu_can_send_packet(&port->nc)) { ++ return 1; + } + } + +- return 1; ++ return 0; + } + + static ssize_t net_hub_port_receive(NetClientState *nc, +-- +1.7.12.1 + diff --git a/0196-net-asynchronous-send-receive-infrastructure-for-net.patch b/0196-net-asynchronous-send-receive-infrastructure-for-net.patch new file mode 100644 index 0000000..53f0722 --- /dev/null +++ b/0196-net-asynchronous-send-receive-infrastructure-for-net.patch @@ -0,0 +1,133 @@ +From 176b159d70cb26b24ce928497ae269b294e503d8 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Mon, 20 Aug 2012 10:21:54 +0100 +Subject: [PATCH] net: asynchronous send/receive infrastructure for + net/socket.c + +The net/socket.c net client is not truly asynchronous. This patch +borrows the qemu_set_fd_handler2() code from net/tap.c as the basis for +proper asynchronous send/receive. + +Only read packets from the socket when the peer is able to receive. +This avoids needless queuing. + +Later patches implement asynchronous send. + +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 863f678fba4191f3b695620f41056cb7c124425d) + +Signed-off-by: Michael Roth +--- + net/socket.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 52 insertions(+), 6 deletions(-) + +diff --git a/net/socket.c b/net/socket.c +index c172c24..54e32f0 100644 +--- a/net/socket.c ++++ b/net/socket.c +@@ -42,9 +42,51 @@ typedef struct NetSocketState { + unsigned int packet_len; + uint8_t buf[4096]; + struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */ ++ IOHandler *send_fn; /* differs between SOCK_STREAM/SOCK_DGRAM */ ++ bool read_poll; /* waiting to receive data? */ ++ bool write_poll; /* waiting to transmit data? */ + } NetSocketState; + + static void net_socket_accept(void *opaque); ++static void net_socket_writable(void *opaque); ++ ++/* Only read packets from socket when peer can receive them */ ++static int net_socket_can_send(void *opaque) ++{ ++ NetSocketState *s = opaque; ++ ++ return qemu_can_send_packet(&s->nc); ++} ++ ++static void net_socket_update_fd_handler(NetSocketState *s) ++{ ++ qemu_set_fd_handler2(s->fd, ++ s->read_poll ? net_socket_can_send : NULL, ++ s->read_poll ? s->send_fn : NULL, ++ s->write_poll ? net_socket_writable : NULL, ++ s); ++} ++ ++static void net_socket_read_poll(NetSocketState *s, bool enable) ++{ ++ s->read_poll = enable; ++ net_socket_update_fd_handler(s); ++} ++ ++static void net_socket_write_poll(NetSocketState *s, bool enable) ++{ ++ s->write_poll = enable; ++ net_socket_update_fd_handler(s); ++} ++ ++static void net_socket_writable(void *opaque) ++{ ++ NetSocketState *s = opaque; ++ ++ net_socket_write_poll(s, false); ++ ++ qemu_flush_queued_packets(&s->nc); ++} + + /* XXX: we consider we can send the whole packet without blocking */ + static ssize_t net_socket_receive(NetClientState *nc, const uint8_t *buf, size_t size) +@@ -81,7 +123,8 @@ static void net_socket_send(void *opaque) + } else if (size == 0) { + /* end of connection */ + eoc: +- qemu_set_fd_handler(s->fd, NULL, NULL, NULL); ++ net_socket_read_poll(s, false); ++ net_socket_write_poll(s, false); + if (s->listen_fd != -1) { + qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s); + } +@@ -152,7 +195,8 @@ static void net_socket_send_dgram(void *opaque) + return; + if (size == 0) { + /* end of connection */ +- qemu_set_fd_handler(s->fd, NULL, NULL, NULL); ++ net_socket_read_poll(s, false); ++ net_socket_write_poll(s, false); + return; + } + qemu_send_packet(&s->nc, s->buf, size); +@@ -243,7 +287,8 @@ static void net_socket_cleanup(NetClientState *nc) + { + NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc); + if (s->fd != -1) { +- qemu_set_fd_handler(s->fd, NULL, NULL, NULL); ++ net_socket_read_poll(s, false); ++ net_socket_write_poll(s, false); + close(s->fd); + s->fd = -1; + } +@@ -314,8 +359,8 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer, + + s->fd = fd; + s->listen_fd = -1; +- +- qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s); ++ s->send_fn = net_socket_send_dgram; ++ net_socket_read_poll(s, true); + + /* mcast: save bound address as dst */ + if (is_connected) { +@@ -332,7 +377,8 @@ err: + static void net_socket_connect(void *opaque) + { + NetSocketState *s = opaque; +- qemu_set_fd_handler(s->fd, net_socket_send, NULL, s); ++ s->send_fn = net_socket_send; ++ net_socket_read_poll(s, true); + } + + static NetClientInfo net_socket_info = { +-- +1.7.12.1 + diff --git a/0197-net-EAGAIN-handling-for-net-socket.c-UDP.patch b/0197-net-EAGAIN-handling-for-net-socket.c-UDP.patch new file mode 100644 index 0000000..9745eaa --- /dev/null +++ b/0197-net-EAGAIN-handling-for-net-socket.c-UDP.patch @@ -0,0 +1,45 @@ +From a2374b78f298d5755e96468bb97e4d7b660ff9d6 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Mon, 20 Aug 2012 10:28:53 +0100 +Subject: [PATCH] net: EAGAIN handling for net/socket.c UDP + +Implement asynchronous send for UDP (or other SOCK_DGRAM) sockets. If +send fails with EAGAIN we wait for the socket to become writable again. + +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 213fd5087e2e4e2da10ad266df0ba950cf7618bf) + +Signed-off-by: Michael Roth +--- + net/socket.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/net/socket.c b/net/socket.c +index 54e32f0..e5e4e8d 100644 +--- a/net/socket.c ++++ b/net/socket.c +@@ -102,9 +102,19 @@ static ssize_t net_socket_receive(NetClientState *nc, const uint8_t *buf, size_t + static ssize_t net_socket_receive_dgram(NetClientState *nc, const uint8_t *buf, size_t size) + { + NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc); ++ ssize_t ret; + +- return sendto(s->fd, (const void *)buf, size, 0, +- (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst)); ++ do { ++ ret = sendto(s->fd, buf, size, 0, ++ (struct sockaddr *)&s->dgram_dst, ++ sizeof(s->dgram_dst)); ++ } while (ret == -1 && errno == EINTR); ++ ++ if (ret == -1 && errno == EAGAIN) { ++ net_socket_write_poll(s, true); ++ return 0; ++ } ++ return ret; + } + + static void net_socket_send(void *opaque) +-- +1.7.12.1 + diff --git a/0198-net-EAGAIN-handling-for-net-socket.c-TCP.patch b/0198-net-EAGAIN-handling-for-net-socket.c-TCP.patch new file mode 100644 index 0000000..d318bf1 --- /dev/null +++ b/0198-net-EAGAIN-handling-for-net-socket.c-TCP.patch @@ -0,0 +1,97 @@ +From 52d73aa49799848042c09be1c64c1bff2159a5e1 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Mon, 20 Aug 2012 10:14:35 +0100 +Subject: [PATCH] net: EAGAIN handling for net/socket.c TCP + +Replace spinning send_all() with a proper non-blocking send. When the +socket write buffer limit is reached, we should stop trying to send and +wait for the socket to become writable again. + +Non-blocking TCP sockets can return in two different ways when the write +buffer limit is reached: + +1. ret = -1 and errno = EAGAIN/EWOULDBLOCK. No data has been written. + +2. ret < total_size. Short write, only part of the message was + transmitted. + +Handle both cases and keep track of how many bytes have been written in +s->send_index. (This includes the 'length' header before the actual +payload buffer.) + +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 45a7f54a8bb3928ffa58d522e0d61acaee8277bb) + +Signed-off-by: Michael Roth +--- + net/socket.c | 36 +++++++++++++++++++++++++++++++----- + 1 file changed, 31 insertions(+), 5 deletions(-) + +diff --git a/net/socket.c b/net/socket.c +index e5e4e8d..c3e55b8 100644 +--- a/net/socket.c ++++ b/net/socket.c +@@ -32,6 +32,7 @@ + #include "qemu-error.h" + #include "qemu-option.h" + #include "qemu_socket.h" ++#include "iov.h" + + typedef struct NetSocketState { + NetClientState nc; +@@ -40,6 +41,7 @@ typedef struct NetSocketState { + int state; /* 0 = getting length, 1 = getting data */ + unsigned int index; + unsigned int packet_len; ++ unsigned int send_index; /* number of bytes sent (only SOCK_STREAM) */ + uint8_t buf[4096]; + struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */ + IOHandler *send_fn; /* differs between SOCK_STREAM/SOCK_DGRAM */ +@@ -88,15 +90,39 @@ static void net_socket_writable(void *opaque) + qemu_flush_queued_packets(&s->nc); + } + +-/* XXX: we consider we can send the whole packet without blocking */ + static ssize_t net_socket_receive(NetClientState *nc, const uint8_t *buf, size_t size) + { + NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc); +- uint32_t len; +- len = htonl(size); ++ uint32_t len = htonl(size); ++ struct iovec iov[] = { ++ { ++ .iov_base = &len, ++ .iov_len = sizeof(len), ++ }, { ++ .iov_base = (void *)buf, ++ .iov_len = size, ++ }, ++ }; ++ size_t remaining; ++ ssize_t ret; ++ ++ remaining = iov_size(iov, 2) - s->send_index; ++ ret = iov_send(s->fd, iov, 2, s->send_index, remaining); + +- send_all(s->fd, (const uint8_t *)&len, sizeof(len)); +- return send_all(s->fd, buf, size); ++ if (ret == -1 && errno == EAGAIN) { ++ ret = 0; /* handled further down */ ++ } ++ if (ret == -1) { ++ s->send_index = 0; ++ return -errno; ++ } ++ if (ret < (ssize_t)remaining) { ++ s->send_index += ret; ++ net_socket_write_poll(s, true); ++ return 0; ++ } ++ s->send_index = 0; ++ return size; + } + + static ssize_t net_socket_receive_dgram(NetClientState *nc, const uint8_t *buf, size_t size) +-- +1.7.12.1 + diff --git a/0199-configure-fix-seccomp-check.patch b/0199-configure-fix-seccomp-check.patch new file mode 100644 index 0000000..bf742c6 --- /dev/null +++ b/0199-configure-fix-seccomp-check.patch @@ -0,0 +1,45 @@ +From 4a151cbe99766a8da4582234a93d4292f064108f Mon Sep 17 00:00:00 2001 +From: "Yann E. MORIN" +Date: Thu, 6 Sep 2012 22:40:30 +0200 +Subject: [PATCH] configure: fix seccomp check +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Currently, if libseccomp is missing but the user explicitly requested +seccomp support using --enable-seccomp, configure silently ignores the +situation and disables seccomp support. + +This is unlike all other tests that explicitly fail in such situation. + +Fix that. + +Signed-off-by: "Yann E. MORIN" +Reviewed-by: Andreas Färber +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit e84d5956cc6215d2f098e7b6090fc5ec4cba1be3) + +Signed-off-by: Michael Roth +--- + configure | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure b/configure +index dcd8e7b..9e53cc2 100755 +--- a/configure ++++ b/configure +@@ -1405,10 +1405,10 @@ if test "$seccomp" != "no" ; then + LIBS=`$pkg_config --libs libseccomp` + seccomp="yes" + else +- seccomp="no" + if test "$seccomp" = "yes"; then + feature_not_found "libseccomp" + fi ++ seccomp="no" + fi + fi + ########################################## +-- +1.7.12.1 + diff --git a/0200-configure-properly-check-if-lrt-and-lm-is-needed.patch b/0200-configure-properly-check-if-lrt-and-lm-is-needed.patch new file mode 100644 index 0000000..2e9a949 --- /dev/null +++ b/0200-configure-properly-check-if-lrt-and-lm-is-needed.patch @@ -0,0 +1,80 @@ +From 39b2ed0e73ac5b220accf7116bdaecb71ce759af Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Wed, 12 Sep 2012 09:06:51 +0000 +Subject: [PATCH] configure: properly check if -lrt and -lm is needed + +Fixes build against uClibc. + +uClibc provides 2 versions of clock_gettime(), one with realtime +support and one without (this is so you can avoid linking in -lrt +unless actually needed). This means that the clock_gettime() don't +need -lrt. We still need it for timer_create() so we check for this +function in addition. + +We also need check if -lm is needed for isnan(). + +Both -lm and -lrt are needed for libs_qga. + +Signed-off-by: Natanael Copa +Signed-off-by: Blue Swirl +(cherry picked from commit 8bacde8d86a09699207d85d4bab06162aed18dc4) + +Signed-off-by: Michael Roth +--- + configure | 31 +++++++++++++++++++++++++++++-- + 1 file changed, 29 insertions(+), 2 deletions(-) + +diff --git a/configure b/configure +index 9e53cc2..a1f256c 100755 +--- a/configure ++++ b/configure +@@ -2645,17 +2645,44 @@ fi + + + ########################################## ++# Do we need libm ++cat > $TMPC << EOF ++#include ++int main(void) { return isnan(sin(0.0)); } ++EOF ++if compile_prog "" "" ; then ++ : ++elif compile_prog "" "-lm" ; then ++ LIBS="-lm $LIBS" ++ libs_qga="-lm $libs_qga" ++else ++ echo ++ echo "Error: libm check failed" ++ echo ++ exit 1 ++fi ++ ++########################################## + # Do we need librt ++# uClibc provides 2 versions of clock_gettime(), one with realtime ++# support and one without. This means that the clock_gettime() don't ++# need -lrt. We still need it for timer_create() so we check for this ++# function in addition. + cat > $TMPC < + #include +-int main(void) { return clock_gettime(CLOCK_REALTIME, NULL); } ++int main(void) { ++ timer_create(CLOCK_REALTIME, NULL, NULL); ++ return clock_gettime(CLOCK_REALTIME, NULL); ++} + EOF + + if compile_prog "" "" ; then + : +-elif compile_prog "" "-lrt" ; then ++# we need pthread for static linking. use previous pthread test result ++elif compile_prog "" "-lrt $pthread_lib" ; then + LIBS="-lrt $LIBS" ++ libs_qga="-lrt $libs_qga" + fi + + if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \ +-- +1.7.12.1 + diff --git a/0201-Revert-455aa1e08-and-c3767ed0eb.patch b/0201-Revert-455aa1e08-and-c3767ed0eb.patch new file mode 100644 index 0000000..5466652 --- /dev/null +++ b/0201-Revert-455aa1e08-and-c3767ed0eb.patch @@ -0,0 +1,51 @@ +From 423df48a1277f20511f21f4d249ea977aa4fa721 Mon Sep 17 00:00:00 2001 +From: Anthony Liguori +Date: Wed, 12 Sep 2012 14:34:07 -0500 +Subject: [PATCH] Revert 455aa1e08 and c3767ed0eb + + commit c3767ed0eb5d0bb25fe409ae5dec06e3411ff1b6 + qemu-char: (Re-)connect for tcp_chr_write() unconnected writing + +Has no hope of working because tcp_chr_connect() does not actually connect. + +455aa1e08 just fixes the SEGV with server() but the attempt to connect a client +socket is still completely broken. + +This patch reverts both. + +Reported-by: Richard W.M. Jones +Signed-off-by: Anthony Liguori +(cherry picked from commit 6db0fdce02d72546a4c47100a9b2cd0090cf464d) + +Signed-off-by: Michael Roth +--- + qemu-char.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git a/qemu-char.c b/qemu-char.c +index 767da93..10d1504 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -2141,18 +2141,13 @@ typedef struct { + + static void tcp_chr_accept(void *opaque); + +-static void tcp_chr_connect(void *opaque); +- + static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + { + TCPCharDriver *s = chr->opaque; + if (s->connected) { + return send_all(s->fd, buf, len); +- } else if (s->listen_fd == -1) { +- /* (Re-)connect for unconnected writing */ +- tcp_chr_connect(chr); +- return 0; + } else { ++ /* XXX: indicate an error ? */ + return len; + } + } +-- +1.7.12.1 + diff --git a/0202-qemu-char-BUGFIX-don-t-call-FD_ISSET-with-negative-f.patch b/0202-qemu-char-BUGFIX-don-t-call-FD_ISSET-with-negative-f.patch new file mode 100644 index 0000000..74f8f39 --- /dev/null +++ b/0202-qemu-char-BUGFIX-don-t-call-FD_ISSET-with-negative-f.patch @@ -0,0 +1,59 @@ +From 04eefabaae59ad624f0baf3b97a1d1d15cf2a23d Mon Sep 17 00:00:00 2001 +From: David Gibson +Date: Mon, 10 Sep 2012 12:30:56 +1000 +Subject: [PATCH] qemu-char: BUGFIX, don't call FD_ISSET with negative fd + +tcp_chr_connect(), unlike for example udp_chr_update_read_handler() does +not check if the fd it is using is valid (>= 0) before passing it to +qemu_set_fd_handler2(). If using e.g. a TCP serial port, which is not +initially connected, this can result in -1 being passed to FD_ISSET, which +has undefined behaviour. On x86 it seems to harmlessly return 0, but on +PowerPC, it causes a fortify buffer overflow error to be thrown. + +This patch fixes this by putting an extra test in tcp_chr_connect(), and +also adds an assert qemu_set_fd_handler2() to catch other such errors on +all platforms, rather than just some. + +Signed-off-by: David Gibson +Signed-off-by: Anthony Liguori +(cherry picked from commit bbdd2ad0814ea0911076419ea21b7957505cf1cc) + +Signed-off-by: Michael Roth +--- + iohandler.c | 2 ++ + qemu-char.c | 6 ++++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/iohandler.c b/iohandler.c +index dea4355..a2d871b 100644 +--- a/iohandler.c ++++ b/iohandler.c +@@ -56,6 +56,8 @@ int qemu_set_fd_handler2(int fd, + { + IOHandlerRecord *ioh; + ++ assert(fd >= 0); ++ + if (!fd_read && !fd_write) { + QLIST_FOREACH(ioh, &io_handlers, next) { + if (ioh->fd == fd) { +diff --git a/qemu-char.c b/qemu-char.c +index 10d1504..7f0f895 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -2329,8 +2329,10 @@ static void tcp_chr_connect(void *opaque) + TCPCharDriver *s = chr->opaque; + + s->connected = 1; +- qemu_set_fd_handler2(s->fd, tcp_chr_read_poll, +- tcp_chr_read, NULL, chr); ++ if (s->fd >= 0) { ++ qemu_set_fd_handler2(s->fd, tcp_chr_read_poll, ++ tcp_chr_read, NULL, chr); ++ } + qemu_chr_generic_open(chr); + } + +-- +1.7.12.1 + diff --git a/0203-cpu_physical_memory_write_rom-needs-to-do-TB-invalid.patch b/0203-cpu_physical_memory_write_rom-needs-to-do-TB-invalid.patch new file mode 100644 index 0000000..cceb39c --- /dev/null +++ b/0203-cpu_physical_memory_write_rom-needs-to-do-TB-invalid.patch @@ -0,0 +1,52 @@ +From 897815f54c446671cae0f202c54e9548e969d427 Mon Sep 17 00:00:00 2001 +From: David Gibson +Date: Mon, 10 Sep 2012 12:30:57 +1000 +Subject: [PATCH] cpu_physical_memory_write_rom() needs to do TB invalidates + +cpu_physical_memory_write_rom(), despite the name, can also be used to +write images into RAM - and will often be used that way if the machine +uses load_image_targphys() into RAM addresses. + +However, cpu_physical_memory_write_rom(), unlike cpu_physical_memory_rw() +doesn't invalidate any cached TBs which might be affected by the region +written. + +This was breaking reset (under full emu) on the pseries machine - we loaded +our firmware image into RAM, and while executing it rewrite the code at +the entry point (correctly causing a TB invalidate/refresh). When we +reset the firmware image was reloaded, but the TB from the rewrite was +still active and caused us to get an illegal instruction trap. + +This patch fixes the bug by duplicating the tb invalidate code from +cpu_physical_memory_rw() in cpu_physical_memory_write_rom(). + +Signed-off-by: David Gibson +Signed-off-by: Anthony Liguori +(cherry picked from commit 0b57e287138728f72d88b06e69b970c5d745c44a) + +Signed-off-by: Michael Roth +--- + exec.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/exec.c b/exec.c +index ad175db..3fdbbde 100644 +--- a/exec.c ++++ b/exec.c +@@ -3521,6 +3521,13 @@ void cpu_physical_memory_write_rom(target_phys_addr_t addr, + /* ROM/RAM case */ + ptr = qemu_get_ram_ptr(addr1); + memcpy(ptr, buf, l); ++ if (!cpu_physical_memory_is_dirty(addr1)) { ++ /* invalidate code */ ++ tb_invalidate_phys_page_range(addr1, addr1 + l, 0); ++ /* set dirty bit */ ++ cpu_physical_memory_set_dirty_flags( ++ addr1, (0xff & ~CODE_DIRTY_FLAG)); ++ } + qemu_put_ram_ptr(ptr); + } + len -= l; +-- +1.7.12.1 + diff --git a/0204-arch_init.c-Improve-soundhw-help-for-non-HAS_AUDIO_C.patch b/0204-arch_init.c-Improve-soundhw-help-for-non-HAS_AUDIO_C.patch new file mode 100644 index 0000000..d9001a5 --- /dev/null +++ b/0204-arch_init.c-Improve-soundhw-help-for-non-HAS_AUDIO_C.patch @@ -0,0 +1,43 @@ +From 8daf993d3d75acea92ef5054c924c7d825ae812e Mon Sep 17 00:00:00 2001 +From: Peter Maydell +Date: Wed, 19 Sep 2012 14:51:38 +0100 +Subject: [PATCH] arch_init.c: Improve '-soundhw help' for + non-HAS_AUDIO_CHOICE archs + +For architectures which don't set HAS_AUDIO_CHOICE, improve the +'-soundhw help' message so that it doesn't simply print an empty +list, implying no sound support at all. + +Signed-off-by: Peter Maydell +Signed-off-by: malc +(cherry picked from commit 55d4fd3c24bd253bd96270c7fdf1bb862f3a3400) + +Signed-off-by: Michael Roth +--- + arch_init.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/arch_init.c b/arch_init.c +index 47977de..f849f9b 100644 +--- a/arch_init.c ++++ b/arch_init.c +@@ -922,11 +922,16 @@ void select_soundhw(const char *optarg) + if (is_help_option(optarg)) { + show_valid_cards: + ++#ifdef HAS_AUDIO_CHOICE + printf("Valid sound card names (comma separated):\n"); + for (c = soundhw; c->name; ++c) { + printf ("%-11s %s\n", c->name, c->descr); + } + printf("\n-soundhw all will enable all of the above\n"); ++#else ++ printf("Machine has no user-selectable audio hardware " ++ "(it may or may not have always-present audio hardware).\n"); ++#endif + exit(!is_help_option(optarg)); + } + else { +-- +1.7.12.1 + diff --git a/0205-xilinx_timer-Removed-comma-in-device-name.patch b/0205-xilinx_timer-Removed-comma-in-device-name.patch new file mode 100644 index 0000000..26b5d66 --- /dev/null +++ b/0205-xilinx_timer-Removed-comma-in-device-name.patch @@ -0,0 +1,54 @@ +From 030d44c473036d44abc76562860a89b21220ca2f Mon Sep 17 00:00:00 2001 +From: "Peter A. G. Crosthwaite" +Date: Thu, 28 Jun 2012 12:52:23 +1000 +Subject: [PATCH] xilinx_timer: Removed comma in device name + +Fixes an error in a61e4b07a30c062260d2d01771773f14820d1eb7 + +Signed-off-by: Peter A. G. Crosthwaite +(cherry picked from commit c0a1dcb9f0baf9269f8baeb02cbcca8dad75454c) + +Signed-off-by: Michael Roth +--- + hw/xilinx.h | 2 +- + hw/xilinx_timer.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/hw/xilinx.h b/hw/xilinx.h +index 556c5aa..df06a00 100644 +--- a/hw/xilinx.h ++++ b/hw/xilinx.h +@@ -21,7 +21,7 @@ xilinx_timer_create(target_phys_addr_t base, qemu_irq irq, int oto, int freq) + { + DeviceState *dev; + +- dev = qdev_create(NULL, "xlnx,xps-timer"); ++ dev = qdev_create(NULL, "xlnx.xps-timer"); + qdev_prop_set_uint32(dev, "one-timer-only", oto); + qdev_prop_set_uint32(dev, "frequency", freq); + qdev_init_nofail(dev); +diff --git a/hw/xilinx_timer.c b/hw/xilinx_timer.c +index b562bd0..053ba02 100644 +--- a/hw/xilinx_timer.c ++++ b/hw/xilinx_timer.c +@@ -217,7 +217,7 @@ static int xilinx_timer_init(SysBusDevice *dev) + ptimer_set_freq(xt->ptimer, t->freq_hz); + } + +- memory_region_init_io(&t->mmio, &timer_ops, t, "xlnx,xps-timer", ++ memory_region_init_io(&t->mmio, &timer_ops, t, "xlnx.xps-timer", + R_MAX * 4 * num_timers(t)); + sysbus_init_mmio(dev, &t->mmio); + return 0; +@@ -239,7 +239,7 @@ static void xilinx_timer_class_init(ObjectClass *klass, void *data) + } + + static TypeInfo xilinx_timer_info = { +- .name = "xlnx,xps-timer", ++ .name = "xlnx.xps-timer", + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(struct timerblock), + .class_init = xilinx_timer_class_init, +-- +1.7.12.1 + diff --git a/0206-xilinx_timer-Send-dbg-msgs-to-stderr-not-stdout.patch b/0206-xilinx_timer-Send-dbg-msgs-to-stderr-not-stdout.patch new file mode 100644 index 0000000..e7b8ea1 --- /dev/null +++ b/0206-xilinx_timer-Send-dbg-msgs-to-stderr-not-stdout.patch @@ -0,0 +1,56 @@ +From c03bf619fe8eb416aaea1f8b75b313a4b314ffeb Mon Sep 17 00:00:00 2001 +From: "Peter A. G. Crosthwaite" +Date: Thu, 28 Jun 2012 16:28:03 +1000 +Subject: [PATCH] xilinx_timer: Send dbg msgs to stderr not stdout + +Signed-off-by: Peter A. G. Crosthwaite +(cherry picked from commit e03377ae75808d33d0a7afc803b37bcda9f796b3) + +Signed-off-by: Michael Roth +--- + hw/xilinx_timer.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/hw/xilinx_timer.c b/hw/xilinx_timer.c +index 053ba02..c02e6ca 100644 +--- a/hw/xilinx_timer.c ++++ b/hw/xilinx_timer.c +@@ -119,7 +119,7 @@ timer_read(void *opaque, target_phys_addr_t addr, unsigned int size) + break; + + } +- D(printf("%s timer=%d %x=%x\n", __func__, timer, addr * 4, r)); ++ D(fprintf(stderr, "%s timer=%d %x=%x\n", __func__, timer, addr * 4, r)); + return r; + } + +@@ -127,7 +127,7 @@ static void timer_enable(struct xlx_timer *xt) + { + uint64_t count; + +- D(printf("%s timer=%d down=%d\n", __func__, ++ D(fprintf(stderr, "%s timer=%d down=%d\n", __func__, + xt->nr, xt->regs[R_TCSR] & TCSR_UDT)); + + ptimer_stop(xt->ptimer); +@@ -152,7 +152,7 @@ timer_write(void *opaque, target_phys_addr_t addr, + addr >>= 2; + timer = timer_from_addr(addr); + xt = &t->timers[timer]; +- D(printf("%s addr=%x val=%x (timer=%d off=%d)\n", ++ D(fprintf(stderr, "%s addr=%x val=%x (timer=%d off=%d)\n", + __func__, addr * 4, value, timer, addr & 3)); + /* Further decoding to address a specific timers reg. */ + addr &= 3; +@@ -189,7 +189,7 @@ static void timer_hit(void *opaque) + { + struct xlx_timer *xt = opaque; + struct timerblock *t = xt->parent; +- D(printf("%s %d\n", __func__, timer)); ++ D(fprintf(stderr, "%s %d\n", __func__, timer)); + xt->regs[R_TCSR] |= TCSR_TINT; + + if (xt->regs[R_TCSR] & TCSR_ARHT) +-- +1.7.12.1 + diff --git a/0207-xilinx.h-Error-check-when-setting-links.patch b/0207-xilinx.h-Error-check-when-setting-links.patch new file mode 100644 index 0000000..924d91f --- /dev/null +++ b/0207-xilinx.h-Error-check-when-setting-links.patch @@ -0,0 +1,54 @@ +From bfec52da020f35304f4e059bf4725fe01dbdd154 Mon Sep 17 00:00:00 2001 +From: "Peter A. G. Crosthwaite" +Date: Mon, 17 Sep 2012 13:41:39 +1000 +Subject: [PATCH] xilinx.h: Error check when setting links + +Assert that the ethernet and dma controller are sucessfully linked to their +peers. + +Signed-off-by: Peter A. G. Crosthwaite +(cherry picked from commit 4b5e52101f9ad077d1c016f2b7130e2fdae6d2da) + +Signed-off-by: Michael Roth +--- + hw/xilinx.h | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/hw/xilinx.h b/hw/xilinx.h +index df06a00..35d6681 100644 +--- a/hw/xilinx.h ++++ b/hw/xilinx.h +@@ -55,13 +55,16 @@ xilinx_axiethernet_create(NICInfo *nd, StreamSlave *peer, + int txmem, int rxmem) + { + DeviceState *dev; ++ Error *errp = NULL; ++ + qemu_check_nic_model(nd, "xlnx.axi-ethernet"); + + dev = qdev_create(NULL, "xlnx.axi-ethernet"); + qdev_set_nic_properties(dev, nd); + qdev_prop_set_uint32(dev, "rxmem", rxmem); + qdev_prop_set_uint32(dev, "txmem", txmem); +- object_property_set_link(OBJECT(dev), OBJECT(peer), "tx_dev", NULL); ++ object_property_set_link(OBJECT(dev), OBJECT(peer), "tx_dev", &errp); ++ assert_no_error(errp); + qdev_init_nofail(dev); + sysbus_mmio_map(sysbus_from_qdev(dev), 0, base); + sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq); +@@ -74,8 +77,11 @@ xilinx_axiethernetdma_init(DeviceState *dev, StreamSlave *peer, + target_phys_addr_t base, qemu_irq irq, + qemu_irq irq2, int freqhz) + { ++ Error *errp = NULL; ++ + qdev_prop_set_uint32(dev, "freqhz", freqhz); +- object_property_set_link(OBJECT(dev), OBJECT(peer), "tx_dev", NULL); ++ object_property_set_link(OBJECT(dev), OBJECT(peer), "tx_dev", &errp); ++ assert_no_error(errp); + qdev_init_nofail(dev); + + sysbus_mmio_map(sysbus_from_qdev(dev), 0, base); +-- +1.7.12.1 + diff --git a/0208-xilinx_timer-Fix-a-compile-error-if-debug-enabled.patch b/0208-xilinx_timer-Fix-a-compile-error-if-debug-enabled.patch new file mode 100644 index 0000000..7c084bf --- /dev/null +++ b/0208-xilinx_timer-Fix-a-compile-error-if-debug-enabled.patch @@ -0,0 +1,41 @@ +From 593883a749b0659ab4a2f2d96e65c34a3bd0fcca Mon Sep 17 00:00:00 2001 +From: Chris Wulff +Date: Sun, 9 Sep 2012 20:20:07 -0400 +Subject: [PATCH] xilinx_timer: Fix a compile error if debug enabled + +There was a missing include of qemu-log and a variable name in a printf was out +of date. + +Signed-off-by: Chris Wulff +Signed-off-by: Peter A. G. Crosthwaite +(cherry picked from commit 8354cd722e0afae63bee3e4cb21c8f0ddb6874c2) + +Signed-off-by: Michael Roth +--- + hw/xilinx_timer.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/hw/xilinx_timer.c b/hw/xilinx_timer.c +index c02e6ca..f410487 100644 +--- a/hw/xilinx_timer.c ++++ b/hw/xilinx_timer.c +@@ -24,6 +24,7 @@ + + #include "sysbus.h" + #include "ptimer.h" ++#include "qemu-log.h" + + #define D(x) + +@@ -189,7 +190,7 @@ static void timer_hit(void *opaque) + { + struct xlx_timer *xt = opaque; + struct timerblock *t = xt->parent; +- D(fprintf(stderr, "%s %d\n", __func__, timer)); ++ D(fprintf(stderr, "%s %d\n", __func__, xt->nr)); + xt->regs[R_TCSR] |= TCSR_TINT; + + if (xt->regs[R_TCSR] & TCSR_ARHT) +-- +1.7.12.1 + diff --git a/0209-pflash_cfi01-fix-vendor-specific-extended-query.patch b/0209-pflash_cfi01-fix-vendor-specific-extended-query.patch new file mode 100644 index 0000000..40c0e51 --- /dev/null +++ b/0209-pflash_cfi01-fix-vendor-specific-extended-query.patch @@ -0,0 +1,49 @@ +From a53ed08e1f8ee2a235213e802f3d5bb3342adaf3 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Date: Mon, 3 Sep 2012 22:47:03 +0200 +Subject: [PATCH] pflash_cfi01: fix vendor specific extended query + +pflash_cfi01 announces a version number of 1.1, which implies +"Protection Register Information" and "Burst Read information" +sections, which are not provided. + +Decrease the version number to 1.0 so that only the "Protection +Register Information" section is needed. + +Set the number of protection fields (0x3f) to 0x01, as 0x00 means 256 +protections field, which makes the CFI table bigger than the current +implementation, causing some kernels to fail to read it. + +Signed-off-by: Aurelien Jarno +(cherry picked from commit 262e1eaafabf32d33a9fa0b03b3c8ea426c5ae1b) + +Signed-off-by: Michael Roth +--- + hw/pflash_cfi01.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/hw/pflash_cfi01.c b/hw/pflash_cfi01.c +index d1c7423..d56b51a 100644 +--- a/hw/pflash_cfi01.c ++++ b/hw/pflash_cfi01.c +@@ -711,7 +711,7 @@ pflash_t *pflash_cfi01_register(target_phys_addr_t base, + pfl->cfi_table[0x33] = 'I'; + + pfl->cfi_table[0x34] = '1'; +- pfl->cfi_table[0x35] = '1'; ++ pfl->cfi_table[0x35] = '0'; + + pfl->cfi_table[0x36] = 0x00; + pfl->cfi_table[0x37] = 0x00; +@@ -723,6 +723,8 @@ pflash_t *pflash_cfi01_register(target_phys_addr_t base, + pfl->cfi_table[0x3b] = 0x00; + pfl->cfi_table[0x3c] = 0x00; + ++ pfl->cfi_table[0x3f] = 0x01; /* Number of protection fields */ ++ + return pfl; + } + +-- +1.7.12.1 + diff --git a/0210-MAINTAINERS-Add-entry-for-QOM-CPU.patch b/0210-MAINTAINERS-Add-entry-for-QOM-CPU.patch new file mode 100644 index 0000000..17385e6 --- /dev/null +++ b/0210-MAINTAINERS-Add-entry-for-QOM-CPU.patch @@ -0,0 +1,36 @@ +From a003aac48bda87a443bb312f478fb651e34998e5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andreas=20F=C3=A4rber?= +Date: Mon, 17 Sep 2012 19:10:32 +0200 +Subject: [PATCH] MAINTAINERS: Add entry for QOM CPU +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Andreas Färber +(cherry picked from commit f2ca052414d7eddc10517e98a5a27ba8099b19b1) + +Signed-off-by: Michael Roth +--- + MAINTAINERS | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/MAINTAINERS b/MAINTAINERS +index 61f8b45..25733fc 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -531,6 +531,12 @@ M: Anthony Liguori + S: Maintained + F: qemu-char.c + ++CPU ++M: Andreas Färber ++S: Supported ++F: qom/cpu.c ++F: include/qemu/cpu.h ++ + Device Tree + M: Peter Crosthwaite + M: Alexander Graf +-- +1.7.12.1 + diff --git a/0211-iSCSI-We-need-to-support-SG_IO-also-from-iscsi_ioctl.patch b/0211-iSCSI-We-need-to-support-SG_IO-also-from-iscsi_ioctl.patch new file mode 100644 index 0000000..856ed96 --- /dev/null +++ b/0211-iSCSI-We-need-to-support-SG_IO-also-from-iscsi_ioctl.patch @@ -0,0 +1,59 @@ +From 76fcbe46a52b467cd2cd96a671bfccd26871153e Mon Sep 17 00:00:00 2001 +From: Ronnie Sahlberg +Date: Thu, 30 Aug 2012 17:28:40 -0700 +Subject: [PATCH] iSCSI: We need to support SG_IO also from iscsi_ioctl() + +We need to support SG_IO from the synchronous iscsi_ioctl() since +scsi-block uses this to do an INQ to the device to discover its properties +This patch makes scsi-block work with iscsi. + +Signed-off-by: Ronnie Sahlberg +Signed-off-by: Paolo Bonzini +(cherry picked from commit f1a12821d7df2e4d21be4f2206f84b4640533e53) + +Signed-off-by: Michael Roth +--- + block/iscsi.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/block/iscsi.c b/block/iscsi.c +index 0b96165..ea16609 100644 +--- a/block/iscsi.c ++++ b/block/iscsi.c +@@ -628,9 +628,17 @@ static BlockDriverAIOCB *iscsi_aio_ioctl(BlockDriverState *bs, + return &acb->common; + } + ++ ++static void ioctl_cb(void *opaque, int status) ++{ ++ int *p_status = opaque; ++ *p_status = status; ++} ++ + static int iscsi_ioctl(BlockDriverState *bs, unsigned long int req, void *buf) + { + IscsiLun *iscsilun = bs->opaque; ++ int status; + + switch (req) { + case SG_GET_VERSION_NUM: +@@ -639,6 +647,15 @@ static int iscsi_ioctl(BlockDriverState *bs, unsigned long int req, void *buf) + case SG_GET_SCSI_ID: + ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type; + break; ++ case SG_IO: ++ status = -EINPROGRESS; ++ iscsi_aio_ioctl(bs, req, buf, ioctl_cb, &status); ++ ++ while (status == -EINPROGRESS) { ++ qemu_aio_wait(); ++ } ++ ++ return 0; + default: + return -1; + } +-- +1.7.12.1 + diff --git a/0212-iSCSI-We-dont-need-to-explicitely-call-qemu_notify_e.patch b/0212-iSCSI-We-dont-need-to-explicitely-call-qemu_notify_e.patch new file mode 100644 index 0000000..d2d4b2d --- /dev/null +++ b/0212-iSCSI-We-dont-need-to-explicitely-call-qemu_notify_e.patch @@ -0,0 +1,39 @@ +From 05bfce1ee580c715dc3d220297b05097bdd007d2 Mon Sep 17 00:00:00 2001 +From: Ronnie Sahlberg +Date: Thu, 30 Aug 2012 16:56:36 -0700 +Subject: [PATCH] iSCSI: We dont need to explicitely call qemu_notify_event() + any more + +We no longer need to explicitely call qemu_notify_event() any more +since this is now done automatically any time the filehandles we listen +to change. + +Signed-off-by: Ronnie Sahlberg +Signed-off-by: Paolo Bonzini +(cherry picked from commit 40a13ca8d28c21062e35b10d9b80e76b92405bdf) + +Signed-off-by: Michael Roth +--- + block/iscsi.c | 6 ------ + 1 file changed, 6 deletions(-) + +diff --git a/block/iscsi.c b/block/iscsi.c +index ea16609..fb001b9 100644 +--- a/block/iscsi.c ++++ b/block/iscsi.c +@@ -167,12 +167,6 @@ iscsi_set_events(IscsiLun *iscsilun) + + } + +- /* If we just added an event, the callback might be delayed +- * unless we call qemu_notify_event(). +- */ +- if (ev & ~iscsilun->events) { +- qemu_notify_event(); +- } + iscsilun->events = ev; + } + +-- +1.7.12.1 + diff --git a/0213-scsi-disk-introduce-check_lba_range.patch b/0213-scsi-disk-introduce-check_lba_range.patch new file mode 100644 index 0000000..567728d --- /dev/null +++ b/0213-scsi-disk-introduce-check_lba_range.patch @@ -0,0 +1,82 @@ +From dd43bce420668dcde639c55bc792cedb1bb8c950 Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Wed, 5 Sep 2012 17:46:18 +0200 +Subject: [PATCH] scsi-disk: introduce check_lba_range + +Abstract the test for an out-of-range (starting block, block count) +pair. + +Signed-off-by: Paolo Bonzini +(cherry picked from commit 444bc908611ccaf4512dc37c33ac3b54d873a62b) + +Signed-off-by: Michael Roth +--- + hw/scsi-disk.c | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c +index 1585683..3959603 100644 +--- a/hw/scsi-disk.c ++++ b/hw/scsi-disk.c +@@ -1449,6 +1449,18 @@ invalid_field: + return; + } + ++static inline bool check_lba_range(SCSIDiskState *s, ++ uint64_t sector_num, uint32_t nb_sectors) ++{ ++ /* ++ * The first line tests that no overflow happens when computing the last ++ * sector. The second line tests that the last accessed sector is in ++ * range. ++ */ ++ return (sector_num <= sector_num + nb_sectors && ++ sector_num + nb_sectors - 1 <= s->qdev.max_lba); ++} ++ + typedef struct UnmapCBData { + SCSIDiskReq *r; + uint8_t *inbuf; +@@ -1473,8 +1485,7 @@ static void scsi_unmap_complete(void *opaque, int ret) + if (data->count > 0 && !r->req.io_canceled) { + sector_num = ldq_be_p(&data->inbuf[0]); + nb_sectors = ldl_be_p(&data->inbuf[8]) & 0xffffffffULL; +- if (sector_num > sector_num + nb_sectors || +- sector_num + nb_sectors - 1 > s->qdev.max_lba) { ++ if (!check_lba_range(s, sector_num, nb_sectors)) { + scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE)); + goto done; + } +@@ -1802,8 +1813,7 @@ static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf) + scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED)); + return 0; + } +- if (r->req.cmd.lba > r->req.cmd.lba + nb_sectors || +- r->req.cmd.lba + nb_sectors - 1 > s->qdev.max_lba) { ++ if (!check_lba_range(s, r->req.cmd.lba, nb_sectors)) { + goto illegal_lba; + } + +@@ -1878,8 +1888,7 @@ static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf) + if (r->req.cmd.buf[1] & 0xe0) { + goto illegal_request; + } +- if (r->req.cmd.lba > r->req.cmd.lba + len || +- r->req.cmd.lba + len - 1 > s->qdev.max_lba) { ++ if (!check_lba_range(s, r->req.cmd.lba, len)) { + goto illegal_lba; + } + r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512); +@@ -1907,8 +1916,7 @@ static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf) + if (r->req.cmd.buf[1] & 0xe0) { + goto illegal_request; + } +- if (r->req.cmd.lba > r->req.cmd.lba + len || +- r->req.cmd.lba + len - 1 > s->qdev.max_lba) { ++ if (!check_lba_range(s, r->req.cmd.lba, len)) { + goto illegal_lba; + } + r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512); +-- +1.7.12.1 + diff --git a/0214-scsi-disk-fix-check-for-out-of-range-LBA.patch b/0214-scsi-disk-fix-check-for-out-of-range-LBA.patch new file mode 100644 index 0000000..9deef86 --- /dev/null +++ b/0214-scsi-disk-fix-check-for-out-of-range-LBA.patch @@ -0,0 +1,38 @@ +From 2fd88dcb7fdb90508a85c30a32516ff57f081cba Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Wed, 5 Sep 2012 17:54:36 +0200 +Subject: [PATCH] scsi-disk: fix check for out-of-range LBA + +This fix is needed to correctly handle 0-block read and writes. +Without it, a 0-block access at LBA 0 would underflow. + +Signed-off-by: Paolo Bonzini +(cherry picked from commit 12ca76fc48081b3a0ad1a70546abfcf198aedfc4) + +Signed-off-by: Michael Roth +--- + hw/scsi-disk.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c +index 3959603..d621852 100644 +--- a/hw/scsi-disk.c ++++ b/hw/scsi-disk.c +@@ -1456,9 +1456,13 @@ static inline bool check_lba_range(SCSIDiskState *s, + * The first line tests that no overflow happens when computing the last + * sector. The second line tests that the last accessed sector is in + * range. ++ * ++ * Careful, the computations should not underflow for nb_sectors == 0, ++ * and a 0-block read to the first LBA beyond the end of device is ++ * valid. + */ + return (sector_num <= sector_num + nb_sectors && +- sector_num + nb_sectors - 1 <= s->qdev.max_lba); ++ sector_num + nb_sectors <= s->qdev.max_lba + 1); + } + + typedef struct UnmapCBData { +-- +1.7.12.1 + diff --git a/0215-SCSI-Standard-INQUIRY-data-should-report-HiSup-flag-.patch b/0215-SCSI-Standard-INQUIRY-data-should-report-HiSup-flag-.patch new file mode 100644 index 0000000..840be83 --- /dev/null +++ b/0215-SCSI-Standard-INQUIRY-data-should-report-HiSup-flag-.patch @@ -0,0 +1,43 @@ +From 8444d4c996120a2fc21547a784c258e639f1e8fb Mon Sep 17 00:00:00 2001 +From: Ronnie Sahlberg +Date: Fri, 14 Sep 2012 18:13:29 -0700 +Subject: [PATCH] SCSI: Standard INQUIRY data should report HiSup flag as set. + +QEMU as far as I know only reports LUN numbers using the modes that +are described in SAM4. +As such, since all LUN numbers generated by the SCSI emulation in QEMU +follow SAM4, we should set the HiSup bit in the standard INQUIRY data +to indicate such. + +From SAM4: + 4.6.3 LUNs overview + All LUN formats described in this standard are hierarchical in + structure even when only a single level in that hierarchy is used. + The HISUP bit shall be set to one in the standard INQUIRY data + (see SPC-4) when any LUN format described in this standard is used. + Non-hierarchical formats are outside the scope of this standard. + +Signed-off-by: Ronnie Sahlberg +(cherry picked from commit 1109c894052751df99962c009fd7dbae397721f5) + +Signed-off-by: Michael Roth +--- + hw/scsi-disk.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c +index d621852..7ed1bde 100644 +--- a/hw/scsi-disk.c ++++ b/hw/scsi-disk.c +@@ -678,7 +678,7 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf) + * is actually implemented, but we're good enough. + */ + outbuf[2] = 5; +- outbuf[3] = 2; /* Format 2 */ ++ outbuf[3] = 2 | 0x10; /* Format 2, HiSup */ + + if (buflen > 36) { + outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */ +-- +1.7.12.1 + diff --git a/0216-audio-Fix-warning-from-static-code-analysis.patch b/0216-audio-Fix-warning-from-static-code-analysis.patch new file mode 100644 index 0000000..d25383c --- /dev/null +++ b/0216-audio-Fix-warning-from-static-code-analysis.patch @@ -0,0 +1,47 @@ +From eb26fee60bcc7b1191395c21f41c22e5e4f24182 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Mon, 3 Sep 2012 09:25:16 +0000 +Subject: [PATCH] audio: Fix warning from static code analysis + +smatch report: +audio/audio_template.h:416 AUD_open_out(18) warn: + variable dereferenced before check 'as' (see line 414) + +Moving the ldebug statement after the statement which checks 'as' +fixes that warning. + +Signed-off-by: Stefan Weil +Signed-off-by: malc +(cherry picked from commit 93b6599734f81328ee3d608f57667742cafeea72) + +Signed-off-by: Michael Roth +--- + audio/audio_template.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/audio/audio_template.h b/audio/audio_template.h +index 519432a..16f7880 100644 +--- a/audio/audio_template.h ++++ b/audio/audio_template.h +@@ -410,15 +410,15 @@ SW *glue (AUD_open_, TYPE) ( + SW *old_sw = NULL; + #endif + +- ldebug ("open %s, freq %d, nchannels %d, fmt %d\n", +- name, as->freq, as->nchannels, as->fmt); +- + if (audio_bug (AUDIO_FUNC, !card || !name || !callback_fn || !as)) { + dolog ("card=%p name=%p callback_fn=%p as=%p\n", + card, name, callback_fn, as); + goto fail; + } + ++ ldebug ("open %s, freq %d, nchannels %d, fmt %d\n", ++ name, as->freq, as->nchannels, as->fmt); ++ + if (audio_bug (AUDIO_FUNC, audio_validate_settings (as))) { + audio_print_settings (as); + goto fail; +-- +1.7.12.1 + diff --git a/0217-qemu-ga-Remove-unreachable-code-after-g_error.patch b/0217-qemu-ga-Remove-unreachable-code-after-g_error.patch new file mode 100644 index 0000000..5b64003 --- /dev/null +++ b/0217-qemu-ga-Remove-unreachable-code-after-g_error.patch @@ -0,0 +1,40 @@ +From 631ea4153ed0e1dc8688c463e0924b0dd8dc7ea5 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 1 Sep 2012 09:34:15 +0200 +Subject: [PATCH] qemu-ga: Remove unreachable code after g_error + +Report from smatch: +qemu-ga.c:117 register_signal_handlers(11) info: ignoring unreachable code. +qemu-ga.c:122 register_signal_handlers(16) info: ignoring unreachable code. + +g_error calls abort which terminates the program. + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit b548828862d3bf7214b7ef9cb361356b153b89c9) + +Signed-off-by: Michael Roth +--- + qemu-ga.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/qemu-ga.c b/qemu-ga.c +index 7623079..b747470 100644 +--- a/qemu-ga.c ++++ b/qemu-ga.c +@@ -114,12 +114,10 @@ static gboolean register_signal_handlers(void) + ret = sigaction(SIGINT, &sigact, NULL); + if (ret == -1) { + g_error("error configuring signal handler: %s", strerror(errno)); +- return false; + } + ret = sigaction(SIGTERM, &sigact, NULL); + if (ret == -1) { + g_error("error configuring signal handler: %s", strerror(errno)); +- return false; + } + + return true; +-- +1.7.12.1 + diff --git a/0218-qemu-sockets-Fix-potential-memory-leak.patch b/0218-qemu-sockets-Fix-potential-memory-leak.patch new file mode 100644 index 0000000..35d9a44 --- /dev/null +++ b/0218-qemu-sockets-Fix-potential-memory-leak.patch @@ -0,0 +1,32 @@ +From 46193407875faf8a8be20dabc4ecfee4ceb6f1a3 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 1 Sep 2012 09:40:26 +0200 +Subject: [PATCH] qemu-sockets: Fix potential memory leak + +The old code leaks variable 'peer'. + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 39b384591fda27d6e1213cea0b11b1ebe0ed4b74) + +Signed-off-by: Michael Roth +--- + qemu-sockets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/qemu-sockets.c b/qemu-sockets.c +index 361d890..037775b 100644 +--- a/qemu-sockets.c ++++ b/qemu-sockets.c +@@ -353,7 +353,7 @@ int inet_dgram_opts(QemuOpts *opts) + if (0 != (rc = getaddrinfo(addr, port, &ai, &local))) { + fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port, + gai_strerror(rc)); +- return -1; ++ goto err; + } + + /* create socket */ +-- +1.7.12.1 + diff --git a/0219-cadence_uart-Fix-buffer-overflow.patch b/0219-cadence_uart-Fix-buffer-overflow.patch new file mode 100644 index 0000000..3dbf127 --- /dev/null +++ b/0219-cadence_uart-Fix-buffer-overflow.patch @@ -0,0 +1,35 @@ +From d563cd7529186355aa8dc11e2cc7d16342dca1c9 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 1 Sep 2012 11:12:23 +0200 +Subject: [PATCH] cadence_uart: Fix buffer overflow + +Report from smatch: +hw/cadence_uart.c:413 uart_read(13) error: buffer overflow 's->r' 18 <= 18 + +This fixes read access to s->r[R_MAX] which is behind the limits of s->r. + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 5d40097fc09fe5d34cf316a411dc27d455ac2cd0) + +Signed-off-by: Michael Roth +--- + hw/cadence_uart.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/cadence_uart.c b/hw/cadence_uart.c +index d98e531..f8afc4e 100644 +--- a/hw/cadence_uart.c ++++ b/hw/cadence_uart.c +@@ -404,7 +404,7 @@ static uint64_t uart_read(void *opaque, target_phys_addr_t offset, + uint32_t c = 0; + + offset >>= 2; +- if (offset > R_MAX) { ++ if (offset >= R_MAX) { + return 0; + } else if (offset == R_TX_RX) { + uart_read_rx_fifo(s, &c); +-- +1.7.12.1 + diff --git a/0220-lm4549-Fix-buffer-overflow.patch b/0220-lm4549-Fix-buffer-overflow.patch new file mode 100644 index 0000000..656c9aa --- /dev/null +++ b/0220-lm4549-Fix-buffer-overflow.patch @@ -0,0 +1,47 @@ +From 00338325c4a2c5b0010462b21a4373cbb4341c9d Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 1 Sep 2012 12:43:41 +0200 +Subject: [PATCH] lm4549: Fix buffer overflow + +Report from smatch: +lm4549.c:234 lm4549_write_samples(14) error: + buffer overflow 's->buffer' 1024 <= 1024 + +There must be enough space to add two entries starting with index +s->buffer_level, therefore the old check was wrong. + +[Peter Maydell clarifies the nature of the +analyser warning: + +I don't object to making the change to placate the analyser, +but I don't think this is actually a buffer overrun. We always +add and remove samples from the buffer two at a time, so it's +not possible to get here with s->buffer_level == BUFFER_SIZE-1 +(which is the only case where the old and new conditions +give different answers).] + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 8139626643cbe8dc07bd9acc88057effeedf8064) + +Signed-off-by: Michael Roth +--- + hw/lm4549.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/lm4549.c b/hw/lm4549.c +index 80b3ec4..e0137d5 100644 +--- a/hw/lm4549.c ++++ b/hw/lm4549.c +@@ -224,7 +224,7 @@ uint32_t lm4549_write_samples(lm4549_state *s, uint32_t left, uint32_t right) + This model supports 16-bit playback. + */ + +- if (s->buffer_level >= LM4549_BUFFER_SIZE) { ++ if (s->buffer_level > LM4549_BUFFER_SIZE - 2) { + DPRINTF("write_sample Buffer full\n"); + return 0; + } +-- +1.7.12.1 + diff --git a/0221-ioh3420-Remove-unreachable-code.patch b/0221-ioh3420-Remove-unreachable-code.patch new file mode 100644 index 0000000..e465486 --- /dev/null +++ b/0221-ioh3420-Remove-unreachable-code.patch @@ -0,0 +1,33 @@ +From abb7dc3467f809d3d3dfc0aef70fce7ee542c550 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 1 Sep 2012 12:56:03 +0200 +Subject: [PATCH] ioh3420: Remove unreachable code + +Report from smatch: +hw/ioh3420.c:128 ioh3420_initfn(35) info: ignoring unreachable code. + +Signed-off-by: Stefan Weil +Reviewed-by: Juan Quintela +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 997f15672a5ca7714cf310d92f475d2c5fe40970) + +Signed-off-by: Michael Roth +--- + hw/ioh3420.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/hw/ioh3420.c b/hw/ioh3420.c +index 94a537c..4d31473 100644 +--- a/hw/ioh3420.c ++++ b/hw/ioh3420.c +@@ -125,7 +125,6 @@ static int ioh3420_initfn(PCIDevice *d) + rc = pcie_chassis_add_slot(s); + if (rc < 0) { + goto err_pcie_cap; +- return rc; + } + pcie_cap_root_init(d); + rc = pcie_aer_init(d, IOH_EP_AER_OFFSET); +-- +1.7.12.1 + diff --git a/0222-pflash_cfi01-Fix-warning-caused-by-unreachable-code.patch b/0222-pflash_cfi01-Fix-warning-caused-by-unreachable-code.patch new file mode 100644 index 0000000..ef3cecd --- /dev/null +++ b/0222-pflash_cfi01-Fix-warning-caused-by-unreachable-code.patch @@ -0,0 +1,65 @@ +From 4377b521568c8dca87cfb8fad5629b3203c08032 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 1 Sep 2012 13:00:48 +0200 +Subject: [PATCH] pflash_cfi01: Fix warning caused by unreachable code + +Report from smatch: +hw/pflash_cfi01.c:431 pflash_write(180) info: ignoring unreachable code. + +Instead of removing the return statement after the switch statement, +the patch replaces the return statements in the switch statement by +break statements. Other switch statements in the same code do it also +like that. + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 12dabc79f976d66755025272f7e2e8e4da31715a) + +Signed-off-by: Michael Roth +--- + hw/pflash_cfi01.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/hw/pflash_cfi01.c b/hw/pflash_cfi01.c +index d56b51a..ac503cf 100644 +--- a/hw/pflash_cfi01.c ++++ b/hw/pflash_cfi01.c +@@ -320,7 +320,7 @@ static void pflash_write(pflash_t *pfl, target_phys_addr_t offset, + } + pfl->wcycle++; + pfl->cmd = cmd; +- return; ++ break; + case 1: + switch (pfl->cmd) { + case 0x10: /* Single Byte Program */ +@@ -375,7 +375,7 @@ static void pflash_write(pflash_t *pfl, target_phys_addr_t offset, + default: + goto error_flash; + } +- return; ++ break; + case 2: + switch (pfl->cmd) { + case 0xe8: /* Block write */ +@@ -406,7 +406,7 @@ static void pflash_write(pflash_t *pfl, target_phys_addr_t offset, + default: + goto error_flash; + } +- return; ++ break; + case 3: /* Confirm mode */ + switch (pfl->cmd) { + case 0xe8: /* Block write */ +@@ -422,7 +422,7 @@ static void pflash_write(pflash_t *pfl, target_phys_addr_t offset, + default: + goto error_flash; + } +- return; ++ break; + default: + /* Should never happen */ + DPRINTF("%s: invalid write state\n", __func__); +-- +1.7.12.1 + diff --git a/0223-curses-don-t-initialize-curses-when-qemu-is-daemoniz.patch b/0223-curses-don-t-initialize-curses-when-qemu-is-daemoniz.patch new file mode 100644 index 0000000..9f29c5e --- /dev/null +++ b/0223-curses-don-t-initialize-curses-when-qemu-is-daemoniz.patch @@ -0,0 +1,90 @@ +From 949f263f90b97dadae23ad205c4c5a3671ecb3aa Mon Sep 17 00:00:00 2001 +From: Hitoshi Mitake +Date: Sat, 15 Sep 2012 01:15:41 +0900 +Subject: [PATCH] curses: don't initialize curses when qemu is daemonized + +Current qemu initializes curses even if -daemonize option is +passed. This cause problem because shell prompt appears without +calling endwin(). + +This patch adds new function, is_daemonized(), to OS dependent +code. With this function, curses_display_init() can check that qemu is +daemonized or not. If daemonized, curses_display_init() isn't called +and the problem is avoided. + +Of course, -daemonize && -curses doesn't make sense. Users shouldn't +pass the arguments at the same time. But the problem is very painful +because Ctrl-C cannot be delivered to the terminal. + +Cc: Andrzej Zaborowski +Cc: Stefan Hajnoczi +Cc: Anthony Liguori +Cc: Michael Roth +Signed-off-by: Hitoshi Mitake +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 995ee2bf469de6bbe5ce133ec853392b2a4ce34c) + +Signed-off-by: Michael Roth +--- + os-posix.c | 5 +++++ + qemu-os-posix.h | 2 ++ + qemu-os-win32.h | 5 +++++ + vl.c | 4 +++- + 4 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/os-posix.c b/os-posix.c +index 79fa228..eabccb8 100644 +--- a/os-posix.c ++++ b/os-posix.c +@@ -360,3 +360,8 @@ int qemu_create_pidfile(const char *filename) + /* keep pidfile open & locked forever */ + return 0; + } ++ ++bool is_daemonized(void) ++{ ++ return daemonize; ++} +diff --git a/qemu-os-posix.h b/qemu-os-posix.h +index 8e1149d..7f198e4 100644 +--- a/qemu-os-posix.h ++++ b/qemu-os-posix.h +@@ -46,4 +46,6 @@ typedef struct timeval qemu_timeval; + typedef struct timespec qemu_timespec; + int qemu_utimens(const char *path, const qemu_timespec *times); + ++bool is_daemonized(void); ++ + #endif +diff --git a/qemu-os-win32.h b/qemu-os-win32.h +index 753679b..b3e451b 100644 +--- a/qemu-os-win32.h ++++ b/qemu-os-win32.h +@@ -86,4 +86,9 @@ typedef struct { + } qemu_timeval; + int qemu_gettimeofday(qemu_timeval *tp); + ++static inline bool is_daemonized(void) ++{ ++ return false; ++} ++ + #endif +diff --git a/vl.c b/vl.c +index c681c33..49d7a52 100644 +--- a/vl.c ++++ b/vl.c +@@ -3692,7 +3692,9 @@ int main(int argc, char **argv, char **envp) + break; + #if defined(CONFIG_CURSES) + case DT_CURSES: +- curses_display_init(ds, full_screen); ++ if (!is_daemonized()) { ++ curses_display_init(ds, full_screen); ++ } + break; + #endif + #if defined(CONFIG_SDL) +-- +1.7.12.1 + diff --git a/0224-TextConsole-saturate-escape-parameter-in-TTY_STATE_C.patch b/0224-TextConsole-saturate-escape-parameter-in-TTY_STATE_C.patch new file mode 100644 index 0000000..523d5f4 --- /dev/null +++ b/0224-TextConsole-saturate-escape-parameter-in-TTY_STATE_C.patch @@ -0,0 +1,36 @@ +From 93eaa3c8e14988fb38dfa9ae35067472bfd089b8 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Mon, 17 Sep 2012 11:10:03 +0200 +Subject: [PATCH] TextConsole: saturate escape parameter in TTY_STATE_CSI + +Signed-off-by: Laszlo Ersek +Reviewed-by: Markus Armbruster +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit c10600af60865ba6c60987be313102ebb5fcee57) + +Signed-off-by: Michael Roth +--- + console.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/console.c b/console.c +index 8b5e21d..314f5a5 100644 +--- a/console.c ++++ b/console.c +@@ -937,8 +937,11 @@ static void console_putchar(TextConsole *s, int ch) + case TTY_STATE_CSI: /* handle escape sequence parameters */ + if (ch >= '0' && ch <= '9') { + if (s->nb_esc_params < MAX_ESC_PARAMS) { +- s->esc_params[s->nb_esc_params] = +- s->esc_params[s->nb_esc_params] * 10 + ch - '0'; ++ int *param = &s->esc_params[s->nb_esc_params]; ++ int digit = (ch - '0'); ++ ++ *param = (*param <= (INT_MAX - digit) / 10) ? ++ *param * 10 + digit : INT_MAX; + } + } else { + if (s->nb_esc_params < MAX_ESC_PARAMS) +-- +1.7.12.1 + diff --git a/0225-linux-user-Remove-redundant-null-check-and-replace-f.patch b/0225-linux-user-Remove-redundant-null-check-and-replace-f.patch new file mode 100644 index 0000000..acb18c0 --- /dev/null +++ b/0225-linux-user-Remove-redundant-null-check-and-replace-f.patch @@ -0,0 +1,42 @@ +From 755055c908ccda2dd9410bb1bde1f3621017fb0c Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Tue, 4 Sep 2012 22:14:19 +0200 +Subject: [PATCH] linux-user: Remove redundant null check and replace free by + g_free + +Report from smatch: + +linux-user/syscall.c:3632 do_ioctl_dm(220) info: + redundant null check on big_buf calling free() + +'big_buf' was allocated by g_malloc0, therefore free was also +replaced by g_free. + +Signed-off-by: Stefan Weil +Reviewed-by: Peter Maydell +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit ad11ad77748bdd8016370db210751683dc038dd6) + +Signed-off-by: Michael Roth +--- + linux-user/syscall.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/linux-user/syscall.c b/linux-user/syscall.c +index 6257a04..471d060 100644 +--- a/linux-user/syscall.c ++++ b/linux-user/syscall.c +@@ -3628,9 +3628,7 @@ static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int fd, + unlock_user(argptr, arg, target_size); + } + out: +- if (big_buf) { +- free(big_buf); +- } ++ g_free(big_buf); + return ret; + } + +-- +1.7.12.1 + diff --git a/0226-net-socket-Fix-compiler-warning-regression-for-MinGW.patch b/0226-net-socket-Fix-compiler-warning-regression-for-MinGW.patch new file mode 100644 index 0000000..e3cb65f --- /dev/null +++ b/0226-net-socket-Fix-compiler-warning-regression-for-MinGW.patch @@ -0,0 +1,68 @@ +From 96f47b0d2c307173e0a545ea230e21f1ce8d3fa2 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 22 Sep 2012 21:13:28 +0200 +Subject: [PATCH] net/socket: Fix compiler warning (regression for MinGW) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit 213fd5087e2e4e2da10ad266df0ba950cf7618bf removed a type cast +which is needed for MinGW: + +net/socket.c:136: warning: + pointer targets in passing argument 2 of ‘sendto’ differ in signedness +/usr/lib/gcc/amd64-mingw32msvc/4.4.4/../../../../amd64-mingw32msvc/include/winsock2.h:1313: note: + expected ‘const char *’ but argument is of type ‘const uint8_t *’ + +Add a 'qemu_sendto' macro which provides that type cast where needed +and use the new macro instead of 'sendto'. + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 73062dfe6be0050dbd43ce3516e935ebb2545add) + +Signed-off-by: Michael Roth +--- + net/socket.c | 6 +++--- + qemu-common.h | 5 +++++ + 2 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/net/socket.c b/net/socket.c +index c3e55b8..83f21b5 100644 +--- a/net/socket.c ++++ b/net/socket.c +@@ -131,9 +131,9 @@ static ssize_t net_socket_receive_dgram(NetClientState *nc, const uint8_t *buf, + ssize_t ret; + + do { +- ret = sendto(s->fd, buf, size, 0, +- (struct sockaddr *)&s->dgram_dst, +- sizeof(s->dgram_dst)); ++ ret = qemu_sendto(s->fd, buf, size, 0, ++ (struct sockaddr *)&s->dgram_dst, ++ sizeof(s->dgram_dst)); + } while (ret == -1 && errno == EINTR); + + if (ret == -1 && errno == EAGAIN) { +diff --git a/qemu-common.h b/qemu-common.h +index e5c2bcd..15d9e4e 100644 +--- a/qemu-common.h ++++ b/qemu-common.h +@@ -223,9 +223,14 @@ int qemu_pipe(int pipefd[2]); + #endif + + #ifdef _WIN32 ++/* MinGW needs a type cast for the 'buf' argument. */ + #define qemu_recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags) ++#define qemu_sendto(sockfd, buf, len, flags, destaddr, addrlen) \ ++ sendto(sockfd, (const void *)buf, len, flags, destaddr, addrlen) + #else + #define qemu_recv(sockfd, buf, len, flags) recv(sockfd, buf, len, flags) ++#define qemu_sendto(sockfd, buf, len, flags, destaddr, addrlen) \ ++ sendto(sockfd, buf, len, flags, destaddr, addrlen) + #endif + + /* Error handling. */ +-- +1.7.12.1 + diff --git a/0227-w32-Always-use-standard-instead-of-native-format-str.patch b/0227-w32-Always-use-standard-instead-of-native-format-str.patch new file mode 100644 index 0000000..91b7bba --- /dev/null +++ b/0227-w32-Always-use-standard-instead-of-native-format-str.patch @@ -0,0 +1,52 @@ +From 675a9bdcd5bf5bd663ee58cf5e4be4acf12d34ce Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Wed, 22 Aug 2012 21:42:32 +0200 +Subject: [PATCH] w32: Always use standard instead of native format strings +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +GLib 2.0 include files use __printf__ for the format attribute +which resolves to native format strings on w32 hosts. + +QEMU wants standard format strings instead of native format +strings, so we simply change any declaration with __printf__ +to use __gnu_printf__. + +This works because all basic printf functions support both +kinds of format strings. + +This fixes a compiler warning: + +qapi/string-output-visitor.c: In function ‘print_type_int’: +qapi/string-output-visitor.c:34:5: warning: unknown conversion type character ‘l’ in format [-Wformat] +qapi/string-output-visitor.c:34:5: warning: too many arguments for format [-Wformat-extra-args] + +Signed-off-by: Stefan Weil +Signed-off-by: Stefan Hajnoczi +(cherry picked from commit 95df51a4a02a853af8828c281bce2d4f2a41d6fd) + +Signed-off-by: Michael Roth +--- + compiler.h | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/compiler.h b/compiler.h +index 07ba1f8..c734a71 100644 +--- a/compiler.h ++++ b/compiler.h +@@ -44,6 +44,11 @@ + /* Use gnu_printf when supported (qemu uses standard format strings). */ + # define GCC_ATTR __attribute__((__unused__, format(gnu_printf, 1, 2))) + # define GCC_FMT_ATTR(n, m) __attribute__((format(gnu_printf, n, m))) ++# if defined(_WIN32) ++ /* Map __printf__ to __gnu_printf__ because we want standard format strings ++ * even when MinGW or GLib include files use __printf__. */ ++# define __printf__ __gnu_printf__ ++# endif + # endif + #if defined(_WIN32) + #define GCC_WEAK __attribute__((weak)) +-- +1.7.12.1 + diff --git a/0228-w32-Add-implementation-of-gmtime_r-localtime_r.patch b/0228-w32-Add-implementation-of-gmtime_r-localtime_r.patch new file mode 100644 index 0000000..16473ea --- /dev/null +++ b/0228-w32-Add-implementation-of-gmtime_r-localtime_r.patch @@ -0,0 +1,81 @@ +From 27ca56812d2140c774f9d2b67a2919ef47c69758 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Sat, 22 Sep 2012 22:26:19 +0200 +Subject: [PATCH] w32: Add implementation of gmtime_r, localtime_r + +Those functions are missing in MinGW. + +Some versions of MinGW-w64 include defines for gmtime_r and localtime_r. +Older versions of these macros are buggy (they return a pointer to a +static variable), therefore we don't want them. Newer versions are +similar to the code used here, but without the memset. + +The implementation which is used here is not strictly reentrant, +but sufficiently good for QEMU on w32 or w64. + +Signed-off-by: Stefan Weil +[blauwirbel@gmail.com: added comment about locking] +Signed-off-by: Blue Swirl +(cherry picked from commit d3e8f95753114a827f9cd8e819b1d5cc8333f76b) + +Signed-off-by: Michael Roth +--- + oslib-win32.c | 24 ++++++++++++++++++++++++ + qemu-os-win32.h | 6 ++++++ + 2 files changed, 30 insertions(+) + +diff --git a/oslib-win32.c b/oslib-win32.c +index ffbc6d0..51b33e8 100644 +--- a/oslib-win32.c ++++ b/oslib-win32.c +@@ -74,6 +74,30 @@ void qemu_vfree(void *ptr) + VirtualFree(ptr, 0, MEM_RELEASE); + } + ++/* FIXME: add proper locking */ ++struct tm *gmtime_r(const time_t *timep, struct tm *result) ++{ ++ struct tm *p = gmtime(timep); ++ memset(result, 0, sizeof(*result)); ++ if (p) { ++ *result = *p; ++ p = result; ++ } ++ return p; ++} ++ ++/* FIXME: add proper locking */ ++struct tm *localtime_r(const time_t *timep, struct tm *result) ++{ ++ struct tm *p = localtime(timep); ++ memset(result, 0, sizeof(*result)); ++ if (p) { ++ *result = *p; ++ p = result; ++ } ++ return p; ++} ++ + void socket_set_block(int fd) + { + unsigned long opt = 0; +diff --git a/qemu-os-win32.h b/qemu-os-win32.h +index b3e451b..8ba466d 100644 +--- a/qemu-os-win32.h ++++ b/qemu-os-win32.h +@@ -68,6 +68,12 @@ + /* Declaration of ffs() is missing in MinGW's strings.h. */ + int ffs(int i); + ++/* Missing POSIX functions. Don't use MinGW-w64 macros. */ ++#undef gmtime_r ++struct tm *gmtime_r(const time_t *timep, struct tm *result); ++#undef localtime_r ++struct tm *localtime_r(const time_t *timep, struct tm *result); ++ + static inline void os_setup_signal_handling(void) {} + static inline void os_daemonize(void) {} + static inline void os_setup_post(void) {} +-- +1.7.12.1 + diff --git a/0229-blockdev-preserve-readonly-and-snapshot-states-acros.patch b/0229-blockdev-preserve-readonly-and-snapshot-states-acros.patch new file mode 100644 index 0000000..19bbd20 --- /dev/null +++ b/0229-blockdev-preserve-readonly-and-snapshot-states-acros.patch @@ -0,0 +1,37 @@ +From 2afae8c7d44a043e36038d5f6f600034ad2b2aca Mon Sep 17 00:00:00 2001 +From: Kevin Shanahan +Date: Fri, 21 Sep 2012 08:50:22 +0930 +Subject: [PATCH] blockdev: preserve readonly and snapshot states across media + changes + +If readonly=on is given at device creation time, the ->readonly flag +needs to be set in the block driver state for this device so that +readonly-ness is preserved across media changes (qmp change command). +Similarly, to preserve the snapshot property requires ->open_flags to +be correct. + +Signed-off-by: Kevin Shanahan +Signed-off-by: Kevin Wolf +(cherry picked from commit 80dd1aae3657a902d262f5d20a7a3c655b23705e) + +Signed-off-by: Michael Roth +--- + blockdev.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/blockdev.c b/blockdev.c +index 4a5266e..9ba3503 100644 +--- a/blockdev.c ++++ b/blockdev.c +@@ -533,6 +533,8 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi) + if_name[type], mediastr, unit_id); + } + dinfo->bdrv = bdrv_new(dinfo->id); ++ dinfo->bdrv->open_flags = snapshot ? BDRV_O_SNAPSHOT : 0; ++ dinfo->bdrv->read_only = ro; + dinfo->devaddr = devaddr; + dinfo->type = type; + dinfo->bus = bus_id; +-- +1.7.12.1 + diff --git a/0230-block-correctly-set-the-keep_read_only-flag.patch b/0230-block-correctly-set-the-keep_read_only-flag.patch new file mode 100644 index 0000000..ec1affa --- /dev/null +++ b/0230-block-correctly-set-the-keep_read_only-flag.patch @@ -0,0 +1,104 @@ +From 48f550221420bd90ddca06c6c7492ea3aca9b644 Mon Sep 17 00:00:00 2001 +From: Jeff Cody +Date: Thu, 20 Sep 2012 15:13:17 -0400 +Subject: [PATCH] block: correctly set the keep_read_only flag + +I believe the bs->keep_read_only flag is supposed to reflect +the initial open state of the device. If the device is initially +opened R/O, then commit operations, or reopen operations changing +to R/W, are prohibited. + +Currently, the keep_read_only flag is only accurate for the active +layer, and its backing file. Subsequent images end up always having +the keep_read_only flag set. + +For instance, what happens now: + +[ base ] kro = 1, ro = 1 + | + v +[ snap-1 ] kro = 1, ro = 1 + | + v +[ snap-2 ] kro = 0, ro = 1 + | + v +[ active ] kro = 0, ro = 0 + +What we want: + +[ base ] kro = 0, ro = 1 + | + v +[ snap-1 ] kro = 0, ro = 1 + | + v +[ snap-2 ] kro = 0, ro = 1 + | + v +[ active ] kro = 0, ro = 0 + +Signed-off-by: Jeff Cody +Signed-off-by: Kevin Wolf +(cherry picked from commit be028adcedd68ca4d78fdc43e7e2fa4f1cdbc653) + +Signed-off-by: Michael Roth +--- + block.c | 14 +++++++------- + block.h | 1 + + 2 files changed, 8 insertions(+), 7 deletions(-) + +diff --git a/block.c b/block.c +index e78039b..4c0e7f5 100644 +--- a/block.c ++++ b/block.c +@@ -668,7 +668,7 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename, + open_flags |= BDRV_O_RDWR; + } + +- bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR); ++ bs->read_only = !(open_flags & BDRV_O_RDWR); + + /* Open the image, either directly or using a protocol */ + if (drv->bdrv_file_open) { +@@ -808,6 +808,12 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags, + goto unlink_and_fail; + } + ++ if (flags & BDRV_O_RDWR) { ++ flags |= BDRV_O_ALLOW_RDWR; ++ } ++ ++ bs->keep_read_only = !(flags & BDRV_O_ALLOW_RDWR); ++ + /* Open the image */ + ret = bdrv_open_common(bs, filename, flags, drv); + if (ret < 0) { +@@ -837,12 +843,6 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags, + bdrv_close(bs); + return ret; + } +- if (bs->is_temporary) { +- bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR); +- } else { +- /* base image inherits from "parent" */ +- bs->backing_hd->keep_read_only = bs->keep_read_only; +- } + } + + if (!bdrv_key_required(bs)) { +diff --git a/block.h b/block.h +index 2e2be11..4d919c2 100644 +--- a/block.h ++++ b/block.h +@@ -80,6 +80,7 @@ typedef struct BlockDevOps { + #define BDRV_O_COPY_ON_READ 0x0400 /* copy read backing sectors into image */ + #define BDRV_O_INCOMING 0x0800 /* consistency hint for incoming migration */ + #define BDRV_O_CHECK 0x1000 /* open solely for consistency check */ ++#define BDRV_O_ALLOW_RDWR 0x2000 /* allow reopen to change from r/o to r/w */ + + #define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH) + +-- +1.7.12.1 + diff --git a/0231-configure-Allow-builds-without-any-system-or-user-em.patch b/0231-configure-Allow-builds-without-any-system-or-user-em.patch new file mode 100644 index 0000000..d40c6dc --- /dev/null +++ b/0231-configure-Allow-builds-without-any-system-or-user-em.patch @@ -0,0 +1,59 @@ +From 20936a5a29113b32aeb319ca5ebe2a754cd3e014 Mon Sep 17 00:00:00 2001 +From: Stefan Weil +Date: Fri, 14 Sep 2012 19:02:30 +0200 +Subject: [PATCH] configure: Allow builds without any system or user emulation + +The old code aborted configure when no emulation target was selected. +Even after removing the 'exit 1', it tried to read from STDIN +when QEMU was configured with + + configure' '--disable-user' '--disable-system' + +This is fixed here. + +Signed-off-by: Stefan Weil +Signed-off-by: Anthony Liguori +(cherry picked from commit 8bdd3d499fe0ddffa9901c56ab3bc8911d5b8be0) + +Signed-off-by: Michael Roth +--- + Makefile | 5 +++++ + configure | 4 ---- + 2 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/Makefile b/Makefile +index 1cd5bc8..dd11e3c 100644 +--- a/Makefile ++++ b/Makefile +@@ -52,8 +52,13 @@ SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory) BUILD_DIR=$(BUILD_DIR) + SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_DIRS)) + SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %/config-devices.mak.d, $(TARGET_DIRS)) + ++ifeq ($(SUBDIR_DEVICES_MAK),) ++config-all-devices.mak: ++ $(call quiet-command,echo '# no devices' > $@," GEN $@") ++else + config-all-devices.mak: $(SUBDIR_DEVICES_MAK) + $(call quiet-command,cat $(SUBDIR_DEVICES_MAK) | grep =y | sort -u > $@," GEN $@") ++endif + + -include $(SUBDIR_DEVICES_MAK_DEP) + +diff --git a/configure b/configure +index a1f256c..f528146 100755 +--- a/configure ++++ b/configure +@@ -1296,10 +1296,6 @@ if test -z "$target_list" ; then + else + target_list=`echo "$target_list" | sed -e 's/,/ /g'` + fi +-if test -z "$target_list" ; then +- echo "No targets enabled" +- exit 1 +-fi + # see if system emulation was really requested + case " $target_list " in + *"-softmmu "*) softmmu=yes +-- +1.7.12.1 + diff --git a/0232-Refactor-inet_connect_opts-function.patch b/0232-Refactor-inet_connect_opts-function.patch new file mode 100644 index 0000000..bd8702f --- /dev/null +++ b/0232-Refactor-inet_connect_opts-function.patch @@ -0,0 +1,207 @@ +From 2f56ee52ed70bed32de06ba1c9ef22e4d4d504f0 Mon Sep 17 00:00:00 2001 +From: "Michael S. Tsirkin" +Date: Mon, 24 Sep 2012 13:11:07 +0200 +Subject: [PATCH] Refactor inet_connect_opts function + +refactor address resolution code to fix nonblocking connect +remove getnameinfo call + +Signed-off-by: Michael S. Tsirkin +Signed-off-by: Amos Kong +Signed-off-by: Orit Wasserman +Signed-off-by: Anthony Liguori +(cherry picked from commit 05bc1d8a4b2f77df8cc9880a552047e30c16f1f8) + +Signed-off-by: Michael Roth +--- + qemu-sockets.c | 148 +++++++++++++++++++++++++++++++++------------------------ + 1 file changed, 85 insertions(+), 63 deletions(-) + +diff --git a/qemu-sockets.c b/qemu-sockets.c +index 037775b..22797bf 100644 +--- a/qemu-sockets.c ++++ b/qemu-sockets.c +@@ -209,95 +209,117 @@ listen: + return slisten; + } + +-int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp) ++#ifdef _WIN32 ++#define QEMU_SOCKET_RC_INPROGRESS(rc) \ ++ ((rc) == -EINPROGRESS || (rc) == -EWOULDBLOCK || (rc) == -WSAEALREADY) ++#else ++#define QEMU_SOCKET_RC_INPROGRESS(rc) \ ++ ((rc) == -EINPROGRESS) ++#endif ++ ++static int inet_connect_addr(struct addrinfo *addr, bool block, ++ bool *in_progress) + { +- struct addrinfo ai,*res,*e; ++ int sock, rc; ++ ++ if (in_progress) { ++ *in_progress = false; ++ } ++ ++ sock = qemu_socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); ++ if (sock < 0) { ++ fprintf(stderr, "%s: socket(%s): %s\n", __func__, ++ inet_strfamily(addr->ai_family), strerror(errno)); ++ return -1; ++ } ++ setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); ++ if (!block) { ++ socket_set_nonblock(sock); ++ } ++ /* connect to peer */ ++ do { ++ rc = 0; ++ if (connect(sock, addr->ai_addr, addr->ai_addrlen) < 0) { ++ rc = -socket_error(); ++ } ++ } while (rc == -EINTR); ++ ++ if (!block && QEMU_SOCKET_RC_INPROGRESS(rc)) { ++ if (in_progress) { ++ *in_progress = true; ++ } ++ } else if (rc < 0) { ++ closesocket(sock); ++ return -1; ++ } ++ return sock; ++} ++ ++static struct addrinfo *inet_parse_connect_opts(QemuOpts *opts, Error **errp) ++{ ++ struct addrinfo ai, *res; ++ int rc; + const char *addr; + const char *port; +- char uaddr[INET6_ADDRSTRLEN+1]; +- char uport[33]; +- int sock,rc; +- bool block; + +- memset(&ai,0, sizeof(ai)); ++ memset(&ai, 0, sizeof(ai)); + ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; + ai.ai_family = PF_UNSPEC; + ai.ai_socktype = SOCK_STREAM; + +- if (in_progress) { +- *in_progress = false; +- } +- + addr = qemu_opt_get(opts, "host"); + port = qemu_opt_get(opts, "port"); +- block = qemu_opt_get_bool(opts, "block", 0); + if (addr == NULL || port == NULL) { +- fprintf(stderr, "inet_connect: host and/or port not specified\n"); ++ fprintf(stderr, ++ "inet_parse_connect_opts: host and/or port not specified\n"); + error_set(errp, QERR_SOCKET_CREATE_FAILED); +- return -1; ++ return NULL; + } + +- if (qemu_opt_get_bool(opts, "ipv4", 0)) ++ if (qemu_opt_get_bool(opts, "ipv4", 0)) { + ai.ai_family = PF_INET; +- if (qemu_opt_get_bool(opts, "ipv6", 0)) ++ } ++ if (qemu_opt_get_bool(opts, "ipv6", 0)) { + ai.ai_family = PF_INET6; ++ } + + /* lookup */ +- if (0 != (rc = getaddrinfo(addr, port, &ai, &res))) { +- fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port, ++ rc = getaddrinfo(addr, port, &ai, &res); ++ if (rc != 0) { ++ fprintf(stderr, "getaddrinfo(%s,%s): %s\n", addr, port, + gai_strerror(rc)); + error_set(errp, QERR_SOCKET_CREATE_FAILED); +- return -1; ++ return NULL; ++ } ++ return res; ++} ++ ++int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp) ++{ ++ struct addrinfo *res, *e; ++ int sock = -1; ++ bool block = qemu_opt_get_bool(opts, "block", 0); ++ ++ res = inet_parse_connect_opts(opts, errp); ++ if (!res) { ++ return -1; ++ } ++ ++ if (in_progress) { ++ *in_progress = false; + } + + for (e = res; e != NULL; e = e->ai_next) { +- if (getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen, +- uaddr,INET6_ADDRSTRLEN,uport,32, +- NI_NUMERICHOST | NI_NUMERICSERV) != 0) { +- fprintf(stderr,"%s: getnameinfo: oops\n", __FUNCTION__); +- continue; +- } +- sock = qemu_socket(e->ai_family, e->ai_socktype, e->ai_protocol); +- if (sock < 0) { +- fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__, +- inet_strfamily(e->ai_family), strerror(errno)); +- continue; +- } +- setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on)); +- if (!block) { +- socket_set_nonblock(sock); +- } +- /* connect to peer */ +- do { +- rc = 0; +- if (connect(sock, e->ai_addr, e->ai_addrlen) < 0) { +- rc = -socket_error(); +- } +- } while (rc == -EINTR); +- +- #ifdef _WIN32 +- if (!block && (rc == -EINPROGRESS || rc == -EWOULDBLOCK +- || rc == -WSAEALREADY)) { +- #else +- if (!block && (rc == -EINPROGRESS)) { +- #endif +- if (in_progress) { +- *in_progress = true; +- } +- } else if (rc < 0) { +- if (NULL == e->ai_next) +- fprintf(stderr, "%s: connect(%s,%s,%s,%s): %s\n", __FUNCTION__, +- inet_strfamily(e->ai_family), +- e->ai_canonname, uaddr, uport, strerror(errno)); +- closesocket(sock); +- continue; ++ sock = inet_connect_addr(e, block, in_progress); ++ if (sock >= 0) { ++ break; + } +- freeaddrinfo(res); +- return sock; + } +- error_set(errp, QERR_SOCKET_CONNECT_FAILED); ++ if (sock < 0) { ++ error_set(errp, QERR_SOCKET_CONNECT_FAILED); ++ } + freeaddrinfo(res); +- return -1; ++ return sock; + } + + int inet_dgram_opts(QemuOpts *opts) +-- +1.7.12.1 + diff --git a/0233-Separate-inet_connect-into-inet_connect-blocking-and.patch b/0233-Separate-inet_connect-into-inet_connect-blocking-and.patch new file mode 100644 index 0000000..e017ef0 --- /dev/null +++ b/0233-Separate-inet_connect-into-inet_connect-blocking-and.patch @@ -0,0 +1,188 @@ +From 36f7af3f8bfd2c16f2e6c4b61d9564d5cfdd2394 Mon Sep 17 00:00:00 2001 +From: Orit Wasserman +Date: Mon, 24 Sep 2012 13:11:08 +0200 +Subject: [PATCH] Separate inet_connect into inet_connect (blocking) and + inet_nonblocking_connect + +No need to add non blocking parameters to the blocking inet_connect +add block parameter for inet_connect_opts instead of using QemuOpt "block". + +Signed-off-by: Orit Wasserman +Signed-off-by: Anthony Liguori +(cherry picked from commit 5db5f44cb4b7f24b9e0efdefc9015e36b7c34881) + +Signed-off-by: Michael Roth +--- + migration-tcp.c | 2 +- + nbd.c | 2 +- + qemu-char.c | 2 +- + qemu-sockets.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++---------- + qemu_socket.h | 7 +++++-- + ui/vnc.c | 2 +- + 6 files changed, 57 insertions(+), 16 deletions(-) + +diff --git a/migration-tcp.c b/migration-tcp.c +index ac891c3..7f6ad98 100644 +--- a/migration-tcp.c ++++ b/migration-tcp.c +@@ -88,7 +88,7 @@ int tcp_start_outgoing_migration(MigrationState *s, const char *host_port, + s->write = socket_write; + s->close = tcp_close; + +- s->fd = inet_connect(host_port, false, &in_progress, errp); ++ s->fd = inet_nonblocking_connect(host_port, &in_progress, errp); + if (error_is_set(errp)) { + migrate_fd_error(s); + return -1; +diff --git a/nbd.c b/nbd.c +index 0dd60c5..206f75c 100644 +--- a/nbd.c ++++ b/nbd.c +@@ -162,7 +162,7 @@ int tcp_socket_outgoing(const char *address, uint16_t port) + + int tcp_socket_outgoing_spec(const char *address_and_port) + { +- return inet_connect(address_and_port, true, NULL, NULL); ++ return inet_connect(address_and_port, NULL); + } + + int tcp_socket_incoming(const char *address, uint16_t port) +diff --git a/qemu-char.c b/qemu-char.c +index 7f0f895..13b87b5 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -2456,7 +2456,7 @@ static CharDriverState *qemu_chr_open_socket(QemuOpts *opts) + if (is_listen) { + fd = inet_listen_opts(opts, 0, NULL); + } else { +- fd = inet_connect_opts(opts, NULL, NULL); ++ fd = inet_connect_opts(opts, true, NULL, NULL); + } + } + if (fd < 0) { +diff --git a/qemu-sockets.c b/qemu-sockets.c +index 22797bf..0883a66 100644 +--- a/qemu-sockets.c ++++ b/qemu-sockets.c +@@ -54,9 +54,6 @@ static QemuOptsList dummy_opts = { + },{ + .name = "ipv6", + .type = QEMU_OPT_BOOL, +- },{ +- .name = "block", +- .type = QEMU_OPT_BOOL, + }, + { /* end if list */ } + }, +@@ -294,11 +291,22 @@ static struct addrinfo *inet_parse_connect_opts(QemuOpts *opts, Error **errp) + return res; + } + +-int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp) ++/** ++ * Create a socket and connect it to an address. ++ * ++ * @opts: QEMU options, recognized parameters strings "host" and "port", ++ * bools "ipv4" and "ipv6". ++ * @block: set true for blocking socket ++ * @in_progress: set to true in case of ongoing connect ++ * @errp: set on error ++ * ++ * Returns: -1 on error, file descriptor on success. ++ */ ++int inet_connect_opts(QemuOpts *opts, bool block, bool *in_progress, ++ Error **errp) + { + struct addrinfo *res, *e; + int sock = -1; +- bool block = qemu_opt_get_bool(opts, "block", 0); + + res = inet_parse_connect_opts(opts, errp); + if (!res) { +@@ -515,17 +523,47 @@ int inet_listen(const char *str, char *ostr, int olen, + return sock; + } + +-int inet_connect(const char *str, bool block, bool *in_progress, Error **errp) ++/** ++ * Create a blocking socket and connect it to an address. ++ * ++ * @str: address string ++ * @errp: set in case of an error ++ * ++ * Returns -1 in case of error, file descriptor on success ++ **/ ++int inet_connect(const char *str, Error **errp) + { + QemuOpts *opts; + int sock = -1; + + opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + if (inet_parse(opts, str) == 0) { +- if (block) { +- qemu_opt_set(opts, "block", "on"); +- } +- sock = inet_connect_opts(opts, in_progress, errp); ++ sock = inet_connect_opts(opts, true, NULL, errp); ++ } else { ++ error_set(errp, QERR_SOCKET_CREATE_FAILED); ++ } ++ qemu_opts_del(opts); ++ return sock; ++} ++ ++/** ++ * Create a non-blocking socket and connect it to an address. ++ * ++ * @str: address string ++ * @in_progress: set to true in case of ongoing connect ++ * @errp: set in case of an error ++ * ++ * Returns: -1 on error, file descriptor on success. ++ **/ ++int inet_nonblocking_connect(const char *str, bool *in_progress, ++ Error **errp) ++{ ++ QemuOpts *opts; ++ int sock = -1; ++ ++ opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); ++ if (inet_parse(opts, str) == 0) { ++ sock = inet_connect_opts(opts, false, in_progress, errp); + } else { + error_set(errp, QERR_SOCKET_CREATE_FAILED); + } +diff --git a/qemu_socket.h b/qemu_socket.h +index 30ae6af..80696aa 100644 +--- a/qemu_socket.h ++++ b/qemu_socket.h +@@ -42,8 +42,11 @@ int send_all(int fd, const void *buf, int len1); + int inet_listen_opts(QemuOpts *opts, int port_offset, Error **errp); + int inet_listen(const char *str, char *ostr, int olen, + int socktype, int port_offset, Error **errp); +-int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp); +-int inet_connect(const char *str, bool block, bool *in_progress, Error **errp); ++int inet_connect_opts(QemuOpts *opts, bool block, bool *in_progress, ++ Error **errp); ++int inet_connect(const char *str, Error **errp); ++int inet_nonblocking_connect(const char *str, bool *in_progress, ++ Error **errp); + int inet_dgram_opts(QemuOpts *opts); + const char *inet_strfamily(int family); + +diff --git a/ui/vnc.c b/ui/vnc.c +index 385e345..01b2daf 100644 +--- a/ui/vnc.c ++++ b/ui/vnc.c +@@ -3061,7 +3061,7 @@ int vnc_display_open(DisplayState *ds, const char *display) + if (strncmp(display, "unix:", 5) == 0) + vs->lsock = unix_connect(display+5); + else +- vs->lsock = inet_connect(display, true, NULL, NULL); ++ vs->lsock = inet_connect(display, NULL); + if (-1 == vs->lsock) { + g_free(vs->display); + vs->display = NULL; +-- +1.7.12.1 + diff --git a/0234-Fix-address-handling-in-inet_nonblocking_connect.patch b/0234-Fix-address-handling-in-inet_nonblocking_connect.patch new file mode 100644 index 0000000..9e64c16 --- /dev/null +++ b/0234-Fix-address-handling-in-inet_nonblocking_connect.patch @@ -0,0 +1,369 @@ +From b3db72271ead92daae43b1534fdfdbe750555b0a Mon Sep 17 00:00:00 2001 +From: Orit Wasserman +Date: Mon, 24 Sep 2012 13:11:09 +0200 +Subject: [PATCH] Fix address handling in inet_nonblocking_connect + +getaddrinfo can give us a list of addresses, but we only try to +connect to the first one. If that fails we never proceed to +the next one. This is common on desktop setups that often have ipv6 +configured but not actually working. + +To fix this make inet_connect_nonblocking retry connection with a different +address. +callers on inet_nonblocking_connect register a callback function that will +be called when connect opertion completes, in case of failure the fd will have +a negative value + +Signed-off-by: Orit Wasserman +Signed-off-by: Michael S. Tsirkin +Signed-off-by: Anthony Liguori +(cherry picked from commit 233aa5c2d1cf4655ffe335025a68cf5454f87dad) + +Signed-off-by: Michael Roth +--- + migration-tcp.c | 37 ++++------------ + qemu-char.c | 2 +- + qemu-sockets.c | 129 +++++++++++++++++++++++++++++++++++++++++++++----------- + qemu_socket.h | 16 ++++--- + 4 files changed, 126 insertions(+), 58 deletions(-) + +diff --git a/migration-tcp.c b/migration-tcp.c +index 7f6ad98..a15c2b8 100644 +--- a/migration-tcp.c ++++ b/migration-tcp.c +@@ -53,54 +53,35 @@ static int tcp_close(MigrationState *s) + return r; + } + +-static void tcp_wait_for_connect(void *opaque) ++static void tcp_wait_for_connect(int fd, void *opaque) + { + MigrationState *s = opaque; +- int val, ret; +- socklen_t valsize = sizeof(val); + +- DPRINTF("connect completed\n"); +- do { +- ret = getsockopt(s->fd, SOL_SOCKET, SO_ERROR, (void *) &val, &valsize); +- } while (ret == -1 && (socket_error()) == EINTR); +- +- if (ret < 0) { ++ if (fd < 0) { ++ DPRINTF("migrate connect error\n"); ++ s->fd = -1; + migrate_fd_error(s); +- return; +- } +- +- qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); +- +- if (val == 0) ++ } else { ++ DPRINTF("migrate connect success\n"); ++ s->fd = fd; + migrate_fd_connect(s); +- else { +- DPRINTF("error connecting %d\n", val); +- migrate_fd_error(s); + } + } + + int tcp_start_outgoing_migration(MigrationState *s, const char *host_port, + Error **errp) + { +- bool in_progress; +- + s->get_error = socket_errno; + s->write = socket_write; + s->close = tcp_close; + +- s->fd = inet_nonblocking_connect(host_port, &in_progress, errp); ++ s->fd = inet_nonblocking_connect(host_port, tcp_wait_for_connect, s, ++ errp); + if (error_is_set(errp)) { + migrate_fd_error(s); + return -1; + } + +- if (in_progress) { +- DPRINTF("connect in progress\n"); +- qemu_set_fd_handler2(s->fd, NULL, NULL, tcp_wait_for_connect, s); +- } else { +- migrate_fd_connect(s); +- } +- + return 0; + } + +diff --git a/qemu-char.c b/qemu-char.c +index 13b87b5..b082bae 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -2456,7 +2456,7 @@ static CharDriverState *qemu_chr_open_socket(QemuOpts *opts) + if (is_listen) { + fd = inet_listen_opts(opts, 0, NULL); + } else { +- fd = inet_connect_opts(opts, true, NULL, NULL); ++ fd = inet_connect_opts(opts, NULL, NULL, NULL); + } + } + if (fd < 0) { +diff --git a/qemu-sockets.c b/qemu-sockets.c +index 0883a66..1f14e8b 100644 +--- a/qemu-sockets.c ++++ b/qemu-sockets.c +@@ -24,6 +24,7 @@ + + #include "qemu_socket.h" + #include "qemu-common.h" /* for qemu_isdigit */ ++#include "main-loop.h" + + #ifndef AI_ADDRCONFIG + # define AI_ADDRCONFIG 0 +@@ -214,14 +215,66 @@ listen: + ((rc) == -EINPROGRESS) + #endif + +-static int inet_connect_addr(struct addrinfo *addr, bool block, +- bool *in_progress) ++/* Struct to store connect state for non blocking connect */ ++typedef struct ConnectState { ++ int fd; ++ struct addrinfo *addr_list; ++ struct addrinfo *current_addr; ++ NonBlockingConnectHandler *callback; ++ void *opaque; ++} ConnectState; ++ ++static int inet_connect_addr(struct addrinfo *addr, bool *in_progress, ++ ConnectState *connect_state); ++ ++static void wait_for_connect(void *opaque) + { +- int sock, rc; ++ ConnectState *s = opaque; ++ int val = 0, rc = 0; ++ socklen_t valsize = sizeof(val); ++ bool in_progress; ++ ++ qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); ++ ++ do { ++ rc = getsockopt(s->fd, SOL_SOCKET, SO_ERROR, (void *) &val, &valsize); ++ } while (rc == -1 && socket_error() == EINTR); ++ ++ /* update rc to contain error */ ++ if (!rc && val) { ++ rc = -1; ++ } ++ ++ /* connect error */ ++ if (rc < 0) { ++ closesocket(s->fd); ++ s->fd = rc; ++ } ++ ++ /* try to connect to the next address on the list */ ++ while (s->current_addr->ai_next != NULL && s->fd < 0) { ++ s->current_addr = s->current_addr->ai_next; ++ s->fd = inet_connect_addr(s->current_addr, &in_progress, s); ++ /* connect in progress */ ++ if (in_progress) { ++ return; ++ } ++ } + +- if (in_progress) { +- *in_progress = false; ++ freeaddrinfo(s->addr_list); ++ if (s->callback) { ++ s->callback(s->fd, s->opaque); + } ++ g_free(s); ++ return; ++} ++ ++static int inet_connect_addr(struct addrinfo *addr, bool *in_progress, ++ ConnectState *connect_state) ++{ ++ int sock, rc; ++ ++ *in_progress = false; + + sock = qemu_socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); + if (sock < 0) { +@@ -230,7 +283,7 @@ static int inet_connect_addr(struct addrinfo *addr, bool block, + return -1; + } + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); +- if (!block) { ++ if (connect_state != NULL) { + socket_set_nonblock(sock); + } + /* connect to peer */ +@@ -241,10 +294,11 @@ static int inet_connect_addr(struct addrinfo *addr, bool block, + } + } while (rc == -EINTR); + +- if (!block && QEMU_SOCKET_RC_INPROGRESS(rc)) { +- if (in_progress) { +- *in_progress = true; +- } ++ if (connect_state != NULL && QEMU_SOCKET_RC_INPROGRESS(rc)) { ++ connect_state->fd = sock; ++ qemu_set_fd_handler2(sock, NULL, NULL, wait_for_connect, ++ connect_state); ++ *in_progress = true; + } else if (rc < 0) { + closesocket(sock); + return -1; +@@ -260,6 +314,7 @@ static struct addrinfo *inet_parse_connect_opts(QemuOpts *opts, Error **errp) + const char *port; + + memset(&ai, 0, sizeof(ai)); ++ + ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; + ai.ai_family = PF_UNSPEC; + ai.ai_socktype = SOCK_STREAM; +@@ -296,36 +351,55 @@ static struct addrinfo *inet_parse_connect_opts(QemuOpts *opts, Error **errp) + * + * @opts: QEMU options, recognized parameters strings "host" and "port", + * bools "ipv4" and "ipv6". +- * @block: set true for blocking socket +- * @in_progress: set to true in case of ongoing connect + * @errp: set on error ++ * @callback: callback function for non-blocking connect ++ * @opaque: opaque for callback function + * + * Returns: -1 on error, file descriptor on success. ++ * ++ * If @callback is non-null, the connect is non-blocking. If this ++ * function succeeds, callback will be called when the connection ++ * completes, with the file descriptor on success, or -1 on error. + */ +-int inet_connect_opts(QemuOpts *opts, bool block, bool *in_progress, +- Error **errp) ++int inet_connect_opts(QemuOpts *opts, Error **errp, ++ NonBlockingConnectHandler *callback, void *opaque) + { + struct addrinfo *res, *e; + int sock = -1; ++ bool in_progress; ++ ConnectState *connect_state = NULL; + + res = inet_parse_connect_opts(opts, errp); + if (!res) { + return -1; + } + +- if (in_progress) { +- *in_progress = false; ++ if (callback != NULL) { ++ connect_state = g_malloc0(sizeof(*connect_state)); ++ connect_state->addr_list = res; ++ connect_state->callback = callback; ++ connect_state->opaque = opaque; + } + + for (e = res; e != NULL; e = e->ai_next) { +- sock = inet_connect_addr(e, block, in_progress); +- if (sock >= 0) { ++ if (connect_state != NULL) { ++ connect_state->current_addr = e; ++ } ++ sock = inet_connect_addr(e, &in_progress, connect_state); ++ if (in_progress) { ++ return sock; ++ } else if (sock >= 0) { ++ /* non blocking socket immediate success, call callback */ ++ if (callback != NULL) { ++ callback(sock, opaque); ++ } + break; + } + } + if (sock < 0) { + error_set(errp, QERR_SOCKET_CONNECT_FAILED); + } ++ g_free(connect_state); + freeaddrinfo(res); + return sock; + } +@@ -538,7 +612,7 @@ int inet_connect(const char *str, Error **errp) + + opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + if (inet_parse(opts, str) == 0) { +- sock = inet_connect_opts(opts, true, NULL, errp); ++ sock = inet_connect_opts(opts, errp, NULL, NULL); + } else { + error_set(errp, QERR_SOCKET_CREATE_FAILED); + } +@@ -548,22 +622,29 @@ int inet_connect(const char *str, Error **errp) + + /** + * Create a non-blocking socket and connect it to an address. ++ * Calls the callback function with fd in case of success or -1 in case of ++ * error. + * + * @str: address string +- * @in_progress: set to true in case of ongoing connect ++ * @callback: callback function that is called when connect completes, ++ * cannot be NULL. ++ * @opaque: opaque for callback function + * @errp: set in case of an error + * +- * Returns: -1 on error, file descriptor on success. ++ * Returns: -1 on immediate error, file descriptor on success. + **/ +-int inet_nonblocking_connect(const char *str, bool *in_progress, +- Error **errp) ++int inet_nonblocking_connect(const char *str, ++ NonBlockingConnectHandler *callback, ++ void *opaque, Error **errp) + { + QemuOpts *opts; + int sock = -1; + ++ g_assert(callback != NULL); ++ + opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); + if (inet_parse(opts, str) == 0) { +- sock = inet_connect_opts(opts, false, in_progress, errp); ++ sock = inet_connect_opts(opts, errp, callback, opaque); + } else { + error_set(errp, QERR_SOCKET_CREATE_FAILED); + } +diff --git a/qemu_socket.h b/qemu_socket.h +index 80696aa..3e8aee9 100644 +--- a/qemu_socket.h ++++ b/qemu_socket.h +@@ -38,15 +38,21 @@ void socket_set_block(int fd); + void socket_set_nonblock(int fd); + int send_all(int fd, const void *buf, int len1); + +-/* New, ipv6-ready socket helper functions, see qemu-sockets.c */ ++/* callback function for nonblocking connect ++ * valid fd on success, negative error code on failure ++ */ ++typedef void NonBlockingConnectHandler(int fd, void *opaque); ++ + int inet_listen_opts(QemuOpts *opts, int port_offset, Error **errp); + int inet_listen(const char *str, char *ostr, int olen, + int socktype, int port_offset, Error **errp); +-int inet_connect_opts(QemuOpts *opts, bool block, bool *in_progress, +- Error **errp); ++int inet_connect_opts(QemuOpts *opts, Error **errp, ++ NonBlockingConnectHandler *callback, void *opaque); + int inet_connect(const char *str, Error **errp); +-int inet_nonblocking_connect(const char *str, bool *in_progress, +- Error **errp); ++int inet_nonblocking_connect(const char *str, ++ NonBlockingConnectHandler *callback, ++ void *opaque, Error **errp); ++ + int inet_dgram_opts(QemuOpts *opts); + const char *inet_strfamily(int family); + +-- +1.7.12.1 + diff --git a/0235-Clear-handler-only-for-valid-fd.patch b/0235-Clear-handler-only-for-valid-fd.patch new file mode 100644 index 0000000..3ddcd80 --- /dev/null +++ b/0235-Clear-handler-only-for-valid-fd.patch @@ -0,0 +1,32 @@ +From b7b94b6016b89bf698d661ce4fd22139e771a835 Mon Sep 17 00:00:00 2001 +From: Orit Wasserman +Date: Mon, 24 Sep 2012 13:11:10 +0200 +Subject: [PATCH] Clear handler only for valid fd + +Signed-off-by: Orit Wasserman +Signed-off-by: Anthony Liguori +(cherry picked from commit 3202becaa2b805497ce9e6faa6edfb83665f91b1) + +Signed-off-by: Michael Roth +--- + migration.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/migration.c b/migration.c +index 1edeec5..22a05c4 100644 +--- a/migration.c ++++ b/migration.c +@@ -240,7 +240,9 @@ static int migrate_fd_cleanup(MigrationState *s) + { + int ret = 0; + +- qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); ++ if (s->fd != -1) { ++ qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); ++ } + + if (s->file) { + DPRINTF("closing file\n"); +-- +1.7.12.1 + diff --git a/0236-pl190-fix-read-of-VECTADDR.patch b/0236-pl190-fix-read-of-VECTADDR.patch new file mode 100644 index 0000000..c306cb5 --- /dev/null +++ b/0236-pl190-fix-read-of-VECTADDR.patch @@ -0,0 +1,51 @@ +From 12d4393d0830a2a63828d302f177a9b8e31f433a Mon Sep 17 00:00:00 2001 +From: Brendan Fennell +Date: Wed, 26 Sep 2012 16:46:28 +0100 +Subject: [PATCH] pl190: fix read of VECTADDR + +Reading VECTADDR was causing us to set the current priority to +the wrong value, the most obvious effect of which was that we +would return the vector for the wrong interrupt as the result +of the read. + +Signed-off-by: Brendan Fennell +Signed-off-by: Peter Maydell +(cherry picked from commit 14c126baf1c38607c5bd988878de85a06cefd8cf) + +Signed-off-by: Michael Roth +--- + hw/pl190.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +diff --git a/hw/pl190.c b/hw/pl190.c +index cb50afb..7332f4d 100644 +--- a/hw/pl190.c ++++ b/hw/pl190.c +@@ -117,12 +117,18 @@ static uint64_t pl190_read(void *opaque, target_phys_addr_t offset, + return s->protected; + case 12: /* VECTADDR */ + /* Read vector address at the start of an ISR. Increases the +- current priority level to that of the current interrupt. */ +- for (i = 0; i < s->priority; i++) +- { +- if ((s->level | s->soft_level) & s->prio_mask[i]) +- break; +- } ++ * current priority level to that of the current interrupt. ++ * ++ * Since an enabled interrupt X at priority P causes prio_mask[Y] ++ * to have bit X set for all Y > P, this loop will stop with ++ * i == the priority of the highest priority set interrupt. ++ */ ++ for (i = 0; i < s->priority; i++) { ++ if ((s->level | s->soft_level) & s->prio_mask[i + 1]) { ++ break; ++ } ++ } ++ + /* Reading this value with no pending interrupts is undefined. + We return the default address. */ + if (i == PL190_NUM_PRIO) +-- +1.7.12.1 + diff --git a/0237-hw-armv7m_nvic-Correctly-register-GIC-region-when-se.patch b/0237-hw-armv7m_nvic-Correctly-register-GIC-region-when-se.patch new file mode 100644 index 0000000..2f3f36d --- /dev/null +++ b/0237-hw-armv7m_nvic-Correctly-register-GIC-region-when-se.patch @@ -0,0 +1,40 @@ +From f4a5b8185d067430cd605a740af654cd1cd2e2aa Mon Sep 17 00:00:00 2001 +From: Meador Inge +Date: Wed, 26 Sep 2012 16:46:28 +0100 +Subject: [PATCH] hw/armv7m_nvic: Correctly register GIC region when setting + up NVIC + +When setting up the NVIC memory regions the memory range +0x100..0xcff is aliased to an IO memory region that belongs +to the ARM GIC. This aliased region should be added to the +NVIC memory container, but the actual GIC IO memory region +was being added instead. This mixup was causing the wrong +IO memory access functions to be called when accessing parts +of the NVIC memory. + +Signed-off-by: Meador Inge +Signed-off-by: Peter Maydell +(cherry picked from commit 9892cae39562d2e6c00ccc5966302c00f23be6d4) + +Signed-off-by: Michael Roth +--- + hw/armv7m_nvic.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/hw/armv7m_nvic.c b/hw/armv7m_nvic.c +index 6a0832e..5c09116 100644 +--- a/hw/armv7m_nvic.c ++++ b/hw/armv7m_nvic.c +@@ -489,7 +489,8 @@ static int armv7m_nvic_init(SysBusDevice *dev) + */ + memory_region_init_alias(&s->gic_iomem_alias, "nvic-gic", &s->gic.iomem, + 0x100, 0xc00); +- memory_region_add_subregion_overlap(&s->container, 0x100, &s->gic.iomem, 1); ++ memory_region_add_subregion_overlap(&s->container, 0x100, ++ &s->gic_iomem_alias, 1); + /* Map the whole thing into system memory at the location required + * by the v7M architecture. + */ +-- +1.7.12.1 + diff --git a/0238-Versatile-Express-Fix-NOR-flash-0-address-and-remove.patch b/0238-Versatile-Express-Fix-NOR-flash-0-address-and-remove.patch new file mode 100644 index 0000000..4fd2f11 --- /dev/null +++ b/0238-Versatile-Express-Fix-NOR-flash-0-address-and-remove.patch @@ -0,0 +1,56 @@ +From cb97f34eca351d150574c724047709b76d00d08a Mon Sep 17 00:00:00 2001 +From: Francesco Lavra +Date: Wed, 19 Sep 2012 05:51:58 +0000 +Subject: [PATCH] Versatile Express: Fix NOR flash 0 address and remove flash + alias + +In the A series memory map (implemented in the Cortex A15 CoreTile), the +first NOR flash bank (flash 0) is mapped to address 0x08000000, while +address 0x00000000 can be configured as alias to either the first or the +second flash bank. This patch fixes the definition of flash 0 address, +and for simplicity removes the alias definition. + +Signed-off-by: Francesco Lavra +Signed-off-by: Peter Maydell +(cherry picked from commit 661bafb3e14bfffcb0a7c7910534c7944608ca45) + +Signed-off-by: Michael Roth +--- + hw/vexpress.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/hw/vexpress.c b/hw/vexpress.c +index b615844..454c2bb 100644 +--- a/hw/vexpress.c ++++ b/hw/vexpress.c +@@ -62,7 +62,6 @@ enum { + VE_COMPACTFLASH, + VE_CLCD, + VE_NORFLASH0, +- VE_NORFLASH0ALIAS, + VE_NORFLASH1, + VE_SRAM, + VE_VIDEORAM, +@@ -104,9 +103,8 @@ static target_phys_addr_t motherboard_legacy_map[] = { + }; + + static target_phys_addr_t motherboard_aseries_map[] = { +- /* CS0: 0x00000000 .. 0x0c000000 */ +- [VE_NORFLASH0] = 0x00000000, +- [VE_NORFLASH0ALIAS] = 0x08000000, ++ /* CS0: 0x08000000 .. 0x0c000000 */ ++ [VE_NORFLASH0] = 0x08000000, + /* CS4: 0x0c000000 .. 0x10000000 */ + [VE_NORFLASH1] = 0x0c000000, + /* CS5: 0x10000000 .. 0x14000000 */ +@@ -413,7 +411,6 @@ static void vexpress_common_init(const VEDBoardInfo *daughterboard, + sysbus_create_simple("pl111", map[VE_CLCD], pic[14]); + + /* VE_NORFLASH0: not modelled */ +- /* VE_NORFLASH0ALIAS: not modelled */ + /* VE_NORFLASH1: not modelled */ + + sram_size = 0x2000000; +-- +1.7.12.1 + diff --git a/0239-i386-kvm-bit-10-of-CPUID-8000_0001-.EDX-is-reserved.patch b/0239-i386-kvm-bit-10-of-CPUID-8000_0001-.EDX-is-reserved.patch new file mode 100644 index 0000000..772314f --- /dev/null +++ b/0239-i386-kvm-bit-10-of-CPUID-8000_0001-.EDX-is-reserved.patch @@ -0,0 +1,36 @@ +From b82c558c781a79e6facf06e7cddf4771b8abf962 Mon Sep 17 00:00:00 2001 +From: Eduardo Habkost +Date: Thu, 6 Sep 2012 10:05:35 +0000 +Subject: [PATCH] i386: kvm: bit 10 of CPUID[8000_0001].EDX is reserved + +Bit 10 of CPUID[8000_0001].EDX is not defined as an alias of +CPUID[1].EDX[10], so do not duplicate it on +kvm_arch_get_supported_cpuid(). + +Signed-off-by: Eduardo Habkost +Reviewed-By: Igor Mammedov +Reviewed-by: Don Slutz +Signed-off-by: Blue Swirl +(cherry picked from commit b1f4679392a03f2b26a37bfa52e95d6cc4f73d82) + +Signed-off-by: Michael Roth +--- + target-i386/kvm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/target-i386/kvm.c b/target-i386/kvm.c +index 6790180..acb9369 100644 +--- a/target-i386/kvm.c ++++ b/target-i386/kvm.c +@@ -165,7 +165,7 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, + * so add missing bits according to the AMD spec: + */ + cpuid_1_edx = kvm_arch_get_supported_cpuid(s, 1, 0, R_EDX); +- ret |= cpuid_1_edx & 0x183f7ff; ++ ret |= cpuid_1_edx & 0x183f3ff; + break; + } + break; +-- +1.7.12.1 + diff --git a/0240-fpu-softfloat.c-Return-correctly-signed-values-from-.patch b/0240-fpu-softfloat.c-Return-correctly-signed-values-from-.patch new file mode 100644 index 0000000..37e5c3a --- /dev/null +++ b/0240-fpu-softfloat.c-Return-correctly-signed-values-from-.patch @@ -0,0 +1,44 @@ +From 41e7a1710ee9787900713a769b7d07677857260a Mon Sep 17 00:00:00 2001 +From: Peter Maydell +Date: Fri, 28 Sep 2012 16:17:03 +0100 +Subject: [PATCH] fpu/softfloat.c: Return correctly signed values from + uint64_to_float32 + +The uint64_to_float32() conversion function was incorrectly always +returning numbers with the sign bit set (ie negative numbers). Correct +this so we return positive numbers instead. + +Signed-off-by: Peter Maydell +Signed-off-by: Aurelien Jarno +(cherry picked from commit e744c06fca438dc08271e626034e632a270c91c8) + +Signed-off-by: Michael Roth +--- + fpu/softfloat.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/fpu/softfloat.c b/fpu/softfloat.c +index b29256a..91497e8 100644 +--- a/fpu/softfloat.c ++++ b/fpu/softfloat.c +@@ -1238,7 +1238,7 @@ float32 uint64_to_float32( uint64 a STATUS_PARAM ) + if ( a == 0 ) return float32_zero; + shiftCount = countLeadingZeros64( a ) - 40; + if ( 0 <= shiftCount ) { +- return packFloat32( 1 > 0, 0x95 - shiftCount, a< 0, 0x9C - shiftCount, a STATUS_VAR ); ++ return roundAndPackFloat32(0, 0x9C - shiftCount, a STATUS_VAR); + } + } + +-- +1.7.12.1 + diff --git a/0241-pseries-Don-t-test-for-MSR_PR-for-hypercalls-under-K.patch b/0241-pseries-Don-t-test-for-MSR_PR-for-hypercalls-under-K.patch new file mode 100644 index 0000000..7edb0b2 --- /dev/null +++ b/0241-pseries-Don-t-test-for-MSR_PR-for-hypercalls-under-K.patch @@ -0,0 +1,66 @@ +From 45af32e160bf339974a74bb8a38384b95aa2f555 Mon Sep 17 00:00:00 2001 +From: David Gibson +Date: Tue, 25 Sep 2012 17:12:20 +0000 +Subject: [PATCH] pseries: Don't test for MSR_PR for hypercalls under KVM + +PAPR hypercalls should only be invoked from the guest kernel, not guest +user programs, that is, with MSR[PR]=0. Currently we check this in +spapr_hypercall, returning H_PRIVILEGE if MSR[PR]=1. + +However, under KVM the state of MSR[PR] is already checked by the host +kernel before passing the hypercall to qemu, making this check redundant. +Worse, however, we don't generally synchronize KVM and qemu state on the +hypercall path, meaning that qemu could incorrectly reject a hypercall +because it has a stale MSR value. + +This patch fixes the problem by moving the privilege test exclusively to +the TCG hypercall path. + +Signed-off-by: David Gibson +CC: qemu-stable@nongnu.org +Signed-off-by: Alexander Graf +(cherry picked from commit efcb9383b974114e5f682e531346006f8f2466c0) + +Signed-off-by: Michael Roth +--- + hw/spapr.c | 7 ++++++- + hw/spapr_hcall.c | 5 ----- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/hw/spapr.c b/hw/spapr.c +index c34b767..5e55430 100644 +--- a/hw/spapr.c ++++ b/hw/spapr.c +@@ -556,7 +556,12 @@ static uint64_t translate_kernel_address(void *opaque, uint64_t addr) + + static void emulate_spapr_hypercall(CPUPPCState *env) + { +- env->gpr[3] = spapr_hypercall(env, env->gpr[3], &env->gpr[4]); ++ if (msr_pr) { ++ hcall_dprintf("Hypercall made with MSR[PR]=1\n"); ++ env->gpr[3] = H_PRIVILEGE; ++ } else { ++ env->gpr[3] = spapr_hypercall(env, env->gpr[3], &env->gpr[4]); ++ } + } + + static void spapr_reset(void *opaque) +diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c +index abd847f..38098f7 100644 +--- a/hw/spapr_hcall.c ++++ b/hw/spapr_hcall.c +@@ -713,11 +713,6 @@ void spapr_register_hypercall(target_ulong opcode, spapr_hcall_fn fn) + target_ulong spapr_hypercall(CPUPPCState *env, target_ulong opcode, + target_ulong *args) + { +- if (msr_pr) { +- hcall_dprintf("Hypercall made with MSR[PR]=1\n"); +- return H_PRIVILEGE; +- } +- + if ((opcode <= MAX_HCALL_OPCODE) + && ((opcode & 0x3) == 0)) { + spapr_hcall_fn fn = papr_hypercall_table[opcode / 4]; +-- +1.7.12.1 + diff --git a/0242-update-VERSION-for-v1.2.1.patch b/0242-update-VERSION-for-v1.2.1.patch new file mode 100644 index 0000000..5a2045d --- /dev/null +++ b/0242-update-VERSION-for-v1.2.1.patch @@ -0,0 +1,20 @@ +From 8a0e0b51b5df80c891d264f0492697f26a790cab Mon Sep 17 00:00:00 2001 +From: Michael Roth +Date: Thu, 11 Oct 2012 21:46:55 -0500 +Subject: [PATCH] update VERSION for v1.2.1 + +Signed-off-by: Michael Roth +--- + VERSION | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/VERSION b/VERSION +index 26aaba0..6085e94 100644 +--- a/VERSION ++++ b/VERSION +@@ -1 +1 @@ +-1.2.0 ++1.2.1 +-- +1.7.12.1 + diff --git a/0400-char-Split-out-tcp-socket-close-code-in-a-separate-f.patch b/0400-char-Split-out-tcp-socket-close-code-in-a-separate-f.patch new file mode 100644 index 0000000..0df1449 --- /dev/null +++ b/0400-char-Split-out-tcp-socket-close-code-in-a-separate-f.patch @@ -0,0 +1,57 @@ +From e999fe6e315c5d6f6e8b5d4c689787fc46f10575 Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Mon, 21 Mar 2011 21:57:47 +0100 +Subject: [PATCH] char: Split out tcp socket close code in a separate function + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + qemu-char.c | 25 ++++++++++++++++--------- + 1 file changed, 16 insertions(+), 9 deletions(-) + +diff --git a/qemu-char.c b/qemu-char.c +index b082bae..a1fdf88 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -2141,6 +2141,21 @@ typedef struct { + + static void tcp_chr_accept(void *opaque); + ++static void tcp_closed(void *opaque) ++{ ++ CharDriverState *chr = opaque; ++ TCPCharDriver *s = chr->opaque; ++ ++ s->connected = 0; ++ if (s->listen_fd >= 0) { ++ qemu_set_fd_handler2(s->listen_fd, NULL, tcp_chr_accept, NULL, chr); ++ } ++ qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); ++ closesocket(s->fd); ++ s->fd = -1; ++ qemu_chr_be_event(chr, CHR_EVENT_CLOSED); ++} ++ + static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + { + TCPCharDriver *s = chr->opaque; +@@ -2299,15 +2314,7 @@ static void tcp_chr_read(void *opaque) + len = s->max_size; + size = tcp_chr_recv(chr, (void *)buf, len); + if (size == 0) { +- /* connection closed */ +- s->connected = 0; +- if (s->listen_fd >= 0) { +- qemu_set_fd_handler2(s->listen_fd, NULL, tcp_chr_accept, NULL, chr); +- } +- qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); +- closesocket(s->fd); +- s->fd = -1; +- qemu_chr_be_event(chr, CHR_EVENT_CLOSED); ++ tcp_closed(chr); + } else if (size > 0) { + if (s->do_telnetopt) + tcp_chr_process_IAC_bytes(chr, s, buf, &size); +-- +1.7.12.1 + diff --git a/0401-char-Add-a-QemuChrHandlers-struct-to-initialise-char.patch b/0401-char-Add-a-QemuChrHandlers-struct-to-initialise-char.patch new file mode 100644 index 0000000..58d0b4a --- /dev/null +++ b/0401-char-Add-a-QemuChrHandlers-struct-to-initialise-char.patch @@ -0,0 +1,962 @@ +From 5f3ba69a09688b40a4648e8818e4878ae20fc2f6 Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Mon, 21 Mar 2011 20:31:45 +0100 +Subject: [PATCH] char: Add a QemuChrHandlers struct to initialise chardev + handlers + +Instead of passing each handler in the qemu_add_handlers() function, +create a struct of handlers that can be passed to the function instead. + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + gdbstub.c | 9 +++++++-- + hw/cadence_uart.c | 9 +++++++-- + hw/ccid-card-passthru.c | 11 +++++++---- + hw/debugcon.c | 2 +- + hw/escc.c | 9 +++++++-- + hw/etraxfs_ser.c | 13 +++++++++---- + hw/exynos4210_uart.c | 9 +++++++-- + hw/grlib_apbuart.c | 12 +++++++----- + hw/imx_serial.c | 9 +++++++-- + hw/ivshmem.c | 28 ++++++++++++++++++++++------ + hw/lm32_juart.c | 8 +++++++- + hw/lm32_uart.c | 8 +++++++- + hw/mcf_uart.c | 9 +++++++-- + hw/milkymist-uart.c | 8 +++++++- + hw/pl011.c | 9 +++++++-- + hw/pxa2xx.c | 13 +++++++++---- + hw/qdev-properties.c | 2 +- + hw/serial.c | 9 +++++++-- + hw/sh_serial.c | 12 +++++++++--- + hw/spapr_vty.c | 8 ++++++-- + hw/strongarm.c | 12 +++++++----- + hw/usb/dev-serial.c | 9 +++++++-- + hw/usb/redirect.c | 9 +++++++-- + hw/virtio-console.c | 9 +++++++-- + hw/xen_console.c | 16 +++++++++++----- + hw/xilinx_uartlite.c | 11 +++++++++-- + monitor.c | 18 ++++++++++++++---- + net/slirp.c | 8 ++++++-- + qemu-char.c | 32 ++++++++++++++++++++++---------- + qemu-char.h | 13 +++++++++---- + qtest.c | 9 ++++++++- + 31 files changed, 255 insertions(+), 88 deletions(-) + +diff --git a/gdbstub.c b/gdbstub.c +index a91709f..b905c15 100644 +--- a/gdbstub.c ++++ b/gdbstub.c +@@ -2965,6 +2965,12 @@ static void gdb_sigterm_handler(int signal) + } + #endif + ++static const QemuChrHandlers gdb_handlers = { ++ .fd_can_read = gdb_chr_can_receive, ++ .fd_read = gdb_chr_receive, ++ .fd_event = gdb_chr_event, ++}; ++ + int gdbserver_start(const char *device) + { + GDBState *s; +@@ -2994,8 +3000,7 @@ int gdbserver_start(const char *device) + if (!chr) + return -1; + +- qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive, +- gdb_chr_event, NULL); ++ qemu_chr_add_handlers(chr, &gdb_handlers, NULL); + } + + s = gdbserver_state; +diff --git a/hw/cadence_uart.c b/hw/cadence_uart.c +index f8afc4e..c9d3b21 100644 +--- a/hw/cadence_uart.c ++++ b/hw/cadence_uart.c +@@ -435,6 +435,12 @@ static void cadence_uart_reset(UartState *s) + s->rx_wpos = 0; + } + ++static const QemuChrHandlers cadence_uart_handlers = { ++ .fd_can_read = uart_can_receive, ++ .fd_read = uart_receive, ++ .fd_event = uart_event, ++}; ++ + static int cadence_uart_init(SysBusDevice *dev) + { + UartState *s = FROM_SYSBUS(UartState, dev); +@@ -456,8 +462,7 @@ static int cadence_uart_init(SysBusDevice *dev) + cadence_uart_reset(s); + + if (s->chr) { +- qemu_chr_add_handlers(s->chr, uart_can_receive, uart_receive, +- uart_event, s); ++ qemu_chr_add_handlers(s->chr, &cadence_uart_handlers, s); + } + + return 0; +diff --git a/hw/ccid-card-passthru.c b/hw/ccid-card-passthru.c +index bd6c777..fb32107 100644 +--- a/hw/ccid-card-passthru.c ++++ b/hw/ccid-card-passthru.c +@@ -274,6 +274,12 @@ static const uint8_t *passthru_get_atr(CCIDCardState *base, uint32_t *len) + return card->atr; + } + ++static const QemuChrHandlers passthru_handlers = { ++ .fd_can_read = ccid_card_vscard_can_read, ++ .fd_read = ccid_card_vscard_read, ++ .fd_event = ccid_card_vscard_event, ++}; ++ + static int passthru_initfn(CCIDCardState *base) + { + PassthruState *card = DO_UPCAST(PassthruState, base, base); +@@ -282,10 +288,7 @@ static int passthru_initfn(CCIDCardState *base) + card->vscard_in_hdr = 0; + if (card->cs) { + DPRINTF(card, D_INFO, "initing chardev\n"); +- qemu_chr_add_handlers(card->cs, +- ccid_card_vscard_can_read, +- ccid_card_vscard_read, +- ccid_card_vscard_event, card); ++ qemu_chr_add_handlers(card->cs, &passthru_handlers, card); + ccid_card_vscard_send_init(card); + } else { + error_report("missing chardev"); +diff --git a/hw/debugcon.c b/hw/debugcon.c +index 14ab326..7887fd2 100644 +--- a/hw/debugcon.c ++++ b/hw/debugcon.c +@@ -73,7 +73,7 @@ static void debugcon_init_core(DebugconState *s) + exit(1); + } + +- qemu_chr_add_handlers(s->chr, NULL, NULL, NULL, s); ++ qemu_chr_add_handlers(s->chr, NULL, s); + } + + static int debugcon_isa_initfn(ISADevice *dev) +diff --git a/hw/escc.c b/hw/escc.c +index e1f5e73..ff9d8b1 100644 +--- a/hw/escc.c ++++ b/hw/escc.c +@@ -867,6 +867,12 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, + sysbus_mmio_map(s, 0, base); + } + ++static const QemuChrHandlers serial_handlers = { ++ .fd_can_read = serial_can_receive, ++ .fd_read = serial_receive1, ++ .fd_event = serial_event, ++}; ++ + static int escc_init1(SysBusDevice *dev) + { + SerialState *s = FROM_SYSBUS(SerialState, dev); +@@ -879,8 +885,7 @@ static int escc_init1(SysBusDevice *dev) + s->chn[i].chn = 1 - i; + s->chn[i].clock = s->frequency / 2; + if (s->chn[i].chr) { +- qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, +- serial_receive1, serial_event, &s->chn[i]); ++ qemu_chr_add_handlers(s->chn[i].chr, &serial_handlers, &s->chn[i]); + } + } + s->chn[0].otherchn = &s->chn[1]; +diff --git a/hw/etraxfs_ser.c b/hw/etraxfs_ser.c +index 5f16b17..f2571c2 100644 +--- a/hw/etraxfs_ser.c ++++ b/hw/etraxfs_ser.c +@@ -208,6 +208,12 @@ static void etraxfs_ser_reset(DeviceState *d) + + } + ++static const QemuChrHandlers serial_handlers = { ++ .fd_can_read = serial_can_receive, ++ .fd_read = serial_receive, ++ .fd_event = serial_event, ++}; ++ + static int etraxfs_ser_init(SysBusDevice *dev) + { + struct etrax_serial *s = FROM_SYSBUS(typeof (*s), dev); +@@ -217,10 +223,9 @@ static int etraxfs_ser_init(SysBusDevice *dev) + sysbus_init_mmio(dev, &s->mmio); + + s->chr = qemu_char_get_next_serial(); +- if (s->chr) +- qemu_chr_add_handlers(s->chr, +- serial_can_receive, serial_receive, +- serial_event, s); ++ if (s->chr) { ++ qemu_chr_add_handlers(s->chr, &serial_handlers, s); ++ } + return 0; + } + +diff --git a/hw/exynos4210_uart.c b/hw/exynos4210_uart.c +index ccc4780..fefe400 100644 +--- a/hw/exynos4210_uart.c ++++ b/hw/exynos4210_uart.c +@@ -625,6 +625,12 @@ DeviceState *exynos4210_uart_create(target_phys_addr_t addr, + return dev; + } + ++static const QemuChrHandlers exynos4210_handlers = { ++ .fd_can_read = exynos4210_uart_can_receive, ++ .fd_read = exynos4210_uart_receive, ++ .fd_event = exynos4210_uart_event, ++}; ++ + static int exynos4210_uart_init(SysBusDevice *dev) + { + Exynos4210UartState *s = FROM_SYSBUS(Exynos4210UartState, dev); +@@ -636,8 +642,7 @@ static int exynos4210_uart_init(SysBusDevice *dev) + + sysbus_init_irq(dev, &s->irq); + +- qemu_chr_add_handlers(s->chr, exynos4210_uart_can_receive, +- exynos4210_uart_receive, exynos4210_uart_event, s); ++ qemu_chr_add_handlers(s->chr, &exynos4210_handlers, s); + + return 0; + } +diff --git a/hw/grlib_apbuart.c b/hw/grlib_apbuart.c +index 73fc989..fd77d52 100644 +--- a/hw/grlib_apbuart.c ++++ b/hw/grlib_apbuart.c +@@ -222,15 +222,17 @@ static const MemoryRegionOps grlib_apbuart_ops = { + .endianness = DEVICE_NATIVE_ENDIAN, + }; + ++static const QemuChrHandlers grlib_handlers = { ++ .fd_can_read = grlib_apbuart_can_receive, ++ .fd_read = grlib_apbuart_receive, ++ .fd_event = grlib_apbuart_event, ++}; ++ + static int grlib_apbuart_init(SysBusDevice *dev) + { + UART *uart = FROM_SYSBUS(typeof(*uart), dev); + +- qemu_chr_add_handlers(uart->chr, +- grlib_apbuart_can_receive, +- grlib_apbuart_receive, +- grlib_apbuart_event, +- uart); ++ qemu_chr_add_handlers(uart->chr, &grlib_handlers, uart); + + sysbus_init_irq(dev, &uart->irq); + +diff --git a/hw/imx_serial.c b/hw/imx_serial.c +index d4eae43..f2304d2 100644 +--- a/hw/imx_serial.c ++++ b/hw/imx_serial.c +@@ -381,6 +381,12 @@ static const struct MemoryRegionOps imx_serial_ops = { + .endianness = DEVICE_NATIVE_ENDIAN, + }; + ++static const QemuChrHandlers imx_handlers = { ++ .fd_can_read = imx_can_receive, ++ .fd_read = imx_receive, ++ .fd_event = imx_event, ++}; ++ + static int imx_serial_init(SysBusDevice *dev) + { + IMXSerialState *s = FROM_SYSBUS(IMXSerialState, dev); +@@ -391,8 +397,7 @@ static int imx_serial_init(SysBusDevice *dev) + sysbus_init_irq(dev, &s->irq); + + if (s->chr) { +- qemu_chr_add_handlers(s->chr, imx_can_receive, imx_receive, +- imx_event, s); ++ qemu_chr_add_handlers(s->chr, &imx_handlers, s); + } else { + DPRINTF("No char dev for uart at 0x%lx\n", + (unsigned long)s->iomem.ram_addr); +diff --git a/hw/ivshmem.c b/hw/ivshmem.c +index 62fe53a..e90f691 100644 +--- a/hw/ivshmem.c ++++ b/hw/ivshmem.c +@@ -273,6 +273,18 @@ static void fake_irqfd(void *opaque, const uint8_t *buf, int size) { + msix_notify(pdev, entry->vector); + } + ++static const QemuChrHandlers ivshmem_handlers = { ++ .fd_can_read = ivshmem_can_receive, ++ .fd_read = ivshmem_receive, ++ .fd_event = ivshmem_event, ++}; ++ ++static const QemuChrHandlers ivshmem_msi_handlers = { ++ .fd_can_read = ivshmem_can_receive, ++ .fd_read = fake_irqfd, ++ .fd_event = ivshmem_event, ++}; ++ + static CharDriverState* create_eventfd_chr_device(void * opaque, EventNotifier *n, + int vector) + { +@@ -293,11 +305,10 @@ static CharDriverState* create_eventfd_chr_device(void * opaque, EventNotifier * + s->eventfd_table[vector].pdev = &s->dev; + s->eventfd_table[vector].vector = vector; + +- qemu_chr_add_handlers(chr, ivshmem_can_receive, fake_irqfd, +- ivshmem_event, &s->eventfd_table[vector]); ++ qemu_chr_add_handlers(chr, &ivshmem_msi_handlers, ++ &s->eventfd_table[vector]); + } else { +- qemu_chr_add_handlers(chr, ivshmem_can_receive, ivshmem_receive, +- ivshmem_event, s); ++ qemu_chr_add_handlers(chr, &ivshmem_handlers, s); + } + + return chr; +@@ -634,6 +645,12 @@ static void ivshmem_write_config(PCIDevice *pci_dev, uint32_t address, + msix_write_config(pci_dev, address, val, len); + } + ++static const QemuChrHandlers ivshmem_server_handlers = { ++ .fd_can_read = ivshmem_can_receive, ++ .fd_read = ivshmem_read, ++ .fd_event = ivshmem_event, ++}; ++ + static int pci_ivshmem_init(PCIDevice *dev) + { + IVShmemState *s = DO_UPCAST(IVShmemState, dev, dev); +@@ -720,8 +737,7 @@ static int pci_ivshmem_init(PCIDevice *dev) + + s->eventfd_chr = g_malloc0(s->vectors * sizeof(CharDriverState *)); + +- qemu_chr_add_handlers(s->server_chr, ivshmem_can_receive, ivshmem_read, +- ivshmem_event, s); ++ qemu_chr_add_handlers(s->server_chr, &ivshmem_server_handlers, s); + } else { + /* just map the file immediately, we're not using a server */ + int fd; +diff --git a/hw/lm32_juart.c b/hw/lm32_juart.c +index f07ed39..d4daeb8 100644 +--- a/hw/lm32_juart.c ++++ b/hw/lm32_juart.c +@@ -110,13 +110,19 @@ static void juart_reset(DeviceState *d) + s->jrx = 0; + } + ++static const QemuChrHandlers juart_handlers = { ++ .fd_can_read = juart_can_rx, ++ .fd_read = juart_rx, ++ .fd_event = juart_event, ++}; ++ + static int lm32_juart_init(SysBusDevice *dev) + { + LM32JuartState *s = FROM_SYSBUS(typeof(*s), dev); + + s->chr = qemu_char_get_next_serial(); + if (s->chr) { +- qemu_chr_add_handlers(s->chr, juart_can_rx, juart_rx, juart_event, s); ++ qemu_chr_add_handlers(s->chr, &juart_handlers, s); + } + + return 0; +diff --git a/hw/lm32_uart.c b/hw/lm32_uart.c +index 57066e2..4ea130b 100644 +--- a/hw/lm32_uart.c ++++ b/hw/lm32_uart.c +@@ -243,6 +243,12 @@ static void uart_reset(DeviceState *d) + s->regs[R_LSR] = LSR_THRE | LSR_TEMT; + } + ++static const QemuChrHandlers uart_handlers = { ++ .fd_can_read = uart_can_rx, ++ .fd_read = uart_rx, ++ .fd_event = uart_event, ++}; ++ + static int lm32_uart_init(SysBusDevice *dev) + { + LM32UartState *s = FROM_SYSBUS(typeof(*s), dev); +@@ -254,7 +260,7 @@ static int lm32_uart_init(SysBusDevice *dev) + + s->chr = qemu_char_get_next_serial(); + if (s->chr) { +- qemu_chr_add_handlers(s->chr, uart_can_rx, uart_rx, uart_event, s); ++ qemu_chr_add_handlers(s->chr, &uart_handlers, s); + } + + return 0; +diff --git a/hw/mcf_uart.c b/hw/mcf_uart.c +index ec6a87f..f52fb96 100644 +--- a/hw/mcf_uart.c ++++ b/hw/mcf_uart.c +@@ -272,6 +272,12 @@ static void mcf_uart_receive(void *opaque, const uint8_t *buf, int size) + mcf_uart_push_byte(s, buf[0]); + } + ++static const QemuChrHandlers mcf_uart_handlers = { ++ .fd_can_read = mcf_uart_can_receive, ++ .fd_read = mcf_uart_receive, ++ .fd_event = mcf_uart_event, ++}; ++ + void *mcf_uart_init(qemu_irq irq, CharDriverState *chr) + { + mcf_uart_state *s; +@@ -280,8 +286,7 @@ void *mcf_uart_init(qemu_irq irq, CharDriverState *chr) + s->chr = chr; + s->irq = irq; + if (chr) { +- qemu_chr_add_handlers(chr, mcf_uart_can_receive, mcf_uart_receive, +- mcf_uart_event, s); ++ qemu_chr_add_handlers(chr, &mcf_uart_handlers, s); + } + mcf_uart_reset(s); + return s; +diff --git a/hw/milkymist-uart.c b/hw/milkymist-uart.c +index 291fe3c..2dcb41c 100644 +--- a/hw/milkymist-uart.c ++++ b/hw/milkymist-uart.c +@@ -189,6 +189,12 @@ static void milkymist_uart_reset(DeviceState *d) + s->regs[R_STAT] = STAT_THRE; + } + ++static const QemuChrHandlers uart_handlers = { ++ .fd_can_read = uart_can_rx, ++ .fd_read = uart_rx, ++ .fd_event = uart_event, ++}; ++ + static int milkymist_uart_init(SysBusDevice *dev) + { + MilkymistUartState *s = FROM_SYSBUS(typeof(*s), dev); +@@ -201,7 +207,7 @@ static int milkymist_uart_init(SysBusDevice *dev) + + s->chr = qemu_char_get_next_serial(); + if (s->chr) { +- qemu_chr_add_handlers(s->chr, uart_can_rx, uart_rx, uart_event, s); ++ qemu_chr_add_handlers(s->chr, &uart_handlers, s); + } + + return 0; +diff --git a/hw/pl011.c b/hw/pl011.c +index 3245702..0d620f8 100644 +--- a/hw/pl011.c ++++ b/hw/pl011.c +@@ -258,6 +258,12 @@ static const VMStateDescription vmstate_pl011 = { + } + }; + ++static const QemuChrHandlers pl011_handlers = { ++ .fd_can_read = pl011_can_receive, ++ .fd_read = pl011_receive, ++ .fd_event = pl011_event, ++}; ++ + static int pl011_init(SysBusDevice *dev, const unsigned char *id) + { + pl011_state *s = FROM_SYSBUS(pl011_state, dev); +@@ -273,8 +279,7 @@ static int pl011_init(SysBusDevice *dev, const unsigned char *id) + s->cr = 0x300; + s->flags = 0x90; + if (s->chr) { +- qemu_chr_add_handlers(s->chr, pl011_can_receive, pl011_receive, +- pl011_event, s); ++ qemu_chr_add_handlers(s->chr, &pl011_handlers, s); + } + vmstate_register(&dev->qdev, -1, &vmstate_pl011, s); + return 0; +diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c +index d5f1420..0b308cf 100644 +--- a/hw/pxa2xx.c ++++ b/hw/pxa2xx.c +@@ -1962,6 +1962,12 @@ static int pxa2xx_fir_load(QEMUFile *f, void *opaque, int version_id) + return 0; + } + ++static const QemuChrHandlers pxa2xx_handlers = { ++ .fd_can_read = pxa2xx_fir_is_empty, ++ .fd_read = pxa2xx_fir_rx, ++ .fd_event = pxa2xx_fir_event, ++}; ++ + static PXA2xxFIrState *pxa2xx_fir_init(MemoryRegion *sysmem, + target_phys_addr_t base, + qemu_irq irq, qemu_irq rx_dma, qemu_irq tx_dma, +@@ -1980,10 +1986,9 @@ static PXA2xxFIrState *pxa2xx_fir_init(MemoryRegion *sysmem, + memory_region_init_io(&s->iomem, &pxa2xx_fir_ops, s, "pxa2xx-fir", 0x1000); + memory_region_add_subregion(sysmem, base, &s->iomem); + +- if (chr) +- qemu_chr_add_handlers(chr, pxa2xx_fir_is_empty, +- pxa2xx_fir_rx, pxa2xx_fir_event, s); +- ++ if (chr) { ++ qemu_chr_add_handlers(chr, &pxa2xx_handlers, s); ++ } + register_savevm(NULL, "pxa2xx_fir", 0, 0, pxa2xx_fir_save, + pxa2xx_fir_load, s); + +diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c +index 8aca0d4..677c665 100644 +--- a/hw/qdev-properties.c ++++ b/hw/qdev-properties.c +@@ -549,7 +549,7 @@ static void release_chr(Object *obj, const char *name, void *opaque) + CharDriverState **ptr = qdev_get_prop_ptr(dev, prop); + + if (*ptr) { +- qemu_chr_add_handlers(*ptr, NULL, NULL, NULL, NULL); ++ qemu_chr_add_handlers(*ptr, NULL, NULL); + } + } + +diff --git a/hw/serial.c b/hw/serial.c +index a421d1e..056d823 100644 +--- a/hw/serial.c ++++ b/hw/serial.c +@@ -736,6 +736,12 @@ static void serial_reset(void *opaque) + qemu_irq_lower(s->irq); + } + ++static const QemuChrHandlers serial_handlers = { ++ .fd_can_read = serial_can_receive1, ++ .fd_read = serial_receive1, ++ .fd_event = serial_event, ++}; ++ + static void serial_init_core(SerialState *s) + { + if (!s->chr) { +@@ -750,8 +756,7 @@ static void serial_init_core(SerialState *s) + + qemu_register_reset(serial_reset, s); + +- qemu_chr_add_handlers(s->chr, serial_can_receive1, serial_receive1, +- serial_event, s); ++ qemu_chr_add_handlers(s->chr, &serial_handlers, s); + } + + /* Change the main reference oscillator frequency. */ +diff --git a/hw/sh_serial.c b/hw/sh_serial.c +index 1d1883d..ce1c765 100644 +--- a/hw/sh_serial.c ++++ b/hw/sh_serial.c +@@ -352,6 +352,12 @@ static const MemoryRegionOps sh_serial_ops = { + .endianness = DEVICE_NATIVE_ENDIAN, + }; + ++static const QemuChrHandlers sh_serial_handlers = { ++ .fd_can_read = sh_serial_can_receive1, ++ .fd_read = sh_serial_receive1, ++ .fd_event = sh_serial_event, ++}; ++ + void sh_serial_init(MemoryRegion *sysmem, + target_phys_addr_t base, int feat, + uint32_t freq, CharDriverState *chr, +@@ -396,9 +402,9 @@ void sh_serial_init(MemoryRegion *sysmem, + + s->chr = chr; + +- if (chr) +- qemu_chr_add_handlers(chr, sh_serial_can_receive1, sh_serial_receive1, +- sh_serial_event, s); ++ if (chr) { ++ qemu_chr_add_handlers(chr, &sh_serial_handlers, s); ++ } + + s->eri = eri_source; + s->rxi = rxi_source; +diff --git a/hw/spapr_vty.c b/hw/spapr_vty.c +index 5da17a3..6c2ada1 100644 +--- a/hw/spapr_vty.c ++++ b/hw/spapr_vty.c +@@ -54,6 +54,11 @@ void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len) + qemu_chr_fe_write(dev->chardev, buf, len); + } + ++static const QemuChrHandlers vty_handlers = { ++ .fd_can_read = vty_can_receive, ++ .fd_read = vty_receive, ++}; ++ + static int spapr_vty_init(VIOsPAPRDevice *sdev) + { + VIOsPAPRVTYDevice *dev = (VIOsPAPRVTYDevice *)sdev; +@@ -63,8 +68,7 @@ static int spapr_vty_init(VIOsPAPRDevice *sdev) + exit(1); + } + +- qemu_chr_add_handlers(dev->chardev, vty_can_receive, +- vty_receive, NULL, dev); ++ qemu_chr_add_handlers(dev->chardev, &vty_handlers, dev); + + return 0; + } +diff --git a/hw/strongarm.c b/hw/strongarm.c +index 7150eeb..594cf31 100644 +--- a/hw/strongarm.c ++++ b/hw/strongarm.c +@@ -1199,6 +1199,12 @@ static const MemoryRegionOps strongarm_uart_ops = { + .endianness = DEVICE_NATIVE_ENDIAN, + }; + ++static const QemuChrHandlers strongarm_uart_handlers = { ++ .fd_can_read = strongarm_uart_can_receive, ++ .fd_read = strongarm_uart_receive, ++ .fd_event = strongarm_uart_event, ++}; ++ + static int strongarm_uart_init(SysBusDevice *dev) + { + StrongARMUARTState *s = FROM_SYSBUS(StrongARMUARTState, dev); +@@ -1211,11 +1217,7 @@ static int strongarm_uart_init(SysBusDevice *dev) + s->tx_timer = qemu_new_timer_ns(vm_clock, strongarm_uart_tx, s); + + if (s->chr) { +- qemu_chr_add_handlers(s->chr, +- strongarm_uart_can_receive, +- strongarm_uart_receive, +- strongarm_uart_event, +- s); ++ qemu_chr_add_handlers(s->chr, &strongarm_uart_handlers, s); + } + + return 0; +diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c +index 69b6e48..0ddfab6 100644 +--- a/hw/usb/dev-serial.c ++++ b/hw/usb/dev-serial.c +@@ -475,6 +475,12 @@ static void usb_serial_event(void *opaque, int event) + } + } + ++static const QemuChrHandlers usb_serial_handlers = { ++ .fd_can_read = usb_serial_can_read, ++ .fd_read = usb_serial_read, ++ .fd_event = usb_serial_event, ++}; ++ + static int usb_serial_initfn(USBDevice *dev) + { + USBSerialState *s = DO_UPCAST(USBSerialState, dev, dev); +@@ -487,8 +493,7 @@ static int usb_serial_initfn(USBDevice *dev) + return -1; + } + +- qemu_chr_add_handlers(s->cs, usb_serial_can_read, usb_serial_read, +- usb_serial_event, s); ++ qemu_chr_add_handlers(s->cs, &usb_serial_handlers, s); + usb_serial_handle_reset(dev); + return 0; + } +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index ab8d79a..8b22c80 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -867,6 +867,12 @@ static void usbredir_chardev_event(void *opaque, int event) + } + } + ++static const QemuChrHandlers usbredir_chr_handlers = { ++ .fd_can_read = usbredir_chardev_can_read, ++ .fd_read = usbredir_chardev_read, ++ .fd_event = usbredir_chardev_event, ++}; ++ + /* + * init + destroy + */ +@@ -905,8 +911,7 @@ static int usbredir_initfn(USBDevice *udev) + + /* Let the backend know we are ready */ + qemu_chr_fe_open(dev->cs); +- qemu_chr_add_handlers(dev->cs, usbredir_chardev_can_read, +- usbredir_chardev_read, usbredir_chardev_event, dev); ++ qemu_chr_add_handlers(dev->cs, &usbredir_chr_handlers, dev); + + add_boot_device_path(dev->bootindex, &udev->qdev, NULL); + return 0; +diff --git a/hw/virtio-console.c b/hw/virtio-console.c +index cffee3d..066590c 100644 +--- a/hw/virtio-console.c ++++ b/hw/virtio-console.c +@@ -106,6 +106,12 @@ static void chr_event(void *opaque, int event) + } + } + ++static const QemuChrHandlers chr_handlers = { ++ .fd_can_read = chr_can_read, ++ .fd_read = chr_read, ++ .fd_event = chr_event, ++}; ++ + static int virtconsole_initfn(VirtIOSerialPort *port) + { + VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); +@@ -117,8 +123,7 @@ static int virtconsole_initfn(VirtIOSerialPort *port) + } + + if (vcon->chr) { +- qemu_chr_add_handlers(vcon->chr, chr_can_read, chr_read, chr_event, +- vcon); ++ qemu_chr_add_handlers(vcon->chr, &chr_handlers, vcon); + } + + return 0; +diff --git a/hw/xen_console.c b/hw/xen_console.c +index 9426d73..e9fcadc 100644 +--- a/hw/xen_console.c ++++ b/hw/xen_console.c +@@ -211,6 +211,11 @@ out: + return ret; + } + ++static const QemuChrHandlers xencons_handlers = { ++ .fd_can_read = xencons_can_receive, ++ .fd_read = xencons_receive, ++}; ++ + static int con_initialise(struct XenDevice *xendev) + { + struct XenConsole *con = container_of(xendev, struct XenConsole, xendev); +@@ -231,9 +236,9 @@ static int con_initialise(struct XenDevice *xendev) + return -1; + + xen_be_bind_evtchn(&con->xendev); +- if (con->chr) +- qemu_chr_add_handlers(con->chr, xencons_can_receive, xencons_receive, +- NULL, con); ++ if (con->chr) { ++ qemu_chr_add_handlers(con->chr, &xencons_handlers, con); ++ } + + xen_be_printf(xendev, 1, "ring mfn %d, remote port %d, local port %d, limit %zd\n", + con->ring_ref, +@@ -250,8 +255,9 @@ static void con_disconnect(struct XenDevice *xendev) + if (!xendev->dev) { + return; + } +- if (con->chr) +- qemu_chr_add_handlers(con->chr, NULL, NULL, NULL, NULL); ++ if (con->chr) { ++ qemu_chr_add_handlers(con->chr, NULL, NULL); ++ } + xen_be_unbind_evtchn(&con->xendev); + + if (con->sring) { +diff --git a/hw/xilinx_uartlite.c b/hw/xilinx_uartlite.c +index d0f32db..33f0cd5 100644 +--- a/hw/xilinx_uartlite.c ++++ b/hw/xilinx_uartlite.c +@@ -195,6 +195,12 @@ static void uart_event(void *opaque, int event) + + } + ++static const QemuChrHandlers uart_handlers = { ++ .fd_can_read = uart_can_rx, ++ .fd_read = uart_rx, ++ .fd_event = uart_event, ++}; ++ + static int xilinx_uartlite_init(SysBusDevice *dev) + { + struct xlx_uartlite *s = FROM_SYSBUS(typeof (*s), dev); +@@ -207,8 +213,9 @@ static int xilinx_uartlite_init(SysBusDevice *dev) + sysbus_init_mmio(dev, &s->mmio); + + s->chr = qemu_char_get_next_serial(); +- if (s->chr) +- qemu_chr_add_handlers(s->chr, uart_can_rx, uart_rx, uart_event, s); ++ if (s->chr) { ++ qemu_chr_add_handlers(s->chr, &uart_handlers, s); ++ } + return 0; + } + +diff --git a/monitor.c b/monitor.c +index f45cf92..99eee98 100644 +--- a/monitor.c ++++ b/monitor.c +@@ -4942,6 +4942,18 @@ static void sortcmdlist(void) + * End: + */ + ++static const QemuChrHandlers monitor_handlers = { ++ .fd_can_read = monitor_can_read, ++ .fd_read = monitor_read, ++ .fd_event = monitor_event, ++}; ++ ++static const QemuChrHandlers monitor_control_handlers = { ++ .fd_can_read = monitor_can_read, ++ .fd_read = monitor_control_read, ++ .fd_event = monitor_control_event, ++}; ++ + void monitor_init(CharDriverState *chr, int flags) + { + static int is_first_init = 1; +@@ -4965,14 +4977,12 @@ void monitor_init(CharDriverState *chr, int flags) + if (monitor_ctrl_mode(mon)) { + mon->mc = g_malloc0(sizeof(MonitorControl)); + /* Control mode requires special handlers */ +- qemu_chr_add_handlers(chr, monitor_can_read, monitor_control_read, +- monitor_control_event, mon); ++ qemu_chr_add_handlers(chr, &monitor_control_handlers, mon); + qemu_chr_fe_set_echo(chr, true); + + json_message_parser_init(&mon->mc->parser, handle_qmp_command); + } else { +- qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, +- monitor_event, mon); ++ qemu_chr_add_handlers(chr, &monitor_handlers, mon); + } + + QLIST_INSERT_HEAD(&mon_list, mon, entry); +diff --git a/net/slirp.c b/net/slirp.c +index 8db66ea..63542cb 100644 +--- a/net/slirp.c ++++ b/net/slirp.c +@@ -593,6 +593,11 @@ static void guestfwd_read(void *opaque, const uint8_t *buf, int size) + slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size); + } + ++static const QemuChrHandlers guestfwd_handlers = { ++ .fd_can_read = guestfwd_can_read, ++ .fd_read = guestfwd_read, ++}; ++ + static int slirp_guestfwd(SlirpState *s, const char *config_str, + int legacy_format) + { +@@ -658,8 +663,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, + fwd->port = port; + fwd->slirp = s->slirp; + +- qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read, +- NULL, fwd); ++ qemu_chr_add_handlers(fwd->hd, &guestfwd_handlers, fwd); + } + return 0; + +diff --git a/qemu-char.c b/qemu-char.c +index a1fdf88..bd443db 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -192,19 +192,26 @@ void qemu_chr_fe_printf(CharDriverState *s, const char *fmt, ...) + va_end(ap); + } + ++static const QemuChrHandlers null_handlers = { ++ /* All handlers are initialised to NULL */ ++}; ++ + void qemu_chr_add_handlers(CharDriverState *s, +- IOCanReadHandler *fd_can_read, +- IOReadHandler *fd_read, +- IOEventHandler *fd_event, +- void *opaque) ++ const QemuChrHandlers *handlers, void *opaque) + { +- if (!opaque && !fd_can_read && !fd_read && !fd_event) { ++ if (!s) { ++ return; ++ } ++ if (!opaque && !handlers) { + /* chr driver being released. */ + ++s->avail_connections; + } +- s->chr_can_read = fd_can_read; +- s->chr_read = fd_read; +- s->chr_event = fd_event; ++ if (!handlers) { ++ handlers = &null_handlers; ++ } ++ s->chr_can_read = handlers->fd_can_read; ++ s->chr_read = handlers->fd_read; ++ s->chr_event = handlers->fd_event; + s->handler_opaque = opaque; + if (s->chr_update_read_handler) + s->chr_update_read_handler(s); +@@ -442,6 +449,12 @@ static void mux_chr_event(void *opaque, int event) + mux_chr_send_event(d, i, event); + } + ++static const QemuChrHandlers mux_chr_handlers = { ++ .fd_can_read = mux_chr_can_read, ++ .fd_read = mux_chr_read, ++ .fd_event = mux_chr_event, ++}; ++ + static void mux_chr_update_read_handler(CharDriverState *chr) + { + MuxDriver *d = chr->opaque; +@@ -456,8 +469,7 @@ static void mux_chr_update_read_handler(CharDriverState *chr) + d->chr_event[d->mux_cnt] = chr->chr_event; + /* Fix up the real driver with mux routines */ + if (d->mux_cnt == 0) { +- qemu_chr_add_handlers(d->drv, mux_chr_can_read, mux_chr_read, +- mux_chr_event, chr); ++ qemu_chr_add_handlers(d->drv, &mux_chr_handlers, chr); + } + if (d->focus != -1) { + mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_OUT); +diff --git a/qemu-char.h b/qemu-char.h +index 486644b..dfa8c2d 100644 +--- a/qemu-char.h ++++ b/qemu-char.h +@@ -222,10 +222,15 @@ void qemu_chr_be_write(CharDriverState *s, uint8_t *buf, int len); + */ + void qemu_chr_be_event(CharDriverState *s, int event); + +-void qemu_chr_add_handlers(CharDriverState *s, +- IOCanReadHandler *fd_can_read, +- IOReadHandler *fd_read, +- IOEventHandler *fd_event, ++ ++typedef struct QemuChrHandlers { ++ IOCanReadHandler *fd_can_read; ++ IOReadHandler *fd_read; ++ IOHandler *fd_write_unblocked; ++ IOEventHandler *fd_event; ++} QemuChrHandlers; ++ ++void qemu_chr_add_handlers(CharDriverState *s, const QemuChrHandlers *handlers, + void *opaque); + + void qemu_chr_generic_open(CharDriverState *s); +diff --git a/qtest.c b/qtest.c +index fbfab4e..4ab5b69 100644 +--- a/qtest.c ++++ b/qtest.c +@@ -416,6 +416,13 @@ static void qtest_event(void *opaque, int event) + } + } + ++static const QemuChrHandlers test_handlers = { ++ .fd_can_read = qtest_can_read, ++ .fd_read = qtest_read, ++ .fd_event = qtest_event, ++}; ++ ++ + int qtest_init(void) + { + CharDriverState *chr; +@@ -425,7 +432,7 @@ int qtest_init(void) + configure_icount("0"); + chr = qemu_chr_new("qtest", qtest_chrdev, NULL); + +- qemu_chr_add_handlers(chr, qtest_can_read, qtest_read, qtest_event, chr); ++ qemu_chr_add_handlers(chr, &test_handlers, chr); + qemu_chr_fe_set_echo(chr, true); + + inbuf = g_string_new(""); +-- +1.7.12.1 + diff --git a/0402-iohandlers-Add-enable-disable_write_fd_handler-funct.patch b/0402-iohandlers-Add-enable-disable_write_fd_handler-funct.patch new file mode 100644 index 0000000..cfc7cd2 --- /dev/null +++ b/0402-iohandlers-Add-enable-disable_write_fd_handler-funct.patch @@ -0,0 +1,77 @@ +From 2ac23d2134611b4e5b0fb389911bd03baa685df3 Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Mon, 21 Mar 2011 20:32:58 +0100 +Subject: [PATCH] iohandlers: Add enable/disable_write_fd_handler() functions + +These will be used to provide a cleaner API for the nonblocking case. + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + iohandler.c | 35 +++++++++++++++++++++++++++++++++++ + main-loop.h | 3 +++ + 2 files changed, 38 insertions(+) + +diff --git a/iohandler.c b/iohandler.c +index a2d871b..c00fecd 100644 +--- a/iohandler.c ++++ b/iohandler.c +@@ -45,6 +45,41 @@ typedef struct IOHandlerRecord { + static QLIST_HEAD(, IOHandlerRecord) io_handlers = + QLIST_HEAD_INITIALIZER(io_handlers); + ++static IOHandlerRecord *find_iohandler(int fd) ++{ ++ IOHandlerRecord *ioh; ++ ++ QLIST_FOREACH(ioh, &io_handlers, next) { ++ if (ioh->fd == fd) { ++ return ioh; ++ } ++ } ++ return NULL; ++} ++ ++void enable_write_fd_handler(int fd, IOHandler *fd_write) ++{ ++ IOHandlerRecord *ioh; ++ ++ ioh = find_iohandler(fd); ++ if (!ioh) { ++ return; ++ } ++ ++ ioh->fd_write = fd_write; ++} ++ ++void disable_write_fd_handler(int fd) ++{ ++ IOHandlerRecord *ioh; ++ ++ ioh = find_iohandler(fd); ++ if (!ioh) { ++ return; ++ } ++ ++ ioh->fd_write = NULL; ++} + + /* XXX: fd_read_poll should be suppressed, but an API change is + necessary in the character devices to suppress fd_can_read(). */ +diff --git a/main-loop.h b/main-loop.h +index dce1cd9..eb31273 100644 +--- a/main-loop.h ++++ b/main-loop.h +@@ -175,6 +175,9 @@ typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size); + typedef int IOCanReadHandler(void *opaque); + typedef void IOHandler(void *opaque); + ++void enable_write_fd_handler(int fd, IOHandler *fd_write); ++void disable_write_fd_handler(int fd); ++ + /** + * qemu_set_fd_handler2: Register a file descriptor with the main loop + * +-- +1.7.12.1 + diff --git a/0403-char-Add-framework-for-a-write-unblocked-callback.patch b/0403-char-Add-framework-for-a-write-unblocked-callback.patch new file mode 100644 index 0000000..67f83f6 --- /dev/null +++ b/0403-char-Add-framework-for-a-write-unblocked-callback.patch @@ -0,0 +1,62 @@ +From 8ca97117074b5eb12bf9cb0b25548116174601a8 Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Mon, 21 Mar 2011 21:41:42 +0100 +Subject: [PATCH] char: Add framework for a 'write unblocked' callback + +The char layer can let users know that the driver will block on further +input. For users interested in not blocking, they can assign a function +pointer that will be called back when the driver becomes writable. This +patch just adds the function pointers to the CharDriverState structure, +future patches will enable the nonblocking and callback functionality. + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + qemu-char.c | 3 +++ + qemu-char.h | 4 ++++ + 2 files changed, 7 insertions(+) + +diff --git a/qemu-char.c b/qemu-char.c +index bd443db..b5266d1 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -211,11 +211,14 @@ void qemu_chr_add_handlers(CharDriverState *s, + } + s->chr_can_read = handlers->fd_can_read; + s->chr_read = handlers->fd_read; ++ s->chr_write_unblocked = handlers->fd_write_unblocked; + s->chr_event = handlers->fd_event; + s->handler_opaque = opaque; + if (s->chr_update_read_handler) + s->chr_update_read_handler(s); + ++ s->write_blocked = false; ++ + /* We're connecting to an already opened device, so let's make sure we + also get the open event */ + if (s->opened) { +diff --git a/qemu-char.h b/qemu-char.h +index dfa8c2d..b5e23a4 100644 +--- a/qemu-char.h ++++ b/qemu-char.h +@@ -62,6 +62,9 @@ struct CharDriverState { + IOEventHandler *chr_event; + IOCanReadHandler *chr_can_read; + IOReadHandler *chr_read; ++ IOHandler *chr_write_unblocked; ++ void (*chr_enable_write_fd_handler)(struct CharDriverState *chr); ++ void (*chr_disable_write_fd_handler)(struct CharDriverState *chr); + void *handler_opaque; + void (*chr_close)(struct CharDriverState *chr); + void (*chr_accept_input)(struct CharDriverState *chr); +@@ -74,6 +77,7 @@ struct CharDriverState { + char *filename; + int opened; + int avail_connections; ++ bool write_blocked; /* Are we in a blocked state? */ + QTAILQ_ENTRY(CharDriverState) next; + }; + +-- +1.7.12.1 + diff --git a/0404-char-Update-send_all-to-handle-nonblocking-chardev-w.patch b/0404-char-Update-send_all-to-handle-nonblocking-chardev-w.patch new file mode 100644 index 0000000..b53d594 --- /dev/null +++ b/0404-char-Update-send_all-to-handle-nonblocking-chardev-w.patch @@ -0,0 +1,173 @@ +From dd7b138971deb72c7e37c4b79665df6ff5c1130b Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Mon, 21 Mar 2011 22:00:27 +0100 +Subject: [PATCH] char: Update send_all() to handle nonblocking chardev write + requests + +The send_all function is modified to return to the caller in case the +driver cannot handle any more data. It returns -EAGAIN or +WSAEWOULDBLOCK on non-Windows and Windows platforms respectively. This +is only done when the caller sets a callback function handler indicating +it's not interested in blocking till the driver has written out all the +data. + +Currently there's no driver or caller that supports this. Future +commits will add such capability. + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + qemu-char.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ + qemu_socket.h | 2 +- + 2 files changed, 64 insertions(+), 7 deletions(-) + +diff --git a/qemu-char.c b/qemu-char.c +index b5266d1..b46cc97 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -508,7 +508,7 @@ static CharDriverState *qemu_chr_open_mux(CharDriverState *drv) + + + #ifdef _WIN32 +-int send_all(int fd, const void *buf, int len1) ++static int do_send(int fd, const void *buf, int len1, bool nonblock) + { + int ret, len; + +@@ -516,9 +516,14 @@ int send_all(int fd, const void *buf, int len1) + while (len > 0) { + ret = send(fd, buf, len, 0); + if (ret < 0) { ++ if (nonblock && len1 - len) { ++ return len1 - len; ++ } + errno = WSAGetLastError(); + if (errno != WSAEWOULDBLOCK) { + return -1; ++ } else if (errno == WSAEWOULDBLOCK && nonblock) { ++ return WSAEWOULDBLOCK; + } + } else if (ret == 0) { + break; +@@ -532,7 +537,7 @@ int send_all(int fd, const void *buf, int len1) + + #else + +-int send_all(int fd, const void *_buf, int len1) ++static int do_send(int fd, const void *_buf, int len1, bool nonblock) + { + int ret, len; + const uint8_t *buf = _buf; +@@ -541,8 +546,15 @@ int send_all(int fd, const void *_buf, int len1) + while (len > 0) { + ret = write(fd, buf, len); + if (ret < 0) { +- if (errno != EINTR && errno != EAGAIN) ++ if (nonblock && len1 - len) { ++ return len1 - len; ++ } ++ if (errno == EAGAIN && nonblock) { ++ return -EAGAIN; ++ } ++ if (errno != EINTR && errno != EAGAIN) { + return -1; ++ } + } else if (ret == 0) { + break; + } else { +@@ -557,6 +569,44 @@ int send_all(int fd, const void *_buf, int len1) + #define STDIO_MAX_CLIENTS 1 + static int stdio_nb_clients; + ++int send_all(CharDriverState *chr, int fd, const void *_buf, int len1) ++{ ++ int ret, eagain_errno; ++ bool nonblock; ++ ++ if (chr && chr->write_blocked) { ++ /* ++ * The caller should not send us data while we're blocked, ++ * but this can happen when multiple writers are woken at once, ++ * so simply return -EAGAIN. ++ */ ++ return -EAGAIN; ++ } ++ ++ nonblock = false; ++ /* ++ * Ensure the char backend is able to receive and handle the ++ * 'write unblocked' event before we turn on nonblock support. ++ */ ++ if (chr && chr->chr_enable_write_fd_handler && chr->chr_write_unblocked) { ++ nonblock = true; ++ } ++ ret = do_send(fd, _buf, len1, nonblock); ++ ++#ifdef _WIN32 ++ eagain_errno = WSAEWOULDBLOCK; ++#else ++ eagain_errno = -EAGAIN; ++#endif ++ ++ if (nonblock && (ret == eagain_errno || (ret >= 0 && ret < len1))) { ++ /* Update fd handler to wake up when chr becomes writable */ ++ chr->chr_enable_write_fd_handler(chr); ++ chr->write_blocked = true; ++ } ++ return ret; ++} ++ + #ifndef _WIN32 + + typedef struct { +@@ -568,7 +618,7 @@ typedef struct { + static int fd_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + { + FDCharDriver *s = chr->opaque; +- return send_all(s->fd_out, buf, len); ++ return send_all(chr, s->fd_out, buf, len); + } + + static int fd_chr_read_poll(void *opaque) +@@ -887,7 +937,7 @@ static int pty_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + pty_chr_update_read_handler(chr); + return 0; + } +- return send_all(s->fd, buf, len); ++ return send_all(chr, s->fd, buf, len); + } + + static int pty_chr_read_poll(void *opaque) +@@ -2174,8 +2224,15 @@ static void tcp_closed(void *opaque) + static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + { + TCPCharDriver *s = chr->opaque; ++ + if (s->connected) { +- return send_all(s->fd, buf, len); ++ int ret; ++ ++ ret = send_all(chr, s->fd, buf, len); ++ if (ret == -1 && errno == EPIPE) { ++ tcp_closed(chr); ++ } ++ return ret; + } else { + /* XXX: indicate an error ? */ + return len; +diff --git a/qemu_socket.h b/qemu_socket.h +index 3e8aee9..a537d86 100644 +--- a/qemu_socket.h ++++ b/qemu_socket.h +@@ -36,7 +36,7 @@ int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen); + int socket_set_cork(int fd, int v); + void socket_set_block(int fd); + void socket_set_nonblock(int fd); +-int send_all(int fd, const void *buf, int len1); ++int send_all(CharDriverState *chr, int fd, const void *buf, int len1); + + /* callback function for nonblocking connect + * valid fd on success, negative error code on failure +-- +1.7.12.1 + diff --git a/0405-char-Equip-the-unix-tcp-backend-to-handle-nonblockin.patch b/0405-char-Equip-the-unix-tcp-backend-to-handle-nonblockin.patch new file mode 100644 index 0000000..830ed84 --- /dev/null +++ b/0405-char-Equip-the-unix-tcp-backend-to-handle-nonblockin.patch @@ -0,0 +1,82 @@ +From 625915146f56f77c275be1aee160f40183008b8d Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Mon, 21 Mar 2011 22:02:47 +0100 +Subject: [PATCH] char: Equip the unix/tcp backend to handle nonblocking + writes# + +Now that the infrastructure is in place to return -EAGAIN to callers, +individual char drivers can set their update_fd_handlers() function to +set or remove an fd's write handler. This handler checks if the driver +became writable. + +A generic callback routine is used for unblocking writes and letting +users of chardevs know that a driver became writable again. + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + qemu-char.c | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +diff --git a/qemu-char.c b/qemu-char.c +index b46cc97..9f8608a 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -106,6 +106,19 @@ + static QTAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs = + QTAILQ_HEAD_INITIALIZER(chardevs); + ++/* ++ * Generic routine that gets called when chardev becomes writable. ++ * Lets chardev user know it's OK to send more data. ++ */ ++static void char_write_unblocked(void *opaque) ++{ ++ CharDriverState *chr = opaque; ++ ++ chr->write_blocked = false; ++ chr->chr_disable_write_fd_handler(chr); ++ chr->chr_write_unblocked(chr->handler_opaque); ++} ++ + void qemu_chr_be_event(CharDriverState *s, int event) + { + /* Keep track if the char device is open */ +@@ -2503,6 +2516,25 @@ static void tcp_chr_close(CharDriverState *chr) + qemu_chr_be_event(chr, CHR_EVENT_CLOSED); + } + ++static void tcp_enable_write_fd_handler(CharDriverState *chr) ++{ ++ TCPCharDriver *s = chr->opaque; ++ ++ /* ++ * This function is called only after tcp_chr_connect() is called ++ * (either in 'server' mode or client mode. So we're sure of ++ * s->fd being initialised. ++ */ ++ enable_write_fd_handler(s->fd, char_write_unblocked); ++} ++ ++static void tcp_disable_write_fd_handler(CharDriverState *chr) ++{ ++ TCPCharDriver *s = chr->opaque; ++ ++ disable_write_fd_handler(s->fd); ++} ++ + static CharDriverState *qemu_chr_open_socket(QemuOpts *opts) + { + CharDriverState *chr = NULL; +@@ -2557,6 +2589,8 @@ static CharDriverState *qemu_chr_open_socket(QemuOpts *opts) + chr->chr_close = tcp_chr_close; + chr->get_msgfd = tcp_get_msgfd; + chr->chr_add_client = tcp_chr_add_client; ++ chr->chr_enable_write_fd_handler = tcp_enable_write_fd_handler; ++ chr->chr_disable_write_fd_handler = tcp_disable_write_fd_handler; + + if (is_listen) { + s->listen_fd = fd; +-- +1.7.12.1 + diff --git a/0406-char-Throttle-when-host-connection-is-down.patch b/0406-char-Throttle-when-host-connection-is-down.patch new file mode 100644 index 0000000..2190637 --- /dev/null +++ b/0406-char-Throttle-when-host-connection-is-down.patch @@ -0,0 +1,57 @@ +From 542fa14530022044ab577c543fba83202d52b703 Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Mon, 21 Mar 2011 22:05:10 +0100 +Subject: [PATCH] char: Throttle when host connection is down# + +When the host-side connection goes down, throttle the virtio-serial bus +and later unthrottle when a connection gets established. This helps +prevent any lost IO (guest->host) while the host connection was down. + +Bugzilla: 621484 + +This commit actually helps the bug mentioned above as no writes will now +get lost because of the throttling done here. With just the patches +sent earlier for that bug, one write will end up getting lost in the +worst case (host d/c, guest write, host connect). + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + qemu-char.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/qemu-char.c b/qemu-char.c +index 9f8608a..bfc94a5 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -140,6 +140,9 @@ static void qemu_chr_generic_open_bh(void *opaque) + { + CharDriverState *s = opaque; + qemu_chr_be_event(s, CHR_EVENT_OPENED); ++ if (s->write_blocked) { ++ char_write_unblocked(s); ++ } + qemu_bh_delete(s->bh); + s->bh = NULL; + } +@@ -2244,6 +2247,17 @@ static int tcp_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + ret = send_all(chr, s->fd, buf, len); + if (ret == -1 && errno == EPIPE) { + tcp_closed(chr); ++ ++ if (chr->chr_enable_write_fd_handler && chr->chr_write_unblocked) { ++ /* ++ * Since we haven't written out anything, let's say ++ * we're throttled. This will prevent any output from ++ * the guest getting lost if host-side chardev goes ++ * down. Unthrottle when we re-connect. ++ */ ++ chr->write_blocked = true; ++ return 0; ++ } + } + return ret; + } else { +-- +1.7.12.1 + diff --git a/0407-virtio-console-Enable-port-throttling-when-chardev-i.patch b/0407-virtio-console-Enable-port-throttling-when-chardev-i.patch new file mode 100644 index 0000000..85630c0 --- /dev/null +++ b/0407-virtio-console-Enable-port-throttling-when-chardev-i.patch @@ -0,0 +1,50 @@ +From feeea13d5eac9c0dd5da1ee7639a57ca519f4c91 Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Mon, 21 Mar 2011 22:06:41 +0100 +Subject: [PATCH] virtio-console: Enable port throttling when chardev is slow + to consume data + +When a chardev indicates it can't accept more data, we tell the +virtio-serial code to stop sending us any more data till we tell +otherwise. This helps in guests continuing to run normally while the vq +keeps getting full and eventually the guest stops queueing more data. +As soon as the chardev indicates it can accept more data, start pushing! + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + hw/virtio-console.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/hw/virtio-console.c b/hw/virtio-console.c +index 066590c..2b5e515 100644 +--- a/hw/virtio-console.c ++++ b/hw/virtio-console.c +@@ -20,6 +20,16 @@ typedef struct VirtConsole { + CharDriverState *chr; + } VirtConsole; + ++/* ++ * Callback function that's called from chardevs when backend becomes ++ * writable. ++ */ ++static void chr_write_unblocked(void *opaque) ++{ ++ VirtConsole *vcon = opaque; ++ ++ virtio_serial_throttle_port(&vcon->port, false); ++} + + /* Callback function that's called when the guest sends us data */ + static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len) +@@ -110,6 +120,7 @@ static const QemuChrHandlers chr_handlers = { + .fd_can_read = chr_can_read, + .fd_read = chr_read, + .fd_event = chr_event, ++ .fd_write_unblocked = chr_write_unblocked, + }; + + static int virtconsole_initfn(VirtIOSerialPort *port) +-- +1.7.12.1 + diff --git a/0408-spice-qemu-char.c-add-throttling.patch b/0408-spice-qemu-char.c-add-throttling.patch new file mode 100644 index 0000000..23018ec --- /dev/null +++ b/0408-spice-qemu-char.c-add-throttling.patch @@ -0,0 +1,135 @@ +From 2d1cf5b1be8cbd9c5a8c5f96ca699676fc1b23a7 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Tue, 22 Mar 2011 12:27:59 +0200 +Subject: [PATCH] spice-qemu-char.c: add throttling + +BZ: 672191 + +upstream: not submitted (explained below) + +Adds throttling support to spicevmc chardev. Uses a timer to avoid recursing: +1. spice-server: reds.c: read_from_vdi_port +2. qemu: spice-qemu-char.c: vmc_read +3. chr_write_unblocked + (calls virtio_serial_throttle_port(port, false)) +4. qemu: virtio ... +5. qemu: spice-qemu-char.c: spice_chr_write +6. qemu: spice-qemu-char.c: wakeup (calls into spice-server) +7. spice-server: ... +8. qemu: spice-qemu-char.c: vmc_read + +Instead, in vmc_read if we were throttled and we are just about to return +all the bytes we will set a timer to be triggered immediately to call +chr_write_unblocked. Then we return after 2 above, and 3 is called from the +timer callback. This also means we can later remove some ugly recursion protection +from spice-server. + +The other tricky point in this patch is not returning the leftover chunk twice. +When we throttle, by definition we have data that spice server didn't consume. +It is being kept by virtio-serial, and by us. The next vmc_read callback needs +to not return it, but just do unthrottling. Then virtio will give us the remaining +chunk as usual in spice_chr_write, and we will pass it to spice server in the +next vmc_read. + +This patch relies on Amit's series to expose throttling to chardev's, which +was not accepted upstream, and will not be accepted upstream until the mainloop +is reworked to use glib. + +Signed-off-by: Cole Robinson +--- + spice-qemu-char.c | 39 +++++++++++++++++++++++++++++++++++---- + 1 file changed, 35 insertions(+), 4 deletions(-) + +diff --git a/spice-qemu-char.c b/spice-qemu-char.c +index 09aa22d..fba2bfb 100644 +--- a/spice-qemu-char.c ++++ b/spice-qemu-char.c +@@ -1,4 +1,6 @@ + #include "config-host.h" ++#include "qemu-common.h" ++#include "qemu-timer.h" + #include "trace.h" + #include "ui/qemu-spice.h" + #include +@@ -25,6 +27,7 @@ typedef struct SpiceCharDriver { + uint8_t *datapos; + ssize_t bufsize, datalen; + uint32_t debug; ++ QEMUTimer *unblock_timer; + } SpiceCharDriver; + + static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len) +@@ -50,6 +53,17 @@ static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len) + return out; + } + ++static void spice_chr_unblock(void *opaque) ++{ ++ SpiceCharDriver *scd = opaque; ++ ++ if (scd->chr->chr_write_unblocked == NULL) { ++ dprintf(scd, 1, "%s: backend doesn't support unthrottling.\n", __func__); ++ return; ++ } ++ scd->chr->chr_write_unblocked(scd->chr->handler_opaque); ++} ++ + static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len) + { + SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin); +@@ -61,9 +75,16 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len) + scd->datapos += bytes; + scd->datalen -= bytes; + assert(scd->datalen >= 0); +- if (scd->datalen == 0) { +- scd->datapos = 0; +- } ++ } ++ if (scd->datalen == 0 && scd->chr->write_blocked) { ++ dprintf(scd, 1, "%s: unthrottling (%d)\n", __func__, bytes); ++ scd->chr->write_blocked = false; ++ /* ++ * set a timer instead of calling scd->chr->chr_write_unblocked directly, ++ * because that will call back into spice_chr_write (see ++ * virtio-console.c:chr_write_unblocked), which is unwanted. ++ */ ++ qemu_mod_timer(scd->unblock_timer, 0); + } + trace_spice_vmc_read(bytes, len); + return bytes; +@@ -135,6 +156,7 @@ static void vmc_unregister_interface(SpiceCharDriver *scd) + static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + { + SpiceCharDriver *s = chr->opaque; ++ int read_bytes; + + dprintf(s, 2, "%s: %d\n", __func__, len); + vmc_register_interface(s); +@@ -147,7 +169,15 @@ static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + s->datapos = s->buffer; + s->datalen = len; + spice_server_char_device_wakeup(&s->sin); +- return len; ++ read_bytes = len - s->datalen; ++ if (read_bytes != len) { ++ dprintf(s, 1, "%s: throttling: %d < %d (%zd)\n", __func__, ++ read_bytes, len, s->bufsize); ++ s->chr->write_blocked = true; ++ /* We'll get passed in the unconsumed data with the next call */ ++ s->datalen = 0; ++ } ++ return read_bytes; + } + + static void spice_chr_close(struct CharDriverState *chr) +@@ -225,6 +255,7 @@ CharDriverState *qemu_chr_open_spice(QemuOpts *opts) + chr->chr_close = spice_chr_close; + chr->chr_guest_open = spice_chr_guest_open; + chr->chr_guest_close = spice_chr_guest_close; ++ s->unblock_timer = qemu_new_timer_ms(vm_clock, spice_chr_unblock, s); + + #if SPICE_SERVER_VERSION < 0x000901 + /* See comment in vmc_state() */ +-- +1.7.12.1 + diff --git a/0409-spice-qemu-char.c-remove-intermediate-buffer.patch b/0409-spice-qemu-char.c-remove-intermediate-buffer.patch new file mode 100644 index 0000000..e1c6f0a --- /dev/null +++ b/0409-spice-qemu-char.c-remove-intermediate-buffer.patch @@ -0,0 +1,73 @@ +From fb481324641fc36e6f58aca8d8e5ada0536332f2 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Tue, 22 Mar 2011 12:28:00 +0200 +Subject: [PATCH] spice-qemu-char.c: remove intermediate buffer + +BZ: 672191 +upstream: not submitted (explained below) + +virtio-serial's buffer is valid when it calls us, and we don't +access it otherwise: vmc_read is only called in response to wakeup, +or else we set datalen=0 and throttle. Then vmc_read is called back, +we return 0 (not accessing the buffer) and set the timer to unthrottle. + +Also make datalen int and not ssize_t (to fit spice_chr_write signature). + +This relied on the previous patch that introduces throttling, which +can't go upstream right now as explained in that patch. + +Signed-off-by: Cole Robinson +--- + spice-qemu-char.c | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +diff --git a/spice-qemu-char.c b/spice-qemu-char.c +index fba2bfb..ef44bc0 100644 +--- a/spice-qemu-char.c ++++ b/spice-qemu-char.c +@@ -23,9 +23,8 @@ typedef struct SpiceCharDriver { + SpiceCharDeviceInstance sin; + char *subtype; + bool active; +- uint8_t *buffer; +- uint8_t *datapos; +- ssize_t bufsize, datalen; ++ const uint8_t *datapos; ++ int datalen; + uint32_t debug; + QEMUTimer *unblock_timer; + } SpiceCharDriver; +@@ -69,7 +68,7 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len) + SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin); + int bytes = MIN(len, scd->datalen); + +- dprintf(scd, 2, "%s: %p %d/%d/%zd\n", __func__, scd->datapos, len, bytes, scd->datalen); ++ dprintf(scd, 2, "%s: %p %d/%d/%d\n", __func__, scd->datapos, len, bytes, scd->datalen); + if (bytes > 0) { + memcpy(buf, scd->datapos, bytes); + scd->datapos += bytes; +@@ -161,18 +160,13 @@ static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len) + dprintf(s, 2, "%s: %d\n", __func__, len); + vmc_register_interface(s); + assert(s->datalen == 0); +- if (s->bufsize < len) { +- s->bufsize = len; +- s->buffer = g_realloc(s->buffer, s->bufsize); +- } +- memcpy(s->buffer, buf, len); +- s->datapos = s->buffer; ++ s->datapos = buf; + s->datalen = len; + spice_server_char_device_wakeup(&s->sin); + read_bytes = len - s->datalen; + if (read_bytes != len) { +- dprintf(s, 1, "%s: throttling: %d < %d (%zd)\n", __func__, +- read_bytes, len, s->bufsize); ++ dprintf(s, 1, "%s: throttling: %d < %d\n", __func__, ++ read_bytes, len); + s->chr->write_blocked = true; + /* We'll get passed in the unconsumed data with the next call */ + s->datalen = 0; +-- +1.7.12.1 + diff --git a/0410-usb-redir-Add-flow-control-support.patch b/0410-usb-redir-Add-flow-control-support.patch new file mode 100644 index 0000000..8506b22 --- /dev/null +++ b/0410-usb-redir-Add-flow-control-support.patch @@ -0,0 +1,62 @@ +From 539b42dbeefbf2fc7dc40ab7c1b5d9592a87d9b8 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 19 Jul 2011 10:56:19 +0200 +Subject: [PATCH] usb-redir: Add flow control support + +Signed-off-by: Hans de Goede +Signed-off-by: Cole Robinson +--- + hw/usb/redirect.c | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 8b22c80..b7c7f1e 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -229,12 +229,22 @@ static int usbredir_read(void *priv, uint8_t *data, int count) + static int usbredir_write(void *priv, uint8_t *data, int count) + { + USBRedirDevice *dev = priv; ++ int r; + +- if (!dev->cs->opened) { ++ if (!dev->cs->opened || dev->cs->write_blocked) { + return 0; + } + +- return qemu_chr_fe_write(dev->cs, data, count); ++ r = qemu_chr_fe_write(dev->cs, data, count); ++ ++ if (r < 0) { ++ if (dev->cs->write_blocked) { ++ return 0; ++ } ++ return -1; ++ } ++ ++ return r; + } + + /* +@@ -867,10 +877,18 @@ static void usbredir_chardev_event(void *opaque, int event) + } + } + ++static void usbredir_chardev_write_unblocked(void *opaque) ++{ ++ USBRedirDevice *dev = opaque; ++ ++ usbredirparser_do_write(dev->parser); ++} ++ + static const QemuChrHandlers usbredir_chr_handlers = { + .fd_can_read = usbredir_chardev_can_read, + .fd_read = usbredir_chardev_read, + .fd_event = usbredir_chardev_event, ++ .fd_write_unblocked = usbredir_chardev_write_unblocked, + }; + + /* +-- +1.7.12.1 + diff --git a/0412-char-Disable-write-callback-if-throttled-chardev-is-.patch b/0412-char-Disable-write-callback-if-throttled-chardev-is-.patch new file mode 100644 index 0000000..ae0be6f --- /dev/null +++ b/0412-char-Disable-write-callback-if-throttled-chardev-is-.patch @@ -0,0 +1,37 @@ +From f3551d3640f3436b0e5505fd208cbd7bbfef411f Mon Sep 17 00:00:00 2001 +From: Amit Shah +Date: Fri, 2 Dec 2011 15:42:55 +0530 +Subject: [PATCH] char: Disable write callback if throttled chardev is + detached + +If a throttled chardev is detached from the frontend device, all future +callbacks should be suppressed. Not doing this results in a segfault. + +Bugzilla: 745758 +Upstream: Not applicable, since throttling is a RHEL6-only feature. + +Signed-off-by: Amit Shah +Signed-off-by: Cole Robinson +--- + qemu-char.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/qemu-char.c b/qemu-char.c +index bfc94a5..67a6d73 100644 +--- a/qemu-char.c ++++ b/qemu-char.c +@@ -223,6 +223,11 @@ void qemu_chr_add_handlers(CharDriverState *s, + ++s->avail_connections; + } + if (!handlers) { ++ if (s->write_blocked) { ++ /* Ensure we disable the callback if we were throttled */ ++ s->chr_disable_write_fd_handler(s); ++ /* s->write_blocked is cleared below */ ++ } + handlers = &null_handlers; + } + s->chr_can_read = handlers->fd_can_read; +-- +1.7.12.1 + diff --git a/0413-hw-virtio-serial-bus-post_load-send_event-when-vm-is.patch b/0413-hw-virtio-serial-bus-post_load-send_event-when-vm-is.patch new file mode 100644 index 0000000..2ec9363 --- /dev/null +++ b/0413-hw-virtio-serial-bus-post_load-send_event-when-vm-is.patch @@ -0,0 +1,130 @@ +From 9903053345528aa8eebb16365b2ece77c58c0cf6 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Wed, 14 Nov 2012 15:06:35 +0200 +Subject: [PATCH 1/2] hw/virtio-serial-bus: post_load send_event when vm is + running + +Add a new timer based on vm_clock for 1 ns in the future from post_load +to do the event send in case host_connected differs between migration +source and target. + +RHBZ: 867366 + +Signed-off-by: Alon Levy +--- + hw/virtio-serial-bus.c | 54 ++++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 44 insertions(+), 10 deletions(-) + +diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c +index d20bd8b..a028877 100644 +--- a/hw/virtio-serial-bus.c ++++ b/hw/virtio-serial-bus.c +@@ -53,6 +53,15 @@ struct VirtIOSerial { + uint32_t *ports_map; + + struct virtio_console_config config; ++ ++ struct VirtIOSerialPostLoad { ++ QEMUTimer *timer; ++ int nr_active_ports; ++ struct VirtIOSerialPostLoadPort { ++ VirtIOSerialPort *port; ++ uint8_t host_connected; ++ } *connected; ++ } post_load; + }; + + static VirtIOSerialPort *find_port_by_id(VirtIOSerial *vser, uint32_t id) +@@ -626,6 +635,29 @@ static void virtio_serial_save(QEMUFile *f, void *opaque) + } + } + ++static void virtio_serial_post_load_timer_cb(void *opaque) ++{ ++ int i; ++ VirtIOSerial *s = opaque; ++ VirtIOSerialPort *port; ++ uint8_t host_connected; ++ ++ for (i = 0 ; i < s->post_load.nr_active_ports; ++i) { ++ port = s->post_load.connected[i].port; ++ host_connected = s->post_load.connected[i].host_connected; ++ if (host_connected != port->host_connected) { ++ /* ++ * We have to let the guest know of the host connection ++ * status change ++ */ ++ send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, ++ port->host_connected); ++ } ++ } ++ g_free(s->post_load.connected); ++ s->post_load.connected = NULL; ++} ++ + static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id) + { + VirtIOSerial *s = opaque; +@@ -673,10 +705,13 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id) + + qemu_get_be32s(f, &nr_active_ports); + ++ s->post_load.nr_active_ports = nr_active_ports; ++ s->post_load.connected = ++ g_malloc0(sizeof(*s->post_load.connected) * nr_active_ports); ++ + /* Items in struct VirtIOSerialPort */ + for (i = 0; i < nr_active_ports; i++) { + uint32_t id; +- bool host_connected; + + id = qemu_get_be32(f); + port = find_port_by_id(s, id); +@@ -685,15 +720,8 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id) + } + + port->guest_connected = qemu_get_byte(f); +- host_connected = qemu_get_byte(f); +- if (host_connected != port->host_connected) { +- /* +- * We have to let the guest know of the host connection +- * status change +- */ +- send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, +- port->host_connected); +- } ++ s->post_load.connected[i].port = port; ++ s->post_load.connected[i].host_connected = qemu_get_byte(f); + + if (version_id > 2) { + uint32_t elem_popped; +@@ -718,6 +746,7 @@ static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id) + } + } + } ++ qemu_mod_timer(s->post_load.timer, 1); + return 0; + } + +@@ -967,6 +996,9 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf) + register_savevm(dev, "virtio-console", -1, 3, virtio_serial_save, + virtio_serial_load, vser); + ++ vser->post_load.timer = qemu_new_timer_ns(vm_clock, ++ virtio_serial_post_load_timer_cb, vser); ++ + return vdev; + } + +@@ -979,6 +1011,8 @@ void virtio_serial_exit(VirtIODevice *vdev) + g_free(vser->ivqs); + g_free(vser->ovqs); + g_free(vser->ports_map); ++ g_free(vser->post_load.connected); ++ qemu_free_timer(vser->post_load.timer); + + virtio_cleanup(vdev); + } +-- +1.8.0 + diff --git a/0414-hw-virtio-serial-bus-replay-guest-open-on-destinatio.patch b/0414-hw-virtio-serial-bus-replay-guest-open-on-destinatio.patch new file mode 100644 index 0000000..07b10f6 --- /dev/null +++ b/0414-hw-virtio-serial-bus-replay-guest-open-on-destinatio.patch @@ -0,0 +1,54 @@ +From 5b6831175b21aa5a3405a21dd79e1ef0a81bbdb3 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Fri, 16 Nov 2012 16:24:47 +0200 +Subject: [PATCH 2/2] hw/virtio-serial-bus: replay guest open on destination + +This is rewrite of a patch carried in Fedora previously based +on new code upstream, here is the original message, it still applies: +(the original fedora patch was commit id +a9bc20afc1f0604ee81c23b7c67d627e51d2e8d4, this is useful for grepping in +logs, it isn't in upstream) + +When migrating a host with with a spice agent running the mouse becomes +non operational after the migration. This is rhbz #725965. + +The problem is that after migration spice doesn't know the guest agent +is open. Spice is just a char dev here. And a chardev cannot query it's +device, the device has to let the chardev know when it is open. Right +now after migration the chardev which is recreated is in it's default +state, which assumes the guest is disconnected. + +Char devices carry no information across migration, but the +virtio-serial does already carry the guest_connected state. This patch +passes that bit to the chardev. +--- + hw/virtio-serial-bus.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c +index a028877..a6ec2df 100644 +--- a/hw/virtio-serial-bus.c ++++ b/hw/virtio-serial-bus.c +@@ -641,6 +641,7 @@ static void virtio_serial_post_load_timer_cb(void *opaque) + VirtIOSerial *s = opaque; + VirtIOSerialPort *port; + uint8_t host_connected; ++ VirtIOSerialPortClass *vsc; + + for (i = 0 ; i < s->post_load.nr_active_ports; ++i) { + port = s->post_load.connected[i].port; +@@ -653,6 +654,11 @@ static void virtio_serial_post_load_timer_cb(void *opaque) + send_control_event(port, VIRTIO_CONSOLE_PORT_OPEN, + port->host_connected); + } ++ vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port); ++ if (port->guest_connected && vsc->guest_open) { ++ /* replay guest open */ ++ vsc->guest_open(port); ++ } + } + g_free(s->post_load.connected); + s->post_load.connected = NULL; +-- +1.8.0 + diff --git a/0500-qxl-disallow-unknown-revisions.patch b/0500-qxl-disallow-unknown-revisions.patch new file mode 100644 index 0000000..331ca45 --- /dev/null +++ b/0500-qxl-disallow-unknown-revisions.patch @@ -0,0 +1,31 @@ +From 4b9d4103e5ff91b022ee8e9522040829f009543a Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Tue, 21 Aug 2012 13:51:32 +0300 +Subject: [PATCH] qxl: disallow unknown revisions + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 59bf822..71879fe 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1873,9 +1873,9 @@ static int qxl_init_common(PCIQXLDevice *qxl) + break; + #endif + default: +- pci_device_rev = QXL_DEFAULT_REVISION; +- io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1); +- break; ++ error_report("Invalid revision %d for qxl device (max %d)", ++ qxl->revision, QXL_DEFAULT_REVISION); ++ return -1; + } + + pci_set_byte(&config[PCI_REVISION_ID], pci_device_rev); +-- +1.7.12.1 + diff --git a/0501-spice-make-number-of-surfaces-runtime-configurable.patch b/0501-spice-make-number-of-surfaces-runtime-configurable.patch new file mode 100644 index 0000000..b55c3df --- /dev/null +++ b/0501-spice-make-number-of-surfaces-runtime-configurable.patch @@ -0,0 +1,201 @@ +From 1c74b60fa972c9489f9cf8fa59165dedd0c23de2 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 4 Sep 2012 11:39:41 +0200 +Subject: [PATCH] spice: make number of surfaces runtime-configurable. + +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 31 +++++++++++++++++-------------- + hw/qxl.h | 3 +-- + ui/spice-display.c | 5 ++++- + ui/spice-display.h | 3 +-- + 4 files changed, 23 insertions(+), 19 deletions(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 71879fe..83df499 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -238,7 +238,8 @@ static void qxl_spice_destroy_surfaces_complete(PCIQXLDevice *qxl) + { + trace_qxl_spice_destroy_surfaces_complete(qxl->id); + qemu_mutex_lock(&qxl->track_lock); +- memset(&qxl->guest_surfaces.cmds, 0, sizeof(qxl->guest_surfaces.cmds)); ++ memset(qxl->guest_surfaces.cmds, 0, ++ sizeof(qxl->guest_surfaces.cmds) * qxl->ssd.num_surfaces); + qxl->guest_surfaces.count = 0; + qemu_mutex_unlock(&qxl->track_lock); + } +@@ -347,7 +348,7 @@ static void init_qxl_rom(PCIQXLDevice *d) + rom->slot_id_bits = MEMSLOT_SLOT_BITS; + rom->slots_start = 1; + rom->slots_end = NUM_MEMSLOTS - 1; +- rom->n_surfaces = cpu_to_le32(NUM_SURFACES); ++ rom->n_surfaces = cpu_to_le32(d->ssd.num_surfaces); + + for (i = 0, n = 0; i < ARRAY_SIZE(qxl_modes); i++) { + fb = qxl_modes[i].y_res * qxl_modes[i].stride; +@@ -451,9 +452,9 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext) + } + uint32_t id = le32_to_cpu(cmd->surface_id); + +- if (id >= NUM_SURFACES) { ++ if (id >= qxl->ssd.num_surfaces) { + qxl_set_guest_bug(qxl, "QXL_CMD_SURFACE id %d >= %d", id, +- NUM_SURFACES); ++ qxl->ssd.num_surfaces); + return 1; + } + qemu_mutex_lock(&qxl->track_lock); +@@ -529,7 +530,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info) + info->num_memslots_groups = NUM_MEMSLOTS_GROUPS; + info->internal_groupslot_id = 0; + info->qxl_ram_size = le32_to_cpu(qxl->shadow_rom.num_pages) << TARGET_PAGE_BITS; +- info->n_surfaces = NUM_SURFACES; ++ info->n_surfaces = qxl->ssd.num_surfaces; + } + + static const char *qxl_mode_to_string(int mode) +@@ -1438,7 +1439,7 @@ async_common: + QXLCookie *cookie = NULL; + QXLRect update = d->ram->update_area; + +- if (d->ram->update_surface > NUM_SURFACES) { ++ if (d->ram->update_surface > d->ssd.num_surfaces) { + qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: invalid surface id %d\n", + d->ram->update_surface); + return; +@@ -1538,7 +1539,7 @@ async_common: + } + break; + case QXL_IO_DESTROY_SURFACE_WAIT: +- if (val >= NUM_SURFACES) { ++ if (val >= d->ssd.num_surfaces) { + qxl_set_guest_bug(d, "QXL_IO_DESTROY_SURFACE (async=%d):" + "%" PRIu64 " >= NUM_SURFACES", async, val); + goto cancel_async; +@@ -1717,7 +1718,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl) + vram_start = (intptr_t)memory_region_get_ram_ptr(&qxl->vram_bar); + + /* dirty the off-screen surfaces */ +- for (i = 0; i < NUM_SURFACES; i++) { ++ for (i = 0; i < qxl->ssd.num_surfaces; i++) { + QXLSurfaceCmd *cmd; + intptr_t surface_offset; + int surface_size; +@@ -1845,7 +1846,6 @@ static int qxl_init_common(PCIQXLDevice *qxl) + qxl->mode = QXL_MODE_UNDEFINED; + qxl->generation = 1; + qxl->num_memslots = NUM_MEMSLOTS; +- qxl->num_surfaces = NUM_SURFACES; + qemu_mutex_init(&qxl->track_lock); + qemu_mutex_init(&qxl->async_lock); + qxl->current_async = QXL_UNDEFINED_IO; +@@ -1887,6 +1887,7 @@ static int qxl_init_common(PCIQXLDevice *qxl) + init_qxl_rom(qxl); + init_qxl_ram(qxl); + ++ qxl->guest_surfaces.cmds = g_new0(QXLPHYSICAL, qxl->ssd.num_surfaces); + memory_region_init_ram(&qxl->vram_bar, "qxl.vram", qxl->vram_size); + vmstate_register_ram(&qxl->vram_bar, &qxl->pci.qdev); + memory_region_init_alias(&qxl->vram32_bar, "qxl.vram32", &qxl->vram_bar, +@@ -2052,8 +2053,8 @@ static int qxl_post_load(void *opaque, int version) + qxl_create_guest_primary(d, 1, QXL_SYNC); + + /* replay surface-create and cursor-set commands */ +- cmds = g_malloc0(sizeof(QXLCommandExt) * (NUM_SURFACES + 1)); +- for (in = 0, out = 0; in < NUM_SURFACES; in++) { ++ cmds = g_malloc0(sizeof(QXLCommandExt) * (d->ssd.num_surfaces + 1)); ++ for (in = 0, out = 0; in < d->ssd.num_surfaces; in++) { + if (d->guest_surfaces.cmds[in] == 0) { + continue; + } +@@ -2153,9 +2154,10 @@ static VMStateDescription qxl_vmstate = { + qxl_memslot, struct guest_slots), + VMSTATE_STRUCT(guest_primary.surface, PCIQXLDevice, 0, + qxl_surface, QXLSurfaceCreate), +- VMSTATE_INT32_EQUAL(num_surfaces, PCIQXLDevice), +- VMSTATE_ARRAY(guest_surfaces.cmds, PCIQXLDevice, NUM_SURFACES, 0, +- vmstate_info_uint64, uint64_t), ++ VMSTATE_INT32_EQUAL(ssd.num_surfaces, PCIQXLDevice), ++ VMSTATE_VARRAY_INT32(guest_surfaces.cmds, PCIQXLDevice, ++ ssd.num_surfaces, 0, ++ vmstate_info_uint64, uint64_t), + VMSTATE_UINT64(guest_cursor, PCIQXLDevice), + VMSTATE_END_OF_LIST() + }, +@@ -2183,6 +2185,7 @@ static Property qxl_properties[] = { + DEFINE_PROP_UINT32("vram_size_mb", PCIQXLDevice, vram32_size_mb, -1), + DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb, -1), + DEFINE_PROP_UINT32("vgamem_mb", PCIQXLDevice, vgamem_size_mb, 16), ++ DEFINE_PROP_INT32("surfaces", PCIQXLDevice, ssd.num_surfaces, 1024), + DEFINE_PROP_END_OF_LIST(), + }; + +diff --git a/hw/qxl.h b/hw/qxl.h +index 9cfedb7..5553824 100644 +--- a/hw/qxl.h ++++ b/hw/qxl.h +@@ -40,7 +40,6 @@ typedef struct PCIQXLDevice { + uint32_t revision; + + int32_t num_memslots; +- int32_t num_surfaces; + + uint32_t current_async; + QemuMutex async_lock; +@@ -65,7 +64,7 @@ typedef struct PCIQXLDevice { + } guest_primary; + + struct surfaces { +- QXLPHYSICAL cmds[NUM_SURFACES]; ++ QXLPHYSICAL *cmds; + uint32_t count; + uint32_t max; + } guest_surfaces; +diff --git a/ui/spice-display.c b/ui/spice-display.c +index 1c31418..99bc665 100644 +--- a/ui/spice-display.c ++++ b/ui/spice-display.c +@@ -317,6 +317,9 @@ void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds) + qemu_mutex_init(&ssd->lock); + ssd->mouse_x = -1; + ssd->mouse_y = -1; ++ if (ssd->num_surfaces == 0) { ++ ssd->num_surfaces = 1024; ++ } + ssd->bufsize = (16 * 1024 * 1024); + ssd->buf = g_malloc(ssd->bufsize); + } +@@ -427,7 +430,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info) + info->num_memslots_groups = NUM_MEMSLOTS_GROUPS; + info->internal_groupslot_id = 0; + info->qxl_ram_size = ssd->bufsize; +- info->n_surfaces = NUM_SURFACES; ++ info->n_surfaces = ssd->num_surfaces; + } + + static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext) +diff --git a/ui/spice-display.h b/ui/spice-display.h +index bcff114..512ab78 100644 +--- a/ui/spice-display.h ++++ b/ui/spice-display.h +@@ -32,8 +32,6 @@ + #define MEMSLOT_GROUP_GUEST 1 + #define NUM_MEMSLOTS_GROUPS 2 + +-#define NUM_SURFACES 1024 +- + /* + * Internal enum to differenciate between options for + * io calls that have a sync (old) version and an _async (new) +@@ -80,6 +78,7 @@ struct SimpleSpiceDisplay { + QXLInstance qxl; + uint32_t unique; + QemuPfConv *conv; ++ int32_t num_surfaces; + + QXLRect dirty; + int notify; +-- +1.7.12.1 + diff --git a/0502-qxl-Add-set_client_capabilities-interface-to-QXLInte.patch b/0502-qxl-Add-set_client_capabilities-interface-to-QXLInte.patch new file mode 100644 index 0000000..41c05f5 --- /dev/null +++ b/0502-qxl-Add-set_client_capabilities-interface-to-QXLInte.patch @@ -0,0 +1,64 @@ +From 0fe78ffd13555bed86a41acf96cdc15ece961b0d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= +Date: Tue, 4 Sep 2012 10:14:48 -0400 +Subject: [PATCH] qxl: Add set_client_capabilities() interface to QXLInterface + +This new interface lets spice server inform the guest whether + +(a) a client is connected +(b) what capabilities the client has + +There is a fixed number (464) of bits reserved for capabilities, and +when the capabilities bits change, the QXL_INTERRUPT_CLIENT interrupt +is generated. + +Signed-off-by: Soren Sandmann +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 83df499..d8b67b2 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -946,6 +946,26 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token) + } + } + ++#if SPICE_SERVER_VERSION >= 0x000b04 ++ ++/* called from spice server thread context only */ ++static void interface_set_client_capabilities(QXLInstance *sin, ++ uint8_t client_present, ++ uint8_t caps[58]) ++{ ++ PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl); ++ ++ qxl->shadow_rom.client_present = client_present; ++ memcpy(qxl->shadow_rom.client_capabilities, caps, sizeof(caps)); ++ qxl->rom->client_present = client_present; ++ memcpy(qxl->rom->client_capabilities, caps, sizeof(caps)); ++ qxl_rom_set_dirty(qxl); ++ ++ qxl_send_events(qxl, QXL_INTERRUPT_CLIENT); ++} ++ ++#endif ++ + static const QXLInterface qxl_interface = { + .base.type = SPICE_INTERFACE_QXL, + .base.description = "qxl gpu", +@@ -967,6 +987,9 @@ static const QXLInterface qxl_interface = { + .flush_resources = interface_flush_resources, + .async_complete = interface_async_complete, + .update_area_complete = interface_update_area_complete, ++#if SPICE_SERVER_VERSION >= 0x000b04 ++ .set_client_capabilities = interface_set_client_capabilities, ++#endif + }; + + static void qxl_enter_vga_mode(PCIQXLDevice *d) +-- +1.7.12.1 + diff --git a/0503-Remove-ifdef-QXL_COMMAND_FLAG_COMPAT_16BPP.patch b/0503-Remove-ifdef-QXL_COMMAND_FLAG_COMPAT_16BPP.patch new file mode 100644 index 0000000..899e280 --- /dev/null +++ b/0503-Remove-ifdef-QXL_COMMAND_FLAG_COMPAT_16BPP.patch @@ -0,0 +1,32 @@ +From 0dcef831a875505fdaffb824de9e4450273ea53d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= +Date: Tue, 4 Sep 2012 10:14:49 -0400 +Subject: [PATCH] Remove #ifdef QXL_COMMAND_FLAG_COMPAT_16BPP + +We require spice >= 0.8 now, so this flag is always present. + +Signed-off-by: Soren Sandmann +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index d8b67b2..a6e6cf1 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1361,11 +1361,9 @@ static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm) + + d->mode = QXL_MODE_COMPAT; + d->cmdflags = QXL_COMMAND_FLAG_COMPAT; +-#ifdef QXL_COMMAND_FLAG_COMPAT_16BPP /* new in spice 0.6.1 */ + if (mode->bits == 16) { + d->cmdflags |= QXL_COMMAND_FLAG_COMPAT_16BPP; + } +-#endif + d->shadow_rom.mode = cpu_to_le32(modenr); + d->rom->mode = cpu_to_le32(modenr); + qxl_rom_set_dirty(d); +-- +1.7.12.1 + diff --git a/0504-spice-switch-to-queue-for-vga-mode-updates.patch b/0504-spice-switch-to-queue-for-vga-mode-updates.patch new file mode 100644 index 0000000..b9726e8 --- /dev/null +++ b/0504-spice-switch-to-queue-for-vga-mode-updates.patch @@ -0,0 +1,138 @@ +From 244ff52221b4c4181422861a930d8f755a1a5c08 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Wed, 5 Sep 2012 08:25:08 +0200 +Subject: [PATCH] spice: switch to queue for vga mode updates + +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 6 +++--- + ui/spice-display.c | 25 ++++++++++++++----------- + ui/spice-display.h | 3 ++- + 3 files changed, 19 insertions(+), 15 deletions(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index a6e6cf1..2ec4341 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -599,9 +599,9 @@ static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext) + case QXL_MODE_VGA: + ret = false; + qemu_mutex_lock(&qxl->ssd.lock); +- if (qxl->ssd.update != NULL) { +- update = qxl->ssd.update; +- qxl->ssd.update = NULL; ++ update = QTAILQ_FIRST(&qxl->ssd.updates); ++ if (update != NULL) { ++ QTAILQ_REMOVE(&qxl->ssd.updates, update, next); + *ext = update->ext; + ret = true; + } +diff --git a/ui/spice-display.c b/ui/spice-display.c +index 99bc665..59c5fd7 100644 +--- a/ui/spice-display.c ++++ b/ui/spice-display.c +@@ -164,7 +164,7 @@ int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd) + #endif + } + +-static SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) ++static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) + { + SimpleSpiceUpdate *update; + QXLDrawable *drawable; +@@ -175,7 +175,7 @@ static SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) + struct timespec time_space; + + if (qemu_spice_rect_is_empty(&ssd->dirty)) { +- return NULL; ++ return; + }; + + trace_qemu_spice_create_update( +@@ -239,7 +239,7 @@ static SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) + cmd->data = (uintptr_t)drawable; + + memset(&ssd->dirty, 0, sizeof(ssd->dirty)); +- return update; ++ QTAILQ_INSERT_TAIL(&ssd->updates, update, next); + } + + /* +@@ -315,6 +315,7 @@ void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds) + { + ssd->ds = ds; + qemu_mutex_init(&ssd->lock); ++ QTAILQ_INIT(&ssd->updates); + ssd->mouse_x = -1; + ssd->mouse_y = -1; + if (ssd->num_surfaces == 0) { +@@ -345,6 +346,8 @@ void qemu_spice_display_update(SimpleSpiceDisplay *ssd, + + void qemu_spice_display_resize(SimpleSpiceDisplay *ssd) + { ++ SimpleSpiceUpdate *update; ++ + dprint(1, "%s:\n", __FUNCTION__); + + memset(&ssd->dirty, 0, sizeof(ssd->dirty)); +@@ -352,9 +355,9 @@ void qemu_spice_display_resize(SimpleSpiceDisplay *ssd) + ssd->conv = NULL; + + qemu_mutex_lock(&ssd->lock); +- if (ssd->update != NULL) { +- qemu_spice_destroy_update(ssd, ssd->update); +- ssd->update = NULL; ++ while ((update = QTAILQ_FIRST(&ssd->updates)) != NULL) { ++ QTAILQ_REMOVE(&ssd->updates, update, next); ++ qemu_spice_destroy_update(ssd, update); + } + qemu_mutex_unlock(&ssd->lock); + qemu_spice_destroy_host_primary(ssd); +@@ -384,8 +387,8 @@ void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd) + vga_hw_update(); + + qemu_mutex_lock(&ssd->lock); +- if (ssd->update == NULL) { +- ssd->update = qemu_spice_create_update(ssd); ++ if (QTAILQ_EMPTY(&ssd->updates)) { ++ qemu_spice_create_update(ssd); + ssd->notify++; + } + qemu_spice_cursor_refresh_unlocked(ssd); +@@ -442,9 +445,9 @@ static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext) + dprint(3, "%s:\n", __FUNCTION__); + + qemu_mutex_lock(&ssd->lock); +- if (ssd->update != NULL) { +- update = ssd->update; +- ssd->update = NULL; ++ update = QTAILQ_FIRST(&ssd->updates); ++ if (update != NULL) { ++ QTAILQ_REMOVE(&ssd->updates, update, next); + *ext = update->ext; + ret = true; + } +diff --git a/ui/spice-display.h b/ui/spice-display.h +index 512ab78..3fcb6fe 100644 +--- a/ui/spice-display.h ++++ b/ui/spice-display.h +@@ -92,7 +92,7 @@ struct SimpleSpiceDisplay { + * to them must be protected by the lock. + */ + QemuMutex lock; +- SimpleSpiceUpdate *update; ++ QTAILQ_HEAD(, SimpleSpiceUpdate) updates; + QEMUCursor *cursor; + int mouse_x, mouse_y; + }; +@@ -102,6 +102,7 @@ struct SimpleSpiceUpdate { + QXLImage image; + QXLCommandExt ext; + uint8_t *bitmap; ++ QTAILQ_ENTRY(SimpleSpiceUpdate) next; + }; + + int qemu_spice_rect_is_empty(const QXLRect* r); +-- +1.7.12.1 + diff --git a/0505-spice-split-qemu_spice_create_update.patch b/0505-spice-split-qemu_spice_create_update.patch new file mode 100644 index 0000000..d761fcf --- /dev/null +++ b/0505-spice-split-qemu_spice_create_update.patch @@ -0,0 +1,94 @@ +From 6d196973a9adba583cf9bbc5a4196a58f2cb0eb3 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Wed, 5 Sep 2012 08:52:23 +0200 +Subject: [PATCH] spice: split qemu_spice_create_update + +Creating one function which creates a single update for a given +rectangle. And one (for now) pretty simple wrapper around it to +queue up screen updates for the dirty region. + +[ v2: also update bounding box ] + +Signed-off-by: Gerd Hoffmann +--- + ui/spice-display.c | 31 ++++++++++++++++++------------- + 1 file changed, 18 insertions(+), 13 deletions(-) + +diff --git a/ui/spice-display.c b/ui/spice-display.c +index 59c5fd7..6f68f28 100644 +--- a/ui/spice-display.c ++++ b/ui/spice-display.c +@@ -164,7 +164,8 @@ int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd) + #endif + } + +-static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) ++static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd, ++ QXLRect *rect) + { + SimpleSpiceUpdate *update; + QXLDrawable *drawable; +@@ -174,24 +175,20 @@ static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) + int by, bw, bh; + struct timespec time_space; + +- if (qemu_spice_rect_is_empty(&ssd->dirty)) { +- return; +- }; +- + trace_qemu_spice_create_update( +- ssd->dirty.left, ssd->dirty.right, +- ssd->dirty.top, ssd->dirty.bottom); ++ rect->left, rect->right, ++ rect->top, rect->bottom); + + update = g_malloc0(sizeof(*update)); + drawable = &update->drawable; + image = &update->image; + cmd = &update->ext.cmd; + +- bw = ssd->dirty.right - ssd->dirty.left; +- bh = ssd->dirty.bottom - ssd->dirty.top; ++ bw = rect->right - rect->left; ++ bh = rect->bottom - rect->top; + update->bitmap = g_malloc(bw * bh * 4); + +- drawable->bbox = ssd->dirty; ++ drawable->bbox = *rect; + drawable->clip.type = SPICE_CLIP_TYPE_NONE; + drawable->effect = QXL_EFFECT_OPAQUE; + drawable->release_info.id = (uintptr_t)update; +@@ -226,8 +223,8 @@ static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) + } + + src = ds_get_data(ssd->ds) + +- ssd->dirty.top * ds_get_linesize(ssd->ds) + +- ssd->dirty.left * ds_get_bytes_per_pixel(ssd->ds); ++ rect->top * ds_get_linesize(ssd->ds) + ++ rect->left * ds_get_bytes_per_pixel(ssd->ds); + dst = update->bitmap; + for (by = 0; by < bh; by++) { + qemu_pf_conv_run(ssd->conv, dst, src, bw); +@@ -238,10 +235,18 @@ static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) + cmd->type = QXL_CMD_DRAW; + cmd->data = (uintptr_t)drawable; + +- memset(&ssd->dirty, 0, sizeof(ssd->dirty)); + QTAILQ_INSERT_TAIL(&ssd->updates, update, next); + } + ++static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) ++{ ++ if (qemu_spice_rect_is_empty(&ssd->dirty)) { ++ return; ++ }; ++ qemu_spice_create_one_update(ssd, &ssd->dirty); ++ memset(&ssd->dirty, 0, sizeof(ssd->dirty)); ++} ++ + /* + * Called from spice server thread context (via interface_release_ressource) + * We do *not* hold the global qemu mutex here, so extra care is needed +-- +1.7.12.1 + diff --git a/0506-spice-add-screen-mirror.patch b/0506-spice-add-screen-mirror.patch new file mode 100644 index 0000000..6ee91d1 --- /dev/null +++ b/0506-spice-add-screen-mirror.patch @@ -0,0 +1,98 @@ +From 9f4c601032d7a27e8856517a1a020c9988667ed3 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Wed, 5 Sep 2012 09:35:57 +0200 +Subject: [PATCH] spice: add screen mirror + +Create a screen mirror, keep there a copy of the most recent update +passed on to spice-server. + +Signed-off-by: Gerd Hoffmann +--- + ui/spice-display.c | 32 ++++++++++++++++++++++---------- + ui/spice-display.h | 1 + + 2 files changed, 23 insertions(+), 10 deletions(-) + +diff --git a/ui/spice-display.c b/ui/spice-display.c +index 6f68f28..973cd53 100644 +--- a/ui/spice-display.c ++++ b/ui/spice-display.c +@@ -171,8 +171,8 @@ static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd, + QXLDrawable *drawable; + QXLImage *image; + QXLCommand *cmd; +- uint8_t *src, *dst; +- int by, bw, bh; ++ uint8_t *src, *mirror, *dst; ++ int by, bw, bh, offset, bytes; + struct timespec time_space; + + trace_qemu_spice_create_update( +@@ -216,19 +216,18 @@ static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd, + image->bitmap.palette = 0; + image->bitmap.format = SPICE_BITMAP_FMT_32BIT; + +- if (ssd->conv == NULL) { +- PixelFormat dst = qemu_default_pixelformat(32); +- ssd->conv = qemu_pf_conv_get(&dst, &ssd->ds->surface->pf); +- assert(ssd->conv); +- } +- +- src = ds_get_data(ssd->ds) + ++ offset = + rect->top * ds_get_linesize(ssd->ds) + + rect->left * ds_get_bytes_per_pixel(ssd->ds); ++ bytes = ds_get_bytes_per_pixel(ssd->ds) * bw; ++ src = ds_get_data(ssd->ds) + offset; ++ mirror = ssd->ds_mirror + offset; + dst = update->bitmap; + for (by = 0; by < bh; by++) { +- qemu_pf_conv_run(ssd->conv, dst, src, bw); ++ memcpy(mirror, src, bytes); ++ qemu_pf_conv_run(ssd->conv, dst, mirror, bw); + src += ds_get_linesize(ssd->ds); ++ mirror += ds_get_linesize(ssd->ds); + dst += image->bitmap.stride; + } + +@@ -243,6 +242,17 @@ static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) + if (qemu_spice_rect_is_empty(&ssd->dirty)) { + return; + }; ++ ++ if (ssd->conv == NULL) { ++ PixelFormat dst = qemu_default_pixelformat(32); ++ ssd->conv = qemu_pf_conv_get(&dst, &ssd->ds->surface->pf); ++ assert(ssd->conv); ++ } ++ if (ssd->ds_mirror == NULL) { ++ int size = ds_get_height(ssd->ds) * ds_get_linesize(ssd->ds); ++ ssd->ds_mirror = g_malloc0(size); ++ } ++ + qemu_spice_create_one_update(ssd, &ssd->dirty); + memset(&ssd->dirty, 0, sizeof(ssd->dirty)); + } +@@ -358,6 +368,8 @@ void qemu_spice_display_resize(SimpleSpiceDisplay *ssd) + memset(&ssd->dirty, 0, sizeof(ssd->dirty)); + qemu_pf_conv_put(ssd->conv); + ssd->conv = NULL; ++ g_free(ssd->ds_mirror); ++ ssd->ds_mirror = NULL; + + qemu_mutex_lock(&ssd->lock); + while ((update = QTAILQ_FIRST(&ssd->updates)) != NULL) { +diff --git a/ui/spice-display.h b/ui/spice-display.h +index 3fcb6fe..dea41c1 100644 +--- a/ui/spice-display.h ++++ b/ui/spice-display.h +@@ -72,6 +72,7 @@ typedef struct SimpleSpiceUpdate SimpleSpiceUpdate; + + struct SimpleSpiceDisplay { + DisplayState *ds; ++ uint8_t *ds_mirror; + void *buf; + int bufsize; + QXLWorker *worker; +-- +1.7.12.1 + diff --git a/0507-spice-send-updates-only-for-changed-screen-content.patch b/0507-spice-send-updates-only-for-changed-screen-content.patch new file mode 100644 index 0000000..b575091 --- /dev/null +++ b/0507-spice-send-updates-only-for-changed-screen-content.patch @@ -0,0 +1,93 @@ +From e2da4b3f683ae63a55b8e50903a164f704be9e1d Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Wed, 5 Sep 2012 10:41:42 +0200 +Subject: [PATCH] spice: send updates only for changed screen content + +when creating screen updates go compare the current guest screen +against the mirror (which holds the most recent update sent), then +only create updates for the screen areas which did actually change. + +[ v2: drop redundant qemu_spice_create_one_update call ] + +Signed-off-by: Gerd Hoffmann +--- + ui/spice-display.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 55 insertions(+), 1 deletion(-) + +diff --git a/ui/spice-display.c b/ui/spice-display.c +index 973cd53..d062765 100644 +--- a/ui/spice-display.c ++++ b/ui/spice-display.c +@@ -239,6 +239,13 @@ static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd, + + static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) + { ++ static const int blksize = 32; ++ int blocks = (ds_get_width(ssd->ds) + blksize - 1) / blksize; ++ int dirty_top[blocks]; ++ int y, yoff, x, xoff, blk, bw; ++ int bpp = ds_get_bytes_per_pixel(ssd->ds); ++ uint8_t *guest, *mirror; ++ + if (qemu_spice_rect_is_empty(&ssd->dirty)) { + return; + }; +@@ -253,7 +260,54 @@ static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) + ssd->ds_mirror = g_malloc0(size); + } + +- qemu_spice_create_one_update(ssd, &ssd->dirty); ++ for (blk = 0; blk < blocks; blk++) { ++ dirty_top[blk] = -1; ++ } ++ ++ guest = ds_get_data(ssd->ds); ++ mirror = ssd->ds_mirror; ++ for (y = ssd->dirty.top; y < ssd->dirty.bottom; y++) { ++ yoff = y * ds_get_linesize(ssd->ds); ++ for (x = ssd->dirty.left; x < ssd->dirty.right; x += blksize) { ++ xoff = x * bpp; ++ blk = x / blksize; ++ bw = MIN(blksize, ssd->dirty.right - x); ++ if (memcmp(guest + yoff + xoff, ++ mirror + yoff + xoff, ++ bw * bpp) == 0) { ++ if (dirty_top[blk] != -1) { ++ QXLRect update = { ++ .top = dirty_top[blk], ++ .bottom = y, ++ .left = x, ++ .right = x + bw, ++ }; ++ qemu_spice_create_one_update(ssd, &update); ++ dirty_top[blk] = -1; ++ } ++ } else { ++ if (dirty_top[blk] == -1) { ++ dirty_top[blk] = y; ++ } ++ } ++ } ++ } ++ ++ for (x = ssd->dirty.left; x < ssd->dirty.right; x += blksize) { ++ blk = x / blksize; ++ bw = MIN(blksize, ssd->dirty.right - x); ++ if (dirty_top[blk] != -1) { ++ QXLRect update = { ++ .top = dirty_top[blk], ++ .bottom = ssd->dirty.bottom, ++ .left = x, ++ .right = x + bw, ++ }; ++ qemu_spice_create_one_update(ssd, &update); ++ dirty_top[blk] = -1; ++ } ++ } ++ + memset(&ssd->dirty, 0, sizeof(ssd->dirty)); + } + +-- +1.7.12.1 + diff --git a/0508-qxl-Ignore-set_client_capabilities-pre-post-migrate.patch b/0508-qxl-Ignore-set_client_capabilities-pre-post-migrate.patch new file mode 100644 index 0000000..78845b8 --- /dev/null +++ b/0508-qxl-Ignore-set_client_capabilities-pre-post-migrate.patch @@ -0,0 +1,41 @@ +From 984e5c7aee378a8de44ff54891695115b92fe585 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Fri, 7 Sep 2012 21:29:22 +0200 +Subject: [PATCH] qxl: Ignore set_client_capabilities pre/post migrate + +The recent introduction of set_client_capabilities has broken +(seamless) migration by trying to call qxl_send_events pre (seamless +incoming) and post (*) migration, triggering the following assert: +qxl_send_events: Assertion `qemu_spice_display_is_running(&d->ssd)' failed. + +The solution is easy, pre migration the guest will have already received +the client caps on the migration source side, and post migration there no +longer is a guest, so we can simply ignore the set_client_capabilities call +in both those scenarios. + +*) Post migration, so not fatal for to the migration itself, but still a crash + +Signed-off-by: Hans de Goede +--- + hw/qxl.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 2ec4341..360f4f6 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -955,6 +955,11 @@ static void interface_set_client_capabilities(QXLInstance *sin, + { + PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl); + ++ if (runstate_check(RUN_STATE_INMIGRATE) || ++ runstate_check(RUN_STATE_POSTMIGRATE)) { ++ return; ++ } ++ + qxl->shadow_rom.client_present = client_present; + memcpy(qxl->shadow_rom.client_capabilities, caps, sizeof(caps)); + qxl->rom->client_present = client_present; +-- +1.7.12.1 + diff --git a/0509-qxl-add-trace-event-for-QXL_IO_LOG.patch b/0509-qxl-add-trace-event-for-QXL_IO_LOG.patch new file mode 100644 index 0000000..d5093de --- /dev/null +++ b/0509-qxl-add-trace-event-for-QXL_IO_LOG.patch @@ -0,0 +1,39 @@ +From 720192d056402f47a8f71d9ac9bc4b0cf37902ed Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Wed, 12 Sep 2012 16:13:27 +0300 +Subject: [PATCH] qxl: add trace-event for QXL_IO_LOG + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 1 + + trace-events | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 360f4f6..1ef117a 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1515,6 +1515,7 @@ async_common: + qxl_set_mode(d, val, 0); + break; + case QXL_IO_LOG: ++ trace_qxl_io_log(d->id, d->ram->log_buf); + if (d->guestdebug) { + fprintf(stderr, "qxl/guest-%d: %" PRId64 ": %s", d->id, + qemu_get_clock_ns(vm_clock), d->ram->log_buf); +diff --git a/trace-events b/trace-events +index aa79836..80a52d9 100644 +--- a/trace-events ++++ b/trace-events +@@ -930,6 +930,7 @@ qxl_interface_update_area_complete_rest(int qid, uint32_t num_updated_rects) "%d + qxl_interface_update_area_complete_overflow(int qid, int max) "%d max=%d" + qxl_interface_update_area_complete_schedule_bh(int qid, uint32_t num_dirty) "%d #dirty=%d" + qxl_io_destroy_primary_ignored(int qid, const char *mode) "%d %s" ++qxl_io_log(int qid, const uint8_t *str) "%d %s" + qxl_io_read_unexpected(int qid) "%d" + qxl_io_unexpected_vga_mode(int qid, uint64_t addr, uint64_t val, const char *desc) "%d 0x%"PRIx64"=%"PRIu64" (%s)" + qxl_io_write(int qid, const char *mode, uint64_t addr, uint64_t val, unsigned size, int async) "%d %s addr=%"PRIu64 " val=%"PRIu64" size=%u async=%d" +-- +1.7.12.1 + diff --git a/0510-hw-qxl-support-client-monitor-configuration-via-devi.patch b/0510-hw-qxl-support-client-monitor-configuration-via-devi.patch new file mode 100644 index 0000000..4a00940 --- /dev/null +++ b/0510-hw-qxl-support-client-monitor-configuration-via-devi.patch @@ -0,0 +1,181 @@ +From f5c2bd00890dc32e940e8b2fae09f62f758317eb Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Wed, 12 Sep 2012 16:13:28 +0300 +Subject: [PATCH] hw/qxl: support client monitor configuration via device + +Until now we used only the agent to change the monitor count and each +monitor resolution. This patch introduces the qemu part of using the +device as the mediator instead of the agent via virtio-serial. + +Spice (>=0.11.5) calls the new QXLInterface::client_monitors_config, +which returns wether the interrupt is enabled, and if so and given a non +NULL monitors config will +generate an interrupt QXL_INTERRUPT_CLIENT_MONITORS_CONFIG with crc +checksum for the guest to verify a second call hasn't interfered. + +The maximal number of monitors is limited on the QXLRom to 64. + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +--- + configure | 7 ++++++ + hw/qxl.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + trace-events | 6 ++++- + 3 files changed, 91 insertions(+), 1 deletion(-) + +diff --git a/configure b/configure +index f528146..83c478c 100755 +--- a/configure ++++ b/configure +@@ -2706,6 +2706,9 @@ EOF + if $pkg_config --atleast-version=0.12.0 spice-protocol >/dev/null 2>&1; then + spice_qxl_io_monitors_config_async="yes" + fi ++ if $pkg_config --atleast-version=0.12.2 spice-protocol > /dev/null 2>&1; then ++ spice_qxl_client_monitors_config="yes" ++ fi + else + if test "$spice" = "yes" ; then + feature_not_found "spice" +@@ -3453,6 +3456,10 @@ if test "$spice_qxl_io_monitors_config_async" = "yes" ; then + echo "CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC=y" >> $config_host_mak + fi + ++if test "$spice_qxl_client_monitors_config" = "yes" ; then ++ echo "CONFIG_QXL_CLIENT_MONITORS_CONFIG=y" >> $config_host_mak ++fi ++ + if test "$smartcard" = "yes" ; then + echo "CONFIG_SMARTCARD=y" >> $config_host_mak + fi +diff --git a/hw/qxl.c b/hw/qxl.c +index 1ef117a..0695872 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -18,6 +18,8 @@ + * along with this program; if not, see . + */ + ++#include ++ + #include "qemu-common.h" + #include "qemu-timer.h" + #include "qemu-queue.h" +@@ -971,6 +973,79 @@ static void interface_set_client_capabilities(QXLInstance *sin, + + #endif + ++#if defined(CONFIG_QXL_CLIENT_MONITORS_CONFIG) \ ++ && SPICE_SERVER_VERSION >= 0x000b05 ++ ++static uint32_t qxl_crc32(const uint8_t *p, unsigned len) ++{ ++ /* ++ * zlib xors the seed with 0xffffffff, and xors the result ++ * again with 0xffffffff; Both are not done with linux's crc32, ++ * which we want to be compatible with, so undo that. ++ */ ++ return crc32(0xffffffff, p, len) ^ 0xffffffff; ++} ++ ++/* called from main context only */ ++static int interface_client_monitors_config(QXLInstance *sin, ++ VDAgentMonitorsConfig *monitors_config) ++{ ++ PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl); ++ QXLRom *rom = memory_region_get_ram_ptr(&qxl->rom_bar); ++ int i; ++ ++ /* ++ * Older windows drivers set int_mask to 0 when their ISR is called, ++ * then later set it to ~0. So it doesn't relate to the actual interrupts ++ * handled. However, they are old, so clearly they don't support this ++ * interrupt ++ */ ++ if (qxl->ram->int_mask == 0 || qxl->ram->int_mask == ~0 || ++ !(qxl->ram->int_mask & QXL_INTERRUPT_CLIENT_MONITORS_CONFIG)) { ++ trace_qxl_client_monitors_config_unsupported_by_guest(qxl->id, ++ qxl->ram->int_mask, ++ monitors_config); ++ return 0; ++ } ++ if (!monitors_config) { ++ return 1; ++ } ++ memset(&rom->client_monitors_config, 0, ++ sizeof(rom->client_monitors_config)); ++ rom->client_monitors_config.count = monitors_config->num_of_monitors; ++ /* monitors_config->flags ignored */ ++ if (rom->client_monitors_config.count >= ++ ARRAY_SIZE(rom->client_monitors_config.heads)) { ++ trace_qxl_client_monitors_config_capped(qxl->id, ++ monitors_config->num_of_monitors, ++ ARRAY_SIZE(rom->client_monitors_config.heads)); ++ rom->client_monitors_config.count = ++ ARRAY_SIZE(rom->client_monitors_config.heads); ++ } ++ for (i = 0 ; i < rom->client_monitors_config.count ; ++i) { ++ VDAgentMonConfig *monitor = &monitors_config->monitors[i]; ++ QXLURect *rect = &rom->client_monitors_config.heads[i]; ++ /* monitor->depth ignored */ ++ rect->left = monitor->x; ++ rect->top = monitor->y; ++ rect->right = monitor->x + monitor->width; ++ rect->bottom = monitor->y + monitor->height; ++ } ++ rom->client_monitors_config_crc = qxl_crc32( ++ (const uint8_t *)&rom->client_monitors_config, ++ sizeof(rom->client_monitors_config)); ++ trace_qxl_client_monitors_config_crc(qxl->id, ++ sizeof(rom->client_monitors_config), ++ rom->client_monitors_config_crc); ++ ++ trace_qxl_interrupt_client_monitors_config(qxl->id, ++ rom->client_monitors_config.count, ++ rom->client_monitors_config.heads); ++ qxl_send_events(qxl, QXL_INTERRUPT_CLIENT_MONITORS_CONFIG); ++ return 1; ++} ++#endif ++ + static const QXLInterface qxl_interface = { + .base.type = SPICE_INTERFACE_QXL, + .base.description = "qxl gpu", +@@ -995,6 +1070,10 @@ static const QXLInterface qxl_interface = { + #if SPICE_SERVER_VERSION >= 0x000b04 + .set_client_capabilities = interface_set_client_capabilities, + #endif ++#if SPICE_SERVER_VERSION >= 0x000b05 && \ ++ defined(CONFIG_QXL_CLIENT_MONITORS_CONFIG) ++ .client_monitors_config = interface_client_monitors_config, ++#endif + }; + + static void qxl_enter_vga_mode(PCIQXLDevice *d) +diff --git a/trace-events b/trace-events +index 80a52d9..07b63f1 100644 +--- a/trace-events ++++ b/trace-events +@@ -930,7 +930,7 @@ qxl_interface_update_area_complete_rest(int qid, uint32_t num_updated_rects) "%d + qxl_interface_update_area_complete_overflow(int qid, int max) "%d max=%d" + qxl_interface_update_area_complete_schedule_bh(int qid, uint32_t num_dirty) "%d #dirty=%d" + qxl_io_destroy_primary_ignored(int qid, const char *mode) "%d %s" +-qxl_io_log(int qid, const uint8_t *str) "%d %s" ++qxl_io_log(int qid, const uint8_t *log_buf) "%d %s" + qxl_io_read_unexpected(int qid) "%d" + qxl_io_unexpected_vga_mode(int qid, uint64_t addr, uint64_t val, const char *desc) "%d 0x%"PRIx64"=%"PRIu64" (%s)" + qxl_io_write(int qid, const char *mode, uint64_t addr, uint64_t val, unsigned size, int async) "%d %s addr=%"PRIu64 " val=%"PRIu64" size=%u async=%d" +@@ -974,6 +974,10 @@ qxl_spice_update_area_rest(int qid, uint32_t num_dirty_rects, uint32_t clear_dir + qxl_surfaces_dirty(int qid, int surface, int offset, int size) "%d surface=%d offset=%d size=%d" + qxl_send_events(int qid, uint32_t events) "%d %d" + qxl_set_guest_bug(int qid) "%d" ++qxl_interrupt_client_monitors_config(int qid, int num_heads, void *heads) "%d %d %p" ++qxl_client_monitors_config_unsupported_by_guest(int qid, uint32_t int_mask, void *client_monitors_config) "%d %X %p" ++qxl_client_monitors_config_capped(int qid, int requested, int limit) "%d %d %d" ++qxl_client_monitors_config_crc(int qid, unsigned size, uint32_t crc32) "%d %u %u" + + # hw/qxl-render.c + qxl_render_blit_guest_primary_initialized(void) "" +-- +1.7.12.1 + diff --git a/0511-qxl-always-update-displaysurface-on-resize.patch b/0511-qxl-always-update-displaysurface-on-resize.patch new file mode 100644 index 0000000..4b556c7 --- /dev/null +++ b/0511-qxl-always-update-displaysurface-on-resize.patch @@ -0,0 +1,44 @@ +From d0b5c82d532ef14bbbc770b06a6ae68f6ec3c1a8 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 14 Sep 2012 22:09:23 +0200 +Subject: [PATCH] qxl: always update displaysurface on resize + +Don't try to be clever and skip displaysurface reinitialization in case +the size hasn't changed. Other parameters might have changed +nevertheless, for example depth or stride, resulting in rendering being +broken then. + +Trigger: boot linux guest with vesafb, start X11, make sure both vesafb +and X11 use the display same resolution. Then watch X11 screen being +upside down. + +Signed-off-by: Gerd Hoffmann +--- + hw/qxl-render.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/hw/qxl-render.c b/hw/qxl-render.c +index e2e3fe2..b66c168 100644 +--- a/hw/qxl-render.c ++++ b/hw/qxl-render.c +@@ -99,7 +99,6 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl) + { + VGACommonState *vga = &qxl->vga; + int i; +- DisplaySurface *surface = vga->ds->surface; + + if (qxl->guest_primary.resized) { + qxl->guest_primary.resized = 0; +@@ -112,9 +111,6 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl) + qxl->guest_primary.qxl_stride, + qxl->guest_primary.bytes_pp, + qxl->guest_primary.bits_pp); +- } +- if (surface->width != qxl->guest_primary.surface.width || +- surface->height != qxl->guest_primary.surface.height) { + if (qxl->guest_primary.qxl_stride > 0) { + qemu_free_displaysurface(vga->ds); + qemu_create_displaysurface_from(qxl->guest_primary.surface.width, +-- +1.7.12.1 + diff --git a/0512-qxl-update_area_io-cleanup-invalid-parameters-handli.patch b/0512-qxl-update_area_io-cleanup-invalid-parameters-handli.patch new file mode 100644 index 0000000..e742f65 --- /dev/null +++ b/0512-qxl-update_area_io-cleanup-invalid-parameters-handli.patch @@ -0,0 +1,48 @@ +From 2bbe4bb8c12976312c9421489f7568a70e5ffae3 Mon Sep 17 00:00:00 2001 +From: Michael Tokarev +Date: Wed, 19 Sep 2012 17:41:26 +0400 +Subject: [PATCH] qxl/update_area_io: cleanup invalid parameters handling + +This cleans up two additions of almost the same code in commits +511b13e2c9 and ccc2960d654. While at it, make error paths +consistent (always use 'break' instead of 'return'). + +Signed-off-by: Michael Tokarev +Cc: Dunrong Huang +Cc: Alon Levy +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 13 +++---------- + 1 file changed, 3 insertions(+), 10 deletions(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 0695872..720363f 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1547,20 +1547,13 @@ async_common: + if (d->ram->update_surface > d->ssd.num_surfaces) { + qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: invalid surface id %d\n", + d->ram->update_surface); +- return; ++ break; + } +- if (update.left >= update.right || update.top >= update.bottom) { ++ if (update.left >= update.right || update.top >= update.bottom || ++ update.left < 0 || update.top < 0) { + qxl_set_guest_bug(d, + "QXL_IO_UPDATE_AREA: invalid area (%ux%u)x(%ux%u)\n", + update.left, update.top, update.right, update.bottom); +- return; +- } +- +- if (update.left < 0 || update.top < 0 || update.left >= update.right || +- update.top >= update.bottom) { +- qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: " +- "invalid area(%d,%d,%d,%d)\n", update.left, +- update.right, update.top, update.bottom); + break; + } + if (async == QXL_ASYNC) { +-- +1.7.12.1 + diff --git a/0513-qxl-fix-range-check-for-rev3-io-commands.patch b/0513-qxl-fix-range-check-for-rev3-io-commands.patch new file mode 100644 index 0000000..65f8763 --- /dev/null +++ b/0513-qxl-fix-range-check-for-rev3-io-commands.patch @@ -0,0 +1,29 @@ +From 0e0d8cfb93813c0d693b14e3d433d36ee9bc6bab Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 25 Sep 2012 13:56:40 +0200 +Subject: [PATCH] qxl: fix range check for rev3 io commands. + +Enables QXL_IO_FLUSH_SURFACES_ASYNC and QXL_IO_FLUSH_RELEASE +which are part of the qxl rev3 feature set. + +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 720363f..9389752 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1466,7 +1466,7 @@ static void ioport_write(void *opaque, target_phys_addr_t addr, + } + + if (d->revision <= QXL_REVISION_STABLE_V10 && +- io_port >= QXL_IO_FLUSH_SURFACES_ASYNC) { ++ io_port > QXL_IO_FLUSH_RELEASE) { + qxl_set_guest_bug(d, "unsupported io %d for revision %d\n", + io_port, d->revision); + return; +-- +1.7.12.1 + diff --git a/0514-hw-qxl-exit-on-failure-to-register-qxl-interface.patch b/0514-hw-qxl-exit-on-failure-to-register-qxl-interface.patch new file mode 100644 index 0000000..a89db68 --- /dev/null +++ b/0514-hw-qxl-exit-on-failure-to-register-qxl-interface.patch @@ -0,0 +1,35 @@ +From a0f199b76debf55933c2b3b917c13c86784e3be0 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Wed, 3 Oct 2012 20:13:58 +0200 +Subject: [PATCH 514/647] hw/qxl: exit on failure to register qxl interface + +This prevents a segfault later on when the device reset handler +tries to access a NULL ssd.worker since interface_attach_worker has +not been called. + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 9389752..a2dd020 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -2035,7 +2035,11 @@ static int qxl_init_common(PCIQXLDevice *qxl) + + qxl->ssd.qxl.base.sif = &qxl_interface.base; + qxl->ssd.qxl.id = qxl->id; +- qemu_spice_add_interface(&qxl->ssd.qxl.base); ++ if (qemu_spice_add_interface(&qxl->ssd.qxl.base) != 0) { ++ error_report("qxl interface %d.%d not supported by spice-server\n", ++ SPICE_INTERFACE_QXL_MAJOR, SPICE_INTERFACE_QXL_MINOR); ++ return -1; ++ } + qemu_add_vm_change_state_handler(qxl_vm_change_state_handler, qxl); + + init_pipe_signaling(qxl); +-- +1.7.12.1 + diff --git a/0515-hw-qxl-fix-condition-for-exiting-guest_bug.patch b/0515-hw-qxl-fix-condition-for-exiting-guest_bug.patch new file mode 100644 index 0000000..945b5df --- /dev/null +++ b/0515-hw-qxl-fix-condition-for-exiting-guest_bug.patch @@ -0,0 +1,29 @@ +From 73a691f6799e05afda0be01c1cd5e2f6914e8773 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Tue, 2 Oct 2012 11:39:14 +0200 +Subject: [PATCH 515/647] hw/qxl: fix condition for exiting guest_bug + +Reported and suggested by Paolo Bonzini, thanks. + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index a2dd020..e3a164a 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1461,7 +1461,7 @@ static void ioport_write(void *opaque, target_phys_addr_t addr, + qxl_async_io async = QXL_SYNC; + uint32_t orig_io_port = io_port; + +- if (d->guest_bug && !io_port == QXL_IO_RESET) { ++ if (d->guest_bug && io_port != QXL_IO_RESET) { + return; + } + +-- +1.7.12.1 + diff --git a/0516-hw-qxl-qxl_dirty_surfaces-use-uintptr_t.patch b/0516-hw-qxl-qxl_dirty_surfaces-use-uintptr_t.patch new file mode 100644 index 0000000..e285559 --- /dev/null +++ b/0516-hw-qxl-qxl_dirty_surfaces-use-uintptr_t.patch @@ -0,0 +1,38 @@ +From d59685f5667e25d0805bde93c068052afb30efda Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Sun, 7 Oct 2012 17:03:35 +0200 +Subject: [PATCH 516/647] hw/qxl: qxl_dirty_surfaces: use uintptr_t + +As suggested by Paolo Bonzini, to avoid possible integer overflow issues. + +Signed-off-by: Alon Levy +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index e3a164a..5a9bf1c 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1803,7 +1803,7 @@ static void qxl_hw_text_update(void *opaque, console_ch_t *chardata) + + static void qxl_dirty_surfaces(PCIQXLDevice *qxl) + { +- intptr_t vram_start; ++ uintptr_t vram_start; + int i; + + if (qxl->mode != QXL_MODE_NATIVE && qxl->mode != QXL_MODE_COMPAT) { +@@ -1814,7 +1814,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl) + qxl_set_dirty(&qxl->vga.vram, qxl->shadow_rom.draw_area_offset, + qxl->shadow_rom.surface0_area_size); + +- vram_start = (intptr_t)memory_region_get_ram_ptr(&qxl->vram_bar); ++ vram_start = (uintptr_t)memory_region_get_ram_ptr(&qxl->vram_bar); + + /* dirty the off-screen surfaces */ + for (i = 0; i < qxl->ssd.num_surfaces; i++) { +-- +1.7.12.1 + diff --git a/0517-spice-raise-requirement-to-0.12.patch b/0517-spice-raise-requirement-to-0.12.patch new file mode 100644 index 0000000..4ffb529 --- /dev/null +++ b/0517-spice-raise-requirement-to-0.12.patch @@ -0,0 +1,465 @@ +From be955ad2a04cb7be9b5f34cd0e43d29f34113c6e Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Mon, 24 Sep 2012 10:23:40 +0200 +Subject: [PATCH 517/647] spice: raise requirement to 0.12 + +With the next qemu version (1.3) we are going to bump the qxl device +revision to 4. The new features available require a recent spice-server +version, so raise up the bar. Otherwise we would end up with different +qxl revisions depending on the spice-server version installed, which +would be a major PITA when it comes to compat properties. + +Clear out a big bunch of #ifdefs which are not needed any more. + +Signed-off-by: Gerd Hoffmann +--- + configure | 18 ++---------------- + hw/qxl.c | 30 ------------------------------ + ui/spice-core.c | 51 ++------------------------------------------------- + ui/spice-display.c | 38 -------------------------------------- + ui/spice-display.h | 5 ----- + 5 files changed, 4 insertions(+), 138 deletions(-) + +diff --git a/configure b/configure +index ebe8b1c..b843d20 100755 +--- a/configure ++++ b/configure +@@ -2705,20 +2705,14 @@ int main(void) { spice_server_new(); return 0; } + EOF + spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null) + spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null) +- if $pkg_config --atleast-version=0.8.2 spice-server >/dev/null 2>&1 && \ +- $pkg_config --atleast-version=0.8.1 spice-protocol > /dev/null 2>&1 && \ ++ if $pkg_config --atleast-version=0.12.0 spice-server >/dev/null 2>&1 && \ ++ $pkg_config --atleast-version=0.12.2 spice-protocol > /dev/null 2>&1 && \ + compile_prog "$spice_cflags" "$spice_libs" ; then + spice="yes" + libs_softmmu="$libs_softmmu $spice_libs" + QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags" + spice_protocol_version=$($pkg_config --modversion spice-protocol) + spice_server_version=$($pkg_config --modversion spice-server) +- if $pkg_config --atleast-version=0.12.0 spice-protocol >/dev/null 2>&1; then +- spice_qxl_io_monitors_config_async="yes" +- fi +- if $pkg_config --atleast-version=0.12.2 spice-protocol > /dev/null 2>&1; then +- spice_qxl_client_monitors_config="yes" +- fi + else + if test "$spice" = "yes" ; then + feature_not_found "spice" +@@ -3456,14 +3450,6 @@ if test "$spice" = "yes" ; then + echo "CONFIG_SPICE=y" >> $config_host_mak + fi + +-if test "$spice_qxl_io_monitors_config_async" = "yes" ; then +- echo "CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC=y" >> $config_host_mak +-fi +- +-if test "$spice_qxl_client_monitors_config" = "yes" ; then +- echo "CONFIG_QXL_CLIENT_MONITORS_CONFIG=y" >> $config_host_mak +-fi +- + if test "$smartcard" = "yes" ; then + echo "CONFIG_SMARTCARD=y" >> $config_host_mak + fi +diff --git a/hw/qxl.c b/hw/qxl.c +index 5a9bf1c..255fdf4 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -29,11 +29,6 @@ + + #include "qxl.h" + +-#ifndef CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC +-/* spice-protocol is too old, add missing definitions */ +-#define QXL_IO_MONITORS_CONFIG_ASYNC (QXL_IO_FLUSH_RELEASE + 1) +-#endif +- + /* + * NOTE: SPICE_RING_PROD_ITEM accesses memory on the pci bar and as + * such can be changed by the guest, so to avoid a guest trigerrable +@@ -262,9 +257,6 @@ static void qxl_spice_destroy_surfaces(PCIQXLDevice *qxl, qxl_async_io async) + static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay) + { + trace_qxl_spice_monitors_config(qxl->id); +-/* 0x000b01 == 0.11.1 */ +-#if SPICE_SERVER_VERSION >= 0x000b01 && \ +- defined(CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC) + if (replay) { + /* + * don't use QXL_COOKIE_TYPE_IO: +@@ -286,10 +278,6 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay) + (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO, + QXL_IO_MONITORS_CONFIG_ASYNC)); + } +-#else +- fprintf(stderr, "qxl: too old spice-protocol/spice-server for " +- "QXL_IO_MONITORS_CONFIG_ASYNC\n"); +-#endif + } + + void qxl_spice_reset_image_cache(PCIQXLDevice *qxl) +@@ -948,8 +936,6 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token) + } + } + +-#if SPICE_SERVER_VERSION >= 0x000b04 +- + /* called from spice server thread context only */ + static void interface_set_client_capabilities(QXLInstance *sin, + uint8_t client_present, +@@ -971,11 +957,6 @@ static void interface_set_client_capabilities(QXLInstance *sin, + qxl_send_events(qxl, QXL_INTERRUPT_CLIENT); + } + +-#endif +- +-#if defined(CONFIG_QXL_CLIENT_MONITORS_CONFIG) \ +- && SPICE_SERVER_VERSION >= 0x000b05 +- + static uint32_t qxl_crc32(const uint8_t *p, unsigned len) + { + /* +@@ -1044,7 +1025,6 @@ static int interface_client_monitors_config(QXLInstance *sin, + qxl_send_events(qxl, QXL_INTERRUPT_CLIENT_MONITORS_CONFIG); + return 1; + } +-#endif + + static const QXLInterface qxl_interface = { + .base.type = SPICE_INTERFACE_QXL, +@@ -1067,13 +1047,8 @@ static const QXLInterface qxl_interface = { + .flush_resources = interface_flush_resources, + .async_complete = interface_async_complete, + .update_area_complete = interface_update_area_complete, +-#if SPICE_SERVER_VERSION >= 0x000b04 + .set_client_capabilities = interface_set_client_capabilities, +-#endif +-#if SPICE_SERVER_VERSION >= 0x000b05 && \ +- defined(CONFIG_QXL_CLIENT_MONITORS_CONFIG) + .client_monitors_config = interface_client_monitors_config, +-#endif + }; + + static void qxl_enter_vga_mode(PCIQXLDevice *d) +@@ -1846,7 +1821,6 @@ static void qxl_vm_change_state_handler(void *opaque, int running, + RunState state) + { + PCIQXLDevice *qxl = opaque; +- qemu_spice_vm_change_state_handler(&qxl->ssd, running, state); + + if (running) { + /* +@@ -1963,14 +1937,10 @@ static int qxl_init_common(PCIQXLDevice *qxl) + pci_device_rev = QXL_REVISION_STABLE_V10; + io_size = 32; /* PCI region size must be pow2 */ + break; +-/* 0x000b01 == 0.11.1 */ +-#if SPICE_SERVER_VERSION >= 0x000b01 && \ +- defined(CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC) + case 4: /* qxl-4 */ + pci_device_rev = QXL_REVISION_STABLE_V12; + io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1); + break; +-#endif + default: + error_report("Invalid revision %d for qxl device (max %d)", + qxl->revision, QXL_DEFAULT_REVISION); +diff --git a/ui/spice-core.c b/ui/spice-core.c +index ba0d0bd..5147365 100644 +--- a/ui/spice-core.c ++++ b/ui/spice-core.c +@@ -223,7 +223,6 @@ static void channel_event(int event, SpiceChannelEventInfo *info) + client = qdict_new(); + server = qdict_new(); + +-#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT + if (info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) { + add_addr_info(client, (struct sockaddr *)&info->paddr_ext, + info->plen_ext); +@@ -232,12 +231,7 @@ static void channel_event(int event, SpiceChannelEventInfo *info) + } else { + error_report("spice: %s, extended address is expected", + __func__); +-#endif +- add_addr_info(client, &info->paddr, info->plen); +- add_addr_info(server, &info->laddr, info->llen); +-#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT + } +-#endif + + if (event == SPICE_CHANNEL_EVENT_INITIALIZED) { + qdict_put(server, "auth", qstring_from_str(auth)); +@@ -276,7 +270,6 @@ static SpiceCoreInterface core_interface = { + .channel_event = channel_event, + }; + +-#ifdef SPICE_INTERFACE_MIGRATION + typedef struct SpiceMigration { + SpiceMigrateInstance sin; + struct { +@@ -313,7 +306,6 @@ static void migrate_end_complete_cb(SpiceMigrateInstance *sin) + monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL); + spice_migration_completed = true; + } +-#endif + + /* config string parsing */ + +@@ -393,17 +385,13 @@ static SpiceChannelList *qmp_query_spice_channels(void) + chan = g_malloc0(sizeof(*chan)); + chan->value = g_malloc0(sizeof(*chan->value)); + +-#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT + if (item->info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) { + paddr = (struct sockaddr *)&item->info->paddr_ext; + plen = item->info->plen_ext; + } else { +-#endif + paddr = &item->info->paddr; + plen = item->info->plen; +-#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT + } +-#endif + + getnameinfo(paddr, plen, + host, sizeof(host), port, sizeof(port), +@@ -473,13 +461,10 @@ SpiceInfo *qmp_query_spice(Error **errp) + info->tls_port = tls_port; + } + +-#if SPICE_SERVER_VERSION >= 0x000a03 /* 0.10.3 */ + info->mouse_mode = spice_server_is_server_mouse(spice_server) ? + SPICE_QUERY_MOUSE_MODE_SERVER : + SPICE_QUERY_MOUSE_MODE_CLIENT; +-#else +- info->mouse_mode = SPICE_QUERY_MOUSE_MODE_UNKNOWN; +-#endif ++ + /* for compatibility with the original command */ + info->has_channels = true; + info->channels = qmp_query_spice_channels(); +@@ -492,19 +477,11 @@ static void migration_state_notifier(Notifier *notifier, void *data) + MigrationState *s = data; + + if (migration_is_active(s)) { +-#ifdef SPICE_INTERFACE_MIGRATION + spice_server_migrate_start(spice_server); +-#endif + } else if (migration_has_finished(s)) { +-#ifndef SPICE_INTERFACE_MIGRATION +- spice_server_migrate_switch(spice_server); +- monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL); +- spice_migration_completed = true; +-#else + spice_server_migrate_end(spice_server, true); + } else if (migration_has_failed(s)) { + spice_server_migrate_end(spice_server, false); +-#endif + } + } + +@@ -513,16 +490,11 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port, + MonitorCompletion *cb, void *opaque) + { + int ret; +-#ifdef SPICE_INTERFACE_MIGRATION ++ + spice_migrate.connect_complete.cb = cb; + spice_migrate.connect_complete.opaque = opaque; + ret = spice_server_migrate_connect(spice_server, hostname, + port, tls_port, subject); +-#else +- ret = spice_server_migrate_info(spice_server, hostname, +- port, tls_port, subject); +- cb(opaque, NULL); +-#endif + return ret; + } + +@@ -561,7 +533,6 @@ static int add_channel(const char *name, const char *value, void *opaque) + static void vm_change_state_handler(void *opaque, int running, + RunState state) + { +-#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */ + if (running) { + qemu_spice_display_start(); + spice_server_vm_start(spice_server); +@@ -569,7 +540,6 @@ static void vm_change_state_handler(void *opaque, int running, + spice_server_vm_stop(spice_server); + qemu_spice_display_stop(); + } +-#endif + } + + void qemu_spice_init(void) +@@ -585,9 +555,7 @@ void qemu_spice_init(void) + int port, tls_port, len, addr_flags; + spice_image_compression_t compression; + spice_wan_compression_t wan_compr; +-#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */ + bool seamless_migration; +-#endif + + qemu_thread_get_self(&me); + +@@ -672,16 +640,11 @@ void qemu_spice_init(void) + spice_server_set_ticket(spice_server, password, 0, 0, 0); + } + if (qemu_opt_get_bool(opts, "sasl", 0)) { +-#if SPICE_SERVER_VERSION >= 0x000900 /* 0.9.0 */ + if (spice_server_set_sasl_appname(spice_server, "qemu") == -1 || + spice_server_set_sasl(spice_server, 1) == -1) { + error_report("spice: failed to enable sasl"); + exit(1); + } +-#else +- error_report("spice: sasl is not available (spice >= 0.9 required)"); +- exit(1); +-#endif + } + if (qemu_opt_get_bool(opts, "disable-ticketing", 0)) { + auth = "none"; +@@ -726,15 +689,11 @@ void qemu_spice_init(void) + + qemu_opt_foreach(opts, add_channel, &tls_port, 0); + +-#if SPICE_SERVER_VERSION >= 0x000a02 /* 0.10.2 */ + spice_server_set_name(spice_server, qemu_name); + spice_server_set_uuid(spice_server, qemu_uuid); +-#endif + +-#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */ + seamless_migration = qemu_opt_get_bool(opts, "seamless-migration", 0); + spice_server_set_seamless_migration(spice_server, seamless_migration); +-#endif + if (0 != spice_server_init(spice_server, &core_interface)) { + error_report("failed to initialize spice server"); + exit(1); +@@ -743,11 +702,9 @@ void qemu_spice_init(void) + + migration_state.notify = migration_state_notifier; + add_migration_state_change_notifier(&migration_state); +-#ifdef SPICE_INTERFACE_MIGRATION + spice_migrate.sin.base.sif = &migrate_interface.base; + spice_migrate.connect_complete.cb = NULL; + qemu_spice_add_interface(&spice_migrate.sin.base); +-#endif + + qemu_spice_input_init(); + qemu_spice_audio_init(); +@@ -815,15 +772,11 @@ int qemu_spice_set_pw_expire(time_t expires) + + int qemu_spice_display_add_client(int csock, int skipauth, int tls) + { +-#if SPICE_SERVER_VERSION >= 0x000a01 + if (tls) { + return spice_server_add_ssl_client(spice_server, csock, skipauth); + } else { + return spice_server_add_client(spice_server, csock, skipauth); + } +-#else +- return -1; +-#endif + } + + static void spice_register_config(void) +diff --git a/ui/spice-display.c b/ui/spice-display.c +index d062765..422e7c4 100644 +--- a/ui/spice-display.c ++++ b/ui/spice-display.c +@@ -126,21 +126,6 @@ void qemu_spice_wakeup(SimpleSpiceDisplay *ssd) + ssd->worker->wakeup(ssd->worker); + } + +-#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */ +-static void qemu_spice_start(SimpleSpiceDisplay *ssd) +-{ +- trace_qemu_spice_start(ssd->qxl.id); +- ssd->worker->start(ssd->worker); +-} +- +-static void qemu_spice_stop(SimpleSpiceDisplay *ssd) +-{ +- trace_qemu_spice_stop(ssd->qxl.id); +- ssd->worker->stop(ssd->worker); +-} +- +-#else +- + static int spice_display_is_running; + + void qemu_spice_display_start(void) +@@ -153,15 +138,9 @@ void qemu_spice_display_stop(void) + spice_display_is_running = false; + } + +-#endif +- + int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd) + { +-#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */ +- return ssd->running; +-#else + return spice_display_is_running; +-#endif + } + + static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd, +@@ -364,22 +343,6 @@ void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd) + qemu_spice_destroy_primary_surface(ssd, 0, QXL_SYNC); + } + +-void qemu_spice_vm_change_state_handler(void *opaque, int running, +- RunState state) +-{ +-#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */ +- SimpleSpiceDisplay *ssd = opaque; +- +- if (running) { +- ssd->running = true; +- qemu_spice_start(ssd); +- } else { +- qemu_spice_stop(ssd); +- ssd->running = false; +- } +-#endif +-} +- + void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds) + { + ssd->ds = ds; +@@ -623,7 +586,6 @@ void qemu_spice_display_init(DisplayState *ds) + qemu_spice_add_interface(&sdpy.qxl.base); + assert(sdpy.worker); + +- qemu_add_vm_change_state_handler(qemu_spice_vm_change_state_handler, &sdpy); + qemu_spice_create_host_memslot(&sdpy); + qemu_spice_create_host_primary(&sdpy); + } +diff --git a/ui/spice-display.h b/ui/spice-display.h +index dea41c1..d766927 100644 +--- a/ui/spice-display.h ++++ b/ui/spice-display.h +@@ -83,9 +83,6 @@ struct SimpleSpiceDisplay { + + QXLRect dirty; + int notify; +-#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */ +- int running; +-#endif + + /* + * All struct members below this comment can be accessed from +@@ -133,8 +130,6 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id, + void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd, + uint32_t id, qxl_async_io async); + void qemu_spice_wakeup(SimpleSpiceDisplay *ssd); +-#if SPICE_SERVER_VERSION >= 0x000b02 /* before 0.11.2 */ + void qemu_spice_display_start(void); + void qemu_spice_display_stop(void); +-#endif + int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd); +-- +1.7.12.1 + diff --git a/0518-qxl-set-default-revision-to-4.patch b/0518-qxl-set-default-revision-to-4.patch new file mode 100644 index 0000000..c2eab7b --- /dev/null +++ b/0518-qxl-set-default-revision-to-4.patch @@ -0,0 +1,33 @@ +From 7b1c2ac1342371bf43035b2ee1b02d9f554da49d Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 1 Nov 2012 11:06:54 +0100 +Subject: [PATCH 518/647] qxl: set default revision to 4 + +Set qxl pci revision to 4 so guests know spice-server 0.12 features +are available. + +Signed-off-by: Gerd Hoffmann +--- + hw/qxl.h | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/hw/qxl.h b/hw/qxl.h +index 5553824..e583cfb 100644 +--- a/hw/qxl.h ++++ b/hw/qxl.h +@@ -129,12 +129,7 @@ typedef struct PCIQXLDevice { + } \ + } while (0) + +-#if 0 +-/* spice-server 0.12 is still in development */ + #define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V12 +-#else +-#define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V10 +-#endif + + /* qxl.c */ + void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id); +-- +1.7.12.1 + diff --git a/0600-usb-redir-Convert-to-new-libusbredirparser-0.5-API.patch b/0600-usb-redir-Convert-to-new-libusbredirparser-0.5-API.patch new file mode 100644 index 0000000..3651fda --- /dev/null +++ b/0600-usb-redir-Convert-to-new-libusbredirparser-0.5-API.patch @@ -0,0 +1,232 @@ +From a6400ff20f4e32eecce44931e33939cdf04e2a3e Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Fri, 31 Aug 2012 13:41:38 +0200 +Subject: [PATCH] usb-redir: Convert to new libusbredirparser 0.5 API + +This gives us support for 64 bit ids which is needed for using XHCI with +the new hcd generated ids. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +--- + configure | 2 +- + hw/usb/redirect.c | 62 +++++++++++++++++++++++++++---------------------------- + 2 files changed, 32 insertions(+), 32 deletions(-) + +diff --git a/configure b/configure +index 83c478c..2c4469f 100755 +--- a/configure ++++ b/configure +@@ -2758,7 +2758,7 @@ fi + + # check for usbredirparser for usb network redirection support + if test "$usb_redir" != "no" ; then +- if $pkg_config --atleast-version=0.3.4 libusbredirparser >/dev/null 2>&1 ; then ++ if $pkg_config --atleast-version=0.5 libusbredirparser >/dev/null 2>&1 ; then + usb_redir="yes" + usb_redir_cflags=$($pkg_config --cflags libusbredirparser 2>/dev/null) + usb_redir_libs=$($pkg_config --libs libusbredirparser 2>/dev/null) +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index b7c7f1e..321f5be 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -107,27 +107,27 @@ static void usbredir_interface_info(void *priv, + struct usb_redir_interface_info_header *interface_info); + static void usbredir_ep_info(void *priv, + struct usb_redir_ep_info_header *ep_info); +-static void usbredir_configuration_status(void *priv, uint32_t id, ++static void usbredir_configuration_status(void *priv, uint64_t id, + struct usb_redir_configuration_status_header *configuration_status); +-static void usbredir_alt_setting_status(void *priv, uint32_t id, ++static void usbredir_alt_setting_status(void *priv, uint64_t id, + struct usb_redir_alt_setting_status_header *alt_setting_status); +-static void usbredir_iso_stream_status(void *priv, uint32_t id, ++static void usbredir_iso_stream_status(void *priv, uint64_t id, + struct usb_redir_iso_stream_status_header *iso_stream_status); +-static void usbredir_interrupt_receiving_status(void *priv, uint32_t id, ++static void usbredir_interrupt_receiving_status(void *priv, uint64_t id, + struct usb_redir_interrupt_receiving_status_header + *interrupt_receiving_status); +-static void usbredir_bulk_streams_status(void *priv, uint32_t id, ++static void usbredir_bulk_streams_status(void *priv, uint64_t id, + struct usb_redir_bulk_streams_status_header *bulk_streams_status); +-static void usbredir_control_packet(void *priv, uint32_t id, ++static void usbredir_control_packet(void *priv, uint64_t id, + struct usb_redir_control_packet_header *control_packet, + uint8_t *data, int data_len); +-static void usbredir_bulk_packet(void *priv, uint32_t id, ++static void usbredir_bulk_packet(void *priv, uint64_t id, + struct usb_redir_bulk_packet_header *bulk_packet, + uint8_t *data, int data_len); +-static void usbredir_iso_packet(void *priv, uint32_t id, ++static void usbredir_iso_packet(void *priv, uint64_t id, + struct usb_redir_iso_packet_header *iso_packet, + uint8_t *data, int data_len); +-static void usbredir_interrupt_packet(void *priv, uint32_t id, ++static void usbredir_interrupt_packet(void *priv, uint64_t id, + struct usb_redir_interrupt_packet_header *interrupt_header, + uint8_t *data, int data_len); + +@@ -814,6 +814,7 @@ static void usbredir_chardev_open(USBRedirDevice *dev) + + usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version); + usbredirparser_caps_set_cap(caps, usb_redir_cap_filter); ++ usbredirparser_caps_set_cap(caps, usb_redir_cap_64bits_ids); + usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE, 0); + usbredirparser_do_write(dev->parser); + } +@@ -1204,15 +1205,15 @@ static void usbredir_ep_info(void *priv, + } + } + +-static void usbredir_configuration_status(void *priv, uint32_t id, ++static void usbredir_configuration_status(void *priv, uint64_t id, + struct usb_redir_configuration_status_header *config_status) + { + USBRedirDevice *dev = priv; + USBPacket *p; + int len = 0; + +- DPRINTF("set config status %d config %d id %u\n", config_status->status, +- config_status->configuration, id); ++ DPRINTF("set config status %d config %d id %"PRIu64"\n", ++ config_status->status, config_status->configuration, id); + + p = usbredir_find_packet_by_id(dev, 0, id); + if (p) { +@@ -1225,16 +1226,15 @@ static void usbredir_configuration_status(void *priv, uint32_t id, + } + } + +-static void usbredir_alt_setting_status(void *priv, uint32_t id, ++static void usbredir_alt_setting_status(void *priv, uint64_t id, + struct usb_redir_alt_setting_status_header *alt_setting_status) + { + USBRedirDevice *dev = priv; + USBPacket *p; + int len = 0; + +- DPRINTF("alt status %d intf %d alt %d id: %u\n", +- alt_setting_status->status, +- alt_setting_status->interface, ++ DPRINTF("alt status %d intf %d alt %d id: %"PRIu64"\n", ++ alt_setting_status->status, alt_setting_status->interface, + alt_setting_status->alt, id); + + p = usbredir_find_packet_by_id(dev, 0, id); +@@ -1249,13 +1249,13 @@ static void usbredir_alt_setting_status(void *priv, uint32_t id, + } + } + +-static void usbredir_iso_stream_status(void *priv, uint32_t id, ++static void usbredir_iso_stream_status(void *priv, uint64_t id, + struct usb_redir_iso_stream_status_header *iso_stream_status) + { + USBRedirDevice *dev = priv; + uint8_t ep = iso_stream_status->endpoint; + +- DPRINTF("iso status %d ep %02X id %u\n", iso_stream_status->status, ++ DPRINTF("iso status %d ep %02X id %"PRIu64"\n", iso_stream_status->status, + ep, id); + + if (!dev->dev.attached || !dev->endpoint[EP2I(ep)].iso_started) { +@@ -1269,14 +1269,14 @@ static void usbredir_iso_stream_status(void *priv, uint32_t id, + } + } + +-static void usbredir_interrupt_receiving_status(void *priv, uint32_t id, ++static void usbredir_interrupt_receiving_status(void *priv, uint64_t id, + struct usb_redir_interrupt_receiving_status_header + *interrupt_receiving_status) + { + USBRedirDevice *dev = priv; + uint8_t ep = interrupt_receiving_status->endpoint; + +- DPRINTF("interrupt recv status %d ep %02X id %u\n", ++ DPRINTF("interrupt recv status %d ep %02X id %"PRIu64"\n", + interrupt_receiving_status->status, ep, id); + + if (!dev->dev.attached || !dev->endpoint[EP2I(ep)].interrupt_started) { +@@ -1291,12 +1291,12 @@ static void usbredir_interrupt_receiving_status(void *priv, uint32_t id, + } + } + +-static void usbredir_bulk_streams_status(void *priv, uint32_t id, ++static void usbredir_bulk_streams_status(void *priv, uint64_t id, + struct usb_redir_bulk_streams_status_header *bulk_streams_status) + { + } + +-static void usbredir_control_packet(void *priv, uint32_t id, ++static void usbredir_control_packet(void *priv, uint64_t id, + struct usb_redir_control_packet_header *control_packet, + uint8_t *data, int data_len) + { +@@ -1304,7 +1304,7 @@ static void usbredir_control_packet(void *priv, uint32_t id, + USBPacket *p; + int len = control_packet->length; + +- DPRINTF("ctrl-in status %d len %d id %u\n", control_packet->status, ++ DPRINTF("ctrl-in status %d len %d id %"PRIu64"\n", control_packet->status, + len, id); + + p = usbredir_find_packet_by_id(dev, 0, id); +@@ -1326,7 +1326,7 @@ static void usbredir_control_packet(void *priv, uint32_t id, + free(data); + } + +-static void usbredir_bulk_packet(void *priv, uint32_t id, ++static void usbredir_bulk_packet(void *priv, uint64_t id, + struct usb_redir_bulk_packet_header *bulk_packet, + uint8_t *data, int data_len) + { +@@ -1335,8 +1335,8 @@ static void usbredir_bulk_packet(void *priv, uint32_t id, + int len = bulk_packet->length; + USBPacket *p; + +- DPRINTF("bulk-in status %d ep %02X len %d id %u\n", bulk_packet->status, +- ep, len, id); ++ DPRINTF("bulk-in status %d ep %02X len %d id %"PRIu64"\n", ++ bulk_packet->status, ep, len, id); + + p = usbredir_find_packet_by_id(dev, ep, id); + if (p) { +@@ -1357,15 +1357,15 @@ static void usbredir_bulk_packet(void *priv, uint32_t id, + free(data); + } + +-static void usbredir_iso_packet(void *priv, uint32_t id, ++static void usbredir_iso_packet(void *priv, uint64_t id, + struct usb_redir_iso_packet_header *iso_packet, + uint8_t *data, int data_len) + { + USBRedirDevice *dev = priv; + uint8_t ep = iso_packet->endpoint; + +- DPRINTF2("iso-in status %d ep %02X len %d id %u\n", iso_packet->status, ep, +- data_len, id); ++ DPRINTF2("iso-in status %d ep %02X len %d id %"PRIu64"\n", ++ iso_packet->status, ep, data_len, id); + + if (dev->endpoint[EP2I(ep)].type != USB_ENDPOINT_XFER_ISOC) { + ERROR("received iso packet for non iso endpoint %02X\n", ep); +@@ -1383,14 +1383,14 @@ static void usbredir_iso_packet(void *priv, uint32_t id, + bufp_alloc(dev, data, data_len, iso_packet->status, ep); + } + +-static void usbredir_interrupt_packet(void *priv, uint32_t id, ++static void usbredir_interrupt_packet(void *priv, uint64_t id, + struct usb_redir_interrupt_packet_header *interrupt_packet, + uint8_t *data, int data_len) + { + USBRedirDevice *dev = priv; + uint8_t ep = interrupt_packet->endpoint; + +- DPRINTF("interrupt-in status %d ep %02X len %d id %u\n", ++ DPRINTF("interrupt-in status %d ep %02X len %d id %"PRIu64"\n", + interrupt_packet->status, ep, data_len, id); + + if (dev->endpoint[EP2I(ep)].type != USB_ENDPOINT_XFER_INT) { +-- +1.7.12.1 + diff --git a/0601-usb-redir-Set-ep-max_packet_size-if-available.patch b/0601-usb-redir-Set-ep-max_packet_size-if-available.patch new file mode 100644 index 0000000..8dacdb4 --- /dev/null +++ b/0601-usb-redir-Set-ep-max_packet_size-if-available.patch @@ -0,0 +1,39 @@ +From 0995eaeb06c4810cd133e710170a7b181caf04cd Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 11:49:07 +0200 +Subject: [PATCH] usb-redir: Set ep max_packet_size if available + +This is needed for usb-redir to work properly with the xhci emulation. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +--- + hw/usb/redirect.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 321f5be..b9a3633 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -814,6 +814,7 @@ static void usbredir_chardev_open(USBRedirDevice *dev) + + usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version); + usbredirparser_caps_set_cap(caps, usb_redir_cap_filter); ++ usbredirparser_caps_set_cap(caps, usb_redir_cap_ep_info_max_packet_size); + usbredirparser_caps_set_cap(caps, usb_redir_cap_64bits_ids); + usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE, 0); + usbredirparser_do_write(dev->parser); +@@ -1202,6 +1203,10 @@ static void usbredir_ep_info(void *priv, + i & 0x0f); + usb_ep->type = dev->endpoint[i].type; + usb_ep->ifnum = dev->endpoint[i].interface; ++ if (usbredirparser_peer_has_cap(dev->parser, ++ usb_redir_cap_ep_info_max_packet_size)) { ++ usb_ep->max_packet_size = ep_info->max_packet_size[i]; ++ } + } + } + +-- +1.7.12.1 + diff --git a/0602-usb-redir-Add-a-usbredir_reject_device-helper-functi.patch b/0602-usb-redir-Add-a-usbredir_reject_device-helper-functi.patch new file mode 100644 index 0000000..cfe0fa1 --- /dev/null +++ b/0602-usb-redir-Add-a-usbredir_reject_device-helper-functi.patch @@ -0,0 +1,58 @@ +From 596013354fd1d5b102cdb54449b10e11346f9fda Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 11:53:28 +0200 +Subject: [PATCH] usb-redir: Add a usbredir_reject_device helper function + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +--- + hw/usb/redirect.c | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index b9a3633..a590cb2 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -820,16 +820,21 @@ static void usbredir_chardev_open(USBRedirDevice *dev) + usbredirparser_do_write(dev->parser); + } + ++static void usbredir_reject_device(USBRedirDevice *dev) ++{ ++ usbredir_device_disconnect(dev); ++ if (usbredirparser_peer_has_cap(dev->parser, usb_redir_cap_filter)) { ++ usbredirparser_send_filter_reject(dev->parser); ++ usbredirparser_do_write(dev->parser); ++ } ++} ++ + static void usbredir_do_attach(void *opaque) + { + USBRedirDevice *dev = opaque; + + if (usb_device_attach(&dev->dev) != 0) { +- usbredir_device_disconnect(dev); +- if (usbredirparser_peer_has_cap(dev->parser, usb_redir_cap_filter)) { +- usbredirparser_send_filter_reject(dev->parser); +- usbredirparser_do_write(dev->parser); +- } ++ usbredir_reject_device(dev); + } + } + +@@ -1008,11 +1013,7 @@ static int usbredir_check_filter(USBRedirDevice *dev) + return 0; + + error: +- usbredir_device_disconnect(dev); +- if (usbredirparser_peer_has_cap(dev->parser, usb_redir_cap_filter)) { +- usbredirparser_send_filter_reject(dev->parser); +- usbredirparser_do_write(dev->parser); +- } ++ usbredir_reject_device(dev); + return -1; + } + +-- +1.7.12.1 + diff --git a/0603-usb-redir-Ensure-our-peer-has-the-necessary-caps-whe.patch b/0603-usb-redir-Ensure-our-peer-has-the-necessary-caps-whe.patch new file mode 100644 index 0000000..ef6b4a2 --- /dev/null +++ b/0603-usb-redir-Ensure-our-peer-has-the-necessary-caps-whe.patch @@ -0,0 +1,43 @@ +From 87317670541ed043a21964c29e0e613aab375224 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 12:04:49 +0200 +Subject: [PATCH] usb-redir: Ensure our peer has the necessary caps when + redirecting to XHCI + +In order for redirection to work properly when redirecting to an emulated +XHCI controller, the usb-redir-host must support both +usb_redir_cap_ep_info_max_packet_size and usb_redir_cap_64bits_ids, +reject any devices redirected to an XHCI controller when these are not +supported. + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +--- + hw/usb/redirect.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index a590cb2..f1bb692 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -833,6 +833,17 @@ static void usbredir_do_attach(void *opaque) + { + USBRedirDevice *dev = opaque; + ++ /* In order to work properly with XHCI controllers we need these caps */ ++ if ((dev->dev.port->speedmask & USB_SPEED_MASK_SUPER) && !( ++ usbredirparser_peer_has_cap(dev->parser, ++ usb_redir_cap_ep_info_max_packet_size) && ++ usbredirparser_peer_has_cap(dev->parser, ++ usb_redir_cap_64bits_ids))) { ++ ERROR("usb-redir-host lacks capabilities needed for use with XHCI\n"); ++ usbredir_reject_device(dev); ++ return; ++ } ++ + if (usb_device_attach(&dev->dev) != 0) { + usbredir_reject_device(dev); + } +-- +1.7.12.1 + diff --git a/0604-usb-redir-Enable-pipelining-for-bulk-endpoints.patch b/0604-usb-redir-Enable-pipelining-for-bulk-endpoints.patch new file mode 100644 index 0000000..cfb988e --- /dev/null +++ b/0604-usb-redir-Enable-pipelining-for-bulk-endpoints.patch @@ -0,0 +1,28 @@ +From c12ef3d896e426505ea3ca4fb2f1d9017f9cf828 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 3 Sep 2012 13:44:04 +0200 +Subject: [PATCH] usb-redir: Enable pipelining for bulk endpoints + +Signed-off-by: Hans de Goede +Signed-off-by: Gerd Hoffmann +--- + hw/usb/redirect.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index f1bb692..f183263 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -1219,6 +1219,9 @@ static void usbredir_ep_info(void *priv, + usb_redir_cap_ep_info_max_packet_size)) { + usb_ep->max_packet_size = ep_info->max_packet_size[i]; + } ++ if (ep_info->type[i] == usb_redir_type_bulk) { ++ usb_ep->pipeline = true; ++ } + } + } + +-- +1.7.12.1 + diff --git a/0605-xhci-move-device-lookup-into-xhci_setup_packet.patch b/0605-xhci-move-device-lookup-into-xhci_setup_packet.patch new file mode 100644 index 0000000..3a2ad62 --- /dev/null +++ b/0605-xhci-move-device-lookup-into-xhci_setup_packet.patch @@ -0,0 +1,154 @@ +From 2255facbc338e73aa2442e2a1dc13b3474b35f98 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 24 Aug 2012 14:21:39 +0200 +Subject: [PATCH] xhci: move device lookup into xhci_setup_packet + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 74 ++++++++++++++++++++++++++++--------------------------- + 1 file changed, 38 insertions(+), 36 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 333df59..316a303 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -1196,13 +1196,38 @@ static void xhci_stall_ep(XHCITransfer *xfer) + static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, + XHCIEPContext *epctx); + +-static int xhci_setup_packet(XHCITransfer *xfer, USBDevice *dev) ++static USBDevice *xhci_find_device(XHCIPort *port, uint8_t addr) + { ++ if (!(port->portsc & PORTSC_PED)) { ++ return NULL; ++ } ++ return usb_find_device(&port->port, addr); ++} ++ ++static int xhci_setup_packet(XHCITransfer *xfer) ++{ ++ XHCIState *xhci = xfer->xhci; ++ XHCIPort *port; ++ USBDevice *dev; + USBEndpoint *ep; + int dir; + + dir = xfer->in_xfer ? USB_TOKEN_IN : USB_TOKEN_OUT; +- ep = usb_ep_get(dev, dir, xfer->epid >> 1); ++ ++ if (xfer->packet.ep) { ++ ep = xfer->packet.ep; ++ dev = ep->dev; ++ } else { ++ port = &xhci->ports[xhci->slots[xfer->slotid-1].port-1]; ++ dev = xhci_find_device(port, xhci->slots[xfer->slotid-1].devaddr); ++ if (!dev) { ++ fprintf(stderr, "xhci: slot %d port %d has no device\n", ++ xfer->slotid, xhci->slots[xfer->slotid-1].port); ++ return -1; ++ } ++ ep = usb_ep_get(dev, dir, xfer->epid >> 1); ++ } ++ + usb_packet_setup(&xfer->packet, dir, ep, xfer->trbs[0].addr); + xhci_xfer_map(xfer); + DPRINTF("xhci: setup packet pid 0x%x addr %d ep %d\n", +@@ -1260,20 +1285,10 @@ static int xhci_complete_packet(XHCITransfer *xfer, int ret) + return 0; + } + +-static USBDevice *xhci_find_device(XHCIPort *port, uint8_t addr) +-{ +- if (!(port->portsc & PORTSC_PED)) { +- return NULL; +- } +- return usb_find_device(&port->port, addr); +-} +- + static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer) + { + XHCITRB *trb_setup, *trb_status; + uint8_t bmRequestType; +- XHCIPort *port; +- USBDevice *dev; + int ret; + + trb_setup = &xfer->trbs[0]; +@@ -1309,21 +1324,15 @@ static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer) + + bmRequestType = trb_setup->parameter; + +- port = &xhci->ports[xhci->slots[xfer->slotid-1].port-1]; +- dev = xhci_find_device(port, xhci->slots[xfer->slotid-1].devaddr); +- if (!dev) { +- fprintf(stderr, "xhci: slot %d port %d has no device\n", xfer->slotid, +- xhci->slots[xfer->slotid-1].port); +- return -1; +- } +- + xfer->in_xfer = bmRequestType & USB_DIR_IN; + xfer->iso_xfer = false; + +- xhci_setup_packet(xfer, dev); ++ if (xhci_setup_packet(xfer) < 0) { ++ return -1; ++ } + xfer->packet.parameter = trb_setup->parameter; + +- ret = usb_handle_packet(dev, &xfer->packet); ++ ret = usb_handle_packet(xfer->packet.ep->dev, &xfer->packet); + + xhci_complete_packet(xfer, ret); + if (!xfer->running_async && !xfer->running_retry) { +@@ -1334,8 +1343,6 @@ static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer) + + static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx) + { +- XHCIPort *port; +- USBDevice *dev; + int ret; + + DPRINTF("xhci_submit(slotid=%d,epid=%d)\n", xfer->slotid, xfer->epid); +@@ -1348,16 +1355,6 @@ static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx + xfer->pkts = 0; + } + +- port = &xhci->ports[xhci->slots[xfer->slotid-1].port-1]; +- dev = xhci_find_device(port, xhci->slots[xfer->slotid-1].devaddr); +- if (!dev) { +- fprintf(stderr, "xhci: slot %d port %d has no device\n", xfer->slotid, +- xhci->slots[xfer->slotid-1].port); +- return -1; +- } +- +- xhci_setup_packet(xfer, dev); +- + switch(epctx->type) { + case ET_INTR_OUT: + case ET_INTR_IN: +@@ -1375,7 +1372,10 @@ static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx + return -1; + } + +- ret = usb_handle_packet(dev, &xfer->packet); ++ if (xhci_setup_packet(xfer) < 0) { ++ return -1; ++ } ++ ret = usb_handle_packet(xfer->packet.ep->dev, &xfer->packet); + + xhci_complete_packet(xfer, ret); + if (!xfer->running_async && !xfer->running_retry) { +@@ -1418,7 +1418,9 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid + + trace_usb_xhci_xfer_retry(xfer); + assert(xfer->running_retry); +- xhci_setup_packet(xfer, xfer->packet.ep->dev); ++ if (xhci_setup_packet(xfer) < 0) { ++ return; ++ } + result = usb_handle_packet(xfer->packet.ep->dev, &xfer->packet); + if (result == USB_RET_NAK) { + return; +-- +1.7.12.1 + diff --git a/0606-xhci-implement-mfindex.patch b/0606-xhci-implement-mfindex.patch new file mode 100644 index 0000000..4e4d268 --- /dev/null +++ b/0606-xhci-implement-mfindex.patch @@ -0,0 +1,142 @@ +From 1f98b775c9f02caece1df5813edbb9c0a509bd58 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 21 Aug 2012 12:32:58 +0200 +Subject: [PATCH] xhci: implement mfindex + +Implement mfindex register and mfindex wrap event. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 46 insertions(+), 7 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 316a303..f5ba6a4 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -380,8 +380,6 @@ struct XHCIState { + XHCISlot slots[MAXSLOTS]; + + /* Runtime Registers */ +- uint32_t mfindex; +- /* note: we only support one interrupter */ + uint32_t iman; + uint32_t imod; + uint32_t erstsz; +@@ -390,6 +388,9 @@ struct XHCIState { + uint32_t erdp_low; + uint32_t erdp_high; + ++ int64_t mfindex_start; ++ QEMUTimer *mfwrap_timer; ++ + dma_addr_t er_start; + uint32_t er_size; + bool er_pcs; +@@ -410,6 +411,11 @@ typedef struct XHCIEvRingSeg { + uint32_t rsvd; + } XHCIEvRingSeg; + ++static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, ++ unsigned int epid); ++static void xhci_event(XHCIState *xhci, XHCIEvent *event); ++static void xhci_write_event(XHCIState *xhci, XHCIEvent *event); ++ + static const char *TRBType_names[] = { + [TRB_RESERVED] = "TRB_RESERVED", + [TR_NORMAL] = "TR_NORMAL", +@@ -462,8 +468,36 @@ static const char *trb_name(XHCITRB *trb) + ARRAY_SIZE(TRBType_names)); + } + +-static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, +- unsigned int epid); ++static uint64_t xhci_mfindex_get(XHCIState *xhci) ++{ ++ int64_t now = qemu_get_clock_ns(vm_clock); ++ return (now - xhci->mfindex_start) / 125000; ++} ++ ++static void xhci_mfwrap_update(XHCIState *xhci) ++{ ++ const uint32_t bits = USBCMD_RS | USBCMD_EWE; ++ uint32_t mfindex, left; ++ int64_t now; ++ ++ if ((xhci->usbcmd & bits) == bits) { ++ now = qemu_get_clock_ns(vm_clock); ++ mfindex = ((now - xhci->mfindex_start) / 125000) & 0x3fff; ++ left = 0x4000 - mfindex; ++ qemu_mod_timer(xhci->mfwrap_timer, now + left * 125000); ++ } else { ++ qemu_del_timer(xhci->mfwrap_timer); ++ } ++} ++ ++static void xhci_mfwrap_timer(void *opaque) ++{ ++ XHCIState *xhci = opaque; ++ XHCIEvent wrap = { ER_MFINDEX_WRAP, CC_SUCCESS }; ++ ++ xhci_event(xhci, &wrap); ++ xhci_mfwrap_update(xhci); ++} + + static inline dma_addr_t xhci_addr64(uint32_t low, uint32_t high) + { +@@ -793,6 +827,7 @@ static void xhci_run(XHCIState *xhci) + { + trace_usb_xhci_run(); + xhci->usbsts &= ~USBSTS_HCH; ++ xhci->mfindex_start = qemu_get_clock_ns(vm_clock); + } + + static void xhci_stop(XHCIState *xhci) +@@ -2048,7 +2083,6 @@ static void xhci_reset(DeviceState *dev) + xhci_update_port(xhci, xhci->ports + i, 0); + } + +- xhci->mfindex = 0; + xhci->iman = 0; + xhci->imod = 0; + xhci->erstsz = 0; +@@ -2062,6 +2096,9 @@ static void xhci_reset(DeviceState *dev) + xhci->er_full = 0; + xhci->ev_buffer_put = 0; + xhci->ev_buffer_get = 0; ++ ++ xhci->mfindex_start = qemu_get_clock_ns(vm_clock); ++ xhci_mfwrap_update(xhci); + } + + static uint32_t xhci_cap_read(XHCIState *xhci, uint32_t reg) +@@ -2264,6 +2301,7 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val) + xhci_stop(xhci); + } + xhci->usbcmd = val & 0xc0f; ++ xhci_mfwrap_update(xhci); + if (val & USBCMD_HCRST) { + xhci_reset(&xhci->pci_dev.qdev); + } +@@ -2315,8 +2353,7 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + + switch (reg) { + case 0x00: /* MFINDEX */ +- fprintf(stderr, "xhci_runtime_read: MFINDEX not yet implemented\n"); +- ret = xhci->mfindex; ++ ret = xhci_mfindex_get(xhci) & 0x3fff; + break; + case 0x20: /* IMAN */ + ret = xhci->iman; +@@ -2618,6 +2655,8 @@ static int usb_xhci_initfn(struct PCIDevice *dev) + + usb_xhci_init(xhci, &dev->qdev); + ++ xhci->mfwrap_timer = qemu_new_timer_ns(vm_clock, xhci_mfwrap_timer, xhci); ++ + xhci->irq = xhci->pci_dev.irq[0]; + + memory_region_init_io(&xhci->mem, &xhci_mem_ops, xhci, +-- +1.7.12.1 + diff --git a/0607-xhci-iso-xfer-support.patch b/0607-xhci-iso-xfer-support.patch new file mode 100644 index 0000000..acaee96 --- /dev/null +++ b/0607-xhci-iso-xfer-support.patch @@ -0,0 +1,238 @@ +From 82508212e19333e527b64fb76cd1bc016afacc8a Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 24 Aug 2012 14:13:08 +0200 +Subject: [PATCH] xhci: iso xfer support + +Add support for iso transfers. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 101 insertions(+), 16 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index f5ba6a4..b313330 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -325,9 +325,15 @@ typedef struct XHCITransfer { + unsigned int pkts; + unsigned int pktsize; + unsigned int cur_pkt; ++ ++ uint64_t mfindex_kick; + } XHCITransfer; + + typedef struct XHCIEPContext { ++ XHCIState *xhci; ++ unsigned int slotid; ++ unsigned int epid; ++ + XHCIRing ring; + unsigned int next_xfer; + unsigned int comp_xfer; +@@ -337,6 +343,11 @@ typedef struct XHCIEPContext { + dma_addr_t pctx; + unsigned int max_psize; + uint32_t state; ++ ++ /* iso xfer scheduling */ ++ unsigned int interval; ++ int64_t mfindex_last; ++ QEMUTimer *kick_timer; + } XHCIEPContext; + + typedef struct XHCISlot { +@@ -856,6 +867,12 @@ static void xhci_set_ep_state(XHCIState *xhci, XHCIEPContext *epctx, + epctx->state = state; + } + ++static void xhci_ep_kick_timer(void *opaque) ++{ ++ XHCIEPContext *epctx = opaque; ++ xhci_kick_ep(epctx->xhci, epctx->slotid, epctx->epid); ++} ++ + static TRBCCode xhci_enable_ep(XHCIState *xhci, unsigned int slotid, + unsigned int epid, dma_addr_t pctx, + uint32_t *ctx) +@@ -877,6 +894,9 @@ static TRBCCode xhci_enable_ep(XHCIState *xhci, unsigned int slotid, + + epctx = g_malloc(sizeof(XHCIEPContext)); + memset(epctx, 0, sizeof(XHCIEPContext)); ++ epctx->xhci = xhci; ++ epctx->slotid = slotid; ++ epctx->epid = epid; + + slot->eps[epid-1] = epctx; + +@@ -895,6 +915,10 @@ static TRBCCode xhci_enable_ep(XHCIState *xhci, unsigned int slotid, + usb_packet_init(&epctx->transfers[i].packet); + } + ++ epctx->interval = 1 << (ctx[0] >> 16) & 0xff; ++ epctx->mfindex_last = 0; ++ epctx->kick_timer = qemu_new_timer_ns(vm_clock, xhci_ep_kick_timer, epctx); ++ + epctx->state = EP_RUNNING; + ctx[0] &= ~EP_STATE_MASK; + ctx[0] |= EP_RUNNING; +@@ -934,6 +958,7 @@ static int xhci_ep_nuke_xfers(XHCIState *xhci, unsigned int slotid, + if (t->running_retry) { + t->running_retry = 0; + epctx->retry = NULL; ++ qemu_del_timer(epctx->kick_timer); + } + if (t->trbs) { + g_free(t->trbs); +@@ -969,6 +994,7 @@ static TRBCCode xhci_disable_ep(XHCIState *xhci, unsigned int slotid, + + xhci_set_ep_state(xhci, epctx, EP_DISABLED); + ++ qemu_free_timer(epctx->kick_timer); + g_free(epctx); + slot->eps[epid-1] = NULL; + +@@ -1376,29 +1402,70 @@ static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer) + return 0; + } + ++static void xhci_calc_iso_kick(XHCIState *xhci, XHCITransfer *xfer, ++ XHCIEPContext *epctx, uint64_t mfindex) ++{ ++ if (xfer->trbs[0].control & TRB_TR_SIA) { ++ uint64_t asap = ((mfindex + epctx->interval - 1) & ++ ~(epctx->interval-1)); ++ if (asap >= epctx->mfindex_last && ++ asap <= epctx->mfindex_last + epctx->interval * 4) { ++ xfer->mfindex_kick = epctx->mfindex_last + epctx->interval; ++ } else { ++ xfer->mfindex_kick = asap; ++ } ++ } else { ++ xfer->mfindex_kick = (xfer->trbs[0].control >> TRB_TR_FRAMEID_SHIFT) ++ & TRB_TR_FRAMEID_MASK; ++ xfer->mfindex_kick |= mfindex & ~0x3fff; ++ if (xfer->mfindex_kick < mfindex) { ++ xfer->mfindex_kick += 0x4000; ++ } ++ } ++} ++ ++static void xhci_check_iso_kick(XHCIState *xhci, XHCITransfer *xfer, ++ XHCIEPContext *epctx, uint64_t mfindex) ++{ ++ if (xfer->mfindex_kick > mfindex) { ++ qemu_mod_timer(epctx->kick_timer, qemu_get_clock_ns(vm_clock) + ++ (xfer->mfindex_kick - mfindex) * 125000); ++ xfer->running_retry = 1; ++ } else { ++ epctx->mfindex_last = xfer->mfindex_kick; ++ qemu_del_timer(epctx->kick_timer); ++ xfer->running_retry = 0; ++ } ++} ++ ++ + static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext *epctx) + { ++ uint64_t mfindex; + int ret; + + DPRINTF("xhci_submit(slotid=%d,epid=%d)\n", xfer->slotid, xfer->epid); + + xfer->in_xfer = epctx->type>>2; + +- if (epctx->type == ET_ISO_IN || epctx->type == ET_ISO_OUT) { +- xfer->pkts = 1; +- } else { +- xfer->pkts = 0; +- } +- + switch(epctx->type) { + case ET_INTR_OUT: + case ET_INTR_IN: + case ET_BULK_OUT: + case ET_BULK_IN: ++ xfer->pkts = 0; ++ xfer->iso_xfer = false; + break; + case ET_ISO_OUT: + case ET_ISO_IN: +- FIXME(); ++ xfer->pkts = 1; ++ xfer->iso_xfer = true; ++ mfindex = xhci_mfindex_get(xhci); ++ xhci_calc_iso_kick(xhci, xfer, epctx, mfindex); ++ xhci_check_iso_kick(xhci, xfer, epctx, mfindex); ++ if (xfer->running_retry) { ++ return -1; ++ } + break; + default: + fprintf(stderr, "xhci: unknown or unhandled EP " +@@ -1428,6 +1495,7 @@ static int xhci_fire_transfer(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext + static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid) + { + XHCIEPContext *epctx; ++ uint64_t mfindex; + int length; + int i; + +@@ -1447,20 +1515,35 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid + } + + if (epctx->retry) { +- /* retry nak'ed transfer */ + XHCITransfer *xfer = epctx->retry; + int result; + + trace_usb_xhci_xfer_retry(xfer); + assert(xfer->running_retry); +- if (xhci_setup_packet(xfer) < 0) { +- return; +- } +- result = usb_handle_packet(xfer->packet.ep->dev, &xfer->packet); +- if (result == USB_RET_NAK) { +- return; ++ if (xfer->iso_xfer) { ++ /* retry delayed iso transfer */ ++ mfindex = xhci_mfindex_get(xhci); ++ xhci_check_iso_kick(xhci, xfer, epctx, mfindex); ++ if (xfer->running_retry) { ++ return; ++ } ++ if (xhci_setup_packet(xfer) < 0) { ++ return; ++ } ++ result = usb_handle_packet(xfer->packet.ep->dev, &xfer->packet); ++ assert(result != USB_RET_NAK); ++ xhci_complete_packet(xfer, result); ++ } else { ++ /* retry nak'ed transfer */ ++ if (xhci_setup_packet(xfer) < 0) { ++ return; ++ } ++ result = usb_handle_packet(xfer->packet.ep->dev, &xfer->packet); ++ if (result == USB_RET_NAK) { ++ return; ++ } ++ xhci_complete_packet(xfer, result); + } +- xhci_complete_packet(xfer, result); + assert(!xfer->running_retry); + epctx->retry = NULL; + } +@@ -1512,7 +1595,9 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid + if (xhci_fire_transfer(xhci, xfer, epctx) >= 0) { + epctx->next_xfer = (epctx->next_xfer + 1) % TD_QUEUE; + } else { +- fprintf(stderr, "xhci: error firing data transfer\n"); ++ if (!xfer->iso_xfer) { ++ fprintf(stderr, "xhci: error firing data transfer\n"); ++ } + } + } + +-- +1.7.12.1 + diff --git a/0608-xhci-trace-cc-codes-in-cleartext.patch b/0608-xhci-trace-cc-codes-in-cleartext.patch new file mode 100644 index 0000000..b2b70f6 --- /dev/null +++ b/0608-xhci-trace-cc-codes-in-cleartext.patch @@ -0,0 +1,100 @@ +From 188fbd363df2e7f23ea37fb1b179e984bbce39e5 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Mon, 27 Aug 2012 16:09:20 +0200 +Subject: [PATCH] xhci: trace cc codes in cleartext + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- + trace-events | 2 +- + 2 files changed, 48 insertions(+), 2 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index b313330..ab352c0 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -465,6 +465,45 @@ static const char *TRBType_names[] = { + [CR_VENDOR_NEC_CHALLENGE_RESPONSE] = "CR_VENDOR_NEC_CHALLENGE_RESPONSE", + }; + ++static const char *TRBCCode_names[] = { ++ [CC_INVALID] = "CC_INVALID", ++ [CC_SUCCESS] = "CC_SUCCESS", ++ [CC_DATA_BUFFER_ERROR] = "CC_DATA_BUFFER_ERROR", ++ [CC_BABBLE_DETECTED] = "CC_BABBLE_DETECTED", ++ [CC_USB_TRANSACTION_ERROR] = "CC_USB_TRANSACTION_ERROR", ++ [CC_TRB_ERROR] = "CC_TRB_ERROR", ++ [CC_STALL_ERROR] = "CC_STALL_ERROR", ++ [CC_RESOURCE_ERROR] = "CC_RESOURCE_ERROR", ++ [CC_BANDWIDTH_ERROR] = "CC_BANDWIDTH_ERROR", ++ [CC_NO_SLOTS_ERROR] = "CC_NO_SLOTS_ERROR", ++ [CC_INVALID_STREAM_TYPE_ERROR] = "CC_INVALID_STREAM_TYPE_ERROR", ++ [CC_SLOT_NOT_ENABLED_ERROR] = "CC_SLOT_NOT_ENABLED_ERROR", ++ [CC_EP_NOT_ENABLED_ERROR] = "CC_EP_NOT_ENABLED_ERROR", ++ [CC_SHORT_PACKET] = "CC_SHORT_PACKET", ++ [CC_RING_UNDERRUN] = "CC_RING_UNDERRUN", ++ [CC_RING_OVERRUN] = "CC_RING_OVERRUN", ++ [CC_VF_ER_FULL] = "CC_VF_ER_FULL", ++ [CC_PARAMETER_ERROR] = "CC_PARAMETER_ERROR", ++ [CC_BANDWIDTH_OVERRUN] = "CC_BANDWIDTH_OVERRUN", ++ [CC_CONTEXT_STATE_ERROR] = "CC_CONTEXT_STATE_ERROR", ++ [CC_NO_PING_RESPONSE_ERROR] = "CC_NO_PING_RESPONSE_ERROR", ++ [CC_EVENT_RING_FULL_ERROR] = "CC_EVENT_RING_FULL_ERROR", ++ [CC_INCOMPATIBLE_DEVICE_ERROR] = "CC_INCOMPATIBLE_DEVICE_ERROR", ++ [CC_MISSED_SERVICE_ERROR] = "CC_MISSED_SERVICE_ERROR", ++ [CC_COMMAND_RING_STOPPED] = "CC_COMMAND_RING_STOPPED", ++ [CC_COMMAND_ABORTED] = "CC_COMMAND_ABORTED", ++ [CC_STOPPED] = "CC_STOPPED", ++ [CC_STOPPED_LENGTH_INVALID] = "CC_STOPPED_LENGTH_INVALID", ++ [CC_MAX_EXIT_LATENCY_TOO_LARGE_ERROR] ++ = "CC_MAX_EXIT_LATENCY_TOO_LARGE_ERROR", ++ [CC_ISOCH_BUFFER_OVERRUN] = "CC_ISOCH_BUFFER_OVERRUN", ++ [CC_EVENT_LOST_ERROR] = "CC_EVENT_LOST_ERROR", ++ [CC_UNDEFINED_ERROR] = "CC_UNDEFINED_ERROR", ++ [CC_INVALID_STREAM_ID_ERROR] = "CC_INVALID_STREAM_ID_ERROR", ++ [CC_SECONDARY_BANDWIDTH_ERROR] = "CC_SECONDARY_BANDWIDTH_ERROR", ++ [CC_SPLIT_TRANSACTION_ERROR] = "CC_SPLIT_TRANSACTION_ERROR", ++}; ++ + static const char *lookup_name(uint32_t index, const char **list, uint32_t llen) + { + if (index >= llen || list[index] == NULL) { +@@ -479,6 +518,12 @@ static const char *trb_name(XHCITRB *trb) + ARRAY_SIZE(TRBType_names)); + } + ++static const char *event_name(XHCIEvent *event) ++{ ++ return lookup_name(event->ccode, TRBCCode_names, ++ ARRAY_SIZE(TRBCCode_names)); ++} ++ + static uint64_t xhci_mfindex_get(XHCIState *xhci) + { + int64_t now = qemu_get_clock_ns(vm_clock); +@@ -574,7 +619,8 @@ static void xhci_write_event(XHCIState *xhci, XHCIEvent *event) + ev_trb.control = cpu_to_le32(ev_trb.control); + + trace_usb_xhci_queue_event(xhci->er_ep_idx, trb_name(&ev_trb), +- ev_trb.parameter, ev_trb.status, ev_trb.control); ++ event_name(event), ev_trb.parameter, ++ ev_trb.status, ev_trb.control); + + addr = xhci->er_start + TRB_SIZE*xhci->er_ep_idx; + pci_dma_write(&xhci->pci_dev, addr, &ev_trb, TRB_SIZE); +diff --git a/trace-events b/trace-events +index 07b63f1..b38e32a 100644 +--- a/trace-events ++++ b/trace-events +@@ -316,7 +316,7 @@ usb_xhci_runtime_write(uint32_t off, uint32_t val) "off 0x%04x, val 0x%08x" + usb_xhci_doorbell_write(uint32_t off, uint32_t val) "off 0x%04x, val 0x%08x" + usb_xhci_irq_intx(uint32_t level) "level %d" + usb_xhci_irq_msi(uint32_t nr) "nr %d" +-usb_xhci_queue_event(uint32_t idx, const char *name, uint64_t param, uint32_t status, uint32_t control) "idx %d, %s, p %016" PRIx64 ", s %08x, c 0x%08x" ++usb_xhci_queue_event(uint32_t idx, const char *trb, const char *evt, uint64_t param, uint32_t status, uint32_t control) "idx %d, %s, %s, p %016" PRIx64 ", s %08x, c 0x%08x" + usb_xhci_fetch_trb(uint64_t addr, const char *name, uint64_t param, uint32_t status, uint32_t control) "addr %016" PRIx64 ", %s, p %016" PRIx64 ", s %08x, c 0x%08x" + usb_xhci_slot_enable(uint32_t slotid) "slotid %d" + usb_xhci_slot_disable(uint32_t slotid) "slotid %d" +-- +1.7.12.1 + diff --git a/0609-xhci-add-trace_usb_xhci_ep_set_dequeue.patch b/0609-xhci-add-trace_usb_xhci_ep_set_dequeue.patch new file mode 100644 index 0000000..7a07da9 --- /dev/null +++ b/0609-xhci-add-trace_usb_xhci_ep_set_dequeue.patch @@ -0,0 +1,39 @@ +From 10a1380a50e33f98d5030d75d9d356f7ce024556 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Wed, 29 Aug 2012 12:54:59 +0200 +Subject: [PATCH] xhci: add trace_usb_xhci_ep_set_dequeue + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 2 +- + trace-events | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index ab352c0..c6ab4a1 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -1145,7 +1145,7 @@ static TRBCCode xhci_set_ep_dequeue(XHCIState *xhci, unsigned int slotid, + return CC_TRB_ERROR; + } + +- DPRINTF("xhci_set_ep_dequeue(%d, %d, %016"PRIx64")\n", slotid, epid, pdequeue); ++ trace_usb_xhci_ep_set_dequeue(slotid, epid, pdequeue); + dequeue = xhci_mask64(pdequeue); + + slot = &xhci->slots[slotid-1]; +diff --git a/trace-events b/trace-events +index b38e32a..2db1deb 100644 +--- a/trace-events ++++ b/trace-events +@@ -326,6 +326,7 @@ usb_xhci_slot_evaluate(uint32_t slotid) "slotid %d" + usb_xhci_slot_reset(uint32_t slotid) "slotid %d" + usb_xhci_ep_enable(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" + usb_xhci_ep_disable(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" ++usb_xhci_ep_set_dequeue(uint32_t slotid, uint32_t epid, uint64_t param) "slotid %d, epid %d, ptr %016" PRIx64 + usb_xhci_ep_kick(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" + usb_xhci_ep_stop(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" + usb_xhci_ep_reset(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" +-- +1.7.12.1 + diff --git a/0610-xhci-update-register-layout.patch b/0610-xhci-update-register-layout.patch new file mode 100644 index 0000000..6052e50 --- /dev/null +++ b/0610-xhci-update-register-layout.patch @@ -0,0 +1,63 @@ +From 79e9a5ca778bfcb67073bfecd3f7cea7d93781ce Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 23 Aug 2012 13:26:25 +0200 +Subject: [PATCH] xhci: update register layout + +Change the register layout to be a bit more sparse and also not depend +on the number of ports. Useful when for making the number of ports +runtime-configurable. +--- + hw/usb/hcd-xhci.c | 21 +++++++++++++-------- + 1 file changed, 13 insertions(+), 8 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index c6ab4a1..d47539d 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -36,13 +36,12 @@ + #define FIXME() do { fprintf(stderr, "FIXME %s:%d\n", \ + __func__, __LINE__); abort(); } while (0) + +-#define MAXSLOTS 8 +-#define MAXINTRS 1 +- + #define USB2_PORTS 4 + #define USB3_PORTS 4 + + #define MAXPORTS (USB2_PORTS+USB3_PORTS) ++#define MAXSLOTS MAXPORTS ++#define MAXINTRS 1 /* MAXPORTS */ + + #define TD_QUEUE 24 + +@@ -53,16 +52,22 @@ + #define ER_FULL_HACK + + #define LEN_CAP 0x40 +-#define OFF_OPER LEN_CAP + #define LEN_OPER (0x400 + 0x10 * MAXPORTS) +-#define OFF_RUNTIME ((OFF_OPER + LEN_OPER + 0x20) & ~0x1f) +-#define LEN_RUNTIME (0x20 + MAXINTRS * 0x20) +-#define OFF_DOORBELL (OFF_RUNTIME + LEN_RUNTIME) ++#define LEN_RUNTIME ((MAXINTRS + 1) * 0x20) + #define LEN_DOORBELL ((MAXSLOTS + 1) * 0x20) + ++#define OFF_OPER LEN_CAP ++#define OFF_RUNTIME 0x1000 ++#define OFF_DOORBELL 0x2000 + /* must be power of 2 */ +-#define LEN_REGS 0x2000 ++#define LEN_REGS 0x4000 + ++#if (OFF_OPER + LEN_OPER) > OFF_RUNTIME ++#error Increase OFF_RUNTIME ++#endif ++#if (OFF_RUNTIME + LEN_RUNTIME) > OFF_DOORBELL ++#error Increase OFF_DOORBELL ++#endif + #if (OFF_DOORBELL + LEN_DOORBELL) > LEN_REGS + # error Increase LEN_REGS + #endif +-- +1.7.12.1 + diff --git a/0611-xhci-update-port-handling.patch b/0611-xhci-update-port-handling.patch new file mode 100644 index 0000000..d47740a --- /dev/null +++ b/0611-xhci-update-port-handling.patch @@ -0,0 +1,352 @@ +From 0b1ccd39faa8d1ea71f2d02dbab5dfd13f54ac98 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 28 Aug 2012 13:38:01 +0200 +Subject: [PATCH] xhci: update port handling + +This patch changes the way xhci ports are linked to USBPorts. The fixed +1:1 relationship between xhci ports and USBPorts is gone. Now each +USBPort represents a physical plug which has usually two xhci ports +assigned: one usb2 and ond usb3 port. usb devices show up at one or the +other, depending on whenever they support superspeed or not. + +This patch also makes the number of usb2 and usb3 ports runtime +configurable by adding 'p2' and 'p3' properties. It is allowed to +have different numbers of usb2 and usb3 ports. Specifying p2=4,p3=2 +will give you an xhci adapter which supports all speeds on physical +ports 1+2 and usb2 only on ports 3+4. +--- + hw/usb/hcd-xhci.c | 137 ++++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 97 insertions(+), 40 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index d47539d..5813b4a 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -36,10 +36,10 @@ + #define FIXME() do { fprintf(stderr, "FIXME %s:%d\n", \ + __func__, __LINE__); abort(); } while (0) + +-#define USB2_PORTS 4 +-#define USB3_PORTS 4 ++#define MAXPORTS_2 8 ++#define MAXPORTS_3 8 + +-#define MAXPORTS (USB2_PORTS+USB3_PORTS) ++#define MAXPORTS (MAXPORTS_2+MAXPORTS_3) + #define MAXSLOTS MAXPORTS + #define MAXINTRS 1 /* MAXPORTS */ + +@@ -300,8 +300,10 @@ typedef struct XHCIRing { + } XHCIRing; + + typedef struct XHCIPort { +- USBPort port; + uint32_t portsc; ++ uint32_t portnr; ++ USBPort *uport; ++ uint32_t speedmask; + } XHCIPort; + + struct XHCIState; +@@ -379,9 +381,13 @@ struct XHCIState { + qemu_irq irq; + MemoryRegion mem; + const char *name; +- uint32_t msi; + unsigned int devaddr; + ++ /* properties */ ++ uint32_t numports_2; ++ uint32_t numports_3; ++ uint32_t msi; ++ + /* Operational Registers */ + uint32_t usbcmd; + uint32_t usbsts; +@@ -392,8 +398,10 @@ struct XHCIState { + uint32_t dcbaap_high; + uint32_t config; + ++ USBPort uports[MAX(MAXPORTS_2, MAXPORTS_3)]; + XHCIPort ports[MAXPORTS]; + XHCISlot slots[MAXSLOTS]; ++ uint32_t numports; + + /* Runtime Registers */ + uint32_t iman; +@@ -578,6 +586,28 @@ static inline dma_addr_t xhci_mask64(uint64_t addr) + } + } + ++static XHCIPort *xhci_lookup_port(XHCIState *xhci, struct USBPort *uport) ++{ ++ int index; ++ ++ if (!uport->dev) { ++ return NULL; ++ } ++ switch (uport->dev->speed) { ++ case USB_SPEED_LOW: ++ case USB_SPEED_FULL: ++ case USB_SPEED_HIGH: ++ index = uport->index; ++ break; ++ case USB_SPEED_SUPER: ++ index = uport->index + xhci->numports_2; ++ break; ++ default: ++ return NULL; ++ } ++ return &xhci->ports[index]; ++} ++ + static void xhci_irq_update(XHCIState *xhci) + { + int level = 0; +@@ -1126,7 +1156,7 @@ static TRBCCode xhci_reset_ep(XHCIState *xhci, unsigned int slotid, + ep |= 0x80; + } + +- dev = xhci->ports[xhci->slots[slotid-1].port-1].port.dev; ++ dev = xhci->ports[xhci->slots[slotid-1].port-1].uport->dev; + if (!dev) { + return CC_USB_TRANSACTION_ERROR; + } +@@ -1313,7 +1343,7 @@ static USBDevice *xhci_find_device(XHCIPort *port, uint8_t addr) + if (!(port->portsc & PORTSC_PED)) { + return NULL; + } +- return usb_find_device(&port->port, addr); ++ return usb_find_device(port->uport, addr); + } + + static int xhci_setup_packet(XHCITransfer *xfer) +@@ -1734,9 +1764,9 @@ static TRBCCode xhci_address_slot(XHCIState *xhci, unsigned int slotid, + ep0_ctx[0], ep0_ctx[1], ep0_ctx[2], ep0_ctx[3], ep0_ctx[4]); + + port = (slot_ctx[1]>>16) & 0xFF; +- dev = xhci->ports[port-1].port.dev; ++ dev = xhci->ports[port-1].uport->dev; + +- if (port < 1 || port > MAXPORTS) { ++ if (port < 1 || port > xhci->numports) { + fprintf(stderr, "xhci: bad port %d\n", port); + return CC_TRB_ERROR; + } else if (!dev) { +@@ -1985,7 +2015,7 @@ static unsigned int xhci_get_slot(XHCIState *xhci, XHCIEvent *event, XHCITRB *tr + static TRBCCode xhci_get_port_bandwidth(XHCIState *xhci, uint64_t pctx) + { + dma_addr_t ctx; +- uint8_t bw_ctx[MAXPORTS+1]; ++ uint8_t bw_ctx[xhci->numports+1]; + + DPRINTF("xhci_get_port_bandwidth()\n"); + +@@ -1995,7 +2025,7 @@ static TRBCCode xhci_get_port_bandwidth(XHCIState *xhci, uint64_t pctx) + + /* TODO: actually implement real values here */ + bw_ctx[0] = 0; +- memset(&bw_ctx[1], 80, MAXPORTS); /* 80% */ ++ memset(&bw_ctx[1], 80, xhci->numports); /* 80% */ + pci_dma_write(&xhci->pci_dev, ctx, bw_ctx, sizeof(bw_ctx)); + + return CC_SUCCESS; +@@ -2165,12 +2195,11 @@ static void xhci_process_commands(XHCIState *xhci) + + static void xhci_update_port(XHCIState *xhci, XHCIPort *port, int is_detach) + { +- int nr = port->port.index + 1; +- + port->portsc = PORTSC_PP; +- if (port->port.dev && port->port.dev->attached && !is_detach) { ++ if (port->uport->dev && port->uport->dev->attached && !is_detach && ++ (1 << port->uport->dev->speed) & port->speedmask) { + port->portsc |= PORTSC_CCS; +- switch (port->port.dev->speed) { ++ switch (port->uport->dev->speed) { + case USB_SPEED_LOW: + port->portsc |= PORTSC_SPEED_LOW; + break; +@@ -2180,14 +2209,18 @@ static void xhci_update_port(XHCIState *xhci, XHCIPort *port, int is_detach) + case USB_SPEED_HIGH: + port->portsc |= PORTSC_SPEED_HIGH; + break; ++ case USB_SPEED_SUPER: ++ port->portsc |= PORTSC_SPEED_SUPER; ++ break; + } + } + + if (xhci_running(xhci)) { + port->portsc |= PORTSC_CSC; +- XHCIEvent ev = { ER_PORT_STATUS_CHANGE, CC_SUCCESS, nr << 24}; ++ XHCIEvent ev = { ER_PORT_STATUS_CHANGE, CC_SUCCESS, ++ port->portnr << 24}; + xhci_event(xhci, &ev); +- DPRINTF("xhci: port change event for port %d\n", nr); ++ DPRINTF("xhci: port change event for port %d\n", port->portnr); + } + } + +@@ -2215,7 +2248,7 @@ static void xhci_reset(DeviceState *dev) + xhci_disable_slot(xhci, i+1); + } + +- for (i = 0; i < MAXPORTS; i++) { ++ for (i = 0; i < xhci->numports; i++) { + xhci_update_port(xhci, xhci->ports + i, 0); + } + +@@ -2246,7 +2279,8 @@ static uint32_t xhci_cap_read(XHCIState *xhci, uint32_t reg) + ret = 0x01000000 | LEN_CAP; + break; + case 0x04: /* HCSPARAMS 1 */ +- ret = (MAXPORTS<<24) | (MAXINTRS<<8) | MAXSLOTS; ++ ret = ((xhci->numports_2+xhci->numports_3)<<24) ++ | (MAXINTRS<<8) | MAXSLOTS; + break; + case 0x08: /* HCSPARAMS 2 */ + ret = 0x0000000f; +@@ -2276,7 +2310,7 @@ static uint32_t xhci_cap_read(XHCIState *xhci, uint32_t reg) + ret = 0x20425455; /* "USB " */ + break; + case 0x28: /* Supported Protocol:08 */ +- ret = 0x00000001 | (USB2_PORTS<<8); ++ ret = 0x00000001 | (xhci->numports_2<<8); + break; + case 0x2c: /* Supported Protocol:0c */ + ret = 0x00000000; /* reserved */ +@@ -2288,7 +2322,7 @@ static uint32_t xhci_cap_read(XHCIState *xhci, uint32_t reg) + ret = 0x20425455; /* "USB " */ + break; + case 0x38: /* Supported Protocol:08 */ +- ret = 0x00000000 | (USB2_PORTS+1) | (USB3_PORTS<<8); ++ ret = 0x00000000 | (xhci->numports_2+1) | (xhci->numports_3<<8); + break; + case 0x3c: /* Supported Protocol:0c */ + ret = 0x00000000; /* reserved */ +@@ -2307,7 +2341,7 @@ static uint32_t xhci_port_read(XHCIState *xhci, uint32_t reg) + uint32_t port = reg >> 4; + uint32_t ret; + +- if (port >= MAXPORTS) { ++ if (port >= xhci->numports) { + fprintf(stderr, "xhci_port_read: port %d out of bounds\n", port); + ret = 0; + goto out; +@@ -2340,7 +2374,7 @@ static void xhci_port_write(XHCIState *xhci, uint32_t reg, uint32_t val) + + trace_usb_xhci_port_write(port, reg & 0x0f, val); + +- if (port >= MAXPORTS) { ++ if (port >= xhci->numports) { + fprintf(stderr, "xhci_port_read: port %d out of bounds\n", port); + return; + } +@@ -2362,7 +2396,7 @@ static void xhci_port_write(XHCIState *xhci, uint32_t reg, uint32_t val) + /* write-1-to-start bits */ + if (val & PORTSC_PR) { + DPRINTF("xhci: port %d reset\n", port); +- usb_device_reset(xhci->ports[port].port.dev); ++ usb_device_reset(xhci->ports[port].uport->dev); + portsc |= PORTSC_PRC | PORTSC_PED; + } + xhci->ports[port].portsc = portsc; +@@ -2659,7 +2693,7 @@ static const MemoryRegionOps xhci_mem_ops = { + static void xhci_attach(USBPort *usbport) + { + XHCIState *xhci = usbport->opaque; +- XHCIPort *port = &xhci->ports[usbport->index]; ++ XHCIPort *port = xhci_lookup_port(xhci, usbport); + + xhci_update_port(xhci, port, 0); + } +@@ -2667,7 +2701,7 @@ static void xhci_attach(USBPort *usbport) + static void xhci_detach(USBPort *usbport) + { + XHCIState *xhci = usbport->opaque; +- XHCIPort *port = &xhci->ports[usbport->index]; ++ XHCIPort *port = xhci_lookup_port(xhci, usbport); + + xhci_update_port(xhci, port, 1); + } +@@ -2675,9 +2709,9 @@ static void xhci_detach(USBPort *usbport) + static void xhci_wakeup(USBPort *usbport) + { + XHCIState *xhci = usbport->opaque; +- XHCIPort *port = &xhci->ports[usbport->index]; +- int nr = port->port.index + 1; +- XHCIEvent ev = { ER_PORT_STATUS_CHANGE, CC_SUCCESS, nr << 24}; ++ XHCIPort *port = xhci_lookup_port(xhci, usbport); ++ XHCIEvent ev = { ER_PORT_STATUS_CHANGE, CC_SUCCESS, ++ port->portnr << 24}; + uint32_t pls; + + pls = (port->portsc >> PORTSC_PLS_SHIFT) & PORTSC_PLS_MASK; +@@ -2759,22 +2793,43 @@ static USBBusOps xhci_bus_ops = { + + static void usb_xhci_init(XHCIState *xhci, DeviceState *dev) + { +- int i; ++ XHCIPort *port; ++ int i, usbports, speedmask; + + xhci->usbsts = USBSTS_HCH; + ++ if (xhci->numports_2 > MAXPORTS_2) { ++ xhci->numports_2 = MAXPORTS_2; ++ } ++ if (xhci->numports_3 > MAXPORTS_3) { ++ xhci->numports_3 = MAXPORTS_3; ++ } ++ usbports = MAX(xhci->numports_2, xhci->numports_3); ++ xhci->numports = xhci->numports_2 + xhci->numports_3; ++ + usb_bus_new(&xhci->bus, &xhci_bus_ops, &xhci->pci_dev.qdev); + +- for (i = 0; i < MAXPORTS; i++) { +- memset(&xhci->ports[i], 0, sizeof(xhci->ports[i])); +- usb_register_port(&xhci->bus, &xhci->ports[i].port, xhci, i, +- &xhci_port_ops, +- USB_SPEED_MASK_LOW | +- USB_SPEED_MASK_FULL | +- USB_SPEED_MASK_HIGH); +- } +- for (i = 0; i < MAXSLOTS; i++) { +- xhci->slots[i].enabled = 0; ++ for (i = 0; i < usbports; i++) { ++ speedmask = 0; ++ if (i < xhci->numports_2) { ++ port = &xhci->ports[i]; ++ port->portnr = i + 1; ++ port->uport = &xhci->uports[i]; ++ port->speedmask = ++ USB_SPEED_MASK_LOW | ++ USB_SPEED_MASK_FULL | ++ USB_SPEED_MASK_HIGH; ++ speedmask |= port->speedmask; ++ } ++ if (i < xhci->numports_3) { ++ port = &xhci->ports[i + xhci->numports_2]; ++ port->portnr = i + 1 + xhci->numports_2; ++ port->uport = &xhci->uports[i]; ++ port->speedmask = USB_SPEED_MASK_SUPER; ++ speedmask |= port->speedmask; ++ } ++ usb_register_port(&xhci->bus, &xhci->uports[i], xhci, i, ++ &xhci_port_ops, speedmask); + } + } + +@@ -2830,6 +2885,8 @@ static const VMStateDescription vmstate_xhci = { + + static Property xhci_properties[] = { + DEFINE_PROP_UINT32("msi", XHCIState, msi, 0), ++ DEFINE_PROP_UINT32("p2", XHCIState, numports_2, 4), ++ DEFINE_PROP_UINT32("p3", XHCIState, numports_3, 4), + DEFINE_PROP_END_OF_LIST(), + }; + +-- +1.7.12.1 + diff --git a/0612-usb3-superspeed-descriptors.patch b/0612-usb3-superspeed-descriptors.patch new file mode 100644 index 0000000..4c60573 --- /dev/null +++ b/0612-usb3-superspeed-descriptors.patch @@ -0,0 +1,64 @@ +From 81e37421158a28277c9857ba733da4371cb06129 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 28 Aug 2012 17:28:50 +0200 +Subject: [PATCH] usb3: superspeed descriptors + +Add superspeed descriptor entry to USBDesc, +advertise superspeed support when present. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/desc.c | 10 +++++++++- + hw/usb/desc.h | 1 + + 2 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/hw/usb/desc.c b/hw/usb/desc.c +index 0a9d3c9..3e8c6cb 100644 +--- a/hw/usb/desc.c ++++ b/hw/usb/desc.c +@@ -359,6 +359,9 @@ static void usb_desc_setdefaults(USBDevice *dev) + case USB_SPEED_HIGH: + dev->device = desc->high; + break; ++ case USB_SPEED_SUPER: ++ dev->device = desc->super; ++ break; + } + usb_desc_set_config(dev, 0); + } +@@ -376,6 +379,9 @@ void usb_desc_init(USBDevice *dev) + if (desc->high) { + dev->speedmask |= USB_SPEED_MASK_HIGH; + } ++ if (desc->super) { ++ dev->speedmask |= USB_SPEED_MASK_SUPER; ++ } + usb_desc_setdefaults(dev); + } + +@@ -384,7 +390,9 @@ void usb_desc_attach(USBDevice *dev) + const USBDesc *desc = usb_device_get_usb_desc(dev); + + assert(desc != NULL); +- if (desc->high && (dev->port->speedmask & USB_SPEED_MASK_HIGH)) { ++ if (desc->super && (dev->port->speedmask & USB_SPEED_MASK_SUPER)) { ++ dev->speed = USB_SPEED_SUPER; ++ } else if (desc->high && (dev->port->speedmask & USB_SPEED_MASK_HIGH)) { + dev->speed = USB_SPEED_HIGH; + } else if (desc->full && (dev->port->speedmask & USB_SPEED_MASK_FULL)) { + dev->speed = USB_SPEED_FULL; +diff --git a/hw/usb/desc.h b/hw/usb/desc.h +index 7cf5442..d89fa41 100644 +--- a/hw/usb/desc.h ++++ b/hw/usb/desc.h +@@ -152,6 +152,7 @@ struct USBDesc { + USBDescID id; + const USBDescDevice *full; + const USBDescDevice *high; ++ const USBDescDevice *super; + const char* const *str; + }; + +-- +1.7.12.1 + diff --git a/0613-usb3-superspeed-endpoint-companion.patch b/0613-usb3-superspeed-endpoint-companion.patch new file mode 100644 index 0000000..40983e4 --- /dev/null +++ b/0613-usb3-superspeed-endpoint-companion.patch @@ -0,0 +1,248 @@ +From e0354b4f91dd198b5bfe1ddf649588d6af84ea9c Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 28 Aug 2012 17:28:03 +0200 +Subject: [PATCH] usb3: superspeed endpoint companion + +Add support for building superspeed endpoint companion descriptors, +create them for superspeed usb devices. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb.h | 1 + + hw/usb/desc.c | 55 ++++++++++++++++++++++++++++++++++++++++--------------- + hw/usb/desc.h | 26 +++++++++++++++++++++----- + 3 files changed, 62 insertions(+), 20 deletions(-) + +diff --git a/hw/usb.h b/hw/usb.h +index 684e3f4..78ffdf4 100644 +--- a/hw/usb.h ++++ b/hw/usb.h +@@ -137,6 +137,7 @@ + #define USB_DT_INTERFACE_ASSOC 0x0B + #define USB_DT_CS_INTERFACE 0x24 + #define USB_DT_CS_ENDPOINT 0x25 ++#define USB_DT_ENDPOINT_COMPANION 0x30 + + #define USB_ENDPOINT_XFER_CONTROL 0 + #define USB_ENDPOINT_XFER_ISOC 1 +diff --git a/hw/usb/desc.c b/hw/usb/desc.c +index 3e8c6cb..8f5a8e5 100644 +--- a/hw/usb/desc.c ++++ b/hw/usb/desc.c +@@ -76,7 +76,8 @@ int usb_desc_device_qualifier(const USBDescDevice *dev, + return bLength; + } + +-int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len) ++int usb_desc_config(const USBDescConfig *conf, int flags, ++ uint8_t *dest, size_t len) + { + uint8_t bLength = 0x09; + uint16_t wTotalLength = 0; +@@ -99,7 +100,7 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len) + + /* handle grouped interfaces if any */ + for (i = 0; i < conf->nif_groups; i++) { +- rc = usb_desc_iface_group(&(conf->if_groups[i]), ++ rc = usb_desc_iface_group(&(conf->if_groups[i]), flags, + dest + wTotalLength, + len - wTotalLength); + if (rc < 0) { +@@ -110,7 +111,8 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len) + + /* handle normal (ungrouped / no IAD) interfaces if any */ + for (i = 0; i < conf->nif; i++) { +- rc = usb_desc_iface(conf->ifs + i, dest + wTotalLength, len - wTotalLength); ++ rc = usb_desc_iface(conf->ifs + i, flags, ++ dest + wTotalLength, len - wTotalLength); + if (rc < 0) { + return rc; + } +@@ -122,8 +124,8 @@ int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len) + return wTotalLength; + } + +-int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest, +- size_t len) ++int usb_desc_iface_group(const USBDescIfaceAssoc *iad, int flags, ++ uint8_t *dest, size_t len) + { + int pos = 0; + int i = 0; +@@ -147,7 +149,7 @@ int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest, + + /* handle associated interfaces in this group */ + for (i = 0; i < iad->nif; i++) { +- int rc = usb_desc_iface(&(iad->ifs[i]), dest + pos, len - pos); ++ int rc = usb_desc_iface(&(iad->ifs[i]), flags, dest + pos, len - pos); + if (rc < 0) { + return rc; + } +@@ -157,7 +159,8 @@ int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest, + return pos; + } + +-int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len) ++int usb_desc_iface(const USBDescIface *iface, int flags, ++ uint8_t *dest, size_t len) + { + uint8_t bLength = 0x09; + int i, rc, pos = 0; +@@ -188,7 +191,7 @@ int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len) + } + + for (i = 0; i < iface->bNumEndpoints; i++) { +- rc = usb_desc_endpoint(iface->eps + i, dest + pos, len - pos); ++ rc = usb_desc_endpoint(iface->eps + i, flags, dest + pos, len - pos); + if (rc < 0) { + return rc; + } +@@ -198,13 +201,15 @@ int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len) + return pos; + } + +-int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len) ++int usb_desc_endpoint(const USBDescEndpoint *ep, int flags, ++ uint8_t *dest, size_t len) + { + uint8_t bLength = ep->is_audio ? 0x09 : 0x07; + uint8_t extralen = ep->extra ? ep->extra[0] : 0; ++ uint8_t superlen = (flags & USB_DESC_FLAG_SUPER) ? 0x06 : 0; + USBDescriptor *d = (void *)dest; + +- if (len < bLength + extralen) { ++ if (len < bLength + extralen + superlen) { + return -1; + } + +@@ -224,7 +229,21 @@ int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len) + memcpy(dest + bLength, ep->extra, extralen); + } + +- return bLength + extralen; ++ if (superlen) { ++ USBDescriptor *d = (void *)(dest + bLength + extralen); ++ ++ d->bLength = 0x06; ++ d->bDescriptorType = USB_DT_ENDPOINT_COMPANION; ++ ++ d->u.super_endpoint.bMaxBurst = ep->bMaxBurst; ++ d->u.super_endpoint.bmAttributes = ep->bmAttributes_super; ++ d->u.super_endpoint.wBytesPerInterval_lo = ++ usb_lo(ep->wBytesPerInterval); ++ d->u.super_endpoint.wBytesPerInterval_hi = ++ usb_hi(ep->wBytesPerInterval); ++ } ++ ++ return bLength + extralen + superlen; + } + + int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len) +@@ -509,7 +528,7 @@ int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len + uint8_t buf[256]; + uint8_t type = value >> 8; + uint8_t index = value & 0xff; +- int ret = -1; ++ int flags, ret = -1; + + if (dev->speed == USB_SPEED_HIGH) { + other_dev = usb_device_get_usb_desc(dev)->full; +@@ -517,6 +536,11 @@ int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len + other_dev = usb_device_get_usb_desc(dev)->high; + } + ++ flags = 0; ++ if (dev->device->bcdUSB >= 0x0300) { ++ flags |= USB_DESC_FLAG_SUPER; ++ } ++ + switch(type) { + case USB_DT_DEVICE: + ret = usb_desc_device(&desc->id, dev->device, buf, sizeof(buf)); +@@ -524,7 +548,8 @@ int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len + break; + case USB_DT_CONFIG: + if (index < dev->device->bNumConfigurations) { +- ret = usb_desc_config(dev->device->confs + index, buf, sizeof(buf)); ++ ret = usb_desc_config(dev->device->confs + index, flags, ++ buf, sizeof(buf)); + } + trace_usb_desc_config(dev->addr, index, len, ret); + break; +@@ -532,7 +557,6 @@ int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len + ret = usb_desc_string(dev, index, buf, sizeof(buf)); + trace_usb_desc_string(dev->addr, index, len, ret); + break; +- + case USB_DT_DEVICE_QUALIFIER: + if (other_dev != NULL) { + ret = usb_desc_device_qualifier(other_dev, buf, sizeof(buf)); +@@ -541,7 +565,8 @@ int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len + break; + case USB_DT_OTHER_SPEED_CONFIG: + if (other_dev != NULL && index < other_dev->bNumConfigurations) { +- ret = usb_desc_config(other_dev->confs + index, buf, sizeof(buf)); ++ ret = usb_desc_config(other_dev->confs + index, flags, ++ buf, sizeof(buf)); + buf[0x01] = USB_DT_OTHER_SPEED_CONFIG; + } + trace_usb_desc_other_speed_config(dev->addr, index, len, ret); +diff --git a/hw/usb/desc.h b/hw/usb/desc.h +index d89fa41..4b5e88d 100644 +--- a/hw/usb/desc.h ++++ b/hw/usb/desc.h +@@ -63,6 +63,12 @@ typedef struct USBDescriptor { + uint8_t bRefresh; /* only audio ep */ + uint8_t bSynchAddress; /* only audio ep */ + } endpoint; ++ struct { ++ uint8_t bMaxBurst; ++ uint8_t bmAttributes; ++ uint8_t wBytesPerInterval_lo; ++ uint8_t wBytesPerInterval_hi; ++ } super_endpoint; + } u; + } QEMU_PACKED USBDescriptor; + +@@ -139,6 +145,11 @@ struct USBDescEndpoint { + + uint8_t is_audio; /* has bRefresh + bSynchAddress */ + uint8_t *extra; ++ ++ /* superspeed endpoint companion */ ++ uint8_t bMaxBurst; ++ uint8_t bmAttributes_super; ++ uint16_t wBytesPerInterval; + }; + + struct USBDescOther { +@@ -156,16 +167,21 @@ struct USBDesc { + const char* const *str; + }; + ++#define USB_DESC_FLAG_SUPER (1 << 1) ++ + /* generate usb packages from structs */ + int usb_desc_device(const USBDescID *id, const USBDescDevice *dev, + uint8_t *dest, size_t len); + int usb_desc_device_qualifier(const USBDescDevice *dev, + uint8_t *dest, size_t len); +-int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len); +-int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest, +- size_t len); +-int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len); +-int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len); ++int usb_desc_config(const USBDescConfig *conf, int flags, ++ uint8_t *dest, size_t len); ++int usb_desc_iface_group(const USBDescIfaceAssoc *iad, int flags, ++ uint8_t *dest, size_t len); ++int usb_desc_iface(const USBDescIface *iface, int flags, ++ uint8_t *dest, size_t len); ++int usb_desc_endpoint(const USBDescEndpoint *ep, int flags, ++ uint8_t *dest, size_t len); + int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len); + + /* control message emulation helpers */ +-- +1.7.12.1 + diff --git a/0614-usb3-bos-decriptor.patch b/0614-usb3-bos-decriptor.patch new file mode 100644 index 0000000..99d4f81 --- /dev/null +++ b/0614-usb3-bos-decriptor.patch @@ -0,0 +1,215 @@ +From 2014680cdc2834fef9b4cee5e1239f22d8dbdba3 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 28 Aug 2012 17:46:29 +0200 +Subject: [PATCH] usb3: bos decriptor + +Add support for creating BOS descriptor and +device cappability descriptors. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb.h | 6 ++++ + hw/usb/desc.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + hw/usb/desc.h | 25 ++++++++++++++ + trace-events | 1 + + 4 files changed, 141 insertions(+) + +diff --git a/hw/usb.h b/hw/usb.h +index 78ffdf4..48c8926 100644 +--- a/hw/usb.h ++++ b/hw/usb.h +@@ -135,10 +135,16 @@ + #define USB_DT_OTHER_SPEED_CONFIG 0x07 + #define USB_DT_DEBUG 0x0A + #define USB_DT_INTERFACE_ASSOC 0x0B ++#define USB_DT_BOS 0x0F ++#define USB_DT_DEVICE_CAPABILITY 0x10 + #define USB_DT_CS_INTERFACE 0x24 + #define USB_DT_CS_ENDPOINT 0x25 + #define USB_DT_ENDPOINT_COMPANION 0x30 + ++#define USB_DEV_CAP_WIRELESS 0x01 ++#define USB_DEV_CAP_USB2_EXT 0x02 ++#define USB_DEV_CAP_SUPERSPEED 0x03 ++ + #define USB_ENDPOINT_XFER_CONTROL 0 + #define USB_ENDPOINT_XFER_ISOC 1 + #define USB_ENDPOINT_XFER_BULK 2 +diff --git a/hw/usb/desc.c b/hw/usb/desc.c +index 8f5a8e5..1f12eae 100644 +--- a/hw/usb/desc.c ++++ b/hw/usb/desc.c +@@ -258,6 +258,111 @@ int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len) + return bLength; + } + ++static int usb_desc_cap_usb2_ext(const USBDesc *desc, uint8_t *dest, size_t len) ++{ ++ uint8_t bLength = 0x07; ++ USBDescriptor *d = (void *)dest; ++ ++ if (len < bLength) { ++ return -1; ++ } ++ ++ d->bLength = bLength; ++ d->bDescriptorType = USB_DT_DEVICE_CAPABILITY; ++ d->u.cap.bDevCapabilityType = USB_DEV_CAP_USB2_EXT; ++ ++ d->u.cap.u.usb2_ext.bmAttributes_1 = (1 << 1); /* LPM */ ++ d->u.cap.u.usb2_ext.bmAttributes_2 = 0; ++ d->u.cap.u.usb2_ext.bmAttributes_3 = 0; ++ d->u.cap.u.usb2_ext.bmAttributes_4 = 0; ++ ++ return bLength; ++} ++ ++static int usb_desc_cap_super(const USBDesc *desc, uint8_t *dest, size_t len) ++{ ++ uint8_t bLength = 0x0a; ++ USBDescriptor *d = (void *)dest; ++ ++ if (len < bLength) { ++ return -1; ++ } ++ ++ d->bLength = bLength; ++ d->bDescriptorType = USB_DT_DEVICE_CAPABILITY; ++ d->u.cap.bDevCapabilityType = USB_DEV_CAP_SUPERSPEED; ++ ++ d->u.cap.u.super.bmAttributes = 0; ++ d->u.cap.u.super.wSpeedsSupported_lo = 0; ++ d->u.cap.u.super.wSpeedsSupported_hi = 0; ++ d->u.cap.u.super.bFunctionalitySupport = 0; ++ d->u.cap.u.super.bU1DevExitLat = 0x0a; ++ d->u.cap.u.super.wU2DevExitLat_lo = 0x20; ++ d->u.cap.u.super.wU2DevExitLat_hi = 0; ++ ++ if (desc->full) { ++ d->u.cap.u.super.wSpeedsSupported_lo |= (1 << 1); ++ d->u.cap.u.super.bFunctionalitySupport = 1; ++ } ++ if (desc->high) { ++ d->u.cap.u.super.wSpeedsSupported_lo |= (1 << 2); ++ if (!d->u.cap.u.super.bFunctionalitySupport) { ++ d->u.cap.u.super.bFunctionalitySupport = 2; ++ } ++ } ++ if (desc->super) { ++ d->u.cap.u.super.wSpeedsSupported_lo |= (1 << 3); ++ if (!d->u.cap.u.super.bFunctionalitySupport) { ++ d->u.cap.u.super.bFunctionalitySupport = 3; ++ } ++ } ++ ++ return bLength; ++} ++ ++static int usb_desc_bos(const USBDesc *desc, uint8_t *dest, size_t len) ++{ ++ uint8_t bLength = 0x05; ++ uint16_t wTotalLength = 0; ++ uint8_t bNumDeviceCaps = 0; ++ USBDescriptor *d = (void *)dest; ++ int rc; ++ ++ if (len < bLength) { ++ return -1; ++ } ++ ++ d->bLength = bLength; ++ d->bDescriptorType = USB_DT_BOS; ++ ++ wTotalLength += bLength; ++ ++ if (desc->high != NULL) { ++ rc = usb_desc_cap_usb2_ext(desc, dest + wTotalLength, ++ len - wTotalLength); ++ if (rc < 0) { ++ return rc; ++ } ++ wTotalLength += rc; ++ bNumDeviceCaps++; ++ } ++ ++ if (desc->super != NULL) { ++ rc = usb_desc_cap_super(desc, dest + wTotalLength, ++ len - wTotalLength); ++ if (rc < 0) { ++ return rc; ++ } ++ wTotalLength += rc; ++ bNumDeviceCaps++; ++ } ++ ++ d->u.bos.wTotalLength_lo = usb_lo(wTotalLength); ++ d->u.bos.wTotalLength_hi = usb_hi(wTotalLength); ++ d->u.bos.bNumDeviceCaps = bNumDeviceCaps; ++ return wTotalLength; ++} ++ + /* ------------------------------------------------------------------ */ + + static void usb_desc_ep_init(USBDevice *dev) +@@ -571,6 +676,10 @@ int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len + } + trace_usb_desc_other_speed_config(dev->addr, index, len, ret); + break; ++ case USB_DT_BOS: ++ ret = usb_desc_bos(desc, buf, sizeof(buf)); ++ trace_usb_desc_bos(dev->addr, len, ret); ++ break; + + case USB_DT_DEBUG: + /* ignore silently */ +diff --git a/hw/usb/desc.h b/hw/usb/desc.h +index 4b5e88d..68bb570 100644 +--- a/hw/usb/desc.h ++++ b/hw/usb/desc.h +@@ -69,6 +69,31 @@ typedef struct USBDescriptor { + uint8_t wBytesPerInterval_lo; + uint8_t wBytesPerInterval_hi; + } super_endpoint; ++ struct { ++ uint8_t wTotalLength_lo; ++ uint8_t wTotalLength_hi; ++ uint8_t bNumDeviceCaps; ++ } bos; ++ struct { ++ uint8_t bDevCapabilityType; ++ union { ++ struct { ++ uint8_t bmAttributes_1; ++ uint8_t bmAttributes_2; ++ uint8_t bmAttributes_3; ++ uint8_t bmAttributes_4; ++ } usb2_ext; ++ struct { ++ uint8_t bmAttributes; ++ uint8_t wSpeedsSupported_lo; ++ uint8_t wSpeedsSupported_hi; ++ uint8_t bFunctionalitySupport; ++ uint8_t bU1DevExitLat; ++ uint8_t wU2DevExitLat_lo; ++ uint8_t wU2DevExitLat_hi; ++ } super; ++ } u; ++ } cap; + } u; + } QEMU_PACKED USBDescriptor; + +diff --git a/trace-events b/trace-events +index 2db1deb..d941e78 100644 +--- a/trace-events ++++ b/trace-events +@@ -343,6 +343,7 @@ usb_desc_device_qualifier(int addr, int len, int ret) "dev %d query device quali + usb_desc_config(int addr, int index, int len, int ret) "dev %d query config %d, len %d, ret %d" + usb_desc_other_speed_config(int addr, int index, int len, int ret) "dev %d query config %d, len %d, ret %d" + usb_desc_string(int addr, int index, int len, int ret) "dev %d query string %d, len %d, ret %d" ++usb_desc_bos(int addr, int len, int ret) "dev %d bos, len %d, ret %d" + usb_set_addr(int addr) "dev %d" + usb_set_config(int addr, int config, int ret) "dev %d, config %d, ret %d" + usb_set_interface(int addr, int iface, int alt, int ret) "dev %d, interface %d, altsetting %d, ret %d" +-- +1.7.12.1 + diff --git a/0615-usb-storage-usb3-support.patch b/0615-usb-storage-usb3-support.patch new file mode 100644 index 0000000..7caeb42 --- /dev/null +++ b/0615-usb-storage-usb3-support.patch @@ -0,0 +1,94 @@ +From 9a6fd10bf6a85c4df63a7ba1cf7d6203220d722e Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 28 Aug 2012 17:29:15 +0200 +Subject: [PATCH] usb-storage: usb3 support + +Add usb3 descriptors to usb-storage, so it shows up as superspeed +device when connected to xhci. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/dev-storage.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 43 insertions(+), 3 deletions(-) + +diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c +index ff48d91..e732191 100644 +--- a/hw/usb/dev-storage.c ++++ b/hw/usb/dev-storage.c +@@ -78,6 +78,7 @@ enum { + STR_SERIALNUMBER, + STR_CONFIG_FULL, + STR_CONFIG_HIGH, ++ STR_CONFIG_SUPER, + }; + + static const USBDescStrings desc_strings = { +@@ -86,6 +87,7 @@ static const USBDescStrings desc_strings = { + [STR_SERIALNUMBER] = "1", + [STR_CONFIG_FULL] = "Full speed config (usb 1.1)", + [STR_CONFIG_HIGH] = "High speed config (usb 2.0)", ++ [STR_CONFIG_SUPER] = "Super speed config (usb 3.0)", + }; + + static const USBDescIface desc_iface_full = { +@@ -158,6 +160,43 @@ static const USBDescDevice desc_device_high = { + }, + }; + ++static const USBDescIface desc_iface_super = { ++ .bInterfaceNumber = 0, ++ .bNumEndpoints = 2, ++ .bInterfaceClass = USB_CLASS_MASS_STORAGE, ++ .bInterfaceSubClass = 0x06, /* SCSI */ ++ .bInterfaceProtocol = 0x50, /* Bulk */ ++ .eps = (USBDescEndpoint[]) { ++ { ++ .bEndpointAddress = USB_DIR_IN | 0x01, ++ .bmAttributes = USB_ENDPOINT_XFER_BULK, ++ .wMaxPacketSize = 1024, ++ .bMaxBurst = 15, ++ },{ ++ .bEndpointAddress = USB_DIR_OUT | 0x02, ++ .bmAttributes = USB_ENDPOINT_XFER_BULK, ++ .wMaxPacketSize = 1024, ++ .bMaxBurst = 15, ++ }, ++ } ++}; ++ ++static const USBDescDevice desc_device_super = { ++ .bcdUSB = 0x0300, ++ .bMaxPacketSize0 = 9, ++ .bNumConfigurations = 1, ++ .confs = (USBDescConfig[]) { ++ { ++ .bNumInterfaces = 1, ++ .bConfigurationValue = 1, ++ .iConfiguration = STR_CONFIG_SUPER, ++ .bmAttributes = 0xc0, ++ .nif = 1, ++ .ifs = &desc_iface_super, ++ }, ++ }, ++}; ++ + static const USBDesc desc = { + .id = { + .idVendor = 0x46f4, /* CRC16() of "QEMU" */ +@@ -167,9 +206,10 @@ static const USBDesc desc = { + .iProduct = STR_PRODUCT, + .iSerialNumber = STR_SERIALNUMBER, + }, +- .full = &desc_device_full, +- .high = &desc_device_high, +- .str = desc_strings, ++ .full = &desc_device_full, ++ .high = &desc_device_high, ++ .super = &desc_device_super, ++ .str = desc_strings, + }; + + static void usb_msd_copy_data(MSDState *s, USBPacket *p) +-- +1.7.12.1 + diff --git a/0616-xhci-fix-cleanup-msi.patch b/0616-xhci-fix-cleanup-msi.patch new file mode 100644 index 0000000..33fca14 --- /dev/null +++ b/0616-xhci-fix-cleanup-msi.patch @@ -0,0 +1,96 @@ +From e97e63460859a74cf53c85e97a6d60633a92cc64 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 30 Aug 2012 10:57:12 +0200 +Subject: [PATCH] xhci: fix & cleanup msi. + +Drop custom write_config function which isn't needed any more. +Make the msi property a bit property so it accepts 'on' & 'off'. +Enable MSI by default. + +TODO: add compat property to disable on old machine types. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 27 +++++++++------------------ + 1 file changed, 9 insertions(+), 18 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 5813b4a..d2e6ee6 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -386,7 +386,7 @@ struct XHCIState { + /* properties */ + uint32_t numports_2; + uint32_t numports_3; +- uint32_t msi; ++ uint32_t flags; + + /* Operational Registers */ + uint32_t usbcmd; +@@ -435,6 +435,10 @@ typedef struct XHCIEvRingSeg { + uint32_t rsvd; + } XHCIEvRingSeg; + ++enum xhci_flags { ++ XHCI_FLAG_USE_MSI = 1, ++}; ++ + static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, + unsigned int epid); + static void xhci_event(XHCIState *xhci, XHCIEvent *event); +@@ -617,7 +621,7 @@ static void xhci_irq_update(XHCIState *xhci) + level = 1; + } + +- if (xhci->msi && msi_enabled(&xhci->pci_dev)) { ++ if (msi_enabled(&xhci->pci_dev)) { + if (level) { + trace_usb_xhci_irq_msi(0); + msi_notify(&xhci->pci_dev, 0); +@@ -2859,32 +2863,20 @@ static int usb_xhci_initfn(struct PCIDevice *dev) + ret = pcie_cap_init(&xhci->pci_dev, 0xa0, PCI_EXP_TYPE_ENDPOINT, 0); + assert(ret >= 0); + +- if (xhci->msi) { +- ret = msi_init(&xhci->pci_dev, 0x70, 1, true, false); +- assert(ret >= 0); ++ if (xhci->flags & (1 << XHCI_FLAG_USE_MSI)) { ++ msi_init(&xhci->pci_dev, 0x70, MAXINTRS, true, false); + } + + return 0; + } + +-static void xhci_write_config(PCIDevice *dev, uint32_t addr, uint32_t val, +- int len) +-{ +- XHCIState *xhci = DO_UPCAST(XHCIState, pci_dev, dev); +- +- pci_default_write_config(dev, addr, val, len); +- if (xhci->msi) { +- msi_write_config(dev, addr, val, len); +- } +-} +- + static const VMStateDescription vmstate_xhci = { + .name = "xhci", + .unmigratable = 1, + }; + + static Property xhci_properties[] = { +- DEFINE_PROP_UINT32("msi", XHCIState, msi, 0), ++ DEFINE_PROP_BIT("msi", XHCIState, flags, XHCI_FLAG_USE_MSI, true), + DEFINE_PROP_UINT32("p2", XHCIState, numports_2, 4), + DEFINE_PROP_UINT32("p3", XHCIState, numports_3, 4), + DEFINE_PROP_END_OF_LIST(), +@@ -2904,7 +2896,6 @@ static void xhci_class_init(ObjectClass *klass, void *data) + k->class_id = PCI_CLASS_SERIAL_USB; + k->revision = 0x03; + k->is_express = 1; +- k->config_write = xhci_write_config; + } + + static TypeInfo xhci_info = { +-- +1.7.12.1 + diff --git a/0617-xhci-rework-interrupt-handling.patch b/0617-xhci-rework-interrupt-handling.patch new file mode 100644 index 0000000..3ac4ccc --- /dev/null +++ b/0617-xhci-rework-interrupt-handling.patch @@ -0,0 +1,117 @@ +From 3bf435b656390f75ce8b8990f7484efb162472c9 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 30 Aug 2012 13:05:10 +0200 +Subject: [PATCH] xhci: rework interrupt handling + +Split xhci_irq_update into a function which handles intx updates +(including lowering the irq line once the guests acks the interrupt) +and one which is used for raising an irq only. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 47 +++++++++++++++++++++++++++++++++-------------- + 1 file changed, 33 insertions(+), 14 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index d2e6ee6..1857f42 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -612,24 +612,43 @@ static XHCIPort *xhci_lookup_port(XHCIState *xhci, struct USBPort *uport) + return &xhci->ports[index]; + } + +-static void xhci_irq_update(XHCIState *xhci) ++static void xhci_intx_update(XHCIState *xhci) + { + int level = 0; + +- if (xhci->iman & IMAN_IP && xhci->iman & IMAN_IE && ++ if (msi_enabled(&xhci->pci_dev)) { ++ return; ++ } ++ ++ if (xhci->iman & IMAN_IP && ++ xhci->iman & IMAN_IE && + xhci->usbcmd & USBCMD_INTE) { + level = 1; + } + ++ trace_usb_xhci_irq_intx(level); ++ qemu_set_irq(xhci->irq, level); ++} ++ ++static void xhci_intr_raise(XHCIState *xhci) ++{ ++ if (!(xhci->iman & IMAN_IP) || ++ !(xhci->iman & IMAN_IE)) { ++ return; ++ } ++ ++ if (!(xhci->usbcmd & USBCMD_INTE)) { ++ return; ++ } ++ + if (msi_enabled(&xhci->pci_dev)) { +- if (level) { +- trace_usb_xhci_irq_msi(0); +- msi_notify(&xhci->pci_dev, 0); +- } +- } else { +- trace_usb_xhci_irq_intx(level); +- qemu_set_irq(xhci->irq, level); ++ trace_usb_xhci_irq_msi(0); ++ msi_notify(&xhci->pci_dev, 0); ++ return; + } ++ ++ trace_usb_xhci_irq_intx(1); ++ qemu_set_irq(xhci->irq, 1); + } + + static inline int xhci_running(XHCIState *xhci) +@@ -732,7 +751,7 @@ static void xhci_events_update(XHCIState *xhci) + xhci->erdp_low |= ERDP_EHB; + xhci->iman |= IMAN_IP; + xhci->usbsts |= USBSTS_EINT; +- xhci_irq_update(xhci); ++ xhci_intr_raise(xhci); + } + + if (xhci->er_full && xhci->ev_buffer_put == xhci->ev_buffer_get) { +@@ -796,7 +815,7 @@ static void xhci_event(XHCIState *xhci, XHCIEvent *event) + xhci->iman |= IMAN_IP; + xhci->usbsts |= USBSTS_EINT; + +- xhci_irq_update(xhci); ++ xhci_intr_raise(xhci); + } + + static void xhci_ring_init(XHCIState *xhci, XHCIRing *ring, +@@ -2479,13 +2498,13 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val) + if (val & USBCMD_HCRST) { + xhci_reset(&xhci->pci_dev.qdev); + } +- xhci_irq_update(xhci); ++ xhci_intx_update(xhci); + break; + + case 0x04: /* USBSTS */ + /* these bits are write-1-to-clear */ + xhci->usbsts &= ~(val & (USBSTS_HSE|USBSTS_EINT|USBSTS_PCD|USBSTS_SRE)); +- xhci_irq_update(xhci); ++ xhci_intx_update(xhci); + break; + + case 0x14: /* DNCTRL */ +@@ -2570,7 +2589,7 @@ static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val) + } + xhci->iman &= ~IMAN_IE; + xhci->iman |= val & IMAN_IE; +- xhci_irq_update(xhci); ++ xhci_intx_update(xhci); + break; + case 0x24: /* IMOD */ + xhci->imod = val; +-- +1.7.12.1 + diff --git a/0618-xhci-add-msix-support.patch b/0618-xhci-add-msix-support.patch new file mode 100644 index 0000000..ab0abab --- /dev/null +++ b/0618-xhci-add-msix-support.patch @@ -0,0 +1,156 @@ +From b04ba21e22b2df805af8236bc462c5c403fc6ee4 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 30 Aug 2012 12:06:59 +0200 +Subject: [PATCH] xhci: add msix support + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- + trace-events | 3 +++ + 2 files changed, 49 insertions(+), 1 deletion(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 1857f42..777f903 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -23,6 +23,7 @@ + #include "hw/usb.h" + #include "hw/pci.h" + #include "hw/msi.h" ++#include "hw/msix.h" + #include "trace.h" + + //#define DEBUG_XHCI +@@ -59,6 +60,8 @@ + #define OFF_OPER LEN_CAP + #define OFF_RUNTIME 0x1000 + #define OFF_DOORBELL 0x2000 ++#define OFF_MSIX_TABLE 0x3000 ++#define OFF_MSIX_PBA 0x3800 + /* must be power of 2 */ + #define LEN_REGS 0x4000 + +@@ -411,6 +414,7 @@ struct XHCIState { + uint32_t erstba_high; + uint32_t erdp_low; + uint32_t erdp_high; ++ bool msix_used; + + int64_t mfindex_start; + QEMUTimer *mfwrap_timer; +@@ -437,6 +441,7 @@ typedef struct XHCIEvRingSeg { + + enum xhci_flags { + XHCI_FLAG_USE_MSI = 1, ++ XHCI_FLAG_USE_MSI_X, + }; + + static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, +@@ -616,7 +621,8 @@ static void xhci_intx_update(XHCIState *xhci) + { + int level = 0; + +- if (msi_enabled(&xhci->pci_dev)) { ++ if (msix_enabled(&xhci->pci_dev) || ++ msi_enabled(&xhci->pci_dev)) { + return; + } + +@@ -630,6 +636,30 @@ static void xhci_intx_update(XHCIState *xhci) + qemu_set_irq(xhci->irq, level); + } + ++static void xhci_msix_update(XHCIState *xhci) ++{ ++ bool enabled; ++ ++ if (!msix_enabled(&xhci->pci_dev)) { ++ return; ++ } ++ ++ enabled = xhci->iman & IMAN_IE; ++ if (enabled == xhci->msix_used) { ++ return; ++ } ++ ++ if (enabled) { ++ trace_usb_xhci_irq_msix_use(0); ++ msix_vector_use(&xhci->pci_dev, 0); ++ xhci->msix_used = true; ++ } else { ++ trace_usb_xhci_irq_msix_unuse(0); ++ msix_vector_unuse(&xhci->pci_dev, 0); ++ xhci->msix_used = false; ++ } ++} ++ + static void xhci_intr_raise(XHCIState *xhci) + { + if (!(xhci->iman & IMAN_IP) || +@@ -641,6 +671,12 @@ static void xhci_intr_raise(XHCIState *xhci) + return; + } + ++ if (msix_enabled(&xhci->pci_dev)) { ++ trace_usb_xhci_irq_msix(0); ++ msix_notify(&xhci->pci_dev, 0); ++ return; ++ } ++ + if (msi_enabled(&xhci->pci_dev)) { + trace_usb_xhci_irq_msi(0); + msi_notify(&xhci->pci_dev, 0); +@@ -2282,6 +2318,7 @@ static void xhci_reset(DeviceState *dev) + xhci->erstba_high = 0; + xhci->erdp_low = 0; + xhci->erdp_high = 0; ++ xhci->msix_used = 0; + + xhci->er_ep_idx = 0; + xhci->er_pcs = 1; +@@ -2590,6 +2627,7 @@ static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val) + xhci->iman &= ~IMAN_IE; + xhci->iman |= val & IMAN_IE; + xhci_intx_update(xhci); ++ xhci_msix_update(xhci); + break; + case 0x24: /* IMOD */ + xhci->imod = val; +@@ -2885,6 +2923,12 @@ static int usb_xhci_initfn(struct PCIDevice *dev) + if (xhci->flags & (1 << XHCI_FLAG_USE_MSI)) { + msi_init(&xhci->pci_dev, 0x70, MAXINTRS, true, false); + } ++ if (xhci->flags & (1 << XHCI_FLAG_USE_MSI_X)) { ++ msix_init(&xhci->pci_dev, MAXINTRS, ++ &xhci->mem, 0, OFF_MSIX_TABLE, ++ &xhci->mem, 0, OFF_MSIX_PBA, ++ 0x90); ++ } + + return 0; + } +@@ -2896,6 +2940,7 @@ static const VMStateDescription vmstate_xhci = { + + static Property xhci_properties[] = { + DEFINE_PROP_BIT("msi", XHCIState, flags, XHCI_FLAG_USE_MSI, true), ++ DEFINE_PROP_BIT("msix", XHCIState, flags, XHCI_FLAG_USE_MSI_X, true), + DEFINE_PROP_UINT32("p2", XHCIState, numports_2, 4), + DEFINE_PROP_UINT32("p3", XHCIState, numports_3, 4), + DEFINE_PROP_END_OF_LIST(), +diff --git a/trace-events b/trace-events +index d941e78..f86bbda 100644 +--- a/trace-events ++++ b/trace-events +@@ -316,6 +316,9 @@ usb_xhci_runtime_write(uint32_t off, uint32_t val) "off 0x%04x, val 0x%08x" + usb_xhci_doorbell_write(uint32_t off, uint32_t val) "off 0x%04x, val 0x%08x" + usb_xhci_irq_intx(uint32_t level) "level %d" + usb_xhci_irq_msi(uint32_t nr) "nr %d" ++usb_xhci_irq_msix(uint32_t nr) "nr %d" ++usb_xhci_irq_msix_use(uint32_t nr) "nr %d" ++usb_xhci_irq_msix_unuse(uint32_t nr) "nr %d" + usb_xhci_queue_event(uint32_t idx, const char *trb, const char *evt, uint64_t param, uint32_t status, uint32_t control) "idx %d, %s, %s, p %016" PRIx64 ", s %08x, c 0x%08x" + usb_xhci_fetch_trb(uint64_t addr, const char *name, uint64_t param, uint32_t status, uint32_t control) "addr %016" PRIx64 ", %s, p %016" PRIx64 ", s %08x, c 0x%08x" + usb_xhci_slot_enable(uint32_t slotid) "slotid %d" +-- +1.7.12.1 + diff --git a/0619-xhci-move-register-update-into-xhci_intr_raise.patch b/0619-xhci-move-register-update-into-xhci_intr_raise.patch new file mode 100644 index 0000000..f89d2a2 --- /dev/null +++ b/0619-xhci-move-register-update-into-xhci_intr_raise.patch @@ -0,0 +1,55 @@ +From be996e1a852397f4009d08ac803081e1dfbc7326 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 30 Aug 2012 14:04:04 +0200 +Subject: [PATCH] xhci: move register update into xhci_intr_raise + +Now that we have a separate function to raise an IRQ we can move +some comon code into the function. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 777f903..32d22f7 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -662,8 +662,11 @@ static void xhci_msix_update(XHCIState *xhci) + + static void xhci_intr_raise(XHCIState *xhci) + { +- if (!(xhci->iman & IMAN_IP) || +- !(xhci->iman & IMAN_IE)) { ++ xhci->erdp_low |= ERDP_EHB; ++ xhci->iman |= IMAN_IP; ++ xhci->usbsts |= USBSTS_EINT; ++ ++ if (!(xhci->iman & IMAN_IE)) { + return; + } + +@@ -784,9 +787,6 @@ static void xhci_events_update(XHCIState *xhci) + } + + if (do_irq) { +- xhci->erdp_low |= ERDP_EHB; +- xhci->iman |= IMAN_IP; +- xhci->usbsts |= USBSTS_EINT; + xhci_intr_raise(xhci); + } + +@@ -847,10 +847,6 @@ static void xhci_event(XHCIState *xhci, XHCIEvent *event) + xhci_write_event(xhci, event); + } + +- xhci->erdp_low |= ERDP_EHB; +- xhci->iman |= IMAN_IP; +- xhci->usbsts |= USBSTS_EINT; +- + xhci_intr_raise(xhci); + } + +-- +1.7.12.1 + diff --git a/0620-xhci-add-XHCIInterrupter.patch b/0620-xhci-add-XHCIInterrupter.patch new file mode 100644 index 0000000..2992970 --- /dev/null +++ b/0620-xhci-add-XHCIInterrupter.patch @@ -0,0 +1,642 @@ +From 40ddf0dafd6a8171d2a0f960a21d7d99bdf73cd6 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 30 Aug 2012 15:49:03 +0200 +Subject: [PATCH] xhci: add XHCIInterrupter + +Move all state belonging to the (single) interrupter into a separate +struct. First step in adding support for multiple interrupters. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 307 ++++++++++++++++++++++++++++-------------------------- + trace-events | 2 +- + 2 files changed, 161 insertions(+), 148 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 32d22f7..8a14ee8 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -378,6 +378,27 @@ typedef struct XHCIEvent { + uint8_t epid; + } XHCIEvent; + ++typedef struct XHCIInterrupter { ++ uint32_t iman; ++ uint32_t imod; ++ uint32_t erstsz; ++ uint32_t erstba_low; ++ uint32_t erstba_high; ++ uint32_t erdp_low; ++ uint32_t erdp_high; ++ ++ bool msix_used, er_pcs, er_full; ++ ++ dma_addr_t er_start; ++ uint32_t er_size; ++ unsigned int er_ep_idx; ++ ++ XHCIEvent ev_buffer[EV_QUEUE]; ++ unsigned int ev_buffer_put; ++ unsigned int ev_buffer_get; ++ ++} XHCIInterrupter; ++ + struct XHCIState { + PCIDevice pci_dev; + USBBus bus; +@@ -407,27 +428,9 @@ struct XHCIState { + uint32_t numports; + + /* Runtime Registers */ +- uint32_t iman; +- uint32_t imod; +- uint32_t erstsz; +- uint32_t erstba_low; +- uint32_t erstba_high; +- uint32_t erdp_low; +- uint32_t erdp_high; +- bool msix_used; +- + int64_t mfindex_start; + QEMUTimer *mfwrap_timer; +- +- dma_addr_t er_start; +- uint32_t er_size; +- bool er_pcs; +- unsigned int er_ep_idx; +- bool er_full; +- +- XHCIEvent ev_buffer[EV_QUEUE]; +- unsigned int ev_buffer_put; +- unsigned int ev_buffer_get; ++ XHCIInterrupter intr[MAXINTRS]; + + XHCIRing cmd_ring; + }; +@@ -446,8 +449,8 @@ enum xhci_flags { + + static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, + unsigned int epid); +-static void xhci_event(XHCIState *xhci, XHCIEvent *event); +-static void xhci_write_event(XHCIState *xhci, XHCIEvent *event); ++static void xhci_event(XHCIState *xhci, XHCIEvent *event, int v); ++static void xhci_write_event(XHCIState *xhci, XHCIEvent *event, int v); + + static const char *TRBType_names[] = { + [TRB_RESERVED] = "TRB_RESERVED", +@@ -573,7 +576,7 @@ static void xhci_mfwrap_timer(void *opaque) + XHCIState *xhci = opaque; + XHCIEvent wrap = { ER_MFINDEX_WRAP, CC_SUCCESS }; + +- xhci_event(xhci, &wrap); ++ xhci_event(xhci, &wrap, 0); + xhci_mfwrap_update(xhci); + } + +@@ -626,8 +629,8 @@ static void xhci_intx_update(XHCIState *xhci) + return; + } + +- if (xhci->iman & IMAN_IP && +- xhci->iman & IMAN_IE && ++ if (xhci->intr[0].iman & IMAN_IP && ++ xhci->intr[0].iman & IMAN_IE && + xhci->usbcmd & USBCMD_INTE) { + level = 1; + } +@@ -636,7 +639,7 @@ static void xhci_intx_update(XHCIState *xhci) + qemu_set_irq(xhci->irq, level); + } + +-static void xhci_msix_update(XHCIState *xhci) ++static void xhci_msix_update(XHCIState *xhci, int v) + { + bool enabled; + +@@ -644,29 +647,29 @@ static void xhci_msix_update(XHCIState *xhci) + return; + } + +- enabled = xhci->iman & IMAN_IE; +- if (enabled == xhci->msix_used) { ++ enabled = xhci->intr[v].iman & IMAN_IE; ++ if (enabled == xhci->intr[v].msix_used) { + return; + } + + if (enabled) { +- trace_usb_xhci_irq_msix_use(0); +- msix_vector_use(&xhci->pci_dev, 0); +- xhci->msix_used = true; ++ trace_usb_xhci_irq_msix_use(v); ++ msix_vector_use(&xhci->pci_dev, v); ++ xhci->intr[v].msix_used = true; + } else { +- trace_usb_xhci_irq_msix_unuse(0); +- msix_vector_unuse(&xhci->pci_dev, 0); +- xhci->msix_used = false; ++ trace_usb_xhci_irq_msix_unuse(v); ++ msix_vector_unuse(&xhci->pci_dev, v); ++ xhci->intr[v].msix_used = false; + } + } + +-static void xhci_intr_raise(XHCIState *xhci) ++static void xhci_intr_raise(XHCIState *xhci, int v) + { +- xhci->erdp_low |= ERDP_EHB; +- xhci->iman |= IMAN_IP; ++ xhci->intr[v].erdp_low |= ERDP_EHB; ++ xhci->intr[v].iman |= IMAN_IP; + xhci->usbsts |= USBSTS_EINT; + +- if (!(xhci->iman & IMAN_IE)) { ++ if (!(xhci->intr[v].iman & IMAN_IE)) { + return; + } + +@@ -675,24 +678,26 @@ static void xhci_intr_raise(XHCIState *xhci) + } + + if (msix_enabled(&xhci->pci_dev)) { +- trace_usb_xhci_irq_msix(0); +- msix_notify(&xhci->pci_dev, 0); ++ trace_usb_xhci_irq_msix(v); ++ msix_notify(&xhci->pci_dev, v); + return; + } + + if (msi_enabled(&xhci->pci_dev)) { +- trace_usb_xhci_irq_msi(0); +- msi_notify(&xhci->pci_dev, 0); ++ trace_usb_xhci_irq_msi(v); ++ msi_notify(&xhci->pci_dev, v); + return; + } + +- trace_usb_xhci_irq_intx(1); +- qemu_set_irq(xhci->irq, 1); ++ if (v == 0) { ++ trace_usb_xhci_irq_intx(1); ++ qemu_set_irq(xhci->irq, 1); ++ } + } + + static inline int xhci_running(XHCIState *xhci) + { +- return !(xhci->usbsts & USBSTS_HCH) && !xhci->er_full; ++ return !(xhci->usbsts & USBSTS_HCH) && !xhci->intr[0].er_full; + } + + static void xhci_die(XHCIState *xhci) +@@ -701,8 +706,9 @@ static void xhci_die(XHCIState *xhci) + fprintf(stderr, "xhci: asserted controller error\n"); + } + +-static void xhci_write_event(XHCIState *xhci, XHCIEvent *event) ++static void xhci_write_event(XHCIState *xhci, XHCIEvent *event, int v) + { ++ XHCIInterrupter *intr = &xhci->intr[v]; + XHCITRB ev_trb; + dma_addr_t addr; + +@@ -710,27 +716,28 @@ static void xhci_write_event(XHCIState *xhci, XHCIEvent *event) + ev_trb.status = cpu_to_le32(event->length | (event->ccode << 24)); + ev_trb.control = (event->slotid << 24) | (event->epid << 16) | + event->flags | (event->type << TRB_TYPE_SHIFT); +- if (xhci->er_pcs) { ++ if (intr->er_pcs) { + ev_trb.control |= TRB_C; + } + ev_trb.control = cpu_to_le32(ev_trb.control); + +- trace_usb_xhci_queue_event(xhci->er_ep_idx, trb_name(&ev_trb), ++ trace_usb_xhci_queue_event(v, intr->er_ep_idx, trb_name(&ev_trb), + event_name(event), ev_trb.parameter, + ev_trb.status, ev_trb.control); + +- addr = xhci->er_start + TRB_SIZE*xhci->er_ep_idx; ++ addr = intr->er_start + TRB_SIZE*intr->er_ep_idx; + pci_dma_write(&xhci->pci_dev, addr, &ev_trb, TRB_SIZE); + +- xhci->er_ep_idx++; +- if (xhci->er_ep_idx >= xhci->er_size) { +- xhci->er_ep_idx = 0; +- xhci->er_pcs = !xhci->er_pcs; ++ intr->er_ep_idx++; ++ if (intr->er_ep_idx >= intr->er_size) { ++ intr->er_ep_idx = 0; ++ intr->er_pcs = !intr->er_pcs; + } + } + +-static void xhci_events_update(XHCIState *xhci) ++static void xhci_events_update(XHCIState *xhci, int v) + { ++ XHCIInterrupter *intr = &xhci->intr[v]; + dma_addr_t erdp; + unsigned int dp_idx; + bool do_irq = 0; +@@ -739,115 +746,116 @@ static void xhci_events_update(XHCIState *xhci) + return; + } + +- erdp = xhci_addr64(xhci->erdp_low, xhci->erdp_high); +- if (erdp < xhci->er_start || +- erdp >= (xhci->er_start + TRB_SIZE*xhci->er_size)) { ++ erdp = xhci_addr64(intr->erdp_low, intr->erdp_high); ++ if (erdp < intr->er_start || ++ erdp >= (intr->er_start + TRB_SIZE*intr->er_size)) { + fprintf(stderr, "xhci: ERDP out of bounds: "DMA_ADDR_FMT"\n", erdp); +- fprintf(stderr, "xhci: ER at "DMA_ADDR_FMT" len %d\n", +- xhci->er_start, xhci->er_size); ++ fprintf(stderr, "xhci: ER[%d] at "DMA_ADDR_FMT" len %d\n", ++ v, intr->er_start, intr->er_size); + xhci_die(xhci); + return; + } +- dp_idx = (erdp - xhci->er_start) / TRB_SIZE; +- assert(dp_idx < xhci->er_size); ++ dp_idx = (erdp - intr->er_start) / TRB_SIZE; ++ assert(dp_idx < intr->er_size); + + /* NEC didn't read section 4.9.4 of the spec (v1.0 p139 top Note) and thus + * deadlocks when the ER is full. Hack it by holding off events until + * the driver decides to free at least half of the ring */ +- if (xhci->er_full) { +- int er_free = dp_idx - xhci->er_ep_idx; ++ if (intr->er_full) { ++ int er_free = dp_idx - intr->er_ep_idx; + if (er_free <= 0) { +- er_free += xhci->er_size; ++ er_free += intr->er_size; + } +- if (er_free < (xhci->er_size/2)) { ++ if (er_free < (intr->er_size/2)) { + DPRINTF("xhci_events_update(): event ring still " + "more than half full (hack)\n"); + return; + } + } + +- while (xhci->ev_buffer_put != xhci->ev_buffer_get) { +- assert(xhci->er_full); +- if (((xhci->er_ep_idx+1) % xhci->er_size) == dp_idx) { ++ while (intr->ev_buffer_put != intr->ev_buffer_get) { ++ assert(intr->er_full); ++ if (((intr->er_ep_idx+1) % intr->er_size) == dp_idx) { + DPRINTF("xhci_events_update(): event ring full again\n"); + #ifndef ER_FULL_HACK + XHCIEvent full = {ER_HOST_CONTROLLER, CC_EVENT_RING_FULL_ERROR}; +- xhci_write_event(xhci, &full); ++ xhci_write_event(xhci, &full, v); + #endif + do_irq = 1; + break; + } +- XHCIEvent *event = &xhci->ev_buffer[xhci->ev_buffer_get]; +- xhci_write_event(xhci, event); +- xhci->ev_buffer_get++; ++ XHCIEvent *event = &intr->ev_buffer[intr->ev_buffer_get]; ++ xhci_write_event(xhci, event, v); ++ intr->ev_buffer_get++; + do_irq = 1; +- if (xhci->ev_buffer_get == EV_QUEUE) { +- xhci->ev_buffer_get = 0; ++ if (intr->ev_buffer_get == EV_QUEUE) { ++ intr->ev_buffer_get = 0; + } + } + + if (do_irq) { +- xhci_intr_raise(xhci); ++ xhci_intr_raise(xhci, v); + } + +- if (xhci->er_full && xhci->ev_buffer_put == xhci->ev_buffer_get) { ++ if (intr->er_full && intr->ev_buffer_put == intr->ev_buffer_get) { + DPRINTF("xhci_events_update(): event ring no longer full\n"); +- xhci->er_full = 0; ++ intr->er_full = 0; + } + return; + } + +-static void xhci_event(XHCIState *xhci, XHCIEvent *event) ++static void xhci_event(XHCIState *xhci, XHCIEvent *event, int v) + { ++ XHCIInterrupter *intr = &xhci->intr[v]; + dma_addr_t erdp; + unsigned int dp_idx; + +- if (xhci->er_full) { ++ if (intr->er_full) { + DPRINTF("xhci_event(): ER full, queueing\n"); +- if (((xhci->ev_buffer_put+1) % EV_QUEUE) == xhci->ev_buffer_get) { ++ if (((intr->ev_buffer_put+1) % EV_QUEUE) == intr->ev_buffer_get) { + fprintf(stderr, "xhci: event queue full, dropping event!\n"); + return; + } +- xhci->ev_buffer[xhci->ev_buffer_put++] = *event; +- if (xhci->ev_buffer_put == EV_QUEUE) { +- xhci->ev_buffer_put = 0; ++ intr->ev_buffer[intr->ev_buffer_put++] = *event; ++ if (intr->ev_buffer_put == EV_QUEUE) { ++ intr->ev_buffer_put = 0; + } + return; + } + +- erdp = xhci_addr64(xhci->erdp_low, xhci->erdp_high); +- if (erdp < xhci->er_start || +- erdp >= (xhci->er_start + TRB_SIZE*xhci->er_size)) { ++ erdp = xhci_addr64(intr->erdp_low, intr->erdp_high); ++ if (erdp < intr->er_start || ++ erdp >= (intr->er_start + TRB_SIZE*intr->er_size)) { + fprintf(stderr, "xhci: ERDP out of bounds: "DMA_ADDR_FMT"\n", erdp); +- fprintf(stderr, "xhci: ER at "DMA_ADDR_FMT" len %d\n", +- xhci->er_start, xhci->er_size); ++ fprintf(stderr, "xhci: ER[%d] at "DMA_ADDR_FMT" len %d\n", ++ v, intr->er_start, intr->er_size); + xhci_die(xhci); + return; + } + +- dp_idx = (erdp - xhci->er_start) / TRB_SIZE; +- assert(dp_idx < xhci->er_size); ++ dp_idx = (erdp - intr->er_start) / TRB_SIZE; ++ assert(dp_idx < intr->er_size); + +- if ((xhci->er_ep_idx+1) % xhci->er_size == dp_idx) { ++ if ((intr->er_ep_idx+1) % intr->er_size == dp_idx) { + DPRINTF("xhci_event(): ER full, queueing\n"); + #ifndef ER_FULL_HACK + XHCIEvent full = {ER_HOST_CONTROLLER, CC_EVENT_RING_FULL_ERROR}; + xhci_write_event(xhci, &full); + #endif +- xhci->er_full = 1; +- if (((xhci->ev_buffer_put+1) % EV_QUEUE) == xhci->ev_buffer_get) { ++ intr->er_full = 1; ++ if (((intr->ev_buffer_put+1) % EV_QUEUE) == intr->ev_buffer_get) { + fprintf(stderr, "xhci: event queue full, dropping event!\n"); + return; + } +- xhci->ev_buffer[xhci->ev_buffer_put++] = *event; +- if (xhci->ev_buffer_put == EV_QUEUE) { +- xhci->ev_buffer_put = 0; ++ intr->ev_buffer[intr->ev_buffer_put++] = *event; ++ if (intr->ev_buffer_put == EV_QUEUE) { ++ intr->ev_buffer_put = 0; + } + } else { +- xhci_write_event(xhci, event); ++ xhci_write_event(xhci, event, v); + } + +- xhci_intr_raise(xhci); ++ xhci_intr_raise(xhci, v); + } + + static void xhci_ring_init(XHCIState *xhci, XHCIRing *ring, +@@ -939,17 +947,18 @@ static int xhci_ring_chain_length(XHCIState *xhci, const XHCIRing *ring) + } + } + +-static void xhci_er_reset(XHCIState *xhci) ++static void xhci_er_reset(XHCIState *xhci, int v) + { ++ XHCIInterrupter *intr = &xhci->intr[v]; + XHCIEvRingSeg seg; + + /* cache the (sole) event ring segment location */ +- if (xhci->erstsz != 1) { +- fprintf(stderr, "xhci: invalid value for ERSTSZ: %d\n", xhci->erstsz); ++ if (intr->erstsz != 1) { ++ fprintf(stderr, "xhci: invalid value for ERSTSZ: %d\n", intr->erstsz); + xhci_die(xhci); + return; + } +- dma_addr_t erstba = xhci_addr64(xhci->erstba_low, xhci->erstba_high); ++ dma_addr_t erstba = xhci_addr64(intr->erstba_low, intr->erstba_high); + pci_dma_read(&xhci->pci_dev, erstba, &seg, sizeof(seg)); + le32_to_cpus(&seg.addr_low); + le32_to_cpus(&seg.addr_high); +@@ -959,15 +968,15 @@ static void xhci_er_reset(XHCIState *xhci) + xhci_die(xhci); + return; + } +- xhci->er_start = xhci_addr64(seg.addr_low, seg.addr_high); +- xhci->er_size = seg.size; ++ intr->er_start = xhci_addr64(seg.addr_low, seg.addr_high); ++ intr->er_size = seg.size; + +- xhci->er_ep_idx = 0; +- xhci->er_pcs = 1; +- xhci->er_full = 0; ++ intr->er_ep_idx = 0; ++ intr->er_pcs = 1; ++ intr->er_full = 0; + +- DPRINTF("xhci: event ring:" DMA_ADDR_FMT " [%d]\n", +- xhci->er_start, xhci->er_size); ++ DPRINTF("xhci: event ring[%d]:" DMA_ADDR_FMT " [%d]\n", ++ v, intr->er_start, intr->er_size); + } + + static void xhci_run(XHCIState *xhci) +@@ -1368,7 +1377,7 @@ static void xhci_xfer_report(XHCITransfer *xfer) + DPRINTF("xhci_xfer_data: EDTLA=%d\n", event.length); + edtla = 0; + } +- xhci_event(xhci, &event); ++ xhci_event(xhci, &event, 0 /* FIXME */); + reported = 1; + if (xfer->status != CC_SUCCESS) { + return; +@@ -2244,7 +2253,7 @@ static void xhci_process_commands(XHCIState *xhci) + break; + } + event.slotid = slotid; +- xhci_event(xhci, &event); ++ xhci_event(xhci, &event, 0 /* FIXME */); + } + } + +@@ -2274,7 +2283,7 @@ static void xhci_update_port(XHCIState *xhci, XHCIPort *port, int is_detach) + port->portsc |= PORTSC_CSC; + XHCIEvent ev = { ER_PORT_STATUS_CHANGE, CC_SUCCESS, + port->portnr << 24}; +- xhci_event(xhci, &ev); ++ xhci_event(xhci, &ev, 0 /* FIXME */); + DPRINTF("xhci: port change event for port %d\n", port->portnr); + } + } +@@ -2307,20 +2316,22 @@ static void xhci_reset(DeviceState *dev) + xhci_update_port(xhci, xhci->ports + i, 0); + } + +- xhci->iman = 0; +- xhci->imod = 0; +- xhci->erstsz = 0; +- xhci->erstba_low = 0; +- xhci->erstba_high = 0; +- xhci->erdp_low = 0; +- xhci->erdp_high = 0; +- xhci->msix_used = 0; ++ for (i = 0; i < MAXINTRS; i++) { ++ xhci->intr[i].iman = 0; ++ xhci->intr[i].imod = 0; ++ xhci->intr[i].erstsz = 0; ++ xhci->intr[i].erstba_low = 0; ++ xhci->intr[i].erstba_high = 0; ++ xhci->intr[i].erdp_low = 0; ++ xhci->intr[i].erdp_high = 0; ++ xhci->intr[i].msix_used = 0; + +- xhci->er_ep_idx = 0; +- xhci->er_pcs = 1; +- xhci->er_full = 0; +- xhci->ev_buffer_put = 0; +- xhci->ev_buffer_get = 0; ++ xhci->intr[i].er_ep_idx = 0; ++ xhci->intr[i].er_pcs = 1; ++ xhci->intr[i].er_full = 0; ++ xhci->intr[i].ev_buffer_put = 0; ++ xhci->intr[i].ev_buffer_get = 0; ++ } + + xhci->mfindex_start = qemu_get_clock_ns(vm_clock); + xhci_mfwrap_update(xhci); +@@ -2551,7 +2562,7 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val) + if (xhci->crcr_low & (CRCR_CA|CRCR_CS) && (xhci->crcr_low & CRCR_CRR)) { + XHCIEvent event = {ER_COMMAND_COMPLETE, CC_COMMAND_RING_STOPPED}; + xhci->crcr_low &= ~CRCR_CRR; +- xhci_event(xhci, &event); ++ xhci_event(xhci, &event, 0 /* FIXME */); + DPRINTF("xhci: command ring stopped (CRCR=%08x)\n", xhci->crcr_low); + } else { + dma_addr_t base = xhci_addr64(xhci->crcr_low & ~0x3f, val); +@@ -2575,6 +2586,7 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val) + + static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + { ++ XHCIInterrupter *intr = &xhci->intr[0]; + uint32_t ret; + + switch (reg) { +@@ -2582,25 +2594,25 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + ret = xhci_mfindex_get(xhci) & 0x3fff; + break; + case 0x20: /* IMAN */ +- ret = xhci->iman; ++ ret = intr->iman; + break; + case 0x24: /* IMOD */ +- ret = xhci->imod; ++ ret = intr->imod; + break; + case 0x28: /* ERSTSZ */ +- ret = xhci->erstsz; ++ ret = intr->erstsz; + break; + case 0x30: /* ERSTBA low */ +- ret = xhci->erstba_low; ++ ret = intr->erstba_low; + break; + case 0x34: /* ERSTBA high */ +- ret = xhci->erstba_high; ++ ret = intr->erstba_high; + break; + case 0x38: /* ERDP low */ +- ret = xhci->erdp_low; ++ ret = intr->erdp_low; + break; + case 0x3c: /* ERDP high */ +- ret = xhci->erdp_high; ++ ret = intr->erdp_high; + break; + default: + fprintf(stderr, "xhci_runtime_read: reg 0x%x unimplemented\n", reg); +@@ -2613,42 +2625,43 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + + static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val) + { ++ XHCIInterrupter *intr = &xhci->intr[0]; + trace_usb_xhci_runtime_write(reg, val); + + switch (reg) { + case 0x20: /* IMAN */ + if (val & IMAN_IP) { +- xhci->iman &= ~IMAN_IP; ++ intr->iman &= ~IMAN_IP; + } +- xhci->iman &= ~IMAN_IE; +- xhci->iman |= val & IMAN_IE; ++ intr->iman &= ~IMAN_IE; ++ intr->iman |= val & IMAN_IE; + xhci_intx_update(xhci); +- xhci_msix_update(xhci); ++ xhci_msix_update(xhci, 0); + break; + case 0x24: /* IMOD */ +- xhci->imod = val; ++ intr->imod = val; + break; + case 0x28: /* ERSTSZ */ +- xhci->erstsz = val & 0xffff; ++ intr->erstsz = val & 0xffff; + break; + case 0x30: /* ERSTBA low */ + /* XXX NEC driver bug: it doesn't align this to 64 bytes +- xhci->erstba_low = val & 0xffffffc0; */ +- xhci->erstba_low = val & 0xfffffff0; ++ intr->erstba_low = val & 0xffffffc0; */ ++ intr->erstba_low = val & 0xfffffff0; + break; + case 0x34: /* ERSTBA high */ +- xhci->erstba_high = val; +- xhci_er_reset(xhci); ++ intr->erstba_high = val; ++ xhci_er_reset(xhci, 0); + break; + case 0x38: /* ERDP low */ + if (val & ERDP_EHB) { +- xhci->erdp_low &= ~ERDP_EHB; ++ intr->erdp_low &= ~ERDP_EHB; + } +- xhci->erdp_low = (val & ~ERDP_EHB) | (xhci->erdp_low & ERDP_EHB); ++ intr->erdp_low = (val & ~ERDP_EHB) | (intr->erdp_low & ERDP_EHB); + break; + case 0x3c: /* ERDP high */ +- xhci->erdp_high = val; +- xhci_events_update(xhci); ++ intr->erdp_high = val; ++ xhci_events_update(xhci, 0); + break; + default: + fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg); +@@ -2780,7 +2793,7 @@ static void xhci_wakeup(USBPort *usbport) + return; + } + port->portsc |= PORTSC_PLC; +- xhci_event(xhci, &ev); ++ xhci_event(xhci, &ev, 0 /* FIXME */); + } + + static void xhci_complete(USBPort *port, USBPacket *packet) +diff --git a/trace-events b/trace-events +index f86bbda..f5b5097 100644 +--- a/trace-events ++++ b/trace-events +@@ -319,7 +319,7 @@ usb_xhci_irq_msi(uint32_t nr) "nr %d" + usb_xhci_irq_msix(uint32_t nr) "nr %d" + usb_xhci_irq_msix_use(uint32_t nr) "nr %d" + usb_xhci_irq_msix_unuse(uint32_t nr) "nr %d" +-usb_xhci_queue_event(uint32_t idx, const char *trb, const char *evt, uint64_t param, uint32_t status, uint32_t control) "idx %d, %s, %s, p %016" PRIx64 ", s %08x, c 0x%08x" ++usb_xhci_queue_event(uint32_t vector, uint32_t idx, const char *trb, const char *evt, uint64_t param, uint32_t status, uint32_t control) "v %d, idx %d, %s, %s, p %016" PRIx64 ", s %08x, c 0x%08x" + usb_xhci_fetch_trb(uint64_t addr, const char *name, uint64_t param, uint32_t status, uint32_t control) "addr %016" PRIx64 ", %s, p %016" PRIx64 ", s %08x, c 0x%08x" + usb_xhci_slot_enable(uint32_t slotid) "slotid %d" + usb_xhci_slot_disable(uint32_t slotid) "slotid %d" +-- +1.7.12.1 + diff --git a/0621-xhci-prepare-xhci_runtime_-read-write-for-multiple-i.patch b/0621-xhci-prepare-xhci_runtime_-read-write-for-multiple-i.patch new file mode 100644 index 0000000..d753d08 --- /dev/null +++ b/0621-xhci-prepare-xhci_runtime_-read-write-for-multiple-i.patch @@ -0,0 +1,159 @@ +From 670eba790c368e9c37b0c964d94e0ff7f0d0c443 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 30 Aug 2012 17:15:12 +0200 +Subject: [PATCH] xhci: prepare xhci_runtime_{read,write} for multiple + interrupters + +Prepare xhci runtime register access function for multiple interrupters. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 100 +++++++++++++++++++++++++++++++----------------------- + 1 file changed, 57 insertions(+), 43 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 8a14ee8..6b3ff16 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -2586,37 +2586,43 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val) + + static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + { +- XHCIInterrupter *intr = &xhci->intr[0]; +- uint32_t ret; ++ uint32_t ret = 0; + +- switch (reg) { +- case 0x00: /* MFINDEX */ +- ret = xhci_mfindex_get(xhci) & 0x3fff; +- break; +- case 0x20: /* IMAN */ +- ret = intr->iman; +- break; +- case 0x24: /* IMOD */ +- ret = intr->imod; +- break; +- case 0x28: /* ERSTSZ */ +- ret = intr->erstsz; +- break; +- case 0x30: /* ERSTBA low */ +- ret = intr->erstba_low; +- break; +- case 0x34: /* ERSTBA high */ +- ret = intr->erstba_high; +- break; +- case 0x38: /* ERDP low */ +- ret = intr->erdp_low; +- break; +- case 0x3c: /* ERDP high */ +- ret = intr->erdp_high; +- break; +- default: +- fprintf(stderr, "xhci_runtime_read: reg 0x%x unimplemented\n", reg); +- ret = 0; ++ if (reg < 0x20) { ++ switch (reg) { ++ case 0x00: /* MFINDEX */ ++ ret = xhci_mfindex_get(xhci) & 0x3fff; ++ break; ++ default: ++ fprintf(stderr, "xhci_runtime_read: reg 0x%x unimplemented\n", reg); ++ break; ++ } ++ } else { ++ int v = (reg - 0x20) / 0x20; ++ XHCIInterrupter *intr = &xhci->intr[v]; ++ switch (reg & 0x1f) { ++ case 0x00: /* IMAN */ ++ ret = intr->iman; ++ break; ++ case 0x04: /* IMOD */ ++ ret = intr->imod; ++ break; ++ case 0x08: /* ERSTSZ */ ++ ret = intr->erstsz; ++ break; ++ case 0x10: /* ERSTBA low */ ++ ret = intr->erstba_low; ++ break; ++ case 0x14: /* ERSTBA high */ ++ ret = intr->erstba_high; ++ break; ++ case 0x18: /* ERDP low */ ++ ret = intr->erdp_low; ++ break; ++ case 0x1c: /* ERDP high */ ++ ret = intr->erdp_high; ++ break; ++ } + } + + trace_usb_xhci_runtime_read(reg, ret); +@@ -2625,43 +2631,51 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + + static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val) + { +- XHCIInterrupter *intr = &xhci->intr[0]; ++ int v = (reg - 0x20) / 0x20; ++ XHCIInterrupter *intr = &xhci->intr[v]; + trace_usb_xhci_runtime_write(reg, val); + +- switch (reg) { +- case 0x20: /* IMAN */ ++ if (reg < 0x20) { ++ fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg); ++ return; ++ } ++ ++ switch (reg & 0x1f) { ++ case 0x00: /* IMAN */ + if (val & IMAN_IP) { + intr->iman &= ~IMAN_IP; + } + intr->iman &= ~IMAN_IE; + intr->iman |= val & IMAN_IE; +- xhci_intx_update(xhci); +- xhci_msix_update(xhci, 0); ++ if (v == 0) { ++ xhci_intx_update(xhci); ++ } ++ xhci_msix_update(xhci, v); + break; +- case 0x24: /* IMOD */ ++ case 0x04: /* IMOD */ + intr->imod = val; + break; +- case 0x28: /* ERSTSZ */ ++ case 0x08: /* ERSTSZ */ + intr->erstsz = val & 0xffff; + break; +- case 0x30: /* ERSTBA low */ ++ case 0x10: /* ERSTBA low */ + /* XXX NEC driver bug: it doesn't align this to 64 bytes + intr->erstba_low = val & 0xffffffc0; */ + intr->erstba_low = val & 0xfffffff0; + break; +- case 0x34: /* ERSTBA high */ ++ case 0x14: /* ERSTBA high */ + intr->erstba_high = val; +- xhci_er_reset(xhci, 0); ++ xhci_er_reset(xhci, v); + break; +- case 0x38: /* ERDP low */ ++ case 0x18: /* ERDP low */ + if (val & ERDP_EHB) { + intr->erdp_low &= ~ERDP_EHB; + } + intr->erdp_low = (val & ~ERDP_EHB) | (intr->erdp_low & ERDP_EHB); + break; +- case 0x3c: /* ERDP high */ ++ case 0x1c: /* ERDP high */ + intr->erdp_high = val; +- xhci_events_update(xhci, 0); ++ xhci_events_update(xhci, v); + break; + default: + fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg); +-- +1.7.12.1 + diff --git a/0622-xhci-pick-target-interrupter.patch b/0622-xhci-pick-target-interrupter.patch new file mode 100644 index 0000000..e336b49 --- /dev/null +++ b/0622-xhci-pick-target-interrupter.patch @@ -0,0 +1,93 @@ +From d6968ced27f697b26d7a1d5b44f15eeb300a9fd6 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Fri, 31 Aug 2012 15:30:51 +0200 +Subject: [PATCH] xhci: pick target interrupter + +Pick the correct interrupter when queuing an event. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 22 ++++++++++++++++------ + 1 file changed, 16 insertions(+), 6 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 6b3ff16..3b03c6c 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -264,6 +264,10 @@ typedef enum TRBCCode { + + #define TRB_LK_TC (1<<1) + ++#define TRB_INTR_SHIFT 22 ++#define TRB_INTR_MASK 0x3ff ++#define TRB_INTR(t) (((t).status >> TRB_INTR_SHIFT) & TRB_INTR_MASK) ++ + #define EP_TYPE_MASK 0x7 + #define EP_TYPE_SHIFT 3 + +@@ -806,10 +810,16 @@ static void xhci_events_update(XHCIState *xhci, int v) + + static void xhci_event(XHCIState *xhci, XHCIEvent *event, int v) + { +- XHCIInterrupter *intr = &xhci->intr[v]; ++ XHCIInterrupter *intr; + dma_addr_t erdp; + unsigned int dp_idx; + ++ if (v >= MAXINTRS) { ++ DPRINTF("intr nr out of range (%d >= %d)\n", v, MAXINTRS); ++ return; ++ } ++ intr = &xhci->intr[v]; ++ + if (intr->er_full) { + DPRINTF("xhci_event(): ER full, queueing\n"); + if (((intr->ev_buffer_put+1) % EV_QUEUE) == intr->ev_buffer_get) { +@@ -1377,7 +1387,7 @@ static void xhci_xfer_report(XHCITransfer *xfer) + DPRINTF("xhci_xfer_data: EDTLA=%d\n", event.length); + edtla = 0; + } +- xhci_event(xhci, &event, 0 /* FIXME */); ++ xhci_event(xhci, &event, TRB_INTR(*trb)); + reported = 1; + if (xfer->status != CC_SUCCESS) { + return; +@@ -2253,7 +2263,7 @@ static void xhci_process_commands(XHCIState *xhci) + break; + } + event.slotid = slotid; +- xhci_event(xhci, &event, 0 /* FIXME */); ++ xhci_event(xhci, &event, 0); + } + } + +@@ -2283,7 +2293,7 @@ static void xhci_update_port(XHCIState *xhci, XHCIPort *port, int is_detach) + port->portsc |= PORTSC_CSC; + XHCIEvent ev = { ER_PORT_STATUS_CHANGE, CC_SUCCESS, + port->portnr << 24}; +- xhci_event(xhci, &ev, 0 /* FIXME */); ++ xhci_event(xhci, &ev, 0); + DPRINTF("xhci: port change event for port %d\n", port->portnr); + } + } +@@ -2562,7 +2572,7 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val) + if (xhci->crcr_low & (CRCR_CA|CRCR_CS) && (xhci->crcr_low & CRCR_CRR)) { + XHCIEvent event = {ER_COMMAND_COMPLETE, CC_COMMAND_RING_STOPPED}; + xhci->crcr_low &= ~CRCR_CRR; +- xhci_event(xhci, &event, 0 /* FIXME */); ++ xhci_event(xhci, &event, 0); + DPRINTF("xhci: command ring stopped (CRCR=%08x)\n", xhci->crcr_low); + } else { + dma_addr_t base = xhci_addr64(xhci->crcr_low & ~0x3f, val); +@@ -2807,7 +2817,7 @@ static void xhci_wakeup(USBPort *usbport) + return; + } + port->portsc |= PORTSC_PLC; +- xhci_event(xhci, &ev, 0 /* FIXME */); ++ xhci_event(xhci, &ev, 0); + } + + static void xhci_complete(USBPort *port, USBPacket *packet) +-- +1.7.12.1 + diff --git a/0623-xhci-support-multiple-interrupters.patch b/0623-xhci-support-multiple-interrupters.patch new file mode 100644 index 0000000..0d8ffbd --- /dev/null +++ b/0623-xhci-support-multiple-interrupters.patch @@ -0,0 +1,40 @@ +From 4e4d4191a40b5cbcd6f967ed105eea559104cd8a Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 4 Sep 2012 12:56:55 +0200 +Subject: [PATCH] xhci: support multiple interrupters + +Everything is in place, flip the big switch now +and enable support for multiple interrupters. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 3b03c6c..4992705 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -42,7 +42,7 @@ + + #define MAXPORTS (MAXPORTS_2+MAXPORTS_3) + #define MAXSLOTS MAXPORTS +-#define MAXINTRS 1 /* MAXPORTS */ ++#define MAXINTRS MAXPORTS + + #define TD_QUEUE 24 + +@@ -75,10 +75,6 @@ + # error Increase LEN_REGS + #endif + +-#if MAXINTRS > 1 +-# error TODO: only one interrupter supported +-#endif +- + /* bit definitions */ + #define USBCMD_RS (1<<0) + #define USBCMD_HCRST (1<<1) +-- +1.7.12.1 + diff --git a/0624-xhci-kill-xhci_mem_-read-write-dispatcher-functions.patch b/0624-xhci-kill-xhci_mem_-read-write-dispatcher-functions.patch new file mode 100644 index 0000000..ec23202 --- /dev/null +++ b/0624-xhci-kill-xhci_mem_-read-write-dispatcher-functions.patch @@ -0,0 +1,280 @@ +From d2efc9f3dc62810ef6075f8759c9856016447c14 Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 4 Sep 2012 14:42:20 +0200 +Subject: [PATCH] xhci: kill xhci_mem_{read,write} dispatcher functions + +... and register subregions instead, so we offload the dispatching +to the the memory subsystem which is designed to handle it. + +Signed-off-by: Gerd Hoffmann +--- + hw/usb/hcd-xhci.c | 140 +++++++++++++++++++++++++++++------------------------- + 1 file changed, 75 insertions(+), 65 deletions(-) + +diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c +index 4992705..4ba9464 100644 +--- a/hw/usb/hcd-xhci.c ++++ b/hw/usb/hcd-xhci.c +@@ -404,6 +404,10 @@ struct XHCIState { + USBBus bus; + qemu_irq irq; + MemoryRegion mem; ++ MemoryRegion mem_cap; ++ MemoryRegion mem_oper; ++ MemoryRegion mem_runtime; ++ MemoryRegion mem_doorbell; + const char *name; + unsigned int devaddr; + +@@ -2343,8 +2347,9 @@ static void xhci_reset(DeviceState *dev) + xhci_mfwrap_update(xhci); + } + +-static uint32_t xhci_cap_read(XHCIState *xhci, uint32_t reg) ++static uint64_t xhci_cap_read(void *ptr, target_phys_addr_t reg, unsigned size) + { ++ XHCIState *xhci = ptr; + uint32_t ret; + + switch (reg) { +@@ -2401,7 +2406,7 @@ static uint32_t xhci_cap_read(XHCIState *xhci, uint32_t reg) + ret = 0x00000000; /* reserved */ + break; + default: +- fprintf(stderr, "xhci_cap_read: reg %d unimplemented\n", reg); ++ fprintf(stderr, "xhci_cap_read: reg %d unimplemented\n", (int)reg); + ret = 0; + } + +@@ -2482,8 +2487,9 @@ static void xhci_port_write(XHCIState *xhci, uint32_t reg, uint32_t val) + } + } + +-static uint32_t xhci_oper_read(XHCIState *xhci, uint32_t reg) ++static uint64_t xhci_oper_read(void *ptr, target_phys_addr_t reg, unsigned size) + { ++ XHCIState *xhci = ptr; + uint32_t ret; + + if (reg >= 0x400) { +@@ -2519,7 +2525,7 @@ static uint32_t xhci_oper_read(XHCIState *xhci, uint32_t reg) + ret = xhci->config; + break; + default: +- fprintf(stderr, "xhci_oper_read: reg 0x%x unimplemented\n", reg); ++ fprintf(stderr, "xhci_oper_read: reg 0x%x unimplemented\n", (int)reg); + ret = 0; + } + +@@ -2527,8 +2533,11 @@ static uint32_t xhci_oper_read(XHCIState *xhci, uint32_t reg) + return ret; + } + +-static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val) ++static void xhci_oper_write(void *ptr, target_phys_addr_t reg, ++ uint64_t val, unsigned size) + { ++ XHCIState *xhci = ptr; ++ + if (reg >= 0x400) { + xhci_port_write(xhci, reg - 0x400, val); + return; +@@ -2586,12 +2595,14 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val) + xhci->config = val & 0xff; + break; + default: +- fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg); ++ fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", (int)reg); + } + } + +-static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) ++static uint64_t xhci_runtime_read(void *ptr, target_phys_addr_t reg, ++ unsigned size) + { ++ XHCIState *xhci = ptr; + uint32_t ret = 0; + + if (reg < 0x20) { +@@ -2600,7 +2611,8 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + ret = xhci_mfindex_get(xhci) & 0x3fff; + break; + default: +- fprintf(stderr, "xhci_runtime_read: reg 0x%x unimplemented\n", reg); ++ fprintf(stderr, "xhci_runtime_read: reg 0x%x unimplemented\n", ++ (int)reg); + break; + } + } else { +@@ -2635,14 +2647,16 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg) + return ret; + } + +-static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val) ++static void xhci_runtime_write(void *ptr, target_phys_addr_t reg, ++ uint64_t val, unsigned size) + { ++ XHCIState *xhci = ptr; + int v = (reg - 0x20) / 0x20; + XHCIInterrupter *intr = &xhci->intr[v]; + trace_usb_xhci_runtime_write(reg, val); + + if (reg < 0x20) { +- fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg); ++ fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", (int)reg); + return; + } + +@@ -2684,19 +2698,24 @@ static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val) + xhci_events_update(xhci, v); + break; + default: +- fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg); ++ fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", ++ (int)reg); + } + } + +-static uint32_t xhci_doorbell_read(XHCIState *xhci, uint32_t reg) ++static uint64_t xhci_doorbell_read(void *ptr, target_phys_addr_t reg, ++ unsigned size) + { + /* doorbells always read as 0 */ + trace_usb_xhci_doorbell_read(reg, 0); + return 0; + } + +-static void xhci_doorbell_write(XHCIState *xhci, uint32_t reg, uint32_t val) ++static void xhci_doorbell_write(void *ptr, target_phys_addr_t reg, ++ uint64_t val, unsigned size) + { ++ XHCIState *xhci = ptr; ++ + trace_usb_xhci_doorbell_write(reg, val); + + if (!xhci_running(xhci)) { +@@ -2710,69 +2729,47 @@ static void xhci_doorbell_write(XHCIState *xhci, uint32_t reg, uint32_t val) + if (val == 0) { + xhci_process_commands(xhci); + } else { +- fprintf(stderr, "xhci: bad doorbell 0 write: 0x%x\n", val); ++ fprintf(stderr, "xhci: bad doorbell 0 write: 0x%x\n", ++ (uint32_t)val); + } + } else { + if (reg > MAXSLOTS) { +- fprintf(stderr, "xhci: bad doorbell %d\n", reg); ++ fprintf(stderr, "xhci: bad doorbell %d\n", (int)reg); + } else if (val > 31) { +- fprintf(stderr, "xhci: bad doorbell %d write: 0x%x\n", reg, val); ++ fprintf(stderr, "xhci: bad doorbell %d write: 0x%x\n", ++ (int)reg, (uint32_t)val); + } else { + xhci_kick_ep(xhci, reg, val); + } + } + } + +-static uint64_t xhci_mem_read(void *ptr, target_phys_addr_t addr, +- unsigned size) +-{ +- XHCIState *xhci = ptr; +- +- /* Only aligned reads are allowed on xHCI */ +- if (addr & 3) { +- fprintf(stderr, "xhci_mem_read: Mis-aligned read\n"); +- return 0; +- } +- +- if (addr < LEN_CAP) { +- return xhci_cap_read(xhci, addr); +- } else if (addr >= OFF_OPER && addr < (OFF_OPER + LEN_OPER)) { +- return xhci_oper_read(xhci, addr - OFF_OPER); +- } else if (addr >= OFF_RUNTIME && addr < (OFF_RUNTIME + LEN_RUNTIME)) { +- return xhci_runtime_read(xhci, addr - OFF_RUNTIME); +- } else if (addr >= OFF_DOORBELL && addr < (OFF_DOORBELL + LEN_DOORBELL)) { +- return xhci_doorbell_read(xhci, addr - OFF_DOORBELL); +- } else { +- fprintf(stderr, "xhci_mem_read: Bad offset %x\n", (int)addr); +- return 0; +- } +-} +- +-static void xhci_mem_write(void *ptr, target_phys_addr_t addr, +- uint64_t val, unsigned size) +-{ +- XHCIState *xhci = ptr; ++static const MemoryRegionOps xhci_cap_ops = { ++ .read = xhci_cap_read, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; + +- /* Only aligned writes are allowed on xHCI */ +- if (addr & 3) { +- fprintf(stderr, "xhci_mem_write: Mis-aligned write\n"); +- return; +- } ++static const MemoryRegionOps xhci_oper_ops = { ++ .read = xhci_oper_read, ++ .write = xhci_oper_write, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; + +- if (addr >= OFF_OPER && addr < (OFF_OPER + LEN_OPER)) { +- xhci_oper_write(xhci, addr - OFF_OPER, val); +- } else if (addr >= OFF_RUNTIME && addr < (OFF_RUNTIME + LEN_RUNTIME)) { +- xhci_runtime_write(xhci, addr - OFF_RUNTIME, val); +- } else if (addr >= OFF_DOORBELL && addr < (OFF_DOORBELL + LEN_DOORBELL)) { +- xhci_doorbell_write(xhci, addr - OFF_DOORBELL, val); +- } else { +- fprintf(stderr, "xhci_mem_write: Bad offset %x\n", (int)addr); +- } +-} ++static const MemoryRegionOps xhci_runtime_ops = { ++ .read = xhci_runtime_read, ++ .write = xhci_runtime_write, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; + +-static const MemoryRegionOps xhci_mem_ops = { +- .read = xhci_mem_read, +- .write = xhci_mem_write, ++static const MemoryRegionOps xhci_doorbell_ops = { ++ .read = xhci_doorbell_read, ++ .write = xhci_doorbell_write, + .valid.min_access_size = 1, + .valid.max_access_size = 4, + .impl.min_access_size = 4, +@@ -2940,8 +2937,21 @@ static int usb_xhci_initfn(struct PCIDevice *dev) + + xhci->irq = xhci->pci_dev.irq[0]; + +- memory_region_init_io(&xhci->mem, &xhci_mem_ops, xhci, +- "xhci", LEN_REGS); ++ memory_region_init(&xhci->mem, "xhci", LEN_REGS); ++ memory_region_init_io(&xhci->mem_cap, &xhci_cap_ops, xhci, ++ "capabilities", LEN_CAP); ++ memory_region_init_io(&xhci->mem_oper, &xhci_oper_ops, xhci, ++ "operational", 0x400 + 0x10 * xhci->numports); ++ memory_region_init_io(&xhci->mem_runtime, &xhci_runtime_ops, xhci, ++ "runtime", LEN_RUNTIME); ++ memory_region_init_io(&xhci->mem_doorbell, &xhci_doorbell_ops, xhci, ++ "doorbell", LEN_DOORBELL); ++ ++ memory_region_add_subregion(&xhci->mem, 0, &xhci->mem_cap); ++ memory_region_add_subregion(&xhci->mem, OFF_OPER, &xhci->mem_oper); ++ memory_region_add_subregion(&xhci->mem, OFF_RUNTIME, &xhci->mem_runtime); ++ memory_region_add_subregion(&xhci->mem, OFF_DOORBELL, &xhci->mem_doorbell); ++ + pci_register_bar(&xhci->pci_dev, 0, + PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64, + &xhci->mem); +-- +1.7.12.1 + diff --git a/0625-usb-redir-Change-cancelled-packet-code-into-a-generi.patch b/0625-usb-redir-Change-cancelled-packet-code-into-a-generi.patch new file mode 100644 index 0000000..1f0e575 --- /dev/null +++ b/0625-usb-redir-Change-cancelled-packet-code-into-a-generi.patch @@ -0,0 +1,184 @@ +From 5b44a6c9c102b69690adcc2c5be886857ea35ebd Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 4 Sep 2012 14:18:34 +0200 +Subject: [PATCH] usb-redir: Change cancelled packet code into a generic + packet-id queue + +Signed-off-by: Hans de Goede +--- + hw/usb/redirect.c | 102 +++++++++++++++++++++++++++++++++++++----------------- + 1 file changed, 71 insertions(+), 31 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index f183263..e2b8159 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -43,7 +43,6 @@ + #define EP2I(ep_address) (((ep_address & 0x80) >> 3) | (ep_address & 0x0f)) + #define I2EP(i) (((i & 0x10) << 3) | (i & 0x0f)) + +-typedef struct Cancelled Cancelled; + typedef struct USBRedirDevice USBRedirDevice; + + /* Struct to hold buffered packets (iso or int input packets) */ +@@ -69,6 +68,18 @@ struct endp_data { + int bufpq_target_size; + }; + ++struct PacketIdQueueEntry { ++ uint64_t id; ++ QTAILQ_ENTRY(PacketIdQueueEntry)next; ++}; ++ ++struct PacketIdQueue { ++ USBRedirDevice *dev; ++ const char *name; ++ QTAILQ_HEAD(, PacketIdQueueEntry) head; ++ int size; ++}; ++ + struct USBRedirDevice { + USBDevice dev; + /* Properties */ +@@ -86,7 +97,7 @@ struct USBRedirDevice { + int64_t next_attach_time; + struct usbredirparser *parser; + struct endp_data endpoint[MAX_ENDPOINTS]; +- QTAILQ_HEAD(, Cancelled) cancelled; ++ struct PacketIdQueue cancelled; + /* Data for device filtering */ + struct usb_redir_device_connect_header device_info; + struct usb_redir_interface_info_header interface_info; +@@ -94,11 +105,6 @@ struct USBRedirDevice { + int filter_rules_count; + }; + +-struct Cancelled { +- uint64_t id; +- QTAILQ_ENTRY(Cancelled)next; +-}; +- + static void usbredir_hello(void *priv, struct usb_redir_hello_header *h); + static void usbredir_device_connect(void *priv, + struct usb_redir_device_connect_header *device_connect); +@@ -251,37 +257,75 @@ static int usbredir_write(void *priv, uint8_t *data, int count) + * Cancelled and buffered packets helpers + */ + +-static void usbredir_cancel_packet(USBDevice *udev, USBPacket *p) ++static void packet_id_queue_init(struct PacketIdQueue *q, ++ USBRedirDevice *dev, const char *name) + { +- USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); +- Cancelled *c; ++ q->dev = dev; ++ q->name = name; ++ QTAILQ_INIT(&q->head); ++ q->size = 0; ++} ++ ++static void packet_id_queue_add(struct PacketIdQueue *q, uint64_t id) ++{ ++ USBRedirDevice *dev = q->dev; ++ struct PacketIdQueueEntry *e; ++ ++ DPRINTF("adding packet id %"PRIu64" to %s queue\n", id, q->name); ++ ++ e = g_malloc0(sizeof(struct PacketIdQueueEntry)); ++ e->id = id; ++ QTAILQ_INSERT_TAIL(&q->head, e, next); ++ q->size++; ++} ++ ++static int packet_id_queue_remove(struct PacketIdQueue *q, uint64_t id) ++{ ++ USBRedirDevice *dev = q->dev; ++ struct PacketIdQueueEntry *e; ++ ++ QTAILQ_FOREACH(e, &q->head, next) { ++ if (e->id == id) { ++ DPRINTF("removing packet id %"PRIu64" from %s queue\n", ++ id, q->name); ++ QTAILQ_REMOVE(&q->head, e, next); ++ q->size--; ++ g_free(e); ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++static void packet_id_queue_empty(struct PacketIdQueue *q) ++{ ++ USBRedirDevice *dev = q->dev; ++ struct PacketIdQueueEntry *e, *next_e; + +- DPRINTF("cancel packet id %"PRIu64"\n", p->id); ++ DPRINTF("removing %d packet-ids from %s queue\n", q->size, q->name); + +- c = g_malloc0(sizeof(Cancelled)); +- c->id = p->id; +- QTAILQ_INSERT_TAIL(&dev->cancelled, c, next); ++ QTAILQ_FOREACH_SAFE(e, &q->head, next, next_e) { ++ QTAILQ_REMOVE(&q->head, e, next); ++ g_free(e); ++ } ++ q->size = 0; ++} + ++static void usbredir_cancel_packet(USBDevice *udev, USBPacket *p) ++{ ++ USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); ++ ++ packet_id_queue_add(&dev->cancelled, p->id); + usbredirparser_send_cancel_data_packet(dev->parser, p->id); + usbredirparser_do_write(dev->parser); + } + + static int usbredir_is_cancelled(USBRedirDevice *dev, uint64_t id) + { +- Cancelled *c; +- + if (!dev->dev.attached) { + return 1; /* Treat everything as cancelled after a disconnect */ + } +- +- QTAILQ_FOREACH(c, &dev->cancelled, next) { +- if (c->id == id) { +- QTAILQ_REMOVE(&dev->cancelled, c, next); +- g_free(c); +- return 1; +- } +- } +- return 0; ++ return packet_id_queue_remove(&dev->cancelled, id); + } + + static USBPacket *usbredir_find_packet_by_id(USBRedirDevice *dev, +@@ -937,7 +981,7 @@ static int usbredir_initfn(USBDevice *udev) + dev->chardev_close_bh = qemu_bh_new(usbredir_chardev_close_bh, dev); + dev->attach_timer = qemu_new_timer_ms(vm_clock, usbredir_do_attach, dev); + +- QTAILQ_INIT(&dev->cancelled); ++ packet_id_queue_init(&dev->cancelled, dev, "cancelled"); + for (i = 0; i < MAX_ENDPOINTS; i++) { + QTAILQ_INIT(&dev->endpoint[i].bufpq); + } +@@ -955,13 +999,9 @@ static int usbredir_initfn(USBDevice *udev) + + static void usbredir_cleanup_device_queues(USBRedirDevice *dev) + { +- Cancelled *c, *next_c; + int i; + +- QTAILQ_FOREACH_SAFE(c, &dev->cancelled, next, next_c) { +- QTAILQ_REMOVE(&dev->cancelled, c, next); +- g_free(c); +- } ++ packet_id_queue_empty(&dev->cancelled); + for (i = 0; i < MAX_ENDPOINTS; i++) { + usbredir_free_bufpq(dev, I2EP(i)); + } +-- +1.7.12.1 + diff --git a/0626-usb-redir-Add-an-already_in_flight-packet-id-queue.patch b/0626-usb-redir-Add-an-already_in_flight-packet-id-queue.patch new file mode 100644 index 0000000..e0e58c1 --- /dev/null +++ b/0626-usb-redir-Add-an-already_in_flight-packet-id-queue.patch @@ -0,0 +1,119 @@ +From 9a38bd644b97a4a3ae92c9246bdcdd09ba937ae8 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 4 Sep 2012 17:03:54 +0200 +Subject: [PATCH] usb-redir: Add an already_in_flight packet-id queue + +After a live migration, the usb-hcd will re-queue all packets by +walking over the schedule in the guest memory again, but requests which +were encountered on the migration source before will already be in flight, +so these should *not* be re-send to the usbredir-host. + +This patch adds an already in flight packet ud queue, which will be filled by +the source before migration and then moved over to the migration dest, any +async handled packets are then checked against this queue to avoid sending +the same packet to the usbredir-host twice. + +Signed-off-by: Hans de Goede +--- + hw/usb/redirect.c | 43 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 43 insertions(+) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index e2b8159..cdd705f 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -98,6 +98,7 @@ struct USBRedirDevice { + struct usbredirparser *parser; + struct endp_data endpoint[MAX_ENDPOINTS]; + struct PacketIdQueue cancelled; ++ struct PacketIdQueue already_in_flight; + /* Data for device filtering */ + struct usb_redir_device_connect_header device_info; + struct usb_redir_interface_info_header interface_info; +@@ -328,6 +329,34 @@ static int usbredir_is_cancelled(USBRedirDevice *dev, uint64_t id) + return packet_id_queue_remove(&dev->cancelled, id); + } + ++static void usbredir_fill_already_in_flight_from_ep(USBRedirDevice *dev, ++ struct USBEndpoint *ep) ++{ ++ static USBPacket *p; ++ ++ QTAILQ_FOREACH(p, &ep->queue, queue) { ++ packet_id_queue_add(&dev->already_in_flight, p->id); ++ } ++} ++ ++static void usbredir_fill_already_in_flight(USBRedirDevice *dev) ++{ ++ int ep; ++ struct USBDevice *udev = &dev->dev; ++ ++ usbredir_fill_already_in_flight_from_ep(dev, &udev->ep_ctl); ++ ++ for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { ++ usbredir_fill_already_in_flight_from_ep(dev, &udev->ep_in[ep]); ++ usbredir_fill_already_in_flight_from_ep(dev, &udev->ep_out[ep]); ++ } ++} ++ ++static int usbredir_already_in_flight(USBRedirDevice *dev, uint64_t id) ++{ ++ return packet_id_queue_remove(&dev->already_in_flight, id); ++} ++ + static USBPacket *usbredir_find_packet_by_id(USBRedirDevice *dev, + uint8_t ep, uint64_t id) + { +@@ -543,6 +572,10 @@ static int usbredir_handle_bulk_data(USBRedirDevice *dev, USBPacket *p, + + DPRINTF("bulk-out ep %02X len %zd id %"PRIu64"\n", ep, p->iov.size, p->id); + ++ if (usbredir_already_in_flight(dev, p->id)) { ++ return USB_RET_ASYNC; ++ } ++ + bulk_packet.endpoint = ep; + bulk_packet.length = p->iov.size; + bulk_packet.stream_id = 0; +@@ -623,6 +656,10 @@ static int usbredir_handle_interrupt_data(USBRedirDevice *dev, + DPRINTF("interrupt-out ep %02X len %zd id %"PRIu64"\n", ep, + p->iov.size, p->id); + ++ if (usbredir_already_in_flight(dev, p->id)) { ++ return USB_RET_ASYNC; ++ } ++ + interrupt_packet.endpoint = ep; + interrupt_packet.length = p->iov.size; + +@@ -765,6 +802,10 @@ static int usbredir_handle_control(USBDevice *udev, USBPacket *p, + USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); + struct usb_redir_control_packet_header control_packet; + ++ if (usbredir_already_in_flight(dev, p->id)) { ++ return USB_RET_ASYNC; ++ } ++ + /* Special cases for certain standard device requests */ + switch (request) { + case DeviceOutRequest | USB_REQ_SET_ADDRESS: +@@ -982,6 +1023,7 @@ static int usbredir_initfn(USBDevice *udev) + dev->attach_timer = qemu_new_timer_ms(vm_clock, usbredir_do_attach, dev); + + packet_id_queue_init(&dev->cancelled, dev, "cancelled"); ++ packet_id_queue_init(&dev->already_in_flight, dev, "already-in-flight"); + for (i = 0; i < MAX_ENDPOINTS; i++) { + QTAILQ_INIT(&dev->endpoint[i].bufpq); + } +@@ -1002,6 +1044,7 @@ static void usbredir_cleanup_device_queues(USBRedirDevice *dev) + int i; + + packet_id_queue_empty(&dev->cancelled); ++ packet_id_queue_empty(&dev->already_in_flight); + for (i = 0; i < MAX_ENDPOINTS; i++) { + usbredir_free_bufpq(dev, I2EP(i)); + } +-- +1.7.12.1 + diff --git a/0627-usb-redir-Store-max_packet_size-in-endp_data.patch b/0627-usb-redir-Store-max_packet_size-in-endp_data.patch new file mode 100644 index 0000000..2c44744 --- /dev/null +++ b/0627-usb-redir-Store-max_packet_size-in-endp_data.patch @@ -0,0 +1,38 @@ +From c41be182adcd7026fcf76250fc3a64cec8a2c903 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 6 Sep 2012 20:52:36 +0200 +Subject: [PATCH] usb-redir: Store max_packet_size in endp_data + +So that we've a place to migrate it to / from to allow restoring it after +migration. + +Signed-off-by: Hans de Goede +--- + hw/usb/redirect.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index cdd705f..6eb3c6d 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -57,6 +57,7 @@ struct endp_data { + uint8_t type; + uint8_t interval; + uint8_t interface; /* bInterfaceNumber this ep belongs to */ ++ uint16_t max_packet_size; /* In bytes, not wMaxPacketSize format !! */ + uint8_t iso_started; + uint8_t iso_error; /* For reporting iso errors to the HC */ + uint8_t interrupt_started; +@@ -1300,7 +1301,8 @@ static void usbredir_ep_info(void *priv, + usb_ep->ifnum = dev->endpoint[i].interface; + if (usbredirparser_peer_has_cap(dev->parser, + usb_redir_cap_ep_info_max_packet_size)) { +- usb_ep->max_packet_size = ep_info->max_packet_size[i]; ++ dev->endpoint[i].max_packet_size = ++ usb_ep->max_packet_size = ep_info->max_packet_size[i]; + } + if (ep_info->type[i] == usb_redir_type_bulk) { + usb_ep->pipeline = true; +-- +1.7.12.1 + diff --git a/0628-usb-redir-Add-support-for-migration.patch b/0628-usb-redir-Add-support-for-migration.patch new file mode 100644 index 0000000..52d9002 --- /dev/null +++ b/0628-usb-redir-Add-support-for-migration.patch @@ -0,0 +1,429 @@ +From a056ffda5a57d7169268e49a3e42c7d79c8f7c48 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 5 Sep 2012 09:21:44 +0200 +Subject: [PATCH] usb-redir: Add support for migration + +Signed-off-by: Hans de Goede +--- + hw/usb/redirect.c | 349 +++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 346 insertions(+), 3 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 6eb3c6d..b7387b6 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -65,8 +65,8 @@ struct endp_data { + uint8_t bufpq_prefilled; + uint8_t bufpq_dropping_packets; + QTAILQ_HEAD(, buf_packet) bufpq; +- int bufpq_size; +- int bufpq_target_size; ++ int32_t bufpq_size; ++ int32_t bufpq_target_size; + }; + + struct PacketIdQueueEntry { +@@ -243,6 +243,11 @@ static int usbredir_write(void *priv, uint8_t *data, int count) + return 0; + } + ++ /* Don't send new data to the chardev until our state is fully synced */ ++ if (!runstate_check(RUN_STATE_RUNNING)) { ++ return 0; ++ } ++ + r = qemu_chr_fe_write(dev->cs, data, count); + + if (r < 0) { +@@ -870,6 +875,7 @@ static void usbredir_chardev_open(USBRedirDevice *dev) + { + uint32_t caps[USB_REDIR_CAPS_SIZE] = { 0, }; + char version[32]; ++ int flags = 0; + + /* Make sure any pending closes are handled (no-op if none pending) */ + usbredir_chardev_close_bh(dev); +@@ -902,7 +908,12 @@ static void usbredir_chardev_open(USBRedirDevice *dev) + usbredirparser_caps_set_cap(caps, usb_redir_cap_filter); + usbredirparser_caps_set_cap(caps, usb_redir_cap_ep_info_max_packet_size); + usbredirparser_caps_set_cap(caps, usb_redir_cap_64bits_ids); +- usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE, 0); ++ ++ if (runstate_check(RUN_STATE_INMIGRATE)) { ++ flags |= usbredirparser_fl_no_hello; ++ } ++ usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE, ++ flags); + usbredirparser_do_write(dev->parser); + } + +@@ -948,6 +959,11 @@ static int usbredir_chardev_can_read(void *opaque) + return 0; + } + ++ /* Don't read new data from the chardev until our state is fully synced */ ++ if (!runstate_check(RUN_STATE_RUNNING)) { ++ return 0; ++ } ++ + /* usbredir_parser_do_read will consume *all* data we give it */ + return 1024 * 1024; + } +@@ -999,6 +1015,15 @@ static const QemuChrHandlers usbredir_chr_handlers = { + * init + destroy + */ + ++static void usbredir_vm_state_change(void *priv, int running, RunState state) ++{ ++ USBRedirDevice *dev = priv; ++ ++ if (state == RUN_STATE_RUNNING && dev->parser != NULL) { ++ usbredirparser_do_write(dev->parser); /* Flush any pending writes */ ++ } ++} ++ + static int usbredir_initfn(USBDevice *udev) + { + USBRedirDevice *dev = DO_UPCAST(USBRedirDevice, dev, udev); +@@ -1036,6 +1061,7 @@ static int usbredir_initfn(USBDevice *udev) + qemu_chr_fe_open(dev->cs); + qemu_chr_add_handlers(dev->cs, &usbredir_chr_handlers, dev); + ++ qemu_add_vm_change_state_handler(usbredir_vm_state_change, dev); + add_boot_device_path(dev->bootindex, &udev->qdev, NULL); + return 0; + } +@@ -1525,6 +1551,322 @@ static void usbredir_interrupt_packet(void *priv, uint64_t id, + } + } + ++/* ++ * Migration code ++ */ ++ ++static void usbredir_pre_save(void *priv) ++{ ++ USBRedirDevice *dev = priv; ++ ++ usbredir_fill_already_in_flight(dev); ++} ++ ++static int usbredir_post_load(void *priv, int version_id) ++{ ++ USBRedirDevice *dev = priv; ++ struct USBEndpoint *usb_ep; ++ int i; ++ ++ switch (dev->device_info.speed) { ++ case usb_redir_speed_low: ++ dev->dev.speed = USB_SPEED_LOW; ++ break; ++ case usb_redir_speed_full: ++ dev->dev.speed = USB_SPEED_FULL; ++ break; ++ case usb_redir_speed_high: ++ dev->dev.speed = USB_SPEED_HIGH; ++ break; ++ case usb_redir_speed_super: ++ dev->dev.speed = USB_SPEED_SUPER; ++ break; ++ default: ++ dev->dev.speed = USB_SPEED_FULL; ++ } ++ dev->dev.speedmask = (1 << dev->dev.speed); ++ ++ for (i = 0; i < MAX_ENDPOINTS; i++) { ++ usb_ep = usb_ep_get(&dev->dev, ++ (i & 0x10) ? USB_TOKEN_IN : USB_TOKEN_OUT, ++ i & 0x0f); ++ usb_ep->type = dev->endpoint[i].type; ++ usb_ep->ifnum = dev->endpoint[i].interface; ++ usb_ep->max_packet_size = dev->endpoint[i].max_packet_size; ++ if (dev->endpoint[i].type == usb_redir_type_bulk) { ++ usb_ep->pipeline = true; ++ } ++ } ++ return 0; ++} ++ ++/* For usbredirparser migration */ ++static void usbredir_put_parser(QEMUFile *f, void *priv, size_t unused) ++{ ++ USBRedirDevice *dev = priv; ++ uint8_t *data; ++ int len; ++ ++ if (dev->parser == NULL) { ++ qemu_put_be32(f, 0); ++ return; ++ } ++ ++ usbredirparser_serialize(dev->parser, &data, &len); ++ qemu_oom_check(data); ++ ++ qemu_put_be32(f, len); ++ qemu_put_buffer(f, data, len); ++ ++ free(data); ++} ++ ++static int usbredir_get_parser(QEMUFile *f, void *priv, size_t unused) ++{ ++ USBRedirDevice *dev = priv; ++ uint8_t *data; ++ int len, ret; ++ ++ len = qemu_get_be32(f); ++ if (len == 0) { ++ return 0; ++ } ++ ++ /* ++ * Our chardev should be open already at this point, otherwise ++ * the usbredir channel will be broken (ie spice without seamless) ++ */ ++ if (dev->parser == NULL) { ++ ERROR("get_parser called with closed chardev, failing migration\n"); ++ return -1; ++ } ++ ++ data = g_malloc(len); ++ qemu_get_buffer(f, data, len); ++ ++ ret = usbredirparser_unserialize(dev->parser, data, len); ++ ++ g_free(data); ++ ++ return ret; ++} ++ ++static const VMStateInfo usbredir_parser_vmstate_info = { ++ .name = "usb-redir-parser", ++ .put = usbredir_put_parser, ++ .get = usbredir_get_parser, ++}; ++ ++ ++/* For buffered packets (iso/irq) queue migration */ ++static void usbredir_put_bufpq(QEMUFile *f, void *priv, size_t unused) ++{ ++ struct endp_data *endp = priv; ++ struct buf_packet *bufp; ++ int remain = endp->bufpq_size; ++ ++ qemu_put_be32(f, endp->bufpq_size); ++ QTAILQ_FOREACH(bufp, &endp->bufpq, next) { ++ qemu_put_be32(f, bufp->len); ++ qemu_put_be32(f, bufp->status); ++ qemu_put_buffer(f, bufp->data, bufp->len); ++ remain--; ++ } ++ assert(remain == 0); ++} ++ ++static int usbredir_get_bufpq(QEMUFile *f, void *priv, size_t unused) ++{ ++ struct endp_data *endp = priv; ++ struct buf_packet *bufp; ++ int i; ++ ++ endp->bufpq_size = qemu_get_be32(f); ++ for (i = 0; i < endp->bufpq_size; i++) { ++ bufp = g_malloc(sizeof(struct buf_packet)); ++ bufp->len = qemu_get_be32(f); ++ bufp->status = qemu_get_be32(f); ++ bufp->data = qemu_oom_check(malloc(bufp->len)); /* regular malloc! */ ++ qemu_get_buffer(f, bufp->data, bufp->len); ++ QTAILQ_INSERT_TAIL(&endp->bufpq, bufp, next); ++ } ++ return 0; ++} ++ ++static const VMStateInfo usbredir_ep_bufpq_vmstate_info = { ++ .name = "usb-redir-bufpq", ++ .put = usbredir_put_bufpq, ++ .get = usbredir_get_bufpq, ++}; ++ ++ ++/* For endp_data migration */ ++static const VMStateDescription usbredir_ep_vmstate = { ++ .name = "usb-redir-ep", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = (VMStateField []) { ++ VMSTATE_UINT8(type, struct endp_data), ++ VMSTATE_UINT8(interval, struct endp_data), ++ VMSTATE_UINT8(interface, struct endp_data), ++ VMSTATE_UINT16(max_packet_size, struct endp_data), ++ VMSTATE_UINT8(iso_started, struct endp_data), ++ VMSTATE_UINT8(iso_error, struct endp_data), ++ VMSTATE_UINT8(interrupt_started, struct endp_data), ++ VMSTATE_UINT8(interrupt_error, struct endp_data), ++ VMSTATE_UINT8(bufpq_prefilled, struct endp_data), ++ VMSTATE_UINT8(bufpq_dropping_packets, struct endp_data), ++ { ++ .name = "bufpq", ++ .version_id = 0, ++ .field_exists = NULL, ++ .size = 0, ++ .info = &usbredir_ep_bufpq_vmstate_info, ++ .flags = VMS_SINGLE, ++ .offset = 0, ++ }, ++ VMSTATE_INT32(bufpq_target_size, struct endp_data), ++ VMSTATE_END_OF_LIST() ++ } ++}; ++ ++ ++/* For PacketIdQueue migration */ ++static void usbredir_put_packet_id_q(QEMUFile *f, void *priv, size_t unused) ++{ ++ struct PacketIdQueue *q = priv; ++ USBRedirDevice *dev = q->dev; ++ struct PacketIdQueueEntry *e; ++ int remain = q->size; ++ ++ DPRINTF("put_packet_id_q %s size %d\n", q->name, q->size); ++ qemu_put_be32(f, q->size); ++ QTAILQ_FOREACH(e, &q->head, next) { ++ qemu_put_be64(f, e->id); ++ remain--; ++ } ++ assert(remain == 0); ++} ++ ++static int usbredir_get_packet_id_q(QEMUFile *f, void *priv, size_t unused) ++{ ++ struct PacketIdQueue *q = priv; ++ USBRedirDevice *dev = q->dev; ++ int i, size; ++ uint64_t id; ++ ++ size = qemu_get_be32(f); ++ DPRINTF("get_packet_id_q %s size %d\n", q->name, size); ++ for (i = 0; i < size; i++) { ++ id = qemu_get_be64(f); ++ packet_id_queue_add(q, id); ++ } ++ assert(q->size == size); ++ return 0; ++} ++ ++static const VMStateInfo usbredir_ep_packet_id_q_vmstate_info = { ++ .name = "usb-redir-packet-id-q", ++ .put = usbredir_put_packet_id_q, ++ .get = usbredir_get_packet_id_q, ++}; ++ ++static const VMStateDescription usbredir_ep_packet_id_queue_vmstate = { ++ .name = "usb-redir-packet-id-queue", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = (VMStateField []) { ++ { ++ .name = "queue", ++ .version_id = 0, ++ .field_exists = NULL, ++ .size = 0, ++ .info = &usbredir_ep_packet_id_q_vmstate_info, ++ .flags = VMS_SINGLE, ++ .offset = 0, ++ }, ++ VMSTATE_END_OF_LIST() ++ } ++}; ++ ++ ++/* For usb_redir_device_connect_header migration */ ++static const VMStateDescription usbredir_device_info_vmstate = { ++ .name = "usb-redir-device-info", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = (VMStateField []) { ++ VMSTATE_UINT8(speed, struct usb_redir_device_connect_header), ++ VMSTATE_UINT8(device_class, struct usb_redir_device_connect_header), ++ VMSTATE_UINT8(device_subclass, struct usb_redir_device_connect_header), ++ VMSTATE_UINT8(device_protocol, struct usb_redir_device_connect_header), ++ VMSTATE_UINT16(vendor_id, struct usb_redir_device_connect_header), ++ VMSTATE_UINT16(product_id, struct usb_redir_device_connect_header), ++ VMSTATE_UINT16(device_version_bcd, ++ struct usb_redir_device_connect_header), ++ VMSTATE_END_OF_LIST() ++ } ++}; ++ ++ ++/* For usb_redir_interface_info_header migration */ ++static const VMStateDescription usbredir_interface_info_vmstate = { ++ .name = "usb-redir-interface-info", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = (VMStateField []) { ++ VMSTATE_UINT32(interface_count, ++ struct usb_redir_interface_info_header), ++ VMSTATE_UINT8_ARRAY(interface, ++ struct usb_redir_interface_info_header, 32), ++ VMSTATE_UINT8_ARRAY(interface_class, ++ struct usb_redir_interface_info_header, 32), ++ VMSTATE_UINT8_ARRAY(interface_subclass, ++ struct usb_redir_interface_info_header, 32), ++ VMSTATE_UINT8_ARRAY(interface_protocol, ++ struct usb_redir_interface_info_header, 32), ++ VMSTATE_END_OF_LIST() ++ } ++}; ++ ++ ++/* And finally the USBRedirDevice vmstate itself */ ++static const VMStateDescription usbredir_vmstate = { ++ .name = "usb-redir", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .pre_save = usbredir_pre_save, ++ .post_load = usbredir_post_load, ++ .fields = (VMStateField []) { ++ VMSTATE_USB_DEVICE(dev, USBRedirDevice), ++ VMSTATE_TIMER(attach_timer, USBRedirDevice), ++ { ++ .name = "parser", ++ .version_id = 0, ++ .field_exists = NULL, ++ .size = 0, ++ .info = &usbredir_parser_vmstate_info, ++ .flags = VMS_SINGLE, ++ .offset = 0, ++ }, ++ VMSTATE_STRUCT_ARRAY(endpoint, USBRedirDevice, MAX_ENDPOINTS, 1, ++ usbredir_ep_vmstate, struct endp_data), ++ VMSTATE_STRUCT(cancelled, USBRedirDevice, 1, ++ usbredir_ep_packet_id_queue_vmstate, ++ struct PacketIdQueue), ++ VMSTATE_STRUCT(already_in_flight, USBRedirDevice, 1, ++ usbredir_ep_packet_id_queue_vmstate, ++ struct PacketIdQueue), ++ VMSTATE_STRUCT(device_info, USBRedirDevice, 1, ++ usbredir_device_info_vmstate, ++ struct usb_redir_device_connect_header), ++ VMSTATE_STRUCT(interface_info, USBRedirDevice, 1, ++ usbredir_interface_info_vmstate, ++ struct usb_redir_interface_info_header), ++ VMSTATE_END_OF_LIST() ++ } ++}; ++ + static Property usbredir_properties[] = { + DEFINE_PROP_CHR("chardev", USBRedirDevice, cs), + DEFINE_PROP_UINT8("debug", USBRedirDevice, debug, 0), +@@ -1545,6 +1887,7 @@ static void usbredir_class_initfn(ObjectClass *klass, void *data) + uc->handle_reset = usbredir_handle_reset; + uc->handle_data = usbredir_handle_data; + uc->handle_control = usbredir_handle_control; ++ dc->vmsd = &usbredir_vmstate; + dc->props = usbredir_properties; + } + +-- +1.7.12.1 + diff --git a/0629-usb-redir-Add-chardev-open-close-debug-logging.patch b/0629-usb-redir-Add-chardev-open-close-debug-logging.patch new file mode 100644 index 0000000..5e8305d --- /dev/null +++ b/0629-usb-redir-Add-chardev-open-close-debug-logging.patch @@ -0,0 +1,54 @@ +From 5a717110d859cbd989634e8acdcedd800ee2be74 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 5 Sep 2012 15:56:57 +0200 +Subject: [PATCH] usb-redir: Add chardev open / close debug logging + +Signed-off-by: Hans de Goede +--- + hw/usb/redirect.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index b7387b6..57e6289 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -866,6 +866,7 @@ static void usbredir_chardev_close_bh(void *opaque) + usbredir_device_disconnect(dev); + + if (dev->parser) { ++ DPRINTF("destroying usbredirparser\n"); + usbredirparser_destroy(dev->parser); + dev->parser = NULL; + } +@@ -881,6 +882,8 @@ static void usbredir_chardev_open(USBRedirDevice *dev) + usbredir_chardev_close_bh(dev); + qemu_bh_cancel(dev->chardev_close_bh); + ++ DPRINTF("creating usbredirparser\n"); ++ + dev->parser = qemu_oom_check(usbredirparser_create()); + dev->parser->priv = dev; + dev->parser->log_func = usbredir_log; +@@ -989,9 +992,11 @@ static void usbredir_chardev_event(void *opaque, int event) + + switch (event) { + case CHR_EVENT_OPENED: ++ DPRINTF("chardev open\n"); + usbredir_chardev_open(dev); + break; + case CHR_EVENT_CLOSED: ++ DPRINTF("chardev close\n"); + qemu_bh_schedule(dev->chardev_close_bh); + break; + } +@@ -1250,6 +1255,7 @@ static void usbredir_device_disconnect(void *priv) + qemu_del_timer(dev->attach_timer); + + if (dev->dev.attached) { ++ DPRINTF("detaching device\n"); + usb_device_detach(&dev->dev); + /* + * Delay next usb device attach to give the guest a chance to see +-- +1.7.12.1 + diff --git a/0630-usb-redir-Revert-usb-redir-part-of-commit-93bfef4c.patch b/0630-usb-redir-Revert-usb-redir-part-of-commit-93bfef4c.patch new file mode 100644 index 0000000..4ffc46b --- /dev/null +++ b/0630-usb-redir-Revert-usb-redir-part-of-commit-93bfef4c.patch @@ -0,0 +1,35 @@ +From b95fb22d2799ed07c55bccbd7ffa3cb19fb7feb3 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Mon, 10 Sep 2012 13:49:46 +0200 +Subject: [PATCH] usb-redir: Revert usb-redir part of commit 93bfef4c + +Commit 93bfef4c6e4b23caea9d51e1099d06433d8835a4 makes qemu-devices +which report the qemu version string to the guest in some way use a +qemu_get_version function which reports a machine-specific version string. + +However usb-redir does not expose the qemu version to the guest, only to +the usbredir-host as part of the initial handshake. This can then be logged +on the usbredir-host side for debugging purposes and is otherwise completely +unused! For debugging purposes it is important to have the real qemu version +in there, rather then the machine-specific version. + +Signed-off-by: Hans de Goede +--- + hw/usb/redirect.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 57e6289..78e93a7 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -875,7 +875,6 @@ static void usbredir_chardev_close_bh(void *opaque) + static void usbredir_chardev_open(USBRedirDevice *dev) + { + uint32_t caps[USB_REDIR_CAPS_SIZE] = { 0, }; +- char version[32]; + int flags = 0; + + /* Make sure any pending closes are handled (no-op if none pending) */ +-- +1.7.12.1 + diff --git a/0631-ehci-Fix-interrupt-packet-MULT-handling.patch b/0631-ehci-Fix-interrupt-packet-MULT-handling.patch new file mode 100644 index 0000000..17abd7f --- /dev/null +++ b/0631-ehci-Fix-interrupt-packet-MULT-handling.patch @@ -0,0 +1,131 @@ +From d6fe9953a8277a54ae7f4cefa192b49d9bf99e3d Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 20 Sep 2012 16:55:02 +0200 +Subject: [PATCH] ehci: Fix interrupt packet MULT handling + +There are several issues with our handling of the MULT epcap field +of interrupt qhs, which this patch fixes. + +1) When we don't execute a transaction because of the transaction counter +being 0, p->async stays EHCI_ASYNC_NONE, and the next time we process the +same qtd we hit an assert in ehci_state_fetchqtd because of this. Even though +I believe that this is caused by 3 below, this patch still removes the assert, +as that can still happen without 3, when multiple packets are queued for the +same interrupt ep. + +2) We only *check* the transaction counter from ehci_state_execute, any +packets queued up by fill_queue bypass this check. This is fixed by not calling +fill_queue for interrupt packets. + +3) Some versions of Windows set the MULT field of the qh to 0, which is a +clear violation of the EHCI spec, but still they do it. This means that we +will never execute a qtd for these, making interrupt ep-s on USB-2 devices +not work, and after recent changes, triggering 1). + +So far we've stored the transaction counter in our copy of the mult field, +but with this beginnig at 0 already when dealing with these version of windows +this won't work. So this patch adds a transact_ctr field to our qh struct, +and sets this to the MULT field value on fetchqh. When the MULT field value +is 0, we set it to 4. Assuming that windows gets way with setting it to 0, +by the actual hardware going horizontal on a 1 -> 0 transition, which will +give it 4 transactions (MULT goes from 0 - 3). + +Note that we cannot stop on detecting the 1 -> 0 transition, as our decrement +of the transaction counter, and checking for it are done in 2 different places. + +Reported-by: Shawn Starr +Signed-off-by: Hans de Goede +--- + hw/usb/hcd-ehci.c | 39 +++++++++++++++++++-------------------- + 1 file changed, 19 insertions(+), 20 deletions(-) + +diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c +index 6a5da84..46f6d99 100644 +--- a/hw/usb/hcd-ehci.c ++++ b/hw/usb/hcd-ehci.c +@@ -373,6 +373,7 @@ struct EHCIQueue { + uint32_t seen; + uint64_t ts; + int async; ++ int transact_ctr; + + /* cached data from guest - needs to be flushed + * when guest removes an entry (doorbell, handshake sequence) +@@ -1837,6 +1838,10 @@ static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int async) + } + q->qh = qh; + ++ q->transact_ctr = get_field(q->qh.epcap, QH_EPCAP_MULT); ++ if (q->transact_ctr == 0) /* Guest bug in some versions of windows */ ++ q->transact_ctr = 4; ++ + if (q->dev == NULL) { + q->dev = ehci_find_device(q->ehci, devaddr); + } +@@ -2014,11 +2019,8 @@ static int ehci_state_fetchqtd(EHCIQueue *q) + } else if (p != NULL) { + switch (p->async) { + case EHCI_ASYNC_NONE: +- /* Should never happen packet should at least be initialized */ +- assert(0); +- break; + case EHCI_ASYNC_INITIALIZED: +- /* Previously nacked packet (likely interrupt ep) */ ++ /* Not yet executed (MULT), or previously nacked (int) packet */ + ehci_set_state(q->ehci, q->async, EST_EXECUTE); + break; + case EHCI_ASYNC_INFLIGHT: +@@ -2107,15 +2109,12 @@ static int ehci_state_execute(EHCIQueue *q) + + // TODO verify enough time remains in the uframe as in 4.4.1.1 + // TODO write back ptr to async list when done or out of time +- // TODO Windows does not seem to ever set the MULT field + +- if (!q->async) { +- int transactCtr = get_field(q->qh.epcap, QH_EPCAP_MULT); +- if (!transactCtr) { +- ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH); +- again = 1; +- goto out; +- } ++ /* 4.10.3, bottom of page 82, go horizontal on transaction counter == 0 */ ++ if (!q->async && q->transact_ctr == 0) { ++ ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH); ++ again = 1; ++ goto out; + } + + if (q->async) { +@@ -2132,7 +2131,11 @@ static int ehci_state_execute(EHCIQueue *q) + trace_usb_ehci_packet_action(p->queue, p, "async"); + p->async = EHCI_ASYNC_INFLIGHT; + ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH); +- again = (ehci_fill_queue(p) == USB_RET_PROCERR) ? -1 : 1; ++ if (q->async) { ++ again = (ehci_fill_queue(p) == USB_RET_PROCERR) ? -1 : 1; ++ } else { ++ again = 1; ++ } + goto out; + } + +@@ -2152,13 +2155,9 @@ static int ehci_state_executing(EHCIQueue *q) + + ehci_execute_complete(q); + +- // 4.10.3 +- if (!q->async) { +- int transactCtr = get_field(q->qh.epcap, QH_EPCAP_MULT); +- transactCtr--; +- set_field(&q->qh.epcap, transactCtr, QH_EPCAP_MULT); +- // 4.10.3, bottom of page 82, should exit this state when transaction +- // counter decrements to 0 ++ /* 4.10.3 */ ++ if (!q->async && q->transact_ctr > 0) { ++ q->transact_ctr--; + } + + /* 4.10.5 */ +-- +1.7.12.1 + diff --git a/0632-usb-redir-Adjust-pkg-config-check-for-usbredirparser.patch b/0632-usb-redir-Adjust-pkg-config-check-for-usbredirparser.patch new file mode 100644 index 0000000..a8bebbd --- /dev/null +++ b/0632-usb-redir-Adjust-pkg-config-check-for-usbredirparser.patch @@ -0,0 +1,49 @@ +From 79467d7c3fe963b39b00c884a5624cb1e754db9d Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 25 Sep 2012 13:22:21 +0200 +Subject: [PATCH] usb-redir: Adjust pkg-config check for usbredirparser .pc + file rename (v2) + +The usbredir 0.5 release introduced the new API for 64 bit packet ids, but +it kept the libusbredirparser.pc name as is, meaning that older versions of +qemu will still have their pkg-config check for usbredirparser fulfilled, +and build with the usb-redir device. Due to the API change there will be +some compiler warnings, but the build will succeed, however the usb-redir +device will be broken on 32 bit machines. + +To solve this a new usbredir-0.5.2 release is coming, which renames the +libusbredirparser.pc file to libusbredirparser-0.5.pc, so that it will no +longer fulfill the pkg-config check of the qemu-1.2 and older releases, +stopping the (silent) breakage. This patch adjusts qemu master's configure +to properly detect the new usbredir release. + +Changes in v2: +-Not only use the new .pc name in the check but also when getting cflags + and libs! + +Signed-off-by: Hans de Goede +--- + configure | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/configure b/configure +index 2c4469f..f019526 100755 +--- a/configure ++++ b/configure +@@ -2758,10 +2758,10 @@ fi + + # check for usbredirparser for usb network redirection support + if test "$usb_redir" != "no" ; then +- if $pkg_config --atleast-version=0.5 libusbredirparser >/dev/null 2>&1 ; then ++ if $pkg_config --atleast-version=0.5 libusbredirparser-0.5 >/dev/null 2>&1 ; then + usb_redir="yes" +- usb_redir_cflags=$($pkg_config --cflags libusbredirparser 2>/dev/null) +- usb_redir_libs=$($pkg_config --libs libusbredirparser 2>/dev/null) ++ usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5 2>/dev/null) ++ usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5 2>/dev/null) + QEMU_CFLAGS="$QEMU_CFLAGS $usb_redir_cflags" + libs_softmmu="$libs_softmmu $usb_redir_libs" + else +-- +1.7.12.1 + diff --git a/0633-usb-redir-Change-usbredir_open_chardev-into-usbredir.patch b/0633-usb-redir-Change-usbredir_open_chardev-into-usbredir.patch new file mode 100644 index 0000000..f39bc12 --- /dev/null +++ b/0633-usb-redir-Change-usbredir_open_chardev-into-usbredir.patch @@ -0,0 +1,49 @@ +From 9ebfb490e04e1fe5466a4d31df17c5e6283236cb Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 27 Sep 2012 16:59:50 +0200 +Subject: [PATCH] usb-redir: Change usbredir_open_chardev into + usbredir_create_parser + +As we need to create the parser at more places. + +Signed-off-by: Hans de Goede +--- + hw/usb/redirect.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 78e93a7..5d16aff 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -872,15 +872,11 @@ static void usbredir_chardev_close_bh(void *opaque) + } + } + +-static void usbredir_chardev_open(USBRedirDevice *dev) ++static void usbredir_create_parser(USBRedirDevice *dev) + { + uint32_t caps[USB_REDIR_CAPS_SIZE] = { 0, }; + int flags = 0; + +- /* Make sure any pending closes are handled (no-op if none pending) */ +- usbredir_chardev_close_bh(dev); +- qemu_bh_cancel(dev->chardev_close_bh); +- + DPRINTF("creating usbredirparser\n"); + + dev->parser = qemu_oom_check(usbredirparser_create()); +@@ -992,7 +988,10 @@ static void usbredir_chardev_event(void *opaque, int event) + switch (event) { + case CHR_EVENT_OPENED: + DPRINTF("chardev open\n"); +- usbredir_chardev_open(dev); ++ /* Make sure any pending closes are handled (no-op if none pending) */ ++ usbredir_chardev_close_bh(dev); ++ qemu_bh_cancel(dev->chardev_close_bh); ++ usbredir_create_parser(dev); + break; + case CHR_EVENT_CLOSED: + DPRINTF("chardev close\n"); +-- +1.7.12.1 + diff --git a/0634-usb-redir-Don-t-make-migration-fail-in-none-seamless.patch b/0634-usb-redir-Don-t-make-migration-fail-in-none-seamless.patch new file mode 100644 index 0000000..a222747 --- /dev/null +++ b/0634-usb-redir-Don-t-make-migration-fail-in-none-seamless.patch @@ -0,0 +1,42 @@ +From c57b03073357e813ade4b3b34f6c1e3c0de394c2 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 27 Sep 2012 16:57:41 +0200 +Subject: [PATCH] usb-redir: Don't make migration fail in none seamless case + +Instead simple disconnect the device like host redirection does on +migration. + +Signed-off-by: Hans de Goede +--- + hw/usb/redirect.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c +index 5d16aff..022ba42 100644 +--- a/hw/usb/redirect.c ++++ b/hw/usb/redirect.c +@@ -1637,12 +1637,17 @@ static int usbredir_get_parser(QEMUFile *f, void *priv, size_t unused) + } + + /* +- * Our chardev should be open already at this point, otherwise +- * the usbredir channel will be broken (ie spice without seamless) ++ * If our chardev is not open already at this point the usbredir connection ++ * has been broken (non seamless migration, or restore from disk). ++ * ++ * In this case create a temporary parser to receive the migration data, ++ * and schedule the close_bh to report the device as disconnected to the ++ * guest and to destroy the parser again. + */ + if (dev->parser == NULL) { +- ERROR("get_parser called with closed chardev, failing migration\n"); +- return -1; ++ WARNING("usb-redir connection broken during migration\n"); ++ usbredir_create_parser(dev); ++ qemu_bh_schedule(dev->chardev_close_bh); + } + + data = g_malloc(len); +-- +1.7.12.1 + diff --git a/0800-mips-Fix-link-error-with-piix4_pm_init.patch b/0800-mips-Fix-link-error-with-piix4_pm_init.patch new file mode 100644 index 0000000..3ceb891 --- /dev/null +++ b/0800-mips-Fix-link-error-with-piix4_pm_init.patch @@ -0,0 +1,30 @@ +From 5196eaa783b83110e6a8b99bfeb244b758b6e9c7 Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Mon, 6 Aug 2012 17:12:40 -0400 +Subject: [PATCH] mips: Fix link error with 'piix4_pm_init' + + LINK mips-softmmu/qemu-system-mips + LINK m68k-softmmu/qemu-system-m68k +hw/mips/../mips_malta.o: In function `mips_malta_init': +/home/crobinso/qemu-kvm/hw/mips/../mips_malta.c:961: undefined reference to `piix4_pm_init' + +Signed-off-by: Cole Robinson +--- + hw/mips/Makefile.objs | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/hw/mips/Makefile.objs b/hw/mips/Makefile.objs +index 29a5d0d..89af0e9 100644 +--- a/hw/mips/Makefile.objs ++++ b/hw/mips/Makefile.objs +@@ -1,6 +1,7 @@ + obj-y = mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o + obj-y += mips_addr.o mips_timer.o mips_int.o + obj-y += gt64xxx.o mc146818rtc.o ++obj-y += acpi.o acpi_piix4.o + obj-$(CONFIG_FULONG) += bonito.o vt82c686.o mips_fulong2e.o + + obj-y := $(addprefix ../,$(obj-y)) +-- +1.7.12.1 + diff --git a/0801-configure-Add-disable-kvm-options.patch b/0801-configure-Add-disable-kvm-options.patch new file mode 100644 index 0000000..05021f1 --- /dev/null +++ b/0801-configure-Add-disable-kvm-options.patch @@ -0,0 +1,72 @@ +From b80fff00ed7f9baff808edb6c2c9f98f7e75e8ca Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Mon, 13 Aug 2012 18:39:54 -0400 +Subject: [PATCH] configure: Add --disable-kvm-options + +In Fedora, our qemu package is based on qemu-kvm, and we go to convoluted +lengths to provide a qemu-kvm binary with KVM on by default, but all +qemu-system-* with KVM off by default (using ./configure --disable-kvm) + +For qemu-system*, what we really want is upstream qemu symantics of TCG +by default, but the opt in option for KVM. CONFIG_KVM_OPTIONS fits the +bill, so let's expose it through ./configure. This will also simplify +our packaging for non-x86 KVM. + +Signed-off-by: Cole Robinson +--- + configure | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/configure b/configure +index f019526..933754d 100755 +--- a/configure ++++ b/configure +@@ -210,6 +210,7 @@ bsd_user="no" + guest_base="" + uname_release="" + mixemu="no" ++kvmoptions="yes" + aix="no" + blobs="yes" + pkgversion=" ($(kvm_version))" +@@ -732,6 +733,8 @@ for opt do + ;; + --enable-kvm) kvm="yes" + ;; ++ --disable-kvm-options) kvmoptions="no" ++ ;; + --disable-tcg-interpreter) tcg_interpreter="no" + ;; + --enable-tcg-interpreter) tcg_interpreter="yes" +@@ -1080,6 +1083,8 @@ echo " --enable-bluez enable bluez stack connectivity" + echo " --disable-slirp disable SLIRP userspace network connectivity" + echo " --disable-kvm disable KVM acceleration support" + echo " --enable-kvm enable KVM acceleration support" ++echo " --disable-kvm-options if KVM is enabled, default to KVM=off, and" ++echo " remove non-upstream cli options" + echo " --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)" + echo " --disable-nptl disable usermode NPTL support" + echo " --enable-nptl enable usermode NPTL support" +@@ -3160,6 +3165,7 @@ echo "ATTR/XATTR support $attr" + echo "Install blobs $blobs" + echo "KVM support $kvm" + echo "TCG interpreter $tcg_interpreter" ++echo "KVM CLI options $kvmoptions" + echo "fdt support $fdt" + echo "preadv support $preadv" + echo "fdatasync $fdatasync" +@@ -3893,7 +3899,10 @@ case "$target_arch2" in + \( "$target_arch2" = "x86_64" -a "$cpu" = "i386" \) -o \ + \( "$target_arch2" = "i386" -a "$cpu" = "x86_64" \) \) ; then + echo "CONFIG_KVM=y" >> $config_target_mak +- echo "CONFIG_KVM_OPTIONS=y" >> $config_host_mak ++ ++ if test "$kvmoptions" = "yes" ; then ++ echo "CONFIG_KVM_OPTIONS=y" >> $config_host_mak ++ fi + if test "$vhost_net" = "yes" ; then + echo "CONFIG_VHOST_NET=y" >> $config_target_mak + fi +-- +1.7.12.1 + diff --git a/0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch b/0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch new file mode 100644 index 0000000..649fb0e --- /dev/null +++ b/0802-arm_boot-Change-initrd-load-address-to-halfway-throu.patch @@ -0,0 +1,138 @@ +From d3a43fe4b870154032db4651824bc88e3cb81dc5 Mon Sep 17 00:00:00 2001 +From: Peter Maydell +Date: Fri, 26 Oct 2012 16:29:38 +0100 +Subject: [PATCH] arm_boot: Change initrd load address to "halfway through + RAM" + +To avoid continually having to bump the initrd load address +to account for larger kernel images, put the initrd halfway +through RAM. This allows large kernels on new boards with lots +of RAM to work OK, without breaking existing usecases for +boards with only 32MB of RAM. + +Note that this change fixes in passing a bug where we were +passing an overly large max_size to load_image_targphys() +for the initrd, which meant that we wouldn't correctly refuse +to load an enormous initrd that didn't actually fit into RAM. + +Signed-off-by: Peter Maydell +--- + hw/arm-misc.h | 1 + + hw/arm_boot.c | 41 ++++++++++++++++++++++++++--------------- + 2 files changed, 27 insertions(+), 15 deletions(-) + +diff --git a/hw/arm-misc.h b/hw/arm-misc.h +index bdd8fec..0f7deb5 100644 +--- a/hw/arm-misc.h ++++ b/hw/arm-misc.h +@@ -56,6 +56,7 @@ struct arm_boot_info { + const struct arm_boot_info *info); + /* Used internally by arm_boot.c */ + int is_linux; ++ target_phys_addr_t initrd_start; + target_phys_addr_t initrd_size; + target_phys_addr_t entry; + }; +diff --git a/hw/arm_boot.c b/hw/arm_boot.c +index a6e9143..920c337 100644 +--- a/hw/arm_boot.c ++++ b/hw/arm_boot.c +@@ -18,7 +18,6 @@ + + #define KERNEL_ARGS_ADDR 0x100 + #define KERNEL_LOAD_ADDR 0x00010000 +-#define INITRD_LOAD_ADDR 0x00d00000 + + /* The worlds second smallest bootloader. Set r0-r2, then jump to kernel. */ + static uint32_t bootloader[] = { +@@ -109,7 +108,7 @@ static void set_kernel_args(const struct arm_boot_info *info) + /* ATAG_INITRD2 */ + WRITE_WORD(p, 4); + WRITE_WORD(p, 0x54420005); +- WRITE_WORD(p, info->loader_start + INITRD_LOAD_ADDR); ++ WRITE_WORD(p, info->initrd_start); + WRITE_WORD(p, initrd_size); + } + if (info->kernel_cmdline && *info->kernel_cmdline) { +@@ -185,10 +184,11 @@ static void set_kernel_args_old(const struct arm_boot_info *info) + /* pages_in_vram */ + WRITE_WORD(p, 0); + /* initrd_start */ +- if (initrd_size) +- WRITE_WORD(p, info->loader_start + INITRD_LOAD_ADDR); +- else ++ if (initrd_size) { ++ WRITE_WORD(p, info->initrd_start); ++ } else { + WRITE_WORD(p, 0); ++ } + /* initrd_size */ + WRITE_WORD(p, initrd_size); + /* rd_start */ +@@ -281,14 +281,13 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) + + if (binfo->initrd_size) { + rc = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-start", +- binfo->loader_start + INITRD_LOAD_ADDR); ++ binfo->initrd_start); + if (rc < 0) { + fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n"); + } + + rc = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-end", +- binfo->loader_start + INITRD_LOAD_ADDR + +- binfo->initrd_size); ++ binfo->initrd_start + binfo->initrd_size); + if (rc < 0) { + fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n"); + } +@@ -375,6 +374,19 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info) + big_endian = 0; + #endif + ++ /* We want to put the initrd far enough into RAM that when the ++ * kernel is uncompressed it will not clobber the initrd. However ++ * on boards without much RAM we must ensure that we still leave ++ * enough room for a decent sized initrd, and on boards with large ++ * amounts of RAM we must avoid the initrd being so far up in RAM ++ * that it is outside lowmem and inaccessible to the kernel. ++ * So for boards with less than 256MB of RAM we put the initrd ++ * halfway into RAM, and for boards with 256MB of RAM or more we put ++ * the initrd at 128MB. ++ */ ++ info->initrd_start = info->loader_start + ++ MIN(info->ram_size / 2, 128 * 1024 * 1024); ++ + /* Assume that raw images are linux kernels, and ELF images are not. */ + kernel_size = load_elf(info->kernel_filename, NULL, NULL, &elf_entry, + NULL, NULL, big_endian, ELF_MACHINE, 1); +@@ -398,10 +410,9 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info) + if (is_linux) { + if (info->initrd_filename) { + initrd_size = load_image_targphys(info->initrd_filename, +- info->loader_start +- + INITRD_LOAD_ADDR, +- info->ram_size +- - INITRD_LOAD_ADDR); ++ info->initrd_start, ++ info->ram_size - ++ info->initrd_start); + if (initrd_size < 0) { + fprintf(stderr, "qemu: could not load initrd '%s'\n", + info->initrd_filename); +@@ -419,9 +430,9 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info) + */ + if (info->dtb_filename) { + /* Place the DTB after the initrd in memory */ +- target_phys_addr_t dtb_start = TARGET_PAGE_ALIGN(info->loader_start +- + INITRD_LOAD_ADDR +- + initrd_size); ++ target_phys_addr_t dtb_start = TARGET_PAGE_ALIGN( ++ info->initrd_start + ++ initrd_size); + if (load_dtb(dtb_start, info)) { + exit(1); + } +-- +1.7.12.1 + diff --git a/0803-dtrace-backend-add-function-to-reserved-words.patch b/0803-dtrace-backend-add-function-to-reserved-words.patch new file mode 100644 index 0000000..cc58c6f --- /dev/null +++ b/0803-dtrace-backend-add-function-to-reserved-words.patch @@ -0,0 +1,27 @@ +From 4780bb16558d2753e2277e1570644bec49551534 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Sun, 2 Sep 2012 02:04:16 +0300 +Subject: [PATCH] dtrace backend: add function to reserved words + +Signed-off-by: Alon Levy +Signed-off-by: Stefan Hajnoczi +--- + scripts/tracetool/backend/dtrace.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/tracetool/backend/dtrace.py b/scripts/tracetool/backend/dtrace.py +index 9cab75c..6be7047 100644 +--- a/scripts/tracetool/backend/dtrace.py ++++ b/scripts/tracetool/backend/dtrace.py +@@ -87,7 +87,7 @@ def stap(events): + if len(e.args) > 0: + for name in e.args.names(): + # Append underscore to reserved keywords +- if name in ('limit', 'in', 'next', 'self'): ++ if name in ('limit', 'in', 'next', 'self', 'function'): + name += '_' + out(' %s = $arg%d;' % (name, i)) + i += 1 +-- +1.7.12.1 + diff --git a/0804-wip-hw-qxl-inject-interrupts-in-any-state.patch b/0804-wip-hw-qxl-inject-interrupts-in-any-state.patch new file mode 100644 index 0000000..4e5222d --- /dev/null +++ b/0804-wip-hw-qxl-inject-interrupts-in-any-state.patch @@ -0,0 +1,24 @@ +From e0575d0a1a14e8f4e8fc11d549cbd07cca433383 Mon Sep 17 00:00:00 2001 +From: Alon Levy +Date: Tue, 30 Oct 2012 18:00:33 +0200 +Subject: [PATCH] wip: hw/qxl: inject interrupts in any state + +--- + hw/qxl.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/hw/qxl.c b/hw/qxl.c +index 9389752..b137731 100644 +--- a/hw/qxl.c ++++ b/hw/qxl.c +@@ -1714,7 +1714,6 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events) + uint32_t le_events = cpu_to_le32(events); + + trace_qxl_send_events(d->id, events); +- assert(qemu_spice_display_is_running(&d->ssd)); + old_pending = __sync_fetch_and_or(&d->ram->int_pending, le_events); + if ((old_pending & le_events) == le_events) { + return; +-- +1.7.12.1 + diff --git a/0805-configure-Fix-CONFIG_QEMU_HELPERDIR-generation.patch b/0805-configure-Fix-CONFIG_QEMU_HELPERDIR-generation.patch new file mode 100644 index 0000000..dfaf285 --- /dev/null +++ b/0805-configure-Fix-CONFIG_QEMU_HELPERDIR-generation.patch @@ -0,0 +1,31 @@ +From 38f419f35225decdbaea9fe1fd00218f8924ce84 Mon Sep 17 00:00:00 2001 +From: Jan Kiszka +Date: Wed, 17 Oct 2012 19:09:25 +0200 +Subject: [PATCH] configure: Fix CONFIG_QEMU_HELPERDIR generation + +We need to evaluate $libexecdir in configure, otherwise we literally end +up with "${prefix}/libexec" instead of the absolute path as +CONFIG_QEMU_HELPERDIR. + +Signed-off-by: Jan Kiszka +Signed-off-by: Aurelien Jarno +--- + configure | 2 +- + 1 file modificato, 1 inserzione(+). 1 rimozione(-) + +diff --git a/configure b/configure +index f9c31f4..9f33c7d 100755 +--- a/configure ++++ b/configure +@@ -3200,7 +3200,7 @@ echo "qemu_confdir=$qemu_confdir" >> $config_host_mak + echo "qemu_confdir=$qemu_confdir" >> $config_host_mak + echo "qemu_datadir=$qemu_datadir" >> $config_host_mak + echo "qemu_docdir=$qemu_docdir" >> $config_host_mak +-echo "CONFIG_QEMU_HELPERDIR=\"$libexecdir\"" >> $config_host_mak ++echo "CONFIG_QEMU_HELPERDIR=\"`eval echo $libexecdir`\"" >> $config_host_mak + + echo "ARCH=$ARCH" >> $config_host_mak + if test "$debug_tcg" = "yes" ; then +-- +1.7.12.1 + diff --git a/80-kvm.rules b/80-kvm.rules new file mode 100644 index 0000000..e61b48f --- /dev/null +++ b/80-kvm.rules @@ -0,0 +1 @@ +KERNEL=="kvm", GROUP="kvm", MODE="0666" diff --git a/99-qemu-guest-agent.rules b/99-qemu-guest-agent.rules new file mode 100644 index 0000000..8a290ab --- /dev/null +++ b/99-qemu-guest-agent.rules @@ -0,0 +1,2 @@ +SUBSYSTEM=="virtio-ports", ATTR{name}=="org.qemu.guest_agent.0", \ + TAG+="systemd" ENV{SYSTEMD_WANTS}="qemu-guest-agent.service" diff --git a/bridge.conf b/bridge.conf new file mode 100644 index 0000000..a573665 --- /dev/null +++ b/bridge.conf @@ -0,0 +1 @@ +allow virbr0 diff --git a/ksm.service b/ksm.service new file mode 100644 index 0000000..ccc2767 --- /dev/null +++ b/ksm.service @@ -0,0 +1,13 @@ +[Unit] +Description=Kernel Samepage Merging +ConditionPathExists=/sys/kernel/mm/ksm + +[Service] +Type=oneshot +RemainAfterExit=yes +EnvironmentFile=-/etc/sysconfig/ksm +ExecStart=/lib/systemd/ksmctl start +ExecStop=/lib/systemd/ksmctl stop + +[Install] +WantedBy=multi-user.target diff --git a/ksm.sysconfig b/ksm.sysconfig new file mode 100644 index 0000000..d99656d --- /dev/null +++ b/ksm.sysconfig @@ -0,0 +1,4 @@ +# The maximum number of unswappable kernel pages +# which may be allocated by ksm (0 for unlimited) +# If unset, defaults to half of total memory +# KSM_MAX_KERNEL_PAGES= diff --git a/ksmctl.c b/ksmctl.c new file mode 100644 index 0000000..af39591 --- /dev/null +++ b/ksmctl.c @@ -0,0 +1,77 @@ +/* Start/stop KSM, for systemd. + * Copyright (C) 2009, 2011 Red Hat, Inc. + * Written by Paolo Bonzini . + * Based on the original sysvinit script by Dan Kenigsberg + * This file is distributed under the GNU General Public License, version 2 + * or later. */ + +#include +#include +#include +#include +#include +#include + +#define KSM_MAX_KERNEL_PAGES_FILE "/sys/kernel/mm/ksm/max_kernel_pages" +#define KSM_RUN_FILE "/sys/kernel/mm/ksm/run" + +char *program_name; + +int usage(void) +{ + fprintf(stderr, "Usage: %s {start|stop}\n", program_name); + return 1; +} + +int write_value(uint64_t value, char *filename) +{ + FILE *fp; + if (!(fp = fopen(filename, "w")) || + fprintf(fp, "%llu\n", (unsigned long long) value) == EOF || + fflush(fp) == EOF || + fclose(fp) == EOF) + return 1; + + return 0; +} + +uint64_t ksm_max_kernel_pages() +{ + char *var = getenv("KSM_MAX_KERNEL_PAGES"); + char *endptr; + uint64_t value; + if (var && *var) { + value = strtoll(var, &endptr, 0); + if (value < LLONG_MAX && !*endptr) + return value; + } + /* Unless KSM_MAX_KERNEL_PAGES is set, let KSM munch up to half of + * total memory. */ + return sysconf(_SC_PHYS_PAGES) / 2; +} + +int start(void) +{ + if (access(KSM_MAX_KERNEL_PAGES_FILE, R_OK) >= 0) + write_value(ksm_max_kernel_pages(), KSM_MAX_KERNEL_PAGES_FILE); + return write_value(1, KSM_RUN_FILE); +} + +int stop(void) +{ + return write_value(0, KSM_RUN_FILE); +} + +int main(int argc, char **argv) +{ + program_name = argv[0]; + if (argc < 2) { + return usage(); + } else if (!strcmp(argv[1], "start")) { + return start(); + } else if (!strcmp(argv[1], "stop")) { + return stop(); + } else { + return usage(); + } +} diff --git a/ksmtuned b/ksmtuned new file mode 100644 index 0000000..c59dec0 --- /dev/null +++ b/ksmtuned @@ -0,0 +1,137 @@ +#!/bin/bash +# +# Copyright 2009 Red Hat, Inc. and/or its affiliates. +# Released under the GPL +# +# Author: Dan Kenigsberg +# +# ksmtuned - a simple script that controls whether (and with what vigor) ksm +# should search for duplicated pages. +# +# starts ksm when memory commited to qemu processes exceeds a threshold, and +# make ksm work harder and harder untill memory load falls below that +# threshold. +# +# send SIGUSR1 to this process right after a new qemu process is started, or +# following its death, to retune ksm accordingly +# +# needs testing and ironing. contact danken@redhat.com if something breaks. + +if [ -f /etc/ksmtuned.conf ]; then + . /etc/ksmtuned.conf +fi + +debug() { + if [ -n "$DEBUG" ]; then + s="`/bin/date`: $*" + [ -n "$LOGFILE" ] && echo "$s" >> "$LOGFILE" || echo "$s" + fi +} + + +KSM_MONITOR_INTERVAL=${KSM_MONITOR_INTERVAL:-60} +KSM_NPAGES_BOOST=${KSM_NPAGES_BOOST:-300} +KSM_NPAGES_DECAY=${KSM_NPAGES_DECAY:--50} + +KSM_NPAGES_MIN=${KSM_NPAGES_MIN:-64} +KSM_NPAGES_MAX=${KSM_NPAGES_MAX:-1250} +# millisecond sleep between ksm scans for 16Gb server. Smaller servers sleep +# more, bigger sleep less. +KSM_SLEEP_MSEC=${KSM_SLEEP_MSEC:-10} + +KSM_THRES_COEF=${KSM_THRES_COEF:-20} +KSM_THRES_CONST=${KSM_THRES_CONST:-2048} + +total=`awk '/^MemTotal:/ {print $2}' /proc/meminfo` +debug total $total + +npages=0 +sleep=$[KSM_SLEEP_MSEC * 16 * 1024 * 1024 / total] +[ $sleep -le 10 ] && sleep=10 +debug sleep $sleep +thres=$[total * KSM_THRES_COEF / 100] +if [ $KSM_THRES_CONST -gt $thres ]; then + thres=$KSM_THRES_CONST +fi +debug thres $thres + +KSMCTL () { + case x$1 in + xstop) + echo 0 > /sys/kernel/mm/ksm/run + ;; + xstart) + echo $2 > /sys/kernel/mm/ksm/pages_to_scan + echo $3 > /sys/kernel/mm/ksm/sleep_millisecs + echo 1 > /sys/kernel/mm/ksm/run + ;; + esac +} + +committed_memory () { + # calculate how much memory is committed to running qemu processes + local progname + progname=${1:-qemu-kvm} + ps -C "$progname" -o rsz | awk '{ sum += $1 }; END { print sum }' +} + +free_memory () { + awk '/^(MemFree|Buffers|Cached):/ {free += $2}; END {print free}' \ + /proc/meminfo +} + +increase_npages() { + local delta + delta=${1:-0} + npages=$[npages + delta] + if [ $npages -lt $KSM_NPAGES_MIN ]; then + npages=$KSM_NPAGES_MIN + elif [ $npages -gt $KSM_NPAGES_MAX ]; then + npages=$KSM_NPAGES_MAX + fi + echo $npages +} + + +adjust () { + local free committed + free=`free_memory` + committed=`committed_memory` + debug committed $committed free $free + if [ $[committed + thres] -lt $total -a $free -gt $thres ]; then + KSMCTL stop + debug "$[committed + thres] < $total and free > $thres, stop ksm" + return 1 + fi + debug "$[committed + thres] > $total, start ksm" + if [ $free -lt $thres ]; then + npages=`increase_npages $KSM_NPAGES_BOOST` + debug "$free < $thres, boost" + else + npages=`increase_npages $KSM_NPAGES_DECAY` + debug "$free > $thres, decay" + fi + KSMCTL start $npages $sleep + debug "KSMCTL start $npages $sleep" + return 0 +} + +function nothing () { + : +} + +loop () { + trap nothing SIGUSR1 + while true + do + sleep $KSM_MONITOR_INTERVAL & + wait $! + adjust + done +} + +PIDFILE=${PIDFILE-/var/run/ksmtune.pid} +if touch "$PIDFILE"; then + loop & + echo $! > "$PIDFILE" +fi diff --git a/ksmtuned.conf b/ksmtuned.conf new file mode 100644 index 0000000..fc4518c --- /dev/null +++ b/ksmtuned.conf @@ -0,0 +1,21 @@ +# Configuration file for ksmtuned. + +# How long ksmtuned should sleep between tuning adjustments +# KSM_MONITOR_INTERVAL=60 + +# Millisecond sleep between ksm scans for 16Gb server. +# Smaller servers sleep more, bigger sleep less. +# KSM_SLEEP_MSEC=10 + +# KSM_NPAGES_BOOST=300 +# KSM_NPAGES_DECAY=-50 +# KSM_NPAGES_MIN=64 +# KSM_NPAGES_MAX=1250 + +# KSM_THRES_COEF=20 +# KSM_THRES_CONST=2048 + +# uncomment the following if you want ksmtuned debug info + +# LOGFILE=/var/log/ksmtuned +# DEBUG=1 diff --git a/ksmtuned.service b/ksmtuned.service new file mode 100644 index 0000000..39febcc --- /dev/null +++ b/ksmtuned.service @@ -0,0 +1,12 @@ +[Unit] +Description=Kernel Samepage Merging (KSM) Tuning Daemon +After=ksm.service +Requires=ksm.service + +[Service] +ExecStart=/usr/sbin/ksmtuned +ExecReload=/bin/kill -USR1 $MAINPID +Type=forking + +[Install] +WantedBy=multi-user.target diff --git a/kvm.modules b/kvm.modules new file mode 100644 index 0000000..363c123 --- /dev/null +++ b/kvm.modules @@ -0,0 +1,30 @@ +#!/bin/sh + +case $(uname -m) in + i?86|x86_64) + grep vmx /proc/cpuinfo >/dev/null 2>&1 && vmx=1 + grep svm /proc/cpuinfo >/dev/null 2>&1 && svm=1 + + if [ "$vmx" ] || [ "$svm" ]; then + [ "$vmx" ] && modprobe -b kvm-intel >/dev/null 2>&1 && kvm=1 + [ "$svm" ] && modprobe -b kvm-amd >/dev/null 2>&1 && kvm=1 + fi + ;; + ppc64) + grep OPAL /proc/cpuinfo >/dev/null 2>&1 && opal=1 + + if [ "$opal" ]; then + modprobe -b kvm >/dev/null 2>&1 && kvm=1 + fi + ;; + s390x) + modprobe -b kvm >/dev/null 2>&1 && kvm=1 + ;; +esac + +if [ "$kvm" ]; then + # no reason why vhost should not work with TCG, but currently it does not + modprobe -b vhost-net >/dev/null 2>&1 +else + exit 0 +fi diff --git a/qemu-guest-agent.service b/qemu-guest-agent.service new file mode 100644 index 0000000..51cd7b3 --- /dev/null +++ b/qemu-guest-agent.service @@ -0,0 +1,11 @@ +[Unit] +Description=QEMU Guest Agent +BindTo=dev-virtio\x2dports-org.qemu.guest_agent.0.device +After=dev-virtio\x2dports-org.qemu.guest_agent.0.device + +[Service] +ExecStart=-/usr/bin/qemu-ga +Restart=always +RestartSec=0 + +[Install] diff --git a/qemu-kvm-1.2.0.tar.gz b/qemu-kvm-1.2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..97286f891b74855c593a40beb7e8bf194704ee2b GIT binary patch literal 7101344 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 z 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≻%3!?~y|2g%G&FSTfk7`KC7Zj)GSO36f`ZF5jT# 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%0AvqE@jY@u= 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%0D>CD{Kfv96$A>*eKa~Cd5r#Ruq4WWCk0hlxhk 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

95c|fcC1Z_?q)#AEGjE_CC@ldU*VzQlmSmvS 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

x|D5%QTw2oix5X-&+G zj(J;aM+RZpOBc`+Ep= zVcERn?9~zZ`B(uciQ0L`wfP+0R?g!LvWBR+Mxw@;6VJHc$XuRD&+|J0vXmZkbbOf3zy|sZkw`1w*}D| zY7JLoacNHEmc*F-D7i>7+%_$%HYV_Wle~+J;9O>FHfg=}dXjbN_vB%s3hSvL_r=Jt zS^DI5$*w@e~dxI~~b_+9G_O(a%F=A}AH#n>GO;a#nuw|QtI zN~A@%gtKF3EnvCJdj)1Ey5han5oIwTm6zR2%gJTe*0W_D^?X@cc56E;T<*eLxin2 z*PoiAh{W0o%|w>v3#T^JI5azsUDO4%s@m`Mdh$aLOocF*T&_|E73TFr)Xb@xUZ9~P zOK#zSnSv}qyp4mdyeCHnj3y^Zz-0>T8_l`kUizLKA5AA=Fb)T3ASRiIabA^GoN5W! zBJ#%@?)c@LajAKQ;Bv|m#@k$1MpkWzpU{e6_)|K!EE5W z@;YFcSqFfcFKgW*G8uFwGY{XCO(7AfT!WG%J(-YjHiB=u3nNgP` z_Rzi5E?`v?PD%EBgm;dl&YqE%abEE~m60c`kCD9XLPgMZ!HS^2v8BC*8M;4?P#|i& z1WQR}D26sbQcU>hH}&eEq-r0D8gM=#|0c(kI*51)-Iz}5WLqY>S<28$CKod(j0TB} z?rU}*gb5wFqLj-EOeSbea()qW**QT4+wZc6j0`I>fbz>wN75!ny)Ye_EFFe@8+Bg> zpQzh1*)=1RF<4jSRm+4(TD2xZsgBizJBnjlxI7Jx?GCquO%;ol$@LoQRNeAK1-Xzj z}9%#1=5a6~-&Vth~98#bjKhTK`-vtGHmyZ`nBSe$YRvWfd2N`7HxY z_UCF@#f4viG=j>T*R=TyKXX$SUFxOO($!5#yc{YQoqlILjc1dk`)0v@NmfgO`q?B1 zhi>Q&`yXbW8=Lw_yDgdSNxfauwqTOvxLG%Da}A14i$_dGQ2$+!3C8#b5sJZwG{qyE4lb$QQ2>XWhPGf5G~Ig51= zI~vSa3r;W*CuL2O_;p-ueMijOR@ZwK4H9WBSb4=~pg*c)MA7V4 z*#xf+9bzsqSd`#dB|Hf{aIfrZ4-aI+k6DzS^u|LOo{uNGEv)?#?=zdA8ySj7G|bo_ml`tTgyyxFJ2F<28GhPc6$UP&S^3U;B>g7T>}egJylvZE9H!nnKz zJ3r)wV`uJ!mWR~voe6u)38Nm$buZDboAFtg+|x6n9m6mt>h zyC2N+ywTxuk~zF$4&vauE9qu-h4U&(n09jZq^@r}Tn2QTZ+c8LXD_4ZgcU@61yCGK z(01?u2LyKr8aNM?!h%U0e;@!zN)R=o~^E(?Vg#f z-R9$E z*Qk$SIJ2pD>zKqXPvq%Ql#>GvG#bmQj1C}CwCaWUd?7SDJU zkBMWsV*RwAKO`adw-=7J)AtX(r@&92Lu10{_-RHil~N>P(K*TX4%>SyA+lK9lXt^UZ8T>`d|HLn^`^ zT_e%!f8^Vwcbg_5dJo+8tbapn#8_54x{Zc-4e|{Q?kx_`wd2khtBqYA8Jp9XD&;WP z_=*x}T^)m=405co0xB_&;R?Ub52|SXrXzog{v47pdfO^=!)hSi#Dr2*`fRmhEI?a4 zK8^Jte4-8zJ*3Vj{#D!B)-_HD4;$lR+FE{zwRhZpAS=V4?`>18JcBb}-%Tg?r8*Z9 zwDh3bW}^FQtUea&klw0^H)3rWg8y^(BP@2mtlzS9NUxmy!Cy4iKc z2fQC!vZUb!wJVw_ZXD*NcrD`x_j5s`JS)r`^+*p0%i_!&=L{|}B%%+NqRa%;+J(ULc_#^W#K zu^7+Qi8nEWDVngCU(#;k{|N_*jU(CcQ=hfL78SBt(C{Ly*VnIjjgDHsB$`g`ro7Fr za+}#b@m72B3YIQs5aTg#P8~zdu2f7N(5eG5;|$`lN}u%8?H%hSXWe+pOiwYg`DmAw zqy_uGyu}txoELmy@D)G*lr5Vvqv>Zgje7oo91L*%QuafnbLWZi;)`k8ps$&(Pa{uP zmFM+?mlcucqB(k}q|t^traS=DnT2Nt2PZT8ZS+~yi%~^aLL_oked^x)t+dh3%)KWa z19AD=$wdUj)ZED6B!YM_Y^UMJ#U7Uo2QK}K_ez+J4;R(A?PQ&gh==TMxJLIu$+axP z0y1r`j*#F@5azdV6(zCnrmHANr=*<*bx3ixr1VuLR&FP$Igpazw}O%_!JC3*Kcxc; zCxqg1uhx4pZPirV=JH2--JNBx;NA_)B<=UFJFop1ZLnOPr7H48vq6+U$2IfUM1T2u zN=@B)cHUXq5+$4+TjWTT)K>BT&fXjyWNbFZRH$XmFw(G~Wwg;rsWC+TmQ0nv##vEz z1z}RRvOrzXoCp+yM*vKuSAA6MwddFsqi!1*T~5`k;G!^9+JDxOPN8fOKqOl5L~X{S zz3@qTCKw%Bh-f^B&JE-j{MZ+A%NAzH=(i*W7aJ>19T z&6lyY|MmAkAvN&xON}SZNk~b8r9W3Lo^Cs51P>aQF>4tjqTK)|UF47XsmFr3-my-d zw$yRYBRTu=rqBzw^KxJvH`_B&l2|s%W zB1)L#Zl*{!sCHudvzikC;j>AH`aaD)G;CT5a0pzS5s)>fXL@$|Fk154v*R(w*Kx~G> z5>M8O1-~NDhNwx=j|tbz?F$-?*(=bk%s5`^t|lZu&~o7Cd1>}+urxA>l!Y;w3n@lc zqp+G&q_!x2Sa6IP4^n8LRk9vi8q|lOX9>n;yVmww`YaOHSn_H97Xpt#O>u+bN7x@! z5-e+`oFTSdi4REQSk~nStf;F=L%_`}?Y=l#+1jxXqU65ec6}5(mC`C|^$z*S3a`>; zGq|FPzf!PyY3DXr?gcI^i6FcRmr$uU9bO!iZ24Y$-zhr^Y)VaRLHdsuW4zD|Rw9ky zZ)CrlyvdrwA0P97St@?NnTeFb$}MxhU5}c>0%nGlsZktFEm=+NvEK=`6CVqSW9dhD zPog^D$eGbN?3dA_u7qtigMxcFV9N1f>fu@ElfkPNtosBWqH?$$1g9sx*- zr2K|=C4Os`;`Y#@5EeQYBo5eocXkmFaXRLoM40sEmfisrYu0&6y^_7a>J%nPoLiCu zF`}_qqFC3BCF@$Q)oao;8>Nr7O5%Bm5f|Kd0&g|r`9hk20VEOe4}*7RpY{Gd{rbt7 zOrOJ!98tg&mWs$_``tygGaFzlU@83@MRn#o(-g6f?iQvyaWhYZF!#>VTt7ITCG64a>hQ`$no%0u*Z5VI8y|BA*-JtJ%X==AI3$#(;n8IcFovrM{acV+b^seA&pJ#uO#RLRgh zr<}`iDkZdu&CdkME!6S!#x6hm=SDcl%&#pz`uLyWeIh}q9UOcnpqsc@z0?917@m>l z-1J~=o^|tZ4_xkeJ0|?SJSCBYagjus#&KxO$7XwS#X@{lhW{=GfBG3lO9NI>N1sDw)73lYposMM&OKlnk1( zUQgyKB>*%~`)G`&jj-cMAUk^4i3IMg`SA8SZF|8)syb@ncxcFGsUFZ9=neZfYcR0& zckKCK(1!(+CJaR6iuPh*9FLI}t{LY#rxo5@?*xr>!)Jc>^b?k14-}THv+lkVYkEh) z5})4-3_T80yq+$v=}$dTK}=gVez>aDu_3rJc@Ug!wZ@i23OzZi6%xic-qQ*kg|AFQ zUk;v!B-Y_v>rMk$sK9OQ?Q75;_#FvhYoFBV(K}$)YPB{4$l#Z_>wJWjgj?xwg6y_r zzCEC)jyE+}sZQJ!yN{-_Wj9yS-p$^?w6-EQ-SZ1-qI0cCGBL_Eb7iz!cSUFYulX*F zFBrt$Klym^Z!Y|* zjpAU`Wn&EH>hMq&lea$ZP6ji?_AnnhKk+HO@{!C9gn z)zpG^lLHH9mLRjSNAe~stmBQIZoJF%zG(CD>(8k@qTXT2e zHWJ0aBuh_GG^XdxwA~&~2UVBi_`S%StXl>WDZm>amoJig(@4r0R=u4^C%hw{`nNM< zcw)>@p)UC_Fb~#HrmTt^90yI;#4Y50nvK+E#%2WXQPT zOwIH8{~861k@fH_KxyI+j#?m(`nC439#c)f0;V^Z*7f8=ex}x%>zYWBk917okv$Pg zTY%pDSB}{-!_Rb8vQT3k43_C?Zpr^LTX)dw!hN=R4roe{)(SxK`?`!0Qq2u7P4dkC z9>LVFeV*v@`ifH7p0K8f6d&KKyyU z$kEbToq?03U~I0KSfYeaSL;p?+Mb3Nh&mic_5BgLE_Ju28Gq#dGp$Su-x*$-0w$DT+AA(TJqciiUIL<$E zNma7_vJuR>`t5`^X6{|MqN8%uv&2WJrV|o;`uo(h<+9e&Oj;xYb(XX;S8hQxn)uvI zS1eQo_5RJb4V6m+3{IZH>29*-fqG2eQWHJXME`!KBI=U8%G?6NRG9Fm2AmM6(l*2$?$&%JMM=N_-g;W^R*YbE zrKDD2hKRrEa}u>uc(7kMVNC+xe;TXew0l;=@P~inSy`p}_hWeEqiYE#;mjPN|U1V^~R{g6r3u4jKC2_AcCj-m?NRya}Op-}q9vW=s5$9j}bKUYd z$MUy2TX2VJ^$0%*!19g%Ve+Yf;Da+<2yUb!`MqZnHma_gKg?Mc#d7_6mGJaWkYZc+ zR@~)}1{0Z*mDWdcvncuUw-!)w-=%(p8M^#I2C(+*r%IMyEbeTp?bLoDCoeU;;iD37 zKFe#j6)+$h!txT7R+emdH2QU!F?-g;p^ByGI2zN9xd< z%9@v{IL)Cq>Ek-*>V}?FNN~r5(b}`Lb|&pdlV{1;x&?>MiDab1$G^0tTBuRlt;%gv zQQ+iorc_&$%O`|c&5H^NevJI0U`C+#3Q`z(1Va`!2& z^{&N${~xXAk|dolhLVo_ijauLGNxqs9}N9p6+~y)*Ru2;qlp&ko#k{O$q>iQ*Ke}@&}l4?3&XrIv(l`5QFRBlr>KlfP4*B2L@Or51zkWzqCe#12Bh8i_RV&~cXq7} zVw|$QMOs%}HRk-aNss|wriq~qr7xAknyJ~~ED*tL*)*vTNo_JJ)AcL&2rR^7AgNyX zQiPYdfg%UZuv!hAlko1T|e1pKU-hOcRRG*l#ifxxxDIGI*N1Q|j@NBaE-I9QqHpFBEeaKo;oEnR2 zGJ4J&^VbeiO7`rhT1NTL6JNgPo>0aY#htbPJ<^G2qv26ZrWYZ8Ot{1|&~I7qIrVg$ zQKz?KfH4XqeJ{SmW~Ed!GUrcalul6ZHCaW9qA$O_JpNj9`9j@twZ2_6rp&}9FJUW* z={lmB2HOaU##|vrNYm;yu-g6Pb0KfU$*DmVADCY{3le9*2s9IZX`!0aSIR__M>6#; z3U(KX*{mR;w&3@>tfuBU*g4z*80Gl~`sLY?z1jI#AJVcmciw483g9E)wHIDu9}waJ z`>t~Cnm;v}h=#(%xSywdw>HYO-HZQa%c^pwx1ia-Vrg7JDacufqG{8!Pz8qJl^?S* zZ#)3k!aVTcmM_JXFQux9wIe?)Kta>C(x8S6r*fg26Wnt3#B%ivErh!}@d4o8hVA6p zIlAkuX(N!w(ap`V?H$@9cH}g)6F?q+y#2sL3FB!2;Iaxlv9KP&x=cW;Zc>s; zD(!O5-3RB)y(QPLlnUQL=>CbN%B|82;GD9_t#JZVb+|RHVhE=#iBCWBG=IMGYTnE{ z=Y*y|Ho9=`t?+odnORzK)w-NTSEq_#cI|Q(8|d;|7_E$F4wnAjW7TC7#8@y-ZHk7P zMIRpsD?%jb1-U+Rd;*F*S`ar*{u_-59#UM#v&v9{vw_&Hf|XWh_7QfChe|`#cd<%{ zoa#p!Eu*YQ&sy}YPY56r+P?{_OzeZg+@gp~1Z;J(j#?aQT%%SDzn(`8RPUJjtg;>l zRL-nzu-SV>I{f@romW(29dO2O9?AJ8Kwo4aMxv<8?=1Y7A87{|r_1+=?TlvO+LYBPlZ^1fYagJ!V2W$oOe@9mc?og_>l*|H0h$a+Q0mH(R4OfzrsyURt@wRdQssvzOVzwUbHVhJ8++m6da6_w2UE z&VQQyA|yyqmZSr((6b}#36L{Azs>mr^;P621>Mt4%^vQljtii9lc4}P;+eWO^A~Y*AvTs_5N@{aHCn+DV7KEAHigfB|XTv9+i8&s+d$L7wW^t{G=50-3+i{USC=lflb9^~oYjW0PiBvf_ z2JWm~ts-q8W;RIGSYS3YyAZ8~D3j|xxSgzaE;L^rZdwY-0kE(8eT8!@nNRrW-N&q)x8aZVh zTdEWPO+J|u3gp(T&yRr=EgxjkD+sz~Uv%GYZs0dk)8{$16ZlBE; zA#VzIOC1sjn2zJc(OtfHrip9{zp3_x-r(-Y9@SHAMqT{q3oT#z@snO)XtKagugI<& z;Bz-TW^)l7agmQBK#oat8GbIrbk8hv4mOIVelgg;2{r%PFL4I4|1<3dnbn={r0;s8 z55jn&n&@@Q+is@|VkUd$zR?-JVfCOFqMJ7R<+gIdl|kQiy}Nja4Z6+C6u{hMmDq7~=5 z2~+$JF~ch`Mp#VRn#anWDP3Il;J@E}A|gH0z70Lf^(KEvLldun*(8$`7y%vtN-tX;Q0!G}lU=^4o9rSqkx_1Y>iLVFsrbWpzH+Poc zmmvF;6&ik$gb_%_n~bVXi>%J=6saj3fB2fN={2I0HA?}zIo!@+MfuCEtz=3KG3T4( z-v_t6`_P}v{XI!tYp*t@&uW9l#gpW1t=DzUZb}-u0!ytoq(sm6H7$Mxhn=l{1ES-M zZgq9DkAl1$g~{-*Y}>oo`2EdDA;{u6zZ*|a4JLknru{0s38wI{@cL`|m6f&dL4IuN z;GpULM=^$*sPq+c+eGcJCww*^<7HgT)SJ-6{%#dHK~#?ohU65Ah#Z(r!U^)4uXAdq zEi`NHBM#C8*ssymQ8zGMSy?!n=v%8ASmcK)!2&C-VFiiY_0yvvZogL^pMR=#{LqV3x&V zG`KlkQuw@&k^iJ_v*!XFf%}Olj8ilz-8!H6Z{%oe zBv0@jhQ168%&iY>y9JpY>hGg&?9HBoPa%8YL?w_a@L-?#AfY~dO{Y%&D6X)${5lCs zaa&y>9!;P!nN;gHY5%$|w@*`qQP4s}z++~6@xVjW#kGAx&Q92eLmq--5{K0kizQIt z6a28k(}jaOWZlE%V|TEI&qE#dHu9`g$u1ar@EpV{svZdl13AabUSe#BkQhM#Bco#gcmPh zd@m)a(|;L}kI?p`d5EOh9$4t@yTl*s`Esfi=ZE|lx!{*x*-i9s!0{4aWir3N)o4V+)&Sg)`j)%+~uh?&oJD218Tg=IOg7=}!=-t$B>D-qE372c#o%S!G z9{-rYS5IPk7Ximwg-Vdk~df`tR4X>yoFOaR2@;7Jhm&B(;{CYu^x2wL( zzJNvo?;Ud8PXbp+%!6-peywyJ`kVQe`Hzt!e#f!eEw7P9TYkFAufDpqY-GO^7p?$g=|tN=cU=#ZZ`Cw4=T88; zKTjyJ#uPke8 z5`E{z;+oSGbe^%$PDOoY=cOq?cw`}b+{@IKtPaNNqhZqs_=NHG3&9 z!Yus;jW4&SNmWM39IIw& zHD~X27^Em}Y4^+$!4^?Q)5{`Y3^XRV$205lCrbqrZSDjoEv6#5B!;@4NMWlLiTZQ7 zQsQ3}>)GiH6<63P9sQX7;&g-;U+ zsPY7InS2YhO1%3IGR#e}%1!j))K|bPN$C&B9CZcZ1eQ6vh+|ct?Ge1hkZ;oAIL)Hj zBK>Cv*Cc|O0@muX*AgO0-s4NQhwU#cmclm!!-O(h@-CN>u;i*p%{2DyJS|iKf|cm6 z8QL#kmxpEJCjqgkvX~EW^vdvO2%Z-_lG|FS&U$nXxn+G9CzsC}?tXl-TkG+#lPS{C zvX^3T1<|X>sQ(%es;qjZCiKm%Y{Ej_ei}yG12X>A*QOa_S0#qvS&BC}E6Y|9&WeL% zebJ>(Aej4#4Paa)Zx7-OmP$bg>n*!%C(f*A;K)dC1Bh^Te=5qNlShs_bpblNm(JP< zolOcV)4)~1N$2h=z9Dt9EiO$!Lis9)w73A<^5fg$qGse2B&b}2bn!b;x}uBtzM@N^ z!MCRI(lrFdbsa(_G#M^?rXnCxO8tkg1%XEZy!_FyQQe<(n_GSbxCE>jI{GZ3>!R^Jb9Kv*AA*K;{`VaQ{ zeRIIctKvfK-z}r{e7zjMg*htLdPqd&O$aB2*-InnVr5)GqVnkZ%CvD&hd%E|ytqE= zMGhlPp@O|BRgY4CTQ(yoAGk-E-N;gHC~3A$8JreDU*b|!!6tW0#L9s`1JB)pHx18S ziZ=z%oeC`vBoUnl38Uv9Lq8)axq#w=O51=f9FgwzbwK~+#VCvTqyKh~i&15D%7j0g zUyFW@O0kTHUS-i*xW)O7W+RPm8jCi7(UkZgHGl+RN(LOVR!FXtZ+Q$ri**oNRbk(u zFUVb4b*FiUbGYAFZ7?awTt>{<6H3W5?#VW&CN4^x1FxhYGAD!CsN#FjP^kf-9&)p% zVvDr2QpKHr;K6`sA%aSH-i;c`KjJn8+cdK0e|_I>?zWe0sA#i}?thk*7#tU+VhOk0 zMn!9-uvahLD95rv;SspaIiYzD|48^w<}YO(rz$`q-?}DxXRAWKnAMEVDhO$A8bLDC1iyMzcA-$?0v}Oc^tS-{@SYnhi20*DqB@~`EvNQ!1bg6k4 zH$qX9l@JZwsM3`cYJb)SHo4PgwgHI9{H)@wvg!9C)lL+*E3Z#I|oC?HjNTQ8Ie26 zGC2X(WC_xz8d1!Gq+-JQu1b<){jFHoMd0187zOUs(_?R7P+3xz!9wTwXnzq-J{yh! zNmQ1&gLwd-9Dhuq#mArV+l`XhP3W7P1HIojs0V65S+G4U#9UoBQZH-o*O^IWhT| z;CAtnNv2gEb2uZbTuxmq&mrrftvm?zv#`~1f=QRw2a3(!1R=-o;4n!jzmE-F#14t9 zEhypLtzwCSE$oKCB5F{3380vbJ;3ps5wM7M6`IZ%PzI0_*?eD}`PK{(b@1*-ewj2qoH?qIofhWUk?$XgO<-FMWpR)&>$P zxkrpysh0ik?0pHASbxhtHX4sAc~bngTP85`-U~*9)_bqJj4Zold=r_OArOv#DmFHQ zDhuZdB}XL4n)*p;@7FShb8-6I+W<~m{%>a0_FL`d7pr(2rig+}al=caQl-n{W5nmY zWlhW-|Bc0Cs+a@-L(60@xZiIy(v)7*WPgM%{VaH|3?8cN-A0zq3d&A?ciQ`GuWn$l z3L35etUy5TdPOUyx|EIhguuU;5Mp|9K2$)`qr0?+mZP&t`5cQZqF;7*aVZ z-Hem3ys`5o`&BtK05mmQK@#8=ckkmqUzT$=|DSB zs9WeRJMpxA!^c3JwMuldPzMx2ZFm6$H)zm%UR{KcoN4fS(dSPX?C=(xMR}c{V9VgL z!4mc-g5F8xZ-DORu6E;4kIzUhC~FXSV8t{U_SHF8{2;#81Kt!N zo`Yc*{X>Z^yI?!2VNO82pj?~I^&sHS)il>tNDs$W350I3d;ZJuW)DWYz-=nwt69Cs=;K;a6Uzfwra)N22ZmQThi-VxB-4zi0=8Sof^1L z%_g~^Y#UWPr{J4gC}gb13O8VA?1RFb@Jt!7l+C`K^3s`5UyPv<2=m-^5NmvCSq$T^ zSGEO_4HBx>ZbthfWaVLSV@|Kmv+ZAH+OQXYp=w_+}{vy$3bSh02VBv+X?uj+{{IB(5qaKzF$ zH&bJ7qVhWD7?YB4sS@$@0qeAe@{~m<00R+tT8844t|L&C>nb+2tjW87vvnkN2YV$0 zhYdesXEM#AWkpZ0GSAwuhy$oRCeQ?in1TSW?5;M1!8YY|hsr3(2+vFf_Efn2DjKkd zuM0TYFUsqiL5cysP~jZlR0(u=wX5KV9Vme833zFWyH$(Wp@gt>U#)t0>oIlwv$WB( z62+MWF#uLa`i8fNb+19^dU@o46sB#iXZo1Aho$>fy{K!hM&*RLPch#Y@}wLDF7N)( z-|^IGa5_3QdPU=_SIM>$JR_-nbk5$U#Bxa0rFfTR?pY?ZN>ixDeOdVNZ9zLY@7#u) z=s`O=&)WQn=tdioXDx6%<>V5A*Od#5u8ff0Rh}o(f;0>cW3cZWpnDD!&iWt3sJHHW zjyr{B0QjcgTeyS-B89k@jnX=Iy4uM-c@Tm>9RUepPhJW^uH`}nA|Q%Rm2jIFbe(X! zi=i06TGhgNEv#1A{7T2l*KY!|6#40tXKX%MJnXv~rH75KY1{Nj?NEr?DHCpsvf1Ny zBkVeGR!doJRa&nZc#AKt3WZE&$>2n%!?;2HC7uYBU~yz*X?fh!%4B1xRP)Nmjd`4l z!T|-xs+ZE=(sC?38p~uuzkb7&(pY?_6j6!q@Tm?^OON^&j;?D__@qMGajXss^>jMd zhxD#bb*d(*I-Q$?e&xAy7bhw95D&D{#it*LlK9 z4GZzVW|YR_{%Yyd&M|7FyFll8imD%Kq}%TT%)3CmDSuib&(vB!+2HK=ujJ3K#5^vj zaOid=8;!Gggyr(d#o1X=%;KJ#Rs_|hHfeBE)0)+J7Le|+Icg`UvVZ_w)HkA-N1xuw z-->$IQ2sM>RT6HIeLQ<6$P+GeH4V{L4X%5xCkG6J(VvIdrO}D)f4lCp34?o)l&S_a*9!VNlDvQ4o9Y{CT9mA zlg{=&`Ck#c=X!IXfo{`Dm|>f25%)YHmB4W~DmiN%pT6u_7oHY@eLOC`&?-(-wuY0$ z^USK*-dhbf`NgBH%2AyXBXh9D>+r0nZ|S%nKE4+a2A>B-a6zdBM0Xj=^H9Tv&`g98 z5)+YMmS=9NcnIfS3fNLny~jel(i+TF*cNFAh5)Ft!2>J{tk$3bmTPCQEjR^WO zW2&*&zLO0>L`|d?tU=~X$phIJ9-69R#NY`5n|MsIvX>iPGKZodmaJ5GdX)cIrD@FA z+nqgT=53TB(8lctn*gBX-Mgxe&;A;PKh*xlwGlbL1BvUp(M0|xEbHVd-SDDnyhoh( zvMapX&=1%kE+e?v7?Z3aD$5g|8rm%vb=ZdvlVH5sIiJG@1FB=23wtmH653ClChC{?nv3f7c9r*JNxd zDC^jsSsrasdVbGEvJ|ZQ5>ah#EP;ZVwr;GlByWjxC~6E}2Ef!eq-VE2#&c7tw>xZ( z5C%nLv_*5`2fbxLSGZi1hA)MK7c^N?B7qI!of89w<~me%#{w}s`y1>t=8LcnQ}C8n zF=XDk1Y+1(h(5aSvDFeD_ad5%0@wABbKuyA^85l}HGERFewM{HH9Jk!fCEd%#tV+a zR-J00A)tcue`fm1To3+q22q4%#JAbA6G)Ga&A;mL+XTyW zHMnZ1C&wkU?LWbr<5GIXtwIAp>JzGX^29%VYq5f()gQP1IWu(oTzVk)0)vQk_<6-h zOJZA9+@XYW$}EnJy_DeenEC-2Qi3{_o3{jw>I0d*{|BbQeG=wC;DOBbd{;iPW&RvR z6f)X(xM@iM)bu~rpQ1uMC=;$cm$n3i)IpIoO_sl`>sJ@hjdeT2F0!g-^tc>aVz;2{ z*uXC4mCJ4MI5#3|hgPu%^rz1El%s2+btL?jcn4x13k%Z>}qyhKM#-cHzJZ#kOB`x=dVzu^A}k6Ln$H!OV~f0J~*<}Kvm zs(B_Yws1o`&~+V#PyR=Mgm{yzs66_cYoQ^ zKFuBuf`nF`go=``sPqD?$1TcW%fKs{DrMfUO-v#yE6OdukvH7gp9|^!v?gY1 zv=<54sebuD_we5KocmD(cVHJ$mQZDF(vX8E-9}_r9>h~5EW&MoCWIG***G(tNWsMr zchaGj+Myv?wI&#URvL#p?6Sd-MYV|t0uagLwv5-=H^(~_35|xIJ&l{9EYG>BQeMn} zKQE3h97UDHQ=+tq_)dJ*M(0DJ65Fjx;SQoHvYW~sBRP=EMT+mMyKO~cP~DP2Xi1=2 zOB0JQu2h@x+O?{jha?R?ctVv0+^BRo21F2AW*%L>C=U*J7WHpdRnB!3BjLH>ZdK8m z64lU}=oI~_lE1r=$HZAz+XO++EkQ$?^YRer)#pf9{`=xx*1{+*C z8{eQT{{=)zmF3S1^ULZb+T@>uSI69QK?v3CU;3qW&e+xu)qtC`3~wx|c`g~FdkSsdEaFPVX((A>stG0@CZGC8wv@JnuD-$(^H4e=3*KfD3J>^4YwCp<5$e-bHa1`jATHN!09jdxjn*oB zdiOE?AWQYO!FR2V?NM9o#&8)E2 zrhOWmH)*F@E`!FyhH9GXO51?C_ANX3y^`JeFe(Y$JgUG1Y}YLMg6E>N4(!yA;wwt4 zypG^$f}}NrG}pziZomPV2d>f-96diu5_#@aGitaQ%S$@TCQaV}~ZAn@2j?Gf0N$6OK zvgd9v91eWRl6IsMX(|_z#}83Wk|~ERbn@6Asj(!or{SuTjLyvFpAlL&R1`x!nMWT} z<6RKSx}IP0Yz%te6P4<8Y3fzqSv*?$pgEU&HwG!Th9dfNf%G+4EXNBd}CAf>WGg*iV3}4r5J8@L+_d|rHa8Ff!1(BHxHv2XVJnP^ej&F#E`6i2ECPL7p&B*hHnRWHdX zFXNRF-qL2-;}H`lbjeT~u(1R1mKY?a1X~G=I6@fvzoI;rImjVFs5~MOUK5l_Jq6uy zX6UsA@2N2Mf*~c&6Pn~8Y$GjLm-2w(n<|WQ;o@Vj^|J5B%EQ6~A;od79K+5jmM<0@ zlHtu-^PlZhhQ}@Agi%_RYO}CfPv(VY+skqBJqYonoCZBja5Dor8JccA<9ez#CJ2KeNFfC_#m#SlGi$W*neE}dNZOtLk|Ef=o#zVWBnKRK(_ADmuZ_KL{lkjy1)w2jt|SjS-v?Us%gk9Co5!p{9}UPN9#TKn&&{?r zdu`tZXa?o^G-Iuq2H%a?6XPBNOnxkuv)i{2Y(ccQHG@$gRfnn{qD*>R5qiP_OVAJB zAut)Zo^Q0lR%(QIY}yb5=39gI(VCQPXp}Bt)#xGQe*|FE##JRi-QXdnXnVDa-FqLU z9I&~4X6Ucx7z_!i2B=#+jQan70Tfc5(^vM`{B)fb)#XdwpS-D z{1fM^0@IdbJ;{>ahoQo;HYnHO`U&&C=0MO;>pj59Ih3 zcS)FL>1wA&4LI(~kq#0Utc0ytXa^zOG!F=Wv21*Qe)wsTfOqG_IUK;@y49++ux(%j z=Z^1(qQod!(v)TXP38Xb_(-5zxpI_Jb`Gf2&3m|dEm!~>3D`O=?IQixvOaK`CGPB( zDMC9%y0lZM>GxqLf8QyBzvEKK)9Fmyo7xH=?ixlW9 zUDA2iPKxwueMzDN!=uWLx-hsy`}?e8^A2ZLEqC93Ups0Zs*3L)5 zMgnGdBPI0(Wl~`L^^F0!I4b=!+@>2G!vhNiE-=zg?1>HXl zxSnz+W6S0*UDMX$x@2=cCoZ>;%Vy~xiZ3{oa$Ng51;v93QvQjpdm4Jb%KX*wdG6hO z#md1rcW=6W_3W6@w5jII(MC|}V2k7z)O0zoL??Jdmv}+VxxM}KXH&Cs+_j`} z85Zu`ZhS$rz4MBz+`|qB$J=!3EzjiTY&2U`Z2wQ^TcmF`pRYcD)7RXg&IfeFUU!~I z9fs64iYOEUtas*<(1ooD*hmAcM^`|%;;XzTl@FkX19yaFe7ut|6j_^P-zJ|U*yW(G(Ilw$;h0-Cc1=Uz< zUB67T!9akC!Z~9u2duyTr`3&L8QPkhir+g$ycNH9!OAMJMA)591z(Gx;vEOtVI6FXBT|4V2ZzG_ zY8{pow%EmW=T7rcz9Q@sc`hO%SJ+kv2YSfH$G5h*t|RL$uW3*}k!P6C2maX_O7FuK z?4N-Pe8@i-V8yA}gm#4CN~h_gRRIj?lukwyRUdQKv=NLN`N@I`&3y061Pd`pBTxHMmKP^8QyqPx}+-_uN-c3wY?5g}~@^g2r*(?}e z&kBlsr!!YukomyRBhZX~hjBj%bMeSJKT>;kKk;eP;KKQU4{X0uD z-1P7{0{bowa-(aEg0H~3-|f?yr;m5dYEUS%myq85zHsb3V&y9L;W;^H#rnCyJt#Ie z1_qS_ONNcDGDr9Rl73+&`0XO|f}GsI%QYr;LSfqsF5SyBTj;I95Al!rz4IG@yWY*y zTaroa9CnIz8)mA2Oyp;#8t=!5t&7Nd-N4zEGZ%~xq&Exk8+l733S@i_yeW7m&vax@ z8~V4$!A}5F=lx|7i->m5k0E~(yD`?|xg7H9Qt+#vLh+H>pY4Wo1wIOOz-)9nizte> z+~XS*`Q3{zECS5cPwwrSIiHBFUVL>@u@(c6G)=!-H#S$S06z7sE_w0=!_3wcZmO}c z6(Tj=_$d0l!-erMBAWQzuhlglamDQ~8GL*qU`PLU!-RTRRvWmf<(fsdT`~wQ^}Ao^ z910f1T-JZ?9YR8B#lEitv;sBW;W}sW5%~Fk*`3nwibNai%Gvhj7iCiz@crdlNH!%9 zIBK|JV)U>nwfNwNRC%^XgWJ8~+f!<#iEMR-=i98?QNv^N>givNbb9+i4=OV|C8tBOy-XTLk zwJ^BCbaOh2iYf+Z%o^Hb6WFNs)4#eObAm;u9uQ@5BRmuQ}h zjV)VaeAORRSfFF8wcuaj8LUHn(`lkRZh&E39OzlcRYVym;;#_mRY zr5a>CE#jJ2D?3hJy#>E_jIIU0L+sj#^ZX@JEq(%7SCXHts2#WuW@9y@&vpL)e=BeB zmsvFVe!CUO=mQ(bef?F&DcIW9FW1p&ai)omWWIflTJirxN7 zBp)d=pC6X&Zdm8#(--B&$fbcvPWkLTU} zgCF~^d)?hy1FPRbr(t{sZ{0c=j&a|i2NBq|Xy^i78*J%5yaBrp)+Rvp;-4qjWGT1M)d_;xwn0kz}ntEjN-?m2H$N!Gky!L_`z({V0OCq zn=9MxzKhdQ!}=9Kxb+Uqt$ELz+urwBc-#B#d22&9rU3+6j_<4$%iB(#qwS6FV8O9b zmyKTz(b`DMj<{hBR6YErxpixSs`cv9d!XT0pyAi=0qWQ9zLV=0b^Qt}2EeRVr6ae# zX}0m?2r%Fm@4H{$Np;}I^&__!-m)G_FdvOAP>Q6a192wW9bD#fa<((Aa-db;!vB8% z9SXj%zWw*N*#;tpZ&$xnffbfw;FdF&Zdj!x>!6SNz(DD^1n~#Mq93`_8roEnAizs!cj6o1Mn3qK_#412rGyN#x~_{Nkum)v0}AMLM*>e**kW}&h)NE%mIQ?D$|$P z*YM;WcG^Fi-wKA~ztCc$mp$W+X_9*bxihuH$nE3w)JMfv1D4Fdz(Rd)4~JnNY|Y0J zep5REiY2_q2S~trtIdUtBSEa7)~v@@?zXX;!nBvLa;_YvtY=b|$|6GTXB(FI9Sq|~ zfa%+3-_~hypVw>Dgq0VOH|dY;u?O1zxz*k4?}M6Cy6%@I@Q^W4?mP(`zpX~}hdIEA z)ilbr-lmDsi-z8%7jxWolal$`!zlokD-+hbM_O(5?C8{5XCy(OuYpne9ETZp$KY;a zk6q$i9UFRdad422UY0)t8*n@cff0`$*RR}_7gzK{*A47n>}l4+ap2?F+!^CBy-!?cCfBr zHr@%Lk0xBlO`Me%0!Jd4^22&VWiMD)L)U-)P1N96pX2oLEbpI(8aSdR4BB%+V)I=i z`QDPgx8LOebfiLS()aaub&YHMO<$NN-l#u=6<}OD?Cx}_?|F%YNvW3iCPVi&9WP3} zf&l-`4Ff3hFKgANKg~w+KalQ^Tsxp(pe_VUgjWY620;_<;}4MTub*f20r&4QxRn<+ z4R@<~yWY;cY4JB}nKy0rrrFHA>99AgEVecFrjy0C&g9f~Wqv;-0zN+a2h&}ZH!O_Lo~Ep;X#VHOgTExoPIG41t@ zcj=@7l9}#7a4Q?um%Z-J>l%*VN0M#bfR^0G`iwkrP{#mK84D_a<^5#ln(P~}r}uy} z7-#^k930Q+D71~O8mGY;5oTi3ol5xZTYezZV9lG9ObF@7LbP3zGkg(hqbEaCdz z5H%QY7&VmCIKgBln4vIE(l&g2pz5&foci#aX!RRRVZw>>hGHLuYt&0rZNnMO$4pP? zT}LWo;@nP z{-|lg+u=i8;$8&njsAz3JHwVJ5=jrCL7H4+ohZ!vI~g(doJ#TwD0YI$$a;((pxjdB z#Z#Ba+=4V=KMtlgG;y9@P1_00Gf8rMH+9KQ?49>_4)%LT=l$ao^qrmc(LLD*1iW7h z2LP`|6@8P2AeLfVM@$S74aB9DL3;?kd)&V`+3B90C+N8hh(#$BTX}(~pfLWCo-*#h zbM{4(0nf?o>l3Yx@7j~u)Tq%C#tN2mc|GkN9>3|$5mh!5vB3@`vugD5tGuiwt^8;t z6?ZAh(JAUqhl*S=A%hN3#*9)}9-{)6t_;MpWN71jB?Dd(!8M_FI8y1UtaXydx`8U_ zoZDuY!1u{pPn!)eH4|ANMhy#axG~!z;H>78IQn;D+=oCnAri1EN3J9q?a?EtwdKc< z#4Ke@7Rq@>uM#C5f8J+J8R`~+Yze15kPHnO6l#anon!-HKoOWVK#28z65KGp0S7OG zNy-nk$9-?|zCR3ZCK+Th-vqCyG)nU<>VvMETxRJn0a7#Y=A$aphOs=6y;(As_%tV^ z2HL9#4G9bVxU%874@UA3OhMP3aA^{|h92%f-4x2rCzhD1vSQRFxyU z8`rg+E1G%PTmkEK{?HoDutjC(x@8s!3w8>AkjPp=Z#4M)W8frr&oN%wlRjzOsg1iV z8O4V0+)!5NU$aM9P0XjbR>ppl0ajjwuH$;wZhz=S_P|%=BK4^d3T8THQSj*sNax7( z)eL;To&%zwtQQa=Pv0#zd86skkCTZ3u!Y6^D_$7PL>$=2w=bjOvf9Q7ET-*Z08T6U zx(f@IlXuCkA?zGI@JF*Z65VWIEp5!`Qi4DgWFrM6u33*LNP~9DPP#ikz@NQ??yLT3 z_a{~Vi7G<-M#E0a0z)wx&BSPnub_wkeO;4-AqP4opWw9BwTTyOyN-ZWo0531Xt(Js zymXljB?fjh$4vX$WLp^~DsEVFgN@ZB&9tfU#-{{T>-w|ksytmeTo6tfjTAzjwIEXq zRvEUE&g{ngvT{esC=lCqSWwpRsZIC$@7BDzCZkBi zdR$fhsX(YBN0T5dR^!6UyPS7iN;$nDre&vs3@;WHq@{YjxR2$Q7mfkJ0HantIzH-E z6u&$UrrM#%3_&GYCMF=K9}rw3fLxlz{fBygQ6ft77!l^pT8pz+YMrY1pmHSVy3f4J z1?>|XZ^5>wC`!x*_5;0#nph zhaHBTl)Ecya(h|wczzaQ|bI} zTzYP$u2kpOGD>c_8Awqgrn&n;rtd2$MuX4WUfCi57iJCU@#fO~#s*I}|T!{knqKK`D0cRwm&Ug*2QI39BQc*ENoDmyt! zkoLaQ@Ib4Uh79oNf$y!u?ptin*|yjzud8i!ud)%A_YNt!>5U z5?uwf=hG+8bEI^t9bT$?*z7yoz=@PbNhAJi0HZ)U@$zEy*4TAHcoT)EEsl!fU1V%uhuVL=2y=0)@iMwQV!{+nVp==-+(m;yGK z=p{TicI9NKZnj5KfR%ge#WgtwNgCZrORxb9GTE+IV$TRktF8)^h9j37mLg2~>Qjah z5jhGcGxC?TJEb&vByS9>*pwk@mL*L$2~DE28Ork*1>=xZYQ+F^LZ^CQ(+< zpIP7FMJZ{k^2RfTP1uv6@AgM%=ZE&VcF029kj!vKZEf?km8A zoJa@Oki?YgVXALfquN*vs`|yk&w*%N2yAtJNiO$Q2IyoXU*ZoivtwJ@j@8PI|bMt!oA6bhBV zuEx1wGC)p6xK%FZHdzAH-aiil>k!YHL9s{<2iLlncM>)PEQw@F9Ns2+)E#5k9%`Ou zvQh)4CCjvAZ|KU7xK*QgK4HkQr$Sg{^M?RAkY;0~fW>mok$?M5^ex+N<+5!?T}{Gy zck2-;a+A`S6lq&qkEj_IN7Q8b$Y%-_MMn8jaW%#!gNb4+HAFx;56M+gQQ7QDFCmHr zBFcL+IELBa=P#KiXWv(C-U}kslV-kLk@Y6mwhsmY*wnFoOOuF;+wK?}hv05hEXeq8 zaqQ_Mi8!P9UbAB^83P*M^LH4kf4e!NPqAQ%_WT`B`*CQPhaR4s?$0pkfQ+@QgeKA? zsCllS$yr8g5WBrM{i8R%o%7??$gLgpKXl6fzKVJ#@>rXZPapB+C@sQqU=q4#>^L%F5|2WvBMa)Ast}<;n3WF-*d8H5=e) zZcyet-FlHEyTvUS?v|sI$J~`5X2pipL;YYqehhjdIgK=%V0?8dpo!??^a7v940tXc8gPycs;y|yJ=1%<5CTTnvvMWbczRYaatgtrU_#kkQ7^>A%2sP87w)vF z_!)$*{a)$}K3}SZ*qny5CrT}DZ=9a?_mAFm5B7KaC*9NTVeh#_L4<{1gq9Ff%J@yTP0j`2?}`Pl~Bw_u*0xsi2cU%M<63rDmE zllN~dp}<2r=kEbhJTCH3iCvS#o7oUB{{JC<)z@J&v@oFq8lq>Or(N-wEf3w;4OjJ}2wx{! zLXXsu*G69#u8m+#qsqzG$pT4POz2jYi1_9Q9H5=-G@{f8)a0ZW=+`q`zHrBEDpsnQ zSKJvjwiaa$Pi9$spFKkX9dLfUdu&Z-(G?p!7BdJvmRl_#;i}bPVHIBm!${^VevIP{ zEVlif9t^wv^Zs6U|Dd;jEkEY{MdyIYzLGiA|mYnV3q8 z@KM_hGk@(zSaTes#^KJ25|h4cB`6WjyfBni9wSN?j)YxAkJ5%=-3j-DYwl?1^F#(1 zG*6OSm$XFMZB+D9{0zcca9wZ6+JIJYlO>&Rq5taVlqip zr!`9WSV0-%kM`8tW$7CdJ`Bm-05AGHv4g@7GcT0lGEatiJkj)tu|C0@p~f3F(5GQA zwJ$-T^WmO0Sqlc!ZBIId&D`cJPeV<0^5P@SyNh4tLbN<(KF+@HMe#51=qTkwSYJGZ zshlkp@EaQF59eDgb3P5ci3M%)hh{rSwe#j7dpN`U6U~@pqiil7Sin4#ZK;p?e#o}v zfuiT0FP&#;N^E{Ixo&iG+?d*e4*WXhxa4#2VS2?+&v)^D$TSLw6ip zyQQT+?_?b6S2QyFbjCQ9X?UKn}$#eo2CO?+xzQ!Ao9~#snS{oG&$V zhD~~~>NAX-M1ZwZT1o^mn~h0*=_Z)T<}%B9D>3rK{_A+!moU#04KUD;nHl%^F|^>J8RsODHDM2HaKWM)7nA{IYn2Xj2u#!Z-wirB*MvLn-#6K)tIYyjU*0|(!8WC7zQk>3|Es%1M>U0!Q4OF z5Aw*Mc1ROEWrBcuu%-1yW66@E_AFE|l>!!4rkzPtol zbRSbfcZCcVrc4~FAx@3>{da4D6M7kGBe78qN`Az)vO{jn+s2(_K-UB&375O%==88) zL6Ua`ePS99#Bt9Bs5OeX_0NA=y1&)jteiuevZ?}A(Z`U~T4poO8U%rF&8B5_mg>h` zD9AAzlSn)4I#)=`4}(c2SIfr-`1IM5%2C?Y$B#ihD$&=_?yqN4I~kNK{y?E$PiXn09zH^Z&t7 z2uwRHC8srTuk33tn9&h)k!{Ck`HpGYAqzdSZs;ICJI?O}Gk*w>0vAt8?EZy9QR-ivInW|BnO7+T5FUXa+c4B@O35ryNjZT^X9y@E z7!^;vtLr1-uaaYKjWZCA!v3{6GP!@&-RtFyT=p+O=H`yjtp<%iT9$B>bI45BXCk_h zHb_wVZ)~u>>;XzD$|v9aN~9Qu`fSPs;4YY9N<2$!wmpWvw0N>w6j_(2$_mrH6~5z& z396&1>v$v29j;=U=`ayCd(nds-A zK!kvP3@*k0V@8KbK>Ad_Zz1_qip977VZ`weS&eR?#5mS+p)mePTmqrrK?bp|z}-v? z3zS6Q+G87o)L*s}&!Eg5PL?8#TcWuMP~>(aFut-M(x_sI;sVTyPF>;-DJeeucI;V{ z$Qj7b9gP6nzp?LNnwjt%=~7ip9CSad6xOf0S*3tZHI`9IYD>CR1U7+gr65DO?($up z@(w$y_KgVd20^G>56%5{LjscU6lhVhNaLk*Z02=fSh)YF=Sz_YDEvqI739I51e3dQ zFpCPn7?J;wz60QFl4z-HcHxhCal2ei>&_Rpxiy@P$9HqxAqAe9KimUpj+9mW>BeYg zw$fgPE7a79oP@!+X_mUM{=|$D`&S0ZQ73QJE5-slj9zldT+W#%K;6MxoTP=GhnW?| zJj_R8nrEr@<>glDjG%aDH`xRhZgWz*_3gr4tNBQ1+bTUSFEK1hTDO0$qyUo}EO|^= zZX44^0?rBbhAxqUl2)Cc9x(M^K}FOUtp_tWvqzJPhL5(J&UQv}yrT_$3ki=xJ@}WB zjb84Ox;lzPyRbS6!sKDgEZ3>*$YiKtOrbm1(4Yj}$4ttDuk~FX1KO4er^X~Tr+;%h z%Q?&{iVLqj7?Us0=xSeh^!DxBXJmVhF{K_nOHMBHdrtdfu-;-iWuTpVPt&6(_sKb- zWIod!d@M8nc2bN^gL9#Q(v+Ka#6RX;)Q!xvjdy85?Q-H#0{WE!VN(4q_+v<0PqzX- zw`w)4`VmyU#qZZWsKfl$!ib-`^?!Ji7rtz^G`9yregFM)J#95!c$axdiSV&LortvM zjEw)YPL2 zcJJ>VusQcXueCdE{r>09+L!ykKFf#Q|8?$7?yMa!e?`u0P&ue}@MwD8Jz!t10Q+(U z*q1B7zFYxze^-D>*ELIbQo)p@OiTPGs!n@l03$)Vmid9O)Sz^qJ?{^_>%P}%*OE(t z!^;+hq>5i{EvW?-u%6HxVUz1PLwCFY&TmqjGc%zx!a7sY&MMGq!W+_=>jm&i^a8gx z)=b={duFA|qAS1eZLHOj+h_%6#4lq_-+!;LJBu`|hE%$$7}10IScu-Ph`tO`61&Ps zpA_OGv8#+z6FUQ;Gr~Gk(atK+YQoFJZUMY0y??Z2^xyH(?0?&zUfHYu@LubfWB+e% zw40j!-|4J>vHw5I2j=#Z3*4_iJ?x&>9=iSrR6R)ndgqj%558i{bmeLN0msk<3#mrW z>JPxUIsLiT$9>i?u0J?q_QDwrcbH60U3<7fcfLd}ncERJmxt^`Q0(5~F54wq_0O13 za+RDZ8(d%#-G%!uh6HkdSypfsoQ}U z!H4y)Sb^c)B)S`G1=vHmNE{l9#Gxp1Ihn0q!z77jaZ*HjSkDye4~+%;LqpNfTr}iG zL)Tv=_A&ZMy;5QEqAq?QG;W3m6USYRAJ;7bZ>I=Ucw0eW=VMsKbihUm@P(Ozp+Z4| zK&L=PVCQ344FiEfqkz3I(-0~&Bq($mR1|hTj#b<+R3wEz6r#ewMWJU>9crOfma0HQ z#4;sFn37U5Cau)!(1dEJqZ*n}X{A=t^POoPK9n&fg=9=>q16%m&LF~vGNPoAj7TlC zI*6hy!{MRA@T8E8NG-HF^$k4-4;4g7AsLZWDCLi$lc?#|^XBc^=4jMhYvHbkHfWh$ z1f^-ji9KtQv>UeLny60NHfAZBhAg;(_NoVW7O3e?d(|DUCY#4xX>b&E`I$VBA7J2~ zN?+e40-sx}sA~Bl+^Qu{$)}s`N9rE@ooTN$Ksoc$QI#{Gs6b1HXeHzAlAC-gQ$LcVV)mE)XR`P`IHD%0{6<8t<#3N(B4Ii`T zus%OKKfR!ACJ&f5eN|(e%(hgsWa?s?Bf*hhaHtg2M+FTCHjf3;a7bpcAf_VxJ11+1 zcWru(T9iLb`ZVb&>=e8TOmrn58F6q)8FLy|6j*q~-FH_ox&c#M;_S?lRkTW_Ymk36b z&UdV(5gQ91Y2>k&&nxsirHwr#$}rkFwg-_lbO*D`OIdfN41fYwGa(axankTB8eGad zG`7;$tM0Ais|DzhUL=D?Je3QwY?*2?dX_1aMJFDMkp(Qqo=yt!2Z{LZ{?t9)V_Zo& z!UX8-ZafJ5NVuw{l9w6XkF!pUcZ6`S?f^9(>UV~U`&Bszj)WUthRZonDEc8Gs>S<- z5tn?DrqFZVPKx+5l)>joTVEYrB&b0(x|4{dU`cD~N1;OsT&qPq7m9&B8)1x3lr77i zYbS`lkohKc=5+w8$0q+B;TMf6-L zny_9gnzEih7-8ZHLqU43a#pNvbj~Jn&8r9;V>x)PlpEXTUgggdmYu!Ye{#5ga+dHe zM@nv7`@OLfk{4>jXA{R*Jb9rM$EXxz@#KY4{2B}?qa2DCN%PLH+{m@YXieDDscT~v zj7vKNqb;JX4~q@K&+qlp{6GG<)5eMF{x*OAHqZalX|OSVTi@K=Xs@IHXKj7` zi~r|yeAxc4b%xQ)u61C?xQ}<}IYFn5Tb7vdaXj$dQ0&KL_JLb%3yNRau5bMWmXT|H zKW0Dw-wpm;b(|N;mZBF~zBdT%@D8_zX)9Rl>TXk5Ia*Djn{Jijc?-5dN|!6s)+#=m zVRChv*J3vuC!2>j%l!ZB{d<4gIIcJjpTGMm)b4M3oYqZ!$*t|Q`=q&ad^We{(#~wR zUw>p~1KMh( zZ85gv>bQ~Eloe-8Jvuj(Y@lvq$V}SledTyQT98;@_;ebgwH>jAi|2FLx%iMDbzh)O zZJ3t<6JBr8LWQKWJu%&%1!Iq&5}&{VgYBrY>mIZpho{-at|#sVik;6_@m{re&dp9b zl#Z9G+z@x*uK;(1pzUX35AwD%K|vjPo**+3)I{l+%(%K5qK(}1Cayn-MF0N)HiKb| z$NDM26iK2Ph~ZJv$ucP zO8(kC*^&M_`Yrjr^R}u%k_!H=0NIhMt?zBh<)}3U&dx`<;)&GwTM5dh3?&8QNJe_+ ztpw!lmh}6b{Ci6U0Waig?_@+I4Bzf;DSi7*!(?OkU`xUU{(PtXsej%&NrQNIqV)DR zwaT6h0vM|BQiTQVOulZmK1gK`H;xWvFbXqOD6O5Hn$l~Pp;ftHU4pr>zO$n-YU}r7 zm926=rK%Fzn%wQ~Z_2zmd8;(vNdEe$bP&EZH98}93TBenzEw%SrSdGzuq~ab>fiF8 z(5%kS>Vxmj4j4B3<8IKyi@1gnyuEuY!uYWPj4uukTg&mU`U?Bm+TCsNpF8{Oo9x%o z@%|wfc~<<8*W>@$<3BbI_xKO-=I!Cu`ae_*w}%rmlGH1pd%LwIX&HL4EB|pI|FN+l z{j~{ysi2h48{6-szqa14D^=w`@S6r``&~mS@ju7E)1HkdzdQV0`s?jMO#|`vpssvx zD1SAjzdjz+2zq@@1MyJ-@lgTs5kPQ4Z$#nVbSP1oCq7|xrW3vqztNqJ4H|=JQD%8@ z?SU1PJ~?Pjw*e3>@>n=2wwE9=vI>7c^6@PE_p1JJmwg->KOV4;W8+8UDtzpAO zqTTOVGWvwY%;7>>;i9hwxKhgdB=lmKhs@I)P-EYx70uvVglb%!(2!Wd`l@8E=2fk$@p!VzAYQSt)Hqg;RhJDn|x(zE}*}4P51nXGmgAzFL0y{);O5+|NUR>vbn_Ey;bQ_+;_Z18X(gh znwJF&p}5h1!;d&wG?ma#iOn}7^I7Lo1PIFfQ}Jf)5W{S;-0OzYb?%7r*M}k z)2;VwtAaAD_@iHd3cu7INmV*)<|@N;s$r_KT9>=bezPiPK30143#gJ`rg9aPWpWjt zBZgHXtn%P*?9!>z-me5>FwTN8p6kYiGQjDx-`|C(z-X8bTy&PAEG1$Bl_lTB0(FI= zTt4DIS-0T-^+!%T;MH0!R*hm~3S!iGt;kYqFKKI3ye)K3Q9Z16CX=K_l(f}~F&w2a zwA6ab@k4#~DE|3NE&gq;wI!-O>Ug4P(pG3`>s?aov_vh@7}WA&8s^tJ;naXyQ=J;t zS|>?c)52}Fl79I~zYcR~xR>;6RJdR0h2s6<3aALb$alpg3Tp|8%E1u*XQHj)*i#gM zU3$rr%G-iky7XE`3Od`8woZ$;#ifI4d9qf^sYNKVT9TH^!H~%mt2Je{inMitjqzI8 zSfREO8lIM*;Ym_!TAUgu2{opLsj-((epHr@urCkIc1V4KU~^8X&XQZ%JEc#oPKVY3r|PdgTjGnm^)Zp&3rTvrRKY46zsD-z(PgXxa>v*2u?nDC1vT66 ziMF{cu5Er#w9Tbm+x!g=k@R7~Vs;Hk>)t0ko>08-O)k^2muYXgTs!43$Deura;dc( zm$|$k*S+Qy_R)FF9p}M#5q$;=i7Or6P!F!{PRG8n(7FC78nqF%N~hmzpATJ3nv3V< ztHQ$}9V}w!B8f(Viaf|19noVk9mER^5X;b(%P<64Krv{*bBA#;_NNpNAO=-usp>FJKM#1RuDg#xLO6^tb!h=MW|jJQ8rivZIYa4Pzv;0z^$5@iy0iDDOL zm?69pmwx;>VX8ht5Wgo0+}F;3|MK6aa7ZGhT{%3BcE1{0<>ym(W)WQDo?H&7FsoC zq*Y^%wCd*4Dn1;N0w56!_pp$+Y#!%%<{^oqCZaVI>BV0`Pmt*2nuA1h(w%4Ybf zw1Pzd*Dim#WT0(O=fTBkCKu}~z{Y8P#f$)aps9kGl7#Oo(K&!HA7PBF-4MNqY`uu6 z7ZqM^p(6Fif}2qc&?6qrt2<#PSID%&3r!ZS0big;+}Od(lNEFC7HGqvOec|N2!1}j zJiJaXMG1d6Y*;u;pEz%^>_SC!zsa_nhyXBOfo@qUNXv}oZh>NFxjJ{cY#FP|T#qsZ zT2`{B%h&CIF;8?UC{`_M#2P(IiCL<`R^f_5ax_s(?r2j>ix)xIbGSkalFYC2`fuqz zRL`IK(e8hJ{dW|M=6d<-zw+*X)mN69D|-B&#&Yfc{?~0h?EaTX+V?+4`+GS5c&9AM zOe*$g>+Nn8{tU;97y|SK|Gqw*oCP7pj&z*$5&SW_a(4XFX%J#Oh+o|S`~Cl$MvH!D zh&Q2?OJS5@gzoRqwVYn&{jPThJJsYe)?ytmFVRgayvh^bQNkFCt-W`PJFT}A6I9%- zngru#1Ml1$I6Xh~FvP)?;R?_r90pMC5}=+v(%(}sYtsj&IrUF$OsTIZ%%SoI!(wZ% zFl&_dsy_%^y%=U1R4yiQFB>xR08sTur<4GOyVvmbt`|k_sdqpfaae!28_i{j6`#1= z!4>Co47~_uIXpC^1Ae6@L1&S~vD1}wTTfVHRp&hmXg&$P0LvF7++@hk6U?=USwb;PRYNY85 zA0Dso9lvCXCUz;iogkb<7_EgIsa4PoQ_Ai|SF}gLgzj0=txKMfZaRWdMF~#8s-l3y z5er{x?@He&IE#ymagGO36>6%(FP08?K|wt#?pSbAcu_kT6F!3&k6mH10T6H0tI*%{ zf}dza5D#C=Y1=u837_;a#pB?ApoJFbT3Mmct_CRVk;p4RI|1Hga+Unu4W{Dr`y;}S z2!h%~1F9*LNgzvwOt7i~sVX&Fl~7tR!)sG&VILY*c=W})s%nj}eT87`ex1hqJQ~VO zOR*waAHM>`gbM$bGD?8zA)+LCC%!VqwJ|^da4Vwiiz@oHl_VeVo^?}6TwJSVaj?~X-@*waq2~J*fO~T84kUdGc%czTAQFm_ z7U@j;eJ}h}uQhOIG5!{fc=9avy-FdV0`VsvJ^SU6b8y(|tt?d?gdOKhhn5$lMs!AC z=Q)t1kmPsxp6cJxF-9a;x+qAQ?j>tY@2I3S$Ee5SFYuS72}JUC>_T=A9{uZ)ESr2Q z4uP9?-YW3^Q|&YPe70&V`7Qi#9zRa`P^f7AGf#=KfSY>ssu903ImTlj@db7=?ZBa~ zdr{XNd!JTiHpd;H66l(eP_1o~W3F!4YGLKSy;ksTvhoJEoLamQ7f+W&hCF@kGz>V# zBFQ=uizNFKMe<+&n*LH-`W=)GHD~~D;w7)Ixu$p`U>o-~YB6i-cfgu@K~mSVNsTJ( zhoG}ic&v-|4d;J7`fs!6(mY82r4Cd1vA8;UGyf{t%)e%9rcM7D{B89PL--Uu^LC@^z*5Tp)VPZ>(G^aeI-g}lrx#KzB(4S1a-rvRLS_#J9{@&J0 zb8G0DkA0U3*(@%Y*pDqaVx-0Y$h(MB&#NvWqySzkPHhu}ud+~RGley8OzKul?s|9j z<{v%(CuU`wJd4I|*nK{)HfXIndd(mjYhLk*Z99$tKG-{y_JXUlm5o@`k?^_#z-%sc|$5Zt%4cB&*WAwR*X|lQX_T*iAclRXy?)Qz2 z)XS4S%JQWd5{%)JnbESl{?L0DVJjq4Eeoyo5CvUTLa2fBT!$Zhu&BuOGfUYPT0&fpyE5BDIAFe?vnz z2L%MJ))~Q|)_a09Ou>PdW%^?33V^s?UsN0lbq3j}!-03#Web2P+!X^>svzn3DPK!q zYQR$gbuHrCkjml0F*LDt+&%)8wz0B=Z%5K=(16WG+|>GR8`{|TN5vbR*B6`$`|q>$@j-K%!G6P?9JB+Vj91$$FHF>;^;hN-+C43@OBFn z#nIMbdw*}|j|E9L;p{maPTSt4*CnmR0m7I&I@#WC{qD5kbAl*SLIfs3>gc!D_OVkl zfSq_Sec&-IRDNpldb#3_a>biD#U&Oyf=()*X;U|YhOkK9a0lHfLX4c_qqojDpxlrS zEcB;r`l9^Pb9?IYoTc9l9Ak=M4dK=mL$8ymzaSpLcg2U z*RDNDZTGazQc;x$LZ=|`bRKp>tcn%9I_L;^t)K|9{vW(M(eKl3ZUG02L|{^&-?E~W zX9>&j;F$Awr|!HI9-g=!(lFgj?Xu4o+Q1XAhPq%eg2j0OAL~u0<4+8JNaxZd|S7K5A9& zQc`*z_KJBhvSCE0Etb}(+op1OE4HzaIu90lFfVky_GHj$d!tEsRXIWwk9Xc~;a|=Z z_>iY8lRf|tXuGPtnRs~+HV#f`>fwj`$Q0n6XLM>$X|;k3WNv>vFka;u2NUf;C#~6} zL;1!~LV@a|Xh17c95TR6+|Nly%<=J7yLHs2R0S2l_t_gjn7q|7(p+IB(I@fon7)3c zmO@Ew!YZp0gF?!$(0$~lB|NSe$ zjQ@Q4T3BfZ>+iNG5{f=7kvT-MHd2fXFeEFW!(gNarZ|o$aCbi|Tki?A^%>C&bmK23`Ap;$3$Gt9&c z3W_a3m6(mZu1nK0e$^*jahyo2yTs%~K0{f1Nzq_Ke~3;GUY&QJBY?ep_NE5}SVUuw zmu<($iyG3_1c9y-=*WYDy`sS5()r*U1b#H_4!mh(241t*ZoXupO(QQv4+pQFx*W=s zqcS(>v4B>V(h+|Q1OJo%c`-HgMPZ%ort>a@swL z={S7|3b3g~B8>sTcRTxU*LP$Lop0ZaL*gM0yKXRqq2&ogE00;ls%X=A22gOtA59IB z4+`F{jb$CxiKz*hI_Tr02`3@ShjkMriYZ^Ew4#JL(Nr~Tr1wKXIs^g>A4vl_0uat_ z+>9tsMH9ss4Y*UU<2hVn&;eLVSRUG?#c+rhpIed^wbyBTBW|%q|09k4D(#$;fymym zN54c|>iiMS?Jhcl8C5_1Qfo{<|7-M!HYRC)@U^kCRb1Ro5Mirj zwR7LI%&0ophV4N(oxzfF=3z`Z*PI!vac}UpRx*zrhgbXy3MHpDr!*JJf|~bXmg+4i zEirinRc4YLV3TO1r*-MmFaCT*hjl2Ktz>Z$G+rMhlLhXk5JJ#Lh4jPmZ>-=j9ubkX$K=sSh7iNy!|SLW)!l{oQ$l|9#}VgdZdNxsaB$S*6V+af#GP zlE+!UM=l&(JrHsowt)x+BIvO*Vlcxo5sy>XAI%~K$l@bdo1EvSqkCUVagT0KcYO*%F+Ri1YB;TX;3j} z+G@HuDqpjg9WlXSqPoUq64G+vv1}B@#?W`UKiqSG#f7hfy^0(>X@#wD&&3pPS+kA6 z^`jOplqUh(W8__n*U@a_m$Ms# z8}R(S^M9&JOg6{`c4GhVWJERafB+kwFg9zKkHmn&e3^qw+*S;OVfus4jz^?78LG75 zHtwe99p3xU1*OpTF1sF`>0kssK2C65kjSQN*_GOg!mshpDKC_4gDSyw+%loPon>2s>mLbjT zi~y5n5NuVTVOloGGb%KBwKut(7*$KGE%66A(9Oy=UTlVS{i?UTvBlkoF%0=^23li} zbPWS-W8^c8g8UkTAtypXN(Iq2BE+yK%)>elNN7I9&Rvc(qqKA#lroW8njNXN>mikc z*xKxf$-}w?X14nW%IFzooIKIT%mXrNcf4TKgg(KXOOB}!FDpD(T{HtM)21?QUZx#Q z3Qo;MEE8$}dXS7WF^bFwaUNl88ff4pu=)}=Uj{FKNeIifx?cX$%UNAA5>vC(q#Vuy z_n98Pc9cC?3ogwD*>}NcaHZZwGWghI%NT7W%`~pPRMDdyR-HA{$Kx|tb29H{!~zDn zgA4a6LU$-eddE|z|LcW;vWI|IQE<1K_u=?(r@g)TD)VzI^KKdLyGLS#`~2 zJW0UWo}DIuDWc2l-%vzDu#I{D*Z>^$s3T%ve(}69EUAM?+2$FCo>*D)!7K*)^<_Ni z8=jPEH1MiJ=5U&EFvM-FWwcRrI1ue-91R&@2R(Vt0E}P4#60V)0oCJKgA)LyGxS(s zxp*+}b={yxCTGC~ZBeUJ48mm5n;wMnaYbo~hZeQLP!=#~IX!Tr3EN_S%~$Ng+Q4Fl z^?JPgXQaV9nj*B4#UsS_x{sy+iMD+lL{1(`FoG;riXeeW1;`RDtAW_&VTxcQ4b3zT z;#%^c+mHr?3BZO4z$UWYR+ISI=ZA8EH_zVmJr|@36vAWNhH7tbtskEpZncy7)3nRT zIB%H(G!A8kZPwx^h>q2}wVGRF$18|if+zARF1=6j2|7E*`qEQF&9-}vH^~;gSC$^3>*F;vQx&H++0WAv|M|$=>LYG(U>BTc zZ@3W1hFXD&tZQgOu~V;q48=c)Lr@i^?-R|xQ*z`e1Idi1# z=7ZTb9DLupD2&CgaQN=*T_#@1|2 z7`kGy5!6POltvQmUbvMdy_IY+LdY+XKc9Z-5h2pTgI|lw#xlvq@igoNd;|P==dH8p zyQiZdLJx}U8CuZ`Z)Ox;O+nr_mo}mGB3T5T`%w@&lq{3aIfj*vepN=_RY<7c9mCAg zo8o!Jo|oF4HQ*D2Yh-}CC&X++` z06Rwpl>s*cgGytY$)GaOvKZ9S$I<-R^u-HD-e8W5DhF@|R?UEMCbP=H%VJlT*wuQ* zJUe(XMs>{hl<&k#wSY$jHmv~q%6A!n8KFikvESS%nw*8f^z`g{l0#C1XSyoa5f>7b zf>27x2+Btp+>C;OLQxP%mNYc#;zU>9#Dyxq>Prthj}zZ&m=}jC+!c#|&@!PtS-}5f zF7m!P#(L=KWc$fy+iD>#zC{Do07>zGp@+YCMZ;` z>s1fecb#Yy1Y^BqLoZ2}KPPy~7g!y2Lw`KM3DnvYvsrt|){s=xgkLv z3q^xa#BJ8~Hh1xI*3Gol(AzR>iOjLNrrz8UTd7{JHA5kkHRDA$17;bkP+Hq|5_H8{ z6j!3Dqdd42wJMLIOVrxs(hJit*uWUSFr-qVXx_voYIG;zdDehiatpR(5DG(E-ORQ+ z1=~tXgrTV@v#D;59$D|2x37~XTq<5tMX)`#9Zm@kh3UM-V~~^9JdQ>8(aQf*jkAbAs2&TG$7)1!nrVv{&M4F z`#l{XivWnjplql=Qhdac|CkNm^c4}Y-!GqF$NI(h`qRhXuvwEH(GT3*Z@~YU8}ODB zlM-*_BZqQL+Wcz~v~JL$Q7{d=sbCSs>B#Th{CspYOb&@BCDncT zA_WEKdz#aJ^3*gm3`+E78eYq6xN&n0*HLX8Uvt%o4g<7d!ua){rp;j8#Yo)PNsFkMP%B`Ji)sJER zd?J2p=UNS4A5V&NYuIs0$93gQiRTrVPYfZZviI>=n~`@);gu?l z<&`g~jYG*3%Zj630Gql}U)ePmZc2qkoWsh}J9FVBsW2enhuPg{J+Bw*sc~Fd%6`ud zA(k1c%N9~lYf9=byHtDKGr)4m_+nfz0DW<)NjZC&e@3|2mb1RsoqJT6?|N3!FPZo< zb7;Xahd`~+-E8vKr@|kI2ep7Z9)o2NIj58#2X$v}N`bvc!84Y+V2Jx+U?Z3U#KF_^ zBRpi#W99IstOy_Ij{rzG1U%@IC0=KRlliezffm|ZV8`Kq_qO3j;ses%r1K7ED~=65tdHqX#sSY1QC1!pU)7FuC*!c4L~SmDQbR#$E=XM3 za6mS5EMgG14wR@3)}NnHymUJh^%_ z9h2>5=rcZZl>nyRkFG}DvoIJ1U^cQd_k43araz^j+CcL>L-D7e_Ncew9qBy6f1OGEp#*$+3sugY+3-hI`R<>y@t0nhPr$D_h4xemw zRcGq%Ee4vV#GV+f*fc2AnFgvbcS{s@^~r-fWqQ#>|3ZmFF}CZ~#7iAuHRVi+zll{O zG#6VA|7ljS5gurTzrgHs+9Fer6Wwg!f1kc~mZ}7g{X$4jEuM4)YPlW+01Q^EX_!F+ z3_Yt0FKbBD`x2k}{s0d{O?rhGW#W`Y=GJ#GErY!Kh=F`=rVrod~M;9blPPgDO^lNE(^=0?^`@V?FjuOJ)e zbMI-6ye@w+rtr0xd5X{vgl1{U{DE-K68Ikj&0^z--S;pH~N>gITT*W@QrDbTT(7mk{#oX)< zTr|UEKZhu|s+g6Af)+NEzQpz8-QhCdCyHIs6p zUwM5m+;GOFF19gbz14M@f0--Gadb0RyVOfv@v~V@>%P~lWAODf#qsDw{Ht?u8SUZE4_7CIipG4!ZGl zo}trhqcb1-!uqbHaAfYt81Gbfq6>FiU#X}u1T=cZAdFY42}H9|5QH&s3V~Qz$_G*W zQg%81PXdQKZ%5N%C)o_Rzx$p;<{$R%yYdPzMVrjHl(8peIJ}-^OVIx`hMPJPZch)& zfQ#rXwwES!Rf5((P6gdcXKvI!yAm!bx&fl}5&$CjH?L_+Mf}NH(+fUiO`pYW|Hj*1_`&DVaTw4^ zgHbRdDa8ZqgTU=YJW0D`SSCAHD~zNt2<6`KOD}D|cc~_aN;aCJvD=NqIpe|NL2%(k zBx`iN&igur$qMH5y1s_Aa8}j#ymi_pAzWcK`FA?Q{*SH0y{(=0(H0Dr&Go}S+O5ss zotN?_cp=Siru$-c=rr_9u<3&e`GL|cl*4$3kk-kgfcT)royUgx0-3J--t-z7xJDF@ zg|zLDdfp|bzQ#-<{>TwnV}kBj)^Jy_vaqOcXJpB}shI^My#S{!xB7Hx#f;;WnwVdk zNZv`9a24{O+GVX#&`9Cu#nvNa7M;2p8|@W-T1+YzStdUoxx@f5Wr)^a*ny_4)=YCM zXF|TVXTW2#@yU9lR$Gk$b?8)+Kk{|wk=K-qCvejh#5jp{4=zmXnqF53Vu&SbzCGk2 z(2e(3vW&?Xe}h4Zj}{&qnmo6Lh8B;(#EP3S7@DbOF0S8C)(@7MEV{gZu$fXxP7MjJ)TVycR{Kd^Q zZ;?&C`N7;n}k#CZ$Icdrq zEjh=T7)_@Vrk?l%m6yyWzII3{OnD;18*8RFkkhYoy|?B-dLj<%$)?o)Y;)iw@{^>Eray$V;1y5 z4=?!)aJE!3#^rbjTRS`L*51)x$}cQVGjRNBYNu4>Ybx?PZ2N4BZJ$+kwia$enqyr% zV$Ei%h|-cBtJv#6w@SIttTO_iLE?onow3E@($CMso*b+jf`DfpSP=l2irqOn(ROS^ z^p`<2eU(vvncv8KHdAz(CW}s^C#aNjHJVHVYVi2zt#j<2!vAp-!Ww@p=??HPbm{Uz zd*Yt9+2#dvMES$vbP-=NOIW|emYr)fhG2=3^Zh|#b}rW?YOZ~8u#aONE+y+Op^C!t zXXh*!^db%ifyC4~$K%*~N7U*oT6LiDI$I#9P;^SCsT{!s$gr2m9CfOWiRyWA)}&|c zNxhaA@l_>kLn7?T(miEu&&pD1(k@G+wOrjVstB4HscQYnphKf;aWe5rptmBShgZ%+ zEy?SgadS^g;I_tZCf%~~+?=cO>|I-V_Og^`VPd|Jh*?&5_EIB!v&;zZrAGMXyhnIX z9pSxO)Sa$G*wVW5FGSfHbZ1W@?G5VA-i*4_lhC^<-PxN>cP=sA*+M>s)A0nu@r_+r z-N;9GG$88THK{7gJ<;|2b6XZN_|k2&WaL@q@M@of?!p3cbn5tV8&H1|ggSD$1YBCs zZ;VkvuH%2D-0YclDdJ7R!>^-Tmsav3vn;8XY*AQLQC6?hZSis}2(vdbcy#zZI8oA# zq&Q-IIXApkt(R9#L@d_oc}hL(fT5c!>ZM~}O5$Yf?#gN^W{$a>r<5CqUeD`Fu_HyX zzEW)G@Wk;Z-9@d`>Po6BT7h(5GY8CaM^{st`WNMvbW_kDRh^Ie!Mo*ExtKR}$EHGE zy-hQ$zFf=#Yjsr{@M182v>);-nB%TqGQ%DH=bAS`3Oj&q_{_?De6I66)_s2y<^Cp$ z1;+hN6#2Qint3dasZ0}Fm%1_qG4H1}CJrZiW!eo$F zr4h@y4H2$&K8;vTZHQo!^J&Dem6(0-jK^TScI!Xw`C2suu<2M+7PauX#_2~jVDL>e zo^c9N4Rd-EjayCh(lfPk z#QL)1?iw@jyqn9Ji|5_kth4eQ@wkQ4w8gU-Q&tBo@niMft9hl(0PQRgoOA3h}B*+j^Q~kaVmCnGU=-~nuJ%C$H^IV z|8r(%Stql3mzFoVv%K}5LrpuMe(^t(`1qQD%v}OfXU1f@(+i}C%yecw7U%Dr4&y7_ zEipG|9D<*9ZqB$CcNddumFIue4q)m}atb@@yPWmF%wZRhp!s!j0T{e&ew-efdtO> zb*8$BU6>THw{wofP(rd5Ad4Ep?Pds6+7RpAm?73HVum}Bleocp4 zbG@Roed(Jw^Rv`?ilt`mNNG#0_rq9fsT27bmRe7?)Qa-1@ckYA=8lvXsZq;r;{L+R zU+2P$Nj=yv;u|7KXWcG06*pZ;HkGsAXf>72xTa|;ZoAWCDr>q2Xed|cPM%;%iJNlb zgyo+&W_ZCoXvXVAO5E`51ZK*;0o-MqIcj*=6CuI>Do6LPm3$1Nq(2m4(sj-($Rc#J zJFbS^RLfli%wU^{8Qm!D85i|L@KdrK>z}iN+c;01HO;sXCz>eSc%y5wi1}&uh#N+1}PEWs{RmXO}r@vODrPS%O{)=LbrBfJ!;5>F#^}$pAxDh_))o(t# z&_f`B>ccv);xjinT03j-pQlf&4$Amzry=C|wPno1DjkQzbEolnaWKdkS?p2}Ea}&5 zgTj=fr@kUzKuR;H8eh#i_Xpl->L}r=rFzV$JOEyH`($%xL+IzBkPl;(jS7p9=2fm6 zD;K4}>RMLY1#o|n-Fyaw`;n83ocfERBd5eYO8FR}Qcd5rW1DH&6DPZfT}xXfhN}c= zA}r!T%+#KleM(m=Psd|JWfKMTQx@gfVd|;g0I02NwV-iY13?BzCKxn<&7iU@k7)82 zwmdwW<LmwTVLFmP5ufn`|w1KDJTlZ}Chyp25fLXAt_K=EBL4!zdxu8X)wpH9D z(wqCqZ6Y;PhSY*V1863ZqScLlw|jd?f|0g|6cH_L5NU#XZxQ_o#tj)n`Qzp$tRcHy z!|WuRb(3S)SSyotlfj@g<=sW=;Qfy-9V4A5onTBkf-DRoJzK z#f@-KwyBlZuPH!OdPl=3ZFP3^Fa{=CjJG#Cs6fAw-rbf)ZpuNc9@~AX1-e3r_4kho*Ery9$wjSCjhBJDggk&wJD| z`}fBiwqJn|K#qhtw(IQ)cNX#rGm|0VO@{qqAGB7)((yntQ8SI)Y~*GfvQ~uk;7yt6 zrpIj#vLy#BO7{E)tkP#hKV!%mI-XsFMy%HRWVq&x2lzZPaFGVN`IJt^aHqWAh*Eo! zZxoT&Eo##_@T&OByY#y8AE}U>q8jn9J-Hft`k~O1z4fD`*1Nr}&DgSGfMlbFo#?DQ zI*I#+ymWqv#NoW44?K1{R}=3S%ESFgkY{`MxIG?R>fL%oOF=xA+_+>hjFlRLOY;?8 z-e2eM&LjNqBj;sI5PZiXjKWI_p8BY2c5G4*O)%W*ScOVQaa2-4Lv}u?E9^9V#dibr z_<@L^bzas4c#1C={rAKP&b^Q|ISJiSG;rCG&QVWLfFv$HwVB8t9(<+-#Ch`OXXX;< zF5p?{Mq*%Bq)HUX9?yfxfbhVCETuYFaf4`EKKyD*Rbm!;6Uc8!v0s0M)v;+wk8t?O zwlFFRYS{*f^SLM-D@H;%iUL|S0WuV>EMw^g@I`QqOUTg_6ftQ$=fWQhU`{wke;A%7 zR}KIxr;EJ^Pw`LAJZF3TP-o7=BD7dSjw3XQ>Eh_JiR&T`GshYwx(~B~Q;FOmh&75B z!|=k5oKY}g*(*9;AMGs{UYr3uDiJ&W5m!}0D>h+g(w-&0$PdNWMT0^qRYPzrn1gh< zG4*wCTNx)A!jY#klto!!ZSw7Gt~Zh$0r7kI+%bCLWEP`3<4fQl~g zLJCh2pQ6QJ6S1y~0+Of5`#SYT6W<+>J;D`J=#7JL0-8J+3pNtZBbk?0a!Q@G+y!H2 zZPB3lF)f2EBfv7fam{X+&Mfnnj551dq)#w%&~J-amKMpBIF=U0XKF-k~O*r$w?^q5%BjK8jE|qub1w+7@B%2VA9dG1~h>K z?O+2W4K=*q^XP>z4M2YIZpNb1!UZk7gRkyHpri}7>zwo3d_b8rlK7;k2uP7wRh=}> z-(#M#q1X#>Bo2xWM14gbk2Cv#4MS5Vk?5?2$CgI{?Naf1c*6!hErS<>(XRZ04#QZ>bIsPJ|!nR1Nsg;ypGqV zfg^hdl6HBUk~3R#Viyw#QF0IjV-N_RT1%_Y|GIz5JYT)x^x2p5;j{W;W3l#}3DGlR z?{lE`;@KS9sKK+cvPAz~)&5(nEw40}YX4QoJ^t0D#&Uh-ziRd6X07pGPHhft=RQ-A zxX^L_3uHOUDwp^DPx=V|61s9prL=#0@Hb|8DDPkn8FdF!&}5HT2)f0yN76eIBRsSe zjMNWw{Q+O8HjV1eT8NwE?|1h1-nHMhj*pyXL;tpUaJcpE2-d{qG1CI9;s4ZEP#HD@zt^)7_A;Z6da7g|S_#Klq!Y z_;%Odwy*(mofheY!+KGu{L&JZSFO`TKGwtT8JmRILfcVhCPiw-(`QgG;<6xKM?rrA z>tJ`n-m3`xwtm!ZZEQL9g3`0Kv)$fZ-}tSyw?)&%)-EffvCUTO!;83!&!5DFf8RK0 zxAu;=4i8Tbjwydg4L3*0;&8`|gg#mZG*4UnwQgvL3?}WcJ96yk=9`C!>yyO;}ipB&aT-zr&2`Xx=Inb z*HSr~VASh2!D!Sh%v7l?@vNZ;*~ZQx2o3wNWTUT5E}Atvx0(%`{56+S-CW;5f;U$! z(zK+s)B3Qr!TYkJd^p~1LDTGm+861A+LwdF{bT;2D}OjT0G1@OB2k#XhYwxl!^i#O z-?k3nLxs6w7c8O&8YZP{4~`Dodt2|?N58eUj~$6Y{6h>?DY&2%LtY60jno$zKvGhL z03sp))b$Sv25~{P{>J*@;U5A*E&WM?AQe?%v^J2n72eNp0^M)C*>7>>g<_Kimfs@D zuhf72wcb#_0F#L){hEp{$qLn2)hZl`4=Y+5$Ku1XMwE{SjO~UQcB6fCxWPSx-EKPy zy9?UKhVr$ceBL}dPQLb{iSltDT8%#jh!KgF5cdzWi2dOF(W%ch))Gj-R+(AcSlu++%>qG?RGJMuhVfU8-@EGmG4xY7;#XQ#eZx7pV*N?Wq6g~QfI1vf!VP@;*YpwS2#&M#wl7sS9 z#~+Rdi#>0=$Sl-gL~-%LV8C3YeH9OY)Or`IzdAuWe^GV**9$Suoj884*4RyI)QZ*E z*xBMWUP#Dlg^uGwYxY8iyZa{93r5*ytY8bFbg;F}D=bk39_Oe(o@xcxcSUcTR8Z{m z;W-Z-CfF*hs4|hXTU#-~l=tf~A+zWh*VsNdJZf(P-n@nQ!*6=i@j}Mg?sjD)w_(aT z+^h?iTBUvh<_b)@O$jkprj{;K)5|dF#WDi!H&HuPbZ=`N3}-Oo^bgGZa70D@^T9rw zZFvi6uf8mCs$Z zo&`e1$-U@kx3jHKz8;T5vrop|SK6CV`W018UedLs310Y-AScIRw8q)qF1&zB{Nz2( z7#R8&77noZ_Y8OO{b?I!lgJN7TC-qHTfX4Fu>DJCXn5J3j6*tIZTfa;{e&^rZQmwg z*Zl3W+qHGcb0c&^oGXCD*Ja8(PU1HawyEO{HYr!X&(1p#iO1xU{hw_dPCZVbeQ_OQNWS zPsi&xYn>c}-r5sI*;4oDY&rp19pN(b(Zof|;gPHeWhm=MhxJvhK?@U^y4^TF+)0YA zEIi2D6+;l4TeN8)Kpi=i^vL*@mh5ki^RKM4ijI?#@oyz+rOz%^<t-wCGnvlZYH(l_{J$=8nx?Bn&^X6YEb#*dc#s-DP7@%Q;G2Ou{*%hQ59?r@;x?|S9aezWB1gH5)jdJv~*5b z9@neRaRa@M`u@Q&n0sJPw>E`Q=EzHUNo!!iz3qLem|U=?7CaGVpk_WnQ21vMPs?d-pW6^8*w*?oj1 zTSttRl?mQ%fRgOTW0lGadL1CEsG-&21W(mK`o>k18Yd}JnO9+y=9QEx2@g`05~{Nb zNTXyl#E_2);& z>(2U7%LHWocz?IGp{uVK90-qi9nfyfC>SMasNK+W&An>JOX&pOTHLGn?%&9v6Yw6$ z4lLem;AF*_fLrC@lITI_e!y?n=|Bz+%|hffQ$R!#R;B*O!`AVZNzV$tvkQK_TSgH3 zA1x>dX7gQTab0lYrMsa`hqAg?V6eop^4<$o2ky(BmHLV!KTy5Vd$yq>^YXn^IHOL6`yx(}weym6eQoKkwelx}M8WMgOR zgdcKfWEI>$K3w191)CWKr9P_#(J!;(1*4|Jg4>C`N`A<0Lw@&Yg52#$gm{36acb$B!Dzi zWQ|4v%qmHW9^IRFgi8yU+P7#CqI(nFQ{8olj=}G0tyd2oB&U0i{h=2=$np!uo-YTl z!q9cd?p6AeNbap6AbpYCa?)3)i#O5QLBAj2#T0zQv3tL@%g}S2CtoM{;}spn&?q80 z5&uZ~hY+@54ttecqa05sZGu(N$~aH@)dbd)XhEuke$k?p4CqOBdz8NvMo5JW!KPS< z{I$!}J)uS3B#reWx@9HLAuF+Zmf#<=?`nF_~Ya2mQp5R>Uh zI^(5O7{xX4<{-{pMQUA%R@lk3!NeaAuAcY6{^+TPZN$}HrsZL(pk9q!aYBf0FmXka zYK0xCtMdOg3|?<`tWJ|{It<5eOev)&wW>3z6L}}za2$j#Wqcf99x%5X24MDd+z8CX z4obM0Nf`K%Am9%=b`E{%fQby+Ec7C@{ws8+EW+!TKBY2uGrS}Mkt>P4XJ9ss0UI9% z;X+KsxPRj)OjrioLVFD;%eE`@1APkeeYxiL!HJ~~`MQEBw0?r=-99N-DL|sxUF`tO zRFt^Dmt-?0TEdNsandFTu6If1f<>k)Ac3LV1$!WaW^|G7;OKCHANaR!1z`*c?Gs(q zSWr>C@P`SC91(xS4AA(9QF4D$m8nk12r@ArHp|+m;)<0ujX@+{2_&Ma$bZBP@q{dD z=XD5U27=_m1JexbXdRTH7N~JCOxZMseTlSQ%i=fo2d@M}g+W4N1_ff^oqL0n7(kV_ zKZDZ;4kdM%DA@CPPLfm7I>y3QMk##;wF@;Oi?=T51kL zy+mv-8i(vs2QmATM#G>yJCi>b-rb&616=Q*CcbdB3vs+4QZad^2y6O99KI z?<{^x6i{2j)HIqHBSdYCli3L07z!+{HBLWP0To)UkB_>UC<{!EH}HuaaaWfCw{*YvngN6 z;fE?L=3AXs)Z{Q73wz~#5V<>1zAJNXR@Bae?*XPbT~Zm!>{e3J91A&=y!Tud4iYn z+xQU%-GVV@NUDBS7^Z8Sz(`*^P5 z2)&@_Il;Tsi*#Rskj0ohPm+Km__ZQ?o$wPbD+aRng_VuKto3{5ct>((8K@yDvx*dC z1mv!=-NG~^{W!;XJB|T^Mfgjo%alu7gmyvXIbd6ylr&O$z;S-XglD(C$ca7f$iZC} z5&>uVY}Ljy@KWQfGgB<+c*Vla#MnYTSWO9<#tGXCQM2l#+v1t!?W=5zMJK+cgJmH~ z9ND17;=kO>2PmTQ3W8l8G= zHnW;*CChK`f)`A}XbD~dSdf7fBlULW;=MHAt!PG!0`~HV8>{nx*=CB|i1=r*&1M!= zDmK6=rY+4xGtF1zx*9DF7h&CkKc*5QjP4kh9O|25uyFu{iBvDa45raa9tP67!$~bX zL~K5PG(dGg6c2_l9zELX0QD7{F_+cEq`8uQV>uC=i$^xATsn{0dkO)1CH|toX!1=2 z(2d7izaNXJGsbVsP+{hdUT1-=gABdEz+|E)d?n7OX?2@$FxU*%`hpSOC{YI z$uLo+?E{L) zkdzUxlyWMOt<+cQpfRl3#_IirqxBD4?GIarN3H!my!XRh#6xmwP&p+)l3hW{8cAe% z03y|t4|r#$);>Df-fsQwP}s|Kz4)LDhfq&Js4EZ>Poh#VN$DV6uo4g&F$9*I!BkVl zqnU!y)L>Zf;Ky+Y$WjW(QVfJAxK~Pu91lQ+xGE-W(9WD+hYJ$rvS=?TC&j(B z3Ws6xq~%T2CT9liF&RxYb>hHR&)z^Q&)$fOJTPPG_cmy*u(TMrMq|G~lLkDg6s}w< z3?J@g0ZjN!{)G$-l0CJe7_dg-Hh7={S=pFdBF&APRkk+dna7;Xg<~KK6Zx|9HrO=G z(JhyFzm7r)GG@tF^-IYbdF>JN`{6dg0zuhY|2RT zhM4&ko7!M7&{m|$0TMIrp>?dOG^RaT=OJc5(2=a0xgtwiYs*|KiN(#|)-psM_it%? z)Z8Ox4M8EjYsQ|Dm5=+q^<|79Jqkw8(2S(5TRcxow=vGwgpZ4(2hb^p#WHT|;~#Gl z;lv$ji4anabRjwOi+$**WJp#pV1;>Y^lRtaYOp$s#&INH;0=Evm_fmx_@SRqjRqz( zpb|{jl&>|G-$GCibocJoOJ_4+yVg;VWa1fkU`TCj|J@PPV?mC8|6Tme96e6u(QjKj z2MFbt=q1nC)5h3oTkSUf+G*{(Qv8V^4Z@#j@EY)ypuPYk*EB6_@pMr|_TLXh z_-wxDfbY|ExyiCYj&eH9>ieuc|r%x#3%%)B5|v@wJnN^_jH}xp1bS$b7y_m zS#&mnVTW`#o}=Q&PCEW1f=?6(Xpv46@Gm|1vnBn>8fHh}UdLHvRO4Vl>m#0Rmm}kU z6X`()(G+S`_>qop{2)i1a)ea{4P7(VhWVT216|Ng^LQ;NB~J4CEXjhBWiis-%h;ULXt}kWbSf@^`;72i#B*B6#!VUz zi6tN=8;}S|1{PUD9I{1JHpjVwUd_}qQQhm$fUDVR=>!;)tkcFA0m57%cM|3};iIOo zfjJ4Mo?#9au<+iP3Bx?x++h}Krd!QY<9(PL3nC?pUnWjsF>w)uUkX_M+#pNNp3#YH zSkN;*$B~WOzpWo`BBN!cXE7RH|EpeKU0qsUU0rD`|5vTP zT5C4%l3L-qV<68fF#gpR7aquz6z zwBpE{KAxNG;VlGA@8g9-N_B{TyxTi*b})}y=)B`+dJd+Yf#1d2JAly$3@SHr#`rQi z^DsLiOZSGT9C1{fZLs5eq;Ot2o{xv2us%O=2j&iMjRUM=7MF@U!48B@K&fOF=t>!G z)`p_qqJ;`cXL};~+*vU8Sc(~c!m`(OJUj{7pAM=B0&lNu}>YsIvaHwbMHO1ADODI^M$o+}rzy z&bk9i__(!kva^2Z9Gn~;>>q6{I?j>j2{IEwO_Yww+^3`6K+PT)^!^|c{r>~l908Jp z9?Jz4dR@;y#|%TTx*A`VVF{5Bobt1s{*R#oF{POwpi;IiJ)6sM> z2v4667=Y;c8$|25wun@7Rd7wGyu)Mf9?fY0o1hXGcqK%HHwWPu^JIe|VSO zaT{++MW66U7cQ#V^!6zZACK=I$yd$R*@alT+0D~)eiD()ZH3X)$E(~@c_{|Ht=1N% zM3SnAkn^lOzXmPUlZwWX=&9^Ma<0r=JPuD!#nF1*@k_mSW`;I;A3|L!+Y} zVmTeBl#{RYNQcCqkRMOag3YE0u?VMQnuFk!T+%FeIIhfg_TS;^Oz{lF>niS`lrp2G zuHwd@DAOe&{i{<$-!=Q=&1)RWYc)N+BGzWQR%Wu=F{ zai?TQA(enM*3$QH=(HspQ}U;TZgH1--s?vTDgda5 z{>~WAg5rr44;r);pC$D69ZJ9L_)njjI4m`b$>kqaok4HfsbD)#9e-iL#&NYS@I=WV zDjoc0T>c7ggkpA8??1clsV_(%;(oJ`G#5L zm)-(`qB{WeSM`y>Oa6%2CG39hqpDF?^0$*gRYoi!1M^>Loz{Ext5laxr|B84Cxe)9 z`XHA*wclRz3<62}wq}f3!INeZKC^#m0^lcy*rpCYY8Zcn+6;-;Y%f`yZ^d#HgcFmV z$FRB2){T7GZ;o-GVwZaCeTL6X;a8VHsE1pVESdtF^d5!yGD<#;^lz9NlvD@rTLi1M z?ip9if@odb=->&OUMdKwM`B47d5VT_abAUQELnvlB%RQ6d58!Bnk}PVD(^N8?^r4* z+%<^*cp^GsMLNzruZ8R|WEE|1ofj2}cv}SIH{bbkL;Lk?kX19yBibt!}R-a0} zOFYn%PDsJx!1QOa)L*IJK)WQnU2jlJ{oUbVa-5fVc;#Dcq2Vs3R67}Oc+p??d5a=X zoh9j;re~qtvpTuNWxF(Uk6GP8c+A?5J|+8g$t}sx@|g|Vp8!*ux$oNizLhoQI2~`N zC|U9$1!{#?#WN?YfUdVi0sj3}k?ByhVBghP(3QJ(XgtxCOaiotTG@$8WJKKz5{bci zf@>7KJVMb)ffS+Agid5tkmnmSc97Bw41nB2a&EPgWBUp+G8`$*vVuIF_P9axA4}-} zrvUycK1F&!CmH73gHjY%+qYnRgZ}@l{hwX;3yi0Mw-|K(eVx6J?ERlwZE3Zk<$qpT zZPxGie{SOe);|0HgucZ4rxa!L>1$``cF#bUE(Q;<$Q8ay?xh7Hk9~j|QZCaE#_i-= zH~B4HDhuT6k^!ukqWInrgY^F?r}hXPHl#92;YC1JF4?opD0l8hNvQ|_Uj+&-JeP2P z$&OZSP#Qz5@c&ityc*0W?A5|gva_5u{^d)p*J&er{I4u8uhg{t-<6fs+Wq*yjfd_3 zvJGI`rMTbtz2Er#t8M(oo4nd_CU#$(?fyQI#t4fh$b%&3oKU;lPymv(8eV`o-Ov_N zb<=V&cB0rFXSRBqay@zRQ|E`W@F1M+;GA?8#rd%29D02(^hRB}H{?`~4$(9rUMd^x z*j;wkxjn&!+^4nApVpF{_5Z_kt?~cX=wHn4P;WTjtJV_uzvTOx{F;925Yi=55aQQs zHVASF{;%Fb4g{?PgFvx3QX~T z+Q_S(QMO3+IkwK^w)&@`L-MMY`l;|8IWBJe`dxR>=1L{&9K3vE_=%{Pe1O(*=GMC0mlKM%t4 zaL0q)!KD<@u)yf~;pD0+u1N68BK8c6my1}5P{s@tD-1ArN6~4iUImL)I`bEZAaJ$M z=$WIl_gDuvK}E1e5m8w_fuB$WRX5YbBv_c$B5`s7gttL3q0784p`*#EAqt`GMU>Wk z;(h^hgvACu+~1Yk;d2jQ)JTrMD>x^I&{^WQlou|RzS!p}!pNb6OJrk4FE9FE(E+P% zypcRYW#h0^izau`#GCIAOnC5CUp>feBQ>`5JucB0cgHIu1~-M+)LmyAJ>)DFb2<8r zxxD-xRQ*e*&O0t+s$@*<^Wb4ga3>o6fQdZW(!2l`<>1Rpib_v81@PUoH#;!(?=+sh zIeYz8Eky+u; zq%c(*lS?YZn-d#Q`0BAC;iix>Wp9Ocb!snJII=hggvKuxi(T4wYEXrp8n#k(hVB(u z^V|XkBNeRR@z@*vT|lBLO{#L}0q@Q|QzJ`yBlWnE%`LgSMAmpL;MJQ3CYJe6lgP@6 zfPWFGU&*yIs9J`ODO%>!Q|hir&xbNym)Tx`Viqtk1_jf_Uqm@T{z^HjVX*m0_c_2?diCO z3mMAzMb1QYjbRQ&vc=gAS#e908|X+0VPO$koGe-rYAM8zR7A;ZO#%M}SQ%|Bjz^5N z^6FtDQ$@A1f{)2SjV4UU?fmE2zd!5zS0>RmCe;n^AUcCG zvBY&EY@s6+njGM&&lyiVSZ`i{@VH}!UNG{UrGK#Wn}Rwl6zU`p4Y{VPBFke!8vjczJuc_w;9?`F ziM|ct*Fea^RlzVKGU!WAO`q}wzk1GGPA9;^Zd4wLOSUlDCe9;4gYDhp_TUo!e)dLv zImWkDjza3Fr&gPSc*LFJ1UlzI9<;ME7%~u#n_y=dMbBAzUX778CW=lIX%MKZ=lBRw z92@^LcZ9Iqm^@Uxo^yscuT}$!vt&I1zgOf`(Dp*b1j@3H8z1h7^pZoPC(ei>oeYzp z;UO?(Wlv|l!0M8?_)RSMl*)9!MKC|IHXVL_dHoTa7OSW+!c!!ofhuZSRmkDU`UxOi8fv& zsa1SNm=JjYifR$M{l$CE8|#76<^ZF31C4US;a1q0H_j#4`V`)nOmq2L0?LzJZ8*ydEHEk|0m3eg&^Rn8&C+$c1tN77w z$uDN`2o?5%6=$4$2{8Fr35YnaGz#j(Dppu%v()jQhPFS6Q}PHVm8uiuZHuD8W1W?6 zYS#xpR-VY2I4aQZM~Aps2_;?{*D>A6wu zG9uQIia=EZ{c`9CvR*f6JPSd~5Y`0NLSZM1#6_G3x@2dNx(GNTib$a1GVuy$Gnz! zLYaIqkyAncKKW|t?**(EP2BDmryt_QeLN2gk|Wx<@WQx>Mdu?P7mlVw58=^?Ty*fV z5WwqiTXc#!V1b9(K~n#&^9jkZC=v%Kl&dFy;a$bo@wG+i$k4+Wj5LPy3-9cTp-B5` zy8Di81pU4$IBKrv7y*%&7IEU~Xd8{snk@;^u}*BDihzkT^xRPd5PEoCm>9X}m=;02 zyh$e*whF(i%`!Tr?t6->o@pe7UCPrm|J{TU_4>je;`KG!-Nh6+v*Cwi>2`y#$DLOw zn;?}{CZr_eAfTsVaDfE?qtS&M_RNGL7w%IO6ku_GJTpRj0pBH}1O8UNP;+mPoll(= z<6MB=8GkfQtxoj@e`Cpy`SuQXy;Adx3mNU(I*OwO7~jWx#K|Uu4uT@!Yh#?`gSq!; zj3T6JGB{b3^z8NAvwD%`9AnpOX<%y|aGu#d0%GQxM(HA=Ug4&x7qTB9Xt8QuBz~WJ z;g#d{`+nEQwCQ*~AsTynmh>kqnmVW-papK3ENb6XE`b8!j&0yVf2^X)Ikd6_-$>J> z7)&MJV8ILy!+$bKK&tN*BNhGo?3oFg&vM11u1K`l8ZKS16BOt;%?3Stvhppy|7@Oo z#YE7JbLc9aaHfXl7SBbTiJ;x_nvII0e&N5L4M^fl^YkfHoGx}hVP_sYO+$;wB{{@} zcz|Tjo~2&{AieZ=BL}Uz+q??TTrL+Ju2nfTpSYBOW8tBCAA$B$;Pp}+j}18S4zBR6 zfQ``gr0WPg+O1)kJRM9zmu|%jih#&0uIW4PADG_uLOBQ>kloaT#&(N3jnb z;|BYop)f|QVl^D-PZzJofbB+SfuT`^;!*N1I=hl07mh5MKJICou&T_SIZR4hEcO@l zWMYLuWu1i={8Ey$X|8^tK>Oew?)FqzX0l0gA>82RzhvI8wJ)-+Bm(Q_cs+5BSCrC2 zp@8TRtd*sFV6}W;%BI_k%M51BJXzg->&aSWxjngX1zl(jWgCMao@Fsb+KqB3F|0ppLRl~ z=h4P+O8F>8l@` z_PZa6$Yf4VoM4jOkbTV|=WvG5ih|^FR4AD?FV)vc#w2N@j*oS|$h2mO5R#r?M%?=L z+Bw=jI&5!H2-IDmtzBK2`C!J;P$Uc6INe(beB&mvF_v;)y|lvOgMcsxD*sfXfU~`a_}Lkxn!-mw=Gp;4eD+T^h;{K3p^M*xr`?W zT6@HQz#O8i=MfE~X~H5R^+45r@;^%_p5i2=v4vproAd&nh&$035_)`<8+=K*7BI~? zRP)Co(+e19NQ%YnW8C^j#~B`_ge6COe8aRZ<`Wu52dl{aSmaY*eD2n?bC;lQSavG> z+2*l@kx7X9Si}~FX*oy^B*-j28N(2j=j-uC{@qPkxQ)AaIAv}M8tB!a$0j@t>&J-S2~ zdgCC(wF6!EkA-;ABqzlWE=go02Pmi7$M*g|%<>;At@0xv11k&+XxKkb%RA1mvxs|& z{13C}pPI(a9p1H{(W0wO%Yo9oo~2WFr5U5(d~lc^(rMoy&+@l^)N=a1H|U88 z2d1HDBBmP+MUB$0dAl0HHD1b)Kb?w8* zA`vG&TJex;YP2SIQW=;h&i;sHME3E7>r3(W8F%8)4cu1Cf62&;o|&WV^+Q;Sh$}2f zjsH0~s=wr)>8=a&UZ>!w$X1@6DgftPjfFrN8h%e8nFA|KD3X-$~2 zv2c%zt&6f7QPIBT)rZelANjIfVtJCe{xB{c{Njs;GBa!}1Af+|ZS1>N?IvbvmAsi# zHa=D(-iU6YJF}&xenT@^hCoh>>4e(_+A+BrlD3SZGK2Avfq=9eHCQ7?Aepx+GTOb4 z{ee%)$e5Uyz!?^CYTH--D?=aSleWTr#R@kxXS;@+?n#ch6yM+QBhV5sB#G_h#;o*` zGnfl3=QL_uny_TsW)>FYuzWV#<}Vyt2^jhJzyBSNR!u;?Qmn%8YC;#VTv+fs(GX96 zVKq9)GQvY)1HTJ$cEt{62?V5yc&7_=E#FH7`S8yD?!=SMy5z(W5ST@7-y5Lgo?D7E9_M>t7%pn%-K>a0&rCZVlVdGlNz91u2l`N$A zU23i|iX$nOO%^jd3k|_PI~ql9pIcG+vt5?AU577niT*EkS>AFlUO-9RrH{X)G)ls0 z{Yty;i!IcJ>+6yn^XH*mWi|AjI0`|rPtNl>wd=6p-Z+yTZWm-+?Yyj|F9-7DL600~?TeO44&FY8$X`P6Zi*F8s1w`SMVtsBwP{=J^Qdp(`S1bl8mPv5AH_UEgk{hQa({#`LF@%sM`txAwNK zwKLoyi6_Legyv`!afz5$&fnEECR)O*2L}43uUC(P5`K|VzOI5%1jTP@SKKBf+$$k! z2m&s}YvT0oxORC@xp^ct9Vdk>Mzj(ahl_PxqZhvsMt`BGNGU9L>8jMBcM8jLSPawZ zJYxTyoq~-F3eEtomI2Pdl!P(tU)~*zG{EnLQE%HI<-H0b5M4zRZ^&yut(=g5!^@ zIhr=Nw%a@rV!Z-#4pR|&{;Di*u=KT2xd_KmD1FAOP74}<9u?s^;1_s)C>@GF$b!Ne zLdBWgRxcQNHe{(Q;g$U}?MhzQzhe&SUKVt=o1Iaj*X_!b&^kyTvnkoV7-!VSkM{bM z(h>?{3c0Jbs&l;YuD!9ov(w(#-#fws6Y-0Klfy064Ew)^#yA*vjh~h(gI>>VyOFQq zK}Hn)qm*BU^8L)>raIB2d>vTju{xY~a_^vgvym=;S)xLtA|+K;5cAQpQc5c6i*w2< ziGy>>g30`aWjGI}Nnr}yr5CQV!ly}LC_!ayFbDq7H^Aicom8h;VVShufqyzmvq+;G z3|KUcvWHymh_e-FR;E4wJjFsonRd6ES1c+3Dk=tQ(EHjqNv{rVVk?%N1|1KB+H8Dn z@G%i5<`*1#=8=a0k}7GbXy8EC<_TREn0f*&>~?S$E>Ao4n+^I$lh}UrHJn8JGqqzW z18DT)e)l!nG%Nk?a2zT48XIH2OC7NGZ4 zdj**2ub@%=6~O;$>a0Gm7{>%OQK%fWTc{i$V=1RMoFbnMB6it4q+UHRs_~I`dW|XB zp9BhCk+F!1QKWZ}6;dd{%H+;iaxZ3`j96`}dI97vb>vb8Iu=psU@W51!E9zj(Vo_z zjxyRgT7x=opjTfNC|bu6Ha;Mt@qXRcHo)bj=Urx+ux?N&m*sL#JhyM@|zfvYU^NpyD8oT zR~$glj&?df z{_kx($)G#Ccz$+)<4t+h3EZ$3sjo?9CjKzqDHb2P<0-wNyC8JZ!#(#Z@3(eOw*7%e z_d)2>lVI$AoyONi)2CmY*A6R^oM(~ZY*5_f$xwu~fBqbgXm~u^=(i5I4#$#_arxz(L%^ z=?9^FCU=b;$&J-M(ympt>wJ&b{Y#+q8to4(|d=YI)Z~03Q79dvN+Aq|bHMhaFsH<%6Dm!!vzMcZ7lzaE zM4TEd-n=3Zl?xJuybAsc~3C_@NfGOp` zEXh;NbV>>q+=dxnDHrJl(b~XrWM;>P5SGd;5J@F$ZJnCz4@Evs4YI9(I8%m5j;hI} z_Zd?K`2>g6=)_>&XuvvdUXgPzj~{0#hFCclWwY!|u!Or?z-$$_R|bLGv#*ZW?Gmok z+kS6Ot0g?mo&d%9F=3E6%)Zsy`>?)aTviyz5SqmW)-bHt+}ALM*5|v1F)Uf2s?w!O zUz*4aYZhyHc@<;mh`L5G6d2`}P**W#ERw}DQUqu<^1Pnc!vIO%D4J5bEuIg_Btn&nOyqp1@U>KG*<$F1wrVnz&{s_vUDei7P?!ctmZTP5 zHW}((Z`ou3IP0>Bftu&C$pX>3Y%+Hyy==-TXAt=OWs?cdS(i;VSUJlkL$&hDCIgU+ zWs{-wb(c*h1nf(jtkP-Y--K={*qO^Fv#4Be*<`@Mx@@wSH7uL#g^kN5L*MMnCPQIu z*<>i8Et^alGPU$DVKvApU|2SpOBt3;hJvPLlSxAt!F`rxlYx&jEt?E*W?D9x2IQRJ z7?(|ka{98#BRm~o~-@fb3fv-@UFK7 zoW1|sTwZE4^!?wJmF4^W-`jXtF3}IIBPSR;jMy%T50i!hhMJ8$HL?!Y;ib_RYIYwrL? zqX?6^J7auF3FJFhRB;vJ>EX^7T1z^a348Wz9Mfe?s9 z%LTyt%E3IRp{TcLp+eHx9!r|-IcLF`uc!S9+mh~h7;U&e#XyozD7o^-*70xqC&$kE z-XG4#^~1yUz2iS#QC_5AO7WB#D1SH}_?R#WFYb;eSAaW0*xfqZ_zkM8zisWbj{m?O zY`2d0wvLXR?fpY%-GMdhackpbXZ_GQI5|AnKiXP!oFmT@WF~@|C>@g-C$Ayq;qG}8 z*B?Zp|9=3RBS3P{bI!nw19o>k{~VK)I9(8@a;&7#7nBTYB9ZkK`mjbA1SJBDe?6N_ z#xI{gzqq(qJRMCJgYfkEfB}e}zgcAYa8pMVq%#i5mG|eIeQ~TxU<&559z7d@xSUhg zHK1jWr7RE!-OvfJ-P+pOto&Yewh#ArtIqL$fwN@n_*bR!`vT^VuBy_zJ%uK0 zhXtZseHF;n0C|d`EI3J?6+4XP3;aLS74?YT3CNP*lsfD%N_~~U;eU!iSYCnuzhG6G z1^ciJ|6ijjFAAdBg#WKljb)`qMJk4py1a}M$_TPl5F3EqT%sBcxrQAXBod}n{~llB z`ECE`xczbeaPz4Bw)JjnZ?m<&ryMqYyRuXP&D{C4iXu2#_^f>W$i7~DYMQ}AO@cr(kn`pG#K!O&>(Q(jne~uBT_3%ukw&s zN+Z!owJ1SvHk>|(-fRH$7zeJE_#K=i8G97s1x@+ShEPI;p#%D~Cvtr+4lpeeR$)!{ z;uno%`{59i8AM5rbnF(>)04nq!Nn;x&A=VUnO7HuaDb)&c=4ajg;!dE6)e!pD6p(T zXru}(sSwfynks~Psz5`9kS{P;8?_jXKiVAOif%TlmH-LPSd`QR!3ugra#UVv7k12Qh0w$!mT}&I+QjkQe%+F8|Sx|3KO2$JO!g zad7W<#mju-9zrHJeJ!re1S)3dtj(c+FW< z<#n-*CqFUDqF4t>!%Y0ihS{7(8LGnD9%W?)nL5hK46=ESGN#uhxuqAe+|plWiD$ZA ztyx!UrbgN9*d`KRhC+8G@zT5kWVoMK(lzgHUfI#-l^tbX*|E#{ zZ2z=69*?iy>-bd7yV3CjF0KQV(!oMb(|4$;6LWrheRH$oR-MiQtTtUdo>b{9NRfn( zPTtC&pRv!KWVJvq!q4Z;xRfP^?mQkU@z^CktV1h9Z zJj%`zCKzSs3loglpNzFhq^wQk&zRh=?!0ukbHf7Tn+l|^0I3s@Mhv7FjD`ZEK`@p| z!e}ZmngnAl6GlBbV-YW-w6&4q=9w>F%FdQLjO)3P=GT{5tVbQjz5YnU__6fIj;=p; z6#cPNM1Sn0#_f)xKXwY}kJzFu;eh?Y#;s&Gz`XtLST+sbXqE#M*m^G)c>OwEVrNS( z@vEW4o>Jl=FQEm*6jla>)~s^m^thW+AlqA$}Q-8HGl?&>j>@xsxfrvZPa{ zLsg~NT+34Yhx|+2SU3VmkvOS{PgF+-G&Vs;)0bD!a`T-h&e{SUPsbgFY@Vk8^i0_3%zW&+qrW&>MBVMd6g^h&+2uxW)MPp{Y7_C6x-2kbV{^ znIIED(;;qPL~)u%*-H%{V}Cv^eG;n_LsBO!IK|MW@n2!2kUZ+T0}m+yrH~L!-gj+h z3ECun#PvE?6EBGu2m%U!Gmg4})R5?_aW_tPX%)mG}yXVDF`pz$8#<@J}j%wp8ei(^y`{V)&nz z(w7AZHWCfACpLk{@YnE`%$0P!5cZNS5rhz; z^ukC)2>+?nF4-lxeqa3eWM@adABq5&G|;bKod)}rmIgvVmj^FBKW?I z(;1Vhd<{Vvaf9SygLu!bDAZT@>+k9|Z>Y(MUuDVZowFdCB-_|W(D&)sIfB`#d&aH{ zUU+nal7*~syI~MTjtjOjzf*@AFE8HA5!`ls4wT7wbM?l}Fy?gkCQo z)b&X)^kLe;@Z6JdO7~hL{D8;_B*YElp*sP{p$Em`GqmLnqQF@{YB`ZNULC<^6@s0a5@V|J@<=RTsA?T>7whvDJjx`Ux zVL*4Bhps=uvfkx*;CJy>JLb5>CLGFnOFeiu2s(hNh?_=`;ExN+nG2Aaj;COEK=35I z8tVKG=w7$m#T(N-SS+!qY6!H&dgC17h;25;gDK1jy&e!L0)(){-oeK6gAE5`h4@{% zz&`XNMhmAhjXdXnPIeF4$8VjBGjHUKVN&rs18?E)PNfymz3T@~fa^7H;{BaibaXX> z=>~!6Ji^dsL!jXR7(51sWB-Ay$U1sWwTUytBsMEM7+4Ny9`UnUC^k+7etdWVl?PY2 zUTlfF*X4g5(iX$7lRyN z90X#ZxJ}MDih&M3ym)@Hj*%bOe^wbrL@Ai!VNe67WKjTv#wYQkxDvXMwB9}6efNC* zopTPx3I}*fLxWLy3Kq@T6$r+;9|3D6h8^u5Jm1(o7UVi7S^#C>H&Wy{z(5MnFR#a5 zcJb}HgGwf#i=+mEJ-|L*LA?k@E;D}#_>h4Z79n*kay{?dhcW8(0*p@}t0$I5f%-QH z#^Wm}LZJm{Rq%zR@o1^htiN>V9x4lZ(2ekwTg5&(o4f0zAK_>B6qHftVsa7Co3P_g zDBJ`fg>Ds;Wr=DB8!Z|myFOTqBt_3!EfVzqanD_hB1*!~a(ytt1Bqt38FWhr_=rv_ z7#z;w{;tLkQ9^#5NM0BKHt;d-tVEIDJ~BQYZ8@upP3MbuMKqFTjwy!t8iUmM=Y;M% zpnnix9FnEQIyIgm;?dDctp*=p)iQLQXK&y~XNsOB{CEsP@XP|0E0m^N`EN^VU9&dZA4#NB*z_BKJS7 z{VI$oV3gk-9mjb@+MWMKX9Y7 zs?%z0RGoJ~5t3O!1rh}=dk$Xt=HvOi$k5FJbl0ZUpW?}~|HZ6)-3&mP_Ww$KX=Npq z|7Urrc5naR#)I*n9EXC~%2pVyjHUQb8!Y~lb9@FWA#!#Xo&D3$kG#`U=U1@U|9|~a z5cU?`$s2P$bKEE_d(Eg(&b6XOIoFIDca!evvtZ2f zaK(|F_W1cJr)~~(B}#5?y*+u?-fSJMA4xC&*jwLiZM0#{=+r4T$JNM%HMukH^8Gp~ zY80&pDfX{rLd%W@PybUXB3NK0FBJl@bZoiUC(T8rg9fjSh^t%!N(L=Ya4AzHr z9sd@L&7a1Rp^-j1o9QcWX(WEI$f+1vN3V001RUSk-`j4zYo8o#9k%!PcK%3}opi$3 z*P7~JfJuMxR}Yi+;tv*T34hVnf;lO+sdJZIj<5N)P2+xQB0?M>l+}#1zoiJG z>ADoil$V>Jl}f)rmvUHwzVOD(7MxfBhHz)=@GtyfOhAybLC`e`S%t)S8j*I6d>C5+ z`l4`o1)4ru(4>&{dN{6`QGze%1y?@7GM|6KP)L}%0Am>8a9~c1#5be~yr_xE2b7!! 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 k&aNgBBo%(6-!!9kqQ+Vs& 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 z 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

G9i`F&9Xm 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 z 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%0AMN*os|wer`ReUni{1GIdb>+YGn5NRF$N#g6D_`T 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%0A8G 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�P4K z?F=<#yYRi>m*&_`>`$F}!q-_SiqT(F@BG@uQ=5ay80u7ldP_fK>MU2v4wc>cwWy5i z$bVy;|C_vxlARC}Wq&+u=F`8mKP`$WgVKMQ5lvlYL^79Q%vNMyp!}piX%}=#U*xj= zQQ(#1NaIV@B_i~%jCg-+Hq27@{&Zl8?dYcNXdlw^2vT0dxig|KE5G(BNFU~u@0znB z`_3MDp7iKFm;*7!>33|9p>N*6*!Nv!3(8ix%gfQt%Grw^{R;M?d}6b>9uZFY~=lEhSr<=a}@iN)Z^v-3hzsK#zR{@1xK5*JSV{1r%p#K6G{U27=dk< ziei4ZcbL(cwPM_1v<-YV&xXlgXZhSGbpRgy_YG$lg6+)AN{VM^3&FVL6AB)(r;yhe zrJd8!&V;=!Sw6)QC7Uaf1r_^}V-73Djk=nX(vAhz9Pan;Qb?S zEHUNz_nd*ILyzDcynQ)+(zB1;d2F6-79f3}&gVByK6-DD-7_x}aQf~Zq|-W&n>W1P z@TkHIPp@@sw6I@~Tx!Im&k1dp2H`(EOgl;V`FqXDH{!ed%${i+n-``0hB`aA^ZN11 z*2N8{RH^rXaOC5rZY27JmppZ4p=S8N>3HXr!ZRqiu5$37_PG6_7E@qeic>To^k zkU;r6P>;qNrOxZq9~+Hl)_wvl+MG`ThjOm*-i301b1>JG4aKJ~A1!^?rK0SZxV-b; z`9{F*5aq#I#lvI2DF>Zh#<|DmGd14du*eeBm7;#so{){P_`{=pOSW}6dG}qltt+>` zjv1GCzRMPsad~n?S-HB)yXN%T`A3&zsz#p2e^`Ned{CcdjX}G8eM_G0BHgZRDLs9% z+QXkdiETc*RJJ8DCtLH@YS7N^{fqOF`xE5>-FAXGH~Z_htzw<>YL1k0o|2xrZ@v}4 zT=gGD9q*~3zSh9Y8(z1J;reDzJ<4a`zDPljU2x!1dEZJ}_v;R>15Ni4exnQlzd7=m zn=uEkSNb>qcB7>KYO*C*U)00V^h&AbQA&sC)jym<9>uAH!sP=U8-oV*^iOr`&N=vB z*YkEqe@NFert4Yr{`EA(^-^DG;Bz<1Gm#HePwD?Jr=I_@F-+NlY~VfW*}`w~j;_c4 zjFd0B)QA-HnxW>9RfO=>Ql@ex=vTZa3{lEE`tGn1-BV~s?^&1-ec0>$DIxV;nHKxh zRPH6+N~i0rmRXb_eWahV4O@X*<00Au`$Jy5KtxG1NEaJee`e;SU2GETM~dF}~4&@a!27t#i@IW>j0C%;+4dhI^)&6=afu2TD3RMU?>j52-dDn1KQku)QG z?yaNmxtgQ)RuMq|9*dI>!1wewMecr_M?K3srCs1h(xfj79x}s@E*`%1xc!ad{l4{x zn_AjL8*b8X2I#_m`nkO8%BTFx@DgP1a z^B`Mt!(iA`V^o<>jZwZ?o_xMb`)1MWMB7_9@g3JXDSPkrd}8g5`W)~5*U2M`Xv<{y zIyrF{)=A~a>*LAiRDGZ9W*r~7RHcbaSqG_Oop(KH4@D>Yi07mnS7m3QCCoedM6|Cl z5qqOCVSr|ixcz`4&zln=yHxwCnV@K*6D7PCh)Q~#G`kt`TO!;XHmX1iL`heJW{H4~ zA1CQ}X~)nm2VFQIZTsRI&oGhquhWg(n;!Wz$BcP_9{*Dx>WRIpDh0fqL;um2<2zkZ z-ACX77zgxUtW(i`k;9<>j*!lmc7jj5-nVl2ylXC;p9PH_-V?eb+dRoGZH}zSV$TlS zJF{7S>nyAiy9*n|p2AMSZOAC%?e? z4*G1G#3M`9o}ltR{v7FNJ&!)YzBnN5FCKr=HNR@K{Jv1QSNa4lr%i?~rK?(=8;-EA z-l+D-X|&5mp2FUF2WW{WKXW%||IN}CqME1ItMiwCQ}g=CO4jjF%p-<7^<=&`s(2T& zzRlGl!t;kUtFG|1R*N#J6R_%esS^PHVLWYlHy6#%RuE4YuEshw1tEfuw9sSOG zld|0*grUz-#*~e+9BH3tQ+LsdY-h+Gww9YGnK3W}`eUdCMnfsX6)ko$OP7m-gO&spcW)ro9dP z){5-w_$LndQm$X*Zp<;zf5E+Bvy^LeZz!AXLLKi}*guwf7odH|lIBG}zCb*$bZnnw z-#-=HOI=7j_#8)7^Zw)Q!a<|>xuguoqE!MlxI{je973^mI(IL zS-d9>bFb>TihGvJZ+3<7W1U6Zd{*U(Y(LUO9X#XwtMjub5T?Fvsl5qIzPxjH>(=`$eG{to@v->Cc*o}=lrZfz@C>T&2e<%yKBtrKHCGc~&+KH_~;sh3*K@Z1OGF^Y&J@S{ z*A7ptdArj0w!ieJPk}F%c6Fq!d5Nd8e`21}Ut-wuwS+`@U+n`DAC@f6zCCycSZ!&0 zK}HnwbuRf_Q`GQ|x|C}k^xf<(X*;6kls?4S=m)J7GGZ-$yIjiCf<)Vo@05c?oH?L% z3XrCh|H(O&udF$V>E;}(=}*ove0+}kYqFq~UgJA$#-L0e=|0+*LHw`B{bq#mlx$ti zWt{J$|bti&1)TN2;$Om%_@o)~*#`Xb@86A9Xq4pR1%eaCr4+L!es4nZAH zzqiJabSv^H8%`%3_`1?fJ#Z!3BS@7ypF#kSXEaNc@@y5FA?3zQDNj=*RGZs?uj822}r3`yM$7a|T($0F$6w&@a#v!ifgQWdB zrTo+RH%J=FFKt#3|CTGeb?3jzIpA6grn4RoFBx2urOujk)}vgT+Kw1yfv_ffu^vn* z4}`K&uTxIZID$6DDgQGc?@|T``O)6^?GrQNmORtPIkg-0?usfIN1iQF9`BZk_0@Nr zO1Wfz@vcxp%4PHZQQMrD*q)cnXBw2<*OYzjN~TTDvj@|YpVj(PoJY4Nl$>S3gj#v; zU5H;0-;eA-+zA}NZAJ(`Kbka?bvmO~JYB5P`xeytez#lFAHI@qLzE-V491^T>zlZ~ zhBBT8_2FK{e||}=@4t7bxDDjd5x1G;N&Dv84AMYjD@@-%aK7PNtG$D=?7k`YsJN#y z&IIb%Y%`|f7e#(Q)%nGx&23Y#o=vDzhx#ra+M#HfpX&BrjyPxBh5U4x%kW!_Z}s@6 zZqrSBRk}|wKHhKC@1d>g9N_-A(lyE39X6*j40Ll;K4Z^s4vML%S}E^s_!npY!aTNu zpW*!7tNQ&mi35?QJ7iAniP%gz`*On$m0ztM zqp#}xKd$qqJ^eNKuf;f?tsX8RcQ}H((H!N`Th&n%z8CmRy;&` zwt*>)Cm`3l(ueKpg=Ks1U_h3&(AH03f zs>43#9+Pcl*=#q<-L2;NOx9QT)9dyQW15z3=VTiQ_@$m_ev z_Hn&9a|$@+iQTGC|C4ipaZ@Wh4z-7D-~N?6OBmpN1MS-!VgII@hi3$ad$8-_rk8(l<_$CCurZ)^)<5H z_2jz{ryclnY9hol7_@P=D2NMlD%*#))l(KPjr8P~(-C`WdY%dT{ltHB-Nt9i`FEaf zXPAAoTG1F{w=k!$znk;0uLI}V9l}4!6#upn_=NeTYi;Ue3arIvwaumPU_UG1v#T!U ztPAVVE$Nl>&SSkmn~?XUUyUuS59`7D&>ozwONe!Ok9u5c@5~7Qh1nPEYpnqI`sZ~W zz9i?IA;?pZHw`hr@nXmZ7WW`W=C&#O$}h174$?;g*B<5o&luj;b@-^WZsj=bkmFgy zaoQGa%1WLT|6KdDyGEHp+Md&M;g}ku6XgA-VBDl_q%JA*D2k;Wl!O@X;8EmzGHC&Q zrt_AT-Ji+*u%uQLP|jT8l@rqM5OMG}rUiZ4vCQ%@9AWF?(&sn!W7LWER&-q+r0)^@ z|6bSWqqu(VcVp7O8uiSd}(Ri3`=a{VQj$e|`FL-i?$F-i;gy z@@|CpAWE;|NRW3Sln3Em2xu~6W6Ac!X1RYXkqkVh`EwXp*vfJd@RO zd_g{QpXNCVX=Y`|GW$O+o38s54KDNfrTYH!KH4|kq0UDRFz?I~+Jdt;Ka04JTwu)X zQs)Oet3vP8Jh18P{+f+ZW7S^z9}ah{#rTu&5zmK=nT*4@9p@&*rgQsiOw5kWQ8E7L z%8m};m`dRB>-;IRFuk&4E%DOMnaOqs}Zr{F2n{j(d=%{Q21(zvLRc`COh&i_&AWI}Raj z3CjCJcevx)+Yp94-r6Dg9Pm}MJERRK(qOm9IVo|1$ugR!DVe`roTL9KCgFRD9)neV zOPh|;9`bs5=92w(--SHid1YOnRhMkXiCXe#twujLwU~2>MS<9T&G{A(_f*} ze^=29*>B2osCGjv1pP^QZ>~@5v8U}&_RQtEInSxFujaF^z@x-1^q&)LSz`Lho36gX z_NQiBQPh1Rbrl)5U)QN`s7`6(O@>j{b4SqjajjzwS1R2g!@q_$If&b&ttZ=u{ox*` zPC?LNtI^kMsvB#z3A6ZF%scdalzwvL*`4-X3@j1NV1C|tZerLO4dt&j|Fnei)yn7J zkR9U#innI?mpR9Dc#PqFml~C7-S+k6$X=BWm%Vyr9O#tm$uo`;o`>*Vw4 z(Z?ro{S?cyp$Y+>Q_Az;f2Ko+skAR2LE5g0ed_ETc{%nWv%d=Tk+{rf~% z#eex7EhqD)P6zt2Z$lr}AL>)7Y!nYjpYk6N*9nd5s(|Yr)wnJLTo+P(_UbSG7IB>; zzv9j>9v#x#V?IbTz%<&%N#BqU-Io{i183oX^M=8@hL=xO`0nNPu5Xp<9OC644B4DE zYAbrplhqi$Ty?q{!+Uw|lskSrgVH`6meQ9P)_m=0D*jI$*=HBcKB}#3?rDlTJ1v5~3^SY~f#zs~)L~CHnzWx7P`&|8|Bs*h8OKig6i;4dn9lts zo@?Fwk#1KM^%Xo%8l~M4+S=tlIZC*oJ_Pqq;tjO%hewwBtA?VJo_HU2j6325rdex|Z{< z%l}JrULVIy%DA8Pd)8IoN6k=Wy>zv{hobJs)DPJX(Ekn8U6nSmQP%kJdVDpnQ10*w zD7%H{Wu(1HH+5luqaO+Ed8os~N{$xK*kc3nA)arK`z$dB7w6^R;=CMOd@6RX0J({@QwcwN(izW0-@(f2zyA^@Enp ze3U(?gzu@7Md1C)20eH9sfZcTWjBpxZ>-O3sMdS#Rn8ovd_=oEzdq~a_@HfSwbsBR zj8(R&ji6d@)hmg+P{$^oA*benwhCEAOn286N#E-8tzc@N5xDDoYb@;*zcJ77_suhW zBls2`W(TZqX@iOQpQG#u{ulRM*pO?heH5HAL+`&YcB5Vw_b+XzYRdj*T#n!6VST`U zPNTo+hjvb{nb#As{Jo0r;yJ!=U&IQmt<2DtVjlj3b|OQ5e=PU2;d|?l?X@OsG1Mn; z&i-i^j&`M_Kl!VakJbW9(7%nZQ;nhj&SfjJIsS!B%FvP8!SGAYaS37h| z=cF0Ssc(!vnck)Bu+uL=d8)|rNnenrkoxzjB5B{c5&bh+%3~H;e&XA75$z+|ywi>x zYiuxSKNHWvy`gMB;*L3Dur-oP9@=_{xC(7) zLj5E!e5AnebN;6aj6ipEZj^1I%~;I+#?%}k*q%6T?d^OGE2;X@`>se%b=FSb(vCyJ z){oy=KZ`ohu3Z_P=`FIxlGjenHT-xEq95+YbAUEsgSBE}-&}Pj-90N=zCoS8PmBlU zK3CMO`lS~Aa!B{fZ&~IjZ9f@p?_?T|4RFOZ9NQ1LzO-M97oJ7Et>}vEzca0SJugzY z?Q?s0rambn_dVJm;asP^k=@uM@jU}t;*U2RG=hI?dz8CA`L6mf{~p$97_FO;v~H`& z_wfU zM_;qZX4#J%n^ut>U>``|rf5s*65cbL{+Xb|_N%tG@?KZ_6Y5xhc4H07?^e9riyvY6 zjy?ow1lnG1iP7HIEBZKX)|$Xx@7usjM2j8=;c4xcAi4| zUiVdbSBt$?zw5hd@*Xe#U@!2tzT-WsOYVD%PSW>CJfAt!!E4GNXVVs~KN^vC2Jx)? za3=Dlj1!;ZNk8rXtgf_T>BY23l$cAKcRYtr&bN5}J+>=sG0qs`P{v~&=pVW{X3gdK z6zNvV&2@#%GDTA_5_`4m7t+Zyk0Yp4b11t7cqc}Etb5MS(7$vzQY*s1t6P+;7u$2@ zzXI~+Z!g1@RBjuT$ESL%w7$~(PqCwVVvS3%0IW)~@YnJ=W2EI@X;rfJ4$zG;l& zn_lSdlk+QEs`?bXk|ku^^yH3ra>i?_&ZCKWNdCbTllZMA+>zy7!aY~uhrOXWlvyb4 za?=*YtX|CH&+^WFT%n#kXO74JnGYsl-R#P_0zpHF{pdqWwlvENk3)xFFz zwj*_wQQ3?#fT#TE8)GkJWhV_3QtvP|i|h3T#~;t{KRnO$f{FELBdwJ8rhKvDnZ(CY zw`x-?yxP$h=iP-W=lSy#-#2jYhvk=OPYC6;jXaLe&jyZgd{|G(38RiH@0z5%x1@Qa z$|n4prZarB36J_s*8OlZ|CQY9^Ch~j|Mg+(ih9P8ezD5)*S}NzuH?!7Em!s{wZy0% zI?s9jes!KR@GtLup7Y$R`aGvvo#zaE?SFTk^ZYE-wGrvB9Q{1!`SJ~~H>}F-S5utv zdFl?+7n1I~FOP8M_kO&gxv^xcp?JgTm7x3c6@GuQ=Wp@M&wan4&XuySDBSx>vC=Kf z9$+6h=So*EFsAWr$vIa_iRZ3&?6%qK1#MVOlX6VkjO+wcl%>UU_Y(&LKa|prR;uo~ zByGsF#uAi);D4-5-A4slRUQH4QJAVTBeX5M0JvB2RgJX!J?-kM#{AaEbD7mu=#zZ# zrqQGyICUER6v(|MDzqMA_JGv&*Zs71A>+91H#c0LYZa*A-`8AF2 z8+hJzue|rnO8q1y_nQ4G+$D7ZvOgZ(hBn6_p={Kmf0GraNLEOG zE=1gd{_9FtD4P(e3S~>%kbBHSSIF+LCeNg7QioLtyc1Aza%Rja zcjn^kK;Jx*^0=|Sg+t%n_p4mjTuWTnJ!1RyIrG10b5zRPWGR!iX+eJ^UAH~C8tZ0r zK_wm+7#^}a^M7F)a$|`@dr3Jb6#(}@y(s=AILp0UE8&c;^`2jlAU1VkNnnQmR zHOYJD8ulMnFiGfc5hB!c@4 zD~SIH{v-GwOPhLl9;^IOC+Uy+FZ+Z&tZ&_Qa(tX9xn*0tVKnUFo_E-2=;FBm_q}u@ zaKfYn?e9$i4}CxPJ@Q{ijfPI16;R%@zp){~J&ALSdU!~;i}r$%Zq2c8~Ro@B)gV^mJZL) z_APBlP@h2Im^bsN1Bh?C+9locW{B~R;QbilHD!Ohjpc7vcjVGe1^sO;^7&}P<6k*H z?^)PiFeFoyHJFc*E3K#e={sGRr{jgRDL(+Z;WvmgS?Wa&!yCqcwlgL7SJvSXvtbX% zld|oPnhjlY47Ja2^3Ph9Y6<0wNh6>Rc^p$dQ{Q#Zq^(`(xBtH3(DdZr8cm?{>0mzC z_s^GhT?=Tx+w`}{J-oqMQLwj+}6!;Woq_6Fx3Ary9 z7}>vSzVVMGMzA^Y*U8)dSVHA%i1*634SC6Y7Z}l2?A^@Q$+H!73GFlMJOc-IseW+X zum0cjOnhuGPsxXCd84&+s{Cz!Gr+lXV7l;cTF`0mjGaC^FxJPNG|ft1C?E6NPkADJ zhVeT0ks;lX>?Q7f#f<~+oX2}MLu8ijy5p{S)|k8JB_h}>V)#uVpMSU1-^;G%zRNv^ zcG~V*$aBN&_xLSPlTA_%q`BHG)iPYl4~o_|VmWgjO8VcJl@#E?g0%gNF^Trg9`s-R z4a#`)yZ@JFaPFy9bjOcVrWM2NN` zW`8osy9m4=#rK%|JD#iU?NVN}pj7iTh%=eIOuS%5mV69&7@7Y1@fC5V zXPEOH&(*AB-?w%>z&5VY^-O-<6L zYj2hI*Yc+#-BexfjpHrx!&4fK8v~|Hd*k?eevi4o#wd4uwC(dLtb2U2h;R&Z#;TU%^h2~0 z?94aS8p(th?!M<}%09C>A@}T#w^E;y=kEVZUPbEf`VHT7tfLgdXrEAre;whK`2Qz{ zr(`;w!&%>EI_}MJzu`Y8B4nOSN7^2HY*d}`Rqfd+_fzU#4}~dvwpBl6n!O{3?PS=V zk;At1sXLNJ+MPx{=A%BVK1lsi$SYmTyORX(PV&0c`KRx!=uo?zvQW+%)ZITy-M{x9 zbzk`&b#K&l|2tjxlNp{<_rbcc?yOsG-*&6M{VM7g7^Qw+evkSsevkUee&4=;{&z&_ z4ynIY^)ZG!<*;n+H%oAi?2-3s7SCSCC>eJ{-mx&Bql9}>Q})D9x+k0CcTcA7rYKf-K~iRWyW(9>Y>jK(UT0s^ zXH+G_&)lAAikHlYIyAAqBN9XO@H6Mr*E9LvVY;L04CPhyRjHDn8<@1=peR>sDf@!U zCQ1j_DEjgc_bTa|Yv~LN@e2;rS%xETqtC%gT=lx-ed-mX-)82;yQmiAk1#*-tW@^W zPrT7C?0lxDoITUiww2~9V%N>L{My!9^+u!xPUybw?A-H#6H*T==d5nZC}(xHs@K!! zg5K^$e$D!}2in@K;0;$;e&YEy&{0=kVbO<1#J^kwkglk$SQK1y7IhFh zve%s4=x?qx$K7y>5nC5F^Nxk4i`4X{HZWqrW`8Ew9kt7o)0XN=8);@GkCvw;){+>Jf3IC_U{%Y2+Ob@{G{tm;_0yQ$Mrs+sYQ$fw1-g zjkfLyC2GN+`8Q6W4Wkp&rJWCiZ<}EHo}Fb*8S0z+lbP_YyOgcy>EDQlZ(jZU(p~pp z&i%IIT;Ta|#|fUFlLly4yyp1Lz-ns?noZ#9iEw!=An%eY5xxG*D)0`UwQ8n&*B=ydSBq2T~j6+ zF?(Ne1`8N$qIw5z?pUW(4Nsq3h0*{1VVU#;$#SndPnC;3>m`mu22 zz#qr`)DzO@pB?JHx+ckUjOG&di4~RlC3V{^^j);4E)hlC^IM`FqNNyk0C=t?VwbOx ze&>?@ROjkMyF6cc=QXJVi*eZ{dAWBE>i5V__5KjwZ&T|DYyX{0T-vJ#znB)6-b!8) zYXf`FNfRZ#`{buaxHB9-%Dq^%nnO>n!#>tG@;%*?3n^!wlV8aw@&LBJ6I_7&9(C3o z*Y$O$g0>3pJahx?uwxBgw;&VcI=ta@BZ_s{M?7ze1#50Nhkf#7DdT>~He7--Go!R2 z@58nMc^yPLspIKhe{p3?&e(+ZFdpzQ`0=M6T zPu+=l{UhdgCg!7xv#Y)2a_kX1AGfzjoH4cob9KZt*ei6JA0kb(L(S>)F_#u0&iG;Y z1vuKFn{=B0LK?o0NBmQeuI7E>HzR(Pj(;ZNhn)DFvrN;mKvC)`$C6!T*TJE!gL1PwPO? zki5svVA4lk@0L6hJmS0s#LbS45c0Dl&nq$EI_z&6Z(Txt2QQjCT+;!MZ4Ih=5*k;7J}6wy?KL zp5&A^A82Or!1LUfrJpFxZ;%(kw?HfSjZNe?5*hM0k+m*<196I4qsja&*b8pKUcTj& ze)1b*H_b`JZpt%@QZojQ-coE%0Iv~{GGHZkAUR{;F!%P>iDsZ@#z227`3#Z7KL5Rb z@+1x~qW1r!?=gI59VHL4RgjMO?K+2<#6gg}qJoSLKdi!j}qWdwKS~ zj+_-qCjgP8F&iyLEiu8RKWVtMG0=}Xp1NUyMOz*b)(i9&Xf2z4 zbbxf1?w1Mg>X%b3SHC>*9QkZTiyogt+6s6_^1rFejB0<iOF7ke9mb8Z$J34#kbE@pOf3dO1$Q}rp ziie6Cr3uh=2WIbl31Rp1-nltyNFEYn^eV!q;QL<8(d@Gq?tH0Jj$_B6o6lG0JgaLA zSzpaJNtpzCI{-e)jBja`Er+iczv|aHM z%VJ&EtG#&&>iH__)6ROLkBVj4;hisW4A|!!1FXXc=NHETVXxx(O*wBB?)pA(>Yxp2 z;yO1EME!Zi2US&WEZMd^y5e|}e2_YSc;ba~BrW+)8}C2y{tWLwQODIO@cet_-FU|} zcwd{EE&XtHNPpT(8!V*x_WnBBzizO)FxNqoH&MrYKhJ6~=g_8&^x4F4e5>{EGpEMG zBC;B|lxvsklZNLaXRNyh*wv!&n%NRzFhU_9##)q-oL&_Jr=SaJbz-Isvee85A@61 zUsm-nN32I$)+14cdVFNOu17D*b?TC?OH{Ky%#(FW>pFx{FW#~BpdM?hIt~1{==zkr zM}0tRy}iJx&q(Jlod5UDG1R(7I-b8YWgjQ6G8OaTtLpA;`T)mY>6O@8*R|oO)N{pL zk^b|f-{p?A@+?yA!%LjAK7^fuuxs^s-ITuB9oM*J0azF6l%d>*FxMxbye!kPO!BNu z$8wNQfMqb9@VdCk0OquHNk5>-Y#XTqqF;&r^#PgY;Q0`quZv4tfU{q~^ADMxc_Mvu=-l*ioAkb}-!xbKN=B$(67j#y@<%vF&Y`6q z{}XAXZh0<#%3oZ1J7p3tf$q_Cj^qhsIVD!V>g&h9^6s(fCJI(&k zbV=hL2u+{)NN9RxdqGqGqoL_@Hx@h~%i%t@xggt5TITvOHT~c>fk{GBz;EW3eT!4J zymNAmpX6Open8(jQGS#-6Md9V`wvK4>5TvTrIm6WNQ*o=k(PZ;+m-K^c6?6SUf}8~ zq%FuDCpDjs{Y$RhNB#XDbHB6yNP}P>9q*Dc>_A`6ls?DMpXl3jdDg>zMBke1Q|H`= z{YiU`O0Og;?S;E+i?WVibm53sN5K(?TsY#*Asq4emvV5#J1!jYR?gggRpE%o9?ZcJ zuexx=A&n#6bm53s-8kYLIR*`t$mcHZc_Y*9Gx{BVko%!2#%x#T9LGBJ-Gfh-hkc0m zluo+M(HTdPj`tO{*ULMr@xS9)g{-HJ>n?}!P=>`cjL)+OQxv~2d<=iqIdsOm^WU%z zFLCs)oO_?W;f@ooH5+4}V$XidExX}9%fon9(>6nBYbrWjC^}?b2!zX$8!EZPO9 zJv1qU&|w*%#d_IJjQb5aYs75+h^6Q@(tqEZspNy(r0ziejlA30Y0%gB+4wJ^9t6(@ zk@vrFE>U)hc46{#dw5>h8ZgK4ys%Xy$0?a58#Mm5IQDb@vvo=Tu{tY4Ihk}s-pw-a zuhSMR=)>dE7cRnI1Rb?~)ke?*R`fpgZxr;}!RPBN>XMDmU`_T!=<_0zrSA$mk(@#s z-TaPxj)Cu~q7RHrT_U!9)fedx1Nq2*qeJ~y-i-f(--rp#%2voHIj7jB>73(}nCa zhyIlPeIFHrz6V@>9je%-zIFaVnYdSD&yr`;J?d>jUPO$NZQ_y7Qw6=EuCw!1_v;49UjQc6^_(E=~!{ zj9)5zQm#(Pk!_+JnG>$R#YfPW`^YHgR9auo(t6O3F8dH^59+kqX3ZZ4Z5%gc|M;)0 zch3F#M_fJ*K7sT{Kj7Jy_WksSH3(}QkyZunRdN0p<~h_Tar7C|qXRs5!oKsSbAG@* z$cc;RcQpO`rruk}BF%oDA$+iYnW4-1!zBn?HJrBl(~N$xo3f9b z*b{x1p3bQKL%C;N=D7$T@!V~wj~@Lw`$)?~^Syh+>-CLV$H-!Qo`vvCp%ZJ#UH`r% z2JNLB;l8Jz-*i3qJJ0Qs7s_bdp8MI?Q%yv?tHNnXPd$OPT z^SnXlNxAkzh%-*VGyGM&7wUKV)q4r=Mfx3lOZGXuNA-IiZ7ATqICYVfp%N7!z!{b* zv`Vlxqp5jTiH;kht_$Ki?_tX6<9$5-f9|xW;2|@QG8DS~q<_M|Ki{WaSIP>pUHvNT zCmRk9*ZbG}-mTcjg58rF+H@YYxf`bJ7(p(-P$fmi7Dh+Hv1vHcsgxGQ0}sX?h?$%{c z_l524o8K{zzKHv5g8fE2^YpQoM14%Y$CdrfLc62kCF+ane#zH;c&U;-Z+IE~@*49c zp59N|5Ah?lDjwh29(lfoXN>hU`ZQ7U^I6)UEIk^sc&91bdJNCN0Zg;$NXWR@k(*&Y zx?G!jBFLkH`Qf<@{0n8rCQG_=XR`dj5>wpwH8It`R-U1%xpt|s{JKS!PpvWV93e~c zjkKMaM*L>OEKkj{jMa3Ll?Z5IE+N1sawx%XwN$|8;k;M?caTo}l3?bF5(=fmnbYMeu+ka7gg1y;V4c|hAa-`GZ^pSN*PK14)Z zV^hkpVV|L2{sH|`j`yoMK3MZ%wdSR*h5-8F3g)NRxx`5rqehO;W;yopQH!yBz0oRo2_U<4K<6776ynhegGW7l<;w<}GgFfQNbO9GL zE%nyG--NrAoXY@ph4lKUVE8TLtSohox~>xw(O0y4SUA7IW^ty`f~8uAf{dDcv6mUks$# zSBf7K<+PEB_3dj`=jW#?{GrAJ@4V9$#}wYOZlV3|aQ*TlMfJ-~F+0sU_2T^c<(R)E zm^ntY5{jBlGKjNqbhQ+4Z)@J(Cz0@mf<$ETcJMme8*dw#cX| z-#P{5pN;azDtz0`Gr8!V)(5D+_X*ucd5&H#*Ocyy@3Fqo71?*Vrnt_I4bCOQ+N9%KlE2orhWR&bK)c3HH?S)e*^hVmE(Xkh#z&uuW;fsF4BB&4|q%c4cyvn zX?O9k>Wh<*SBsMm^Jtd)^T2VZZ#aKbly@axRMmJ&>MEm}z8|RHn3`o=ENx+f_NU!L zh9T}d{O+>XpL@SL8f~QSe}7+sFzgM--^!&EHSIE)X_?3H^wYHu(ck+Ko@*0lBt7Pv z99!~D*#mz;7-+ELkLAixU~axMbhh_M6X>H}&A;44nw|Fx4!^-ZISSs@6tjLp{U~|f z031cX2S=A0MnSfQ{+!DA9uJ%4-F{IHo{joR(Y zbHbV{tK|6!(q~s+X-GdjsUj;#x&rH-Bhkyg`WIjiiTFzRo+!3B`V%)b=4*HFi z)6LcM68Wjw(`!kaq8<^@KXt1Y_VfQz{73Qs75rn}O}`BP#^L$X{~pg@#dGD6`O`1K z^O6_mPya$6%4o`-s6J3M{mXr-JkYi$&cJ(}eg|!Pq6+Vq>37PH&c*vz^*d2ZMpUA`e7cidke3LTk{MU0n#y(|VvR~Pk=+leXzwSQO{dlqN$Ir1J(SH|F zP7Zyy7v$Xe=d#uSq|FtS)V#jo5nQ{{MpKOX!>Us=L*`i z+|?%fnX+D+KYh8L1OLD}>Gu31>#E!M4bC03>7Vet0_`7zvKvv)Rp}|`=XlLR!~=eP=RXy%a(}!lZ1|7P?s$&t zl=ppa%nyHTP|D1EwKBTrv&`5_Afc+LgY<`^UbbRsY1#v5|Ij#bx=N767m7-3U?1^Mo5_qry^tP0r`E=~@U^^mr}g4zDp|DQE6#eY4EtqRH$U>|D7Axs3? z0GZPsPUJS_4cvO&;4QR%F~xs^v?xD?>s0_yE*`%l?j=>nMy|&wkFeDP@AkTNe}Sbg zZ)=q-Dc;9eSv$lrc1i+dUN`vHsl*RbGi?#%k!4H+*|WoVzb?s)Z>KSd4Q~@k^cD)P zRg=jaLan47{AvXANT5ZpjfhwtU51$&#~0!m5RaC!ob4=StURGWoHJSf zklQw0sg5AC^apIcIFoE#y%9Kvw6!LN} zoD7`lXTOzp-yJTvPYAi=(uK|l+2a;dL9$RDZAz3&6*}i^M7tZEuAH%_>W^Bhza@^( zX)GJR6mh){iLZK0I=2lm@!VJ2_Pf74AX3GbgbLXcwW#z)zEdB6{`}tmOYF;QUe9+? zu@ve0qofmzRcIk=05&HRcqX?scJ5u{UGnDsE*)wpQ-8$#yN&IDn%SADYj*Z3v;W}G zk7RE^ha4U?f7JP6D`q0=jc#{WBc1g4K&jBWe6;U>r%)4{RBw~E%5I-Y6&3auAc90> z8@T6H(}%!oW}LGjF|)2m5|iG(p|U5>(Qh7GKsmJI8{XjD^{Qa53yZ5UZrHxZQU~)R z3LNMtCXT8~*_N9M^z=P>H5H#Lj39E)%^Ysvp8;hb2Gk6TjyWp5*MoXwn=b6SDUSn`0?FujaGja zQv>PMnA-UHBQ{MlLIHMq@Yyeolf!US<1HxnEqNovF%_7Y|+*_+58B5$MgmW~9*? zHKE+IGt02}l#9KvTB+H0WZiy6lGz1iOmN>%??iq}P>feWgmXs2Sw-kD5QN7hkhvh`V(rESF z!je?;68E=uCI9R@gSwmCyu~=~l03SyVqkOku-4QD1R}-?qshq zsVF0VtA&EJpAP=x*V*zNUf+a1wW+cw*r?Q*&>fI<06=-Msw=YrypO26ax%`9OoPiN=p^q7+1>r zCk6p^tl^zeAWze!b!nNWr~Vv}HbWcrz14^(H%F8uNhuo28E(L$y1%O+I&UNHOrq6x z{P#t?iBz}hGV!3F!^LhmrC5wbYJdU*EvL(nQZ8-T1h~}L(DIiNvAqTBHxSq&(yEJ$ z|CU#E_V>&g$`1?OahC2WE506v>ayWeqvFR7lhczW(`Ez@r?L_fMtCEblKb1{{f?;x zWy{mN>q;z^d<~p7s+FP+nWF6=p2TnI;H{}14&u~$M1IJ&!oLVctnBgCFGMV&5^qVL z3(85dq7@{AKlg-ow^gkrZ;Wgq2JQ&a1zP1BfroPt)OY{%V@yO@mfcmLg^|{R#C}JKi={7cktp}+v)0p z?CLZSe`Z5~EY`3}XoPz?o1nZVRvC!&w0?Xq z6sU@FoJ)ukBl0gu7PzN|)a)0p&bS*}z|QaD>FBi$t3~bOwH(BlM*4lrQJ?=#N*s36 z*gX$!d;dBziD%y^-PztCmp5Nqc$+*?;;a*Qu5;~kw9OtNaI35K^$A1m`PRQNp`$?h zc@!g)>XF5_idH=?O!IflJ_xBxYi#hMaxXqDS!%c0S=~RRjhUgZ_|RE0i8`K)t+pz} ztjW>Ev0A#*o=bY66Xu{7*(ghk|J4=M^`thM@5>5Yr2p=x{Qg_-3RUW(zk)DFhp*WiFm_#xVqiT4mH4I1d zT}0s9dqL4oDhI`zfoa5qJZ^HvM4H+0c448_a>Jfk@#gA(H?4rMfwe+3l1H;ABRuY? zf2bEb9Z*ifA@xL-&ojUWyjF8}H{r9~naflu55)lE$@^P2&f%syyq-jxmj4~oFh^Ey zG~SeEo4dUYER~I%iu3DrR&Q}Hda0Wy@ex1B?}AeZKFCLke0ku94gKUpw9;2Aq=$P~ zn}+K&T?r}`8jS414y|;rz+KF4jnCf|n|PJtBuT94Q+5|=%u>x^ULGuAXwO~g ztIG*c;$9O`^e0bzbSMqqSe)E2fE(8D4WDhFP^(3y2FDzW-I{*&TBMiwi)-WaG^5B= zpH6OQb#+WIMOQ#ZZ8651Fi~&DWGyq7OTPEgqoT{S;tQO4qf*1HLX>>ve&Mu6(me~0 z4of@3lwI9q>Ww{6Jz9iu;%DBaa~N=)%m|}2#uA@*Yb-L9{Jn8IqIk#x!yh%3gSOX3 z;Qmnj5Hdzmyn0UewzXRJ9FfE+ABjWOZTX>(7>6@R9@33$JyottG{;v~ImL9&@(!Bh zmuT)i6fsG}+|p=&MzoDlR!%GMtVxTOgTJHV5MOI*AZKASM*YWW`X_Vy(QYGrwg}nF zQfORat^~NMb5ZqB=7cL%*~)BtAPt$;wz_BVhV6K>cwG5ycakB&^>3ARrGY{H?rynVj3@HZM846W?s-mDpn?63yduq&8QP6F^f zLr8U>b2#f)Tiry6K_TNp&`rCD4S#_b0lE+8TT@?1k3Uvh2#u!+wic{b34x~5OySiM zq{FPL@JPndm?ak$axrbY3SIvU?ZR0pwAS`_EVU?JchfPX6j7|Ss&JijO|We;=j2bD zjw)EfO9+-$B%l*)E>w5%pwTxO$_|1p8~RJ{4&I%H3yqFFJD8M@rT=Vb{H6QGj7st_ z-8bOfy#+6h5l7!vUNu?&W~uOczK%sAb!-^Z`4}r*=U|Uqi6&K7QBwS z*cyBa`g&&6I&W4^fox7tFUZJrApJ$hr-?g_JXqL#Enlcm{Wc-W47Ye|PGE9pvjc-_hl{Wj8WhWkkZ zZJWl61a^_npL~g=7LCiUU%GXP5fLoB9?!Wa9j&$c!ptS7DjXTI0@F;;yvoif=dvVl z@7tgJ&s}kAZPTW)dFD}Q>#kSTA}2)-Z-8sOPqV|v1!%^5Kc{>%+c~+5G^>s#K0OTO zY%bjCoughuVi&0VNSOjy{*73f)9+El;Q{6cr z6xu2FHFg`k1~Z+?hFT(|#fNLWkT@ftx^QA1Hmq>))5>b4B~4hlYx6n30uskPde9EFv9cq6Y!W(fae61gSltll1%#5(2^ zruP2_&R}HyPf+_rm=ANTP9#-!ac%oE$5u3>Y@_L~HS_W8+wlaXP!fl9*4v)69Koam zYPYGTB{3tmWRL8h-OMX0Xz8;T(Q)aN+&;3no!Np(c;PMVKkrPlf06g9I3?uUg-&mRY3`+H%AwlCuu+XA%YcaH28GF%!~jhp zKeBi>N7Dvg;Vc1cYK~jMA_)>Mv@z;;iUM1oZk)(7p&zQ>vl=fG7ilB)HbUzgw%JeW z!wwKM4PXj9ROtrGv;^)Qc>RBGUcB;Qp?fsb^=1o9m~ZUj&X4mER%4dxFYPnqwu?Zv zFz32Ig`SgYMOhpM16L5Jqp~kL$-yt0hp=an7$>@#Ek|${H46U@1VBnr6hcxU>uLzH zQ{gU*Ugz10PyaSx)L|XmOhoW5Ul7m`wo8%-^a9o;1sB|@JV|`yzNk>&tpA^jgbKV+ z-J$%^KD<{I{^*MP#He?aW}jA%z6FMkO@Gv*;_5oBp^&i4pFy>6Si^#KDXXZ}ZH18S z$Cq;+!ybcqs`hGF5as^w*`+R%%8}ZZ=UaChayk94;lfk}}6fb9H?$*ZDz+`25hWA&pga+7Gbvc4aG|P4zCs3uLQ645+|5_ zm$Bl^QY2d`zfD^bO$$@nGqji#pr|b6yGbI^Od5J+y316-*E)}M|NnAZHO$4ow&CQ9 z{?zBz0%Sk8Uc?)3Qm$Fj#}%b6Hee|I;7_1Ihp&rJMJnYEl*E ztZ|}Ad2e}Ed5>=mNjrB65rZ==M&Q_R6CV{DW=?jW@KLn1?Sl%Jz7}edEABj9SovzF z{J66=)z;pm?pB8anReI3J&XQb(!`YRJ{@wG+^-=r?VcMu?@tuHz$dCXQR>XyqS&}3#W_YveK^6Ligo4+9@ zcFB1sR9$8d-JijtLM{k?GRJ|&@;V@a`ufzgEJOU{ z-m_mF4t(OC3fUg9_u+Lzd&$+cjs!;1LW9Eib%GS3^memTt&12pG>c%d6cz5`0~A1D zjcm0Ad%cWgXRjdnTDnHI8%m~+BLUAF(qYL$x4ox5UtkfAK&n-<3(0{x^s%X5y`l9c zSQha+1%vtBblBfwFUQVcmJ`J;3L4s-?`)x74Z&`sSQ)jqPmBcs;<7zWcUm!H-lGWu z_cr&!}S;&_M_m)ssGnfKT4gc%jI z`oo;Yks-7tjFt>Jt9(MX!vKQfh|oO1m&bxnQ}naNhf8r#!@{?7yz7qVn|D#c#?;R< zt%{JM+^o~)sG8GJo)9*I_11+oQM)0&pa-R!9JUhsy*j|3hV%s@VoQU&t45G)Rb}kX zLAEnCuStW+s8J=)2Vp;`>QE)IjzEHnLvOOOk_(*vHYG5%&#?QSue_ma`2Ov;sYA)9 z%k9vQyK3)31T{~?h$4`mPeGTCo(ZGR5i3W$^Aw<`DBqIYSll*Z%*`eCjZ+R$DcM{X z__H0ob&9U~UC|J*dB2WfRv;9GicL9?G_ScCToPwiKjT+;Hg}`qchj}1L>+Uo%%HRJ z6C2NJ1ddqe_fYojMPra`*$@OJgpa0kuwBJcBSC7?-re9oJ%Knz+(5z{w?wpM1 z8K#YLl55TK$EJ#-PFsZ&cE3}8HJb;A1-9eeIk#C~%sLtf##8LN;zlv!ZXH+Pg?Dgu z0oH9-rUNG+N+%K(T|8R=1y@`D8V8?bVy9<{62JfEQez@?Jjyq;c)1KYmVaWgVjc<& zWk>vV7BWA{5-SwQ#4yLsW%tysL555JF*3Z?yW6rhPTu;Bgn`_dvICUxnO?^(P}bS~ z)1lS-J*H*og;ih|eK2_6JDx?j%VCQzp2R$Xl>6PRVHw&Rvh^4}QtHbHJ>m#vxD6lu z9#mzZ0W)+T+(vS5UK4A4*!Z1mJ~Hzf7>1)8TQ@RmG0cB&t@>-+x9q-iZokFI$S2tU z2qL|gP8%bx6Vt1Y`4&C~2|Z>kNIk{3?@PTf6>9x7v$zL6X4%^ks8X5aQX1c~fbM1c z3#WI{!u^M$Yk3o>S0*Gq12d2Pt2TbO#n-pS4<}qBOAX%;y=!g%VwTC0AFQcGPS_|D z{xskGEpFq&d^^W;r zY?khvyw@H<018R!s1=D7)gm1WcL2286f9G2qgg)i;DDJ!jrJZme z&Nas)liTpA=gLdHSC4@>-I&F(-lN(a2b>@SL zyTl(b(XjpG+0MePu2U_4Z#_H^PPs-xCv6dJdDcQ&Aw^a@`&tUCjJZ>+ig)~3RjT4S9~^ekuZc^AyP|WTvi}|=j&4^?l4|@Bvt#jlRUtRw_Ywcbx87jCwc0(=^ES!VS zKjm95Ir`b~$$Qw8!(YYrDElF@;ip4J#*EJgbzhi=fLdoW)ZX%|p~dogCfaUBFxvo^ z(ZvK24fh^cI4zGGy1G7N4!dyZkL&s=6p29aj8Cy;(y2{u*QYViwOQ{<)0w>& zGDK;H$MNMz0Jk>gJ*M8djHRf;T9L&Tk#gsSHxi7Yu@_L`-Qal!HLqycC>e!(L95iE z3!K6HtK>{)jeZiOmpM{0c996inONM{q7tmQrGm1-+dCd_W_O27kI%dfmx3HUvDfsU zkJam$EVSx54NW!r#CZOc)h}w$cRNkyxjwC)y&!kiY;%v!@?7uqlDI-y^U%$n6km$^ zb3u)4&13=dq_zCMB|5WI1cUtf_`DY$|Hf_fz}?YaEihpEU*PzvCA1EZOIdITnHaj_ zcqGXOJ*md1r;~vr1Itg+E`_M?gk#j*$(x3veN7;BRURmm8L!|KY|LORevZ=^!(;Nf z5VtQ`9!i<5GP?4b9Cp0mwIOD=SmNq-hYxE)R7u(RoZaJ&Vhuu*U7^EoPDL-o+e9d<0wwik#q2 zsnLm(c1$V1*4IC`UCG7l*DjUWtueA?qOd-COKC;uwBUM##I@tQy++89NXxWVg2m61 z`)>x7lMNziCx~Eic;eFhj`(YssH5G`7Hy$| zCglOt7wdZ0{kmN;a+WB7N(|cppDiOEz(lDIA#Rpw-8D35lf#Yjck=rb$Bbls?~JiPM~5PUp8_htiax&LShPX}(*q zmY3$qDvz;Z&4fcCejPbmz}L0m7Y?_)VXKHdk>?IRz=dU&WsX7VG0%0S0!E(41Em`PPG*gpB;=?6KZ2m-bB} zPUV62;2xi$kl21rIi90rro7EN)OF2^BptEUzxr={0?zFxnH@vV8p$rnTn1{men^4) zuRltE(7pI6_P>=c4%v%}?H0e2%C1^HzmJ$H&FtW;C|N?7kI#y?!*(YN_EuTP_+7I` zv`YoFgQw3E!Ws+0P#2L8{(wu=zGA==GMiMKfUtbW4dwtd4;~W#@wXaX#rJ#P)tt>{ z`GWDLQ4;IZJI29s>~gsq+6o_}C1-;_X&*lwjyNpzhOc{gr5;<_LJLYCV~a9p_O5!4 zVe9UZy7_F_)S(p;nj--#E}njHO@S#4v!e3xMMW{1h$L;^M!c_iYwA9EJJdM%<{v3v zqOHPf^37#!3)>DrU;>3bAr@9ms$d(c@xE4VqA52Wgh{@rw9Xb^m7=D{FH~a}Z?-&m zc$-mLsYM-2OLQG&IShy9@{_V#k7pz5{mqmkhSt{+kyc>47vSS_h>2;AgVHI1`&}w% zfL*HxJ{WipRvq}|`)5L`&W;J=D)*3cK=F&b}2TwdIX^_~Q{a*0q^>49R_1YdbFPV(1 z(Lb|F?JBn9(c)BT`K6GK(lBSc_x?51vPPMB+J(TKlLuY#o>6%^7^MW7F+D3OMk;B zMe469plSc}KOXVN;cjRv^eA+|Q|}p#5K!g6bVtDk3dI=VwdPFqmzA&9 zlVDT03vZ$wo1HKj5s-BnO1NnE*}iyZ*?l|b z?2z7%q3|qpie_1KXKuyQ{1=x$;ie(yv5utP&1terWv+ z%F){4oCVe*K!;x4l~=v8!DfvInsXZpd~LOeu@nH)6GmtQ>8{*bA$U5G(kRhR3Zg7g z%F+|a6yT@ zJb6OG_b*+xT1}8_Gk~fL58~%hgRF@e&Z!&@*SkoOY4_4V0uU}@_7#xBlfX`|sncg4~Pw1X~u z{Iue#^0SPib^#JyLQLm5YS+d^s0#5Wb3gHg#MQ+g78aDiz02GDTlN3;9@}xR({`@i zt)EHlLOjaW;&S*9{H%b>8+!xn_sP9zCL@$A5B2ct_?rpO&G`+Q-b6pTaVy694F!gMsaEa8L4Nm3pauC_9*(sFWj`^A3O zq2tQPtI*7+mqi~;yjwf;Q+wK~zSWZTN+7?lmPeC~^e=yd9h1GUw=Qfm9jc28$8t~S zNM)=-1Tz0omSP@4`!Wc(y1$t{{^p-1@F~yxEP~-nUeu*4bqCcXU%_)iK5IUOURS-} z1MMPtpQm<2QoRf9-U%1o+z9FU2QO0^YdMgf?rDkOm^pJi^1k^Spu}t5m>dOY6i#z$ z@VY_68Wi@F1?jCz{NPM9AD?=L7kSMZ`ug;!TR(U$z+J|Myb<2+ZL2WjycI5-Zvfu&j*z;`68`Et$-wCRsJ!MIsS3 zBpfgqh%$!XaX$&pvD#MN)U7gy#nqThUe?rY#2)?AVy=4fj>bj#b;Y-|m5R&hHmHSE z{B$r3y}TZouS4B+*N z*&Vz2$3OjER|a^tkviL@7Ts9=<{;0N1mfJwkAlA6NGDy!WZ$&&S;#gWl#3UVj2Oo$ z$|N>h6HLT{a$uN;FO!tD`Rir9{y}Y_&ZwV`UsEh`bF4t4v&Q1zaXb3W=Y&o*urq&< z`pw&$af-|$H#l6|-MK^CDxB4p?S2BI>mDA_2u~@-vvL0` zc}{#H%FtS=Z?>LpheT4p)N+a<{7o#u+H5F;v(C^j8rvvzr^ed#h3mt@9%rc(KZqr8 z@$yaNb?z!X^ifWBSvQAOxQ@dG2b!@sL5>WV;8gxlWrDwveI)cxB$J*H@PpC+hO?uDQ17*(TqdJRrHb2wlb7RUpAV-= zWGy!8wAI`COBw?q!!^b>@IQi3&A0N{Z>L)ClQKYGbP@!abJPT zQ{I-72MJfN8T8=Y( z4}BuMe5uM-e*EDjS_n5Rg{m+A?v53w9s=-k+AJs1=wzfY?Cw{rx)#YiTgfT({d`)GD-+i zcJ}-FsA20~+{fMcJMAbidEZW&s6h(Tb0O#& z*V*n4025q|V#ueHqM$z@+!w`l8t4T7f>F|-6vCHCxiurg zV52!1mS~NEOX$Ac3C%`yK*(doliSa&RwB#p_l=+SLgPoa8(qDcht#4J!$=yIyO$15 zVFN|-ZlPamo@avZ<(n?gIwVoY1R9B}!gdPodi;$8$L+r#=yHpkYPZnkF@JZE`JXWW z@UHZO!7!o?_9llM_rRCEOJp}s|A)yZF9xg|bNel++1*XE1%3AS+&;^BU^UkGDcpxv z&B+ikSB$7k%3j%LijtW+_N(Z)b~o2bH*)ky&mYB}?ZC1J=Q=VeYya8LVJy@Y2@lV^ zxSjpS@om;s-P^@If(Y-2e`fe(0h4@~AJk7i!vh}{%DsH|x{4iRe0kIOa1cnXD`MLC zF@NT@c&$$%c#}H%RebnWNi?Ezu=*biXINN7rrF%|H`D+wm5(pic@_MBy#c(311u{y!Bt z7P!|O#gekb;6^aNlm&VxW0q&kGI2sIo(&~oupjkZLmTY> z;Ee1+aU%u}O)j>+IU|B~)K!d2<`jiZwQ$!<%VJt!%ys=Ajz6Fl&ri92iud=b+PjhE~D3_A&iVfAz9N zZc#C+Z7ew2{bUQ~HsSQ|BK$iBD{l&0$caydf%<)!m>LPkuyH!0*B@K|fr0zD{UqU5 zX0s>i466BIr8Up2G~1&Pz|&jIUy9(78D#ys#QS;0$#hm0k4~yWmx#6kT4cKwel)%g z7VuCnbJp0?(YjENO(TR4yzm2&cD)=^R6r74Y}I3jo7**d;D%$V!tBo1qB1CEKPLi2 z5GUpq(FCt)^u9J+qfX`_H#|Lb17^d;Aen_2_3RVfvx1a)8DukBl34p?3`jpRiTNF( zHDSa{Ie`^e2eqeEfI{!O1*KOub? z5p`Beh5bWBg~*T%15x_Gwv+p(5+D}f5uxM<`;79u?{?EjLIJ?#DvDW+vL+_f>b-ug zn<@j(5k`Xzr5?mPpf6sVCg%}cP<$km3lXPLELoExp(0h)j^7@TBufl(qqWcWx2!Pd zp{=>IPxTZnsaEQqW~<=x#FmsDL#c5rJ$+h2zeSnK>R8x<%KuyBq zzIobz!zbQHwNBsj4l|btRvD}e%B5ZJtrG@%_pL-fqj`CLVA%5=(Rrq~+Iadl+k{fk z?YAz`j2mj2Gm-mWSLWNrG_(HA&wq@G;84@d3S<*By|(i-?oCxDUzf=EuPJQ}#4)Lc+!P@HW z@~UY7ypR zqZXuXTRIJ#U&Yo2wU~~aPZwYC-%78_u84M6np$gpxf3+_OdGFbPKm=j5WU({NnhUS z|52KveR_BCBy@gr-U^5F@XFn{!=+2V01fnSNVhrZ4CT0AWP)8 z!*Uo9MhNo6?)!cI14)4LuNXaqq2Tsp2q@*&{xSQod_1c`$z}lB9O%~Tu%;g;y%AND z;6pL42B)RQp7rz>-T>`{SfI`2x1MMHf#*`5F#+?EZ6{OUEB8QOuEgvhnHE)tI`+J~ zqbxolvx4=C-B_>f=(PpiF1PG-vFGsU_?3t&!2V`Bb1*0ZO|lu?6Nsr{87l8wGqoKq z-)*ed>1jYcwk9cWmlS``XiF2J=l<>gJ3_dF>TJAvfvu}-BCDUHjzclV`YNDjhY-O^}U7$iyil@V2gKH+T zq#w?0d303bHxaK@cAoH~S#P%bfC&Dd|HM1=Nv07hM#Y7#Suay?)2PIOa?jmm`iZ}@ zcmD5pkyC;4;bkAq;xg1ctfeUNug3WGhYz)UWCjCaVX= zvv0CvldE}lF)HnfZ-5&^36wf==YHBu%g#5GMR#FY1NuZSucKmqf}D+B23y@C$!p_H6JeV_UeO?8Awm5QQFV7WS!w~J zVAmaT8eMgD`YYqNo0~I^2fa5_Z3R^8d8rk3#!fH*>6)$V^+Pp8_`3u+-W1TPBK{U~A72cJ9*YsbD_jn)jV7aLc5H7lRj}QwUeyg8J zjD4@uwkCJZOSbE}$~LmF-}`VJb*G)}fVz zuul$~cm*ogeZ;TRuTM?m5!b1F>@`A-xefyeN4;R%Q$Q;{xeK$ZgVGmqxqclMJHoB$ z6b%w@(|U^$A@j<2%uvb$!QN{xUMA_7hCrf@X&Ghy%L~JAHeA|nm_NDV!{XgD#dq6h?F5&u&#yKl-x#6>M+ZK zd+Prxn0sFh+J^hUqQt;FyW&oO+0@9E{g}TRvz1QY+pPe{z0l} zDZ}Hf+wxYv>r{rJhRhcC^5M~Jl^`*|f)aNz+2oo0DMoLNX4CV;fFQ}<6IN~fZ~rN4 z?8c*BxSkp$(vh&|lZ=dpd>61Jr6 zEv>nctW#`$Vf#t19rz-ld!C35VnZVHH5kfsA?;UcqWdPDqT@CDzl*2|W$oSL7O*x| ze>(EHu)+P`ih57!QFMz9Qsg-@?$1}xph)o3K)?SS*hmiK&WRNsa1(AP4}HSY#iTe` zCoT@2)#oiax2)zCQSKS3!fSvceM<)0NM2r^V&%Rv6kRv;H0@u3I9RaqZ0f(!`Hc`e zPyFKjgt~KgH1zU%R+db=-zfR!AhT$g^0zZ#F4&LDFSi(nb?YMp>shuGgO#~Xmim5$ z3`F@QTDJxzK9G-r#{`0MmT;3yGeuuxGkN`&23Pb6LJE5z54P!Dk)E6;`^QJso#%#+ z0#iRWiq@04#JFP-^CJVZJ0x@HE~!>j)QQ!>s7{WEN^~s35(V;=TtA5CXexNM0RCyE zfcu)*H3m7#jgEx_$}7QzA_2*NA{KRL;p@Jgxye2Nd~1UMetETNOQ_B@y>uaK6y7zexVom%l)m2%$wzPap}dIGTD zouChsW_mJSpq8B&caJidZIn2gT8igUV$OmGf6QJx8yc_y|1x}@=CxhN+57S`<95W_ ze+F%hswwGd>We zOH6)QtF!Y0P88y3C@==B^$J)U{&lpC+Knu4OWW%Y>fZGmy;^fc;?YaVIM~lpX2HZ= zvoj?$vnrt+v#VC1#eIc2I& zr1l2i$z$B#IQ0OMm`Vi_0GWJ{JrXx$ShG`U%4d!?(+9rM-IZZ?@e}q{S;(SBv#YxMy=7OcmL8P5np;ZRxnH_Rw|}M^ zDjDQk`r;X93pDZ&;oyA49kmD->1}?@kN#a1(!Sh&pq04na9^-X1&Gw_`g%xp%jaCl zYN`DXd34A*r*gTu{4lPq^m=p7Gv^}$)ZT#c_-}tegk!SgKtMU#*ZD!wj8o{Bl(4%H z!}@3I2uCwxD`ndR0?X|DGO(2qcX)ao2w?CuXKv#b221{)kB~J5`mau%OlBhcqqL8K1~tVb2GAoRI%eZx0?BZC<+~MBcqVQRowhNe0C` z=V?~VrpOsew(O*{g&@*=8Ee8tZvigy(Z6$WqOR?px>lntmr8G1vk&I7OF8h@AB=YX zgK$9N-Q^Z%xRgZa)i&qiZ0;L6q#aFe3^d>KFkP~3AU`|4|Lf+4S#{p5w=S4U&_;+N zycN6r@yTIb2(T}L)Jh+0_ zuaW@%NR?K&Xt!VY{;;aLb?@@93B3KHnUj=REkj~{&uK=?qQ5$hY<918+%GTAiO~zD zi!nHw*kksi+q8<8?=4 z+87<`v*5&dOhcuee(H5A!RZ~=g9QqgEB@uHXr4B|8TIz;7EOO%g(sbgc6!?M>vkaP zkYRuAeWU*t=h_7~Xs zIaVR*P6ONiRfS33&eT5P)5|9{3hXZ$JQBzmrM%xj@3}oY!jt1_V3A+c#7b4ZL@v}F zZZ7u$TPi2Tu*V}38mI#4h$}ZFTd4U0W<_tq$-%-=3;p|80fS^!+Wx%$>*&g^+g{fc z>l>N1XLin(e}kKEOItJ$2tEE=*L+0a_t}~570BaJZoXGh+J*NzWm(6!Mh5U$MCd91 zbQo}H{GLFB|A`_Q|Bm?RX$qHO%d}w!u|~ha_V1OK0bBNl_1*EKCVwJ>18;wfP2l3m-UK2wgfY#}ff}b{M9W*RVp% z&~=4j%+AS~s{$-ep@P!?srmKJ-=ubf-xqt^RqDL-zIOmjkDtaXy^Z9ESK`|mJ#OCw zPSJ(ME0c>rDQ1m^^`HLuLoC6+nN&F$lQOqz=8n1oQ;xS;2Rdpq@%J>C@B%@cIkCcX zKUT%mZ+7HeT$Pbgk`Sjpsu`LBD&dh5{QwUmXKqQsz-vLgXQW09Znu7r?TVb^&R-c> zz1sLk5;qgA{(YT5f2VA+_HaIl|EA`494x{zL4AD7OCNO0YiYI{qu<6B1a76>P-5Id zw!?2sff7FnRi54YaHvwwR>xK#%wjWx=vF>XS|QrPPAZV#_0w45hu@;qT9KUZ<^+&| zfH~fvnj4dx@3s2>8OCo80}J?xaQ_a4)RHM-f*N#w#>lQ3@inW+jd>lWweEj$`mM;a z{S&ItQ%ZP+bUhuIV;fV#NT5CAdwu-dv_z#Qd?R5e=#w8=z9E^YXA{KDW!Q6|+i>*4 zNp9j+=4zEf)NxtyQ%2>};m0o11&>D67N_`n22(!%)lU)V2pLjGH}z}78=;@t&PG7z zab|Tx@te)b;fV7t;H$y?pDXGr;OZN2A`EJ`NxZ@*;VsqDckv}aM zWK27R8%@3H6?`M}lRObTRTy`J`Z=EFeCCoE&q|e~W`Ds^?VwedFZ75L0~^Xu3hd#_ zO@aM8WD8N4QA5%ME`PS) zmr>H>%WgT<=^y0Fqf;{-hOF+?^hTQBO5<9P&xwNewLof2o0d^jC8X#c zx!}ybV+ftJzj3R3M<%4a!K`z`2kd}XD~$#hAt|CX;)`tF+)dVvP7KM$W7yU4L%=uX zPf~3|Nzab~*)Su%6eD+s)qx1A%-4YI6b;fJ=v2?JZ3TK~!LM!qLZ78Bne9y2?5 zqT4%s8SwyJ?3ybS!Cdamm?9WN+^4Ih_jkk8yG zv`w{HOU^8%dZds$;q4LaK~Aeo{i2ZnA_dWoMH)xPh9yel>>EUI(oX3I*| zj8L?Zf|u9e#_#0+c`Ht9ZZOaIBb``K7ZLtk)4pKm=Bgm&GD})5S5dPDy5$qUB$WS1>Jy{%Vf5#Eh`D=l*lCl~01yB9m z38w0%+12G|X7_Z?Ot1$;XHl49zT3hGTCI}#mUURjYMn=7&3w?pcv@#`K{=Z>J7g!s zk?6wnAmLDsjlFc-_)_3U9xgp(Fpf0M3htMQ^D6B`HMsl~kNWc43g!PWvi0dK%m$o1 zpAxIW;{B&Q+brZEO8XZ}LJu!?D+Ga71MVbh?3K z)}>Fza+}$lca(w}k3+IoMSmxOl9c?mBP{Ys^Rrsq%=35K;crejOw`mf>`gKY)SYTn z(v@4pbOf{X?1Q#9Er_*In05XyV1$?X;fB0_%WFUNP%wgToa-ei?LoImw< z1}i<3`mJo@FN&kKWqR&&(*<~3a74|uweyf`rmtsW-HiFi2~90}7^;ris{|2Zk;4_{ z>&7}uT2N}^Q_ac#E+0u}?7yVM7mZ$Tkz#k30q2D^eg>Q_zmdn5k1f;0IQ79kscW!c zVxh11*%&7Qe7dAZ7W|gLA0k(hzt@fBb+-%IB|(zB^7g(EDafG}YC*D;VF;6Du?31& zawki8N-=Volzp{>axvkmmWcL43AgMt(%0`=gK9n-<@L8xWpfT5Cg*DZ40~vAd?{!t zUOqi!%i!6_d3rikb|TMdzW!LYgW2H=XM}C0%v#VoD4+3j=JDuC{=Y5HAucP2xmW$V zIRA6!(X$bp`_)C{M+U~ASBHXlIH=BWj}89$UXAxGvi2#y9Z?LBUcQStwU#+|=!pAk zn=&Np+2=xOc1zrOmfr8PNi}qMZm2`Ik$nImsyrFf_43(O_Dh~DbCwVh^^zE%URpwu z6L^mKUQA2cTo4cYN3~}Hq&9J2I&oJ2ZeJ5+-v3x4?Di_&@T0~`@c(-4=55Mqh&MgU!{7b1Tipur zSQ}7C>Q@+SvQfym2;4AHXDBd-*2)#uMgLWyid4duJ{9G*O{U!A` zENIQ8NvzcUd-CR69*uSGH4+{@ie&(?pTE1JW5Qd9;ZREoOKeJ%pN6@Iul6)~rnhoX zEC0+tVM9u@b0e$2V+-ACqGH66pyB%=pl>jnQJHftpxH-PLFb-wey(x>U{`ebfXU@` z%oxw3e&)dx+^kxr>NHvgG)vEhT*#`-(D#-DTXR`C~Lv0uJA{oc(%lL)h%#+PeR0C{;XkO)b>l?zugz z+%7?pm3fdXuT1Vyb~4R|rYF_=)t5vojIDIt20qT23E*>c-Y9%)@Kz)_OngV~Fe6Xw z$6XbSB}O$${ojSj>H#(IV|Z4~+@_b(!Az z!za9)g~~18vDM&}E@WbJ1&Ar9cg|K&`X7|N4cFvXchnc89+|aBWCh%S)S2{!qX5{3 z*4XXp=V#jqnvd=ZcyfZ~_nwyud7d(qy%zFY+KmTREspfDdh{85)x@aUvHk1!vouO{ z%%h3M9EvOQbu_#RIZ;M&!{_}v^{<-xQ?a}z{S$b>e$+-s0aBZDp=!QorgYh>K3)fL zqCi+@3BO(@S`$7)<9cgy;?k2WrqOdKXRkp2>i0|6EDl8*2K|&s-nn$|6U&Ma)8i6W zo~ab2{LGRCaduRPOJ1&je*?im^(F3 zXEfeBjW&L*$Mq0y84%;2FE=L!=@-Y#K(*5KZFTX^9rGUqE6WSkL(>J@Ut^S8j}r?$ z)3cx09|r3m|GkWh*ag4mc~M`ZIsCchXN}KuVNqvkAYn~uCOefVX&IrsUX5DU?7YJ6 z(q+j|jND*pi=!pdywN_swGB0c=+S%5D^Wd;3^?P##v>XbNvNQTS;9FgP*)Ld3`l}YnY*VSf^WU84~_`EvY)kR{tOgX%oN`hADxKWUu}_2Miji1 z59*g+xR9ks6Md1uSbVe%Tz~o-=l9uU1l+t1F0ngs<@(T%^*;NLMM8s&s`p3QDT}pB zu!bD__+dvD)&Q`@Yh-76`Kh(Dt(jpHe>P`($iCM^ z(&kT7-rYw1M^IuMr9Zd9{;U7#nAlIROt-#k=kS0G@6)x3E;MOLr&`Sv#RtDGgDQ4+ z$WJt`ntb7z>{XP~_#B-h^^@xFr5m4e4YabC&8 zM(h<_et&3UxYn}Rck|t>cHDH<`PRP6_-8o}&#hdG03?dZcm?cjkj{i2be;ODTVfWf z*_;u~#~ZzB8*$v~X6TZ3d>C=sE%MlaQ?>dio(U&zj!7~#{#9-Ujv*XH8fA%;Pms`_ z_6hUV2!MLjVb70@h6VNfNz$YE;Ek3SaH6zr7})-tP?k!x=50!Dj!(>3rt=6SzgeY= zq&iWo9w1t4Xj82ow%jhbJ*}6AYDZbTptPNe^0fS=EF`bb;Naf@FZG?~T0` z`)>8zJ@qt~R`z4VJk}MbGhD@U5BB;GvkF@Rw4qJ6!c(Kuad^<4P z6qEzfB8{PDfttLwv@11Q;lJ>cU(s3aPSg}a@QBf_gIG5b`lr_j7QrZb;dU`rxN4Afu-6vcDY^ zjZvco^KoKZUEOiY%wEb6GHzRq?pYGSDf~zx?2nDr{>g>#n_i?*LD!)z?#$Ake7V;x z=3BmvM=7QSfBKk@@~BdUoY56gK8qPta{2upP`6vxz8!};gis4nI_ z{VHfO-gh4RSuw3@kM6_BIqZ`c{2JqvdM||vTl0%J1dg; z;kmjWiJ>ybOrY~^LGGAilJ0s+P|9ZICjYN*$)BW-(j-tzS&aaC@g$%t|Kh={80pDi zW!RI$RCBFRp#VvzHx!z6F(ofjKug5QvN)6!KC9a%3GlWMjcdLJsd_)Ney;u|IlKra zB~FPvumF#Cja}c?*ZjTzOSLD@o$~TBD4qa96jRCzC{}sEyoa_{rTfWTh~lm0UNJYu{NHD@Ulka+E!$)COz5OW}3%ZS>S$1C($jP!Y=JT zv;SwZy_>eqbrYA7b-@j~Z~v`0a-ov#vc5){$Qj|!b#?CY^b@L|MUSidg3`ZXXc<@e zEY4&^tM#@|i*vzh%IvbH+u1sm+M$BnXE^GsvY?nVwzOJ19(fOy%ll0}L1yJA4!}m* z#6G|;H(OIIPAG*KpAL;OwbTK}#R5FqN-#-*`Awz%W)s~w4~skfzM9H=96{CoYiD|r z%3=Zve&2d%n9px$PKfe~*8;bVF9#0Q7ot$9bDNI488y)8CpQ?`YDbhI79#dA2T>2kL(; zcyjc@;L+{PY`tyG)Rxn-T0+lY?l6zAul~eGz}k=r=aH?)AMz$}>*maps@RXDC9)dC8Ok-Vo2?Z+{7L z3M&iq#GXgrUGiLFr9TOC%RWsOS5_Q8KLl|reEnN>GRdVuIOO;HbN>tehr$2X{eUfU z$U6NvfmB89*RSqx^h~4%&onyCiP}iVU&T5+OYch;)8Dz>n|xU;VVOv*%OqAPQE$h` z`Q5$s&p+zFC>kM`7NvWx^Zs>7{fK$`^flJ;1CFoShB(es7Y0Y}{HO2kI`eO??J0*IbBF$1Yk=gIS>-hck_zwLhr{NEAy$48VCPCF*F6Lb6RdqS?> zSyEwL?`wK+2^EcgkoPP)qzu>;;=K#z-N`8e5XLEQj)2P_>Xr!z2=@3P;NbW!B}-e~ zwN(ZxAQO_*NpC7 zLM@(LAe(pRCF0Z0eAZ_|iw9mYbola4PB_+}Y#!4J2{TYuVk*{C&)p-s zmf6%POcyfcdAd%$$TSpC>7n~>t-vx1 zNTPx8#JWTsG$8m>9q@ACSfzh(!^sY^^@@UPQP+rhrnl@r0A>x{;OMC|g*NTsde zA}Vgf)FdFzMqt>CqqN|+j}Yoyi*tkZ4x=9~*4cVQB>|56Y4u{A+0)jwmI4P6J2&wY zG8wPvMy%H<&~rp;+Byg<#?%2T)A}9u^{MQy#}KAi$6XEP4nP|T`++P;M9%UuSr_cs z7kc+1Z_$~n>(tmgXnrD#pADpIyg&luq3qOorUZ>KiHw0F0|l9ydPu-aWU3F4?zqoz z+GRWWvsdl*^@;S|JIqFg?1b!~#@<=F^tkNm-pI>+HSAL)b6z6)+x?k#( zz6(n@M!iOiXy_tWpb7gAba%s7!SvE&+R)Q|n*uz~IHjMMu}hXJX{%3W*BgfeO9LTk zy9d>&JizjB8XZg*(>NAOBO&k5$|ZoTxQPQL(}Xg>b5?~dTcC6g_1p-iv&D*AV(!_~ z7YvcS`}(WvsLC8j{4p$kg>{`sOyr-a7ddG)k!b{#q%%Es*%q&VnB<7*;R0k4M@uJ~ zRwi@)aXngX+xAFpd;Z_KrhJOfFSJWONoc!kq%U4zp)Q;Zf)YHcO6Qb!e@BQ4!UK?d z#mF5&09}nxhuGYpgcD0M`jisl;yg#x^XIy}17I-n{s?22GEC5AhfD57#se9cK3T`R z&SNu_2q8*(sDrAupze7hOaoALoTVBU`-_+IF$9sip ztDCm#nkhT`usrl%PU(4eRbebvVbjyX;Igu^z~M0LK>H=TjkI$MGLk=@65Oq?lw{0l+n?e~ zGsa{fDWG8Y4L*p*1NnoPvHT|4PY+4+6KpgRC2OxL{3-VcUB5hd-|oh8A4~?N;|$}C!H7Or$+)VKwd1M z(JtkACjMNxr0ijADJGM;zP2WoEUJg3b4}Jm^M9(_&)4yK=82 zbA*jot(*q;I&|_viKVd69XVMR&a58gIr0*1di)xko*b?(k#{k&e!o=iC3_>8#GIVo)fgPP2KG&Fc-KzwJmunV&XLl*}0EvoS@lu$|rzX#}TM5T8^&E%X) z5zBauxVR1r16*ZNe&_43hwmsqWltli;;a`;PEigRjRlaNp$bUr1Tu|cTY?XOENSd0tfe z{>`%b_NA*m6Zi^xTVM*ffO+ypsOq|JUj>UQ!<~p7zhY;ryZ>P(zsRoW48d_`yBr8A zVmGK&Xr!jhdFwyO;=D0JGppZjWZ8?+r`he+Ex|A|%+V)f(`%;EWBXCL2&>Ig^S-Ty zP-L<6P)bQI!u^_Tab60mFJYWw8i?FsPbieO9sF&F`V}yQd>GRoMw1bU@OxyPnpui0gY=OdQWVma&O-_o)XH1P$%?Jbjbsqyc@u#zYu+9Xtb z{NS1fZ24^mz$_vwN(W&F*Dr@vL%K)&9-D2MIzqchTN*g|P$i%wl*yEh=NXTt^ ztWH1?hA8Z3^ z>@^0c?(I*s;)&VQF)kY5JIba*)4J80bs(5Ot~~h?61tx)uwOLC%i?c`(L~|VzTT=v z%BDEE&W`hhnZ1v4&llrVx*zTh`yqp%V`8q1uI$IEy$|i?o*}28b$)dwcgh=6!z7K; zqSry>*BMA!G%}4*NATmn!!l>x?L26Eu+z4SK2RqW{lpK6v><)5*H>hTk7*=uF5&WO zeuWRICX^i@%N9S-XWSznS6h>hXy5kgF$b#Axv=R!%b&hKiO37|rvK9D{qL|qG)aKB z6bm$cM`=8U3}rc96T91veR|wb06);l!Z7v;Zxuo?lb>M zk;Y5M^}W8?w6)s1cjjWE%+nH{j%MPP&+`MN;C5(Vrf{@fU4Im&pPJ6UqS0v!SZ-$D zIXQ8cuP*k#Mli?4hLEiXCj?}Drts!HN@nIEYs+X_HVIaaWnfb$GIC*2n6;jE;;6%J zUM}n)7>9ZEmeDkHGR4($(Ll)4UQs#_*pm>G(7acOYY}oIJcWCx8LvD=2d{i2`!w3X zGQ>q>CWLF)g4l?I*yeL2em5S)j;;RWQx8^Alo{Ye;VwD|@?6#Qq=7sU|Do4YI*2?w z7ZD$A=uJNM2=qcnACo!&jij)MwLb;TVFj2T0V1l75?@D(SnyHA9P*IAk$*U&S0`J~ zWkc1J2xTHK7n)8|u)A|(`CdGV*mP7dOU6LOgFA>cBjYk!hYjsSD0O-h>R%k!9tU~3 z*kvEtob(m^;YV^k$**5*C@R*o-o~!~EgGASuLX4CTF-VKfZX;cu5ZlL{u+LU;jOJ3 z9v0IBqR9o%@h?yA9v!{W0i#O8&S4VzF%RD|!bS;U?zE+>`2l*G2c3Z~k=ZS^EpBLp z8L+e7U-D;nz}5}OhGzaTemhyM%*FPMM1&&?p-mF7USTn|>_buXuob*li3N=&8rvqe zB3uOY$O-TUd%4f^4zi2WZ8P+s#-Xr{560ijecayB*zWJ1NhT0aHP`tURPS`=p)F{$ zYpnM@hX)<4tCW@j-CO;y8T22ncB`w27k4!}HAU84VRo)e*V^GVoiuZsw0Et>wMy-e z<7NVA%+i0qa}Lix{`SblB{LM)i4VIY7Mt0x_L%gHRNhq)n@O=E!2riw+R9M=#hmrq zIZD7HUtD0r;vFJHcUR-#p-*>V(AvSI&}wM^VKDhJ`Kj_3&o-27;#@yo#?GghbWn~N z-doh#ql#7W^LRlRLoFUN^Kg6qx=mlWDaHO3qn7tgj2JH^P9T%GS}>+w!wP2{F^KVqw$O1z}2&tc>@jh1OS?jQA!6|YF(A&;1F5w<{m~Z|K>K7boA?&ujUnZ z-0>MsemmIQzYsxO;||MUyjm4h#SR7GLS2r~x#IxHagQ@)Ot4E$2~S+`EpMZZsrh{0 z8yls!B6hn4?E_^4{Ubm<&OUowxV2Fb&bKF5$rBN<#|84n)#Q3u*suSJo&RK?c5Zd) zELnWNU1hgeqypKs-Obta`GcvaIlJ@i-rDFQFuMna>qruTyvSHV*IRXZGZ(1yYQ8|& zAuDePg!jGOIQNLr_|5Mt43M z|LFVX$@ACF97FIK;im&=*b{!sXbsAIrvssmax^A}JJl(IIov*M)7)MEWRp+L3qvEM zePG)={fd&cL%wO2dC6lYPmI5tv!FyiH5hWACl$7j`)PrD(+Oz71;gA+$t+o%0ov3D zc@>UVXXcu29l?`fBeRQ8hY@b7phoa_7(d*|8z)8U%vjIDiP9MM9c9$#tUOFC*YddJE!C1 z;7g?M#5TLGxAVuk$VzV>_3x{NwN+O)UrqmR=m%|qvAmts%@Ze^hwwc+>x5Z5Z)MYEH%w!9^t3nRSTajmV-$xY4^C5;n z=HceD2srqwJV3wYk?{?$>43#Sp2**iABr6Hen56z(xCF3KKKM}?)se(Kx=p>2DUAT zhp9=@+}q2-c{2V2;AI|gyeS0~-3e*66ySnv@oc0OtPnUNJCI$b*QtWNE)m=H;%~rt zviy3gL#tddKErkJcrKQ|1EszUpY*QuOZ>Zw^-@26td#OIb8AF7;(=OFn>m(p8>(V~>zjFKJW?we1bm#$!x30@W z8Dol%Vyua^)-pELGuh9E-iKFa;q%R^Ld!~vG*`}qmag2)_K>fl6>;o6ei#$G<>BPm zQl$*-@bTum!Q$j*pIJn%Zvz95WI5QwF{2Z{=EP$Ai-DJ{&A-)~Y4Qm=_|4SJI9xBC z+T94RtjKW^)UpEX(Oi?YoEPs+ zVr}MtmBKYgRXInHmQQt8mZg?d12`#7c6LHC<`z-b0uu5(S=1(u-aZyrRT+U(@`y_m zdL%d#;cT4uX(%cNiZxc^9pt!dpLk`IV`SslvZe5PobN#8yq|i!bD?E4v|5@ku))|v z>{N#VQKjO>_S937*1926hpORI&O!Ylqy}PCjqieVt;!}Xhs|PWT+mX?euQ3&g6bN& zk6Xc1LW;IpU|TD)Yc^b@?Lm)!8t?qd{#ncmhT5wdC7ax?(9XQs4iCbXMpZX|cCYOV zzGYX6Q+RG|!kr!}XK&Y7dk%*QKj|s7w#u55+gCg7AwC6r-T zw;c;=X-B#kFnkYd3|h~%FRJoQO}{<_S4(s@1=`89U0!9$)C+4 z_-C>Q>=Z6qiIq&eg2RIG6C3a1uk%RwhxeL3z4~g>)wMlHmlpe?oEHb8`J47fu1k!^sZam#-X0^sZgAqp9BEV>Nzr zva@lGj0sK7qLm-(4kU|DN7ycYsqf+DSZg`GP$#kXGfs&y`>J4?^?F+Rm9t9*2VK4Pah<@3 z?WlaNreC(Y83;+?8KyE`*wo(xV(d<_#C`9fc0E{5<8>-mNV~J>ReK5oJP?Z3eI1Gs zlJ9wC-Ln3AU4nm2yCNj_Tw(&l3PA5!w^6H|*(x_K9a;?8bDIuShqGC$k!e*AdM(EH z+~LaBH5FUhnVmy-?;l|QW&QyA<=T!5MjtAq#ftYEg zU{EREv6EvN4zya8<~~YNB$|pfTGdt=TM0m7@ilFdq0?Dc0*9swZZ-dt-aKt20X#e1zvm!Tbu-25 zAM|d?aO=U|=DnKu6#Et~BB7Y((b}txSDVlxUC;8B;^!Ep>Uljdj@Mk@l8gj+ zTBnDctD?>OR;Ny`HRpv}o7eI;4<>hsv;uo8kWzfv23}J_w_`h=TrF-uz6)@UNWc)z zzKN)RxU7yxohwZqi{@HFOxQfMxNx0|`ERNP&?U$qbK$jRG^48Dv{A8GJbA1C!!b*z z`bH!k@b~IRN;UWq=0@z#hAqN%gN|y7$6SMZe%|2@i{p4^k%HXNIr0b@g z7~4Yt)uw?-~4sLi7wHHg;} z#tR};acDlW#nwZ3*FyV@pww38RQl0)*Z6D*5v*)qC*&WHYiPP^dG#u z^<@=mx;oK^Gs^XS-l^^UT^cP#)u2O9S1Ga+0q4_@pXAo5u6k%sOswoEip%q_ts>Dm zxGSIMY9U21H|E4mykE>@%u6o(Y9osT0r~rQ+h6Q|>982$ZsIGSz;9R6!mG=wBG@I~ zkxg`fQRcSr`BT4YeRmsx6=%7mpPNpaxqq(<&`7*(kNcgK^(8w_0+@XUDtc|Y=`SeI zRZqg^O?c!myj4Q>C*05Ywo;bv(o)UCI(KSQ-idA{s?Mgg`F^*XjV{FInCtWR z-8+|KC(7|hq4lRO#hDKS&^Us?^||BE8&;Rm%cDP~gX}6dxYM?FUfk_n51BM*S+_ug zrmfDZ!+A#qE9(MktP76x#T3u;qWk*2mULY4_s$NCU-s&T9jPMnl6~mi1c}ki!|>w#YPKcI(^4nHdMy4RrC?DtX@Hb>d~K{Eo-kZOw0{ z!;8}FaMqQqO!{8Ig&ei;R?g`GKn?9K-L=YCDRL;R2#SH@SFy6&=fw@@jd%LCySq^%}cz=had&?5$vWi#JWQS~LkX5l0b~$u2h376Q zkFtsxbZY`wYAR)8bjUp%f3b)U;*>8rea{=$lGTCfbGJ^3ncs<&8Jv3y|H{i(84)zS zch~zPOw8PHsC~!ttA%LNg}n2?c)8}~bp$v1BY$iDj}zk;SLxzcarckbUmo7HJvUJG z;YzCFk)MF%>DR^|zBN8G`Q5NEf`lT>&@+#TuaqNFH!E6-u+4ut0wlPUn#N6pjkFK7 zre~K6JC*%?Xc20lji*<62Njb!A?tS)H#Xp|_8+SofQqE z?=*S4Jx|u{YR|JF*TD9l9@89!@PL21Z$UbcP`&Jq|;HZLKx=v<#0SV`E|1uMy1 zuhm;`8MkY_ci_>bb5NvOb82d@sCVeI6;Rdk{>PLG2Q9zAno9D3bx18I(rRUb{B>h$ zx&WBbV=Vz1!1loYjx3UV9Uro)PZ9-6n~}I=?hXA@Bh^xM*I4P(qTF;}iVA6m6Vdfo zS9rM75n)%yFI2SaJX?fsd>d-DU<9zjT{FU!zHTB&7oT?QA#w-R%6*nqe+bO^YQdeo z|0%&INE+x^*-iSjuTpTIT6H~SuS-c*+a^K7fglJ93aXv%1$9#&HHIn<7lX}xrn5=_ zX;>>WrI90@HaYN|R=u>zQG7wF*VKob7k%%bU90?>+_ST$w=<3x0*pd8t(?Zt6-MrS zI*sw>2C{Zh!h*Gn73xmp)Lv?_p#R+WnmcGdb)3Ruu+oJW;x-xOI>pM?uXX-d<>YT( zG#3@znCAr#=#a!_g3RlObhkn>D_$kc_@#?^JMxBlEuj4-nbTE#g8~xW2h$PLbZFE2 z$MIkG_eHCLtH5^f&GGt_FpV)Tor5QQ4~wcYgo_l`r-{rSBlLBTAjVf&9okilK&{@m zHA(?p>&pC!Rhh(*F^xS&TM@ID4O}WOMYN)OUQlOWG$$APcv~*XilEt)SZIjqlip%$ z*|cn1&EXE^jWtDicJ+{TZF->WW8zC(%n)$uM#)x&SwuzFrza0xqDe`SH*+VMo*M{n zP@3`XptShg_KTdQ^%qOu8LYlaQ2Og5Y2pQFNULt8ddaCj^jn1m{W_OKw2Vusv7af= zg9y5oe(y5;Z*8_5u=Yy!}3u+UU(~QXLZ`-juzsyOmldk7^mAcmk5Ag8k zC8I!_?t(egpQqG>^>E>DP^Z$f{Tm8Lv~=IM`Fi#eGWF81j!oovWFwni6m4Jf}GP>cqsA3UQ$tBXKN86&O zRI`5U3SE*A)X9wN8B+9;(kUtb=~cxh9_myZQ=!l>ejW;D=gqEtam{^6fKMjHaV~Z1xWZ5Dp%EvxGe9R*>G7Aih>^pU90*! zc&~T}dSUvO@JIgv9kWgzQ}HS%sfwidx|(>`o*QW}KNAAB<9*oomgfqxl6hjcZdU-)HS%p8a(TgV{9q8UIFu7HY?6M!eO-^B)vQTQ(?q=$qm6 z+D=e;cGp5DIefkoD=BPW{qP1|M1mWA(3LskpZ$(NhHm~)tgW=qpIW7B!PDI}<{L;2 zLQvOZZMnM6Hq8bn!dBoPHo_rYc5-BL$kHu+-vgK8(xE)$@`d3YUaTjwr_}scjd^yX zv_M_;ttnr<5pld-ZdJyn618ig%3=*Vb-ROsJ!R%K{yjfxSjLUE!9o20+Ym!ysk{QxM-xL+eWyO9K$s*MjQoUy_z77<` z7NO$}r-TC^T<;nXmN9RdUx@PQA!*vPH{gbeK6ZkLKZTha=@Yvy_ZQj#o*C5lojt;G z?FzFo%FRy?&0`WL1^!MX&o}Kh*xAhN5C$?ALVTsEucmm^8 z0)yHD2iT5WjRC9I@W<*e>hJ^snT7jhs|y`Y8A#{pkc}S+wKi>Zj~VXsO=5m{_dEke zO}`8HFUPR0FOvTxDIVoze229yvoubMiea4cpde5LLsaZ02c$iX{hKjV2EFO0@hx}( zj@Z022+PL44)GGMI6^ZT14?}{^9kK+o^MuguCGD-=Flv{bIm(7}H{66%y z=(P#H8k3vAuo0s6(D7>sMA``L8*-L8n;<=C7(o$Sz6HIC<00IG*4jj}-JmR+NGh1$|&hyOS4W`^P zZxeEy)DJ=|`)Sx))fs$Sjh{YtIS;Hai>y@F5GV#}d>coKE-LF{b;p@W<`THx65WaR zaLtP8ZmWM?73YvJ+EMa=U9-{lu{WnPoJxFR=c6Vt#<%YF{lvT^8iyZ{8Me@`^)G!} zN1Bd!`_~iXLE76Ux}^*6H-)_!x#{I2h z#~~?2Yl-uN@TtUEm;Hk5yST`{4y``Dx>!))fJ1mu?QrHA0UKg#YP#2Fw9DN$k6km{ z$v5_0;R@;#&y8Fp!wiBRVfsJYhu9_O;Ny<9Q&93SeiW8SO8R8QjRsq*O`Ob%dr0q! z!FUboeiTW6BhLzHjr**aU7ch$t8PJx>h7%t|4lyT8g^KH(|iFx$!Ib~h~WTpX7wAn z4{867+^#Mt@_ORF{_8v_Yb|T>VAl^GQUg+uFOJU~v~cU->4*O5QfxoM0cg4^e5o=q zET`Y2{T)vlv<}aijY6SoHV6!Q(BheJk^j3f*#A=hhrs_3_#XoQuORS`j}j!lz}B?6HYI{m}T^HUD`)-fo!e=gBj*Y9Dnd* zg-Od{`$(Q{S^Ihcrb%FD_b}RgHBllZ45&uvA{_+Cy*$O*+jBP^!BZKnyU{*5- z6b**WJ!DFpsCRAv_xGfMs53ciNZK2D^u<}`U-?`0;)K4G zEfqH9KEKo;BZm!2yYA4NRCXb159YLhIH`71w&H5?qA#m{$c*E^4As@rX!T?$Ji~Aoym*$SB`-e1J+a(HabIEL-s}q1JpJIy1QgIK!c$Q(tw;Q zc*>~Fs`uiF6_4*P1mFdgA~i=%oMdvf%`WDbFnrocSBL+r{X?GxpmrOa!God71;R`Q z5qKl265gk`(^YLjWZn@kQpDi#Y^Iz@p0hEB+x}dI>3b9hvt}CI z2}{B6E@iO2M0*|8nm-S-dmvRdu33lRhZ$@#gc0#HdzqoRfG?!|@5b1=2TYr#ZDqEIlxY;HT@SkXO$c{K1J?Cw;fBhQCP{_#)}=aG ziceQc>sFZW_S2m`0Wd;p=Q#a{=CnT>W^>$?x(yQ`Ek^&`D`9Ja5uKK!JbgsC=jSbo zggMV$N&t%@ZLa?xvOX4z^U2>)G&VP%;jU(RSU$(S(EL4i?z8H7yFMDbj%rN}J0WBm zAtbMsMolue`U-Vg|GwC!BMqnes)TH`z7qqw^ZliU2Y(j|L3wG30i{n{nF&W&`e@Wd zl{32kZJ$5zWhh-)K$+|6m>)mBZR>q5Aim7K&Ol{jk&gTVg(tbgRnny;K=}MrlIg@k zd;2Nqi!+lC$jhtnU7BxQl6Zdx^&BvO+XrL4#nZwmR^8 z$2$$c-8^cIa9dt}Dhh2$gV5Y|!g1ClTC)94I7^igiVQ*A?7S<$zMR4e&_OJ0N|tLZ9HigII0vN zX0lbcEyN15W$o31H7ewvsn%U9B1NvC&|*q5APZl$$2+!uaorl-i!#-cvDIU%M=`vE z+s(-EmWhjfCOeH9-^4pu(Qe$7#|rs^-f8{^?|#i5i_9{O4eJN-&hWGf5q%RHAX!Rb z3EUx{#)kCztB7AQlYTj~SDM34#ffFEgIE`m6DQdpnBhMvPoNlF2PL71#9@nJh3T_S z)oBxje1L(S8_0h{&Z_o0Bs;WZSkQyjExrK8kfkP@014-Ld;8F%V^;m916#Co-qk@a zBSOk(mL*eu3=hwl2put$EuTzXroILnl})s%%+=Yi&h6Mvi|($LK;W)5cHm|I;OVcT zU4LG}{d18rSOKT~K}(^9$N#wYuW$0wOqq|xhMNZed^O0p0RU?t(An;?MG?m zm8o2j&(n+Tg?&B;`f6;F+bAgBodA~1)@lg1HF!f~Ml;;X(8@4{Rs1CJ)D7q$2RqAN z?RYpb);9rE+0VUYyeq`NOMXXFv|f($&{kOnH$CXtVq^`{@;#iu;;?r0{#Cz8-xlA2 z)N+q=ScV)}(=%$>shMifz}}Hz2B_s$o;&x!HW~}}cm_x2?8ajCC!u)>%<8=M*XobS zhYX1vxnN~lPI~7#JH;%BoW&)|;m68KI-YcOPl3K5nqDO-&>++vt5-e`{g=-{w|DM)InSGj6x9?labwZS}K%-S{C4sU3R3yxVd*!iAH zjJIMcqy5yrY1 zP!iu+p(R={fz7petEBKOvl}pYT)*!j;y)0uqe zQ*sHn7z0i`esuo)g5B`hLyCKUTvuP6q-hFsL9q9G%$`lzuNOiz}V5K=>~7>jk^fHLfsCLjB;NA>{Par+6Eld zY@%En!~J=9H9InQm|S=4)R}|Tki<8r>ymvf^OTG@Aj%s_QtVQw1KgYY%md=rhGnIL zTMol-F`$%$aQS*e;&#-g@An*E#Kw-1R@kLwX&~lds^J#EG4wz=PZP^DNELRFO)z1K zs@)#zuX56*-)5E}d6{Vv_gp?|5;dviyDS65m*FJMNgodlGu@Z8@6XoFh5}N)rSLAs z@$>GX+Q7GO$mB zDg9o(2bWKu!6tMCS%0^g@D!uM?(-6t4!`aV4%ajt=HB1)qRz_*Fe-XlB&k)bpNtdQ z*5H4JiN}S?tQA&@Q_2&2caf!VOAqortKf-X6b*%(2b5!kCVlD`Qs*svvwvmy!RBZ3 zV+*(pP{9}$6f*AKuX$MprrAD2sC#G7UBO3i= z84wvj9uupijh@0w7X*Jd+Rx5iv41dI8io({!JP6VJLzoh#~#0dWCf?730;Rf+52O& z^fw@M%wZy_G%0%{%)JXbad?kJsO{V&_(2!kS~8@xp$%P}QJ!q6gkDz4!Mfo?p3w4Z zJfQ+YcD9<7D`b&=P=B11=BmbP4nfT^|x3i;jbw` zD%eH~h}xr@Q?TU@T{LNkSgrL@GP)_lMu?<;Gs6$k)?J#Se*)XDGVj)ONW)7#Q#}kU zn%)p$ih#cs-#p*0ctp&g|96*(wKB}oh%wFl(g6+bZNSG)86Zzs`FH+S?$L-Xzh%l{R;jS3x@vk z9?izZm%faDIN+0nrb4E)3J}9QCaDNO9TT0@$afC`s&^e1jy8kho8sFZB<$Z6Y!+`W z(IlR1f7({u=r~B}4XPwG6b4&EKQC)bG@pIzN78<3O%5?H<*6Rt!eIoJ6G)06ctrv2MNN<(8&y5B{KC2mbktIS0z3Gc~Pe z;#sxBZNU@rv`jZ-v+aG9z*3Y6EytahG}{Pnxf zIg&rHKg+m@Xsem_=aW*}y6j%5@*76Uz0${tP_94U`DvSBlVQ)q2tlxtzmyTU$M6u> zL%2i0?yztS6!si)3V_0J*y#aDZ;(^;JNdRR(iKxyCZw8Mqv;T{KyI^}vcQ9YY>fPf zY-NfL)0G7h+%g!4$)kt^li+sDBZ;{UQ7{rajEMliP2p{tY3g)X13>;f9w!L0q69{B z>|%E{u-c=0dR>&wsr=GisXne3{!pNaJFzi#Jfy?5NPzNhpgN;Xy%`J3)s#5{ei!^x z6$fS#jYebj<*#eb0`JS@DY8J9(UC_M47`QwYs0d3&-0Xf*kvS>)uU-icrA{3$AdN zpM!I(XZr%G4{pQd6DFge(eJd`3@|$?(1{>ENIy0gt49;tt4ED1{0zIrUK3(5f>@rg z=+)mB4_#+}Rl;`B9}ua%-K!JPHa-E)2&-m(&3jVYKvN&Phxw##mPC7Le{3O{mIS>J zi}ObE+E^f%^rG``wWYU;BT|}9grv$TzrM`9wX=#eSQ~TsXU5dAC^QS!J>JtTklE0p zcd5o}K!dX|$|3Gd2HAp{L0-Z~ypAos`t43w=l=|`pA;IMMV3KoP}m#?Wj`tz<0dAX zb0I-|Kp5b^eb_122g9f+*}AJOoQDT+wA)FYs|3WNzx=zlqd~imZNuMdqf+?453hsV zdO0_%*+`0ShvAN2V|Hp*6h19vXnNgs10j7b`54WkdONQb{q70cTXa!Nbfrgc(FQ6y zIN9h);i*~L#B8&=VA+Jer(zl&2KMM@t)Hb`iS|qslOKp)LdI=F5^1%N1!Lh+!*)5WJ z$98d_*n*mKG`ibhhceXh_!wyOgfgBJ`^n^YscTt?w&GIHn^!r4p+4DcFCzC-bYQjD zlswd7QuvSuX{@*^^y0ndy>*=}m2K~hcXLWe0rHnm=0zV@K5W30Bl05v#7aW7Z0|L^ z1!@x7D?M~0x&@yl9UmJkTg);ONTa42^g}7a5$B^>Vf2_&H!@1^s=d90ZSZ&4=^>R# z+JMqka{1UYlQV7sGZ*OgwE`EBrsmNc?b*eItMOMGuF=*_-qKSqO|aIls)DZBx#kCq z>eZG;BlPNEXxHqQ#MnI;?;W+x1(mU<8ck~ONgK`V6LH~;6OKiUi$umpa+l;##hw8~ z%}L8e=6&<~I_d=OR+7XnC`~yVdbj`brnebC>c&^OHwW=+jqjCSJ4DE9+xNaHW$t3H z{5VbYStA4(ADQpj-}6Eq0s!r3+n5iS;%vLqPL$3@IFby#TTpKpB>f(?wN!G`9eoez zdZtzjN7!y>rdOf$bieu34PNkIaZPf<<_+>16DakdtoR-m)}y?B{A%U4mBP9iU9^!T zAq?-33or%7I&+n`7N?CCxq%|MY3EqfQhRl!+(JH$64tS?np=0ZFJ>|rn)^<=KrBQbeyP@rN%cwU-Q^9$?hD{(7JEe;L1$s!B|{Y!`jRRX(Y0^mYo=ri0zVm{_ABr2eT-vJ9i_@2kn{ z&sY>)XBp$lfzw*U+G*sF)?mt2by)5JL;t%WKzKb`)TjnG&d5ZSu4Tx!F$8h7rn6BO zrIJ_JxBKXr3H+DmD5^I*jodV~K}~u5_n)yv>~`zMBvZ^D$I%dYH!Sz8Mel;O^Ea+Q5HpBY7u4;0NUF>d1&qB0y^0GW zyO>^~1v|pUW4;GLw42z^wpd8EqY#>?{-UUuqRwf>O`Bh?yqYd#83*?p?Anhe#0U-9 z_vJyGv!A4>*nZjbxINArNmOZ=#B}eNnM7MYW(6;o#9n1z^44|Kt+l+S z$@Ko9WAGhUx-}*#?7K!dyQrR#zM{yYe73+&_#hpfs0mbBixj2}oOHqG%fPAU^$R?v zMF24A1`%hH$+Mjl#`ZSJpT43sab8iD?ROyxcl8tKgI^Wrqq*W9mE}aWxx%xpL$*yC zQm)xBClpxAVl(k0?6(BY3Sm6_SZaf8!L{uo@Rg-*h|Pq_%*b6`VD+jM9N!) zHZvvw;}Plz;UtuY6RgL`ms^|FbtY{-=`NEx$HUrDB~Zad{MAhe)MBQ1SsaZx{Wq|? zXm^yk{L;gVL_iQ#!n%#l&g2?IQk0J8!SbKKcR>(t1FEaqx}wmjrpy7z7N1S`Rk-GXT<-Xdh?HlBok*>CACq@3L&O!)fJ{--%^Er%02Jd1K=1<;_hijs+ z)!Dq#jSCs@b2+iHtm z@wd-A`(iqg*}tIr9WcC^56<7?+NtKw86JweV;AattNyp&*6oe6(A+0dJQ+nVD_g%FNoh z5y-^cdrZa5{fJ%1vJOcNUqPiblPy~_m(@}HQkod!GaopbVpJs{z> z&{_bX2!gpy^kLOn{E7?5L-+*JBDxPCgNPORs|Np!Y>ih2H%t?Nm!pbxWe=HM-(G!d zD=vD#Nv)&2`8+aIPHt1?@3S{pY`{xEL?6}h!yN;59mOi4MEP=DC36YChqPyOrXRz< zzzFtcqZ3cU1q~5R`nR|IyWgivPm%lXFP95;{^&zC#rv?Dj_hRb#H+ngZxq|O zDE43NJLWF6O2|b*r&7jOk3E`^_R5pMY>95|O^Q8#qZBJH9N*YTaTv3{sXNq-32FHv zKeM63^al+0mOdLZvT=X%mBA;SeUZdV_N;&xr-%+es~iDA=a)-Vq1pi(an}cXirLQw z&gNbdZqm)?8t3w@%2D}ey$3|Yi+#_(7Ge8q_>_tZH^mucah2V(^Uo@ziKY*4|6_pR zuKBTi=BL&d1h_l*S)f&O-zNsq{1Pl7V)ZXP9OqKe$jNuf96{Di&$4zd-PY( zD}O76cIC~-@OgEG_KW^WvMNz6pN%;s#Vx(5S79b+;aFFC`9t4N#E_EI*E6^+v#X7P z^V-l%mF5R3j9q)1;?RvSZ|OO7Pq9^Sui^Dh=niv-RWl^ac@E_v!FO5?zBFi#5`v)^Ms>QwYjKN+$RZBGk4I8 z?6@J;)Jpjb^T;rb9f8Gh+N)}x_#LD}40lud7J1D*WwnmeiSXdNsL)gC`>TwTK+5ru%qP$*r zA6*DIioXFMi07sN>?~3bCkkUsSf6CxSP)Q=&36oa56w#*kxWtRKD`=+l=kGg=7rRm zx+^*qIa*xzrxQn}i)T`j&O>`1RLMTVrVQxyX?rY+N(@o>7yOK)m~Pe~1^`<;+Ae)( zQhkH64?V4=ZRMR{|822>#g0oMRn&NVx`p!+CVYSRJ}p=$*eYxWaAHd9D?***=jr9B z8FRQB$R2Qao)ZebwA`<;fN6?|-Xi*g_SeL64QraVc}kp^e<{}&ZufCxTiN_bLkP(} zbRA5aJ?#X_;F@`Y>vm~7VjPXf3DlVmlw-0f(8-fBY~Y;qOj$|S3Wxr_~0E=(?u5d^D&+|Y-~#8AAZ?OdK;7I9d6 zQe|HnbmH)e+p@Fdv4B~~^5nVa0viLK8cTP%w%S3@x6UE(p5X*F*!J*`{0BeJ&(+mK zy`?#VIV;ZMb)p+25EaNLR>yw(+R|uj$d6r8Ywam)NqKZ6gM8|oiuspjqasLh@(}4N zCTG7ks?*-GV-|7z+rC1Oqj7j*xdPu&JJ-JSU)uOOnyxpVx+p15cK&8Iw@+ROUDvgm zM_>0t?0q!%@laqNrnawmiR1KYdfhQW_KFkrO)mKf$tVxh_{5oIA|J4G%wvcDm62!khRW+h)JfqcdGNv?h+N0JYVAVsHx=GAAfh=No<=lj&#Rc;*A0(@KWU7ekZpt={n%NbCoIfifl zQ#Wc*wzwUk%cEsjYceWk*zu!H9KH4V1JqiexWX{V(MTwnjOEWkCL(LA`fM)Q*x|zR zz*cRd+Kp$!-gbg%G19OrdZTl{^sOG%L*J!T)*JQB1dR?Zx4X3y&o%G4C(7hliv-VO zAfKT8ExbQOqNP@IOdSy3ip=(ydemW+E%RL<{kuMUBoaulfH;|cO<${@kd}ByPhpC4 z^jv<4YMaOrlg4GA)u-!V+Gqpq(R=@ItaCNDieauJ(brzm>L1@}>Go)nRLgA@$X_JE z8-gUNUk?Sl+tNc&5Em5XLUmnpckH}s9U;YdKga;z$&o!0QAO@zhg3!8F1~f$zi(5M zv}<3wu25-dF{wA2_MDpa`Gg3l{v2T5y|^@&nAVxgif~KS?WjN(*+r#Bjz4;emK50{ zP&N$1X(8{SHR(|ad?H(=F;G!|-o(H1?#A|U3cA*u@uggNwZ}#k#)K9>V9TQ-bp7s; zg-Vna_Jb)2I#*$V&l%DO#0cY(?Ab_b+3KpM!^&Fq=v;F7^5m6S=4;}bma9jYBF%rV zn3e>C_wu{`iW`t#6tZVm+I8v3A_Sfkf->nHOKX|Uo-mjGH_On3Gb4PJ5RnAu$i3!P zeWx~y9e48LrcY1r-nD*V&thCMy}8JMpiWIuhc8A>X7-6v%5bsp98InZpj_f=%)_!a zb5Lh-N4i-<=~9=4ErQW?>+WkFfY7hR*2|#xlOM6yC})sey4+3NHa)&Oq4gpqxKfg; zl0mi-=V4~^nT3N)^PLy)6URQzw8%FenzOp_Sl3fB{b9yd?70CR6-V{lX*@3ZlY7hdbj7DsabYHFXqGo*vV#vra8=g49)ENEN$8h)_t~HG{DRwuH%WeCyQQJrE-rcwx=-&{8kGruK3P` z)@kt$(JBUh*Rxn) z-J>%+FElu!Zb)MIJWlhU2C!99aCOK*rtPP3SGL3s^=D>*{*o#dtR&g$7qCH%-a~c4 z$7U@0Ve^$^YcrBBM^uY%P1Sd9BTu_V4nASW?BfvXb#n<=PV;^(2=NBcfcOhr40uyB zLe(@TqjB86X43+>tsBZ7{DliCof?T@fYGTq`Nn=ErVw8){X4x1Xpi!ojHz6gZEk~} zj39f~*BL3vo(s-)8|ak*R}hJ&Bb7;M%6Sm*%@2*AW3WLF3GhNq+OLiQ1>I4z?gG4e zR&`x6>{~#=XK5(~ZGZJ>z9j+k7&UArd)%iP78TgTPQe9TB6@*X`!|!jYg?izuU?Zp6!V^2 zXJp=^<51k~n*rN6qZY0M`%(+#mnPlX3htJOL{7hty1I`&fuTREO^sD)v?ula&Xj&R zpwwiV5lklazfD`ac$D?ah;Tys)q?fLh3tKnJZksj#kY6$?str z!uoymOWa(lFLY1KJY;=~w)IJ%i-4n?^%PI>?_eD{SsWeT$O3azSFRYpTfy^lRl_b< zj~m)c1{Ucz;pFKvrmkd7@87SuyZ1qE1^OGj4H-L|l+@chW;UlB?&9%Wy$%scrxm{C z$_!tWX9m-7o8-|ERtc$NR>wtc(QZGfu43!O0=F7|03&mPnSR~UnF(h-Wcg+(bA3Vw zC|eSIVK8DJH+f4G$-OMAS9aY2cd+ytMB;LBa+qSg$kOx`b{{ubLdK;8%*dzvNe?Y)rdaA>f_ZYqS@ z!@kp)_Eizr0Xiv{Ptu32P75=eC;&=ApyBR;yG7^c6!PL*I1gOFF~LbPkVVMmw$@Fn zK}G9Dch;fV9r!E?@S8RFZgT5>dywYJ6;q5@{crPce!U@sbz8+H%&oD#U7R`Bgqq}| zrkexZ$e8D9TkfsPYA5aY_-irr<83LV8AQD8$67JJ11DcAT@5 z-~l}x8ryceEse#_;+Q=&JyMF{l2+TVw0ON$qVkFZ`(%BUPuluxh9k+Nmc8&Uz*hEg z6fsAhvf}whT`^aYvbW;bn7(*EMcIhPMgPpdjqXf+tgo-oIoxgwhwCa9bv$HQGn$!K zv2NXytGpe+Ls31Uy4)$u?I~8cf1e~p$KMiQDw%=8bT@^B53qayb^DRNcn&2-8BxUX zGjC|SRqc~}`lI>E3hP`e$00ouxj?ys%vF6DXekIZXa>nAX$oh_sP?KsPkM1kOP$%> z+jbXT-c)d$3O;i8lv5a99Inb@8c@(UGV1_5m7DpmjK@)!DYVI!$ea?Wfq54BwpNoc z1XL$P5y}I-G7l0-iKf&Es$=9C&i}UxtDYbZ9#+gIxLsx6wZiB!7`f@|w3x8TM|VNN z+_x*d(=yn?KY1K7;$FyTaS5 z*@9;sV5E4UQNM4z%?Jg{#%T4oq^xbbV)^cGrQZUoPOj?M` z#MX=i-vLzb#?)hzI`SCp;4_E>QuIH9V|Yra%-eM9GCsZp{f`&X8aW;PLXtL?c!kh4 zT7ftHJo2w#31Sle1)?>zjsFe1k(K6F*yIj#V8w1#t%V0h%3=}wO}5IAW<9yHm7Z51 zmrtGkd^9Fm>{RcwdbiNj_^@xl=C)+rCi4hfl@T1Y05OEwrQ97qbt(0$lI@CgH0C;# zf1@~wE|U{-pEphPau>voM8Njt=E1R3@qaD^4%nS=Yx`boeHK^(X^Bz|?M}@(V)Lmc zNb&e^LSb+e(GE#94|VuI?Z-Jg_I@P0QDt;!0(z%DAExWrrYJ`JDAo(lmg@6YlcIrz z5kyL+U|SR5wJAtm#gME;XZO@u4@ECH8}$RC2#&b62=SSwPK7VY)F+#JM^_n5@E*s0 zH1Slau46j!H3eIxCwbA|WIc%QtDvy%(3|9Z;VW(c=#aRG;SH=i>U8}HmjjBQj_*;# z{mYHK+>*!1CVIqJ<^7owvdZ22<^&V7pcS`3nDDXm}u% zuinj-dtRcj?u<)9CC)4Otq82BuWT??KX9zJh?!>6?oOcHFjbi!*ZXif z&k@8r`@;K9K5SXyE#SQ3?-rAM$axZHaUpXw=|Xu-Srxhk5GcpMNt>!uyy{&jd%K%1 zMA_^9zgw!W+`>|e% z++i2NtEzP;Ft8!S4p^$_g>8l91qRvi(0r4pJwZJWcddpL4SKr?T<77TuB05Up`9Ev zKb7jp$^uWL?P#GqBVJ*BCmYep%j4euzvZ2Da?nr<%81mM<1lx9dmb^BpKp zSbm&jRhOwFk{9drcFcF*w~UHw258=df;}ro0T18~?{;+7nT7OpDlZ9uA5f{(T^NS9 zBCA0}O>tNvn0#k}>@oJ;1tF-1681>CDmQ$~@=mM<);}&VM(U zgP@*mBN^=nxj;ZPKkDd52A81~doBvA15VE<`u}9*I5s*rJXSS9x5Qh~H_}08y+yZ4 z;iStB@R`w2FpQ*cflKi}>Xo*jTerA+RfN1kvf=*hTe9+=b*|5S-2T7WV<;HESnur^ zYe-&W(#fbp^4T+~O*8}AQ)}JK{PP9LvrZZII(Jsx|E>AUBAczm4k^TEB&L(Zl`Dyo zbF15`owywnk)u|+4H~ghk%BA!oSe-m;d(cci)QaNb-ER8+&|-um>}nIr4LYX$C@?~ zdQeuBJ=_Jzpy^ia$tx{$5}*!`+(zDMqy@WlBd-f5G|PHKx&{5iPc@a=qfk&w&@G?{ z9KIGGYp))=h^Ye)xk!BqI~5fjC{E&S6ioGnHlTi7KXQYWiF%)bd+p>7BE-HZb_NaSD&z3-H=ymmVd;o5p8UeO9|3`iBENMmKI$~M-2+$sK@wNwHkDh z@Sud$Kij2Z;1?k%!&$m9=UPiZPMn+%{4JrIIUexqhLpe&p&X?t5iskqbf<5-rSxeo zQ2?zQht@^8=$wPo_42dJ(c3CuPD(f07UpA{3gt1KK3FN=1j|iC!LR}-8L$;kLj}}i z>0Pv|d#}rYiwgN=l^Lr^RWbxvYsUEu=tW| zedb&!+U4~+dQxCHyu@_59nY>2nKKCyx9Qpcc@ZOt{v0&657mM~pIKh8tLyytPR*_P zA$07!w!{$KnbKFURJJKWtQ(mZs!D99|7SLa*pEg_>P<3hLd^T{J25TeSFW;nWvG)6 zySTmyG9K~LDJ;8FxW%qij5(gBCgnOE~3vb6!nXEq)Uw9|ETeL}ITQTe) zM7FHwFVzy3x>T;Q<=X`ct^7r$f0g8K&c)v|Dl^u6sTgbGx4%O3VSPeJUSBBvjW~Se zIxsUcYyVb`yy?6OC_Qa6_dHdw(L%0=CLlay>p7Zk*d5<1GTDLnt|o{RcQv>IVH&$h zE$XP>eq6vG%bt_VdaC`k*1XT8Ar_l)aHdp(m4?iP$@7>0owKK!f3Z`^zb5{r-a#$; zEb-duNF;(lJJI-`U+NzuIL!+4CT0juvr*k&B9W;oZx}OmfzP>3TynU&h?cGvy?`xQ z*lTY(nr8wN{Dw(8MaeH$jEG6;-0|t{BJAquYcur((qi%Em&Bjm9n9?_!&0&JLr@Wf zW`461?mal+gQi}=?&PVv5k%DWX*@)%ySLi zr&f=|EIb}LQRvy@5tw<-!B;-X`_4ByZ+FrJ_yV3CHL^Thv++_-*{#rAMPA@O`qvw> zDUWINH&BTvTs1SIg_T~lA^QKgusr$w`9U4P%T6u5gU-77rpjmIqY1DwwZ}w@XrPGq zgwyL`-A9d*QPz?nrf9 zG~L0#yWKsK+S{r54^g+s@VN|&G#_`GAcPywBBqcfujlOe*3JfU=P4wr@_H@BRh|Fe zR2B2MdhhT2$M{{b&9tXN{+R#e=pAb$MV&O`ht2W^)z3>~bJ_}8;e%#TS_jayH`}~z z8rgjCDS80@leg2L{z@=6uFx3P4A>;8+VwiJG|>7uXLfE&s!H(5 z;7ixOc<^~zi<4*6aDU*n_1#r!XP%|pw1t*iB|o4K4xE;s6F%I1OwKS7CYi}g-`&c^ zV|z@5)>H7-Y06i@9>NIgbwy0uw>!I$6eq!N^g7zEO>1kLcaaie)!)kx$-tD*AR_a{Y4_xNY3(xNQ zgR@lU-BIMa4ESxKb8J;rjCVdb<80D$Z~_uw;N*8$okRiPW0niU5i=weT5=Bz$W2xwe8&Bpr)iZg993S$DEX*4hC zvkPkQ4LR!Md2Yp3mm@u+;f0&?u*w12u$?^i6m-cRq5c0qQ+&Xg+3XAMiQt@p(6cvOg8693@{xJBd6Cs7p0SDA^ zKCDFTHj)5z9_ehY5v{W~mxOu{vW^o_=zM z=eQvI5wFHf;L=xDc*5u6CLw2?ZAy$R~iRyx~zRTqT6<) zczsKkI!A5#Xw;18vP3?GgL-99l=pN_%#+$g(qFAEt&rz&&;gzSW?y=?ph%QFavN<* zP(gkb#MKoBg3B-s*hrlDTuW3y!!?VK&wRRmxYpd$6CzHPlvR>Bi{)E|jlGmxc3R}z zCogPvI;4r-wNb3vQw6it=4eefTNV%02!G^qa^+1qsOVY5>e|MfFX~BvypbNx6`PDn zyf}=NBW1X^C)!X+T@y&?Hi;W7=+8l#B*|z{6qnUDn$T=fI4WmZ7{^+ja85uHgK$rV zcq*Zuh#BX0$h3)oHKI;0Bq5CfjWRl!`~9!R8#BOeee1`3LLj#Vz5H>#YsNntu3UV9 z`r+}xS-G`Q{%bLmE)NP4Z7yM7ThsL}xG(p^$4Rm-`=_}*vtBn#ZmN7PUyqu+NhIT` zip0femmf)Qpt#?a`{g`|AXWAA_FaBER)1qOB4Qm3+Xn3E$mGBIFP}0g$=wD-Ny|^m z!lkD(+kNfdL{u1x_793oglS&Ije@>iSI|I>;%g^zc75x~U>qc|f#(py5^1MrX30xm zlK0Uom*|(s%Ta{eS{gia<%M_-1SJzEdK*XI>`xwxUQ4gAzhT-THyRQ2OqU3R5+_qa z;;KGA*}40)R&~=7cMA3SHAfPmKmDH0bZbCFhCL-oWG>yNE29vOPbav3Ag%Vl zGXcoc3Yi{TSXF(iUslr?HsMaAlpdC1moU=T?@eq4WdRS>j>?G_2O}N3jw}?{+y01u zZC<#DSQ>kK412?tusXt)%+9u+H0=I@ng(y>%wpUIM^(ma;#bok6Jko{3XC0}W!g%f z?Nw-~$W7&%O=0ae?e^}yHyusdtWKH`T0MK-nVEE;32{Hg4K;-oBIr%3j=L)WmFbEy zyr5$F815b$e)Q2fL^sl?3@r=y>1ue4=i#q-PwUC_<{G)_Zff6lD3 zj8wn_3uE-mLKdswkL4&|(-w_#>V<*UphxR|M)>F6InJ$rv@Bz61v$BT%SBD$?)n+k zi{wp~Dc`7a^O-aR&%A?}`Gp6zfotQYPlk0Bx4(>w`_@_I+>MU$S$p~GwMxm1?(C>) z6yCB8XWvsugx(Qp{k=gRO}A6oqG@%?Ps0|<{Bqrm1TGBW`4l+L^Jd?Tcja-Uh**QY z#AsOZlM91qJiLaYd*$sV$iKRE(}VIUrJEjwh$6(~RyXmA`N#*UjJ6~=7U_&xk;iT$@<~S^+B}Jdz_nKah08d{M2W?i)8ufp9EQh9119jo|CN-v#FU&WGf*(VTP)g~I(L z!tbir5T>snJSj0_CrLK@?wqQ9zlaMb6iE7{Oe-v5WDa!A%S7?7%og8-AFkkG>x1`L zkhC-3DAuIRjilfjPtlu;mJN=iu-1`CcW8HTiE`Vq(Kp&f5r(0JjhQQuK8@6LO?P}+ zr&p|$5k%1~KStuE2l+s(nFP01cNG!HE$fwE8h{^q9Yu#9oL8OxQ1m@gfrAuC!apSM z0*!j&{1ltVw{oZ_^W;xWFns6tiN=sweQMo7IaI@bYNBOjtZ#Yt)1G6FZSql`2bBz- zH;Qkv##u=hH=$pScyN!Uq1b@%#g$;MS>#NeRAtm7;2v_i60POkR;h2aRUn(4Osz#O zSKztaKl4}5!B@*zAo9kH)J}@WVv=Tli(@i8_)V6_>*8o!qeioJa;T7|CSSFr=#>WG zMNz>4VqlN-q#k>8;oe1hlgCdg9+Y7^is4G@vT6AZQ{Uf`=Du!hoGwGk07PXQKp&Ps zEFT1ZJf*qY6}yC0m4kL+E23c(9Y!N=8K`xiN<<${?fBiVj>DM}nnX2kc zKybMIqF(i*INYcfgKxH zzfKv@Qy27r}0qpy@i$>GO1rfNdjRx2T$CiCbz5!NWmEn@DKojw^o#NhQo!0>#=h`me;0kC3uUt&->kL!A|D=CQZfWZeCF|d+6=99>rhXLDS@m z&fnBO!Vjy{1bC3Oo3QLUAYS)H+$$UWInXo{1Hv8D#DY-D*B7Bg6H`1S#}Z%7T_cN) zg-)0Rf;@FD!b|A$@`3i>`E9KDgsSIw79H$(PM$*gL+*NI*B04irTIcljb1U*);)77 zc=5H)*pyfi7zcl|O?+ue>yT>*7v>xVL}+d-gd`=#YtJQ-@+G@(kl%h|op4nmH^@Jm z%>XB0S%uxmX4K_->2CH$&*KMQ+h)5=xfB}MgD1<4`(YiN;W1VnWz;FXiZZ$Og5gTw z1c0Z08E+E`SG_wd((Ce(pG`d-_YPCJ0n7FeieyzaML@xwT_A$a&;nVj`5tfCKt4a) zq8tF5{4V^pHO_qMNG5ASs*#BRrj49=*iCg>yyu|kC!+M3a?IsWaprYJ{ly7Pd3^Y{ zJl)7CE4C;L{Hg}O$C=9A<=|apX&^{?OFA0T6Rqs|Ixl{I&+PCdH+Ud8el#A)&*!(j zEJFoC%asRS(kxFLc|KDKc$?sw!+%qUjUnZ`(#_9nAHZqbdj3yYIN?+7Tf3Z8I_V#$ zqFhNFlBcrc`eoXYTk6HTT*qqkWx?20U9Ns6|=bjKe-+27T;eTHwo_EfcY~BwJ$F96sQTeLtJPxIp zrU&{A{&Z}Jac<4n_MzhHQTldLUSOSbh+dy&c2iq^;Y*ZJ^>+pF4)b0-6+}fkAC3UO zNDNzCiEZoTfqR4#nFH751E62>@gDaTTUnSJm!jC$vTv^rBLDNj_zK0g?G$^7&KO7D z3aZnmC*Pklt&@_U&$LZldkMv{fGQ63d!&%qtb4OVdE+DJq#g>|n4_~$y`$%KR;F#V z590oeRgk_mX)46|KCf#e)hqX%kKHF?Cy%s{q;q7(|wx$8;Cphxonv)A+1;*MymgD;35m=3B zi|G(NCV8+RGWfni?+p>efmlvinB*ddb#MDq1N}HsnirQ^u)Mr2)g$a^SC3$BEgJZ2 zq)Rj0CtL1a)>|waWJ=DWjnA=+8S6jgY-L_WsK?lo57WU3U&OWys=%^uE1poTF)DYx zBA7j4kWga!zsWUSh`QV(T^iQIMorZGiysnpdCUO~t}NbZ44AF`iu!ffu}M`O`)|;4 z`+k9kDb~;(?LZpywayJ@R+K$+P-t%0OnhDtNkIx*?!oK&$r0!BOu9Q|521yaQ=?)p5}oFT=Sd))%2-hI~3U!uzJ zygzw z%Dp=@fBKtJH4(EQo2ZY5=7TYXq{*h43hufpF0372j;-Xvm~JU(53wR^RH8Q#hm>;< z@)doflI4F_)vJ>Q=MhDsfGceSg2Ch|;E9B*&Bfwr9_c7O0du=~KAC=9$8I_>hc5cu z)|!WwMjoL2W_t|%{+e&uot7M1_PpI3y`=;>~;6_<}v z!JQ1RMkVjv#eDr6h8t?(bb=LzlgO*CvL61y8yC6GErfbgn0v)Xg6W2=wF8^|_<6{c zXX_cxc-lKK^Ap(h9|E}nS=w?DZI$UWB5z{z!_#Ln{wGD` zQj+XdVQtzTS^u7Z+$CzonSU`}|13$n$$7ZzT<^E_NfCr*PGtRVn}Z>zHw{c|j>i3= z_?--`S~uPZ(wuR0#=eNZ3E~YECJA4x1fEd^NCThrd=czsNUPz;qx`-iCVl2G6x(je z?l8@3!Qp<<`K>E~nYxQ8xbQR;D94s|r?@V1&w{wEf6xGB)0bjF+xlDXtqKdqpsOF4 zUnHNqNk%!wzza}bN?p%{WqLuFiE&SN}yDr#zbo0PBPsZ9vh;Dct=tb={YR zbX(YOs=*p4QWk%=r&$++vK=x<`+&c;Zf!^k(@?imM>1PNRzH{|AVptBWA$1QKs_Q)MkU zpz68iKt;Dj@)b%8D83ETzn$2J5j5hQ79ifD6TQjPR=8NuRb`h}Jjr(TGYoo))Jk?JLTK|6SAj!+2LqS;Ab7fv}SxU&TxL3^4kcJ{P~4&O)2p<;!8 zp2+vG94CVO&xh#W4eI`g@1D|gcZJ+PRJ^aCh+$odkkIxGM%C=+Ra`=RxEa>Iwv~CY zum{wJn)1T_GzyC@h4JswC$!r|?{}gDg)MsLvRGL&jn1*;j%+jKb)^$;JO3fQt*3GU z-odgPO1BiM<6mJov#~!MNRZoeqK26Q%~oU6vG6Mf;i5N<)t!=G4zH;w^{u;JbzKxf zV>+IPwJm;+If9!E&DmC6NVo|vGeOL2^QOY-POyH|&U(ocRu7j?odg|%&n5j<+2n(` zIB3P#+SFz=)fOw2OjifpX*Icr1ukId{S?fcVXhQzIJmyzZz*R@CihpjJ8 zYVK^3l#eK%)Fr=>clvzT$}U-l5UiASVVdOh_GKX$L+$X zRsmM@X3V_JkC+{DQT`HX8dkOK=h}sLd#7fO5f+y&DJEB%1vJ2s({INRC-6rUW33?M zkv8v!P1?p=q~zm%hCe+njwO?~NBg)7yxkX5`?oLLATaXoTq2tPh6=56 z7Y+RSLc|-4DvE0%t{dc_*Z`{CI_@`{9_XwtU} z3@+<^J^)z|ENWP_JMKi&%F@z1Dsn}eTzyX@LN?FCh>-R)`9_cv59asLDEHU&cJn~t z1^$@tv5MS+do)v!00uy{(HGe>!cmu%3@D))QI1{_wZB-Be{J8zm*=jvW`-)|wY#DvH;Rnzqo6|+Z|1zUGNB`h zm7dTLEMrx+Kcjdr$hYTLc_|mhVC4?}1I#*<8YdOEzZ0z02E8lxa zu*1lBQ0cYC8Rv1c8D1hgeziusB0;=k_>wjRAG>y*?3`z5*!k&*6Go*!xyv+@uXk_8 z!b4YMDAJwuC!-04(ip-eOFei5J}rQ;Dl;?l9#@|1@nPNRA7VRO$ZRF+i4%FE z->_OA)%PpB!j-Pi>dx3pQCcs@nYwkfFXHq$|I#pDEdQy~w1K}$-LR((wYacVc&BiA zX9oRC0x=xGzmL`pd1tCzP2>dQSJ)fCsFU$E_;8eNf08-43u=mld+V@awOv*X>`RUUJ*$rE4C=7Z8u|_hNdVxN%*x z5f$q=pEM?glTDNCzw4P_-~gg;^m}7v;xSFI-v=n-R_zmG=SAMtz7r?g4^?zezjz-D z3v3P;wKnUS>iP8l*n88kB=bIQ|DI_kTXo9HER`11)YQz(9j4V>(oD=I4^+haks(v{1LZpcn~&?=U`5mwlN_y@QW7LW z=T_<8Pk!uu(Rg`FcQ~@+O|tMk=q%Ofo%kFA^BhwcTQO7`%27KYK34R%SLpb$lUeCTB|+E$X?o z^dKD~bG)Ei+d)M{kE$!fnvhF1`!p!3y;moA0-K(l@KAX{86|$xuz-Ox_L#^v{kEtl z*Lu-W90)E;I%nf>2oTvmHjlFJR)x#4WY;j|QjrVV-dArB)GFTy-_h3zHX9=cC!-Va zB!roO|Kr|K4YIQOc?XTX7)OclxOOKR*)dp{Vjep(voo%(it$7%HEyiw@Wv2(`GN^X zfcb7EIv%7vRY7V(I$dr@r7*%Mms{o1k|@ej3mUmoBt=+yQMUjMge zHLdS@ChNX;geGO#hl?4AZrj@a;>V0R$C87u`F{?qQE=2?Y%;}lQd*L~Odby|!0cgP zZZC1aEwN^Id{nN2#{+#jazAiqA{=c`u0u-U34ZH|!P8Waiqs)zsW4bLp!G~=X5@C< zql8YYCln7};`)p^_%G?H>3cp%5-$=2K$~0OO*W?2aS|U0ax_Y*q8?9yC|hFKP1JZQ zOE>wljg`GlIO*z$x5BPxkJQrchj|slZ?0G&wR6xC{z64UQE>SWw?rs6|5F_R@Px}@ zT6X)_bal++Mp{qJ&1Qb1(F`dahlQ)GVn=nTyu0|gZqLR4`|9+}-pOu9H*kh|mFQ)7 zDIqZo8iZJDSBY6kl4j9E@{IK-v%B|P5GuhLHWuasEZT9u{s;sE) zl-Akx^q=|rg?1O`4?d5W{4B{WyLEj)Z4&X(g2OnF@DI@L;Jcf8>MJJkomS^AqIwZ+ z-UJT`T`^Mx`j=z)Eb$${Qg7ggf-cSUl-wDN$G<%}ecsaJ(=5I+GKlzI7d67YPWFnK zHD5UF@*9f-9_4DBN~sNnADhi}M<~79t=X7m4L95&O~u>=N$ih%L5hnnE|TtWtGM4A ziu>dhE&92wsA!JNkd6vX;`whvWYvhSm?#o_|`lGq{DPvtn*r@ zj`il)aX+`t;0UCzq_W5g|2zbB>N_B+&8MG7f2ungyZGx^b9Gqz4dD^Wo=z?`DY)&a z%=M$H^H)MbVsesMkn5Z z=Xo!ytk0I{cZ{c5x``JVIW0x0?mKJ&%p=$)a6oZUy-tH1x$!G~*&Av3+TIH}1q`;` zObR(p4AfmbXh+Z)5moyAFB0=HDp`vFmPMTKK$(*MaaJu*D$)eD^|`~7)_MoJ`nsEc zxkCdGycFpqZXS=u=mooWG>vsSc3`+WZQC59E1);ZTfN}3hB9t+f2+slaTs|(IPRXT zoeW7>8W1Y;)tOmrB$|n%wH^0AgE8}Lzd^6~e$@Y|)@w68Y6l+quJ7>h+W>WI=n3Ls zsbRlky7ePq-!pT{wL?w?jA%G@!VH=TDnYfiCmeZ?%Ke}wzu)U~aaN@^!F_QcjLh4x zjKqxu?8o@g`I3zR+DCfM;s`c=>j*}@KHwX?9qsLVjbOJBG27K^*)}%J4|4GMYeBbR z(VCYcSL3xsuXnBwU#at~pyjXw(Cn^!Oe%rcV0U+9?TdU!V3^y`b3TP|Sx?M>>~ljt znz%^HO~g7lg~5KPI~Tj!KLDW_p|<4UJL;f>5&qlaRq^lU+mvYNRid{vCdN-Wa$E5L z7sX}#6q!2f1z=-pz;P~I8LeBHtp?1gIWPl>48>D zZFmy$=;`w*@>K5O)*cAn(Eh9I#z)ICrK5V4WmQux8zc{z`tBREa_w&l4wsoFxWoA-3cV<)mpD9@GlsEd-rL`jG=mSa5G zHbYBCgL$ol_K4*n=qT%Ti3b1p;_QoJa(6Z&?VQdN&Pp-&m4N;q3S1K3_MzrjoT7Zx zRYb>)5AcDpogS=sM+2Zw4~)a}l(teJsA7g*q|$}G7wrp~yI2Va7C8n=Q^|?lrT|G> zI7^xd_z}z+%he=2)ni8o4jv{u0nz0&SdLQ|GO47}L8E32+A6jsqF*uI=ms!zO@l9h zCKHcQ1^?6l%1D;S;Mf62V%ap~zNO^7^TxDfkGVES4d?hyRF3$ExFvthSKApiiLc}e zFC#p0x-!ytD-5)sF&b$vy5nNl3c&<%!?sqhMjr8bMN%qCfcAKjXWN1_-oTLuJ8}3n z|CWRf{Z}W>_kPkOy6$yo?~PBTVex)IkVl+sdaT7SQ99j$qWZ35()h-4Xctl^c44{e z9CiQKjmrg^ToIh)>5KI9P`;V|?2TJFip+^?zs;#mc+%wzkM8Jacnt|H1jT1}ps0zG zqHX2^-TL$H5%GtdstOuOw9Pq{f23+-_f&$Vq^tK?>u2(-C-j1lBZuIYOb0;O2Wgf7S~@MVyk1zRfU9+kTRudZm&qs)&WM44=N1jt3$ zQH-Dix3*9TP=j{&;=;z+5w#pb#MLEkJn%j9Vvj7T*2-?O^Z86ul}|lf$13IC@n+jN z64!JPwiV_czapzCI9`H(R-^_IyfS+>?{pbna>SRZ_3HR>ylEZFZ`~WWxb7tW!q~|Z zjS!NDG${|Y`SMTiz5bx3_jHe(W44`7f_??vuE8)81HVg`1zU7>b9=Uz|qQAx_oM_Sa&lC#{0LB`WhVW7>6SW1USSKYA{%yyJ0=W8b6e1@U158dzL z)OSx*VG}|5)Pr}II&_8`ID&YzPFc6-?{{JNWH=GP6$lQgKSK@~C6SjUq2-vmEWEpC z2T7U|?=Ri=Jn_{`K1Ae<3Zm|2^2|OsL9>7`y;oAqqYj@=F5;JFtxiPqe-{aRF^wmh< znJeO9>0Ry-5%hXn5@MBJo;>8NuBeRyIdZXxI+a%UU8LAy+N#`IQS$ljdh6@a)`G=( zZuh5RyFbOJ|6D&+8abst&(+|!uQ@to9EG(ZY207=qGvEg3h6iISgsv`IVIA_ksQ|6IbQgSd2LA@e@AEpmA@0)AZoae3{?pMZTqeX=MSKalJKg|N& z)(Zp&N70YLRXPy+4m1LW0oGv;IM?3LCw@&d!prv|QbxTDa3O&#!cW!`n3=Zmf@ibloFCmkCp zTbbxZ$zHK?Zv}s7A4zAx-iet%56*_Z7$olMwf8OC$PSph$YcmNhsvpSH`+aTsv;A@ z5hV8nZq7A&6`Qnqrk8+PM-xyk!fPMogo07zZl>VSE0nb3dCV+hjU?4Ra09`IW)ZsO zzdTolXS0|+VLdA04nAwO!dkrHD&|*KxoRp3J-(SgC&XsfKJV}?jXslT<;YFnu$G>l zqLD@41)CLFtb4{D4&WjFIJJB|;l;Y3(Axv=Oc#R<`<2d;6C$OHKnfnHC74Bnq~}H% znx09G9ZcIgQdidC#9^jF^;G>+9X0|=RN%?s(rCMm%;_;?+Cp*H-`%*Z+SVeDy9U`4 z<~W8=QYz)oE`C8ASc1#-3+q!7cjW{)k% zJ!N{&Sn%_Rh!@nJsLEiiyfS}%b3(*dE`Trn7Q-R6`YSi)b`!Xtx#Tser3{e<17yxc z%!_ErDrp7$+fDh zBYXOuWMmgo86LO&`9-Rrg#AwZY$&WFx&``j##0)3^8soY_%-gimOQ*nDBArXdBii3 zn^S!HLfmN*`MZR-dias7n_F0183TX1N+49kbX^eY*D!{I`jIadD`P9Cb~Pt!hp0su z*gx1mWm?UY09P1*0;W3&b1YHrHIA5bOK8vENU#(nTYK5ZSPnoer))*A4OdP}j$W(B z58n5LhC2j#D5xFiCJ`9P$(O`u_=)9I>Tx;V<}!I76??VL@G8l$bYsNNJsSRMwGrJP zuDrM|l0HDof0=?H|D?U3GC~s+d(*K9<)Z{WlWLI5DSWU35I>hbNA3_ldTzLmH)n=N zr_J!%Ee2E)*`6foKMacd4-qUNg(zC;GBWlF0%mONR~56|8?c9cdHs}(OK`B4jZ1Wy zsf=Oq^j8s}xyLtVWIbZAXVH@a=m4)yk~V$%D-4)aoLM0q~a8gvdx1jkSzYQ z{A#gt5f%KTD^jwU@OE62sPa#deJ~(Lp7@)z^EXBia^)plo};>wfZ$?j&pH77EQ;JdbiHDH#T>?HxMdKtc0+0CjekJNp zMkN6%q8Lt(lh!Q97L_Xv#x@I1BOg{0X_D;Y2cYIE)JrUI~v* z61Ig*7!$q^GM-+z{&Uld6(ocvE(jV?uVO(yIQTnioJzc*JT-M0nt8?Lc{orFYsDQ`8s9LX|MmHng!wYilLkxlE9?qbBoekqUY^A(@MSfyGsur2CLM3@3lrx@nJ8h6) zQx`qHD6;x?$c}5qu&d@EYvQ@u2;Ic>BY#bSQxfu;gbH9&LNLY;Ojo9m0fn+)+DS^bpJUx`!edy zCk^DitL>EW_g1%l&kK@g?$?V=>@;7H4%-}w0o^E{H{>1{KMz#p98?NQRg2QSJ{8cM zHCE`Id&2TADX&rGOVa*0YT>!%yaMz&&I03_^O$B{?;+9bSlx`r5DmlMQI#Xio$w%y zlZ}m;-zbI#%k{R@zW4tg@o`=FZ|2%+oql=Q{f9R?#nZhz6HjaV)C<|C&mYO(w&5pOQ1Ae=uPlw&#UF2 z&TvW;f&O+IiR!z(b(eKDqN>2>@=)vXmxJIAdF9!E$HZ?5y^oQkO|9O}?RAaHbIpde zq8m%QFOwYrnq0mHo7&$mdSf%Y)YZZh@?vEHqFs)lqYGV6Jmi^kPZ?7QKf$!{&mX?1 z?WHWIN?7L$$gXg5PG7yOD+Ds9S22`?&gEMKvW)WPjN&3Nf%+omnqAmJ*Vkv~>P4;!iq9)h~Y5R_U<13{TVU*@n}{x>fAK8XK1GKu!9#0nL-H- zVYuPjN2fxEOy{)D$YY8WpWwP9R;wF)gqNk#nSTZCDmNWh1R_;LkM6sT_-Z!>82@B|B)HIN*h5DMwT5LS>L%e(6V<7EPCiabzRt?{mL=lSZtnXdzujlYS01ll%JbJqs zh+td6^37*Ycj{wyTFz!fke(3%Oc~39Nh>QIByQAuo zi5wN}_$5c-(V94ST7j(b0RpNG=+b6y$prry0%4k`_#SeDKzQwfY`krJLWUg$z{$D9 z6RJ0qAMRP*p9WVSFc}apgI$^T^4uR4jaXJOB&VknOzMK4-%n(dEsdbK3kw}Z1mK%d z#=GcaT?F9xlGs45_bLpmlst>kYM(0iqi_PQGQsIuPZNwD-KI5wJt{!a&!Dxg6XdOuu`0)<{y-dK9cR(L z1g}Yaaa+-MTkzNB!t)BUM?=xV%)Cd&9kL~$QfPu8)ZDN-YA{HR=okOGPLlq2c7DIh zfKY1PSE2BsLn^YxbBhsf1B_OySI2oG5+d*lkc`TkHyQjKkud6i4G{deTYN3Q#0|Xs zCmt;_sd5P=A z#wU5yFxtMOLJUF%8yyw0VegJ|tm|lktVYNreKm-@vVnuD95{1KUunmV7+I% z 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

$|rZ^{loK7cQa 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%0DoC8wsQ;^R+E%mNIb?HEHpB(pH=)Huw>Hya?` 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