This is the 5.10.137 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmMCMDQACgkQONu9yGCS aT6TwRAAvj1dnV1nLVVNET3jcelTO65SVUUpQjiyGD1npZQaQdH5PoGR0VhMWk7y mLUIwJyp/rR7+OLD3BMFwxDimDWHviFGdbmm/8fsyDrARuOeRd/M1fvtHXjIRQdb nOvfo1yTQWp4xA1k/JwJZslkvRFDsofXWHCRf+ffEryTRanFAVc7u5aFIg92W0b/ JWYWEFe99C4TJ7LACpDoGaP9gE6WXsupaxSZBIu+Wxa+PfDmIeRRTkQn+j4Khn0h I6w+LkLd6ZP3l7sbe9KfS9ZGo1wWLgSng4zz742Z9IaFgxyj2ArS9tNsYCLkkhAM gLSXXkiPBAxUvAtDxR1tc0YROHc1bjAttSoxNXcaaacspSo/Vi0VAtp7t6boK0bI /8P3dh+Hq9u/Q1ClhZtVoFpp+GVj0fDbDd56qVcr2Cp6IokpqRJog1Jhgj0CVCoG iElr3n0+y7/IZfmE6/U1cK00SNcW86e2YduuIy4ifCawRT574zkRiSYZalpaO3qM z1lF9p+zUNq3v2q0wxXuBDLi/yPoJzbJgmCGScj4ryjjr6TOvR1udSVWkJ02dR4H s9km3lNLgoUPCYCLBMlZl7em4T49E09/+4YCrnj/Ezp+YdImf2+QzZyd/gG3ITl2 fW7lpbK1dx3d/19JFP6Xkj9PaIlMl9e8Ne04G+Dabv67uN+0U+g= =Z4rz -----END PGP SIGNATURE----- Merge 5.10.137 into android12-5.10-lts Changes in 5.10.137 Makefile: link with -z noexecstack --no-warn-rwx-segments x86: link vdso and boot with -z noexecstack --no-warn-rwx-segments Revert "pNFS: nfs3_set_ds_client should set NFS_CS_NOPING" scsi: Revert "scsi: qla2xxx: Fix disk failure to rediscover" ALSA: bcd2000: Fix a UAF bug on the error path of probing ALSA: hda/realtek: Add quirk for Clevo NV45PZ ALSA: hda/realtek: Add quirk for HP Spectre x360 15-eb0xxx wifi: mac80211_hwsim: fix race condition in pending packet wifi: mac80211_hwsim: add back erroneously removed cast wifi: mac80211_hwsim: use 32-bit skb cookie add barriers to buffer_uptodate and set_buffer_uptodate HID: wacom: Only report rotation for art pen HID: wacom: Don't register pad_input for touch switch KVM: nVMX: Snapshot pre-VM-Enter BNDCFGS for !nested_run_pending case KVM: nVMX: Snapshot pre-VM-Enter DEBUGCTL for !nested_run_pending case KVM: SVM: Don't BUG if userspace injects an interrupt with GIF=0 KVM: s390: pv: don't present the ecall interrupt twice KVM: nVMX: Let userspace set nVMX MSR to any _host_ supported value KVM: x86: Mark TSS busy during LTR emulation _after_ all fault checks KVM: x86: Set error code to segment selector on LLDT/LTR non-canonical #GP KVM: x86: Tag kvm_mmu_x86_module_init() with __init riscv: set default pm_power_off to NULL mm: Add kvrealloc() xfs: only set IOMAP_F_SHARED when providing a srcmap to a write xfs: fix I_DONTCACHE mm/mremap: hold the rmap lock in write mode when moving page table entries. ALSA: hda/conexant: Add quirk for LENOVO 20149 Notebook model ALSA: hda/cirrus - support for iMac 12,1 model ALSA: hda/realtek: Add quirk for another Asus K42JZ model ALSA: hda/realtek: Add a quirk for HP OMEN 15 (8786) mute LED tty: vt: initialize unicode screen buffer vfs: Check the truncate maximum size in inode_newsize_ok() fs: Add missing umask strip in vfs_tmpfile thermal: sysfs: Fix cooling_device_stats_setup() error code path fbcon: Fix boundary checks for fbcon=vc:n1-n2 parameters fbcon: Fix accelerated fbdev scrolling while logo is still shown usbnet: Fix linkwatch use-after-free on disconnect ovl: drop WARN_ON() dentry is NULL in ovl_encode_fh() parisc: Fix device names in /proc/iomem parisc: Check the return value of ioremap() in lba_driver_probe() parisc: io_pgetevents_time64() needs compat syscall in 32-bit compat mode drm/gem: Properly annotate WW context on drm_gem_lock_reservations() error drm/vc4: hdmi: Disable audio if dmas property is present but empty drm/nouveau: fix another off-by-one in nvbios_addr drm/nouveau: Don't pm_runtime_put_sync(), only pm_runtime_put_autosuspend() drm/nouveau/acpi: Don't print error when we get -EINPROGRESS from pm_runtime drm/amdgpu: Check BO's requested pinning domains against its preferred_domains mtd: rawnand: arasan: Update NAND bus clock instead of system clock iio: light: isl29028: Fix the warning in isl29028_remove() scsi: sg: Allow waiting for commands to complete on removed device scsi: qla2xxx: Fix incorrect display of max frame size scsi: qla2xxx: Zero undefined mailbox IN registers fuse: limit nsec serial: mvebu-uart: uart2 error bits clearing md-raid: destroy the bitmap after destroying the thread md-raid10: fix KASAN warning media: [PATCH] pci: atomisp_cmd: fix three missing checks on list iterator ia64, processor: fix -Wincompatible-pointer-types in ia64_get_irr() PCI: Add defines for normal and subtractive PCI bridges powerpc/fsl-pci: Fix Class Code of PCIe Root Port powerpc/ptdump: Fix display of RW pages on FSL_BOOK3E powerpc/powernv: Avoid crashing if rng is NULL MIPS: cpuinfo: Fix a warning for CONFIG_CPUMASK_OFFSTACK coresight: Clear the connection field properly usb: typec: ucsi: Acknowledge the GET_ERROR_STATUS command completion USB: HCD: Fix URB giveback issue in tasklet function ARM: dts: uniphier: Fix USB interrupts for PXs2 SoC arm64: dts: uniphier: Fix USB interrupts for PXs3 SoC usb: dwc3: gadget: refactor dwc3_repare_one_trb usb: dwc3: gadget: fix high speed multiplier setting lockdep: Allow tuning tracing capacity constants. netfilter: nf_tables: do not allow SET_ID to refer to another table netfilter: nf_tables: do not allow CHAIN_ID to refer to another table netfilter: nf_tables: do not allow RULE_ID to refer to another chain netfilter: nf_tables: fix null deref due to zeroed list head epoll: autoremove wakers even more aggressively x86: Handle idle=nomwait cmdline properly for x86_idle arm64: Do not forget syscall when starting a new thread. arm64: fix oops in concurrently setting insn_emulation sysctls ext2: Add more validity checks for inode counts genirq: Don't return error on missing optional irq_request_resources() irqchip/mips-gic: Only register IPI domain when SMP is enabled genirq: GENERIC_IRQ_IPI depends on SMP irqchip/mips-gic: Check the return value of ioremap() in gic_of_init() wait: Fix __wait_event_hrtimeout for RT/DL tasks ARM: dts: imx6ul: add missing properties for sram ARM: dts: imx6ul: change operating-points to uint32-matrix ARM: dts: imx6ul: fix keypad compatible ARM: dts: imx6ul: fix csi node compatible ARM: dts: imx6ul: fix lcdif node compatible ARM: dts: imx6ul: fix qspi node compatible ARM: dts: BCM5301X: Add DT for Meraki MR26 spi: synquacer: Add missing clk_disable_unprepare() ARM: OMAP2+: display: Fix refcount leak bug ACPI: EC: Remove duplicate ThinkPad X1 Carbon 6th entry from DMI quirks ACPI: EC: Drop the EC_FLAGS_IGNORE_DSDT_GPE quirk ACPI: PM: save NVS memory for Lenovo G40-45 ACPI: LPSS: Fix missing check in register_device_clock() arm64: dts: qcom: ipq8074: fix NAND node name arm64: dts: allwinner: a64: orangepi-win: Fix LED node name ARM: shmobile: rcar-gen2: Increase refcount for new reference firmware: tegra: Fix error check return value of debugfs_create_file() PM: hibernate: defer device probing when resuming from hibernation selinux: Add boundary check in put_entry() powerpc/64s: Disable stack variable initialisation for prom_init spi: spi-rspi: Fix PIO fallback on RZ platforms ARM: findbit: fix overflowing offset meson-mx-socinfo: Fix refcount leak in meson_mx_socinfo_init arm64: dts: renesas: beacon: Fix regulator node names ARM: bcm: Fix refcount leak in bcm_kona_smc_init ACPI: processor/idle: Annotate more functions to live in cpuidle section ARM: dts: imx7d-colibri-emmc: add cpu1 supply Input: atmel_mxt_ts - fix up inverted RESET handler soc: renesas: r8a779a0-sysc: Fix A2DP1 and A2CV[2357] PDR values soc: amlogic: Fix refcount leak in meson-secure-pwrc.c arm64: dts: renesas: Fix thermal-sensors on single-zone sensors x86/pmem: Fix platform-device leak in error path ARM: dts: ast2500-evb: fix board compatible ARM: dts: ast2600-evb: fix board compatible hexagon: select ARCH_WANT_LD_ORPHAN_WARN arm64: cpufeature: Allow different PMU versions in ID_DFR0_EL1 locking/lockdep: Fix lockdep_init_map_*() confusion soc: fsl: guts: machine variable might be unset block: fix infinite loop for invalid zone append ARM: dts: qcom: mdm9615: add missing PMIC GPIO reg ARM: OMAP2+: Fix refcount leak in omapdss_init_of ARM: OMAP2+: Fix refcount leak in omap3xxx_prm_late_init cpufreq: zynq: Fix refcount leak in zynq_get_revision regulator: qcom_smd: Fix pm8916_pldo range ACPI: APEI: Fix _EINJ vs EFI_MEMORY_SP soc: qcom: ocmem: Fix refcount leak in of_get_ocmem soc: qcom: aoss: Fix refcount leak in qmp_cooling_devices_register ARM: dts: qcom: pm8841: add required thermal-sensor-cells bus: hisi_lpc: fix missing platform_device_put() in hisi_lpc_acpi_probe() arm64: dts: mt7622: fix BPI-R64 WPS button arm64: tegra: Fix SDMMC1 CD on P2888 erofs: avoid consecutive detection for Highmem memory blk-mq: don't create hctx debugfs dir until q->debugfs_dir is created hwmon: (drivetemp) Add module alias block: remove the request_queue to argument request based tracepoints blktrace: Trace remapped requests correctly regulator: of: Fix refcount leak bug in of_get_regulation_constraints() soc: qcom: Make QCOM_RPMPD depend on PM arm64: dts: qcom: qcs404: Fix incorrect USB2 PHYs assignment drivers/perf: arm_spe: Fix consistency of SYS_PMSCR_EL1.CX nohz/full, sched/rt: Fix missed tick-reenabling bug in dequeue_task_rt() selftests/seccomp: Fix compile warning when CC=clang thermal/tools/tmon: Include pthread and time headers in tmon.h dm: return early from dm_pr_call() if DM device is suspended pwm: sifive: Don't check the return code of pwmchip_remove() pwm: sifive: Simplify offset calculation for PWMCMP registers pwm: sifive: Ensure the clk is enabled exactly once per running PWM pwm: sifive: Shut down hardware only after pwmchip_remove() completed pwm: lpc18xx-sct: Convert to devm_platform_ioremap_resource() drm/bridge: tc358767: Move (e)DP bridge endpoint parsing into dedicated function drm/bridge: tc358767: Make sure Refclk clock are enabled ath10k: do not enforce interrupt trigger type drm/st7735r: Fix module autoloading for Okaya RH128128T wifi: rtlwifi: fix error codes in rtl_debugfs_set_write_h2c() ath11k: fix netdev open race drm/mipi-dbi: align max_chunk to 2 in spi_transfer ath11k: Fix incorrect debug_mask mappings drm/radeon: fix potential buffer overflow in ni_set_mc_special_registers() drm/mediatek: Modify dsi funcs to atomic operations drm/mediatek: Separate poweron/poweroff from enable/disable and define new funcs drm/mediatek: Add pull-down MIPI operation in mtk_dsi_poweroff function i2c: npcm: Remove own slave addresses 2:10 i2c: npcm: Correct slave role behavior virtio-gpu: fix a missing check to avoid NULL dereference drm: adv7511: override i2c address of cec before accessing it crypto: sun8i-ss - do not allocate memory when handling hash requests crypto: sun8i-ss - fix error codes in allocate_flows() net: fix sk_wmem_schedule() and sk_rmem_schedule() errors i2c: Fix a potential use after free crypto: sun8i-ss - fix infinite loop in sun8i_ss_setup_ivs() media: tw686x: Register the irq at the end of probe ath9k: fix use-after-free in ath9k_hif_usb_rx_cb wifi: iwlegacy: 4965: fix potential off-by-one overflow in il4965_rs_fill_link_cmd() drm/radeon: fix incorrrect SPDX-License-Identifiers test_bpf: fix incorrect netdev features crypto: ccp - During shutdown, check SEV data pointer before using drm: bridge: adv7511: Add check for mipi_dsi_driver_register drm/mcde: Fix refcount leak in mcde_dsi_bind media: hdpvr: fix error value returns in hdpvr_read media: v4l2-mem2mem: prevent pollerr when last_buffer_dequeued is set media: tw686x: Fix memory leak in tw686x_video_init drm/vc4: plane: Remove subpixel positioning check drm/vc4: plane: Fix margin calculations for the right/bottom edges drm/vc4: dsi: Correct DSI divider calculations drm/vc4: dsi: Correct pixel order for DSI0 drm/vc4: drv: Remove the DSI pointer in vc4_drv drm/vc4: dsi: Use snprintf for the PHY clocks instead of an array drm/vc4: dsi: Introduce a variant structure drm/vc4: dsi: Register dsi0 as the correct vc4 encoder type drm/vc4: dsi: Fix dsi0 interrupt support drm/vc4: dsi: Add correct stop condition to vc4_dsi_encoder_disable iteration drm/vc4: hdmi: Remove firmware logic for MAI threshold setting drm/vc4: hdmi: Avoid full hdmi audio fifo writes drm/vc4: hdmi: Don't access the connector state in reset if kmalloc fails drm/vc4: hdmi: Limit the BCM2711 to the max without scrambling drm/vc4: hdmi: Fix timings for interlaced modes drm/vc4: hdmi: Correct HDMI timing registers for interlaced modes crypto: arm64/gcm - Select AEAD for GHASH_ARM64_CE selftests/xsk: Destroy BPF resources only when ctx refcount drops to 0 drm/rockchip: vop: Don't crash for invalid duplicate_state() drm/rockchip: Fix an error handling path rockchip_dp_probe() drm/mediatek: dpi: Remove output format of YUV drm/mediatek: dpi: Only enable dpi after the bridge is enabled drm: bridge: sii8620: fix possible off-by-one lib: bitmap: order includes alphabetically lib: bitmap: provide devm_bitmap_alloc() and devm_bitmap_zalloc() hinic: Use the bitmap API when applicable net: hinic: fix bug that ethtool get wrong stats net: hinic: avoid kernel hung in hinic_get_stats64() drm/msm/mdp5: Fix global state lock backoff crypto: hisilicon/sec - fixes some coding style crypto: hisilicon/sec - don't sleep when in softirq crypto: hisilicon - Kunpeng916 crypto driver don't sleep when in softirq media: platform: mtk-mdp: Fix mdp_ipi_comm structure alignment mt76: mt76x02u: fix possible memory leak in __mt76x02u_mcu_send_msg mediatek: mt76: mac80211: Fix missing of_node_put() in mt76_led_init() drm/exynos/exynos7_drm_decon: free resources when clk_set_parent() failed. tcp: make retransmitted SKB fit into the send window libbpf: Fix the name of a reused map selftests: timers: valid-adjtimex: build fix for newer toolchains selftests: timers: clocksource-switch: fix passing errors from child bpf: Fix subprog names in stack traces. fs: check FMODE_LSEEK to control internal pipe splicing wifi: wil6210: debugfs: fix info leak in wil_write_file_wmi() wifi: p54: Fix an error handling path in p54spi_probe() wifi: p54: add missing parentheses in p54_flush() selftests/bpf: fix a test for snprintf() overflow can: pch_can: do not report txerr and rxerr during bus-off can: rcar_can: do not report txerr and rxerr during bus-off can: sja1000: do not report txerr and rxerr during bus-off can: hi311x: do not report txerr and rxerr during bus-off can: sun4i_can: do not report txerr and rxerr during bus-off can: kvaser_usb_hydra: do not report txerr and rxerr during bus-off can: kvaser_usb_leaf: do not report txerr and rxerr during bus-off can: usb_8dev: do not report txerr and rxerr during bus-off can: error: specify the values of data[5..7] of CAN error frames can: pch_can: pch_can_error(): initialize errc before using it Bluetooth: hci_intel: Add check for platform_driver_register i2c: cadence: Support PEC for SMBus block read i2c: mux-gpmux: Add of_node_put() when breaking out of loop wifi: wil6210: debugfs: fix uninitialized variable use in `wil_write_file_wmi()` wifi: iwlwifi: mvm: fix double list_add at iwl_mvm_mac_wake_tx_queue wifi: libertas: Fix possible refcount leak in if_usb_probe() media: cedrus: hevc: Add check for invalid timestamp net/mlx5e: Remove WARN_ON when trying to offload an unsupported TLS cipher/version net/mlx5e: Fix the value of MLX5E_MAX_RQ_NUM_MTTS crypto: hisilicon/hpre - don't use GFP_KERNEL to alloc mem during softirq crypto: inside-secure - Add missing MODULE_DEVICE_TABLE for of crypto: hisilicon/sec - fix auth key size error inet: add READ_ONCE(sk->sk_bound_dev_if) in INET_MATCH() tcp: sk->sk_bound_dev_if once in inet_request_bound_dev_if() ipv6: add READ_ONCE(sk->sk_bound_dev_if) in INET6_MATCH() tcp: Fix data-races around sysctl_tcp_l3mdev_accept. net: allow unbound socket for packets in VRF when tcp_l3mdev_accept set iavf: Fix max_rate limiting netdevsim: Avoid allocation warnings triggered from user space net: rose: fix netdev reference changes net: ionic: fix error check for vlan flags in ionic_set_nic_features() dccp: put dccp_qpolicy_full() and dccp_qpolicy_push() in the same lock wireguard: ratelimiter: use hrtimer in selftest wireguard: allowedips: don't corrupt stack when detecting overflow clk: renesas: r9a06g032: Fix UART clkgrp bitsel mtd: maps: Fix refcount leak in of_flash_probe_versatile mtd: maps: Fix refcount leak in ap_flash_init mtd: rawnand: meson: Fix a potential double free issue PCI: tegra194: Fix PM error handling in tegra_pcie_config_ep() HID: cp2112: prevent a buffer overflow in cp2112_xfer() mtd: sm_ftl: Fix deadlock caused by cancel_work_sync in sm_release mtd: partitions: Fix refcount leak in parse_redboot_of mtd: st_spi_fsm: Add a clk_disable_unprepare() in .probe()'s error path fpga: altera-pr-ip: fix unsigned comparison with less than zero usb: host: Fix refcount leak in ehci_hcd_ppc_of_probe usb: ohci-nxp: Fix refcount leak in ohci_hcd_nxp_probe usb: gadget: tegra-xudc: Fix error check in tegra_xudc_powerdomain_init() usb: xhci: tegra: Fix error check netfilter: xtables: Bring SPDX identifier back iio: accel: bma400: Fix the scale min and max macro values platform/chrome: cros_ec: Always expose last resume result iio: accel: bma400: Reordering of header files clk: mediatek: reset: Fix written reset bit offset KVM: Don't set Accessed/Dirty bits for ZERO_PAGE mwifiex: Ignore BTCOEX events from the 88W8897 firmware mwifiex: fix sleep in atomic context bugs caused by dev_coredumpv dmaengine: dw-edma: Fix eDMA Rd/Wr-channels and DMA-direction semantics misc: rtsx: Fix an error handling path in rtsx_pci_probe() driver core: fix potential deadlock in __driver_attach clk: qcom: clk-krait: unlock spin after mux completion usb: host: xhci: use snprintf() in xhci_decode_trb() clk: qcom: ipq8074: fix NSS core PLL-s clk: qcom: ipq8074: SW workaround for UBI32 PLL lock clk: qcom: ipq8074: fix NSS port frequency tables clk: qcom: ipq8074: set BRANCH_HALT_DELAY flag for UBI clocks clk: qcom: camcc-sdm845: Fix topology around titan_top power domain PCI: dwc: Add unroll iATU space support to dw_pcie_disable_atu() PCI: dwc: Deallocate EPC memory on dw_pcie_ep_init() errors PCI: dwc: Always enable CDM check if "snps,enable-cdm-check" exists soundwire: bus_type: fix remove and shutdown support KVM: arm64: Don't return from void function dmaengine: sf-pdma: apply proper spinlock flags in sf_pdma_prep_dma_memcpy() dmaengine: sf-pdma: Add multithread support for a DMA channel PCI: endpoint: Don't stop controller when unbinding endpoint function intel_th: Fix a resource leak in an error handling path intel_th: msu-sink: Potential dereference of null pointer intel_th: msu: Fix vmalloced buffers staging: rtl8192u: Fix sleep in atomic context bug in dm_fsync_timer_callback mmc: sdhci-of-esdhc: Fix refcount leak in esdhc_signal_voltage_switch memstick/ms_block: Fix some incorrect memory allocation memstick/ms_block: Fix a memory leak mmc: sdhci-of-at91: fix set_uhs_signaling rewriting of MC1R mmc: block: Add single read for 4k sector cards KVM: s390: pv: leak the topmost page table when destroy fails PCI/portdrv: Don't disable AER reporting in get_port_device_capability() PCI: qcom: Set up rev 2.1.0 PARF_PHY before enabling clocks scsi: smartpqi: Fix DMA direction for RAID requests xtensa: iss/network: provide release() callback xtensa: iss: fix handling error cases in iss_net_configure() usb: gadget: udc: amd5536 depends on HAS_DMA usb: aspeed-vhub: Fix refcount leak bug in ast_vhub_init_desc() usb: dwc3: core: Deprecate GCTL.CORESOFTRESET usb: dwc3: core: Do not perform GCTL_CORE_SOFTRESET during bootup usb: dwc3: qcom: fix missing optional irq warnings eeprom: idt_89hpesx: uninitialized data in idt_dbgfs_csr_write() interconnect: imx: fix max_node_id um: random: Don't initialise hwrng struct with zero RDMA/rtrs: Define MIN_CHUNK_SIZE RDMA/rtrs: Avoid Wtautological-constant-out-of-range-compare RDMA/rtrs-srv: Fix modinfo output for stringify RDMA/qedr: Improve error logs for rdma_alloc_tid error return RDMA/qedr: Fix potential memory leak in __qedr_alloc_mr() RDMA/hns: Fix incorrect clearing of interrupt status register RDMA/siw: Fix duplicated reported IW_CM_EVENT_CONNECT_REPLY event RDMA/hfi1: fix potential memory leak in setup_base_ctxt() gpio: gpiolib-of: Fix refcount bugs in of_mm_gpiochip_add_data() HID: mcp2221: prevent a buffer overflow in mcp_smbus_write() mmc: cavium-octeon: Add of_node_put() when breaking out of loop mmc: cavium-thunderx: Add of_node_put() when breaking out of loop HID: alps: Declare U1_UNICORN_LEGACY support PCI: tegra194: Fix Root Port interrupt handling PCI: tegra194: Fix link up retry sequence USB: serial: fix tty-port initialized comments usb: cdns3: change place of 'priv_ep' assignment in cdns3_gadget_ep_dequeue(), cdns3_gadget_ep_enable() platform/olpc: Fix uninitialized data in debugfs write RDMA/srpt: Duplicate port name members RDMA/srpt: Introduce a reference count in struct srpt_device RDMA/srpt: Fix a use-after-free mm/mmap.c: fix missing call to vm_unacct_memory in mmap_region selftests: kvm: set rax before vmcall RDMA/mlx5: Add missing check for return value in get namespace flow RDMA/rxe: Fix error unwind in rxe_create_qp() null_blk: fix ida error handling in null_add_dev() nvme: use command_id instead of req->tag in trace_nvme_complete_rq() jbd2: fix outstanding credits assert in jbd2_journal_commit_transaction() ext4: recover csum seed of tmp_inode after migrating to extents jbd2: fix assertion 'jh->b_frozen_data == NULL' failure when journal aborted usb: cdns3: Don't use priv_dev uninitialized in cdns3_gadget_ep_enable() opp: Fix error check in dev_pm_opp_attach_genpd() ASoC: cros_ec_codec: Fix refcount leak in cros_ec_codec_platform_probe ASoC: samsung: Fix error handling in aries_audio_probe ASoC: mediatek: mt8173: Fix refcount leak in mt8173_rt5650_rt5676_dev_probe ASoC: mt6797-mt6351: Fix refcount leak in mt6797_mt6351_dev_probe ASoC: codecs: da7210: add check for i2c_add_driver ASoC: mediatek: mt8173-rt5650: Fix refcount leak in mt8173_rt5650_dev_probe serial: 8250: Export ICR access helpers for internal use serial: 8250_dw: Store LSR into lsr_saved_flags in dw8250_tx_wait_empty() ASoC: codecs: msm8916-wcd-digital: move gains from SX_TLV to S8_TLV ASoC: codecs: wcd9335: move gains from SX_TLV to S8_TLV rpmsg: mtk_rpmsg: Fix circular locking dependency remoteproc: k3-r5: Fix refcount leak in k3_r5_cluster_of_init selftests/livepatch: better synchronize test_klp_callbacks_busy profiling: fix shift too large makes kernel panic ASoC: samsung: h1940_uda1380: include proepr GPIO consumer header powerpc/perf: Optimize clearing the pending PMI and remove WARN_ON for PMI check in power_pmu_disable ASoC: samsung: change gpiod_speaker_power and rx1950_audio from global to static variables tty: n_gsm: Delete gsmtty open SABM frame when config requester tty: n_gsm: fix user open not possible at responder until initiator open tty: n_gsm: fix wrong queuing behavior in gsm_dlci_data_output() tty: n_gsm: fix non flow control frames during mux flow off tty: n_gsm: fix packet re-transmission without open control channel tty: n_gsm: fix race condition in gsmld_write() ASoC: qcom: Fix missing of_node_put() in asoc_qcom_lpass_cpu_platform_probe() remoteproc: qcom: wcnss: Fix handling of IRQs vfio: Remove extra put/gets around vfio_device->group vfio: Simplify the lifetime logic for vfio_device vfio: Split creation of a vfio_device into init and register ops vfio/mdev: Make to_mdev_device() into a static inline vfio/ccw: Do not change FSM state in subchannel event tty: n_gsm: fix wrong T1 retry count handling tty: n_gsm: fix DM command tty: n_gsm: fix missing corner cases in gsmld_poll() iommu/exynos: Handle failed IOMMU device registration properly rpmsg: qcom_smd: Fix refcount leak in qcom_smd_parse_edge kfifo: fix kfifo_to_user() return type lib/smp_processor_id: fix imbalanced instrumentation_end() call remoteproc: sysmon: Wait for SSCTL service to come up mfd: t7l66xb: Drop platform disable callback mfd: max77620: Fix refcount leak in max77620_initialise_fps iommu/arm-smmu: qcom_iommu: Add of_node_put() when breaking out of loop perf tools: Fix dso_id inode generation comparison s390/dump: fix old lowcore virtual vs physical address confusion s390/zcore: fix race when reading from hardware system area ASoC: fsl_easrc: use snd_pcm_format_t type for sample_format ASoC: qcom: q6dsp: Fix an off-by-one in q6adm_alloc_copp() fuse: Remove the control interface for virtio-fs ASoC: audio-graph-card: Add of_node_put() in fail path watchdog: armada_37xx_wdt: check the return value of devm_ioremap() in armada_37xx_wdt_probe() video: fbdev: amba-clcd: Fix refcount leak bugs video: fbdev: sis: fix typos in SiS_GetModeID() ASoC: mchp-spdifrx: disable end of block interrupt on failures powerpc/32: Do not allow selection of e5500 or e6500 CPUs on PPC32 powerpc/pci: Prefer PCI domain assignment via DT 'linux,pci-domain' and alias f2fs: don't set GC_FAILURE_PIN for background GC f2fs: write checkpoint during FG_GC f2fs: fix to remove F2FS_COMPR_FL and tag F2FS_NOCOMP_FL at the same time powerpc/spufs: Fix refcount leak in spufs_init_isolated_loader powerpc/xive: Fix refcount leak in xive_get_max_prio powerpc/cell/axon_msi: Fix refcount leak in setup_msi_msg_address perf symbol: Fail to read phdr workaround kprobes: Forbid probing on trampoline and BPF code areas powerpc/pci: Fix PHB numbering when using opal-phbid genelf: Use HAVE_LIBCRYPTO_SUPPORT, not the never defined HAVE_LIBCRYPTO scripts/faddr2line: Fix vmlinux detection on arm64 sched/deadline: Merge dl_task_can_attach() and dl_cpu_busy() sched, cpuset: Fix dl_cpu_busy() panic due to empty cs->cpus_allowed x86/numa: Use cpumask_available instead of hardcoded NULL check video: fbdev: arkfb: Fix a divide-by-zero bug in ark_set_pixclock() tools/thermal: Fix possible path truncations sched: Fix the check of nr_running at queue wakelist x86/entry: Build thunk_$(BITS) only if CONFIG_PREEMPTION=y video: fbdev: vt8623fb: Check the size of screen before memset_io() video: fbdev: arkfb: Check the size of screen before memset_io() video: fbdev: s3fb: Check the size of screen before memset_io() scsi: zfcp: Fix missing auto port scan and thus missing target ports scsi: qla2xxx: Fix discovery issues in FC-AL topology scsi: qla2xxx: Turn off multi-queue for 8G adapters scsi: qla2xxx: Fix erroneous mailbox timeout after PCI error injection scsi: qla2xxx: Fix losing FCP-2 targets on long port disable with I/Os scsi: qla2xxx: Fix losing FCP-2 targets during port perturbation tests x86/bugs: Enable STIBP for IBPB mitigated RETBleed ftrace/x86: Add back ftrace_expected assignment x86/olpc: fix 'logical not is only applied to the left hand side' posix-cpu-timers: Cleanup CPU timers before freeing them during exec Input: gscps2 - check return value of ioremap() in gscps2_probe() __follow_mount_rcu(): verify that mount_lock remains unchanged spmi: trace: fix stack-out-of-bound access in SPMI tracing functions drm/i915/dg1: Update DMC_DEBUG3 register drm/mediatek: Allow commands to be sent during video mode drm/mediatek: Keep dsi as LP00 before dcs cmds transfer HID: Ignore battery for Elan touchscreen on HP Spectre X360 15-df0xxx HID: hid-input: add Surface Go battery quirk drm/vc4: drv: Adopt the dma configuration from the HVS or V3D component mtd: rawnand: Add a helper to clarify the interface configuration mtd: rawnand: arasan: Check the proposed data interface is supported mtd: rawnand: Add NV-DDR timings mtd: rawnand: arasan: Fix a macro parameter mtd: rawnand: arasan: Support NV-DDR interface mtd: rawnand: arasan: Fix clock rate in NV-DDR usbnet: smsc95xx: Don't clear read-only PHY interrupt usbnet: smsc95xx: Avoid link settings race on interrupt reception firmware: arm_scpi: Ensure scpi_info is not assigned if the probe fails intel_th: pci: Add Meteor Lake-P support intel_th: pci: Add Raptor Lake-S PCH support intel_th: pci: Add Raptor Lake-S CPU support KVM: set_msr_mce: Permit guests to ignore single-bit ECC errors KVM: x86: Signal #GP, not -EPERM, on bad WRMSR(MCi_CTL/STATUS) iommu/vt-d: avoid invalid memory access via node_online(NUMA_NO_NODE) PCI/AER: Write AER Capability only when we control it PCI/ERR: Bind RCEC devices to the Root Port driver PCI/ERR: Rename reset_link() to reset_subordinates() PCI/ERR: Simplify by using pci_upstream_bridge() PCI/ERR: Simplify by computing pci_pcie_type() once PCI/ERR: Use "bridge" for clarity in pcie_do_recovery() PCI/ERR: Avoid negated conditional for clarity PCI/ERR: Add pci_walk_bridge() to pcie_do_recovery() PCI/ERR: Recover from RCEC AER errors PCI/AER: Iterate over error counters instead of error strings serial: 8250: Dissociate 4MHz Titan ports from Oxford ports serial: 8250: Correct the clock for OxSemi PCIe devices serial: 8250_pci: Refactor the loop in pci_ite887x_init() serial: 8250_pci: Replace dev_*() by pci_*() macros serial: 8250: Fold EndRun device support into OxSemi Tornado code dm writecache: set a default MAX_WRITEBACK_JOBS kexec, KEYS, s390: Make use of built-in and secondary keyring for signature verification dm thin: fix use-after-free crash in dm_sm_register_threshold_callback timekeeping: contribute wall clock to rng on time change um: Allow PM with suspend-to-idle btrfs: reject log replay if there is unsupported RO compat flag btrfs: reset block group chunk force if we have to wait ACPI: CPPC: Do not prevent CPPC from working in the future KVM: VMX: Drop guest CPUID check for VMXE in vmx_set_cr4() KVM: VMX: Drop explicit 'nested' check from vmx_set_cr4() KVM: SVM: Drop VMXE check from svm_set_cr4() KVM: x86: Move vendor CR4 validity check to dedicated kvm_x86_ops hook KVM: nVMX: Inject #UD if VMXON is attempted with incompatible CR0/CR4 KVM: x86/pmu: preserve IA32_PERF_CAPABILITIES across CPUID refresh KVM: x86/pmu: Use binary search to check filtered events KVM: x86/pmu: Use different raw event masks for AMD and Intel KVM: x86/pmu: Introduce the ctrl_mask value for fixed counter KVM: VMX: Mark all PERF_GLOBAL_(OVF)_CTRL bits reserved if there's no vPMU KVM: x86/pmu: Ignore pmu->global_ctrl check if vPMU doesn't support global_ctrl xen-blkback: fix persistent grants negotiation xen-blkback: Apply 'feature_persistent' parameter when connect xen-blkfront: Apply 'feature_persistent' parameter when connect KEYS: asymmetric: enforce SM2 signature use pkey algo tpm: eventlog: Fix section mismatch for DEBUG_SECTION_MISMATCH tracing: Use a struct alignof to determine trace event field alignment ext4: check if directory block is within i_size ext4: add EXT4_INODE_HAS_XATTR_SPACE macro in xattr.h ext4: fix warning in ext4_iomap_begin as race between bmap and write ext4: make sure ext4_append() always allocates new block ext4: fix use-after-free in ext4_xattr_set_entry ext4: update s_overhead_clusters in the superblock during an on-line resize ext4: fix extent status tree race in writeback error recovery path ext4: correct max_inline_xattr_value_size computing ext4: correct the misjudgment in ext4_iget_extra_inode dm raid: fix address sanitizer warning in raid_resume dm raid: fix address sanitizer warning in raid_status net_sched: cls_route: remove from list when handle is 0 KVM: Add infrastructure and macro to mark VM as bugged KVM: x86: Check lapic_in_kernel() before attempting to set a SynIC irq KVM: x86: Avoid theoretical NULL pointer dereference in kvm_irq_delivery_to_apic_fast() mac80211: fix a memory leak where sta_info is not freed tcp: fix over estimation in sk_forced_mem_schedule() Revert "mwifiex: fix sleep in atomic context bugs caused by dev_coredumpv" drm/bridge: tc358767: Fix (e)DP bridge endpoint parsing in dedicated function drm/vc4: change vc4_dma_range_matches from a global to static Revert "net: usb: ax88179_178a needs FLAG_SEND_ZLP" Bluetooth: L2CAP: Fix l2cap_global_chan_by_psm regression mtd: rawnand: arasan: Prevent an unsupported configuration kvm: x86/pmu: Fix the compare function used by the pmu event filter tee: add overflow check in register_shm_helper() net/9p: Initialize the iounit field during fid creation net_sched: cls_route: disallow handle of 0 sched/fair: Fix fault in reweight_entity btrfs: only write the sectors in the vertical stripe which has data stripes btrfs: raid56: don't trust any cached sector in __raid56_parity_recover() Linux 5.10.137 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I5775ddfad6460c5a737b1ad3f8e0b8f798338786
This commit is contained in:
commit
fbe6a13851
@ -42,5 +42,5 @@ KernelVersion: 5.10
|
|||||||
Contact: SeongJae Park <sjpark@amazon.de>
|
Contact: SeongJae Park <sjpark@amazon.de>
|
||||||
Description:
|
Description:
|
||||||
Whether to enable the persistent grants feature or not. Note
|
Whether to enable the persistent grants feature or not. Note
|
||||||
that this option only takes effect on newly created backends.
|
that this option only takes effect on newly connected backends.
|
||||||
The default is Y (enable).
|
The default is Y (enable).
|
||||||
|
@ -15,5 +15,5 @@ KernelVersion: 5.10
|
|||||||
Contact: SeongJae Park <sjpark@amazon.de>
|
Contact: SeongJae Park <sjpark@amazon.de>
|
||||||
Description:
|
Description:
|
||||||
Whether to enable the persistent grants feature or not. Note
|
Whether to enable the persistent grants feature or not. Note
|
||||||
that this option only takes effect on newly created frontends.
|
that this option only takes effect on newly connected frontends.
|
||||||
The default is Y (enable).
|
The default is Y (enable).
|
||||||
|
@ -4763,20 +4763,33 @@
|
|||||||
Speculative Code Execution with Return Instructions)
|
Speculative Code Execution with Return Instructions)
|
||||||
vulnerability.
|
vulnerability.
|
||||||
|
|
||||||
|
AMD-based UNRET and IBPB mitigations alone do not stop
|
||||||
|
sibling threads from influencing the predictions of other
|
||||||
|
sibling threads. For that reason, STIBP is used on pro-
|
||||||
|
cessors that support it, and mitigate SMT on processors
|
||||||
|
that don't.
|
||||||
|
|
||||||
off - no mitigation
|
off - no mitigation
|
||||||
auto - automatically select a migitation
|
auto - automatically select a migitation
|
||||||
auto,nosmt - automatically select a mitigation,
|
auto,nosmt - automatically select a mitigation,
|
||||||
disabling SMT if necessary for
|
disabling SMT if necessary for
|
||||||
the full mitigation (only on Zen1
|
the full mitigation (only on Zen1
|
||||||
and older without STIBP).
|
and older without STIBP).
|
||||||
ibpb - mitigate short speculation windows on
|
ibpb - On AMD, mitigate short speculation
|
||||||
basic block boundaries too. Safe, highest
|
windows on basic block boundaries too.
|
||||||
perf impact.
|
Safe, highest perf impact. It also
|
||||||
unret - force enable untrained return thunks,
|
enables STIBP if present. Not suitable
|
||||||
only effective on AMD f15h-f17h
|
on Intel.
|
||||||
based systems.
|
ibpb,nosmt - Like "ibpb" above but will disable SMT
|
||||||
unret,nosmt - like unret, will disable SMT when STIBP
|
when STIBP is not available. This is
|
||||||
is not available.
|
the alternative for systems which do not
|
||||||
|
have STIBP.
|
||||||
|
unret - Force enable untrained return thunks,
|
||||||
|
only effective on AMD f15h-f17h based
|
||||||
|
systems.
|
||||||
|
unret,nosmt - Like unret, but will disable SMT when STIBP
|
||||||
|
is not available. This is the alternative for
|
||||||
|
systems which do not have STIBP.
|
||||||
|
|
||||||
Selecting 'auto' will choose a mitigation method at run
|
Selecting 'auto' will choose a mitigation method at run
|
||||||
time according to the CPU.
|
time according to the CPU.
|
||||||
|
@ -685,8 +685,8 @@ the ``menu`` governor to be used on the systems that use the ``ladder`` governor
|
|||||||
by default this way, for example.
|
by default this way, for example.
|
||||||
|
|
||||||
The other kernel command line parameters controlling CPU idle time management
|
The other kernel command line parameters controlling CPU idle time management
|
||||||
described below are only relevant for the *x86* architecture and some of
|
described below are only relevant for the *x86* architecture and references
|
||||||
them affect Intel processors only.
|
to ``intel_idle`` affect Intel processors only.
|
||||||
|
|
||||||
The *x86* architecture support code recognizes three kernel command line
|
The *x86* architecture support code recognizes three kernel command line
|
||||||
options related to CPU idle time management: ``idle=poll``, ``idle=halt``,
|
options related to CPU idle time management: ``idle=poll``, ``idle=halt``,
|
||||||
@ -708,10 +708,13 @@ idle, so it very well may hurt single-thread computations performance as well as
|
|||||||
energy-efficiency. Thus using it for performance reasons may not be a good idea
|
energy-efficiency. Thus using it for performance reasons may not be a good idea
|
||||||
at all.]
|
at all.]
|
||||||
|
|
||||||
The ``idle=nomwait`` option disables the ``intel_idle`` driver and causes
|
The ``idle=nomwait`` option prevents the use of ``MWAIT`` instruction of
|
||||||
``acpi_idle`` to be used (as long as all of the information needed by it is
|
the CPU to enter idle states. When this option is used, the ``acpi_idle``
|
||||||
there in the system's ACPI tables), but it is not allowed to use the
|
driver will use the ``HLT`` instruction instead of ``MWAIT``. On systems
|
||||||
``MWAIT`` instruction of the CPUs to ask the hardware to enter idle states.
|
running Intel processors, this option disables the ``intel_idle`` driver
|
||||||
|
and forces the use of the ``acpi_idle`` driver instead. Note that in either
|
||||||
|
case, ``acpi_idle`` driver will function only if all the information needed
|
||||||
|
by it is in the system's ACPI tables.
|
||||||
|
|
||||||
In addition to the architecture-level kernel command line options affecting CPU
|
In addition to the architecture-level kernel command line options affecting CPU
|
||||||
idle time management, there are parameters affecting individual ``CPUIdle``
|
idle time management, there are parameters affecting individual ``CPUIdle``
|
||||||
|
@ -249,18 +249,23 @@ VFIO bus driver API
|
|||||||
|
|
||||||
VFIO bus drivers, such as vfio-pci make use of only a few interfaces
|
VFIO bus drivers, such as vfio-pci make use of only a few interfaces
|
||||||
into VFIO core. When devices are bound and unbound to the driver,
|
into VFIO core. When devices are bound and unbound to the driver,
|
||||||
the driver should call vfio_add_group_dev() and vfio_del_group_dev()
|
the driver should call vfio_register_group_dev() and
|
||||||
respectively::
|
vfio_unregister_group_dev() respectively::
|
||||||
|
|
||||||
extern int vfio_add_group_dev(struct device *dev,
|
void vfio_init_group_dev(struct vfio_device *device,
|
||||||
|
struct device *dev,
|
||||||
const struct vfio_device_ops *ops,
|
const struct vfio_device_ops *ops,
|
||||||
void *device_data);
|
void *device_data);
|
||||||
|
int vfio_register_group_dev(struct vfio_device *device);
|
||||||
|
void vfio_unregister_group_dev(struct vfio_device *device);
|
||||||
|
|
||||||
extern void *vfio_del_group_dev(struct device *dev);
|
The driver should embed the vfio_device in its own structure and call
|
||||||
|
vfio_init_group_dev() to pre-configure it before going to registration.
|
||||||
vfio_add_group_dev() indicates to the core to begin tracking the
|
vfio_register_group_dev() indicates to the core to begin tracking the
|
||||||
iommu_group of the specified dev and register the dev as owned by
|
iommu_group of the specified dev and register the dev as owned by a VFIO bus
|
||||||
a VFIO bus driver. The driver provides an ops structure for callbacks
|
driver. Once vfio_register_group_dev() returns it is possible for userspace to
|
||||||
|
start accessing the driver, thus the driver should ensure it is completely
|
||||||
|
ready before calling it. The driver provides an ops structure for callbacks
|
||||||
similar to a file operations structure::
|
similar to a file operations structure::
|
||||||
|
|
||||||
struct vfio_device_ops {
|
struct vfio_device_ops {
|
||||||
@ -276,7 +281,7 @@ similar to a file operations structure::
|
|||||||
};
|
};
|
||||||
|
|
||||||
Each function is passed the device_data that was originally registered
|
Each function is passed the device_data that was originally registered
|
||||||
in the vfio_add_group_dev() call above. This allows the bus driver
|
in the vfio_register_group_dev() call above. This allows the bus driver
|
||||||
an easy place to store its opaque, private data. The open/release
|
an easy place to store its opaque, private data. The open/release
|
||||||
callbacks are issued when a new file descriptor is created for a
|
callbacks are issued when a new file descriptor is created for a
|
||||||
device (via VFIO_GROUP_GET_DEVICE_FD). The ioctl interface provides
|
device (via VFIO_GROUP_GET_DEVICE_FD). The ioctl interface provides
|
||||||
|
5
Makefile
5
Makefile
@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 10
|
PATCHLEVEL = 10
|
||||||
SUBLEVEL = 136
|
SUBLEVEL = 137
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Dare mighty things
|
NAME = Dare mighty things
|
||||||
|
|
||||||
@ -1045,6 +1045,9 @@ KBUILD_CFLAGS += $(KCFLAGS)
|
|||||||
KBUILD_LDFLAGS_MODULE += --build-id=sha1
|
KBUILD_LDFLAGS_MODULE += --build-id=sha1
|
||||||
LDFLAGS_vmlinux += --build-id=sha1
|
LDFLAGS_vmlinux += --build-id=sha1
|
||||||
|
|
||||||
|
KBUILD_LDFLAGS += -z noexecstack
|
||||||
|
KBUILD_LDFLAGS += $(call ld-option,--no-warn-rwx-segments)
|
||||||
|
|
||||||
ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
|
ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
|
||||||
LDFLAGS_vmlinux += $(call ld-option, -X,)
|
LDFLAGS_vmlinux += $(call ld-option, -X,)
|
||||||
endif
|
endif
|
||||||
|
@ -128,6 +128,7 @@ dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
|||||||
bcm47094-luxul-xwr-3150-v1.dtb \
|
bcm47094-luxul-xwr-3150-v1.dtb \
|
||||||
bcm47094-netgear-r8500.dtb \
|
bcm47094-netgear-r8500.dtb \
|
||||||
bcm47094-phicomm-k3.dtb \
|
bcm47094-phicomm-k3.dtb \
|
||||||
|
bcm53015-meraki-mr26.dtb \
|
||||||
bcm53016-meraki-mr32.dtb \
|
bcm53016-meraki-mr32.dtb \
|
||||||
bcm94708.dtb \
|
bcm94708.dtb \
|
||||||
bcm94709.dtb \
|
bcm94709.dtb \
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "AST2500 EVB";
|
model = "AST2500 EVB";
|
||||||
compatible = "aspeed,ast2500";
|
compatible = "aspeed,ast2500-evb", "aspeed,ast2500";
|
||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
serial4 = &uart5;
|
serial4 = &uart5;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "AST2600 EVB";
|
model = "AST2600 EVB";
|
||||||
compatible = "aspeed,ast2600";
|
compatible = "aspeed,ast2600-evb-a1", "aspeed,ast2600";
|
||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
serial4 = &uart5;
|
serial4 = &uart5;
|
||||||
|
166
arch/arm/boot/dts/bcm53015-meraki-mr26.dts
Normal file
166
arch/arm/boot/dts/bcm53015-meraki-mr26.dts
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||||
|
/*
|
||||||
|
* Broadcom BCM470X / BCM5301X ARM platform code.
|
||||||
|
* DTS for Meraki MR26 / Codename: Venom
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
#include "bcm4708.dtsi"
|
||||||
|
#include "bcm5301x-nand-cs0-bch8.dtsi"
|
||||||
|
#include <dt-bindings/leds/common.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "meraki,mr26", "brcm,bcm53015", "brcm,bcm4708";
|
||||||
|
model = "Meraki MR26";
|
||||||
|
|
||||||
|
memory@0 {
|
||||||
|
reg = <0x00000000 0x08000000>;
|
||||||
|
device_type = "memory";
|
||||||
|
};
|
||||||
|
|
||||||
|
leds {
|
||||||
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
|
led-0 {
|
||||||
|
function = LED_FUNCTION_FAULT;
|
||||||
|
color = <LED_COLOR_ID_AMBER>;
|
||||||
|
gpios = <&chipcommon 13 GPIO_ACTIVE_HIGH>;
|
||||||
|
panic-indicator;
|
||||||
|
};
|
||||||
|
led-1 {
|
||||||
|
function = LED_FUNCTION_INDICATOR;
|
||||||
|
color = <LED_COLOR_ID_WHITE>;
|
||||||
|
gpios = <&chipcommon 12 GPIO_ACTIVE_HIGH>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
keys {
|
||||||
|
compatible = "gpio-keys";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
key-restart {
|
||||||
|
label = "Reset";
|
||||||
|
linux,code = <KEY_RESTART>;
|
||||||
|
gpios = <&chipcommon 11 GPIO_ACTIVE_LOW>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart0 {
|
||||||
|
clock-frequency = <50000000>;
|
||||||
|
/delete-property/ clocks;
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart1 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
&gmac0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&gmac1 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
&gmac2 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
&gmac3 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
&nandcs {
|
||||||
|
nand-ecc-algo = "hw";
|
||||||
|
|
||||||
|
partitions {
|
||||||
|
compatible = "fixed-partitions";
|
||||||
|
#address-cells = <0x1>;
|
||||||
|
#size-cells = <0x1>;
|
||||||
|
|
||||||
|
partition@0 {
|
||||||
|
label = "u-boot";
|
||||||
|
reg = <0x0 0x200000>;
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@200000 {
|
||||||
|
label = "u-boot-env";
|
||||||
|
reg = <0x200000 0x200000>;
|
||||||
|
/* empty */
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@400000 {
|
||||||
|
label = "u-boot-backup";
|
||||||
|
reg = <0x400000 0x200000>;
|
||||||
|
/* empty */
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@600000 {
|
||||||
|
label = "u-boot-env-backup";
|
||||||
|
reg = <0x600000 0x200000>;
|
||||||
|
/* empty */
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@800000 {
|
||||||
|
label = "ubi";
|
||||||
|
reg = <0x800000 0x7780000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&srab {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
ports {
|
||||||
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
label = "poe";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@5 {
|
||||||
|
reg = <5>;
|
||||||
|
label = "cpu";
|
||||||
|
ethernet = <&gmac0>;
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <1000>;
|
||||||
|
duplex-full;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2c0 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinmux_i2c>;
|
||||||
|
|
||||||
|
clock-frequency = <100000>;
|
||||||
|
|
||||||
|
ina219@40 {
|
||||||
|
compatible = "ti,ina219"; /* PoE power */
|
||||||
|
reg = <0x40>;
|
||||||
|
shunt-resistor = <60000>; /* = 60 mOhms */
|
||||||
|
};
|
||||||
|
|
||||||
|
eeprom@56 {
|
||||||
|
compatible = "atmel,24c64";
|
||||||
|
reg = <0x56>;
|
||||||
|
pagesize = <32>;
|
||||||
|
read-only;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
/* it's empty */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&thermal {
|
||||||
|
status = "disabled";
|
||||||
|
/* does not work, reads 418 degree Celsius */
|
||||||
|
};
|
@ -592,7 +592,7 @@ &i2c2 {
|
|||||||
|
|
||||||
touchscreen@4b {
|
touchscreen@4b {
|
||||||
compatible = "atmel,maxtouch";
|
compatible = "atmel,maxtouch";
|
||||||
reset-gpio = <&gpio5 19 GPIO_ACTIVE_HIGH>;
|
reset-gpio = <&gpio5 19 GPIO_ACTIVE_LOW>;
|
||||||
reg = <0x4b>;
|
reg = <0x4b>;
|
||||||
interrupt-parent = <&gpio5>;
|
interrupt-parent = <&gpio5>;
|
||||||
interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
|
interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
|
||||||
|
@ -143,7 +143,7 @@ touchscreen@4a {
|
|||||||
reg = <0x4a>;
|
reg = <0x4a>;
|
||||||
interrupt-parent = <&gpio1>;
|
interrupt-parent = <&gpio1>;
|
||||||
interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 28 */
|
interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 28 */
|
||||||
reset-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; /* SODIMM 30 */
|
reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>; /* SODIMM 30 */
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ touchscreen@4a {
|
|||||||
reg = <0x4a>;
|
reg = <0x4a>;
|
||||||
interrupt-parent = <&gpio6>;
|
interrupt-parent = <&gpio6>;
|
||||||
interrupts = <10 IRQ_TYPE_EDGE_FALLING>;
|
interrupts = <10 IRQ_TYPE_EDGE_FALLING>;
|
||||||
reset-gpios = <&gpio6 9 GPIO_ACTIVE_HIGH>; /* SODIMM 13 */
|
reset-gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; /* SODIMM 13 */
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ touchscreen@4a {
|
|||||||
reg = <0x4a>;
|
reg = <0x4a>;
|
||||||
interrupt-parent = <&gpio6>;
|
interrupt-parent = <&gpio6>;
|
||||||
interrupts = <10 IRQ_TYPE_EDGE_FALLING>;
|
interrupts = <10 IRQ_TYPE_EDGE_FALLING>;
|
||||||
reset-gpios = <&gpio6 9 GPIO_ACTIVE_HIGH>; /* SODIMM 13 */
|
reset-gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; /* SODIMM 13 */
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ touchscreen@4a {
|
|||||||
reg = <0x4a>;
|
reg = <0x4a>;
|
||||||
interrupt-parent = <&gpio6>;
|
interrupt-parent = <&gpio6>;
|
||||||
interrupts = <10 IRQ_TYPE_EDGE_FALLING>;
|
interrupts = <10 IRQ_TYPE_EDGE_FALLING>;
|
||||||
reset-gpios = <&gpio6 9 GPIO_ACTIVE_HIGH>; /* SODIMM 13 */
|
reset-gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; /* SODIMM 13 */
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -62,20 +62,18 @@ cpu0: cpu@0 {
|
|||||||
clock-frequency = <696000000>;
|
clock-frequency = <696000000>;
|
||||||
clock-latency = <61036>; /* two CLK32 periods */
|
clock-latency = <61036>; /* two CLK32 periods */
|
||||||
#cooling-cells = <2>;
|
#cooling-cells = <2>;
|
||||||
operating-points = <
|
operating-points =
|
||||||
/* kHz uV */
|
/* kHz uV */
|
||||||
696000 1275000
|
<696000 1275000>,
|
||||||
528000 1175000
|
<528000 1175000>,
|
||||||
396000 1025000
|
<396000 1025000>,
|
||||||
198000 950000
|
<198000 950000>;
|
||||||
>;
|
fsl,soc-operating-points =
|
||||||
fsl,soc-operating-points = <
|
|
||||||
/* KHz uV */
|
/* KHz uV */
|
||||||
696000 1275000
|
<696000 1275000>,
|
||||||
528000 1175000
|
<528000 1175000>,
|
||||||
396000 1175000
|
<396000 1175000>,
|
||||||
198000 1175000
|
<198000 1175000>;
|
||||||
>;
|
|
||||||
clocks = <&clks IMX6UL_CLK_ARM>,
|
clocks = <&clks IMX6UL_CLK_ARM>,
|
||||||
<&clks IMX6UL_CLK_PLL2_BUS>,
|
<&clks IMX6UL_CLK_PLL2_BUS>,
|
||||||
<&clks IMX6UL_CLK_PLL2_PFD2>,
|
<&clks IMX6UL_CLK_PLL2_PFD2>,
|
||||||
@ -147,6 +145,9 @@ soc {
|
|||||||
ocram: sram@900000 {
|
ocram: sram@900000 {
|
||||||
compatible = "mmio-sram";
|
compatible = "mmio-sram";
|
||||||
reg = <0x00900000 0x20000>;
|
reg = <0x00900000 0x20000>;
|
||||||
|
ranges = <0 0x00900000 0x20000>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
intc: interrupt-controller@a01000 {
|
intc: interrupt-controller@a01000 {
|
||||||
@ -540,7 +541,7 @@ fec2: ethernet@20b4000 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
kpp: keypad@20b8000 {
|
kpp: keypad@20b8000 {
|
||||||
compatible = "fsl,imx6ul-kpp", "fsl,imx6q-kpp", "fsl,imx21-kpp";
|
compatible = "fsl,imx6ul-kpp", "fsl,imx21-kpp";
|
||||||
reg = <0x020b8000 0x4000>;
|
reg = <0x020b8000 0x4000>;
|
||||||
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6UL_CLK_KPP>;
|
clocks = <&clks IMX6UL_CLK_KPP>;
|
||||||
@ -994,7 +995,7 @@ cpu_speed_grade: speed-grade@10 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
csi: csi@21c4000 {
|
csi: csi@21c4000 {
|
||||||
compatible = "fsl,imx6ul-csi", "fsl,imx7-csi";
|
compatible = "fsl,imx6ul-csi";
|
||||||
reg = <0x021c4000 0x4000>;
|
reg = <0x021c4000 0x4000>;
|
||||||
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6UL_CLK_CSI>;
|
clocks = <&clks IMX6UL_CLK_CSI>;
|
||||||
@ -1003,7 +1004,7 @@ csi: csi@21c4000 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
lcdif: lcdif@21c8000 {
|
lcdif: lcdif@21c8000 {
|
||||||
compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif";
|
compatible = "fsl,imx6ul-lcdif", "fsl,imx6sx-lcdif";
|
||||||
reg = <0x021c8000 0x4000>;
|
reg = <0x021c8000 0x4000>;
|
||||||
interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,
|
clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,
|
||||||
@ -1024,7 +1025,7 @@ pxp: pxp@21cc000 {
|
|||||||
qspi: spi@21e0000 {
|
qspi: spi@21e0000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "fsl,imx6ul-qspi", "fsl,imx6sx-qspi";
|
compatible = "fsl,imx6ul-qspi";
|
||||||
reg = <0x021e0000 0x4000>, <0x60000000 0x10000000>;
|
reg = <0x021e0000 0x4000>, <0x60000000 0x10000000>;
|
||||||
reg-names = "QuadSPI", "QuadSPI-memory";
|
reg-names = "QuadSPI", "QuadSPI-memory";
|
||||||
interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
@ -99,7 +99,7 @@ touchscreen@4a {
|
|||||||
reg = <0x4a>;
|
reg = <0x4a>;
|
||||||
interrupt-parent = <&gpio2>;
|
interrupt-parent = <&gpio2>;
|
||||||
interrupts = <15 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 107 */
|
interrupts = <15 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 107 */
|
||||||
reset-gpios = <&gpio2 28 GPIO_ACTIVE_HIGH>; /* SODIMM 106 */
|
reset-gpios = <&gpio2 28 GPIO_ACTIVE_LOW>; /* SODIMM 106 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* M41T0M6 real time clock on carrier board */
|
/* M41T0M6 real time clock on carrier board */
|
||||||
|
@ -124,7 +124,7 @@ touchscreen@4a {
|
|||||||
reg = <0x4a>;
|
reg = <0x4a>;
|
||||||
interrupt-parent = <&gpio1>;
|
interrupt-parent = <&gpio1>;
|
||||||
interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 28 */
|
interrupts = <9 IRQ_TYPE_EDGE_FALLING>; /* SODIMM 28 */
|
||||||
reset-gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; /* SODIMM 30 */
|
reset-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>; /* SODIMM 30 */
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -13,6 +13,10 @@ memory@80000000 {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&cpu1 {
|
||||||
|
cpu-supply = <®_DCDC2>;
|
||||||
|
};
|
||||||
|
|
||||||
&gpio6 {
|
&gpio6 {
|
||||||
gpio-line-names = "",
|
gpio-line-names = "",
|
||||||
"",
|
"",
|
||||||
|
@ -430,7 +430,7 @@ touchscreen@4a {
|
|||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&touchscreen_pins>;
|
pinctrl-0 = <&touchscreen_pins>;
|
||||||
|
|
||||||
reset-gpios = <&gpio6 13 GPIO_ACTIVE_HIGH>; /* gpio173 */
|
reset-gpios = <&gpio6 13 GPIO_ACTIVE_LOW>; /* gpio173 */
|
||||||
|
|
||||||
/* gpio_183 with sys_nirq2 pad as wakeup */
|
/* gpio_183 with sys_nirq2 pad as wakeup */
|
||||||
interrupts-extended = <&gpio6 23 IRQ_TYPE_LEVEL_LOW>,
|
interrupts-extended = <&gpio6 23 IRQ_TYPE_LEVEL_LOW>,
|
||||||
|
@ -324,6 +324,7 @@ rtc@11d {
|
|||||||
|
|
||||||
pmicgpio: gpio@150 {
|
pmicgpio: gpio@150 {
|
||||||
compatible = "qcom,pm8018-gpio", "qcom,ssbi-gpio";
|
compatible = "qcom,pm8018-gpio", "qcom,ssbi-gpio";
|
||||||
|
reg = <0x150>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
|
@ -25,6 +25,7 @@ temp-alarm@2400 {
|
|||||||
compatible = "qcom,spmi-temp-alarm";
|
compatible = "qcom,spmi-temp-alarm";
|
||||||
reg = <0x2400>;
|
reg = <0x2400>;
|
||||||
interrupts = <4 0x24 0 IRQ_TYPE_EDGE_RISING>;
|
interrupts = <4 0x24 0 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
#thermal-sensor-cells = <0>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -631,7 +631,7 @@ touchscreen@4a {
|
|||||||
interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
|
interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&ts_irq>;
|
pinctrl-0 = <&ts_irq>;
|
||||||
reset-gpios = <&gpj1 3 GPIO_ACTIVE_HIGH>;
|
reset-gpios = <&gpj1 3 GPIO_ACTIVE_LOW>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -446,7 +446,7 @@ touchscreen@4c {
|
|||||||
interrupt-parent = <&gpio>;
|
interrupt-parent = <&gpio>;
|
||||||
interrupts = <TEGRA_GPIO(V, 6) IRQ_TYPE_LEVEL_LOW>;
|
interrupts = <TEGRA_GPIO(V, 6) IRQ_TYPE_LEVEL_LOW>;
|
||||||
|
|
||||||
reset-gpios = <&gpio TEGRA_GPIO(Q, 7) GPIO_ACTIVE_HIGH>;
|
reset-gpios = <&gpio TEGRA_GPIO(Q, 7) GPIO_ACTIVE_LOW>;
|
||||||
|
|
||||||
vdda-supply = <&vdd_3v3_sys>;
|
vdda-supply = <&vdd_3v3_sys>;
|
||||||
vdd-supply = <&vdd_3v3_sys>;
|
vdd-supply = <&vdd_3v3_sys>;
|
||||||
|
@ -597,8 +597,8 @@ usb0: usb@65a00000 {
|
|||||||
compatible = "socionext,uniphier-dwc3", "snps,dwc3";
|
compatible = "socionext,uniphier-dwc3", "snps,dwc3";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <0x65a00000 0xcd00>;
|
reg = <0x65a00000 0xcd00>;
|
||||||
interrupt-names = "host", "peripheral";
|
interrupt-names = "dwc_usb3";
|
||||||
interrupts = <0 134 4>, <0 135 4>;
|
interrupts = <0 134 4>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_usb0>, <&pinctrl_usb2>;
|
pinctrl-0 = <&pinctrl_usb0>, <&pinctrl_usb2>;
|
||||||
clock-names = "ref", "bus_early", "suspend";
|
clock-names = "ref", "bus_early", "suspend";
|
||||||
@ -693,8 +693,8 @@ usb1: usb@65c00000 {
|
|||||||
compatible = "socionext,uniphier-dwc3", "snps,dwc3";
|
compatible = "socionext,uniphier-dwc3", "snps,dwc3";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <0x65c00000 0xcd00>;
|
reg = <0x65c00000 0xcd00>;
|
||||||
interrupt-names = "host", "peripheral";
|
interrupt-names = "dwc_usb3";
|
||||||
interrupts = <0 137 4>, <0 138 4>;
|
interrupts = <0 137 4>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_usb1>, <&pinctrl_usb3>;
|
pinctrl-0 = <&pinctrl_usb1>, <&pinctrl_usb3>;
|
||||||
clock-names = "ref", "bus_early", "suspend";
|
clock-names = "ref", "bus_early", "suspend";
|
||||||
|
@ -40,8 +40,8 @@ ENDPROC(_find_first_zero_bit_le)
|
|||||||
* Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset)
|
* Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset)
|
||||||
*/
|
*/
|
||||||
ENTRY(_find_next_zero_bit_le)
|
ENTRY(_find_next_zero_bit_le)
|
||||||
teq r1, #0
|
cmp r2, r1
|
||||||
beq 3b
|
bhs 3b
|
||||||
ands ip, r2, #7
|
ands ip, r2, #7
|
||||||
beq 1b @ If new byte, goto old routine
|
beq 1b @ If new byte, goto old routine
|
||||||
ARM( ldrb r3, [r0, r2, lsr #3] )
|
ARM( ldrb r3, [r0, r2, lsr #3] )
|
||||||
@ -81,8 +81,8 @@ ENDPROC(_find_first_bit_le)
|
|||||||
* Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset)
|
* Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset)
|
||||||
*/
|
*/
|
||||||
ENTRY(_find_next_bit_le)
|
ENTRY(_find_next_bit_le)
|
||||||
teq r1, #0
|
cmp r2, r1
|
||||||
beq 3b
|
bhs 3b
|
||||||
ands ip, r2, #7
|
ands ip, r2, #7
|
||||||
beq 1b @ If new byte, goto old routine
|
beq 1b @ If new byte, goto old routine
|
||||||
ARM( ldrb r3, [r0, r2, lsr #3] )
|
ARM( ldrb r3, [r0, r2, lsr #3] )
|
||||||
@ -115,8 +115,8 @@ ENTRY(_find_first_zero_bit_be)
|
|||||||
ENDPROC(_find_first_zero_bit_be)
|
ENDPROC(_find_first_zero_bit_be)
|
||||||
|
|
||||||
ENTRY(_find_next_zero_bit_be)
|
ENTRY(_find_next_zero_bit_be)
|
||||||
teq r1, #0
|
cmp r2, r1
|
||||||
beq 3b
|
bhs 3b
|
||||||
ands ip, r2, #7
|
ands ip, r2, #7
|
||||||
beq 1b @ If new byte, goto old routine
|
beq 1b @ If new byte, goto old routine
|
||||||
eor r3, r2, #0x18 @ big endian byte ordering
|
eor r3, r2, #0x18 @ big endian byte ordering
|
||||||
@ -149,8 +149,8 @@ ENTRY(_find_first_bit_be)
|
|||||||
ENDPROC(_find_first_bit_be)
|
ENDPROC(_find_first_bit_be)
|
||||||
|
|
||||||
ENTRY(_find_next_bit_be)
|
ENTRY(_find_next_bit_be)
|
||||||
teq r1, #0
|
cmp r2, r1
|
||||||
beq 3b
|
bhs 3b
|
||||||
ands ip, r2, #7
|
ands ip, r2, #7
|
||||||
beq 1b @ If new byte, goto old routine
|
beq 1b @ If new byte, goto old routine
|
||||||
eor r3, r2, #0x18 @ big endian byte ordering
|
eor r3, r2, #0x18 @ big endian byte ordering
|
||||||
|
@ -54,6 +54,7 @@ int __init bcm_kona_smc_init(void)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
prop_val = of_get_address(node, 0, &prop_size, NULL);
|
prop_val = of_get_address(node, 0, &prop_size, NULL);
|
||||||
|
of_node_put(node);
|
||||||
if (!prop_val)
|
if (!prop_val)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -211,6 +211,7 @@ static int __init omapdss_init_fbdev(void)
|
|||||||
node = of_find_node_by_name(NULL, "omap4_padconf_global");
|
node = of_find_node_by_name(NULL, "omap4_padconf_global");
|
||||||
if (node)
|
if (node)
|
||||||
omap4_dsi_mux_syscon = syscon_node_to_regmap(node);
|
omap4_dsi_mux_syscon = syscon_node_to_regmap(node);
|
||||||
|
of_node_put(node);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -259,11 +260,13 @@ static int __init omapdss_init_of(void)
|
|||||||
|
|
||||||
if (!pdev) {
|
if (!pdev) {
|
||||||
pr_err("Unable to find DSS platform device\n");
|
pr_err("Unable to find DSS platform device\n");
|
||||||
|
of_node_put(node);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = of_platform_populate(node, NULL, NULL, &pdev->dev);
|
r = of_platform_populate(node, NULL, NULL, &pdev->dev);
|
||||||
put_device(&pdev->dev);
|
put_device(&pdev->dev);
|
||||||
|
of_node_put(node);
|
||||||
if (r) {
|
if (r) {
|
||||||
pr_err("Unable to populate DSS submodule devices\n");
|
pr_err("Unable to populate DSS submodule devices\n");
|
||||||
return r;
|
return r;
|
||||||
|
@ -708,6 +708,7 @@ static int omap3xxx_prm_late_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
irq_num = of_irq_get(np, 0);
|
irq_num = of_irq_get(np, 0);
|
||||||
|
of_node_put(np);
|
||||||
if (irq_num == -EPROBE_DEFER)
|
if (irq_num == -EPROBE_DEFER)
|
||||||
return irq_num;
|
return irq_num;
|
||||||
|
|
||||||
|
@ -125,6 +125,7 @@ static int regulator_quirk_notify(struct notifier_block *nb,
|
|||||||
|
|
||||||
list_for_each_entry_safe(pos, tmp, &quirk_list, list) {
|
list_for_each_entry_safe(pos, tmp, &quirk_list, list) {
|
||||||
list_del(&pos->list);
|
list_del(&pos->list);
|
||||||
|
of_node_put(pos->np);
|
||||||
kfree(pos);
|
kfree(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,11 +175,12 @@ static int __init rcar_gen2_regulator_quirk(void)
|
|||||||
memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg));
|
memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg));
|
||||||
|
|
||||||
quirk->id = id;
|
quirk->id = id;
|
||||||
quirk->np = np;
|
quirk->np = of_node_get(np);
|
||||||
quirk->i2c_msg.addr = addr;
|
quirk->i2c_msg.addr = addr;
|
||||||
|
|
||||||
ret = of_irq_parse_one(np, 0, argsa);
|
ret = of_irq_parse_one(np, 0, argsa);
|
||||||
if (ret) { /* Skip invalid entry and continue */
|
if (ret) { /* Skip invalid entry and continue */
|
||||||
|
of_node_put(np);
|
||||||
kfree(quirk);
|
kfree(quirk);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -225,6 +227,7 @@ static int __init rcar_gen2_regulator_quirk(void)
|
|||||||
err_mem:
|
err_mem:
|
||||||
list_for_each_entry_safe(pos, tmp, &quirk_list, list) {
|
list_for_each_entry_safe(pos, tmp, &quirk_list, list) {
|
||||||
list_del(&pos->list);
|
list_del(&pos->list);
|
||||||
|
of_node_put(pos->np);
|
||||||
kfree(pos);
|
kfree(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ static int __init zynq_get_revision(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
zynq_devcfg_base = of_iomap(np, 0);
|
zynq_devcfg_base = of_iomap(np, 0);
|
||||||
|
of_node_put(np);
|
||||||
if (!zynq_devcfg_base) {
|
if (!zynq_devcfg_base) {
|
||||||
pr_err("%s: Unable to map I/O memory\n", __func__);
|
pr_err("%s: Unable to map I/O memory\n", __func__);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -40,7 +40,7 @@ hdmi_con_in: endpoint {
|
|||||||
leds {
|
leds {
|
||||||
compatible = "gpio-leds";
|
compatible = "gpio-leds";
|
||||||
|
|
||||||
status {
|
led-0 {
|
||||||
label = "orangepi:green:status";
|
label = "orangepi:green:status";
|
||||||
gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */
|
gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */
|
||||||
};
|
};
|
||||||
|
@ -49,7 +49,7 @@ factory {
|
|||||||
wps {
|
wps {
|
||||||
label = "wps";
|
label = "wps";
|
||||||
linux,code = <KEY_WPS_BUTTON>;
|
linux,code = <KEY_WPS_BUTTON>;
|
||||||
gpios = <&pio 102 GPIO_ACTIVE_HIGH>;
|
gpios = <&pio 102 GPIO_ACTIVE_LOW>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ eeprom@50 {
|
|||||||
|
|
||||||
/* SDMMC1 (SD/MMC) */
|
/* SDMMC1 (SD/MMC) */
|
||||||
mmc@3400000 {
|
mmc@3400000 {
|
||||||
cd-gpios = <&gpio TEGRA194_MAIN_GPIO(A, 0) GPIO_ACTIVE_LOW>;
|
cd-gpios = <&gpio TEGRA194_MAIN_GPIO(G, 7) GPIO_ACTIVE_LOW>;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* SDMMC4 (eMMC) */
|
/* SDMMC4 (eMMC) */
|
||||||
|
@ -383,7 +383,7 @@ qpic_bam: dma@7984000 {
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
qpic_nand: nand@79b0000 {
|
qpic_nand: nand-controller@79b0000 {
|
||||||
compatible = "qcom,ipq8074-nand";
|
compatible = "qcom,ipq8074-nand";
|
||||||
reg = <0x079b0000 0x10000>;
|
reg = <0x079b0000 0x10000>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -548,7 +548,7 @@ dwc3@7580000 {
|
|||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x07580000 0xcd00>;
|
reg = <0x07580000 0xcd00>;
|
||||||
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
phys = <&usb2_phy_sec>, <&usb3_phy>;
|
phys = <&usb2_phy_prim>, <&usb3_phy>;
|
||||||
phy-names = "usb2-phy", "usb3-phy";
|
phy-names = "usb2-phy", "usb3-phy";
|
||||||
snps,has-lpm-erratum;
|
snps,has-lpm-erratum;
|
||||||
snps,hird-threshold = /bits/ 8 <0x10>;
|
snps,hird-threshold = /bits/ 8 <0x10>;
|
||||||
@ -577,7 +577,7 @@ dwc3@78c0000 {
|
|||||||
compatible = "snps,dwc3";
|
compatible = "snps,dwc3";
|
||||||
reg = <0x078c0000 0xcc00>;
|
reg = <0x078c0000 0xcc00>;
|
||||||
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
phys = <&usb2_phy_prim>;
|
phys = <&usb2_phy_sec>;
|
||||||
phy-names = "usb2-phy";
|
phy-names = "usb2-phy";
|
||||||
snps,has-lpm-erratum;
|
snps,has-lpm-erratum;
|
||||||
snps,hird-threshold = /bits/ 8 <0x10>;
|
snps,hird-threshold = /bits/ 8 <0x10>;
|
||||||
|
@ -145,7 +145,7 @@ rgb_panel: endpoint {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
reg_audio: regulator_audio {
|
reg_audio: regulator-audio {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "audio-1.8V";
|
regulator-name = "audio-1.8V";
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
@ -173,7 +173,7 @@ reg_lcd_reset: regulator-lcd-reset {
|
|||||||
vin-supply = <®_lcd>;
|
vin-supply = <®_lcd>;
|
||||||
};
|
};
|
||||||
|
|
||||||
reg_cam0: regulator_camera {
|
reg_cam0: regulator-cam0 {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "reg_cam0";
|
regulator-name = "reg_cam0";
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
@ -182,7 +182,7 @@ reg_cam0: regulator_camera {
|
|||||||
enable-active-high;
|
enable-active-high;
|
||||||
};
|
};
|
||||||
|
|
||||||
reg_cam1: regulator_camera {
|
reg_cam1: regulator-cam1 {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "reg_cam1";
|
regulator-name = "reg_cam1";
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
|
@ -1929,7 +1929,7 @@ thermal-zones {
|
|||||||
cpu-thermal {
|
cpu-thermal {
|
||||||
polling-delay-passive = <250>;
|
polling-delay-passive = <250>;
|
||||||
polling-delay = <0>;
|
polling-delay = <0>;
|
||||||
thermal-sensors = <&thermal 0>;
|
thermal-sensors = <&thermal>;
|
||||||
sustainable-power = <717>;
|
sustainable-power = <717>;
|
||||||
|
|
||||||
cooling-maps {
|
cooling-maps {
|
||||||
|
@ -2029,7 +2029,7 @@ thermal-zones {
|
|||||||
cpu-thermal {
|
cpu-thermal {
|
||||||
polling-delay-passive = <250>;
|
polling-delay-passive = <250>;
|
||||||
polling-delay = <0>;
|
polling-delay = <0>;
|
||||||
thermal-sensors = <&thermal 0>;
|
thermal-sensors = <&thermal>;
|
||||||
sustainable-power = <717>;
|
sustainable-power = <717>;
|
||||||
|
|
||||||
cooling-maps {
|
cooling-maps {
|
||||||
|
@ -599,8 +599,8 @@ usb0: usb@65a00000 {
|
|||||||
compatible = "socionext,uniphier-dwc3", "snps,dwc3";
|
compatible = "socionext,uniphier-dwc3", "snps,dwc3";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <0x65a00000 0xcd00>;
|
reg = <0x65a00000 0xcd00>;
|
||||||
interrupt-names = "host", "peripheral";
|
interrupt-names = "dwc_usb3";
|
||||||
interrupts = <0 134 4>, <0 135 4>;
|
interrupts = <0 134 4>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_usb0>, <&pinctrl_usb2>;
|
pinctrl-0 = <&pinctrl_usb0>, <&pinctrl_usb2>;
|
||||||
clock-names = "ref", "bus_early", "suspend";
|
clock-names = "ref", "bus_early", "suspend";
|
||||||
@ -701,8 +701,8 @@ usb1: usb@65c00000 {
|
|||||||
compatible = "socionext,uniphier-dwc3", "snps,dwc3";
|
compatible = "socionext,uniphier-dwc3", "snps,dwc3";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <0x65c00000 0xcd00>;
|
reg = <0x65c00000 0xcd00>;
|
||||||
interrupt-names = "host", "peripheral";
|
interrupt-names = "dwc_usb3";
|
||||||
interrupts = <0 137 4>, <0 138 4>;
|
interrupts = <0 137 4>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_usb1>, <&pinctrl_usb3>;
|
pinctrl-0 = <&pinctrl_usb1>, <&pinctrl_usb3>;
|
||||||
clock-names = "ref", "bus_early", "suspend";
|
clock-names = "ref", "bus_early", "suspend";
|
||||||
|
@ -59,6 +59,7 @@ config CRYPTO_GHASH_ARM64_CE
|
|||||||
select CRYPTO_HASH
|
select CRYPTO_HASH
|
||||||
select CRYPTO_GF128MUL
|
select CRYPTO_GF128MUL
|
||||||
select CRYPTO_LIB_AES
|
select CRYPTO_LIB_AES
|
||||||
|
select CRYPTO_AEAD
|
||||||
|
|
||||||
config CRYPTO_CRCT10DIF_ARM64_CE
|
config CRYPTO_CRCT10DIF_ARM64_CE
|
||||||
tristate "CRCT10DIF digest algorithm using PMULL instructions"
|
tristate "CRCT10DIF digest algorithm using PMULL instructions"
|
||||||
|
@ -207,8 +207,9 @@ void tls_preserve_current_state(void);
|
|||||||
|
|
||||||
static inline void start_thread_common(struct pt_regs *regs, unsigned long pc)
|
static inline void start_thread_common(struct pt_regs *regs, unsigned long pc)
|
||||||
{
|
{
|
||||||
|
s32 previous_syscall = regs->syscallno;
|
||||||
memset(regs, 0, sizeof(*regs));
|
memset(regs, 0, sizeof(*regs));
|
||||||
forget_syscall(regs);
|
regs->syscallno = previous_syscall;
|
||||||
regs->pc = pc;
|
regs->pc = pc;
|
||||||
|
|
||||||
if (system_uses_irq_prio_masking())
|
if (system_uses_irq_prio_masking())
|
||||||
|
@ -532,7 +532,7 @@ static const struct arm64_ftr_bits ftr_id_pfr2[] = {
|
|||||||
|
|
||||||
static const struct arm64_ftr_bits ftr_id_dfr0[] = {
|
static const struct arm64_ftr_bits ftr_id_dfr0[] = {
|
||||||
/* [31:28] TraceFilt */
|
/* [31:28] TraceFilt */
|
||||||
S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_PERFMON_SHIFT, 4, 0xf),
|
S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_EXACT, ID_DFR0_PERFMON_SHIFT, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_MPROFDBG_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_MPROFDBG_SHIFT, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_MMAPTRC_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_MMAPTRC_SHIFT, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_COPTRC_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_COPTRC_SHIFT, 4, 0),
|
||||||
|
@ -285,5 +285,5 @@ void __noreturn hyp_panic(void)
|
|||||||
|
|
||||||
asmlinkage void kvm_unexpected_el2_exception(void)
|
asmlinkage void kvm_unexpected_el2_exception(void)
|
||||||
{
|
{
|
||||||
return __kvm_unexpected_el2_exception();
|
__kvm_unexpected_el2_exception();
|
||||||
}
|
}
|
||||||
|
@ -231,5 +231,5 @@ void __noreturn hyp_panic(void)
|
|||||||
|
|
||||||
asmlinkage void kvm_unexpected_el2_exception(void)
|
asmlinkage void kvm_unexpected_el2_exception(void)
|
||||||
{
|
{
|
||||||
return __kvm_unexpected_el2_exception();
|
__kvm_unexpected_el2_exception();
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ config HEXAGON
|
|||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
select GENERIC_CPU_DEVICES
|
select GENERIC_CPU_DEVICES
|
||||||
select SET_FS
|
select SET_FS
|
||||||
|
select ARCH_WANT_LD_ORPHAN_WARN
|
||||||
help
|
help
|
||||||
Qualcomm Hexagon is a processor architecture designed for high
|
Qualcomm Hexagon is a processor architecture designed for high
|
||||||
performance and low power across a wide variety of applications.
|
performance and low power across a wide variety of applications.
|
||||||
|
@ -542,7 +542,7 @@ ia64_get_irr(unsigned int vector)
|
|||||||
{
|
{
|
||||||
unsigned int reg = vector / 64;
|
unsigned int reg = vector / 64;
|
||||||
unsigned int bit = vector % 64;
|
unsigned int bit = vector % 64;
|
||||||
u64 irr;
|
unsigned long irr;
|
||||||
|
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case 0: irr = ia64_getreg(_IA64_REG_CR_IRR0); break;
|
case 0: irr = ia64_getreg(_IA64_REG_CR_IRR0); break;
|
||||||
|
@ -172,7 +172,7 @@ static void *c_start(struct seq_file *m, loff_t *pos)
|
|||||||
{
|
{
|
||||||
unsigned long i = *pos;
|
unsigned long i = *pos;
|
||||||
|
|
||||||
return i < NR_CPUS ? (void *) (i + 1) : NULL;
|
return i < nr_cpu_ids ? (void *) (i + 1) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
||||||
|
@ -521,7 +521,6 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
|
|||||||
dev->id.hversion_rev = iodc_data[1] & 0x0f;
|
dev->id.hversion_rev = iodc_data[1] & 0x0f;
|
||||||
dev->id.sversion = ((iodc_data[4] & 0x0f) << 16) |
|
dev->id.sversion = ((iodc_data[4] & 0x0f) << 16) |
|
||||||
(iodc_data[5] << 8) | iodc_data[6];
|
(iodc_data[5] << 8) | iodc_data[6];
|
||||||
dev->hpa.name = parisc_pathname(dev);
|
|
||||||
dev->hpa.start = hpa;
|
dev->hpa.start = hpa;
|
||||||
/* This is awkward. The STI spec says that gfx devices may occupy
|
/* This is awkward. The STI spec says that gfx devices may occupy
|
||||||
* 32MB or 64MB. Unfortunately, we don't know how to tell whether
|
* 32MB or 64MB. Unfortunately, we don't know how to tell whether
|
||||||
@ -535,10 +534,10 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
|
|||||||
dev->hpa.end = hpa + 0xfff;
|
dev->hpa.end = hpa + 0xfff;
|
||||||
}
|
}
|
||||||
dev->hpa.flags = IORESOURCE_MEM;
|
dev->hpa.flags = IORESOURCE_MEM;
|
||||||
name = parisc_hardware_description(&dev->id);
|
dev->hpa.name = dev->name;
|
||||||
if (name) {
|
name = parisc_hardware_description(&dev->id) ? : "unknown";
|
||||||
strlcpy(dev->name, name, sizeof(dev->name));
|
snprintf(dev->name, sizeof(dev->name), "%s [%s]",
|
||||||
}
|
name, parisc_pathname(dev));
|
||||||
|
|
||||||
/* Silently fail things like mouse ports which are subsumed within
|
/* Silently fail things like mouse ports which are subsumed within
|
||||||
* the keyboard controller
|
* the keyboard controller
|
||||||
|
@ -413,7 +413,7 @@
|
|||||||
412 32 utimensat_time64 sys_utimensat sys_utimensat
|
412 32 utimensat_time64 sys_utimensat sys_utimensat
|
||||||
413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
|
413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
|
||||||
414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
|
414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
|
||||||
416 32 io_pgetevents_time64 sys_io_pgetevents sys_io_pgetevents
|
416 32 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
|
||||||
417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
|
417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
|
||||||
418 32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend
|
418 32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend
|
||||||
419 32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive
|
419 32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive
|
||||||
|
@ -20,6 +20,7 @@ CFLAGS_prom.o += $(DISABLE_LATENT_ENTROPY_PLUGIN)
|
|||||||
CFLAGS_prom_init.o += -fno-stack-protector
|
CFLAGS_prom_init.o += -fno-stack-protector
|
||||||
CFLAGS_prom_init.o += -DDISABLE_BRANCH_PROFILING
|
CFLAGS_prom_init.o += -DDISABLE_BRANCH_PROFILING
|
||||||
CFLAGS_prom_init.o += -ffreestanding
|
CFLAGS_prom_init.o += -ffreestanding
|
||||||
|
CFLAGS_prom_init.o += $(call cc-option, -ftrivial-auto-var-init=uninitialized)
|
||||||
|
|
||||||
ifdef CONFIG_FUNCTION_TRACER
|
ifdef CONFIG_FUNCTION_TRACER
|
||||||
# Do not trace early boot code
|
# Do not trace early boot code
|
||||||
|
@ -73,16 +73,32 @@ void set_pci_dma_ops(const struct dma_map_ops *dma_ops)
|
|||||||
static int get_phb_number(struct device_node *dn)
|
static int get_phb_number(struct device_node *dn)
|
||||||
{
|
{
|
||||||
int ret, phb_id = -1;
|
int ret, phb_id = -1;
|
||||||
u32 prop_32;
|
|
||||||
u64 prop;
|
u64 prop;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Try fixed PHB numbering first, by checking archs and reading
|
* Try fixed PHB numbering first, by checking archs and reading
|
||||||
* the respective device-tree properties. Firstly, try powernv by
|
* the respective device-tree properties. Firstly, try reading
|
||||||
* reading "ibm,opal-phbid", only present in OPAL environment.
|
* standard "linux,pci-domain", then try reading "ibm,opal-phbid"
|
||||||
|
* (only present in powernv OPAL environment), then try device-tree
|
||||||
|
* alias and as the last try to use lower bits of "reg" property.
|
||||||
*/
|
*/
|
||||||
|
ret = of_get_pci_domain_nr(dn);
|
||||||
|
if (ret >= 0) {
|
||||||
|
prop = ret;
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
if (ret)
|
||||||
ret = of_property_read_u64(dn, "ibm,opal-phbid", &prop);
|
ret = of_property_read_u64(dn, "ibm,opal-phbid", &prop);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
ret = of_alias_get_id(dn, "pci");
|
||||||
|
if (ret >= 0) {
|
||||||
|
prop = ret;
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ret) {
|
||||||
|
u32 prop_32;
|
||||||
ret = of_property_read_u32_index(dn, "reg", 1, &prop_32);
|
ret = of_property_read_u32_index(dn, "reg", 1, &prop_32);
|
||||||
prop = prop_32;
|
prop = prop_32;
|
||||||
}
|
}
|
||||||
@ -94,10 +110,7 @@ static int get_phb_number(struct device_node *dn)
|
|||||||
if ((phb_id >= 0) && !test_and_set_bit(phb_id, phb_bitmap))
|
if ((phb_id >= 0) && !test_and_set_bit(phb_id, phb_bitmap))
|
||||||
return phb_id;
|
return phb_id;
|
||||||
|
|
||||||
/*
|
/* If everything fails then fallback to dynamic PHB numbering. */
|
||||||
* If not pseries nor powernv, or if fixed PHB numbering tried to add
|
|
||||||
* the same PHB number twice, then fallback to dynamic PHB numbering.
|
|
||||||
*/
|
|
||||||
phb_id = find_first_zero_bit(phb_bitmap, MAX_PHBS);
|
phb_id = find_first_zero_bit(phb_bitmap, MAX_PHBS);
|
||||||
BUG_ON(phb_id >= MAX_PHBS);
|
BUG_ON(phb_id >= MAX_PHBS);
|
||||||
set_bit(phb_id, phb_bitmap);
|
set_bit(phb_id, phb_bitmap);
|
||||||
|
@ -17,9 +17,9 @@ static const struct flag_info flag_array[] = {
|
|||||||
.clear = " ",
|
.clear = " ",
|
||||||
}, {
|
}, {
|
||||||
.mask = _PAGE_RW,
|
.mask = _PAGE_RW,
|
||||||
.val = _PAGE_RW,
|
.val = 0,
|
||||||
.set = "rw",
|
.set = "r ",
|
||||||
.clear = "r ",
|
.clear = "rw",
|
||||||
}, {
|
}, {
|
||||||
.mask = _PAGE_EXEC,
|
.mask = _PAGE_EXEC,
|
||||||
.val = _PAGE_EXEC,
|
.val = _PAGE_EXEC,
|
||||||
|
@ -1267,14 +1267,11 @@ static void power_pmu_disable(struct pmu *pmu)
|
|||||||
* a PMI happens during interrupt replay and perf counter
|
* a PMI happens during interrupt replay and perf counter
|
||||||
* values are cleared by PMU callbacks before replay.
|
* values are cleared by PMU callbacks before replay.
|
||||||
*
|
*
|
||||||
* If any PMC corresponding to the active PMU events are
|
* Disable the interrupt by clearing the paca bit for PMI
|
||||||
* overflown, disable the interrupt by clearing the paca
|
* since we are disabling the PMU now. Otherwise provide a
|
||||||
* bit for PMI since we are disabling the PMU now.
|
* warning if there is PMI pending, but no counter is found
|
||||||
* Otherwise provide a warning if there is PMI pending, but
|
* overflown.
|
||||||
* no counter is found overflown.
|
*
|
||||||
*/
|
|
||||||
if (any_pmc_overflown(cpuhw)) {
|
|
||||||
/*
|
|
||||||
* Since power_pmu_disable runs under local_irq_save, it
|
* Since power_pmu_disable runs under local_irq_save, it
|
||||||
* could happen that code hits a PMC overflow without PMI
|
* could happen that code hits a PMC overflow without PMI
|
||||||
* pending in paca. Hence only clear PMI pending if it was
|
* pending in paca. Hence only clear PMI pending if it was
|
||||||
@ -1286,8 +1283,6 @@ static void power_pmu_disable(struct pmu *pmu)
|
|||||||
*/
|
*/
|
||||||
if (pmi_irq_pending())
|
if (pmi_irq_pending())
|
||||||
clear_pmi_irq_pending();
|
clear_pmi_irq_pending();
|
||||||
} else
|
|
||||||
WARN_ON(pmi_irq_pending());
|
|
||||||
|
|
||||||
val = mmcra = cpuhw->mmcr.mmcra;
|
val = mmcra = cpuhw->mmcr.mmcra;
|
||||||
|
|
||||||
|
@ -152,11 +152,11 @@ config POWER9_CPU
|
|||||||
|
|
||||||
config E5500_CPU
|
config E5500_CPU
|
||||||
bool "Freescale e5500"
|
bool "Freescale e5500"
|
||||||
depends on E500
|
depends on PPC64 && E500
|
||||||
|
|
||||||
config E6500_CPU
|
config E6500_CPU
|
||||||
bool "Freescale e6500"
|
bool "Freescale e6500"
|
||||||
depends on E500
|
depends on PPC64 && E500
|
||||||
|
|
||||||
config 860_CPU
|
config 860_CPU
|
||||||
bool "8xx family"
|
bool "8xx family"
|
||||||
|
@ -226,6 +226,7 @@ static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg)
|
|||||||
if (!prop) {
|
if (!prop) {
|
||||||
dev_dbg(&dev->dev,
|
dev_dbg(&dev->dev,
|
||||||
"axon_msi: no msi-address-(32|64) properties found\n");
|
"axon_msi: no msi-address-(32|64) properties found\n");
|
||||||
|
of_node_put(dn);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -664,6 +664,7 @@ spufs_init_isolated_loader(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
loader = of_get_property(dn, "loader", &size);
|
loader = of_get_property(dn, "loader", &size);
|
||||||
|
of_node_put(dn);
|
||||||
if (!loader)
|
if (!loader)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -63,6 +63,8 @@ int powernv_get_random_real_mode(unsigned long *v)
|
|||||||
struct powernv_rng *rng;
|
struct powernv_rng *rng;
|
||||||
|
|
||||||
rng = raw_cpu_read(powernv_rng);
|
rng = raw_cpu_read(powernv_rng);
|
||||||
|
if (!rng)
|
||||||
|
return 0;
|
||||||
|
|
||||||
*v = rng_whiten(rng, __raw_rm_readq(rng->regs_real));
|
*v = rng_whiten(rng, __raw_rm_readq(rng->regs_real));
|
||||||
|
|
||||||
|
@ -520,6 +520,7 @@ int fsl_add_bridge(struct platform_device *pdev, int is_primary)
|
|||||||
struct resource rsrc;
|
struct resource rsrc;
|
||||||
const int *bus_range;
|
const int *bus_range;
|
||||||
u8 hdr_type, progif;
|
u8 hdr_type, progif;
|
||||||
|
u32 class_code;
|
||||||
struct device_node *dev;
|
struct device_node *dev;
|
||||||
struct ccsr_pci __iomem *pci;
|
struct ccsr_pci __iomem *pci;
|
||||||
u16 temp;
|
u16 temp;
|
||||||
@ -593,6 +594,13 @@ int fsl_add_bridge(struct platform_device *pdev, int is_primary)
|
|||||||
PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS;
|
PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS;
|
||||||
if (fsl_pcie_check_link(hose))
|
if (fsl_pcie_check_link(hose))
|
||||||
hose->indirect_type |= PPC_INDIRECT_TYPE_NO_PCIE_LINK;
|
hose->indirect_type |= PPC_INDIRECT_TYPE_NO_PCIE_LINK;
|
||||||
|
/* Fix Class Code to PCI_CLASS_BRIDGE_PCI_NORMAL for pre-3.0 controller */
|
||||||
|
if (in_be32(&pci->block_rev1) < PCIE_IP_REV_3_0) {
|
||||||
|
early_read_config_dword(hose, 0, 0, PCIE_FSL_CSR_CLASSCODE, &class_code);
|
||||||
|
class_code &= 0xff;
|
||||||
|
class_code |= PCI_CLASS_BRIDGE_PCI_NORMAL << 8;
|
||||||
|
early_write_config_dword(hose, 0, 0, PCIE_FSL_CSR_CLASSCODE, class_code);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Set PBFR(PCI Bus Function Register)[10] = 1 to
|
* Set PBFR(PCI Bus Function Register)[10] = 1 to
|
||||||
|
@ -18,6 +18,7 @@ struct platform_device;
|
|||||||
|
|
||||||
#define PCIE_LTSSM 0x0404 /* PCIE Link Training and Status */
|
#define PCIE_LTSSM 0x0404 /* PCIE Link Training and Status */
|
||||||
#define PCIE_LTSSM_L0 0x16 /* L0 state */
|
#define PCIE_LTSSM_L0 0x16 /* L0 state */
|
||||||
|
#define PCIE_FSL_CSR_CLASSCODE 0x474 /* FSL GPEX CSR */
|
||||||
#define PCIE_IP_REV_2_2 0x02080202 /* PCIE IP block version Rev2.2 */
|
#define PCIE_IP_REV_2_2 0x02080202 /* PCIE IP block version Rev2.2 */
|
||||||
#define PCIE_IP_REV_3_0 0x02080300 /* PCIE IP block version Rev3.0 */
|
#define PCIE_IP_REV_3_0 0x02080300 /* PCIE IP block version Rev3.0 */
|
||||||
#define PIWAR_EN 0x80000000 /* Enable */
|
#define PIWAR_EN 0x80000000 /* Enable */
|
||||||
|
@ -710,6 +710,7 @@ static bool xive_get_max_prio(u8 *max_prio)
|
|||||||
}
|
}
|
||||||
|
|
||||||
reg = of_get_property(rootdn, "ibm,plat-res-int-priorities", &len);
|
reg = of_get_property(rootdn, "ibm,plat-res-int-priorities", &len);
|
||||||
|
of_node_put(rootdn);
|
||||||
if (!reg) {
|
if (!reg) {
|
||||||
pr_err("Failed to read 'ibm,plat-res-int-priorities' property\n");
|
pr_err("Failed to read 'ibm,plat-res-int-priorities' property\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -12,7 +12,7 @@ static void default_power_off(void)
|
|||||||
wait_for_interrupt();
|
wait_for_interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void (*pm_power_off)(void) = default_power_off;
|
void (*pm_power_off)(void) = NULL;
|
||||||
EXPORT_SYMBOL(pm_power_off);
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
void machine_restart(char *cmd)
|
void machine_restart(char *cmd)
|
||||||
@ -23,10 +23,16 @@ void machine_restart(char *cmd)
|
|||||||
|
|
||||||
void machine_halt(void)
|
void machine_halt(void)
|
||||||
{
|
{
|
||||||
|
if (pm_power_off != NULL)
|
||||||
pm_power_off();
|
pm_power_off();
|
||||||
|
else
|
||||||
|
default_power_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
void machine_power_off(void)
|
void machine_power_off(void)
|
||||||
{
|
{
|
||||||
|
if (pm_power_off != NULL)
|
||||||
pm_power_off();
|
pm_power_off();
|
||||||
|
else
|
||||||
|
default_power_off();
|
||||||
}
|
}
|
||||||
|
@ -148,4 +148,6 @@ void gmap_sync_dirty_log_pmd(struct gmap *gmap, unsigned long dirty_bitmap[4],
|
|||||||
unsigned long gaddr, unsigned long vmaddr);
|
unsigned long gaddr, unsigned long vmaddr);
|
||||||
int gmap_mark_unmergeable(void);
|
int gmap_mark_unmergeable(void);
|
||||||
void s390_reset_acc(struct mm_struct *mm);
|
void s390_reset_acc(struct mm_struct *mm);
|
||||||
|
void s390_unlist_old_asce(struct gmap *gmap);
|
||||||
|
int s390_replace_asce(struct gmap *gmap);
|
||||||
#endif /* _ASM_S390_GMAP_H */
|
#endif /* _ASM_S390_GMAP_H */
|
||||||
|
@ -150,6 +150,8 @@ int main(void)
|
|||||||
OFFSET(__LC_BR_R1, lowcore, br_r1_trampoline);
|
OFFSET(__LC_BR_R1, lowcore, br_r1_trampoline);
|
||||||
/* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */
|
/* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */
|
||||||
OFFSET(__LC_DUMP_REIPL, lowcore, ipib);
|
OFFSET(__LC_DUMP_REIPL, lowcore, ipib);
|
||||||
|
OFFSET(__LC_VMCORE_INFO, lowcore, vmcore_info);
|
||||||
|
OFFSET(__LC_OS_INFO, lowcore, os_info);
|
||||||
/* hardware defined lowcore locations 0x1000 - 0x18ff */
|
/* hardware defined lowcore locations 0x1000 - 0x18ff */
|
||||||
OFFSET(__LC_MCESAD, lowcore, mcesad);
|
OFFSET(__LC_MCESAD, lowcore, mcesad);
|
||||||
OFFSET(__LC_EXT_PARAMS2, lowcore, ext_params2);
|
OFFSET(__LC_EXT_PARAMS2, lowcore, ext_params2);
|
||||||
|
@ -432,7 +432,7 @@ static void *get_vmcoreinfo_old(unsigned long *size)
|
|||||||
Elf64_Nhdr note;
|
Elf64_Nhdr note;
|
||||||
void *addr;
|
void *addr;
|
||||||
|
|
||||||
if (copy_oldmem_kernel(&addr, &S390_lowcore.vmcore_info, sizeof(addr)))
|
if (copy_oldmem_kernel(&addr, (void *)__LC_VMCORE_INFO, sizeof(addr)))
|
||||||
return NULL;
|
return NULL;
|
||||||
memset(nt_name, 0, sizeof(nt_name));
|
memset(nt_name, 0, sizeof(nt_name));
|
||||||
if (copy_oldmem_kernel(¬e, addr, sizeof(note)))
|
if (copy_oldmem_kernel(¬e, addr, sizeof(note)))
|
||||||
|
@ -29,6 +29,7 @@ int s390_verify_sig(const char *kernel, unsigned long kernel_len)
|
|||||||
const unsigned long marker_len = sizeof(MODULE_SIG_STRING) - 1;
|
const unsigned long marker_len = sizeof(MODULE_SIG_STRING) - 1;
|
||||||
struct module_signature *ms;
|
struct module_signature *ms;
|
||||||
unsigned long sig_len;
|
unsigned long sig_len;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Skip signature verification when not secure IPLed. */
|
/* Skip signature verification when not secure IPLed. */
|
||||||
if (!ipl_secure_flag)
|
if (!ipl_secure_flag)
|
||||||
@ -63,11 +64,18 @@ int s390_verify_sig(const char *kernel, unsigned long kernel_len)
|
|||||||
return -EBADMSG;
|
return -EBADMSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
return verify_pkcs7_signature(kernel, kernel_len,
|
ret = verify_pkcs7_signature(kernel, kernel_len,
|
||||||
|
kernel + kernel_len, sig_len,
|
||||||
|
VERIFY_USE_SECONDARY_KEYRING,
|
||||||
|
VERIFYING_MODULE_SIGNATURE,
|
||||||
|
NULL, NULL);
|
||||||
|
if (ret == -ENOKEY && IS_ENABLED(CONFIG_INTEGRITY_PLATFORM_KEYRING))
|
||||||
|
ret = verify_pkcs7_signature(kernel, kernel_len,
|
||||||
kernel + kernel_len, sig_len,
|
kernel + kernel_len, sig_len,
|
||||||
VERIFY_USE_PLATFORM_KEYRING,
|
VERIFY_USE_PLATFORM_KEYRING,
|
||||||
VERIFYING_MODULE_SIGNATURE,
|
VERIFYING_MODULE_SIGNATURE,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_KEXEC_SIG */
|
#endif /* CONFIG_KEXEC_SIG */
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <asm/checksum.h>
|
#include <asm/checksum.h>
|
||||||
#include <asm/lowcore.h>
|
#include <asm/lowcore.h>
|
||||||
#include <asm/os_info.h>
|
#include <asm/os_info.h>
|
||||||
|
#include <asm/asm-offsets.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OS info structure has to be page aligned
|
* OS info structure has to be page aligned
|
||||||
@ -123,7 +124,7 @@ static void os_info_old_init(void)
|
|||||||
return;
|
return;
|
||||||
if (!OLDMEM_BASE)
|
if (!OLDMEM_BASE)
|
||||||
goto fail;
|
goto fail;
|
||||||
if (copy_oldmem_kernel(&addr, &S390_lowcore.os_info, sizeof(addr)))
|
if (copy_oldmem_kernel(&addr, (void *)__LC_OS_INFO, sizeof(addr)))
|
||||||
goto fail;
|
goto fail;
|
||||||
if (addr == 0 || addr % PAGE_SIZE)
|
if (addr == 0 || addr % PAGE_SIZE)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -521,12 +521,27 @@ static int handle_pv_uvc(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
static int handle_pv_notification(struct kvm_vcpu *vcpu)
|
static int handle_pv_notification(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (vcpu->arch.sie_block->ipa == 0xb210)
|
if (vcpu->arch.sie_block->ipa == 0xb210)
|
||||||
return handle_pv_spx(vcpu);
|
return handle_pv_spx(vcpu);
|
||||||
if (vcpu->arch.sie_block->ipa == 0xb220)
|
if (vcpu->arch.sie_block->ipa == 0xb220)
|
||||||
return handle_pv_sclp(vcpu);
|
return handle_pv_sclp(vcpu);
|
||||||
if (vcpu->arch.sie_block->ipa == 0xb9a4)
|
if (vcpu->arch.sie_block->ipa == 0xb9a4)
|
||||||
return handle_pv_uvc(vcpu);
|
return handle_pv_uvc(vcpu);
|
||||||
|
if (vcpu->arch.sie_block->ipa >> 8 == 0xae) {
|
||||||
|
/*
|
||||||
|
* Besides external call, other SIGP orders also cause a
|
||||||
|
* 108 (pv notify) intercept. In contrast to external call,
|
||||||
|
* these orders need to be emulated and hence the appropriate
|
||||||
|
* place to handle them is in handle_instruction().
|
||||||
|
* So first try kvm_s390_handle_sigp_pei() and if that isn't
|
||||||
|
* successful, go on with handle_instruction().
|
||||||
|
*/
|
||||||
|
ret = kvm_s390_handle_sigp_pei(vcpu);
|
||||||
|
if (!ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return handle_instruction(vcpu);
|
return handle_instruction(vcpu);
|
||||||
}
|
}
|
||||||
|
@ -163,10 +163,13 @@ int kvm_s390_pv_deinit_vm(struct kvm *kvm, u16 *rc, u16 *rrc)
|
|||||||
atomic_set(&kvm->mm->context.is_protected, 0);
|
atomic_set(&kvm->mm->context.is_protected, 0);
|
||||||
KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY VM: rc %x rrc %x", *rc, *rrc);
|
KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY VM: rc %x rrc %x", *rc, *rrc);
|
||||||
WARN_ONCE(cc, "protvirt destroy vm failed rc %x rrc %x", *rc, *rrc);
|
WARN_ONCE(cc, "protvirt destroy vm failed rc %x rrc %x", *rc, *rrc);
|
||||||
/* Inteded memory leak on "impossible" error */
|
/* Intended memory leak on "impossible" error */
|
||||||
if (!cc)
|
if (!cc) {
|
||||||
kvm_s390_pv_dealloc_vm(kvm);
|
kvm_s390_pv_dealloc_vm(kvm);
|
||||||
return cc ? -EIO : 0;
|
return 0;
|
||||||
|
}
|
||||||
|
s390_replace_asce(kvm->arch.gmap);
|
||||||
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc)
|
int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc)
|
||||||
|
@ -492,9 +492,9 @@ int kvm_s390_handle_sigp_pei(struct kvm_vcpu *vcpu)
|
|||||||
struct kvm_vcpu *dest_vcpu;
|
struct kvm_vcpu *dest_vcpu;
|
||||||
u8 order_code = kvm_s390_get_base_disp_rs(vcpu, NULL);
|
u8 order_code = kvm_s390_get_base_disp_rs(vcpu, NULL);
|
||||||
|
|
||||||
|
if (order_code == SIGP_EXTERNAL_CALL) {
|
||||||
trace_kvm_s390_handle_sigp_pei(vcpu, order_code, cpu_addr);
|
trace_kvm_s390_handle_sigp_pei(vcpu, order_code, cpu_addr);
|
||||||
|
|
||||||
if (order_code == SIGP_EXTERNAL_CALL) {
|
|
||||||
dest_vcpu = kvm_get_vcpu_by_id(vcpu->kvm, cpu_addr);
|
dest_vcpu = kvm_get_vcpu_by_id(vcpu->kvm, cpu_addr);
|
||||||
BUG_ON(dest_vcpu == NULL);
|
BUG_ON(dest_vcpu == NULL);
|
||||||
|
|
||||||
|
@ -2721,3 +2721,89 @@ void s390_reset_acc(struct mm_struct *mm)
|
|||||||
mmput(mm);
|
mmput(mm);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(s390_reset_acc);
|
EXPORT_SYMBOL_GPL(s390_reset_acc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* s390_unlist_old_asce - Remove the topmost level of page tables from the
|
||||||
|
* list of page tables of the gmap.
|
||||||
|
* @gmap: the gmap whose table is to be removed
|
||||||
|
*
|
||||||
|
* On s390x, KVM keeps a list of all pages containing the page tables of the
|
||||||
|
* gmap (the CRST list). This list is used at tear down time to free all
|
||||||
|
* pages that are now not needed anymore.
|
||||||
|
*
|
||||||
|
* This function removes the topmost page of the tree (the one pointed to by
|
||||||
|
* the ASCE) from the CRST list.
|
||||||
|
*
|
||||||
|
* This means that it will not be freed when the VM is torn down, and needs
|
||||||
|
* to be handled separately by the caller, unless a leak is actually
|
||||||
|
* intended. Notice that this function will only remove the page from the
|
||||||
|
* list, the page will still be used as a top level page table (and ASCE).
|
||||||
|
*/
|
||||||
|
void s390_unlist_old_asce(struct gmap *gmap)
|
||||||
|
{
|
||||||
|
struct page *old;
|
||||||
|
|
||||||
|
old = virt_to_page(gmap->table);
|
||||||
|
spin_lock(&gmap->guest_table_lock);
|
||||||
|
list_del(&old->lru);
|
||||||
|
/*
|
||||||
|
* Sometimes the topmost page might need to be "removed" multiple
|
||||||
|
* times, for example if the VM is rebooted into secure mode several
|
||||||
|
* times concurrently, or if s390_replace_asce fails after calling
|
||||||
|
* s390_remove_old_asce and is attempted again later. In that case
|
||||||
|
* the old asce has been removed from the list, and therefore it
|
||||||
|
* will not be freed when the VM terminates, but the ASCE is still
|
||||||
|
* in use and still pointed to.
|
||||||
|
* A subsequent call to replace_asce will follow the pointer and try
|
||||||
|
* to remove the same page from the list again.
|
||||||
|
* Therefore it's necessary that the page of the ASCE has valid
|
||||||
|
* pointers, so list_del can work (and do nothing) without
|
||||||
|
* dereferencing stale or invalid pointers.
|
||||||
|
*/
|
||||||
|
INIT_LIST_HEAD(&old->lru);
|
||||||
|
spin_unlock(&gmap->guest_table_lock);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(s390_unlist_old_asce);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* s390_replace_asce - Try to replace the current ASCE of a gmap with a copy
|
||||||
|
* @gmap: the gmap whose ASCE needs to be replaced
|
||||||
|
*
|
||||||
|
* If the allocation of the new top level page table fails, the ASCE is not
|
||||||
|
* replaced.
|
||||||
|
* In any case, the old ASCE is always removed from the gmap CRST list.
|
||||||
|
* Therefore the caller has to make sure to save a pointer to it
|
||||||
|
* beforehand, unless a leak is actually intended.
|
||||||
|
*/
|
||||||
|
int s390_replace_asce(struct gmap *gmap)
|
||||||
|
{
|
||||||
|
unsigned long asce;
|
||||||
|
struct page *page;
|
||||||
|
void *table;
|
||||||
|
|
||||||
|
s390_unlist_old_asce(gmap);
|
||||||
|
|
||||||
|
page = alloc_pages(GFP_KERNEL_ACCOUNT, CRST_ALLOC_ORDER);
|
||||||
|
if (!page)
|
||||||
|
return -ENOMEM;
|
||||||
|
table = page_to_virt(page);
|
||||||
|
memcpy(table, gmap->table, 1UL << (CRST_ALLOC_ORDER + PAGE_SHIFT));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The caller has to deal with the old ASCE, but here we make sure
|
||||||
|
* the new one is properly added to the CRST list, so that
|
||||||
|
* it will be freed when the VM is torn down.
|
||||||
|
*/
|
||||||
|
spin_lock(&gmap->guest_table_lock);
|
||||||
|
list_add(&page->lru, &gmap->crst_list);
|
||||||
|
spin_unlock(&gmap->guest_table_lock);
|
||||||
|
|
||||||
|
/* Set new table origin while preserving existing ASCE control bits */
|
||||||
|
asce = (gmap->asce & ~_ASCE_ORIGIN) | __pa(table);
|
||||||
|
WRITE_ONCE(gmap->asce, asce);
|
||||||
|
WRITE_ONCE(gmap->mm->context.gmap_asce, asce);
|
||||||
|
WRITE_ONCE(gmap->table, table);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(s390_replace_asce);
|
||||||
|
@ -192,3 +192,8 @@ config UML_TIME_TRAVEL_SUPPORT
|
|||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
source "arch/um/drivers/Kconfig"
|
source "arch/um/drivers/Kconfig"
|
||||||
|
|
||||||
|
config ARCH_SUSPEND_POSSIBLE
|
||||||
|
def_bool y
|
||||||
|
|
||||||
|
source "kernel/power/Kconfig"
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
* protects against a module being loaded twice at the same time.
|
* protects against a module being loaded twice at the same time.
|
||||||
*/
|
*/
|
||||||
static int random_fd = -1;
|
static int random_fd = -1;
|
||||||
static struct hwrng hwrng = { 0, };
|
static struct hwrng hwrng;
|
||||||
static DECLARE_COMPLETION(have_data);
|
static DECLARE_COMPLETION(have_data);
|
||||||
|
|
||||||
static int rng_dev_read(struct hwrng *rng, void *buf, size_t max, bool block)
|
static int rng_dev_read(struct hwrng *rng, void *buf, size_t max, bool block)
|
||||||
|
@ -39,6 +39,8 @@ extern int is_syscall(unsigned long addr);
|
|||||||
|
|
||||||
extern void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
|
extern void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
|
||||||
|
|
||||||
|
extern void uml_pm_wake(void);
|
||||||
|
|
||||||
extern int start_uml(void);
|
extern int start_uml(void);
|
||||||
extern void paging_init(void);
|
extern void paging_init(void);
|
||||||
|
|
||||||
|
@ -241,6 +241,7 @@ extern int set_signals(int enable);
|
|||||||
extern int set_signals_trace(int enable);
|
extern int set_signals_trace(int enable);
|
||||||
extern int os_is_signal_stack(void);
|
extern int os_is_signal_stack(void);
|
||||||
extern void deliver_alarm(void);
|
extern void deliver_alarm(void);
|
||||||
|
extern void register_pm_wake_signal(void);
|
||||||
|
|
||||||
/* util.c */
|
/* util.c */
|
||||||
extern void stack_protections(unsigned long address);
|
extern void stack_protections(unsigned long address);
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/task.h>
|
#include <linux/sched/task.h>
|
||||||
#include <linux/kmsg_dump.h>
|
#include <linux/kmsg_dump.h>
|
||||||
|
#include <linux/suspend.h>
|
||||||
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
@ -385,3 +386,27 @@ void *text_poke(void *addr, const void *opcode, size_t len)
|
|||||||
void text_poke_sync(void)
|
void text_poke_sync(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM_SLEEP
|
||||||
|
void uml_pm_wake(void)
|
||||||
|
{
|
||||||
|
pm_system_wakeup();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int init_pm_wake_signal(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* In external time-travel mode we can't use signals to wake up
|
||||||
|
* since that would mess with the scheduling. We'll have to do
|
||||||
|
* some additional work to support wakeup on virtio devices or
|
||||||
|
* similar, perhaps implementing a fake RTC controller that can
|
||||||
|
* trigger wakeup (and request the appropriate scheduling from
|
||||||
|
* the external scheduler when going to suspend.)
|
||||||
|
*/
|
||||||
|
if (time_travel_mode != TT_MODE_EXTERNAL)
|
||||||
|
register_pm_wake_signal();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
late_initcall(init_pm_wake_signal);
|
||||||
|
#endif
|
||||||
|
@ -136,6 +136,16 @@ void set_sigstack(void *sig_stack, int size)
|
|||||||
panic("enabling signal stack failed, errno = %d\n", errno);
|
panic("enabling signal stack failed, errno = %d\n", errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sigusr1_handler(int sig, struct siginfo *unused_si, mcontext_t *mc)
|
||||||
|
{
|
||||||
|
uml_pm_wake();
|
||||||
|
}
|
||||||
|
|
||||||
|
void register_pm_wake_signal(void)
|
||||||
|
{
|
||||||
|
set_handler(SIGUSR1);
|
||||||
|
}
|
||||||
|
|
||||||
static void (*handlers[_NSIG])(int sig, struct siginfo *si, mcontext_t *mc) = {
|
static void (*handlers[_NSIG])(int sig, struct siginfo *si, mcontext_t *mc) = {
|
||||||
[SIGSEGV] = sig_handler,
|
[SIGSEGV] = sig_handler,
|
||||||
[SIGBUS] = sig_handler,
|
[SIGBUS] = sig_handler,
|
||||||
@ -145,7 +155,9 @@ static void (*handlers[_NSIG])(int sig, struct siginfo *si, mcontext_t *mc) = {
|
|||||||
|
|
||||||
[SIGIO] = sig_handler,
|
[SIGIO] = sig_handler,
|
||||||
[SIGWINCH] = sig_handler,
|
[SIGWINCH] = sig_handler,
|
||||||
[SIGALRM] = timer_alarm_handler
|
[SIGALRM] = timer_alarm_handler,
|
||||||
|
|
||||||
|
[SIGUSR1] = sigusr1_handler,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void hard_handler(int sig, siginfo_t *si, void *p)
|
static void hard_handler(int sig, siginfo_t *si, void *p)
|
||||||
|
@ -103,7 +103,7 @@ $(obj)/zoffset.h: $(obj)/compressed/vmlinux FORCE
|
|||||||
AFLAGS_header.o += -I$(objtree)/$(obj)
|
AFLAGS_header.o += -I$(objtree)/$(obj)
|
||||||
$(obj)/header.o: $(obj)/zoffset.h
|
$(obj)/header.o: $(obj)/zoffset.h
|
||||||
|
|
||||||
LDFLAGS_setup.elf := -m elf_i386 -T
|
LDFLAGS_setup.elf := -m elf_i386 -z noexecstack -T
|
||||||
$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
|
$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
|
||||||
$(call if_changed,ld)
|
$(call if_changed,ld)
|
||||||
|
|
||||||
|
@ -68,6 +68,8 @@ LDFLAGS_vmlinux := -pie $(call ld-option, --no-dynamic-linker)
|
|||||||
ifdef CONFIG_LD_ORPHAN_WARN
|
ifdef CONFIG_LD_ORPHAN_WARN
|
||||||
LDFLAGS_vmlinux += --orphan-handling=warn
|
LDFLAGS_vmlinux += --orphan-handling=warn
|
||||||
endif
|
endif
|
||||||
|
LDFLAGS_vmlinux += -z noexecstack
|
||||||
|
LDFLAGS_vmlinux += $(call ld-option,--no-warn-rwx-segments)
|
||||||
LDFLAGS_vmlinux += -T
|
LDFLAGS_vmlinux += -T
|
||||||
|
|
||||||
hostprogs := mkpiggy
|
hostprogs := mkpiggy
|
||||||
|
@ -21,12 +21,13 @@ CFLAGS_syscall_64.o += $(call cc-option,-Wno-override-init,)
|
|||||||
CFLAGS_syscall_32.o += $(call cc-option,-Wno-override-init,)
|
CFLAGS_syscall_32.o += $(call cc-option,-Wno-override-init,)
|
||||||
CFLAGS_syscall_x32.o += $(call cc-option,-Wno-override-init,)
|
CFLAGS_syscall_x32.o += $(call cc-option,-Wno-override-init,)
|
||||||
|
|
||||||
obj-y := entry.o entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o
|
obj-y := entry.o entry_$(BITS).o syscall_$(BITS).o
|
||||||
obj-y += common.o
|
obj-y += common.o
|
||||||
|
|
||||||
obj-y += vdso/
|
obj-y += vdso/
|
||||||
obj-y += vsyscall/
|
obj-y += vsyscall/
|
||||||
|
|
||||||
|
obj-$(CONFIG_PREEMPTION) += thunk_$(BITS).o
|
||||||
obj-$(CONFIG_IA32_EMULATION) += entry_64_compat.o syscall_32.o
|
obj-$(CONFIG_IA32_EMULATION) += entry_64_compat.o syscall_32.o
|
||||||
obj-$(CONFIG_X86_X32_ABI) += syscall_x32.o
|
obj-$(CONFIG_X86_X32_ABI) += syscall_x32.o
|
||||||
|
|
||||||
|
@ -29,10 +29,8 @@ SYM_CODE_START_NOALIGN(\name)
|
|||||||
SYM_CODE_END(\name)
|
SYM_CODE_END(\name)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPTION
|
|
||||||
THUNK preempt_schedule_thunk, preempt_schedule
|
THUNK preempt_schedule_thunk, preempt_schedule
|
||||||
THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace
|
THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace
|
||||||
EXPORT_SYMBOL(preempt_schedule_thunk)
|
EXPORT_SYMBOL(preempt_schedule_thunk)
|
||||||
EXPORT_SYMBOL(preempt_schedule_notrace_thunk)
|
EXPORT_SYMBOL(preempt_schedule_notrace_thunk)
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -36,14 +36,11 @@ SYM_FUNC_END(\name)
|
|||||||
_ASM_NOKPROBE(\name)
|
_ASM_NOKPROBE(\name)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPTION
|
|
||||||
THUNK preempt_schedule_thunk, preempt_schedule
|
THUNK preempt_schedule_thunk, preempt_schedule
|
||||||
THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace
|
THUNK preempt_schedule_notrace_thunk, preempt_schedule_notrace
|
||||||
EXPORT_SYMBOL(preempt_schedule_thunk)
|
EXPORT_SYMBOL(preempt_schedule_thunk)
|
||||||
EXPORT_SYMBOL(preempt_schedule_notrace_thunk)
|
EXPORT_SYMBOL(preempt_schedule_notrace_thunk)
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPTION
|
|
||||||
SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore)
|
SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore)
|
||||||
popq %r11
|
popq %r11
|
||||||
popq %r10
|
popq %r10
|
||||||
@ -58,4 +55,3 @@ SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore)
|
|||||||
RET
|
RET
|
||||||
_ASM_NOKPROBE(__thunk_restore)
|
_ASM_NOKPROBE(__thunk_restore)
|
||||||
SYM_CODE_END(__thunk_restore)
|
SYM_CODE_END(__thunk_restore)
|
||||||
#endif
|
|
||||||
|
@ -177,7 +177,7 @@ quiet_cmd_vdso = VDSO $@
|
|||||||
sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
|
sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
|
||||||
|
|
||||||
VDSO_LDFLAGS = -shared --hash-style=both --build-id=sha1 \
|
VDSO_LDFLAGS = -shared --hash-style=both --build-id=sha1 \
|
||||||
$(call ld-option, --eh-frame-hdr) -Bsymbolic
|
$(call ld-option, --eh-frame-hdr) -Bsymbolic -z noexecstack
|
||||||
GCOV_PROFILE := n
|
GCOV_PROFILE := n
|
||||||
|
|
||||||
quiet_cmd_vdso_and_check = VDSO $@
|
quiet_cmd_vdso_and_check = VDSO $@
|
||||||
|
@ -432,6 +432,7 @@ struct kvm_pmu {
|
|||||||
unsigned nr_arch_fixed_counters;
|
unsigned nr_arch_fixed_counters;
|
||||||
unsigned available_event_types;
|
unsigned available_event_types;
|
||||||
u64 fixed_ctr_ctrl;
|
u64 fixed_ctr_ctrl;
|
||||||
|
u64 fixed_ctr_ctrl_mask;
|
||||||
u64 global_ctrl;
|
u64 global_ctrl;
|
||||||
u64 global_status;
|
u64 global_status;
|
||||||
u64 global_ovf_ctrl;
|
u64 global_ovf_ctrl;
|
||||||
@ -439,6 +440,7 @@ struct kvm_pmu {
|
|||||||
u64 global_ctrl_mask;
|
u64 global_ctrl_mask;
|
||||||
u64 global_ovf_ctrl_mask;
|
u64 global_ovf_ctrl_mask;
|
||||||
u64 reserved_bits;
|
u64 reserved_bits;
|
||||||
|
u64 raw_event_mask;
|
||||||
u8 version;
|
u8 version;
|
||||||
struct kvm_pmc gp_counters[INTEL_PMC_MAX_GENERIC];
|
struct kvm_pmc gp_counters[INTEL_PMC_MAX_GENERIC];
|
||||||
struct kvm_pmc fixed_counters[INTEL_PMC_MAX_FIXED];
|
struct kvm_pmc fixed_counters[INTEL_PMC_MAX_FIXED];
|
||||||
@ -1117,7 +1119,8 @@ struct kvm_x86_ops {
|
|||||||
struct kvm_segment *var, int seg);
|
struct kvm_segment *var, int seg);
|
||||||
void (*get_cs_db_l_bits)(struct kvm_vcpu *vcpu, int *db, int *l);
|
void (*get_cs_db_l_bits)(struct kvm_vcpu *vcpu, int *db, int *l);
|
||||||
void (*set_cr0)(struct kvm_vcpu *vcpu, unsigned long cr0);
|
void (*set_cr0)(struct kvm_vcpu *vcpu, unsigned long cr0);
|
||||||
int (*set_cr4)(struct kvm_vcpu *vcpu, unsigned long cr4);
|
bool (*is_valid_cr4)(struct kvm_vcpu *vcpu, unsigned long cr0);
|
||||||
|
void (*set_cr4)(struct kvm_vcpu *vcpu, unsigned long cr4);
|
||||||
int (*set_efer)(struct kvm_vcpu *vcpu, u64 efer);
|
int (*set_efer)(struct kvm_vcpu *vcpu, u64 efer);
|
||||||
void (*get_idt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt);
|
void (*get_idt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt);
|
||||||
void (*set_idt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt);
|
void (*set_idt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt);
|
||||||
@ -1340,7 +1343,7 @@ static inline int kvm_arch_flush_remote_tlb(struct kvm *kvm)
|
|||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_mmu_x86_module_init(void);
|
void __init kvm_mmu_x86_module_init(void);
|
||||||
int kvm_mmu_vendor_module_init(void);
|
int kvm_mmu_vendor_module_init(void);
|
||||||
void kvm_mmu_vendor_module_exit(void);
|
void kvm_mmu_vendor_module_exit(void);
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ void __init check_bugs(void)
|
|||||||
/*
|
/*
|
||||||
* spectre_v2_user_select_mitigation() relies on the state set by
|
* spectre_v2_user_select_mitigation() relies on the state set by
|
||||||
* retbleed_select_mitigation(); specifically the STIBP selection is
|
* retbleed_select_mitigation(); specifically the STIBP selection is
|
||||||
* forced for UNRET.
|
* forced for UNRET or IBPB.
|
||||||
*/
|
*/
|
||||||
spectre_v2_user_select_mitigation();
|
spectre_v2_user_select_mitigation();
|
||||||
ssb_select_mitigation();
|
ssb_select_mitigation();
|
||||||
@ -1135,7 +1135,8 @@ spectre_v2_user_select_mitigation(void)
|
|||||||
boot_cpu_has(X86_FEATURE_AMD_STIBP_ALWAYS_ON))
|
boot_cpu_has(X86_FEATURE_AMD_STIBP_ALWAYS_ON))
|
||||||
mode = SPECTRE_V2_USER_STRICT_PREFERRED;
|
mode = SPECTRE_V2_USER_STRICT_PREFERRED;
|
||||||
|
|
||||||
if (retbleed_mitigation == RETBLEED_MITIGATION_UNRET) {
|
if (retbleed_mitigation == RETBLEED_MITIGATION_UNRET ||
|
||||||
|
retbleed_mitigation == RETBLEED_MITIGATION_IBPB) {
|
||||||
if (mode != SPECTRE_V2_USER_STRICT &&
|
if (mode != SPECTRE_V2_USER_STRICT &&
|
||||||
mode != SPECTRE_V2_USER_STRICT_PREFERRED)
|
mode != SPECTRE_V2_USER_STRICT_PREFERRED)
|
||||||
pr_info("Selecting STIBP always-on mode to complement retbleed mitigation\n");
|
pr_info("Selecting STIBP always-on mode to complement retbleed mitigation\n");
|
||||||
@ -2283,10 +2284,11 @@ static ssize_t srbds_show_state(char *buf)
|
|||||||
|
|
||||||
static ssize_t retbleed_show_state(char *buf)
|
static ssize_t retbleed_show_state(char *buf)
|
||||||
{
|
{
|
||||||
if (retbleed_mitigation == RETBLEED_MITIGATION_UNRET) {
|
if (retbleed_mitigation == RETBLEED_MITIGATION_UNRET ||
|
||||||
|
retbleed_mitigation == RETBLEED_MITIGATION_IBPB) {
|
||||||
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD &&
|
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD &&
|
||||||
boot_cpu_data.x86_vendor != X86_VENDOR_HYGON)
|
boot_cpu_data.x86_vendor != X86_VENDOR_HYGON)
|
||||||
return sprintf(buf, "Vulnerable: untrained return thunk on non-Zen uarch\n");
|
return sprintf(buf, "Vulnerable: untrained return thunk / IBPB on non-AMD based uarch\n");
|
||||||
|
|
||||||
return sprintf(buf, "%s; SMT %s\n",
|
return sprintf(buf, "%s; SMT %s\n",
|
||||||
retbleed_strings[retbleed_mitigation],
|
retbleed_strings[retbleed_mitigation],
|
||||||
|
@ -93,6 +93,7 @@ static int ftrace_verify_code(unsigned long ip, const char *old_code)
|
|||||||
|
|
||||||
/* Make sure it is what we expect it to be */
|
/* Make sure it is what we expect it to be */
|
||||||
if (memcmp(cur_code, old_code, MCOUNT_INSN_SIZE) != 0) {
|
if (memcmp(cur_code, old_code, MCOUNT_INSN_SIZE) != 0) {
|
||||||
|
ftrace_expected = old_code;
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,11 @@ static __init int register_e820_pmem(void)
|
|||||||
* simply here to trigger the module to load on demand.
|
* simply here to trigger the module to load on demand.
|
||||||
*/
|
*/
|
||||||
pdev = platform_device_alloc("e820_pmem", -1);
|
pdev = platform_device_alloc("e820_pmem", -1);
|
||||||
return platform_device_add(pdev);
|
|
||||||
|
rc = platform_device_add(pdev);
|
||||||
|
if (rc)
|
||||||
|
platform_device_put(pdev);
|
||||||
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
device_initcall(register_e820_pmem);
|
device_initcall(register_e820_pmem);
|
||||||
|
@ -777,6 +777,10 @@ static void amd_e400_idle(void)
|
|||||||
*/
|
*/
|
||||||
static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c)
|
static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
|
/* User has disallowed the use of MWAIT. Fallback to HALT */
|
||||||
|
if (boot_option_idle_override == IDLE_NOMWAIT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (c->x86_vendor != X86_VENDOR_INTEL)
|
if (c->x86_vendor != X86_VENDOR_INTEL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -885,9 +889,8 @@ static int __init idle_setup(char *str)
|
|||||||
} else if (!strcmp(str, "nomwait")) {
|
} else if (!strcmp(str, "nomwait")) {
|
||||||
/*
|
/*
|
||||||
* If the boot option of "idle=nomwait" is added,
|
* If the boot option of "idle=nomwait" is added,
|
||||||
* it means that mwait will be disabled for CPU C2/C3
|
* it means that mwait will be disabled for CPU C1/C2/C3
|
||||||
* states. In such case it won't touch the variable
|
* states.
|
||||||
* of boot_option_idle_override.
|
|
||||||
*/
|
*/
|
||||||
boot_option_idle_override = IDLE_NOMWAIT;
|
boot_option_idle_override = IDLE_NOMWAIT;
|
||||||
} else
|
} else
|
||||||
|
@ -1772,16 +1772,6 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
|
|||||||
case VCPU_SREG_TR:
|
case VCPU_SREG_TR:
|
||||||
if (seg_desc.s || (seg_desc.type != 1 && seg_desc.type != 9))
|
if (seg_desc.s || (seg_desc.type != 1 && seg_desc.type != 9))
|
||||||
goto exception;
|
goto exception;
|
||||||
if (!seg_desc.p) {
|
|
||||||
err_vec = NP_VECTOR;
|
|
||||||
goto exception;
|
|
||||||
}
|
|
||||||
old_desc = seg_desc;
|
|
||||||
seg_desc.type |= 2; /* busy */
|
|
||||||
ret = ctxt->ops->cmpxchg_emulated(ctxt, desc_addr, &old_desc, &seg_desc,
|
|
||||||
sizeof(seg_desc), &ctxt->exception);
|
|
||||||
if (ret != X86EMUL_CONTINUE)
|
|
||||||
return ret;
|
|
||||||
break;
|
break;
|
||||||
case VCPU_SREG_LDTR:
|
case VCPU_SREG_LDTR:
|
||||||
if (seg_desc.s || seg_desc.type != 2)
|
if (seg_desc.s || seg_desc.type != 2)
|
||||||
@ -1820,7 +1810,16 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
|
|||||||
return ret;
|
return ret;
|
||||||
if (emul_is_noncanonical_address(get_desc_base(&seg_desc) |
|
if (emul_is_noncanonical_address(get_desc_base(&seg_desc) |
|
||||||
((u64)base3 << 32), ctxt))
|
((u64)base3 << 32), ctxt))
|
||||||
return emulate_gp(ctxt, 0);
|
return emulate_gp(ctxt, err_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (seg == VCPU_SREG_TR) {
|
||||||
|
old_desc = seg_desc;
|
||||||
|
seg_desc.type |= 2; /* busy */
|
||||||
|
ret = ctxt->ops->cmpxchg_emulated(ctxt, desc_addr, &old_desc, &seg_desc,
|
||||||
|
sizeof(seg_desc), &ctxt->exception);
|
||||||
|
if (ret != X86EMUL_CONTINUE)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
load:
|
load:
|
||||||
ctxt->ops->set_segment(ctxt, selector, &seg_desc, base3, seg);
|
ctxt->ops->set_segment(ctxt, selector, &seg_desc, base3, seg);
|
||||||
|
@ -428,6 +428,9 @@ static int synic_set_irq(struct kvm_vcpu_hv_synic *synic, u32 sint)
|
|||||||
struct kvm_lapic_irq irq;
|
struct kvm_lapic_irq irq;
|
||||||
int ret, vector;
|
int ret, vector;
|
||||||
|
|
||||||
|
if (KVM_BUG_ON(!lapic_in_kernel(vcpu), vcpu->kvm))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (sint >= ARRAY_SIZE(synic->sint))
|
if (sint >= ARRAY_SIZE(synic->sint))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -991,6 +991,10 @@ bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
|
|||||||
*r = -1;
|
*r = -1;
|
||||||
|
|
||||||
if (irq->shorthand == APIC_DEST_SELF) {
|
if (irq->shorthand == APIC_DEST_SELF) {
|
||||||
|
if (KVM_BUG_ON(!src, kvm)) {
|
||||||
|
*r = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
*r = kvm_apic_set_irq(src->vcpu, irq, dest_map);
|
*r = kvm_apic_set_irq(src->vcpu, irq, dest_map);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -5886,7 +5886,7 @@ static int set_nx_huge_pages(const char *val, const struct kernel_param *kp)
|
|||||||
* nx_huge_pages needs to be resolved to true/false when kvm.ko is loaded, as
|
* nx_huge_pages needs to be resolved to true/false when kvm.ko is loaded, as
|
||||||
* its default value of -1 is technically undefined behavior for a boolean.
|
* its default value of -1 is technically undefined behavior for a boolean.
|
||||||
*/
|
*/
|
||||||
void kvm_mmu_x86_module_init(void)
|
void __init kvm_mmu_x86_module_init(void)
|
||||||
{
|
{
|
||||||
if (nx_huge_pages == -1)
|
if (nx_huge_pages == -1)
|
||||||
__set_nx_huge_pages(get_nx_auto_mode());
|
__set_nx_huge_pages(get_nx_auto_mode());
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/kvm_host.h>
|
#include <linux/kvm_host.h>
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
|
#include <linux/bsearch.h>
|
||||||
|
#include <linux/sort.h>
|
||||||
#include <asm/perf_event.h>
|
#include <asm/perf_event.h>
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
#include "cpuid.h"
|
#include "cpuid.h"
|
||||||
@ -168,13 +170,21 @@ static bool pmc_resume_counter(struct kvm_pmc *pmc)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cmp_u64(const void *pa, const void *pb)
|
||||||
|
{
|
||||||
|
u64 a = *(u64 *)pa;
|
||||||
|
u64 b = *(u64 *)pb;
|
||||||
|
|
||||||
|
return (a > b) - (a < b);
|
||||||
|
}
|
||||||
|
|
||||||
void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
|
void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
|
||||||
{
|
{
|
||||||
u64 config;
|
u64 config;
|
||||||
u32 type = PERF_TYPE_RAW;
|
u32 type = PERF_TYPE_RAW;
|
||||||
struct kvm *kvm = pmc->vcpu->kvm;
|
struct kvm *kvm = pmc->vcpu->kvm;
|
||||||
struct kvm_pmu_event_filter *filter;
|
struct kvm_pmu_event_filter *filter;
|
||||||
int i;
|
struct kvm_pmu *pmu = vcpu_to_pmu(pmc->vcpu);
|
||||||
bool allow_event = true;
|
bool allow_event = true;
|
||||||
|
|
||||||
if (eventsel & ARCH_PERFMON_EVENTSEL_PIN_CONTROL)
|
if (eventsel & ARCH_PERFMON_EVENTSEL_PIN_CONTROL)
|
||||||
@ -189,16 +199,13 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
|
|||||||
|
|
||||||
filter = srcu_dereference(kvm->arch.pmu_event_filter, &kvm->srcu);
|
filter = srcu_dereference(kvm->arch.pmu_event_filter, &kvm->srcu);
|
||||||
if (filter) {
|
if (filter) {
|
||||||
for (i = 0; i < filter->nevents; i++)
|
__u64 key = eventsel & AMD64_RAW_EVENT_MASK_NB;
|
||||||
if (filter->events[i] ==
|
|
||||||
(eventsel & AMD64_RAW_EVENT_MASK_NB))
|
if (bsearch(&key, filter->events, filter->nevents,
|
||||||
break;
|
sizeof(__u64), cmp_u64))
|
||||||
if (filter->action == KVM_PMU_EVENT_ALLOW &&
|
allow_event = filter->action == KVM_PMU_EVENT_ALLOW;
|
||||||
i == filter->nevents)
|
else
|
||||||
allow_event = false;
|
allow_event = filter->action == KVM_PMU_EVENT_DENY;
|
||||||
if (filter->action == KVM_PMU_EVENT_DENY &&
|
|
||||||
i < filter->nevents)
|
|
||||||
allow_event = false;
|
|
||||||
}
|
}
|
||||||
if (!allow_event)
|
if (!allow_event)
|
||||||
return;
|
return;
|
||||||
@ -214,7 +221,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (type == PERF_TYPE_RAW)
|
if (type == PERF_TYPE_RAW)
|
||||||
config = eventsel & AMD64_RAW_EVENT_MASK;
|
config = eventsel & pmu->raw_event_mask;
|
||||||
|
|
||||||
if (pmc->current_config == eventsel && pmc_resume_counter(pmc))
|
if (pmc->current_config == eventsel && pmc_resume_counter(pmc))
|
||||||
return;
|
return;
|
||||||
@ -507,6 +514,11 @@ int kvm_vm_ioctl_set_pmu_event_filter(struct kvm *kvm, void __user *argp)
|
|||||||
/* Ensure nevents can't be changed between the user copies. */
|
/* Ensure nevents can't be changed between the user copies. */
|
||||||
*filter = tmp;
|
*filter = tmp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sort the in-kernel list so that we can search it with bsearch.
|
||||||
|
*/
|
||||||
|
sort(&filter->events, filter->nevents, sizeof(__u64), cmp_u64, NULL);
|
||||||
|
|
||||||
mutex_lock(&kvm->lock);
|
mutex_lock(&kvm->lock);
|
||||||
filter = rcu_replace_pointer(kvm->arch.pmu_event_filter, filter,
|
filter = rcu_replace_pointer(kvm->arch.pmu_event_filter, filter,
|
||||||
mutex_is_locked(&kvm->lock));
|
mutex_is_locked(&kvm->lock));
|
||||||
|
@ -295,6 +295,7 @@ static void amd_pmu_refresh(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
pmu->counter_bitmask[KVM_PMC_GP] = ((u64)1 << 48) - 1;
|
pmu->counter_bitmask[KVM_PMC_GP] = ((u64)1 << 48) - 1;
|
||||||
pmu->reserved_bits = 0xfffffff000280000ull;
|
pmu->reserved_bits = 0xfffffff000280000ull;
|
||||||
|
pmu->raw_event_mask = AMD64_RAW_EVENT_MASK;
|
||||||
pmu->version = 1;
|
pmu->version = 1;
|
||||||
/* not applicable to AMD; but clean them to prevent any fall out */
|
/* not applicable to AMD; but clean them to prevent any fall out */
|
||||||
pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
|
pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
|
||||||
|
@ -1692,14 +1692,16 @@ void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
|
|||||||
update_cr0_intercept(svm);
|
update_cr0_intercept(svm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
static bool svm_is_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
{
|
{
|
||||||
unsigned long host_cr4_mce = cr4_read_shadow() & X86_CR4_MCE;
|
unsigned long host_cr4_mce = cr4_read_shadow() & X86_CR4_MCE;
|
||||||
unsigned long old_cr4 = to_svm(vcpu)->vmcb->save.cr4;
|
unsigned long old_cr4 = to_svm(vcpu)->vmcb->save.cr4;
|
||||||
|
|
||||||
if (cr4 & X86_CR4_VMXE)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (npt_enabled && ((old_cr4 ^ cr4) & X86_CR4_PGE))
|
if (npt_enabled && ((old_cr4 ^ cr4) & X86_CR4_PGE))
|
||||||
svm_flush_tlb(vcpu);
|
svm_flush_tlb(vcpu);
|
||||||
|
|
||||||
@ -1709,7 +1711,6 @@ int svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
|||||||
cr4 |= host_cr4_mce;
|
cr4 |= host_cr4_mce;
|
||||||
to_svm(vcpu)->vmcb->save.cr4 = cr4;
|
to_svm(vcpu)->vmcb->save.cr4 = cr4;
|
||||||
vmcb_mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR);
|
vmcb_mark_dirty(to_svm(vcpu)->vmcb, VMCB_CR);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void svm_set_segment(struct kvm_vcpu *vcpu,
|
static void svm_set_segment(struct kvm_vcpu *vcpu,
|
||||||
@ -3188,8 +3189,6 @@ static void svm_set_irq(struct kvm_vcpu *vcpu)
|
|||||||
{
|
{
|
||||||
struct vcpu_svm *svm = to_svm(vcpu);
|
struct vcpu_svm *svm = to_svm(vcpu);
|
||||||
|
|
||||||
BUG_ON(!(gif_set(svm)));
|
|
||||||
|
|
||||||
trace_kvm_inj_virq(vcpu->arch.interrupt.nr);
|
trace_kvm_inj_virq(vcpu->arch.interrupt.nr);
|
||||||
++vcpu->stat.irq_injections;
|
++vcpu->stat.irq_injections;
|
||||||
|
|
||||||
@ -4243,6 +4242,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = {
|
|||||||
.get_cpl = svm_get_cpl,
|
.get_cpl = svm_get_cpl,
|
||||||
.get_cs_db_l_bits = kvm_get_cs_db_l_bits,
|
.get_cs_db_l_bits = kvm_get_cs_db_l_bits,
|
||||||
.set_cr0 = svm_set_cr0,
|
.set_cr0 = svm_set_cr0,
|
||||||
|
.is_valid_cr4 = svm_is_valid_cr4,
|
||||||
.set_cr4 = svm_set_cr4,
|
.set_cr4 = svm_set_cr4,
|
||||||
.set_efer = svm_set_efer,
|
.set_efer = svm_set_efer,
|
||||||
.get_idt = svm_get_idt,
|
.get_idt = svm_get_idt,
|
||||||
|
@ -355,7 +355,7 @@ void svm_vcpu_free_msrpm(u32 *msrpm);
|
|||||||
|
|
||||||
int svm_set_efer(struct kvm_vcpu *vcpu, u64 efer);
|
int svm_set_efer(struct kvm_vcpu *vcpu, u64 efer);
|
||||||
void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0);
|
void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0);
|
||||||
int svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4);
|
void svm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4);
|
||||||
void svm_flush_tlb(struct kvm_vcpu *vcpu);
|
void svm_flush_tlb(struct kvm_vcpu *vcpu);
|
||||||
void disable_nmi_singlestep(struct vcpu_svm *svm);
|
void disable_nmi_singlestep(struct vcpu_svm *svm);
|
||||||
bool svm_smi_blocked(struct kvm_vcpu *vcpu);
|
bool svm_smi_blocked(struct kvm_vcpu *vcpu);
|
||||||
|
@ -1245,7 +1245,7 @@ static int vmx_restore_vmx_basic(struct vcpu_vmx *vmx, u64 data)
|
|||||||
BIT_ULL(49) | BIT_ULL(54) | BIT_ULL(55) |
|
BIT_ULL(49) | BIT_ULL(54) | BIT_ULL(55) |
|
||||||
/* reserved */
|
/* reserved */
|
||||||
BIT_ULL(31) | GENMASK_ULL(47, 45) | GENMASK_ULL(63, 56);
|
BIT_ULL(31) | GENMASK_ULL(47, 45) | GENMASK_ULL(63, 56);
|
||||||
u64 vmx_basic = vmx->nested.msrs.basic;
|
u64 vmx_basic = vmcs_config.nested.basic;
|
||||||
|
|
||||||
if (!is_bitwise_subset(vmx_basic, data, feature_and_reserved))
|
if (!is_bitwise_subset(vmx_basic, data, feature_and_reserved))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -1268,36 +1268,42 @@ static int vmx_restore_vmx_basic(struct vcpu_vmx *vmx, u64 data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static void vmx_get_control_msr(struct nested_vmx_msrs *msrs, u32 msr_index,
|
||||||
vmx_restore_control_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data)
|
u32 **low, u32 **high)
|
||||||
{
|
{
|
||||||
u64 supported;
|
|
||||||
u32 *lowp, *highp;
|
|
||||||
|
|
||||||
switch (msr_index) {
|
switch (msr_index) {
|
||||||
case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
|
case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
|
||||||
lowp = &vmx->nested.msrs.pinbased_ctls_low;
|
*low = &msrs->pinbased_ctls_low;
|
||||||
highp = &vmx->nested.msrs.pinbased_ctls_high;
|
*high = &msrs->pinbased_ctls_high;
|
||||||
break;
|
break;
|
||||||
case MSR_IA32_VMX_TRUE_PROCBASED_CTLS:
|
case MSR_IA32_VMX_TRUE_PROCBASED_CTLS:
|
||||||
lowp = &vmx->nested.msrs.procbased_ctls_low;
|
*low = &msrs->procbased_ctls_low;
|
||||||
highp = &vmx->nested.msrs.procbased_ctls_high;
|
*high = &msrs->procbased_ctls_high;
|
||||||
break;
|
break;
|
||||||
case MSR_IA32_VMX_TRUE_EXIT_CTLS:
|
case MSR_IA32_VMX_TRUE_EXIT_CTLS:
|
||||||
lowp = &vmx->nested.msrs.exit_ctls_low;
|
*low = &msrs->exit_ctls_low;
|
||||||
highp = &vmx->nested.msrs.exit_ctls_high;
|
*high = &msrs->exit_ctls_high;
|
||||||
break;
|
break;
|
||||||
case MSR_IA32_VMX_TRUE_ENTRY_CTLS:
|
case MSR_IA32_VMX_TRUE_ENTRY_CTLS:
|
||||||
lowp = &vmx->nested.msrs.entry_ctls_low;
|
*low = &msrs->entry_ctls_low;
|
||||||
highp = &vmx->nested.msrs.entry_ctls_high;
|
*high = &msrs->entry_ctls_high;
|
||||||
break;
|
break;
|
||||||
case MSR_IA32_VMX_PROCBASED_CTLS2:
|
case MSR_IA32_VMX_PROCBASED_CTLS2:
|
||||||
lowp = &vmx->nested.msrs.secondary_ctls_low;
|
*low = &msrs->secondary_ctls_low;
|
||||||
highp = &vmx->nested.msrs.secondary_ctls_high;
|
*high = &msrs->secondary_ctls_high;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
vmx_restore_control_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data)
|
||||||
|
{
|
||||||
|
u32 *lowp, *highp;
|
||||||
|
u64 supported;
|
||||||
|
|
||||||
|
vmx_get_control_msr(&vmcs_config.nested, msr_index, &lowp, &highp);
|
||||||
|
|
||||||
supported = vmx_control_msr(*lowp, *highp);
|
supported = vmx_control_msr(*lowp, *highp);
|
||||||
|
|
||||||
@ -1309,6 +1315,7 @@ vmx_restore_control_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data)
|
|||||||
if (!is_bitwise_subset(supported, data, GENMASK_ULL(63, 32)))
|
if (!is_bitwise_subset(supported, data, GENMASK_ULL(63, 32)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
vmx_get_control_msr(&vmx->nested.msrs, msr_index, &lowp, &highp);
|
||||||
*lowp = data;
|
*lowp = data;
|
||||||
*highp = data >> 32;
|
*highp = data >> 32;
|
||||||
return 0;
|
return 0;
|
||||||
@ -1322,10 +1329,8 @@ static int vmx_restore_vmx_misc(struct vcpu_vmx *vmx, u64 data)
|
|||||||
BIT_ULL(28) | BIT_ULL(29) | BIT_ULL(30) |
|
BIT_ULL(28) | BIT_ULL(29) | BIT_ULL(30) |
|
||||||
/* reserved */
|
/* reserved */
|
||||||
GENMASK_ULL(13, 9) | BIT_ULL(31);
|
GENMASK_ULL(13, 9) | BIT_ULL(31);
|
||||||
u64 vmx_misc;
|
u64 vmx_misc = vmx_control_msr(vmcs_config.nested.misc_low,
|
||||||
|
vmcs_config.nested.misc_high);
|
||||||
vmx_misc = vmx_control_msr(vmx->nested.msrs.misc_low,
|
|
||||||
vmx->nested.msrs.misc_high);
|
|
||||||
|
|
||||||
if (!is_bitwise_subset(vmx_misc, data, feature_and_reserved_bits))
|
if (!is_bitwise_subset(vmx_misc, data, feature_and_reserved_bits))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -1353,10 +1358,8 @@ static int vmx_restore_vmx_misc(struct vcpu_vmx *vmx, u64 data)
|
|||||||
|
|
||||||
static int vmx_restore_vmx_ept_vpid_cap(struct vcpu_vmx *vmx, u64 data)
|
static int vmx_restore_vmx_ept_vpid_cap(struct vcpu_vmx *vmx, u64 data)
|
||||||
{
|
{
|
||||||
u64 vmx_ept_vpid_cap;
|
u64 vmx_ept_vpid_cap = vmx_control_msr(vmcs_config.nested.ept_caps,
|
||||||
|
vmcs_config.nested.vpid_caps);
|
||||||
vmx_ept_vpid_cap = vmx_control_msr(vmx->nested.msrs.ept_caps,
|
|
||||||
vmx->nested.msrs.vpid_caps);
|
|
||||||
|
|
||||||
/* Every bit is either reserved or a feature bit. */
|
/* Every bit is either reserved or a feature bit. */
|
||||||
if (!is_bitwise_subset(vmx_ept_vpid_cap, data, -1ULL))
|
if (!is_bitwise_subset(vmx_ept_vpid_cap, data, -1ULL))
|
||||||
@ -1367,20 +1370,21 @@ static int vmx_restore_vmx_ept_vpid_cap(struct vcpu_vmx *vmx, u64 data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vmx_restore_fixed0_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data)
|
static u64 *vmx_get_fixed0_msr(struct nested_vmx_msrs *msrs, u32 msr_index)
|
||||||
{
|
{
|
||||||
u64 *msr;
|
|
||||||
|
|
||||||
switch (msr_index) {
|
switch (msr_index) {
|
||||||
case MSR_IA32_VMX_CR0_FIXED0:
|
case MSR_IA32_VMX_CR0_FIXED0:
|
||||||
msr = &vmx->nested.msrs.cr0_fixed0;
|
return &msrs->cr0_fixed0;
|
||||||
break;
|
|
||||||
case MSR_IA32_VMX_CR4_FIXED0:
|
case MSR_IA32_VMX_CR4_FIXED0:
|
||||||
msr = &vmx->nested.msrs.cr4_fixed0;
|
return &msrs->cr4_fixed0;
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int vmx_restore_fixed0_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data)
|
||||||
|
{
|
||||||
|
const u64 *msr = vmx_get_fixed0_msr(&vmcs_config.nested, msr_index);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 1 bits (which indicates bits which "must-be-1" during VMX operation)
|
* 1 bits (which indicates bits which "must-be-1" during VMX operation)
|
||||||
@ -1389,7 +1393,7 @@ static int vmx_restore_fixed0_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data)
|
|||||||
if (!is_bitwise_subset(data, *msr, -1ULL))
|
if (!is_bitwise_subset(data, *msr, -1ULL))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
*msr = data;
|
*vmx_get_fixed0_msr(&vmx->nested.msrs, msr_index) = data;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1450,7 +1454,7 @@ int vmx_set_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
|
|||||||
vmx->nested.msrs.vmcs_enum = data;
|
vmx->nested.msrs.vmcs_enum = data;
|
||||||
return 0;
|
return 0;
|
||||||
case MSR_IA32_VMX_VMFUNC:
|
case MSR_IA32_VMX_VMFUNC:
|
||||||
if (data & ~vmx->nested.msrs.vmfunc_controls)
|
if (data & ~vmcs_config.nested.vmfunc_controls)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
vmx->nested.msrs.vmfunc_controls = data;
|
vmx->nested.msrs.vmfunc_controls = data;
|
||||||
return 0;
|
return 0;
|
||||||
@ -3337,10 +3341,12 @@ enum nvmx_vmentry_status nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu,
|
|||||||
if (likely(!evaluate_pending_interrupts) && kvm_vcpu_apicv_active(vcpu))
|
if (likely(!evaluate_pending_interrupts) && kvm_vcpu_apicv_active(vcpu))
|
||||||
evaluate_pending_interrupts |= vmx_has_apicv_interrupt(vcpu);
|
evaluate_pending_interrupts |= vmx_has_apicv_interrupt(vcpu);
|
||||||
|
|
||||||
if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS))
|
if (!vmx->nested.nested_run_pending ||
|
||||||
|
!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS))
|
||||||
vmx->nested.vmcs01_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL);
|
vmx->nested.vmcs01_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL);
|
||||||
if (kvm_mpx_supported() &&
|
if (kvm_mpx_supported() &&
|
||||||
!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))
|
(!vmx->nested.nested_run_pending ||
|
||||||
|
!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)))
|
||||||
vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS);
|
vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -4871,20 +4877,25 @@ static int handle_vmon(struct kvm_vcpu *vcpu)
|
|||||||
| FEAT_CTL_VMX_ENABLED_OUTSIDE_SMX;
|
| FEAT_CTL_VMX_ENABLED_OUTSIDE_SMX;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Intel VMX Instruction Reference lists a bunch of bits that are
|
* Note, KVM cannot rely on hardware to perform the CR0/CR4 #UD checks
|
||||||
* prerequisite to running VMXON, most notably cr4.VMXE must be set to
|
* that have higher priority than VM-Exit (see Intel SDM's pseudocode
|
||||||
* 1 (see vmx_set_cr4() for when we allow the guest to set this).
|
* for VMXON), as KVM must load valid CR0/CR4 values into hardware while
|
||||||
* Otherwise, we should fail with #UD. But most faulting conditions
|
* running the guest, i.e. KVM needs to check the _guest_ values.
|
||||||
* have already been checked by hardware, prior to the VM-exit for
|
*
|
||||||
* VMXON. We do test guest cr4.VMXE because processor CR4 always has
|
* Rely on hardware for the other two pre-VM-Exit checks, !VM86 and
|
||||||
* that bit set to 1 in non-root mode.
|
* !COMPATIBILITY modes. KVM may run the guest in VM86 to emulate Real
|
||||||
|
* Mode, but KVM will never take the guest out of those modes.
|
||||||
*/
|
*/
|
||||||
if (!kvm_read_cr4_bits(vcpu, X86_CR4_VMXE)) {
|
if (!nested_host_cr0_valid(vcpu, kvm_read_cr0(vcpu)) ||
|
||||||
|
!nested_host_cr4_valid(vcpu, kvm_read_cr4(vcpu))) {
|
||||||
kvm_queue_exception(vcpu, UD_VECTOR);
|
kvm_queue_exception(vcpu, UD_VECTOR);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CPL=0 must be checked manually. */
|
/*
|
||||||
|
* CPL=0 and all other checks that are lower priority than VM-Exit must
|
||||||
|
* be checked manually.
|
||||||
|
*/
|
||||||
if (vmx_get_cpl(vcpu)) {
|
if (vmx_get_cpl(vcpu)) {
|
||||||
kvm_inject_gp(vcpu, 0);
|
kvm_inject_gp(vcpu, 0);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -104,6 +104,9 @@ static bool intel_pmc_is_enabled(struct kvm_pmc *pmc)
|
|||||||
{
|
{
|
||||||
struct kvm_pmu *pmu = pmc_to_pmu(pmc);
|
struct kvm_pmu *pmu = pmc_to_pmu(pmc);
|
||||||
|
|
||||||
|
if (pmu->version < 2)
|
||||||
|
return true;
|
||||||
|
|
||||||
return test_bit(pmc->idx, (unsigned long *)&pmu->global_ctrl);
|
return test_bit(pmc->idx, (unsigned long *)&pmu->global_ctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,12 +156,17 @@ static struct kvm_pmc *intel_rdpmc_ecx_to_pmc(struct kvm_vcpu *vcpu,
|
|||||||
return &counters[array_index_nospec(idx, num_counters)];
|
return &counters[array_index_nospec(idx, num_counters)];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool fw_writes_is_enabled(struct kvm_vcpu *vcpu)
|
static inline u64 vcpu_get_perf_capabilities(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
if (!guest_cpuid_has(vcpu, X86_FEATURE_PDCM))
|
if (!guest_cpuid_has(vcpu, X86_FEATURE_PDCM))
|
||||||
return false;
|
return 0;
|
||||||
|
|
||||||
return vcpu->arch.perf_capabilities & PMU_CAP_FW_WRITES;
|
return vcpu->arch.perf_capabilities;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool fw_writes_is_enabled(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return (vcpu_get_perf_capabilities(vcpu) & PMU_CAP_FW_WRITES) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct kvm_pmc *get_fw_gp_pmc(struct kvm_pmu *pmu, u32 msr)
|
static inline struct kvm_pmc *get_fw_gp_pmc(struct kvm_pmu *pmu, u32 msr)
|
||||||
@ -254,7 +262,7 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|||||||
case MSR_CORE_PERF_FIXED_CTR_CTRL:
|
case MSR_CORE_PERF_FIXED_CTR_CTRL:
|
||||||
if (pmu->fixed_ctr_ctrl == data)
|
if (pmu->fixed_ctr_ctrl == data)
|
||||||
return 0;
|
return 0;
|
||||||
if (!(data & 0xfffffffffffff444ull)) {
|
if (!(data & pmu->fixed_ctr_ctrl_mask)) {
|
||||||
reprogram_fixed_counters(pmu, data);
|
reprogram_fixed_counters(pmu, data);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -321,6 +329,7 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
|
|||||||
struct kvm_cpuid_entry2 *entry;
|
struct kvm_cpuid_entry2 *entry;
|
||||||
union cpuid10_eax eax;
|
union cpuid10_eax eax;
|
||||||
union cpuid10_edx edx;
|
union cpuid10_edx edx;
|
||||||
|
int i;
|
||||||
|
|
||||||
pmu->nr_arch_gp_counters = 0;
|
pmu->nr_arch_gp_counters = 0;
|
||||||
pmu->nr_arch_fixed_counters = 0;
|
pmu->nr_arch_fixed_counters = 0;
|
||||||
@ -328,7 +337,10 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
|
|||||||
pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
|
pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
|
||||||
pmu->version = 0;
|
pmu->version = 0;
|
||||||
pmu->reserved_bits = 0xffffffff00200000ull;
|
pmu->reserved_bits = 0xffffffff00200000ull;
|
||||||
vcpu->arch.perf_capabilities = 0;
|
pmu->raw_event_mask = X86_RAW_EVENT_MASK;
|
||||||
|
pmu->global_ctrl_mask = ~0ull;
|
||||||
|
pmu->global_ovf_ctrl_mask = ~0ull;
|
||||||
|
pmu->fixed_ctr_ctrl_mask = ~0ull;
|
||||||
|
|
||||||
entry = kvm_find_cpuid_entry(vcpu, 0xa, 0);
|
entry = kvm_find_cpuid_entry(vcpu, 0xa, 0);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
@ -341,8 +353,6 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
perf_get_x86_pmu_capability(&x86_pmu);
|
perf_get_x86_pmu_capability(&x86_pmu);
|
||||||
if (guest_cpuid_has(vcpu, X86_FEATURE_PDCM))
|
|
||||||
vcpu->arch.perf_capabilities = vmx_get_perf_capabilities();
|
|
||||||
|
|
||||||
pmu->nr_arch_gp_counters = min_t(int, eax.split.num_counters,
|
pmu->nr_arch_gp_counters = min_t(int, eax.split.num_counters,
|
||||||
x86_pmu.num_counters_gp);
|
x86_pmu.num_counters_gp);
|
||||||
@ -364,6 +374,8 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu)
|
|||||||
((u64)1 << edx.split.bit_width_fixed) - 1;
|
((u64)1 << edx.split.bit_width_fixed) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < pmu->nr_arch_fixed_counters; i++)
|
||||||
|
pmu->fixed_ctr_ctrl_mask &= ~(0xbull << (i * 4));
|
||||||
pmu->global_ctrl = ((1ull << pmu->nr_arch_gp_counters) - 1) |
|
pmu->global_ctrl = ((1ull << pmu->nr_arch_gp_counters) - 1) |
|
||||||
(((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED);
|
(((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED);
|
||||||
pmu->global_ctrl_mask = ~pmu->global_ctrl;
|
pmu->global_ctrl_mask = ~pmu->global_ctrl;
|
||||||
@ -406,6 +418,8 @@ static void intel_pmu_init(struct kvm_vcpu *vcpu)
|
|||||||
pmu->fixed_counters[i].idx = i + INTEL_PMC_IDX_FIXED;
|
pmu->fixed_counters[i].idx = i + INTEL_PMC_IDX_FIXED;
|
||||||
pmu->fixed_counters[i].current_config = 0;
|
pmu->fixed_counters[i].current_config = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vcpu->arch.perf_capabilities = vmx_get_perf_capabilities();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_pmu_reset(struct kvm_vcpu *vcpu)
|
static void intel_pmu_reset(struct kvm_vcpu *vcpu)
|
||||||
|
@ -3183,7 +3183,23 @@ static void vmx_load_mmu_pgd(struct kvm_vcpu *vcpu, unsigned long pgd,
|
|||||||
vmcs_writel(GUEST_CR3, guest_cr3);
|
vmcs_writel(GUEST_CR3, guest_cr3);
|
||||||
}
|
}
|
||||||
|
|
||||||
int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
static bool vmx_is_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We operate under the default treatment of SMM, so VMX cannot be
|
||||||
|
* enabled under SMM. Note, whether or not VMXE is allowed at all is
|
||||||
|
* handled by kvm_valid_cr4().
|
||||||
|
*/
|
||||||
|
if ((cr4 & X86_CR4_VMXE) && is_smm(vcpu))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (to_vmx(vcpu)->nested.vmxon && !nested_cr4_valid(vcpu, cr4))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
{
|
{
|
||||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||||
/*
|
/*
|
||||||
@ -3211,21 +3227,6 @@ int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cr4 & X86_CR4_VMXE) {
|
|
||||||
/*
|
|
||||||
* To use VMXON (and later other VMX instructions), a guest
|
|
||||||
* must first be able to turn on cr4.VMXE (see handle_vmon()).
|
|
||||||
* So basically the check on whether to allow nested VMX
|
|
||||||
* is here. We operate under the default treatment of SMM,
|
|
||||||
* so VMX cannot be enabled under SMM.
|
|
||||||
*/
|
|
||||||
if (!nested_vmx_allowed(vcpu) || is_smm(vcpu))
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vmx->nested.vmxon && !nested_cr4_valid(vcpu, cr4))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
vcpu->arch.cr4 = cr4;
|
vcpu->arch.cr4 = cr4;
|
||||||
kvm_register_mark_available(vcpu, VCPU_EXREG_CR4);
|
kvm_register_mark_available(vcpu, VCPU_EXREG_CR4);
|
||||||
|
|
||||||
@ -3256,7 +3257,6 @@ int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
|||||||
|
|
||||||
vmcs_writel(CR4_READ_SHADOW, cr4);
|
vmcs_writel(CR4_READ_SHADOW, cr4);
|
||||||
vmcs_writel(GUEST_CR4, hw_cr4);
|
vmcs_writel(GUEST_CR4, hw_cr4);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vmx_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg)
|
void vmx_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg)
|
||||||
@ -7752,6 +7752,7 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {
|
|||||||
.get_cpl = vmx_get_cpl,
|
.get_cpl = vmx_get_cpl,
|
||||||
.get_cs_db_l_bits = vmx_get_cs_db_l_bits,
|
.get_cs_db_l_bits = vmx_get_cs_db_l_bits,
|
||||||
.set_cr0 = vmx_set_cr0,
|
.set_cr0 = vmx_set_cr0,
|
||||||
|
.is_valid_cr4 = vmx_is_valid_cr4,
|
||||||
.set_cr4 = vmx_set_cr4,
|
.set_cr4 = vmx_set_cr4,
|
||||||
.set_efer = vmx_set_efer,
|
.set_efer = vmx_set_efer,
|
||||||
.get_idt = vmx_get_idt,
|
.get_idt = vmx_get_idt,
|
||||||
|
@ -347,7 +347,7 @@ u32 vmx_get_interrupt_shadow(struct kvm_vcpu *vcpu);
|
|||||||
void vmx_set_interrupt_shadow(struct kvm_vcpu *vcpu, int mask);
|
void vmx_set_interrupt_shadow(struct kvm_vcpu *vcpu, int mask);
|
||||||
int vmx_set_efer(struct kvm_vcpu *vcpu, u64 efer);
|
int vmx_set_efer(struct kvm_vcpu *vcpu, u64 efer);
|
||||||
void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0);
|
void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0);
|
||||||
int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4);
|
void vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4);
|
||||||
void set_cr4_guest_host_mask(struct vcpu_vmx *vmx);
|
void set_cr4_guest_host_mask(struct vcpu_vmx *vmx);
|
||||||
void ept_save_pdptrs(struct kvm_vcpu *vcpu);
|
void ept_save_pdptrs(struct kvm_vcpu *vcpu);
|
||||||
void vmx_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg);
|
void vmx_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user