LoongArch KVM changes for v6.11

1. Add ParaVirt steal time support.
 2. Add some VM migration enhancement.
 3. Add perf kvm-stat support for loongarch.
 -----BEGIN PGP SIGNATURE-----
 
 iQJKBAABCAA0FiEEzOlt8mkP+tbeiYy5AoYrw/LiJnoFAmaOS6UWHGNoZW5odWFj
 YWlAa2VybmVsLm9yZwAKCRAChivD8uImehejD/9pACGe3h3krXLcFVWXOFIu5Hpc
 5kQLP0lSPJ/o5Xs8t/oPLrnDX70z90wXI1LOmltc7h32MSwFa2l8COQh+sN5eJBQ
 PNyt7u7bMipp0yJS4Gl3LQQ5vklcGOSpQc/gbeXnVx8J/tz+Mo9YGGLIXVRXRM6W
 Ri8D2VVFiwzQQYeTpPo1u1Ob8C6mA4KOppwvhscMTM3vj4NMbsinBzRnR0lG0Tdw
 meFhxDPly1Ksxsbnj9UGO6UnEY0A2SLONs6MiO4y4DtoqoDlw/lbqFJuYo4vvbx1
 pxtjyirD/PX/wjslQFWUOuU0hMfAodera+JupZ5BZWfcG8FltA4DQfDsm/U9RjK/
 7gGNnr8Xk2/tp6+4AVV+HU2iTgRvq+mXCL72zSy2Y4r7ElBAANDfk4n+Zn/PWisn
 U9wwV8Ue7tVB15BRpRsg77NzBidiCFEe/6flWYiX2y24ke71gwDJBGUy8hMdKt6t
 4Cq8atsU0MvDAzfYMsK9JjskJp4UFq6wb1tXbbuADM4TDhnzlK6s6h3vM+pFlh/f
 my7fDH8/2qsCWhBDM4pmsJskVp+I1GOk/80RjTQISwx7iHktJWvxNYTaisK2fvD5
 Qs1IUWfNFbDX0Lr0QpN6j6X4rZkghR4R6XoFkd4nkicwi+UHVn3oK9GSqv24QJn9
 7+Ev3dfRTUYLd6mC4Q==
 =DpIK
 -----END PGP SIGNATURE-----

Merge tag 'loongarch-kvm-6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson into HEAD

LoongArch KVM changes for v6.11

1. Add ParaVirt steal time support.
2. Add some VM migration enhancement.
3. Add perf kvm-stat support for loongarch.
This commit is contained in:
Paolo Bonzini 2024-07-12 11:24:12 -04:00
commit c8b8b8190a
1262 changed files with 15631 additions and 8359 deletions

View File

@ -5,7 +5,6 @@ root = true
[{*.{awk,c,dts,dtsi,dtso,h,mk,s,S},Kconfig,Makefile,Makefile.*}] [{*.{awk,c,dts,dtsi,dtso,h,mk,s,S},Kconfig,Makefile,Makefile.*}]
charset = utf-8 charset = utf-8
end_of_line = lf end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true insert_final_newline = true
indent_style = tab indent_style = tab
indent_size = 8 indent_size = 8
@ -13,7 +12,6 @@ indent_size = 8
[*.{json,py,rs}] [*.{json,py,rs}]
charset = utf-8 charset = utf-8
end_of_line = lf end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true insert_final_newline = true
indent_style = space indent_style = space
indent_size = 4 indent_size = 4
@ -26,7 +24,6 @@ indent_size = 8
[*.yaml] [*.yaml]
charset = utf-8 charset = utf-8
end_of_line = lf end_of_line = lf
trim_trailing_whitespace = unset
insert_final_newline = true insert_final_newline = true
indent_style = space indent_style = space
indent_size = 2 indent_size = 2

View File

@ -72,6 +72,8 @@ Andrey Ryabinin <ryabinin.a.a@gmail.com> <aryabinin@virtuozzo.com>
Andrzej Hajda <andrzej.hajda@intel.com> <a.hajda@samsung.com> Andrzej Hajda <andrzej.hajda@intel.com> <a.hajda@samsung.com>
André Almeida <andrealmeid@igalia.com> <andrealmeid@collabora.com> André Almeida <andrealmeid@igalia.com> <andrealmeid@collabora.com>
Andy Adamson <andros@citi.umich.edu> Andy Adamson <andros@citi.umich.edu>
Andy Shevchenko <andy@kernel.org> <andy@smile.org.ua>
Andy Shevchenko <andy@kernel.org> <ext-andriy.shevchenko@nokia.com>
Anilkumar Kolli <quic_akolli@quicinc.com> <akolli@codeaurora.org> Anilkumar Kolli <quic_akolli@quicinc.com> <akolli@codeaurora.org>
Anirudh Ghayal <quic_aghayal@quicinc.com> <aghayal@codeaurora.org> Anirudh Ghayal <quic_aghayal@quicinc.com> <aghayal@codeaurora.org>
Antoine Tenart <atenart@kernel.org> <antoine.tenart@bootlin.com> Antoine Tenart <atenart@kernel.org> <antoine.tenart@bootlin.com>
@ -217,6 +219,7 @@ Geliang Tang <geliang@kernel.org> <geliang.tang@suse.com>
Geliang Tang <geliang@kernel.org> <geliangtang@xiaomi.com> Geliang Tang <geliang@kernel.org> <geliangtang@xiaomi.com>
Geliang Tang <geliang@kernel.org> <geliangtang@gmail.com> Geliang Tang <geliang@kernel.org> <geliangtang@gmail.com>
Geliang Tang <geliang@kernel.org> <geliangtang@163.com> Geliang Tang <geliang@kernel.org> <geliangtang@163.com>
Geliang Tang <geliang@kernel.org> <tanggeliang@kylinos.cn>
Georgi Djakov <djakov@kernel.org> <georgi.djakov@linaro.org> Georgi Djakov <djakov@kernel.org> <georgi.djakov@linaro.org>
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <geraldsc@de.ibm.com> Gerald Schaefer <gerald.schaefer@linux.ibm.com> <geraldsc@de.ibm.com>
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <gerald.schaefer@de.ibm.com> Gerald Schaefer <gerald.schaefer@linux.ibm.com> <gerald.schaefer@de.ibm.com>
@ -605,6 +608,7 @@ Simon Kelley <simon@thekelleys.org.uk>
Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org> Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org>
Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org> Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org>
Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org> Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org>
Stanislav Fomichev <sdf@fomichev.me> <sdf@google.com>
Stefan Wahren <wahrenst@gmx.net> <stefan.wahren@i2se.com> Stefan Wahren <wahrenst@gmx.net> <stefan.wahren@i2se.com>
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr> Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
Stephen Hemminger <stephen@networkplumber.org> <shemminger@linux-foundation.org> Stephen Hemminger <stephen@networkplumber.org> <shemminger@linux-foundation.org>

View File

@ -1214,6 +1214,10 @@ D: UDF filesystem
S: (ask for current address) S: (ask for current address)
S: USA S: USA
N: Larry Finger
E: Larry.Finger@lwfinger.net
D: Maintainer of wireless drivers, too many to list here
N: Jürgen Fischer N: Jürgen Fischer
E: fischer@norbit.de E: fischer@norbit.de
D: Author of Adaptec AHA-152x SCSI driver D: Author of Adaptec AHA-152x SCSI driver
@ -3146,9 +3150,11 @@ S: Triftstra=DFe 55
S: 13353 Berlin S: 13353 Berlin
S: Germany S: Germany
N: Gustavo Pimental N: Gustavo Pimentel
E: gustavo.pimentel@synopsys.com E: gustavo.pimentel@synopsys.com
D: PCI driver for Synopsys DesignWare D: PCI driver for Synopsys DesignWare
D: Synopsys DesignWare eDMA driver
D: Synopsys DesignWare xData traffic generator
N: Emanuel Pirker N: Emanuel Pirker
E: epirker@edu.uni-klu.ac.at E: epirker@edu.uni-klu.ac.at

View File

@ -9,8 +9,8 @@ TOMOYO is a name-based MAC extension (LSM module) for the Linux kernel.
LiveCD-based tutorials are available at LiveCD-based tutorials are available at
http://tomoyo.sourceforge.jp/1.8/ubuntu12.04-live.html https://tomoyo.sourceforge.net/1.8/ubuntu12.04-live.html
http://tomoyo.sourceforge.jp/1.8/centos6-live.html https://tomoyo.sourceforge.net/1.8/centos6-live.html
Though these tutorials use non-LSM version of TOMOYO, they are useful for you Though these tutorials use non-LSM version of TOMOYO, they are useful for you
to know what TOMOYO is. to know what TOMOYO is.
@ -21,45 +21,32 @@ How to enable TOMOYO?
Build the kernel with ``CONFIG_SECURITY_TOMOYO=y`` and pass ``security=tomoyo`` on Build the kernel with ``CONFIG_SECURITY_TOMOYO=y`` and pass ``security=tomoyo`` on
kernel's command line. kernel's command line.
Please see http://tomoyo.osdn.jp/2.5/ for details. Please see https://tomoyo.sourceforge.net/2.6/ for details.
Where is documentation? Where is documentation?
======================= =======================
User <-> Kernel interface documentation is available at User <-> Kernel interface documentation is available at
https://tomoyo.osdn.jp/2.5/policy-specification/index.html . https://tomoyo.sourceforge.net/2.6/policy-specification/index.html .
Materials we prepared for seminars and symposiums are available at Materials we prepared for seminars and symposiums are available at
https://osdn.jp/projects/tomoyo/docs/?category_id=532&language_id=1 . https://sourceforge.net/projects/tomoyo/files/docs/ .
Below lists are chosen from three aspects. Below lists are chosen from three aspects.
What is TOMOYO? What is TOMOYO?
TOMOYO Linux Overview TOMOYO Linux Overview
https://osdn.jp/projects/tomoyo/docs/lca2009-takeda.pdf https://sourceforge.net/projects/tomoyo/files/docs/lca2009-takeda.pdf
TOMOYO Linux: pragmatic and manageable security for Linux TOMOYO Linux: pragmatic and manageable security for Linux
https://osdn.jp/projects/tomoyo/docs/freedomhectaipei-tomoyo.pdf https://sourceforge.net/projects/tomoyo/files/docs/freedomhectaipei-tomoyo.pdf
TOMOYO Linux: A Practical Method to Understand and Protect Your Own Linux Box TOMOYO Linux: A Practical Method to Understand and Protect Your Own Linux Box
https://osdn.jp/projects/tomoyo/docs/PacSec2007-en-no-demo.pdf https://sourceforge.net/projects/tomoyo/files/docs/PacSec2007-en-no-demo.pdf
What can TOMOYO do? What can TOMOYO do?
Deep inside TOMOYO Linux Deep inside TOMOYO Linux
https://osdn.jp/projects/tomoyo/docs/lca2009-kumaneko.pdf https://sourceforge.net/projects/tomoyo/files/docs/lca2009-kumaneko.pdf
The role of "pathname based access control" in security. The role of "pathname based access control" in security.
https://osdn.jp/projects/tomoyo/docs/lfj2008-bof.pdf https://sourceforge.net/projects/tomoyo/files/docs/lfj2008-bof.pdf
History of TOMOYO? History of TOMOYO?
Realities of Mainlining Realities of Mainlining
https://osdn.jp/projects/tomoyo/docs/lfj2008.pdf https://sourceforge.net/projects/tomoyo/files/docs/lfj2008.pdf
What is future plan?
====================
We believe that inode based security and name based security are complementary
and both should be used together. But unfortunately, so far, we cannot enable
multiple LSM modules at the same time. We feel sorry that you have to give up
SELinux/SMACK/AppArmor etc. when you want to use TOMOYO.
We hope that LSM becomes stackable in future. Meanwhile, you can use non-LSM
version of TOMOYO, available at http://tomoyo.osdn.jp/1.8/ .
LSM version of TOMOYO is a subset of non-LSM version of TOMOYO. We are planning
to port non-LSM version's functionalities to LSM versions.

View File

@ -788,25 +788,6 @@
Documentation/networking/netconsole.rst for an Documentation/networking/netconsole.rst for an
alternative. alternative.
<DEVNAME>:<n>.<n>[,options]
Use the specified serial port on the serial core bus.
The addressing uses DEVNAME of the physical serial port
device, followed by the serial core controller instance,
and the serial port instance. The options are the same
as documented for the ttyS addressing above.
The mapping of the serial ports to the tty instances
can be viewed with:
$ ls -d /sys/bus/serial-base/devices/*:*.*/tty/*
/sys/bus/serial-base/devices/00:04:0.0/tty/ttyS0
In the above example, the console can be addressed with
console=00:04:0.0. Note that a console addressed this
way will only get added when the related device driver
is ready. The use of an earlycon parameter in addition to
the console may be desired for console output early on.
uart[8250],io,<addr>[,options] uart[8250],io,<addr>[,options]
uart[8250],mmio,<addr>[,options] uart[8250],mmio,<addr>[,options]
uart[8250],mmio16,<addr>[,options] uart[8250],mmio16,<addr>[,options]
@ -2192,12 +2173,6 @@
Format: 0 | 1 Format: 0 | 1
Default set by CONFIG_INIT_ON_FREE_DEFAULT_ON. Default set by CONFIG_INIT_ON_FREE_DEFAULT_ON.
init_mlocked_on_free= [MM] Fill freed userspace memory with zeroes if
it was mlock'ed and not explicitly munlock'ed
afterwards.
Format: 0 | 1
Default set by CONFIG_INIT_MLOCKED_ON_FREE_DEFAULT_ON
init_pkru= [X86] Specify the default memory protection keys rights init_pkru= [X86] Specify the default memory protection keys rights
register contents for all processes. 0x55555554 by register contents for all processes. 0x55555554 by
default (disallow access to all but pkey 0). Can default (disallow access to all but pkey 0). Can
@ -4098,9 +4073,9 @@
prediction) vulnerability. System may allow data prediction) vulnerability. System may allow data
leaks with this option. leaks with this option.
no-steal-acc [X86,PV_OPS,ARM64,PPC/PSERIES,RISCV,EARLY] Disable no-steal-acc [X86,PV_OPS,ARM64,PPC/PSERIES,RISCV,LOONGARCH,EARLY]
paravirtualized steal time accounting. steal time is Disable paravirtualized steal time accounting. steal time
computed, but won't influence scheduler behaviour is computed, but won't influence scheduler behaviour
nosync [HW,M68K] Disables sync negotiation for all devices. nosync [HW,M68K] Disables sync negotiation for all devices.

View File

@ -467,11 +467,11 @@ anon_fault_fallback_charge
instead falls back to using huge pages with lower orders or instead falls back to using huge pages with lower orders or
small pages even though the allocation was successful. small pages even though the allocation was successful.
anon_swpout swpout
is incremented every time a huge page is swapped out in one is incremented every time a huge page is swapped out in one
piece without splitting. piece without splitting.
anon_swpout_fallback swpout_fallback
is incremented if a huge page has to be split before swapout. is incremented if a huge page has to be split before swapout.
Usually because failed to allocate some continuous swap space Usually because failed to allocate some continuous swap space
for the huge page. for the huge page.

View File

@ -62,10 +62,10 @@ cmodx.c::
printf("Value before cmodx: %d\n", value); printf("Value before cmodx: %d\n", value);
// Call prctl before first fence.i is called inside modify_instruction // Call prctl before first fence.i is called inside modify_instruction
prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX_ON, PR_RISCV_CTX_SW_FENCEI, PR_RISCV_SCOPE_PER_PROCESS); prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, PR_RISCV_CTX_SW_FENCEI_ON, PR_RISCV_SCOPE_PER_PROCESS);
modify_instruction(); modify_instruction();
// Call prctl after final fence.i is called in process // Call prctl after final fence.i is called in process
prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX_OFF, PR_RISCV_CTX_SW_FENCEI, PR_RISCV_SCOPE_PER_PROCESS); prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, PR_RISCV_CTX_SW_FENCEI_OFF, PR_RISCV_SCOPE_PER_PROCESS);
value = get_value(); value = get_value();
printf("Value after cmodx: %d\n", value); printf("Value after cmodx: %d\n", value);

View File

@ -217,7 +217,7 @@ current *struct* is::
int (*media_changed)(struct cdrom_device_info *, int); int (*media_changed)(struct cdrom_device_info *, int);
int (*tray_move)(struct cdrom_device_info *, int); int (*tray_move)(struct cdrom_device_info *, int);
int (*lock_door)(struct cdrom_device_info *, int); int (*lock_door)(struct cdrom_device_info *, int);
int (*select_speed)(struct cdrom_device_info *, int); int (*select_speed)(struct cdrom_device_info *, unsigned long);
int (*get_last_session) (struct cdrom_device_info *, int (*get_last_session) (struct cdrom_device_info *,
struct cdrom_multisession *); struct cdrom_multisession *);
int (*get_mcn)(struct cdrom_device_info *, struct cdrom_mcn *); int (*get_mcn)(struct cdrom_device_info *, struct cdrom_mcn *);
@ -396,7 +396,7 @@ action need be taken, and the return value should be 0.
:: ::
int select_speed(struct cdrom_device_info *cdi, int speed) int select_speed(struct cdrom_device_info *cdi, unsigned long speed)
Some CD-ROM drives are capable of changing their head-speed. There Some CD-ROM drives are capable of changing their head-speed. There
are several reasons for changing the speed of a CD-ROM drive. Badly are several reasons for changing the speed of a CD-ROM drive. Badly

View File

@ -54,11 +54,10 @@ unevaluatedProperties: false
examples: examples:
- | - |
mlahb: ahb@38000000 { ahb {
compatible = "st,mlahb", "simple-bus"; compatible = "st,mlahb", "simple-bus";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
reg = <0x10000000 0x40000>;
ranges; ranges;
dma-ranges = <0x00000000 0x38000000 0x10000>, dma-ranges = <0x00000000 0x38000000 0x10000>,
<0x10000000 0x10000000 0x60000>, <0x10000000 0x10000000 0x60000>,

View File

@ -57,17 +57,17 @@ properties:
- const: allwinner,sun8i-v3s - const: allwinner,sun8i-v3s
- description: Anbernic RG35XX (2024) - description: Anbernic RG35XX (2024)
- items: items:
- const: anbernic,rg35xx-2024 - const: anbernic,rg35xx-2024
- const: allwinner,sun50i-h700 - const: allwinner,sun50i-h700
- description: Anbernic RG35XX Plus - description: Anbernic RG35XX Plus
- items: items:
- const: anbernic,rg35xx-plus - const: anbernic,rg35xx-plus
- const: allwinner,sun50i-h700 - const: allwinner,sun50i-h700
- description: Anbernic RG35XX H - description: Anbernic RG35XX H
- items: items:
- const: anbernic,rg35xx-h - const: anbernic,rg35xx-h
- const: allwinner,sun50i-h700 - const: allwinner,sun50i-h700

View File

@ -59,8 +59,8 @@ properties:
- 3 - 3
dma-channels: dma-channels:
minItems: 1 minimum: 1
maxItems: 64 maximum: 64
clocks: clocks:
minItems: 1 minItems: 1

View File

@ -77,7 +77,7 @@ required:
- clocks - clocks
allOf: allOf:
- $ref: i2c-controller.yaml - $ref: /schemas/i2c/i2c-controller.yaml#
- if: - if:
properties: properties:
compatible: compatible:

View File

@ -21,7 +21,7 @@ description: |
google,cros-ec-spi or google,cros-ec-i2c. google,cros-ec-spi or google,cros-ec-i2c.
allOf: allOf:
- $ref: i2c-controller.yaml# - $ref: /schemas/i2c/i2c-controller.yaml#
properties: properties:
compatible: compatible:

View File

@ -139,7 +139,7 @@ allOf:
Voltage output range of the channel as <minimum, maximum> Voltage output range of the channel as <minimum, maximum>
Required connections: Required connections:
Rfb1x for: 0 to 2.5 V; 0 to 3V; 0 to 5 V; Rfb1x for: 0 to 2.5 V; 0 to 3V; 0 to 5 V;
Rfb2x for: 0 to 10 V; 2.5 to 7.5V; -5 to 5 V; Rfb2x for: 0 to 10 V; -2.5 to 7.5V; -5 to 5 V;
oneOf: oneOf:
- items: - items:
- const: 0 - const: 0

View File

@ -18,9 +18,12 @@ allOf:
properties: properties:
compatible: compatible:
enum: oneOf:
- elan,ekth6915 - items:
- ilitek,ili2901 - enum:
- elan,ekth5015m
- const: elan,ekth6915
- const: elan,ekth6915
reg: reg:
const: 0x10 const: 0x10
@ -33,6 +36,12 @@ properties:
reset-gpios: reset-gpios:
description: Reset GPIO; not all touchscreens using eKTH6915 hook this up. description: Reset GPIO; not all touchscreens using eKTH6915 hook this up.
no-reset-on-power-off:
type: boolean
description:
Reset line is wired so that it can (and should) be left deasserted when
the power supply is off.
vcc33-supply: vcc33-supply:
description: The 3.3V supply to the touchscreen. description: The 3.3V supply to the touchscreen.
@ -58,8 +67,8 @@ examples:
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
ap_ts: touchscreen@10 { touchscreen@10 {
compatible = "elan,ekth6915"; compatible = "elan,ekth5015m", "elan,ekth6915";
reg = <0x10>; reg = <0x10>;
interrupt-parent = <&tlmm>; interrupt-parent = <&tlmm>;

View File

@ -0,0 +1,66 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/input/ilitek,ili2901.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Ilitek ILI2901 touchscreen controller
maintainers:
- Jiri Kosina <jkosina@suse.com>
description:
Supports the Ilitek ILI2901 touchscreen controller.
This touchscreen controller uses the i2c-hid protocol with a reset GPIO.
allOf:
- $ref: /schemas/input/touchscreen/touchscreen.yaml#
properties:
compatible:
enum:
- ilitek,ili2901
reg:
maxItems: 1
interrupts:
maxItems: 1
panel: true
reset-gpios:
maxItems: 1
vcc33-supply: true
vccio-supply: true
required:
- compatible
- reg
- interrupts
- vcc33-supply
additionalProperties: false
examples:
- |
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
i2c {
#address-cells = <1>;
#size-cells = <0>;
touchscreen@41 {
compatible = "ilitek,ili2901";
reg = <0x41>;
interrupt-parent = <&tlmm>;
interrupts = <9 IRQ_TYPE_LEVEL_LOW>;
reset-gpios = <&tlmm 8 GPIO_ACTIVE_LOW>;
vcc33-supply = <&pp3300_ts>;
};
};

View File

@ -128,7 +128,6 @@ required:
- cell-index - cell-index
- reg - reg
- fsl,fman-ports - fsl,fman-ports
- ptp-timer
dependencies: dependencies:
pcs-handle-names: pcs-handle-names:

View File

@ -29,7 +29,6 @@ properties:
- qcom,pm7325-gpio - qcom,pm7325-gpio
- qcom,pm7550ba-gpio - qcom,pm7550ba-gpio
- qcom,pm8005-gpio - qcom,pm8005-gpio
- qcom,pm8008-gpio
- qcom,pm8018-gpio - qcom,pm8018-gpio
- qcom,pm8019-gpio - qcom,pm8019-gpio
- qcom,pm8038-gpio - qcom,pm8038-gpio
@ -126,7 +125,6 @@ allOf:
compatible: compatible:
contains: contains:
enum: enum:
- qcom,pm8008-gpio
- qcom,pmi8950-gpio - qcom,pmi8950-gpio
- qcom,pmr735d-gpio - qcom,pmr735d-gpio
then: then:
@ -448,7 +446,6 @@ $defs:
- gpio1-gpio10 for pm7325 - gpio1-gpio10 for pm7325
- gpio1-gpio8 for pm7550ba - gpio1-gpio8 for pm7550ba
- gpio1-gpio4 for pm8005 - gpio1-gpio4 for pm8005
- gpio1-gpio2 for pm8008
- gpio1-gpio6 for pm8018 - gpio1-gpio6 for pm8018
- gpio1-gpio12 for pm8038 - gpio1-gpio12 for pm8038
- gpio1-gpio40 for pm8058 - gpio1-gpio40 for pm8058

View File

@ -65,6 +65,7 @@ patternProperties:
description: The hard wired USB devices description: The hard wired USB devices
type: object type: object
$ref: /schemas/usb/usb-device.yaml $ref: /schemas/usb/usb-device.yaml
additionalProperties: true
required: required:
- peer-hub - peer-hub

View File

@ -328,6 +328,12 @@ CXL Memory Device
.. kernel-doc:: drivers/cxl/mem.c .. kernel-doc:: drivers/cxl/mem.c
:doc: cxl mem :doc: cxl mem
.. kernel-doc:: drivers/cxl/cxlmem.h
:internal:
.. kernel-doc:: drivers/cxl/core/memdev.c
:identifiers:
CXL Port CXL Port
-------- --------
.. kernel-doc:: drivers/cxl/port.c .. kernel-doc:: drivers/cxl/port.c
@ -341,6 +347,15 @@ CXL Core
.. kernel-doc:: drivers/cxl/cxl.h .. kernel-doc:: drivers/cxl/cxl.h
:internal: :internal:
.. kernel-doc:: drivers/cxl/core/hdm.c
:doc: cxl core hdm
.. kernel-doc:: drivers/cxl/core/hdm.c
:identifiers:
.. kernel-doc:: drivers/cxl/core/cdat.c
:identifiers:
.. kernel-doc:: drivers/cxl/core/port.c .. kernel-doc:: drivers/cxl/core/port.c
:doc: cxl core :doc: cxl core

View File

@ -571,6 +571,7 @@ encoded manner. The codes are the following:
um userfaultfd missing tracking um userfaultfd missing tracking
uw userfaultfd wr-protect tracking uw userfaultfd wr-protect tracking
ss shadow stack page ss shadow stack page
sl sealed
== ======================================= == =======================================
Note that there is no guarantee that every flag and associated mnemonic will Note that there is no guarantee that every flag and associated mnemonic will

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<!-- Updated to inclusive terminology by Wolfram Sang -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
@ -1120,7 +1121,7 @@
<rect <rect
style="opacity:1;fill:#ffb9b9;fill-opacity:1;stroke:#f00000;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" style="opacity:1;fill:#ffb9b9;fill-opacity:1;stroke:#f00000;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4424-3-2-9-7" id="rect4424-3-2-9-7"
width="112.5" width="134.5"
height="113.75008" height="113.75008"
x="112.5" x="112.5"
y="471.11221" y="471.11221"
@ -1133,15 +1134,15 @@
y="521.46259" y="521.46259"
id="text4349"><tspan id="text4349"><tspan
sodipodi:role="line" sodipodi:role="line"
x="167.5354" x="178.5354"
y="521.46259" y="521.46259"
style="font-size:25px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle" style="font-size:25px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle"
id="tspan1273">I2C</tspan><tspan id="tspan1273">I2C</tspan><tspan
sodipodi:role="line" sodipodi:role="line"
x="167.5354" x="178.5354"
y="552.71259" y="552.71259"
style="font-size:25px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle" style="font-size:25px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle"
id="tspan1285">Master</tspan></text> id="tspan1285">Controller</tspan></text>
<rect <rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b9ffb9;fill-opacity:1;fill-rule:nonzero;stroke:#006400;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b9ffb9;fill-opacity:1;fill-rule:nonzero;stroke:#006400;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4424-3-2-9-7-3-3-5-3" id="rect4424-3-2-9-7-3-3-5-3"
@ -1171,7 +1172,7 @@
x="318.59131" x="318.59131"
y="552.08752" y="552.08752"
style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px" style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px"
id="tspan1287">Slave</tspan></text> id="tspan1287">Target</tspan></text>
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99968767;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99968767;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 112.49995,677.36223 c 712.50005,0 712.50005,0 712.50005,0" d="m 112.49995,677.36223 c 712.50005,0 712.50005,0 712.50005,0"
@ -1233,7 +1234,7 @@
x="468.59131" x="468.59131"
y="552.08746" y="552.08746"
style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px" style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px"
id="tspan1287-6">Slave</tspan></text> id="tspan1287-6">Target</tspan></text>
<rect <rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#b9ffb9;fill-opacity:1;fill-rule:nonzero;stroke:#006400;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#b9ffb9;fill-opacity:1;fill-rule:nonzero;stroke:#006400;stroke-width:2.8125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4424-3-2-9-7-3-3-5-3-1" id="rect4424-3-2-9-7-3-3-5-3-1"
@ -1258,7 +1259,7 @@
x="618.59131" x="618.59131"
y="552.08746" y="552.08746"
style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px" style="font-size:25.00000191px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:1px"
id="tspan1287-9">Slave</tspan></text> id="tspan1287-9">Target</tspan></text>
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99968743;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#DotM)" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99968743;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#DotM)"
d="m 150,583.61221 v 93.75" d="m 150,583.61221 v 93.75"

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -3,29 +3,27 @@ Introduction to I2C and SMBus
============================= =============================
I²C (pronounce: I squared C and written I2C in the kernel documentation) is I²C (pronounce: I squared C and written I2C in the kernel documentation) is
a protocol developed by Philips. It is a slow two-wire protocol (variable a protocol developed by Philips. It is a two-wire protocol with variable
speed, up to 400 kHz), with a high speed extension (3.4 MHz). It provides speed (typically up to 400 kHz, high speed modes up to 5 MHz). It provides
an inexpensive bus for connecting many types of devices with infrequent or an inexpensive bus for connecting many types of devices with infrequent or
low bandwidth communications needs. I2C is widely used with embedded low bandwidth communications needs. I2C is widely used with embedded
systems. Some systems use variants that don't meet branding requirements, systems. Some systems use variants that don't meet branding requirements,
and so are not advertised as being I2C but come under different names, and so are not advertised as being I2C but come under different names,
e.g. TWI (Two Wire Interface), IIC. e.g. TWI (Two Wire Interface), IIC.
The latest official I2C specification is the `"I2C-bus specification and user The latest official I2C specification is the `"I²C-bus specification and user
manual" (UM10204) <https://www.nxp.com/webapp/Download?colCode=UM10204>`_ manual" (UM10204) <https://www.nxp.com/docs/en/user-guide/UM10204.pdf>`_
published by NXP Semiconductors. However, you need to log-in to the site to published by NXP Semiconductors, version 7 as of this writing.
access the PDF. An older version of the specification (revision 6) is archived
`here <https://web.archive.org/web/20210813122132/https://www.nxp.com/docs/en/user-guide/UM10204.pdf>`_.
SMBus (System Management Bus) is based on the I2C protocol, and is mostly SMBus (System Management Bus) is based on the I2C protocol, and is mostly
a subset of I2C protocols and signaling. Many I2C devices will work on an a subset of I2C protocols and signaling. Many I2C devices will work on an
SMBus, but some SMBus protocols add semantics beyond what is required to SMBus, but some SMBus protocols add semantics beyond what is required to
achieve I2C branding. Modern PC mainboards rely on SMBus. The most common achieve I2C branding. Modern PC mainboards rely on SMBus. The most common
devices connected through SMBus are RAM modules configured using I2C EEPROMs, devices connected through SMBus are RAM modules configured using I2C EEPROMs,
and hardware monitoring chips. and hardware monitoring chips.
Because the SMBus is mostly a subset of the generalized I2C bus, we can Because the SMBus is mostly a subset of the generalized I2C bus, we can
use its protocols on many I2C systems. However, there are systems that don't use its protocols on many I2C systems. However, there are systems that don't
meet both SMBus and I2C electrical constraints; and others which can't meet both SMBus and I2C electrical constraints; and others which can't
implement all the common SMBus protocol semantics or messages. implement all the common SMBus protocol semantics or messages.
@ -33,29 +31,52 @@ implement all the common SMBus protocol semantics or messages.
Terminology Terminology
=========== ===========
Using the terminology from the official documentation, the I2C bus connects The I2C bus connects one or more controller chips and one or more target chips.
one or more *master* chips and one or more *slave* chips.
.. kernel-figure:: i2c_bus.svg .. kernel-figure:: i2c_bus.svg
:alt: Simple I2C bus with one master and 3 slaves :alt: Simple I2C bus with one controller and 3 targets
Simple I2C bus Simple I2C bus
A **master** chip is a node that starts communications with slaves. In the A **controller** chip is a node that starts communications with targets. In the
Linux kernel implementation it is called an **adapter** or bus. Adapter Linux kernel implementation it is also called an "adapter" or "bus". Controller
drivers are in the ``drivers/i2c/busses/`` subdirectory. drivers are usually in the ``drivers/i2c/busses/`` subdirectory.
An **algorithm** contains general code that can be used to implement a An **algorithm** contains general code that can be used to implement a whole
whole class of I2C adapters. Each specific adapter driver either depends on class of I2C controllers. Each specific controller driver either depends on an
an algorithm driver in the ``drivers/i2c/algos/`` subdirectory, or includes algorithm driver in the ``drivers/i2c/algos/`` subdirectory, or includes its
its own implementation. own implementation.
A **slave** chip is a node that responds to communications when addressed A **target** chip is a node that responds to communications when addressed by a
by the master. In Linux it is called a **client**. Client drivers are kept controller. In the Linux kernel implementation it is also called a "client".
in a directory specific to the feature they provide, for example While targets are usually separate external chips, Linux can also act as a
``drivers/media/gpio/`` for GPIO expanders and ``drivers/media/i2c/`` for target (needs hardware support) and respond to another controller on the bus.
This is then called a **local target**. In contrast, an external chip is called
a **remote target**.
Target drivers are kept in a directory specific to the feature they provide,
for example ``drivers/gpio/`` for GPIO expanders and ``drivers/media/i2c/`` for
video-related chips. video-related chips.
For the example configuration in figure, you will need a driver for your For the example configuration in the figure above, you will need one driver for
I2C adapter, and drivers for your I2C devices (usually one driver for each the I2C controller, and drivers for your I2C targets. Usually one driver for
device). each target.
Synonyms
--------
As mentioned above, the Linux I2C implementation historically uses the terms
"adapter" for controller and "client" for target. A number of data structures
have these synonyms in their name. So, when discussing implementation details,
you should be aware of these terms as well. The official wording is preferred,
though.
Outdated terminology
--------------------
In earlier I2C specifications, controller was named "master" and target was
named "slave". These terms have been obsoleted with v7 of the specification and
their use is also discouraged by the Linux Kernel Code of Conduct. You may
still find them in references to documentation which has not been updated. The
general attitude, however, is to use the inclusive terms: controller and
target. Work to replace the old terminology in the Linux Kernel is on-going.

View File

@ -150,6 +150,12 @@ applicable everywhere (see syntax).
That will limit the usefulness but on the other hand avoid That will limit the usefulness but on the other hand avoid
the illegal configurations all over. the illegal configurations all over.
If "select" <symbol> is followed by "if" <expr>, <symbol> will be
selected by the logical AND of the value of the current menu symbol
and <expr>. This means, the lower limit can be downgraded due to the
presence of "if" <expr>. This behavior may seem weird, but we rely on
it. (The future of this behavior is undecided.)
- weak reverse dependencies: "imply" <symbol> ["if" <expr>] - weak reverse dependencies: "imply" <symbol> ["if" <expr>]
This is similar to "select" as it enforces a lower limit on another This is similar to "select" as it enforces a lower limit on another
@ -184,7 +190,7 @@ applicable everywhere (see syntax).
ability to hook into a secondary subsystem while allowing the user to ability to hook into a secondary subsystem while allowing the user to
configure that subsystem out without also having to unset these drivers. configure that subsystem out without also having to unset these drivers.
Note: If the combination of FOO=y and BAR=m causes a link error, Note: If the combination of FOO=y and BAZ=m causes a link error,
you can guard the function call with IS_REACHABLE():: you can guard the function call with IS_REACHABLE()::
foo_init() foo_init()
@ -202,6 +208,10 @@ applicable everywhere (see syntax).
imply BAR imply BAR
imply BAZ imply BAZ
Note: If "imply" <symbol> is followed by "if" <expr>, the default of <symbol>
will be the logical AND of the value of the current menu symbol and <expr>.
(The future of this behavior is undecided.)
- limiting menu display: "visible if" <expr> - limiting menu display: "visible if" <expr>
This attribute is only applicable to menu blocks, if the condition is This attribute is only applicable to menu blocks, if the condition is

View File

@ -128,7 +128,7 @@ executed to make module versioning work.
modules_install modules_install
Install the external module(s). The default location is Install the external module(s). The default location is
/lib/modules/<kernel_release>/extra/, but a prefix may /lib/modules/<kernel_release>/updates/, but a prefix may
be added with INSTALL_MOD_PATH (discussed in section 5). be added with INSTALL_MOD_PATH (discussed in section 5).
clean clean
@ -417,7 +417,7 @@ directory:
And external modules are installed in: And external modules are installed in:
/lib/modules/$(KERNELRELEASE)/extra/ /lib/modules/$(KERNELRELEASE)/updates/
5.1 INSTALL_MOD_PATH 5.1 INSTALL_MOD_PATH
-------------------- --------------------
@ -438,10 +438,10 @@ And external modules are installed in:
------------------- -------------------
External modules are by default installed to a directory under External modules are by default installed to a directory under
/lib/modules/$(KERNELRELEASE)/extra/, but you may wish to /lib/modules/$(KERNELRELEASE)/updates/, but you may wish to
locate modules for a specific functionality in a separate locate modules for a specific functionality in a separate
directory. For this purpose, use INSTALL_MOD_DIR to specify an directory. For this purpose, use INSTALL_MOD_DIR to specify an
alternative name to "extra.":: alternative name to "updates."::
$ make INSTALL_MOD_DIR=gandalf -C $KDIR \ $ make INSTALL_MOD_DIR=gandalf -C $KDIR \
M=$PWD modules_install M=$PWD modules_install

View File

@ -1603,7 +1603,7 @@ operations:
attributes: attributes:
- header - header
reply: reply:
attributes: &pse attributes:
- header - header
- podl-pse-admin-state - podl-pse-admin-state
- podl-pse-admin-control - podl-pse-admin-control
@ -1620,7 +1620,10 @@ operations:
do: do:
request: request:
attributes: *pse attributes:
- header
- podl-pse-admin-control
- c33-pse-admin-control
- -
name: rss-get name: rss-get
doc: Get RSS params. doc: Get RSS params.

View File

@ -123,8 +123,6 @@ operations:
doc: dump pending nfsd rpc doc: dump pending nfsd rpc
attribute-set: rpc-status attribute-set: rpc-status
dump: dump:
pre: nfsd-nl-rpc-status-get-start
post: nfsd-nl-rpc-status-get-done
reply: reply:
attributes: attributes:
- xid - xid

View File

@ -329,24 +329,23 @@ XDP_SHARED_UMEM option and provide the initial socket's fd in the
sxdp_shared_umem_fd field as you registered the UMEM on that sxdp_shared_umem_fd field as you registered the UMEM on that
socket. These two sockets will now share one and the same UMEM. socket. These two sockets will now share one and the same UMEM.
In this case, it is possible to use the NIC's packet steering There is no need to supply an XDP program like the one in the previous
capabilities to steer the packets to the right queue. This is not case where sockets were bound to the same queue id and
possible in the previous example as there is only one queue shared device. Instead, use the NIC's packet steering capabilities to steer
among sockets, so the NIC cannot do this steering as it can only steer the packets to the right queue. In the previous example, there is only
between queues. one queue shared among sockets, so the NIC cannot do this steering. It
can only steer between queues.
In libxdp (or libbpf prior to version 1.0), you need to use the In libbpf, you need to use the xsk_socket__create_shared() API as it
xsk_socket__create_shared() API as it takes a reference to a FILL ring takes a reference to a FILL ring and a COMPLETION ring that will be
and a COMPLETION ring that will be created for you and bound to the created for you and bound to the shared UMEM. You can use this
shared UMEM. You can use this function for all the sockets you create, function for all the sockets you create, or you can use it for the
or you can use it for the second and following ones and use second and following ones and use xsk_socket__create() for the first
xsk_socket__create() for the first one. Both methods yield the same one. Both methods yield the same result.
result.
Note that a UMEM can be shared between sockets on the same queue id Note that a UMEM can be shared between sockets on the same queue id
and device, as well as between queues on the same device and between and device, as well as between queues on the same device and between
devices at the same time. It is also possible to redirect to any devices at the same time.
socket as long as it is bound to the same umem with XDP_SHARED_UMEM.
XDP_USE_NEED_WAKEUP bind flag XDP_USE_NEED_WAKEUP bind flag
----------------------------- -----------------------------
@ -823,10 +822,6 @@ A: The short answer is no, that is not supported at the moment. The
switch, or other distribution mechanism, in your NIC to direct switch, or other distribution mechanism, in your NIC to direct
traffic to the correct queue id and socket. traffic to the correct queue id and socket.
Note that if you are using the XDP_SHARED_UMEM option, it is
possible to switch traffic between any socket bound to the same
umem.
Q: My packets are sometimes corrupted. What is wrong? Q: My packets are sometimes corrupted. What is wrong?
A: Care has to be taken not to feed the same buffer in the UMEM into A: Care has to be taken not to feed the same buffer in the UMEM into

View File

@ -32,6 +32,7 @@ Security-related interfaces
seccomp_filter seccomp_filter
landlock landlock
lsm lsm
mfd_noexec
spec_ctrl spec_ctrl
tee tee

View File

@ -186,6 +186,7 @@ Code Seq# Include File Comments
'Q' all linux/soundcard.h 'Q' all linux/soundcard.h
'R' 00-1F linux/random.h conflict! 'R' 00-1F linux/random.h conflict!
'R' 01 linux/rfkill.h conflict! 'R' 01 linux/rfkill.h conflict!
'R' 20-2F linux/trace_mmap.h
'R' C0-DF net/bluetooth/rfcomm.h 'R' C0-DF net/bluetooth/rfcomm.h
'R' E0 uapi/linux/fsl_mc.h 'R' E0 uapi/linux/fsl_mc.h
'S' all linux/cdrom.h conflict! 'S' all linux/cdrom.h conflict!

View File

@ -582,7 +582,7 @@ depending on the hardware. In all cases, however, only routes that have the
Devices generating the streams may allow enabling and disabling some of the Devices generating the streams may allow enabling and disabling some of the
routes or have a fixed routing configuration. If the routes can be disabled, not routes or have a fixed routing configuration. If the routes can be disabled, not
declaring the routes (or declaring them without declaring the routes (or declaring them without
``VIDIOC_SUBDEV_STREAM_FL_ACTIVE`` flag set) in ``VIDIOC_SUBDEV_S_ROUTING`` will ``V4L2_SUBDEV_STREAM_FL_ACTIVE`` flag set) in ``VIDIOC_SUBDEV_S_ROUTING`` will
disable the routes. ``VIDIOC_SUBDEV_S_ROUTING`` will still return such routes disable the routes. ``VIDIOC_SUBDEV_S_ROUTING`` will still return such routes
back to the user in the routes array, with the ``V4L2_SUBDEV_STREAM_FL_ACTIVE`` back to the user in the routes array, with the ``V4L2_SUBDEV_STREAM_FL_ACTIVE``
flag unset. flag unset.

View File

@ -0,0 +1,86 @@
.. SPDX-License-Identifier: GPL-2.0
==================================
Introduction of non-executable mfd
==================================
:Author:
Daniel Verkamp <dverkamp@chromium.org>
Jeff Xu <jeffxu@chromium.org>
:Contributor:
Aleksa Sarai <cyphar@cyphar.com>
Since Linux introduced the memfd feature, memfds have always had their
execute bit set, and the memfd_create() syscall doesn't allow setting
it differently.
However, in a secure-by-default system, such as ChromeOS, (where all
executables should come from the rootfs, which is protected by verified
boot), this executable nature of memfd opens a door for NoExec bypass
and enables “confused deputy attack”. E.g, in VRP bug [1]: cros_vm
process created a memfd to share the content with an external process,
however the memfd is overwritten and used for executing arbitrary code
and root escalation. [2] lists more VRP of this kind.
On the other hand, executable memfd has its legit use: runc uses memfds
seal and executable feature to copy the contents of the binary then
execute them. For such a system, we need a solution to differentiate runc's
use of executable memfds and an attacker's [3].
To address those above:
- Let memfd_create() set X bit at creation time.
- Let memfd be sealed for modifying X bit when NX is set.
- Add a new pid namespace sysctl: vm.memfd_noexec to help applications in
migrating and enforcing non-executable MFD.
User API
========
``int memfd_create(const char *name, unsigned int flags)``
``MFD_NOEXEC_SEAL``
When MFD_NOEXEC_SEAL bit is set in the ``flags``, memfd is created
with NX. F_SEAL_EXEC is set and the memfd can't be modified to
add X later. MFD_ALLOW_SEALING is also implied.
This is the most common case for the application to use memfd.
``MFD_EXEC``
When MFD_EXEC bit is set in the ``flags``, memfd is created with X.
Note:
``MFD_NOEXEC_SEAL`` implies ``MFD_ALLOW_SEALING``. In case that
an app doesn't want sealing, it can add F_SEAL_SEAL after creation.
Sysctl:
========
``pid namespaced sysctl vm.memfd_noexec``
The new pid namespaced sysctl vm.memfd_noexec has 3 values:
- 0: MEMFD_NOEXEC_SCOPE_EXEC
memfd_create() without MFD_EXEC nor MFD_NOEXEC_SEAL acts like
MFD_EXEC was set.
- 1: MEMFD_NOEXEC_SCOPE_NOEXEC_SEAL
memfd_create() without MFD_EXEC nor MFD_NOEXEC_SEAL acts like
MFD_NOEXEC_SEAL was set.
- 2: MEMFD_NOEXEC_SCOPE_NOEXEC_ENFORCED
memfd_create() without MFD_NOEXEC_SEAL will be rejected.
The sysctl allows finer control of memfd_create for old software that
doesn't set the executable bit; for example, a container with
vm.memfd_noexec=1 means the old software will create non-executable memfd
by default while new software can create executable memfd by setting
MFD_EXEC.
The value of vm.memfd_noexec is passed to child namespace at creation
time. In addition, the setting is hierarchical, i.e. during memfd_create,
we will search from current ns to root ns and use the most restrictive
setting.
[1] https://crbug.com/1305267
[2] https://bugs.chromium.org/p/chromium/issues/list?q=type%3Dbug-security%20memfd%20escalation&can=1
[3] https://lwn.net/Articles/781013/

View File

@ -62,12 +62,21 @@ shared page with scale and offset values into user space. User
space code performs the same algorithm of reading the TSC and space code performs the same algorithm of reading the TSC and
applying the scale and offset to get the constant 10 MHz clock. applying the scale and offset to get the constant 10 MHz clock.
Linux clockevents are based on Hyper-V synthetic timer 0. While Linux clockevents are based on Hyper-V synthetic timer 0 (stimer0).
Hyper-V offers 4 synthetic timers for each CPU, Linux only uses While Hyper-V offers 4 synthetic timers for each CPU, Linux only uses
timer 0. Interrupts from stimer0 are recorded on the "HVS" line in timer 0. In older versions of Hyper-V, an interrupt from stimer0
/proc/interrupts. Clockevents based on the virtualized PIT and results in a VMBus control message that is demultiplexed by
local APIC timer also work, but the Hyper-V synthetic timer is vmbus_isr() as described in the Documentation/virt/hyperv/vmbus.rst
preferred. documentation. In newer versions of Hyper-V, stimer0 interrupts can
be mapped to an architectural interrupt, which is referred to as
"Direct Mode". Linux prefers to use Direct Mode when available. Since
x86/x64 doesn't support per-CPU interrupts, Direct Mode statically
allocates an x86 interrupt vector (HYPERV_STIMER0_VECTOR) across all CPUs
and explicitly codes it to call the stimer0 interrupt handler. Hence
interrupts from stimer0 are recorded on the "HVS" line in /proc/interrupts
rather than being associated with a Linux IRQ. Clockevents based on the
virtualized PIT and local APIC timer also work, but Hyper-V stimer0
is preferred.
The driver for the Hyper-V synthetic system clock and timers is The driver for the Hyper-V synthetic system clock and timers is
drivers/clocksource/hyperv_timer.c. drivers/clocksource/hyperv_timer.c.

View File

@ -40,7 +40,7 @@ Linux guests communicate with Hyper-V in four different ways:
arm64, these synthetic registers must be accessed using explicit arm64, these synthetic registers must be accessed using explicit
hypercalls. hypercalls.
* VMbus: VMbus is a higher-level software construct that is built on * VMBus: VMBus is a higher-level software construct that is built on
the other 3 mechanisms. It is a message passing interface between the other 3 mechanisms. It is a message passing interface between
the Hyper-V host and the Linux guest. It uses memory that is shared the Hyper-V host and the Linux guest. It uses memory that is shared
between Hyper-V and the guest, along with various signaling between Hyper-V and the guest, along with various signaling
@ -54,8 +54,8 @@ x86/x64 architecture only.
.. _Hyper-V Top Level Functional Spec (TLFS): https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/tlfs .. _Hyper-V Top Level Functional Spec (TLFS): https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/tlfs
VMbus is not documented. This documentation provides a high-level VMBus is not documented. This documentation provides a high-level
overview of VMbus and how it works, but the details can be discerned overview of VMBus and how it works, but the details can be discerned
only from the code. only from the code.
Sharing Memory Sharing Memory
@ -74,7 +74,7 @@ follows:
physical address space. How Hyper-V is told about the GPA or list physical address space. How Hyper-V is told about the GPA or list
of GPAs varies. In some cases, a single GPA is written to a of GPAs varies. In some cases, a single GPA is written to a
synthetic register. In other cases, a GPA or list of GPAs is sent synthetic register. In other cases, a GPA or list of GPAs is sent
in a VMbus message. in a VMBus message.
* Hyper-V translates the GPAs into "real" physical memory addresses, * Hyper-V translates the GPAs into "real" physical memory addresses,
and creates a virtual mapping that it can use to access the memory. and creates a virtual mapping that it can use to access the memory.
@ -133,9 +133,9 @@ only the CPUs actually present in the VM, so Linux does not report
any hot-add CPUs. any hot-add CPUs.
A Linux guest CPU may be taken offline using the normal Linux A Linux guest CPU may be taken offline using the normal Linux
mechanisms, provided no VMbus channel interrupts are assigned to mechanisms, provided no VMBus channel interrupts are assigned to
the CPU. See the section on VMbus Interrupts for more details the CPU. See the section on VMBus Interrupts for more details
on how VMbus channel interrupts can be re-assigned to permit on how VMBus channel interrupts can be re-assigned to permit
taking a CPU offline. taking a CPU offline.
32-bit and 64-bit 32-bit and 64-bit
@ -169,14 +169,14 @@ and functionality. Hyper-V indicates feature/function availability
via flags in synthetic MSRs that Hyper-V provides to the guest, via flags in synthetic MSRs that Hyper-V provides to the guest,
and the guest code tests these flags. and the guest code tests these flags.
VMbus has its own protocol version that is negotiated during the VMBus has its own protocol version that is negotiated during the
initial VMbus connection from the guest to Hyper-V. This version initial VMBus connection from the guest to Hyper-V. This version
number is also output to dmesg during boot. This version number number is also output to dmesg during boot. This version number
is checked in a few places in the code to determine if specific is checked in a few places in the code to determine if specific
functionality is present. functionality is present.
Furthermore, each synthetic device on VMbus also has a protocol Furthermore, each synthetic device on VMBus also has a protocol
version that is separate from the VMbus protocol version. Device version that is separate from the VMBus protocol version. Device
drivers for these synthetic devices typically negotiate the device drivers for these synthetic devices typically negotiate the device
protocol version, and may test that protocol version to determine protocol version, and may test that protocol version to determine
if specific device functionality is present. if specific device functionality is present.

View File

@ -1,8 +1,8 @@
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
VMbus VMBus
===== =====
VMbus is a software construct provided by Hyper-V to guest VMs. It VMBus is a software construct provided by Hyper-V to guest VMs. It
consists of a control path and common facilities used by synthetic consists of a control path and common facilities used by synthetic
devices that Hyper-V presents to guest VMs. The control path is devices that Hyper-V presents to guest VMs. The control path is
used to offer synthetic devices to the guest VM and, in some cases, used to offer synthetic devices to the guest VM and, in some cases,
@ -12,9 +12,9 @@ and the synthetic device implementation that is part of Hyper-V, and
signaling primitives to allow Hyper-V and the guest to interrupt signaling primitives to allow Hyper-V and the guest to interrupt
each other. each other.
VMbus is modeled in Linux as a bus, with the expected /sys/bus/vmbus VMBus is modeled in Linux as a bus, with the expected /sys/bus/vmbus
entry in a running Linux guest. The VMbus driver (drivers/hv/vmbus_drv.c) entry in a running Linux guest. The VMBus driver (drivers/hv/vmbus_drv.c)
establishes the VMbus control path with the Hyper-V host, then establishes the VMBus control path with the Hyper-V host, then
registers itself as a Linux bus driver. It implements the standard registers itself as a Linux bus driver. It implements the standard
bus functions for adding and removing devices to/from the bus. bus functions for adding and removing devices to/from the bus.
@ -49,9 +49,9 @@ synthetic NIC is referred to as "netvsc" and the Linux driver for
the synthetic SCSI controller is "storvsc". These drivers contain the synthetic SCSI controller is "storvsc". These drivers contain
functions with names like "storvsc_connect_to_vsp". functions with names like "storvsc_connect_to_vsp".
VMbus channels VMBus channels
-------------- --------------
An instance of a synthetic device uses VMbus channels to communicate An instance of a synthetic device uses VMBus channels to communicate
between the VSP and the VSC. Channels are bi-directional and used between the VSP and the VSC. Channels are bi-directional and used
for passing messages. Most synthetic devices use a single channel, for passing messages. Most synthetic devices use a single channel,
but the synthetic SCSI controller and synthetic NIC may use multiple but the synthetic SCSI controller and synthetic NIC may use multiple
@ -73,7 +73,7 @@ write indices and some control flags, followed by the memory for the
actual ring. The size of the ring is determined by the VSC in the actual ring. The size of the ring is determined by the VSC in the
guest and is specific to each synthetic device. The list of GPAs guest and is specific to each synthetic device. The list of GPAs
making up the ring is communicated to the Hyper-V host over the making up the ring is communicated to the Hyper-V host over the
VMbus control path as a GPA Descriptor List (GPADL). See function VMBus control path as a GPA Descriptor List (GPADL). See function
vmbus_establish_gpadl(). vmbus_establish_gpadl().
Each ring buffer is mapped into contiguous Linux kernel virtual Each ring buffer is mapped into contiguous Linux kernel virtual
@ -102,10 +102,10 @@ resources. For Windows Server 2019 and later, this limit is
approximately 1280 Mbytes. For versions prior to Windows Server approximately 1280 Mbytes. For versions prior to Windows Server
2019, the limit is approximately 384 Mbytes. 2019, the limit is approximately 384 Mbytes.
VMbus messages VMBus channel messages
-------------- ----------------------
All VMbus messages have a standard header that includes the message All messages sent in a VMBus channel have a standard header that includes
length, the offset of the message payload, some flags, and a the message length, the offset of the message payload, some flags, and a
transactionID. The portion of the message after the header is transactionID. The portion of the message after the header is
unique to each VSP/VSC pair. unique to each VSP/VSC pair.
@ -137,7 +137,7 @@ control message contains a list of GPAs that describe the data
buffer. For example, the storvsc driver uses this approach to buffer. For example, the storvsc driver uses this approach to
specify the data buffers to/from which disk I/O is done. specify the data buffers to/from which disk I/O is done.
Three functions exist to send VMbus messages: Three functions exist to send VMBus channel messages:
1. vmbus_sendpacket(): Control-only messages and messages with 1. vmbus_sendpacket(): Control-only messages and messages with
embedded data -- no GPAs embedded data -- no GPAs
@ -154,20 +154,51 @@ Historically, Linux guests have trusted Hyper-V to send well-formed
and valid messages, and Linux drivers for synthetic devices did not and valid messages, and Linux drivers for synthetic devices did not
fully validate messages. With the introduction of processor fully validate messages. With the introduction of processor
technologies that fully encrypt guest memory and that allow the technologies that fully encrypt guest memory and that allow the
guest to not trust the hypervisor (AMD SNP-SEV, Intel TDX), trusting guest to not trust the hypervisor (AMD SEV-SNP, Intel TDX), trusting
the Hyper-V host is no longer a valid assumption. The drivers for the Hyper-V host is no longer a valid assumption. The drivers for
VMbus synthetic devices are being updated to fully validate any VMBus synthetic devices are being updated to fully validate any
values read from memory that is shared with Hyper-V, which includes values read from memory that is shared with Hyper-V, which includes
messages from VMbus devices. To facilitate such validation, messages from VMBus devices. To facilitate such validation,
messages read by the guest from the "in" ring buffer are copied to a messages read by the guest from the "in" ring buffer are copied to a
temporary buffer that is not shared with Hyper-V. Validation is temporary buffer that is not shared with Hyper-V. Validation is
performed in this temporary buffer without the risk of Hyper-V performed in this temporary buffer without the risk of Hyper-V
maliciously modifying the message after it is validated but before maliciously modifying the message after it is validated but before
it is used. it is used.
VMbus interrupts Synthetic Interrupt Controller (synic)
--------------------------------------
Hyper-V provides each guest CPU with a synthetic interrupt controller
that is used by VMBus for host-guest communication. While each synic
defines 16 synthetic interrupts (SINT), Linux uses only one of the 16
(VMBUS_MESSAGE_SINT). All interrupts related to communication between
the Hyper-V host and a guest CPU use that SINT.
The SINT is mapped to a single per-CPU architectural interrupt (i.e,
an 8-bit x86/x64 interrupt vector, or an arm64 PPI INTID). Because
each CPU in the guest has a synic and may receive VMBus interrupts,
they are best modeled in Linux as per-CPU interrupts. This model works
well on arm64 where a single per-CPU Linux IRQ is allocated for
VMBUS_MESSAGE_SINT. This IRQ appears in /proc/interrupts as an IRQ labelled
"Hyper-V VMbus". Since x86/x64 lacks support for per-CPU IRQs, an x86
interrupt vector is statically allocated (HYPERVISOR_CALLBACK_VECTOR)
across all CPUs and explicitly coded to call vmbus_isr(). In this case,
there's no Linux IRQ, and the interrupts are visible in aggregate in
/proc/interrupts on the "HYP" line.
The synic provides the means to demultiplex the architectural interrupt into
one or more logical interrupts and route the logical interrupt to the proper
VMBus handler in Linux. This demultiplexing is done by vmbus_isr() and
related functions that access synic data structures.
The synic is not modeled in Linux as an irq chip or irq domain,
and the demultiplexed logical interrupts are not Linux IRQs. As such,
they don't appear in /proc/interrupts or /proc/irq. The CPU
affinity for one of these logical interrupts is controlled via an
entry under /sys/bus/vmbus as described below.
VMBus interrupts
---------------- ----------------
VMbus provides a mechanism for the guest to interrupt the host when VMBus provides a mechanism for the guest to interrupt the host when
the guest has queued new messages in a ring buffer. The host the guest has queued new messages in a ring buffer. The host
expects that the guest will send an interrupt only when an "out" expects that the guest will send an interrupt only when an "out"
ring buffer transitions from empty to non-empty. If the guest sends ring buffer transitions from empty to non-empty. If the guest sends
@ -176,63 +207,55 @@ unnecessary. If a guest sends an excessive number of unnecessary
interrupts, the host may throttle that guest by suspending its interrupts, the host may throttle that guest by suspending its
execution for a few seconds to prevent a denial-of-service attack. execution for a few seconds to prevent a denial-of-service attack.
Similarly, the host will interrupt the guest when it sends a new Similarly, the host will interrupt the guest via the synic when
message on the VMbus control path, or when a VMbus channel "in" ring it sends a new message on the VMBus control path, or when a VMBus
buffer transitions from empty to non-empty. Each CPU in the guest channel "in" ring buffer transitions from empty to non-empty due to
may receive VMbus interrupts, so they are best modeled as per-CPU the host inserting a new VMBus channel message. The control message stream
interrupts in Linux. This model works well on arm64 where a single and each VMBus channel "in" ring buffer are separate logical interrupts
per-CPU IRQ is allocated for VMbus. Since x86/x64 lacks support for that are demultiplexed by vmbus_isr(). It demultiplexes by first checking
per-CPU IRQs, an x86 interrupt vector is statically allocated (see for channel interrupts by calling vmbus_chan_sched(), which looks at a synic
HYPERVISOR_CALLBACK_VECTOR) across all CPUs and explicitly coded to bitmap to determine which channels have pending interrupts on this CPU.
call the VMbus interrupt service routine. These interrupts are If multiple channels have pending interrupts for this CPU, they are
visible in /proc/interrupts on the "HYP" line. processed sequentially. When all channel interrupts have been processed,
vmbus_isr() checks for and processes any messages received on the VMBus
control path.
The guest CPU that a VMbus channel will interrupt is selected by the The guest CPU that a VMBus channel will interrupt is selected by the
guest when the channel is created, and the host is informed of that guest when the channel is created, and the host is informed of that
selection. VMbus devices are broadly grouped into two categories: selection. VMBus devices are broadly grouped into two categories:
1. "Slow" devices that need only one VMbus channel. The devices 1. "Slow" devices that need only one VMBus channel. The devices
(such as keyboard, mouse, heartbeat, and timesync) generate (such as keyboard, mouse, heartbeat, and timesync) generate
relatively few interrupts. Their VMbus channels are all relatively few interrupts. Their VMBus channels are all
assigned to interrupt the VMBUS_CONNECT_CPU, which is always assigned to interrupt the VMBUS_CONNECT_CPU, which is always
CPU 0. CPU 0.
2. "High speed" devices that may use multiple VMbus channels for 2. "High speed" devices that may use multiple VMBus channels for
higher parallelism and performance. These devices include the higher parallelism and performance. These devices include the
synthetic SCSI controller and synthetic NIC. Their VMbus synthetic SCSI controller and synthetic NIC. Their VMBus
channels interrupts are assigned to CPUs that are spread out channels interrupts are assigned to CPUs that are spread out
among the available CPUs in the VM so that interrupts on among the available CPUs in the VM so that interrupts on
multiple channels can be processed in parallel. multiple channels can be processed in parallel.
The assignment of VMbus channel interrupts to CPUs is done in the The assignment of VMBus channel interrupts to CPUs is done in the
function init_vp_index(). This assignment is done outside of the function init_vp_index(). This assignment is done outside of the
normal Linux interrupt affinity mechanism, so the interrupts are normal Linux interrupt affinity mechanism, so the interrupts are
neither "unmanaged" nor "managed" interrupts. neither "unmanaged" nor "managed" interrupts.
The CPU that a VMbus channel will interrupt can be seen in The CPU that a VMBus channel will interrupt can be seen in
/sys/bus/vmbus/devices/<deviceGUID>/ channels/<channelRelID>/cpu. /sys/bus/vmbus/devices/<deviceGUID>/ channels/<channelRelID>/cpu.
When running on later versions of Hyper-V, the CPU can be changed When running on later versions of Hyper-V, the CPU can be changed
by writing a new value to this sysfs entry. Because the interrupt by writing a new value to this sysfs entry. Because VMBus channel
assignment is done outside of the normal Linux affinity mechanism, interrupts are not Linux IRQs, there are no entries in /proc/interrupts
there are no entries in /proc/irq corresponding to individual or /proc/irq corresponding to individual VMBus channel interrupts.
VMbus channel interrupts.
An online CPU in a Linux guest may not be taken offline if it has An online CPU in a Linux guest may not be taken offline if it has
VMbus channel interrupts assigned to it. Any such channel VMBus channel interrupts assigned to it. Any such channel
interrupts must first be manually reassigned to another CPU as interrupts must first be manually reassigned to another CPU as
described above. When no channel interrupts are assigned to the described above. When no channel interrupts are assigned to the
CPU, it can be taken offline. CPU, it can be taken offline.
When a guest CPU receives a VMbus interrupt from the host, the The VMBus channel interrupt handling code is designed to work
function vmbus_isr() handles the interrupt. It first checks for
channel interrupts by calling vmbus_chan_sched(), which looks at a
bitmap setup by the host to determine which channels have pending
interrupts on this CPU. If multiple channels have pending
interrupts for this CPU, they are processed sequentially. When all
channel interrupts have been processed, vmbus_isr() checks for and
processes any message received on the VMbus control path.
The VMbus channel interrupt handling code is designed to work
correctly even if an interrupt is received on a CPU other than the correctly even if an interrupt is received on a CPU other than the
CPU assigned to the channel. Specifically, the code does not use CPU assigned to the channel. Specifically, the code does not use
CPU-based exclusion for correctness. In normal operation, Hyper-V CPU-based exclusion for correctness. In normal operation, Hyper-V
@ -242,23 +265,23 @@ when Hyper-V will make the transition. The code must work correctly
even if there is a time lag before Hyper-V starts interrupting the even if there is a time lag before Hyper-V starts interrupting the
new CPU. See comments in target_cpu_store(). new CPU. See comments in target_cpu_store().
VMbus device creation/deletion VMBus device creation/deletion
------------------------------ ------------------------------
Hyper-V and the Linux guest have a separate message-passing path Hyper-V and the Linux guest have a separate message-passing path
that is used for synthetic device creation and deletion. This that is used for synthetic device creation and deletion. This
path does not use a VMbus channel. See vmbus_post_msg() and path does not use a VMBus channel. See vmbus_post_msg() and
vmbus_on_msg_dpc(). vmbus_on_msg_dpc().
The first step is for the guest to connect to the generic The first step is for the guest to connect to the generic
Hyper-V VMbus mechanism. As part of establishing this connection, Hyper-V VMBus mechanism. As part of establishing this connection,
the guest and Hyper-V agree on a VMbus protocol version they will the guest and Hyper-V agree on a VMBus protocol version they will
use. This negotiation allows newer Linux kernels to run on older use. This negotiation allows newer Linux kernels to run on older
Hyper-V versions, and vice versa. Hyper-V versions, and vice versa.
The guest then tells Hyper-V to "send offers". Hyper-V sends an The guest then tells Hyper-V to "send offers". Hyper-V sends an
offer message to the guest for each synthetic device that the VM offer message to the guest for each synthetic device that the VM
is configured to have. Each VMbus device type has a fixed GUID is configured to have. Each VMBus device type has a fixed GUID
known as the "class ID", and each VMbus device instance is also known as the "class ID", and each VMBus device instance is also
identified by a GUID. The offer message from Hyper-V contains identified by a GUID. The offer message from Hyper-V contains
both GUIDs to uniquely (within the VM) identify the device. both GUIDs to uniquely (within the VM) identify the device.
There is one offer message for each device instance, so a VM with There is one offer message for each device instance, so a VM with
@ -275,7 +298,7 @@ type based on the class ID, and invokes the correct driver to set up
the device. Driver/device matching is performed using the standard the device. Driver/device matching is performed using the standard
Linux mechanism. Linux mechanism.
The device driver probe function opens the primary VMbus channel to The device driver probe function opens the primary VMBus channel to
the corresponding VSP. It allocates guest memory for the channel the corresponding VSP. It allocates guest memory for the channel
ring buffers and shares the ring buffer with the Hyper-V host by ring buffers and shares the ring buffer with the Hyper-V host by
giving the host a list of GPAs for the ring buffer memory. See giving the host a list of GPAs for the ring buffer memory. See
@ -285,7 +308,7 @@ Once the ring buffer is set up, the device driver and VSP exchange
setup messages via the primary channel. These messages may include setup messages via the primary channel. These messages may include
negotiating the device protocol version to be used between the Linux negotiating the device protocol version to be used between the Linux
VSC and the VSP on the Hyper-V host. The setup messages may also VSC and the VSP on the Hyper-V host. The setup messages may also
include creating additional VMbus channels, which are somewhat include creating additional VMBus channels, which are somewhat
mis-named as "sub-channels" since they are functionally mis-named as "sub-channels" since they are functionally
equivalent to the primary channel once they are created. equivalent to the primary channel once they are created.

View File

@ -1044,7 +1044,7 @@ M: Joerg Roedel <joro@8bytes.org>
R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
L: iommu@lists.linux.dev L: iommu@lists.linux.dev
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
F: drivers/iommu/amd/ F: drivers/iommu/amd/
F: include/linux/amd-iommu.h F: include/linux/amd-iommu.h
@ -1107,7 +1107,6 @@ L: linux-pm@vger.kernel.org
S: Supported S: Supported
F: Documentation/admin-guide/pm/amd-pstate.rst F: Documentation/admin-guide/pm/amd-pstate.rst
F: drivers/cpufreq/amd-pstate* F: drivers/cpufreq/amd-pstate*
F: include/linux/amd-pstate.h
F: tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py F: tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py
AMD PTDMA DRIVER AMD PTDMA DRIVER
@ -3602,10 +3601,9 @@ W: https://wireless.wiki.kernel.org/en/users/Drivers/b43
F: drivers/net/wireless/broadcom/b43/ F: drivers/net/wireless/broadcom/b43/
B43LEGACY WIRELESS DRIVER B43LEGACY WIRELESS DRIVER
M: Larry Finger <Larry.Finger@lwfinger.net>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
L: b43-dev@lists.infradead.org L: b43-dev@lists.infradead.org
S: Maintained S: Orphan
W: https://wireless.wiki.kernel.org/en/users/Drivers/b43 W: https://wireless.wiki.kernel.org/en/users/Drivers/b43
F: drivers/net/wireless/broadcom/b43legacy/ F: drivers/net/wireless/broadcom/b43legacy/
@ -3981,7 +3979,7 @@ R: Song Liu <song@kernel.org>
R: Yonghong Song <yonghong.song@linux.dev> R: Yonghong Song <yonghong.song@linux.dev>
R: John Fastabend <john.fastabend@gmail.com> R: John Fastabend <john.fastabend@gmail.com>
R: KP Singh <kpsingh@kernel.org> R: KP Singh <kpsingh@kernel.org>
R: Stanislav Fomichev <sdf@google.com> R: Stanislav Fomichev <sdf@fomichev.me>
R: Hao Luo <haoluo@google.com> R: Hao Luo <haoluo@google.com>
R: Jiri Olsa <jolsa@kernel.org> R: Jiri Olsa <jolsa@kernel.org>
L: bpf@vger.kernel.org L: bpf@vger.kernel.org
@ -4084,12 +4082,13 @@ F: kernel/bpf/ringbuf.c
BPF [SECURITY & LSM] (Security Audit and Enforcement using BPF) BPF [SECURITY & LSM] (Security Audit and Enforcement using BPF)
M: KP Singh <kpsingh@kernel.org> M: KP Singh <kpsingh@kernel.org>
R: Matt Bobrowski <mattbobrowski@google.com> M: Matt Bobrowski <mattbobrowski@google.com>
L: bpf@vger.kernel.org L: bpf@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/bpf/prog_lsm.rst F: Documentation/bpf/prog_lsm.rst
F: include/linux/bpf_lsm.h F: include/linux/bpf_lsm.h
F: kernel/bpf/bpf_lsm.c F: kernel/bpf/bpf_lsm.c
F: kernel/trace/bpf_trace.c
F: security/bpf/ F: security/bpf/
BPF [SELFTESTS] (Test Runners & Infrastructure) BPF [SELFTESTS] (Test Runners & Infrastructure)
@ -5296,7 +5295,7 @@ F: drivers/infiniband/hw/usnic/
CLANG CONTROL FLOW INTEGRITY SUPPORT CLANG CONTROL FLOW INTEGRITY SUPPORT
M: Sami Tolvanen <samitolvanen@google.com> M: Sami Tolvanen <samitolvanen@google.com>
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Nathan Chancellor <nathan@kernel.org> R: Nathan Chancellor <nathan@kernel.org>
L: llvm@lists.linux.dev L: llvm@lists.linux.dev
S: Supported S: Supported
@ -6239,9 +6238,8 @@ S: Maintained
F: drivers/usb/dwc3/ F: drivers/usb/dwc3/
DESIGNWARE XDATA IP DRIVER DESIGNWARE XDATA IP DRIVER
M: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
S: Maintained S: Orphan
F: Documentation/misc-devices/dw-xdata-pcie.rst F: Documentation/misc-devices/dw-xdata-pcie.rst
F: drivers/misc/dw-xdata-pcie.c F: drivers/misc/dw-xdata-pcie.c
@ -8212,7 +8210,7 @@ F: rust/kernel/net/phy.rs
EXEC & BINFMT API, ELF EXEC & BINFMT API, ELF
R: Eric Biederman <ebiederm@xmission.com> R: Eric Biederman <ebiederm@xmission.com>
R: Kees Cook <keescook@chromium.org> R: Kees Cook <kees@kernel.org>
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/execve T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/execve
@ -8613,7 +8611,7 @@ S: Maintained
F: drivers/net/ethernet/nvidia/* F: drivers/net/ethernet/nvidia/*
FORTIFY_SOURCE FORTIFY_SOURCE
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
@ -9103,7 +9101,7 @@ F: include/linux/mfd/gsc.h
F: include/linux/platform_data/gsc_hwmon.h F: include/linux/platform_data/gsc_hwmon.h
GCC PLUGINS GCC PLUGINS
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
@ -9237,7 +9235,7 @@ S: Maintained
F: drivers/input/touchscreen/resistive-adc-touch.c F: drivers/input/touchscreen/resistive-adc-touch.c
GENERIC STRING LIBRARY GENERIC STRING LIBRARY
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Andy Shevchenko <andy@kernel.org> R: Andy Shevchenko <andy@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Supported S: Supported
@ -11035,8 +11033,8 @@ F: include/uapi/drm/i915_drm.h
INTEL DRM XE DRIVER (Lunar Lake and newer) INTEL DRM XE DRIVER (Lunar Lake and newer)
M: Lucas De Marchi <lucas.demarchi@intel.com> M: Lucas De Marchi <lucas.demarchi@intel.com>
M: Oded Gabbay <ogabbay@kernel.org>
M: Thomas Hellström <thomas.hellstrom@linux.intel.com> M: Thomas Hellström <thomas.hellstrom@linux.intel.com>
M: Rodrigo Vivi <rodrigo.vivi@intel.com>
L: intel-xe@lists.freedesktop.org L: intel-xe@lists.freedesktop.org
S: Supported S: Supported
W: https://drm.pages.freedesktop.org/intel-docs/ W: https://drm.pages.freedesktop.org/intel-docs/
@ -11157,7 +11155,7 @@ M: David Woodhouse <dwmw2@infradead.org>
M: Lu Baolu <baolu.lu@linux.intel.com> M: Lu Baolu <baolu.lu@linux.intel.com>
L: iommu@lists.linux.dev L: iommu@lists.linux.dev
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
F: drivers/iommu/intel/ F: drivers/iommu/intel/
INTEL IPU3 CSI-2 CIO2 DRIVER INTEL IPU3 CSI-2 CIO2 DRIVER
@ -11530,7 +11528,7 @@ IOMMU DMA-API LAYER
M: Robin Murphy <robin.murphy@arm.com> M: Robin Murphy <robin.murphy@arm.com>
L: iommu@lists.linux.dev L: iommu@lists.linux.dev
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
F: drivers/iommu/dma-iommu.c F: drivers/iommu/dma-iommu.c
F: drivers/iommu/dma-iommu.h F: drivers/iommu/dma-iommu.h
F: drivers/iommu/iova.c F: drivers/iommu/iova.c
@ -11542,7 +11540,7 @@ M: Will Deacon <will@kernel.org>
R: Robin Murphy <robin.murphy@arm.com> R: Robin Murphy <robin.murphy@arm.com>
L: iommu@lists.linux.dev L: iommu@lists.linux.dev
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/iommu/linux.git
F: Documentation/devicetree/bindings/iommu/ F: Documentation/devicetree/bindings/iommu/
F: Documentation/userspace-api/iommu.rst F: Documentation/userspace-api/iommu.rst
F: drivers/iommu/ F: drivers/iommu/
@ -11951,7 +11949,7 @@ F: scripts/package/
F: usr/ F: usr/
KERNEL HARDENING (not covered by other areas) KERNEL HARDENING (not covered by other areas)
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Gustavo A. R. Silva <gustavoars@kernel.org> R: Gustavo A. R. Silva <gustavoars@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Supported S: Supported
@ -12478,7 +12476,7 @@ F: drivers/scsi/53c700*
LEAKING_ADDRESSES LEAKING_ADDRESSES
M: Tycho Andersen <tycho@tycho.pizza> M: Tycho Andersen <tycho@tycho.pizza>
R: Kees Cook <keescook@chromium.org> R: Kees Cook <kees@kernel.org>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
@ -12774,7 +12772,7 @@ F: arch/powerpc/platforms/8xx/
F: arch/powerpc/platforms/83xx/ F: arch/powerpc/platforms/83xx/
LINUX KERNEL DUMP TEST MODULE (LKDTM) LINUX KERNEL DUMP TEST MODULE (LKDTM)
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
S: Maintained S: Maintained
F: drivers/misc/lkdtm/* F: drivers/misc/lkdtm/*
F: tools/testing/selftests/lkdtm/* F: tools/testing/selftests/lkdtm/*
@ -12904,7 +12902,7 @@ Q: http://patchwork.linuxtv.org/project/linux-media/list/
F: drivers/media/usb/dvb-usb-v2/lmedm04* F: drivers/media/usb/dvb-usb-v2/lmedm04*
LOADPIN SECURITY MODULE LOADPIN SECURITY MODULE
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
F: Documentation/admin-guide/LSM/LoadPin.rst F: Documentation/admin-guide/LSM/LoadPin.rst
@ -15237,7 +15235,6 @@ F: drivers/staging/most/
F: include/linux/most.h F: include/linux/most.h
MOTORCOMM PHY DRIVER MOTORCOMM PHY DRIVER
M: Peter Geis <pgwipeout@gmail.com>
M: Frank <Frank.Sae@motor-comm.com> M: Frank <Frank.Sae@motor-comm.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
@ -15826,7 +15823,7 @@ F: drivers/nfc/virtual_ncidev.c
F: tools/testing/selftests/nci/ F: tools/testing/selftests/nci/
NFS, SUNRPC, AND LOCKD CLIENTS NFS, SUNRPC, AND LOCKD CLIENTS
M: Trond Myklebust <trond.myklebust@hammerspace.com> M: Trond Myklebust <trondmy@kernel.org>
M: Anna Schumaker <anna@kernel.org> M: Anna Schumaker <anna@kernel.org>
L: linux-nfs@vger.kernel.org L: linux-nfs@vger.kernel.org
S: Maintained S: Maintained
@ -17533,7 +17530,6 @@ F: include/linux/peci.h
PENSANDO ETHERNET DRIVERS PENSANDO ETHERNET DRIVERS
M: Shannon Nelson <shannon.nelson@amd.com> M: Shannon Nelson <shannon.nelson@amd.com>
M: Brett Creeley <brett.creeley@amd.com> M: Brett Creeley <brett.creeley@amd.com>
M: drivers@pensando.io
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Supported
F: Documentation/networking/device_drivers/ethernet/pensando/ionic.rst F: Documentation/networking/device_drivers/ethernet/pensando/ionic.rst
@ -17997,7 +17993,7 @@ F: tools/testing/selftests/proc/
PROC SYSCTL PROC SYSCTL
M: Luis Chamberlain <mcgrof@kernel.org> M: Luis Chamberlain <mcgrof@kernel.org>
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
M: Joel Granados <j.granados@samsung.com> M: Joel Granados <j.granados@samsung.com>
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
L: linux-fsdevel@vger.kernel.org L: linux-fsdevel@vger.kernel.org
@ -18053,7 +18049,7 @@ F: Documentation/devicetree/bindings/net/pse-pd/
F: drivers/net/pse-pd/ F: drivers/net/pse-pd/
PSTORE FILESYSTEM PSTORE FILESYSTEM
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Tony Luck <tony.luck@intel.com> R: Tony Luck <tony.luck@intel.com>
R: Guilherme G. Piccoli <gpiccoli@igalia.com> R: Guilherme G. Piccoli <gpiccoli@igalia.com>
L: linux-hardening@vger.kernel.org L: linux-hardening@vger.kernel.org
@ -18211,6 +18207,7 @@ QCOM AUDIO (ASoC) DRIVERS
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
M: Banajit Goswami <bgoswami@quicinc.com> M: Banajit Goswami <bgoswami@quicinc.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
L: linux-arm-msm@vger.kernel.org
S: Supported S: Supported
F: Documentation/devicetree/bindings/soc/qcom/qcom,apr* F: Documentation/devicetree/bindings/soc/qcom/qcom,apr*
F: Documentation/devicetree/bindings/sound/qcom,* F: Documentation/devicetree/bindings/sound/qcom,*
@ -18375,7 +18372,7 @@ M: Jeff Johnson <jjohnson@kernel.org>
L: ath12k@lists.infradead.org L: ath12k@lists.infradead.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath12k W: https://wireless.wiki.kernel.org/en/users/Drivers/ath12k
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/ath/ath.git
F: drivers/net/wireless/ath/ath12k/ F: drivers/net/wireless/ath/ath12k/
N: ath12k N: ath12k
@ -18385,7 +18382,7 @@ M: Jeff Johnson <jjohnson@kernel.org>
L: ath10k@lists.infradead.org L: ath10k@lists.infradead.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/ath/ath.git
F: drivers/net/wireless/ath/ath10k/ F: drivers/net/wireless/ath/ath10k/
N: ath10k N: ath10k
@ -18396,7 +18393,7 @@ L: ath11k@lists.infradead.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath11k W: https://wireless.wiki.kernel.org/en/users/Drivers/ath11k
B: https://wireless.wiki.kernel.org/en/users/Drivers/ath11k/bugreport B: https://wireless.wiki.kernel.org/en/users/Drivers/ath11k/bugreport
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/ath/ath.git
F: drivers/net/wireless/ath/ath11k/ F: drivers/net/wireless/ath/ath11k/
N: ath11k N: ath11k
@ -18405,7 +18402,7 @@ M: Toke Høiland-Jørgensen <toke@toke.dk>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
S: Maintained S: Maintained
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath9k W: https://wireless.wiki.kernel.org/en/users/Drivers/ath9k
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/ath/ath.git
F: Documentation/devicetree/bindings/net/wireless/qca,ath9k.yaml F: Documentation/devicetree/bindings/net/wireless/qca,ath9k.yaml
F: drivers/net/wireless/ath/ath9k/ F: drivers/net/wireless/ath/ath9k/
@ -19316,7 +19313,7 @@ F: drivers/perf/riscv_pmu_legacy.c
F: drivers/perf/riscv_pmu_sbi.c F: drivers/perf/riscv_pmu_sbi.c
RISC-V THEAD SoC SUPPORT RISC-V THEAD SoC SUPPORT
M: Jisheng Zhang <jszhang@kernel.org> M: Drew Fustini <drew@pdp7.com>
M: Guo Ren <guoren@kernel.org> M: Guo Ren <guoren@kernel.org>
M: Fu Wei <wefu@redhat.com> M: Fu Wei <wefu@redhat.com>
L: linux-riscv@lists.infradead.org L: linux-riscv@lists.infradead.org
@ -19510,7 +19507,6 @@ F: drivers/net/wireless/realtek/rtl818x/rtl8180/
RTL8187 WIRELESS DRIVER RTL8187 WIRELESS DRIVER
M: Hin-Tak Leung <hintak.leung@gmail.com> M: Hin-Tak Leung <hintak.leung@gmail.com>
M: Larry Finger <Larry.Finger@lwfinger.net>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
S: Maintained S: Maintained
T: git https://github.com/pkshih/rtw.git T: git https://github.com/pkshih/rtw.git
@ -20059,7 +20055,7 @@ F: drivers/media/cec/platform/seco/seco-cec.c
F: drivers/media/cec/platform/seco/seco-cec.h F: drivers/media/cec/platform/seco/seco-cec.h
SECURE COMPUTING SECURE COMPUTING
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Andy Lutomirski <luto@amacapital.net> R: Andy Lutomirski <luto@amacapital.net>
R: Will Drewry <wad@chromium.org> R: Will Drewry <wad@chromium.org>
S: Supported S: Supported
@ -21248,7 +21244,6 @@ W: http://wiki.laptop.org/go/DCON
F: drivers/staging/olpc_dcon/ F: drivers/staging/olpc_dcon/
STAGING - REALTEK RTL8712U DRIVERS STAGING - REALTEK RTL8712U DRIVERS
M: Larry Finger <Larry.Finger@lwfinger.net>
M: Florian Schilhabel <florian.c.schilhabel@googlemail.com>. M: Florian Schilhabel <florian.c.schilhabel@googlemail.com>.
S: Odd Fixes S: Odd Fixes
F: drivers/staging/rtl8712/ F: drivers/staging/rtl8712/
@ -22678,7 +22673,7 @@ L: tomoyo-users-en@lists.osdn.me (subscribers-only, for users in English)
L: tomoyo-dev@lists.osdn.me (subscribers-only, for developers in Japanese) L: tomoyo-dev@lists.osdn.me (subscribers-only, for developers in Japanese)
L: tomoyo-users@lists.osdn.me (subscribers-only, for users in Japanese) L: tomoyo-users@lists.osdn.me (subscribers-only, for users in Japanese)
S: Maintained S: Maintained
W: https://tomoyo.osdn.jp/ W: https://tomoyo.sourceforge.net/
F: security/tomoyo/ F: security/tomoyo/
TOPSTAR LAPTOP EXTRAS DRIVER TOPSTAR LAPTOP EXTRAS DRIVER
@ -22747,7 +22742,7 @@ M: Jarkko Sakkinen <jarkko@kernel.org>
R: Jason Gunthorpe <jgg@ziepe.ca> R: Jason Gunthorpe <jgg@ziepe.ca>
L: linux-integrity@vger.kernel.org L: linux-integrity@vger.kernel.org
S: Maintained S: Maintained
W: https://gitlab.com/jarkkojs/linux-tpmdd-test W: https://codeberg.org/jarkko/linux-tpmdd-test
Q: https://patchwork.kernel.org/project/linux-integrity/list/ Q: https://patchwork.kernel.org/project/linux-integrity/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
F: Documentation/devicetree/bindings/tpm/ F: Documentation/devicetree/bindings/tpm/
@ -22973,7 +22968,7 @@ F: drivers/block/ublk_drv.c
F: include/uapi/linux/ublk_cmd.h F: include/uapi/linux/ublk_cmd.h
UBSAN UBSAN
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
R: Marco Elver <elver@google.com> R: Marco Elver <elver@google.com>
R: Andrey Konovalov <andreyknvl@gmail.com> R: Andrey Konovalov <andreyknvl@gmail.com>
R: Andrey Ryabinin <ryabinin.a.a@gmail.com> R: Andrey Ryabinin <ryabinin.a.a@gmail.com>
@ -23975,7 +23970,6 @@ VMALLOC
M: Andrew Morton <akpm@linux-foundation.org> M: Andrew Morton <akpm@linux-foundation.org>
R: Uladzislau Rezki <urezki@gmail.com> R: Uladzislau Rezki <urezki@gmail.com>
R: Christoph Hellwig <hch@infradead.org> R: Christoph Hellwig <hch@infradead.org>
R: Lorenzo Stoakes <lstoakes@gmail.com>
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Maintained S: Maintained
W: http://www.linux-mm.org W: http://www.linux-mm.org
@ -24811,7 +24805,7 @@ F: drivers/net/hamradio/yam*
F: include/linux/yam.h F: include/linux/yam.h
YAMA SECURITY MODULE YAMA SECURITY MODULE
M: Kees Cook <keescook@chromium.org> M: Kees Cook <kees@kernel.org>
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
F: Documentation/admin-guide/LSM/Yama.rst F: Documentation/admin-guide/LSM/Yama.rst

View File

@ -2,7 +2,7 @@
VERSION = 6 VERSION = 6
PATCHLEVEL = 10 PATCHLEVEL = 10
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc2 EXTRAVERSION = -rc7
NAME = Baby Opossum Posse NAME = Baby Opossum Posse
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -85,7 +85,7 @@
}; };
}; };
panel { panel_dpi: panel {
compatible = "sii,43wvf1g"; compatible = "sii,43wvf1g";
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_display_power>; pinctrl-0 = <&pinctrl_display_power>;

View File

@ -10,8 +10,6 @@
/plugin/; /plugin/;
&{/} { &{/} {
/delete-node/ panel;
hdmi: connector-hdmi { hdmi: connector-hdmi {
compatible = "hdmi-connector"; compatible = "hdmi-connector";
label = "hdmi"; label = "hdmi";
@ -82,6 +80,10 @@
}; };
}; };
&panel_dpi {
status = "disabled";
};
&tve { &tve {
status = "disabled"; status = "disabled";
}; };

View File

@ -128,6 +128,7 @@
pinctrl-0 = <&hdmii2c_xfer>, <&hdmi_hpd>; pinctrl-0 = <&hdmii2c_xfer>, <&hdmi_hpd>;
power-domains = <&power RK3066_PD_VIO>; power-domains = <&power RK3066_PD_VIO>;
rockchip,grf = <&grf>; rockchip,grf = <&grf>;
#sound-dai-cells = <0>;
status = "disabled"; status = "disabled";
ports { ports {

View File

@ -14,6 +14,7 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/uaccess.h>
#ifdef CONFIG_EFI #ifdef CONFIG_EFI
void efi_init(void); void efi_init(void);
@ -25,6 +26,18 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md, boo
#define arch_efi_call_virt_setup() efi_virtmap_load() #define arch_efi_call_virt_setup() efi_virtmap_load()
#define arch_efi_call_virt_teardown() efi_virtmap_unload() #define arch_efi_call_virt_teardown() efi_virtmap_unload()
#ifdef CONFIG_CPU_TTBR0_PAN
#undef arch_efi_call_virt
#define arch_efi_call_virt(p, f, args...) ({ \
unsigned int flags = uaccess_save_and_enable(); \
efi_status_t res = _Generic((p)->f(args), \
efi_status_t: (p)->f(args), \
default: ((p)->f(args), EFI_ABORTED)); \
uaccess_restore(flags); \
res; \
})
#endif
#define ARCH_EFI_IRQ_FLAGS_MASK \ #define ARCH_EFI_IRQ_FLAGS_MASK \
(PSR_J_BIT | PSR_E_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT | \ (PSR_J_BIT | PSR_E_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT | \
PSR_T_BIT | MODE_MASK) PSR_T_BIT | MODE_MASK)

View File

@ -232,11 +232,24 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
unsigned long old; unsigned long old;
if (unlikely(atomic_read(&current->tracing_graph_pause))) if (unlikely(atomic_read(&current->tracing_graph_pause)))
err_out:
return; return;
if (IS_ENABLED(CONFIG_UNWINDER_FRAME_POINTER)) { if (IS_ENABLED(CONFIG_UNWINDER_FRAME_POINTER)) {
/* FP points one word below parent's top of stack */ /*
frame_pointer += 4; * Usually, the stack frames are contiguous in memory but cases
* have been observed where the next stack frame does not live
* at 'frame_pointer + 4' as this code used to assume.
*
* Instead, dereference the field in the stack frame that
* stores the SP of the calling frame: to avoid unbounded
* recursion, this cannot involve any ftrace instrumented
* functions, so use the __get_kernel_nofault() primitive
* directly.
*/
__get_kernel_nofault(&frame_pointer,
(unsigned long *)(frame_pointer - 8),
unsigned long, err_out);
} else { } else {
struct stackframe frame = { struct stackframe frame = {
.fp = frame_pointer, .fp = frame_pointer,

View File

@ -6,6 +6,7 @@
#include <dt-bindings/phy/phy-imx8-pcie.h> #include <dt-bindings/phy/phy-imx8-pcie.h>
#include <dt-bindings/pwm/pwm.h> #include <dt-bindings/pwm/pwm.h>
#include "imx8mm.dtsi" #include "imx8mm.dtsi"
#include "imx8mm-overdrive.dtsi"
/ { / {
chosen { chosen {
@ -935,7 +936,7 @@
/* Verdin GPIO_9_DSI (pulled-up as active-low) */ /* Verdin GPIO_9_DSI (pulled-up as active-low) */
pinctrl_gpio_9_dsi: gpio9dsigrp { pinctrl_gpio_9_dsi: gpio9dsigrp {
fsl,pins = fsl,pins =
<MX8MM_IOMUXC_NAND_RE_B_GPIO3_IO15 0x146>; /* SODIMM 17 */ <MX8MM_IOMUXC_NAND_RE_B_GPIO3_IO15 0x1c6>; /* SODIMM 17 */
}; };
/* Verdin GPIO_10_DSI (pulled-up as active-low) */ /* Verdin GPIO_10_DSI (pulled-up as active-low) */

View File

@ -254,7 +254,7 @@
<&clk IMX8MP_CLK_CLKOUT2>, <&clk IMX8MP_CLK_CLKOUT2>,
<&clk IMX8MP_AUDIO_PLL2_OUT>; <&clk IMX8MP_AUDIO_PLL2_OUT>;
assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL2_OUT>; assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL2_OUT>;
assigned-clock-rates = <13000000>, <13000000>, <156000000>; assigned-clock-rates = <13000000>, <13000000>, <208000000>;
reset-gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>; reset-gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>;
status = "disabled"; status = "disabled";

View File

@ -219,7 +219,7 @@
bluetooth { bluetooth {
compatible = "brcm,bcm4330-bt"; compatible = "brcm,bcm4330-bt";
shutdown-gpios = <&gpio4 16 GPIO_ACTIVE_HIGH>; shutdown-gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
}; };
}; };

View File

@ -36,7 +36,7 @@
regulator-name = "SD1_SPWR"; regulator-name = "SD1_SPWR";
regulator-min-microvolt = <3000000>; regulator-min-microvolt = <3000000>;
regulator-max-microvolt = <3000000>; regulator-max-microvolt = <3000000>;
gpio = <&lsio_gpio4 19 GPIO_ACTIVE_HIGH>; gpio = <&lsio_gpio4 7 GPIO_ACTIVE_HIGH>;
enable-active-high; enable-active-high;
}; };

View File

@ -296,7 +296,6 @@
vmmc-supply = <&reg_usdhc2_vmmc>; vmmc-supply = <&reg_usdhc2_vmmc>;
bus-width = <4>; bus-width = <4>;
status = "okay"; status = "okay";
no-sdio;
no-mmc; no-mmc;
}; };

View File

@ -5,6 +5,8 @@
*/ */
/dts-v1/; /dts-v1/;
#include <dt-bindings/leds/common.h>
#include "rk3308.dtsi" #include "rk3308.dtsi"
/ { / {
@ -24,17 +26,21 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&green_led_gio>, <&heartbeat_led_gpio>; pinctrl-0 = <&green_led>, <&heartbeat_led>;
green-led { green-led {
color = <LED_COLOR_ID_GREEN>;
default-state = "on"; default-state = "on";
function = LED_FUNCTION_POWER;
gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
label = "rockpis:green:power"; label = "rockpis:green:power";
linux,default-trigger = "default-on"; linux,default-trigger = "default-on";
}; };
blue-led { blue-led {
color = <LED_COLOR_ID_BLUE>;
default-state = "on"; default-state = "on";
function = LED_FUNCTION_HEARTBEAT;
gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>; gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
label = "rockpis:blue:user"; label = "rockpis:blue:user";
linux,default-trigger = "heartbeat"; linux,default-trigger = "heartbeat";
@ -126,10 +132,12 @@
}; };
&emmc { &emmc {
bus-width = <4>;
cap-mmc-highspeed; cap-mmc-highspeed;
mmc-hs200-1_8v; cap-sd-highspeed;
no-sdio;
non-removable; non-removable;
pinctrl-names = "default";
pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd>;
vmmc-supply = <&vcc_io>; vmmc-supply = <&vcc_io>;
status = "okay"; status = "okay";
}; };
@ -214,11 +222,11 @@
pinctrl-0 = <&rtc_32k>; pinctrl-0 = <&rtc_32k>;
leds { leds {
green_led_gio: green-led-gpio { green_led: green-led {
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
}; };
heartbeat_led_gpio: heartbeat-led-gpio { heartbeat_led: heartbeat-led {
rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>; rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>;
}; };
}; };

View File

@ -811,7 +811,7 @@
clocks = <&cru SCLK_I2S2_8CH_TX_OUT>, clocks = <&cru SCLK_I2S2_8CH_TX_OUT>,
<&cru SCLK_I2S2_8CH_RX_OUT>, <&cru SCLK_I2S2_8CH_RX_OUT>,
<&cru PCLK_ACODEC>; <&cru PCLK_ACODEC>;
reset-names = "codec-reset"; reset-names = "codec";
resets = <&cru SRST_ACODEC_P>; resets = <&cru SRST_ACODEC_P>;
#sound-dai-cells = <0>; #sound-dai-cells = <0>;
status = "disabled"; status = "disabled";

View File

@ -241,8 +241,8 @@
rk805: pmic@18 { rk805: pmic@18 {
compatible = "rockchip,rk805"; compatible = "rockchip,rk805";
reg = <0x18>; reg = <0x18>;
interrupt-parent = <&gpio2>; interrupt-parent = <&gpio0>;
interrupts = <6 IRQ_TYPE_LEVEL_LOW>; interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
#clock-cells = <1>; #clock-cells = <1>;
clock-output-names = "xin32k", "rk805-clkout2"; clock-output-names = "xin32k", "rk805-clkout2";
gpio-controller; gpio-controller;

View File

@ -793,6 +793,7 @@
dma-names = "tx"; dma-names = "tx";
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&spdif_tx>; pinctrl-0 = <&spdif_tx>;
#sound-dai-cells = <0>;
status = "disabled"; status = "disabled";
}; };
@ -804,6 +805,7 @@
clocks = <&cru SCLK_I2S_2CH>, <&cru HCLK_I2S_2CH>; clocks = <&cru SCLK_I2S_2CH>, <&cru HCLK_I2S_2CH>;
dmas = <&dmac_bus 6>, <&dmac_bus 7>; dmas = <&dmac_bus 6>, <&dmac_bus 7>;
dma-names = "tx", "rx"; dma-names = "tx", "rx";
#sound-dai-cells = <0>;
status = "disabled"; status = "disabled";
}; };
@ -817,6 +819,7 @@
dma-names = "tx", "rx"; dma-names = "tx", "rx";
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&i2s_8ch_bus>; pinctrl-0 = <&i2s_8ch_bus>;
#sound-dai-cells = <0>;
status = "disabled"; status = "disabled";
}; };

View File

@ -450,7 +450,7 @@ ap_i2c_audio: &i2c8 {
dlg,btn-cfg = <50>; dlg,btn-cfg = <50>;
dlg,mic-det-thr = <500>; dlg,mic-det-thr = <500>;
dlg,jack-ins-deb = <20>; dlg,jack-ins-deb = <20>;
dlg,jack-det-rate = "32ms_64ms"; dlg,jack-det-rate = "32_64";
dlg,jack-rem-deb = <1>; dlg,jack-rem-deb = <1>;
dlg,a-d-btn-thr = <0xa>; dlg,a-d-btn-thr = <0xa>;

View File

@ -289,7 +289,7 @@
regulator-name = "vdd_gpu"; regulator-name = "vdd_gpu";
regulator-always-on; regulator-always-on;
regulator-boot-on; regulator-boot-on;
regulator-min-microvolt = <900000>; regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1350000>; regulator-max-microvolt = <1350000>;
regulator-ramp-delay = <6001>; regulator-ramp-delay = <6001>;

View File

@ -444,6 +444,7 @@
&sdmmc { &sdmmc {
bus-width = <4>; bus-width = <4>;
cap-sd-highspeed; cap-sd-highspeed;
cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
disable-wp; disable-wp;
max-frequency = <150000000>; max-frequency = <150000000>;
no-sdio; no-sdio;

View File

@ -435,6 +435,7 @@
&sdmmc { &sdmmc {
bus-width = <4>; bus-width = <4>;
cap-sd-highspeed; cap-sd-highspeed;
cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
disable-wp; disable-wp;
max-frequency = <150000000>; max-frequency = <150000000>;
no-sdio; no-sdio;

View File

@ -383,6 +383,7 @@
bus-width = <4>; bus-width = <4>;
cap-mmc-highspeed; cap-mmc-highspeed;
cap-sd-highspeed; cap-sd-highspeed;
cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
disable-wp; disable-wp;
sd-uhs-sdr104; sd-uhs-sdr104;
vmmc-supply = <&vcc_3v3_s3>; vmmc-supply = <&vcc_3v3_s3>;

View File

@ -344,6 +344,11 @@
}; };
}; };
&pwm0 {
pinctrl-0 = <&pwm0m1_pins>;
pinctrl-names = "default";
};
&saradc { &saradc {
vref-supply = <&vcc_1v8_s0>; vref-supply = <&vcc_1v8_s0>;
status = "okay"; status = "okay";

View File

@ -288,9 +288,9 @@
pinctrl-0 = <&i2c7m0_xfer>; pinctrl-0 = <&i2c7m0_xfer>;
status = "okay"; status = "okay";
es8316: audio-codec@11 { es8316: audio-codec@10 {
compatible = "everest,es8316"; compatible = "everest,es8316";
reg = <0x11>; reg = <0x10>;
assigned-clocks = <&cru I2S0_8CH_MCLKOUT>; assigned-clocks = <&cru I2S0_8CH_MCLKOUT>;
assigned-clock-rates = <12288000>; assigned-clock-rates = <12288000>;
clocks = <&cru I2S0_8CH_MCLKOUT>; clocks = <&cru I2S0_8CH_MCLKOUT>;

View File

@ -366,6 +366,7 @@
bus-width = <4>; bus-width = <4>;
cap-mmc-highspeed; cap-mmc-highspeed;
cap-sd-highspeed; cap-sd-highspeed;
cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
disable-wp; disable-wp;
max-frequency = <150000000>; max-frequency = <150000000>;
no-sdio; no-sdio;
@ -393,6 +394,7 @@
pinctrl-0 = <&pmic_pins>, <&rk806_dvs1_null>, pinctrl-0 = <&pmic_pins>, <&rk806_dvs1_null>,
<&rk806_dvs2_null>, <&rk806_dvs3_null>; <&rk806_dvs2_null>, <&rk806_dvs3_null>;
spi-max-frequency = <1000000>; spi-max-frequency = <1000000>;
system-power-controller;
vcc1-supply = <&vcc5v0_sys>; vcc1-supply = <&vcc5v0_sys>;
vcc2-supply = <&vcc5v0_sys>; vcc2-supply = <&vcc5v0_sys>;

View File

@ -153,8 +153,9 @@ extern void __memset_io(volatile void __iomem *, int, size_t);
* emit the large TLP from the CPU. * emit the large TLP from the CPU.
*/ */
static inline void __const_memcpy_toio_aligned32(volatile u32 __iomem *to, static __always_inline void
const u32 *from, size_t count) __const_memcpy_toio_aligned32(volatile u32 __iomem *to, const u32 *from,
size_t count)
{ {
switch (count) { switch (count) {
case 8: case 8:
@ -196,24 +197,22 @@ static inline void __const_memcpy_toio_aligned32(volatile u32 __iomem *to,
void __iowrite32_copy_full(void __iomem *to, const void *from, size_t count); void __iowrite32_copy_full(void __iomem *to, const void *from, size_t count);
static inline void __const_iowrite32_copy(void __iomem *to, const void *from, static __always_inline void
size_t count) __iowrite32_copy(void __iomem *to, const void *from, size_t count)
{ {
if (count == 8 || count == 4 || count == 2 || count == 1) { if (__builtin_constant_p(count) &&
(count == 8 || count == 4 || count == 2 || count == 1)) {
__const_memcpy_toio_aligned32(to, from, count); __const_memcpy_toio_aligned32(to, from, count);
dgh(); dgh();
} else { } else {
__iowrite32_copy_full(to, from, count); __iowrite32_copy_full(to, from, count);
} }
} }
#define __iowrite32_copy __iowrite32_copy
#define __iowrite32_copy(to, from, count) \ static __always_inline void
(__builtin_constant_p(count) ? \ __const_memcpy_toio_aligned64(volatile u64 __iomem *to, const u64 *from,
__const_iowrite32_copy(to, from, count) : \ size_t count)
__iowrite32_copy_full(to, from, count))
static inline void __const_memcpy_toio_aligned64(volatile u64 __iomem *to,
const u64 *from, size_t count)
{ {
switch (count) { switch (count) {
case 8: case 8:
@ -255,21 +254,18 @@ static inline void __const_memcpy_toio_aligned64(volatile u64 __iomem *to,
void __iowrite64_copy_full(void __iomem *to, const void *from, size_t count); void __iowrite64_copy_full(void __iomem *to, const void *from, size_t count);
static inline void __const_iowrite64_copy(void __iomem *to, const void *from, static __always_inline void
size_t count) __iowrite64_copy(void __iomem *to, const void *from, size_t count)
{ {
if (count == 8 || count == 4 || count == 2 || count == 1) { if (__builtin_constant_p(count) &&
(count == 8 || count == 4 || count == 2 || count == 1)) {
__const_memcpy_toio_aligned64(to, from, count); __const_memcpy_toio_aligned64(to, from, count);
dgh(); dgh();
} else { } else {
__iowrite64_copy_full(to, from, count); __iowrite64_copy_full(to, from, count);
} }
} }
#define __iowrite64_copy __iowrite64_copy
#define __iowrite64_copy(to, from, count) \
(__builtin_constant_p(count) ? \
__const_iowrite64_copy(to, from, count) : \
__iowrite64_copy_full(to, from, count))
/* /*
* I/O memory mapping functions. * I/O memory mapping functions.

View File

@ -170,6 +170,7 @@
#define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */ #define PTE_CONT (_AT(pteval_t, 1) << 52) /* Contiguous range */
#define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */ #define PTE_PXN (_AT(pteval_t, 1) << 53) /* Privileged XN */
#define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */ #define PTE_UXN (_AT(pteval_t, 1) << 54) /* User XN */
#define PTE_SWBITS_MASK _AT(pteval_t, (BIT(63) | GENMASK(58, 55)))
#define PTE_ADDR_LOW (((_AT(pteval_t, 1) << (50 - PAGE_SHIFT)) - 1) << PAGE_SHIFT) #define PTE_ADDR_LOW (((_AT(pteval_t, 1) << (50 - PAGE_SHIFT)) - 1) << PAGE_SHIFT)
#ifdef CONFIG_ARM64_PA_BITS_52 #ifdef CONFIG_ARM64_PA_BITS_52

View File

@ -840,7 +840,7 @@ __SYSCALL(__NR_pselect6_time64, compat_sys_pselect6_time64)
#define __NR_ppoll_time64 414 #define __NR_ppoll_time64 414
__SYSCALL(__NR_ppoll_time64, compat_sys_ppoll_time64) __SYSCALL(__NR_ppoll_time64, compat_sys_ppoll_time64)
#define __NR_io_pgetevents_time64 416 #define __NR_io_pgetevents_time64 416
__SYSCALL(__NR_io_pgetevents_time64, sys_io_pgetevents) __SYSCALL(__NR_io_pgetevents_time64, compat_sys_io_pgetevents_time64)
#define __NR_recvmmsg_time64 417 #define __NR_recvmmsg_time64 417
__SYSCALL(__NR_recvmmsg_time64, compat_sys_recvmmsg_time64) __SYSCALL(__NR_recvmmsg_time64, compat_sys_recvmmsg_time64)
#define __NR_mq_timedsend_time64 418 #define __NR_mq_timedsend_time64 418

View File

@ -462,6 +462,9 @@ static int run_all_insn_set_hw_mode(unsigned int cpu)
for (int i = 0; i < ARRAY_SIZE(insn_emulations); i++) { for (int i = 0; i < ARRAY_SIZE(insn_emulations); i++) {
struct insn_emulation *insn = insn_emulations[i]; struct insn_emulation *insn = insn_emulations[i];
bool enable = READ_ONCE(insn->current_mode) == INSN_HW; bool enable = READ_ONCE(insn->current_mode) == INSN_HW;
if (insn->status == INSN_UNAVAILABLE)
continue;
if (insn->set_hw_mode && insn->set_hw_mode(enable)) { if (insn->set_hw_mode && insn->set_hw_mode(enable)) {
pr_warn("CPU[%u] cannot support the emulation of %s", pr_warn("CPU[%u] cannot support the emulation of %s",
cpu, insn->name); cpu, insn->name);

View File

@ -9,6 +9,7 @@
#include <linux/efi.h> #include <linux/efi.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kmemleak.h>
#include <linux/screen_info.h> #include <linux/screen_info.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
@ -213,6 +214,7 @@ l: if (!p) {
return -ENOMEM; return -ENOMEM;
} }
kmemleak_not_leak(p);
efi_rt_stack_top = p + THREAD_SIZE; efi_rt_stack_top = p + THREAD_SIZE;
return 0; return 0;
} }

View File

@ -173,7 +173,7 @@ static void __init remap_idmap_for_lpa2(void)
* Don't bother with the FDT, we no longer need it after this. * Don't bother with the FDT, we no longer need it after this.
*/ */
memset(init_idmap_pg_dir, 0, memset(init_idmap_pg_dir, 0,
(u64)init_idmap_pg_dir - (u64)init_idmap_pg_end); (u64)init_idmap_pg_end - (u64)init_idmap_pg_dir);
create_init_idmap(init_idmap_pg_dir, mask); create_init_idmap(init_idmap_pg_dir, mask);
dsb(ishst); dsb(ishst);

View File

@ -53,17 +53,15 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
syscall_set_return_value(current, regs, 0, ret); syscall_set_return_value(current, regs, 0, ret);
/* /*
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(), * This value will get limited by KSTACK_OFFSET_MAX(), which is 10
* but not enough for arm64 stack utilization comfort. To keep * bits. The actual entropy will be further reduced by the compiler
* reasonable stack head room, reduce the maximum offset to 9 bits. * when applying stack alignment constraints: the AAPCS mandates a
* 16-byte aligned SP at function boundaries, which will remove the
* 4 low bits from any entropy chosen here.
* *
* The actual entropy will be further reduced by the compiler when * The resulting 6 bits of entropy is seen in SP[9:4].
* applying stack alignment constraints: the AAPCS mandates a
* 16-byte (i.e. 4-bit) aligned SP at function boundaries.
*
* The resulting 5 bits of entropy is seen in SP[8:4].
*/ */
choose_random_kstack_offset(get_random_u16() & 0x1FF); choose_random_kstack_offset(get_random_u16());
} }
static inline bool has_syscall_work(unsigned long flags) static inline bool has_syscall_work(unsigned long flags)

View File

@ -177,6 +177,14 @@ static void ffa_retrieve_req(struct arm_smccc_res *res, u32 len)
res); res);
} }
static void ffa_rx_release(struct arm_smccc_res *res)
{
arm_smccc_1_1_smc(FFA_RX_RELEASE,
0, 0,
0, 0, 0, 0, 0,
res);
}
static void do_ffa_rxtx_map(struct arm_smccc_res *res, static void do_ffa_rxtx_map(struct arm_smccc_res *res,
struct kvm_cpu_context *ctxt) struct kvm_cpu_context *ctxt)
{ {
@ -543,16 +551,19 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *res,
if (WARN_ON(offset > len || if (WARN_ON(offset > len ||
fraglen > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE)) { fraglen > KVM_FFA_MBOX_NR_PAGES * PAGE_SIZE)) {
ret = FFA_RET_ABORTED; ret = FFA_RET_ABORTED;
ffa_rx_release(res);
goto out_unlock; goto out_unlock;
} }
if (len > ffa_desc_buf.len) { if (len > ffa_desc_buf.len) {
ret = FFA_RET_NO_MEMORY; ret = FFA_RET_NO_MEMORY;
ffa_rx_release(res);
goto out_unlock; goto out_unlock;
} }
buf = ffa_desc_buf.buf; buf = ffa_desc_buf.buf;
memcpy(buf, hyp_buffers.rx, fraglen); memcpy(buf, hyp_buffers.rx, fraglen);
ffa_rx_release(res);
for (fragoff = fraglen; fragoff < len; fragoff += fraglen) { for (fragoff = fraglen; fragoff < len; fragoff += fraglen) {
ffa_mem_frag_rx(res, handle_lo, handle_hi, fragoff); ffa_mem_frag_rx(res, handle_lo, handle_hi, fragoff);
@ -563,6 +574,7 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *res,
fraglen = res->a3; fraglen = res->a3;
memcpy((void *)buf + fragoff, hyp_buffers.rx, fraglen); memcpy((void *)buf + fragoff, hyp_buffers.rx, fraglen);
ffa_rx_release(res);
} }
ffa_mem_reclaim(res, handle_lo, handle_hi, flags); ffa_mem_reclaim(res, handle_lo, handle_hi, flags);

View File

@ -391,7 +391,7 @@ static void kvm_vgic_dist_destroy(struct kvm *kvm)
if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) { if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) {
list_for_each_entry_safe(rdreg, next, &dist->rd_regions, list) list_for_each_entry_safe(rdreg, next, &dist->rd_regions, list)
vgic_v3_free_redist_region(rdreg); vgic_v3_free_redist_region(kvm, rdreg);
INIT_LIST_HEAD(&dist->rd_regions); INIT_LIST_HEAD(&dist->rd_regions);
} else { } else {
dist->vgic_cpu_base = VGIC_ADDR_UNDEF; dist->vgic_cpu_base = VGIC_ADDR_UNDEF;

View File

@ -919,8 +919,19 @@ free:
return ret; return ret;
} }
void vgic_v3_free_redist_region(struct vgic_redist_region *rdreg) void vgic_v3_free_redist_region(struct kvm *kvm, struct vgic_redist_region *rdreg)
{ {
struct kvm_vcpu *vcpu;
unsigned long c;
lockdep_assert_held(&kvm->arch.config_lock);
/* Garbage collect the region */
kvm_for_each_vcpu(c, vcpu, kvm) {
if (vcpu->arch.vgic_cpu.rdreg == rdreg)
vcpu->arch.vgic_cpu.rdreg = NULL;
}
list_del(&rdreg->list); list_del(&rdreg->list);
kfree(rdreg); kfree(rdreg);
} }
@ -945,7 +956,7 @@ int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count)
mutex_lock(&kvm->arch.config_lock); mutex_lock(&kvm->arch.config_lock);
rdreg = vgic_v3_rdist_region_from_index(kvm, index); rdreg = vgic_v3_rdist_region_from_index(kvm, index);
vgic_v3_free_redist_region(rdreg); vgic_v3_free_redist_region(kvm, rdreg);
mutex_unlock(&kvm->arch.config_lock); mutex_unlock(&kvm->arch.config_lock);
return ret; return ret;
} }

View File

@ -316,7 +316,7 @@ vgic_v3_rd_region_size(struct kvm *kvm, struct vgic_redist_region *rdreg)
struct vgic_redist_region *vgic_v3_rdist_region_from_index(struct kvm *kvm, struct vgic_redist_region *vgic_v3_rdist_region_from_index(struct kvm *kvm,
u32 index); u32 index);
void vgic_v3_free_redist_region(struct vgic_redist_region *rdreg); void vgic_v3_free_redist_region(struct kvm *kvm, struct vgic_redist_region *rdreg);
bool vgic_v3_rdist_overlap(struct kvm *kvm, gpa_t base, size_t size); bool vgic_v3_rdist_overlap(struct kvm *kvm, gpa_t base, size_t size);

View File

@ -376,7 +376,7 @@ void contpte_clear_young_dirty_ptes(struct vm_area_struct *vma,
* clearing access/dirty for the whole block. * clearing access/dirty for the whole block.
*/ */
unsigned long start = addr; unsigned long start = addr;
unsigned long end = start + nr; unsigned long end = start + nr * PAGE_SIZE;
if (pte_cont(__ptep_get(ptep + nr - 1))) if (pte_cont(__ptep_get(ptep + nr - 1)))
end = ALIGN(end, CONT_PTE_SIZE); end = ALIGN(end, CONT_PTE_SIZE);
@ -386,7 +386,7 @@ void contpte_clear_young_dirty_ptes(struct vm_area_struct *vma,
ptep = contpte_align_down(ptep); ptep = contpte_align_down(ptep);
} }
__clear_young_dirty_ptes(vma, start, ptep, end - start, flags); __clear_young_dirty_ptes(vma, start, ptep, (end - start) / PAGE_SIZE, flags);
} }
EXPORT_SYMBOL_GPL(contpte_clear_young_dirty_ptes); EXPORT_SYMBOL_GPL(contpte_clear_young_dirty_ptes);

View File

@ -124,7 +124,8 @@ bool pgattr_change_is_safe(u64 old, u64 new)
* The following mapping attributes may be updated in live * The following mapping attributes may be updated in live
* kernel mappings without the need for break-before-make. * kernel mappings without the need for break-before-make.
*/ */
pteval_t mask = PTE_PXN | PTE_RDONLY | PTE_WRITE | PTE_NG; pteval_t mask = PTE_PXN | PTE_RDONLY | PTE_WRITE | PTE_NG |
PTE_SWBITS_MASK;
/* creating or taking down mappings is always safe */ /* creating or taking down mappings is always safe */
if (!pte_valid(__pte(old)) || !pte_valid(__pte(new))) if (!pte_valid(__pte(old)) || !pte_valid(__pte(new)))

View File

@ -6,6 +6,7 @@
#define __ARCH_WANT_SYS_CLONE3 #define __ARCH_WANT_SYS_CLONE3
#define __ARCH_WANT_SET_GET_RLIMIT #define __ARCH_WANT_SET_GET_RLIMIT
#define __ARCH_WANT_TIME32_SYSCALLS #define __ARCH_WANT_TIME32_SYSCALLS
#define __ARCH_WANT_SYNC_FILE_RANGE2
#include <asm-generic/unistd.h> #include <asm-generic/unistd.h>
#define __NR_set_thread_area (__NR_arch_specific_syscall + 0) #define __NR_set_thread_area (__NR_arch_specific_syscall + 0)

View File

@ -20,7 +20,7 @@ SYSCALL_DEFINE6(mmap2,
unsigned long, prot, unsigned long, prot,
unsigned long, flags, unsigned long, flags,
unsigned long, fd, unsigned long, fd,
off_t, offset) unsigned long, offset)
{ {
if (unlikely(offset & (~PAGE_MASK >> 12))) if (unlikely(offset & (~PAGE_MASK >> 12)))
return -EINVAL; return -EINVAL;

View File

@ -0,0 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 */
#include <asm-generic/syscalls.h>
asmlinkage long sys_hexagon_fadvise64_64(int fd, int advice,
u32 a2, u32 a3, u32 a4, u32 a5);

View File

@ -36,5 +36,6 @@
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_TIME32_SYSCALLS #define __ARCH_WANT_TIME32_SYSCALLS
#define __ARCH_WANT_SYNC_FILE_RANGE2
#include <asm-generic/unistd.h> #include <asm-generic/unistd.h>

View File

@ -14,6 +14,13 @@
#undef __SYSCALL #undef __SYSCALL
#define __SYSCALL(nr, call) [nr] = (call), #define __SYSCALL(nr, call) [nr] = (call),
SYSCALL_DEFINE6(hexagon_fadvise64_64, int, fd, int, advice,
SC_ARG64(offset), SC_ARG64(len))
{
return ksys_fadvise64_64(fd, SC_VAL64(loff_t, offset), SC_VAL64(loff_t, len), advice);
}
#define sys_fadvise64_64 sys_hexagon_fadvise64_64
void *sys_call_table[__NR_syscalls] = { void *sys_call_table[__NR_syscalls] = {
#include <asm/unistd.h> #include <asm/unistd.h>
}; };

View File

@ -143,7 +143,7 @@ config LOONGARCH
select HAVE_LIVEPATCH select HAVE_LIVEPATCH
select HAVE_MOD_ARCH_SPECIFIC select HAVE_MOD_ARCH_SPECIFIC
select HAVE_NMI select HAVE_NMI
select HAVE_OBJTOOL if AS_HAS_EXPLICIT_RELOCS select HAVE_OBJTOOL if AS_HAS_EXPLICIT_RELOCS && AS_HAS_THIN_ADD_SUB && !CC_IS_CLANG
select HAVE_PCI select HAVE_PCI
select HAVE_PERF_EVENTS select HAVE_PERF_EVENTS
select HAVE_PERF_REGS select HAVE_PERF_REGS
@ -261,6 +261,9 @@ config AS_HAS_EXPLICIT_RELOCS
config AS_HAS_FCSR_CLASS config AS_HAS_FCSR_CLASS
def_bool $(as-instr,movfcsr2gr \$t0$(comma)\$fcsr0) def_bool $(as-instr,movfcsr2gr \$t0$(comma)\$fcsr0)
config AS_HAS_THIN_ADD_SUB
def_bool $(cc-option,-Wa$(comma)-mthin-add-sub)
config AS_HAS_LSX_EXTENSION config AS_HAS_LSX_EXTENSION
def_bool $(as-instr,vld \$vr0$(comma)\$a0$(comma)0) def_bool $(as-instr,vld \$vr0$(comma)\$a0$(comma)0)
@ -646,6 +649,17 @@ config PARAVIRT
over full virtualization. However, when run without a hypervisor over full virtualization. However, when run without a hypervisor
the kernel is theoretically slower and slightly larger. the kernel is theoretically slower and slightly larger.
config PARAVIRT_TIME_ACCOUNTING
bool "Paravirtual steal time accounting"
depends on PARAVIRT
help
Select this option to enable fine granularity task steal time
accounting. Time spent executing other tasks in parallel with
the current vCPU is discounted from the vCPU power. To account for
that, there can be a small performance impact.
If in doubt, say N here.
endmenu endmenu
config ARCH_SELECT_MEMORY_MODEL config ARCH_SELECT_MEMORY_MODEL

View File

@ -28,6 +28,7 @@ config UNWINDER_PROLOGUE
config UNWINDER_ORC config UNWINDER_ORC
bool "ORC unwinder" bool "ORC unwinder"
depends on HAVE_OBJTOOL
select OBJTOOL select OBJTOOL
help help
This option enables the ORC (Oops Rewind Capability) unwinder for This option enables the ORC (Oops Rewind Capability) unwinder for

View File

@ -44,14 +44,14 @@
&gmac0 { &gmac0 {
status = "okay"; status = "okay";
phy-mode = "rgmii"; phy-mode = "rgmii-id";
bus_id = <0x0>; bus_id = <0x0>;
}; };
&gmac1 { &gmac1 {
status = "okay"; status = "okay";
phy-mode = "rgmii"; phy-mode = "rgmii-id";
bus_id = <0x1>; bus_id = <0x1>;
}; };

View File

@ -43,7 +43,7 @@
&gmac0 { &gmac0 {
status = "okay"; status = "okay";
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&phy0>; phy-handle = <&phy0>;
mdio { mdio {
compatible = "snps,dwmac-mdio"; compatible = "snps,dwmac-mdio";
@ -58,7 +58,7 @@
&gmac1 { &gmac1 {
status = "okay"; status = "okay";
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&phy1>; phy-handle = <&phy1>;
mdio { mdio {
compatible = "snps,dwmac-mdio"; compatible = "snps,dwmac-mdio";

View File

@ -92,7 +92,7 @@
&gmac2 { &gmac2 {
status = "okay"; status = "okay";
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&phy2>; phy-handle = <&phy2>;
mdio { mdio {
compatible = "snps,dwmac-mdio"; compatible = "snps,dwmac-mdio";

View File

@ -75,6 +75,8 @@ do { \
#define CSR_MWPC_NUM 0x3f #define CSR_MWPC_NUM 0x3f
#define CTRL_PLV_ENABLE 0x1e #define CTRL_PLV_ENABLE 0x1e
#define CTRL_PLV0_ENABLE 0x02
#define CTRL_PLV3_ENABLE 0x10
#define MWPnCFG3_LoadEn 8 #define MWPnCFG3_LoadEn 8
#define MWPnCFG3_StoreEn 9 #define MWPnCFG3_StoreEn 9
@ -101,7 +103,7 @@ struct perf_event;
struct perf_event_attr; struct perf_event_attr;
extern int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl, extern int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl,
int *gen_len, int *gen_type, int *offset); int *gen_len, int *gen_type);
extern int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw); extern int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw);
extern int hw_breakpoint_arch_parse(struct perf_event *bp, extern int hw_breakpoint_arch_parse(struct perf_event *bp,
const struct perf_event_attr *attr, const struct perf_event_attr *attr,

View File

@ -30,12 +30,17 @@
#define KVM_PRIVATE_MEM_SLOTS 0 #define KVM_PRIVATE_MEM_SLOTS 0
#define KVM_HALT_POLL_NS_DEFAULT 500000 #define KVM_HALT_POLL_NS_DEFAULT 500000
#define KVM_REQ_TLB_FLUSH_GPA KVM_ARCH_REQ(0)
#define KVM_REQ_STEAL_UPDATE KVM_ARCH_REQ(1)
#define KVM_GUESTDBG_SW_BP_MASK \ #define KVM_GUESTDBG_SW_BP_MASK \
(KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP) (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP)
#define KVM_GUESTDBG_VALID_MASK \ #define KVM_GUESTDBG_VALID_MASK \
(KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP | KVM_GUESTDBG_SINGLESTEP) (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP | KVM_GUESTDBG_SINGLESTEP)
#define KVM_DIRTY_LOG_MANUAL_CAPS \
(KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE | KVM_DIRTY_LOG_INITIALLY_SET)
struct kvm_vm_stat { struct kvm_vm_stat {
struct kvm_vm_stat_generic generic; struct kvm_vm_stat_generic generic;
u64 pages; u64 pages;
@ -190,6 +195,7 @@ struct kvm_vcpu_arch {
/* vcpu's vpid */ /* vcpu's vpid */
u64 vpid; u64 vpid;
gpa_t flush_gpa;
/* Frequency of stable timer in Hz */ /* Frequency of stable timer in Hz */
u64 timer_mhz; u64 timer_mhz;
@ -201,6 +207,13 @@ struct kvm_vcpu_arch {
struct kvm_mp_state mp_state; struct kvm_mp_state mp_state;
/* cpucfg */ /* cpucfg */
u32 cpucfg[KVM_MAX_CPUCFG_REGS]; u32 cpucfg[KVM_MAX_CPUCFG_REGS];
/* paravirt steal time */
struct {
u64 guest_addr;
u64 last_steal;
struct gfn_to_hva_cache cache;
} st;
}; };
static inline unsigned long readl_sw_gcsr(struct loongarch_csrs *csr, int reg) static inline unsigned long readl_sw_gcsr(struct loongarch_csrs *csr, int reg)

View File

@ -14,6 +14,7 @@
#define KVM_HCALL_SERVICE HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_SERVICE) #define KVM_HCALL_SERVICE HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_SERVICE)
#define KVM_HCALL_FUNC_IPI 1 #define KVM_HCALL_FUNC_IPI 1
#define KVM_HCALL_FUNC_NOTIFY 2
#define KVM_HCALL_SWDBG HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_SWDBG) #define KVM_HCALL_SWDBG HYPERCALL_ENCODE(HYPERVISOR_KVM, KVM_HCALL_CODE_SWDBG)
@ -24,6 +25,16 @@
#define KVM_HCALL_INVALID_CODE -1UL #define KVM_HCALL_INVALID_CODE -1UL
#define KVM_HCALL_INVALID_PARAMETER -2UL #define KVM_HCALL_INVALID_PARAMETER -2UL
#define KVM_STEAL_PHYS_VALID BIT_ULL(0)
#define KVM_STEAL_PHYS_MASK GENMASK_ULL(63, 6)
struct kvm_steal_time {
__u64 steal;
__u32 version;
__u32 flags;
__u32 pad[12];
};
/* /*
* Hypercall interface for KVM hypervisor * Hypercall interface for KVM hypervisor
* *

View File

@ -120,4 +120,9 @@ static inline void kvm_write_reg(struct kvm_vcpu *vcpu, int num, unsigned long v
vcpu->arch.gprs[num] = val; vcpu->arch.gprs[num] = val;
} }
static inline bool kvm_pvtime_supported(void)
{
return !!sched_info_on();
}
#endif /* __ASM_LOONGARCH_KVM_VCPU_H__ */ #endif /* __ASM_LOONGARCH_KVM_VCPU_H__ */

View File

@ -169,6 +169,7 @@
#define KVM_SIGNATURE "KVM\0" #define KVM_SIGNATURE "KVM\0"
#define CPUCFG_KVM_FEATURE (CPUCFG_KVM_BASE + 4) #define CPUCFG_KVM_FEATURE (CPUCFG_KVM_BASE + 4)
#define KVM_FEATURE_IPI BIT(1) #define KVM_FEATURE_IPI BIT(1)
#define KVM_FEATURE_STEAL_TIME BIT(2)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__

View File

@ -56,6 +56,7 @@ extern int early_cpu_to_node(int cpu);
static inline void early_numa_add_cpu(int cpuid, s16 node) { } static inline void early_numa_add_cpu(int cpuid, s16 node) { }
static inline void numa_add_cpu(unsigned int cpu) { } static inline void numa_add_cpu(unsigned int cpu) { }
static inline void numa_remove_cpu(unsigned int cpu) { } static inline void numa_remove_cpu(unsigned int cpu) { }
static inline void set_cpuid_to_node(int cpuid, s16 node) { }
static inline int early_cpu_to_node(int cpu) static inline int early_cpu_to_node(int cpu)
{ {

View File

@ -18,6 +18,7 @@ static inline u64 paravirt_steal_clock(int cpu)
} }
int __init pv_ipi_init(void); int __init pv_ipi_init(void);
int __init pv_time_init(void);
#else #else
@ -26,5 +27,9 @@ static inline int pv_ipi_init(void)
return 0; return 0;
} }
static inline int pv_time_init(void)
{
return 0;
}
#endif // CONFIG_PARAVIRT #endif // CONFIG_PARAVIRT
#endif #endif

View File

@ -42,7 +42,7 @@
.macro JUMP_VIRT_ADDR temp1 temp2 .macro JUMP_VIRT_ADDR temp1 temp2
li.d \temp1, CACHE_BASE li.d \temp1, CACHE_BASE
pcaddi \temp2, 0 pcaddi \temp2, 0
or \temp1, \temp1, \temp2 bstrins.d \temp1, \temp2, (DMW_PABITS - 1), 0
jirl zero, \temp1, 0xc jirl zero, \temp1, 0xc
.endm .endm

View File

@ -81,7 +81,11 @@ struct kvm_fpu {
#define LOONGARCH_REG_64(TYPE, REG) (TYPE | KVM_REG_SIZE_U64 | (REG << LOONGARCH_REG_SHIFT)) #define LOONGARCH_REG_64(TYPE, REG) (TYPE | KVM_REG_SIZE_U64 | (REG << LOONGARCH_REG_SHIFT))
#define KVM_IOC_CSRID(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CSR, REG) #define KVM_IOC_CSRID(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CSR, REG)
#define KVM_IOC_CPUCFG(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CPUCFG, REG) #define KVM_IOC_CPUCFG(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CPUCFG, REG)
/* Device Control API on vcpu fd */
#define KVM_LOONGARCH_VCPU_CPUCFG 0 #define KVM_LOONGARCH_VCPU_CPUCFG 0
#define KVM_LOONGARCH_VCPU_PVTIME_CTRL 1
#define KVM_LOONGARCH_VCPU_PVTIME_GPA 0
struct kvm_debug_exit_arch { struct kvm_debug_exit_arch {
}; };

View File

@ -22,7 +22,7 @@
_head: _head:
.word MZ_MAGIC /* "MZ", MS-DOS header */ .word MZ_MAGIC /* "MZ", MS-DOS header */
.org 0x8 .org 0x8
.dword kernel_entry /* Kernel entry point */ .dword _kernel_entry /* Kernel entry point (physical address) */
.dword _kernel_asize /* Kernel image effective size */ .dword _kernel_asize /* Kernel image effective size */
.quad PHYS_LINK_KADDR /* Kernel image load offset from start of RAM */ .quad PHYS_LINK_KADDR /* Kernel image load offset from start of RAM */
.org 0x38 /* 0x20 ~ 0x37 reserved */ .org 0x38 /* 0x20 ~ 0x37 reserved */

View File

@ -174,11 +174,21 @@ void flush_ptrace_hw_breakpoint(struct task_struct *tsk)
static int hw_breakpoint_control(struct perf_event *bp, static int hw_breakpoint_control(struct perf_event *bp,
enum hw_breakpoint_ops ops) enum hw_breakpoint_ops ops)
{ {
u32 ctrl; u32 ctrl, privilege;
int i, max_slots, enable; int i, max_slots, enable;
struct pt_regs *regs;
struct perf_event **slots; struct perf_event **slots;
struct arch_hw_breakpoint *info = counter_arch_bp(bp); struct arch_hw_breakpoint *info = counter_arch_bp(bp);
if (arch_check_bp_in_kernelspace(info))
privilege = CTRL_PLV0_ENABLE;
else
privilege = CTRL_PLV3_ENABLE;
/* Whether bp belongs to a task. */
if (bp->hw.target)
regs = task_pt_regs(bp->hw.target);
if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) { if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) {
/* Breakpoint */ /* Breakpoint */
slots = this_cpu_ptr(bp_on_reg); slots = this_cpu_ptr(bp_on_reg);
@ -197,31 +207,38 @@ static int hw_breakpoint_control(struct perf_event *bp,
switch (ops) { switch (ops) {
case HW_BREAKPOINT_INSTALL: case HW_BREAKPOINT_INSTALL:
/* Set the FWPnCFG/MWPnCFG 1~4 register. */ /* Set the FWPnCFG/MWPnCFG 1~4 register. */
write_wb_reg(CSR_CFG_ADDR, i, 0, info->address);
write_wb_reg(CSR_CFG_ADDR, i, 1, info->address);
write_wb_reg(CSR_CFG_MASK, i, 0, info->mask);
write_wb_reg(CSR_CFG_MASK, i, 1, info->mask);
write_wb_reg(CSR_CFG_ASID, i, 0, 0);
write_wb_reg(CSR_CFG_ASID, i, 1, 0);
if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) { if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) {
write_wb_reg(CSR_CFG_CTRL, i, 0, CTRL_PLV_ENABLE); write_wb_reg(CSR_CFG_ADDR, i, 0, info->address);
write_wb_reg(CSR_CFG_MASK, i, 0, info->mask);
write_wb_reg(CSR_CFG_ASID, i, 0, 0);
write_wb_reg(CSR_CFG_CTRL, i, 0, privilege);
} else { } else {
write_wb_reg(CSR_CFG_ADDR, i, 1, info->address);
write_wb_reg(CSR_CFG_MASK, i, 1, info->mask);
write_wb_reg(CSR_CFG_ASID, i, 1, 0);
ctrl = encode_ctrl_reg(info->ctrl); ctrl = encode_ctrl_reg(info->ctrl);
write_wb_reg(CSR_CFG_CTRL, i, 1, ctrl | CTRL_PLV_ENABLE); write_wb_reg(CSR_CFG_CTRL, i, 1, ctrl | privilege);
} }
enable = csr_read64(LOONGARCH_CSR_CRMD); enable = csr_read64(LOONGARCH_CSR_CRMD);
csr_write64(CSR_CRMD_WE | enable, LOONGARCH_CSR_CRMD); csr_write64(CSR_CRMD_WE | enable, LOONGARCH_CSR_CRMD);
if (bp->hw.target)
regs->csr_prmd |= CSR_PRMD_PWE;
break; break;
case HW_BREAKPOINT_UNINSTALL: case HW_BREAKPOINT_UNINSTALL:
/* Reset the FWPnCFG/MWPnCFG 1~4 register. */ /* Reset the FWPnCFG/MWPnCFG 1~4 register. */
write_wb_reg(CSR_CFG_ADDR, i, 0, 0); if (info->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) {
write_wb_reg(CSR_CFG_ADDR, i, 1, 0); write_wb_reg(CSR_CFG_ADDR, i, 0, 0);
write_wb_reg(CSR_CFG_MASK, i, 0, 0); write_wb_reg(CSR_CFG_MASK, i, 0, 0);
write_wb_reg(CSR_CFG_MASK, i, 1, 0); write_wb_reg(CSR_CFG_CTRL, i, 0, 0);
write_wb_reg(CSR_CFG_CTRL, i, 0, 0); write_wb_reg(CSR_CFG_ASID, i, 0, 0);
write_wb_reg(CSR_CFG_CTRL, i, 1, 0); } else {
write_wb_reg(CSR_CFG_ASID, i, 0, 0); write_wb_reg(CSR_CFG_ADDR, i, 1, 0);
write_wb_reg(CSR_CFG_ASID, i, 1, 0); write_wb_reg(CSR_CFG_MASK, i, 1, 0);
write_wb_reg(CSR_CFG_CTRL, i, 1, 0);
write_wb_reg(CSR_CFG_ASID, i, 1, 0);
}
if (bp->hw.target)
regs->csr_prmd &= ~CSR_PRMD_PWE;
break; break;
} }
@ -283,7 +300,7 @@ int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw)
* to generic breakpoint descriptions. * to generic breakpoint descriptions.
*/ */
int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl, int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl,
int *gen_len, int *gen_type, int *offset) int *gen_len, int *gen_type)
{ {
/* Type */ /* Type */
switch (ctrl.type) { switch (ctrl.type) {
@ -303,11 +320,6 @@ int arch_bp_generic_fields(struct arch_hw_breakpoint_ctrl ctrl,
return -EINVAL; return -EINVAL;
} }
if (!ctrl.len)
return -EINVAL;
*offset = __ffs(ctrl.len);
/* Len */ /* Len */
switch (ctrl.len) { switch (ctrl.len) {
case LOONGARCH_BREAKPOINT_LEN_1: case LOONGARCH_BREAKPOINT_LEN_1:
@ -386,21 +398,17 @@ int hw_breakpoint_arch_parse(struct perf_event *bp,
struct arch_hw_breakpoint *hw) struct arch_hw_breakpoint *hw)
{ {
int ret; int ret;
u64 alignment_mask, offset; u64 alignment_mask;
/* Build the arch_hw_breakpoint. */ /* Build the arch_hw_breakpoint. */
ret = arch_build_bp_info(bp, attr, hw); ret = arch_build_bp_info(bp, attr, hw);
if (ret) if (ret)
return ret; return ret;
if (hw->ctrl.type != LOONGARCH_BREAKPOINT_EXECUTE) if (hw->ctrl.type == LOONGARCH_BREAKPOINT_EXECUTE) {
alignment_mask = 0x7;
else
alignment_mask = 0x3; alignment_mask = 0x3;
offset = hw->address & alignment_mask; hw->address &= ~alignment_mask;
}
hw->address &= ~alignment_mask;
hw->ctrl.len <<= offset;
return 0; return 0;
} }
@ -471,12 +479,15 @@ void breakpoint_handler(struct pt_regs *regs)
slots = this_cpu_ptr(bp_on_reg); slots = this_cpu_ptr(bp_on_reg);
for (i = 0; i < boot_cpu_data.watch_ireg_count; ++i) { for (i = 0; i < boot_cpu_data.watch_ireg_count; ++i) {
bp = slots[i]; if ((csr_read32(LOONGARCH_CSR_FWPS) & (0x1 << i))) {
if (bp == NULL) bp = slots[i];
continue; if (bp == NULL)
perf_bp_event(bp, regs); continue;
perf_bp_event(bp, regs);
csr_write32(0x1 << i, LOONGARCH_CSR_FWPS);
update_bp_registers(regs, 0, 0);
}
} }
update_bp_registers(regs, 0, 0);
} }
NOKPROBE_SYMBOL(breakpoint_handler); NOKPROBE_SYMBOL(breakpoint_handler);
@ -488,12 +499,15 @@ void watchpoint_handler(struct pt_regs *regs)
slots = this_cpu_ptr(wp_on_reg); slots = this_cpu_ptr(wp_on_reg);
for (i = 0; i < boot_cpu_data.watch_dreg_count; ++i) { for (i = 0; i < boot_cpu_data.watch_dreg_count; ++i) {
wp = slots[i]; if ((csr_read32(LOONGARCH_CSR_MWPS) & (0x1 << i))) {
if (wp == NULL) wp = slots[i];
continue; if (wp == NULL)
perf_bp_event(wp, regs); continue;
perf_bp_event(wp, regs);
csr_write32(0x1 << i, LOONGARCH_CSR_MWPS);
update_bp_registers(regs, 0, 1);
}
} }
update_bp_registers(regs, 0, 1);
} }
NOKPROBE_SYMBOL(watchpoint_handler); NOKPROBE_SYMBOL(watchpoint_handler);

View File

@ -4,11 +4,14 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/jump_label.h> #include <linux/jump_label.h>
#include <linux/kvm_para.h> #include <linux/kvm_para.h>
#include <linux/reboot.h>
#include <linux/static_call.h> #include <linux/static_call.h>
#include <asm/paravirt.h> #include <asm/paravirt.h>
static int has_steal_clock;
struct static_key paravirt_steal_enabled; struct static_key paravirt_steal_enabled;
struct static_key paravirt_steal_rq_enabled; struct static_key paravirt_steal_rq_enabled;
static DEFINE_PER_CPU(struct kvm_steal_time, steal_time) __aligned(64);
static u64 native_steal_clock(int cpu) static u64 native_steal_clock(int cpu)
{ {
@ -17,6 +20,34 @@ static u64 native_steal_clock(int cpu)
DEFINE_STATIC_CALL(pv_steal_clock, native_steal_clock); DEFINE_STATIC_CALL(pv_steal_clock, native_steal_clock);
static bool steal_acc = true;
static int __init parse_no_stealacc(char *arg)
{
steal_acc = false;
return 0;
}
early_param("no-steal-acc", parse_no_stealacc);
static u64 paravt_steal_clock(int cpu)
{
int version;
u64 steal;
struct kvm_steal_time *src;
src = &per_cpu(steal_time, cpu);
do {
version = src->version;
virt_rmb(); /* Make sure that the version is read before the steal */
steal = src->steal;
virt_rmb(); /* Make sure that the steal is read before the next version */
} while ((version & 1) || (version != src->version));
return steal;
}
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
static void pv_send_ipi_single(int cpu, unsigned int action) static void pv_send_ipi_single(int cpu, unsigned int action)
{ {
@ -149,3 +180,117 @@ int __init pv_ipi_init(void)
return 0; return 0;
} }
static int pv_enable_steal_time(void)
{
int cpu = smp_processor_id();
unsigned long addr;
struct kvm_steal_time *st;
if (!has_steal_clock)
return -EPERM;
st = &per_cpu(steal_time, cpu);
addr = per_cpu_ptr_to_phys(st);
/* The whole structure kvm_steal_time should be in one page */
if (PFN_DOWN(addr) != PFN_DOWN(addr + sizeof(*st))) {
pr_warn("Illegal PV steal time addr %lx\n", addr);
return -EFAULT;
}
addr |= KVM_STEAL_PHYS_VALID;
kvm_hypercall2(KVM_HCALL_FUNC_NOTIFY, KVM_FEATURE_STEAL_TIME, addr);
return 0;
}
static void pv_disable_steal_time(void)
{
if (has_steal_clock)
kvm_hypercall2(KVM_HCALL_FUNC_NOTIFY, KVM_FEATURE_STEAL_TIME, 0);
}
#ifdef CONFIG_SMP
static int pv_time_cpu_online(unsigned int cpu)
{
unsigned long flags;
local_irq_save(flags);
pv_enable_steal_time();
local_irq_restore(flags);
return 0;
}
static int pv_time_cpu_down_prepare(unsigned int cpu)
{
unsigned long flags;
local_irq_save(flags);
pv_disable_steal_time();
local_irq_restore(flags);
return 0;
}
#endif
static void pv_cpu_reboot(void *unused)
{
pv_disable_steal_time();
}
static int pv_reboot_notify(struct notifier_block *nb, unsigned long code, void *unused)
{
on_each_cpu(pv_cpu_reboot, NULL, 1);
return NOTIFY_DONE;
}
static struct notifier_block pv_reboot_nb = {
.notifier_call = pv_reboot_notify,
};
int __init pv_time_init(void)
{
int r, feature;
if (!cpu_has_hypervisor)
return 0;
if (!kvm_para_available())
return 0;
feature = read_cpucfg(CPUCFG_KVM_FEATURE);
if (!(feature & KVM_FEATURE_STEAL_TIME))
return 0;
has_steal_clock = 1;
r = pv_enable_steal_time();
if (r < 0) {
has_steal_clock = 0;
return 0;
}
register_reboot_notifier(&pv_reboot_nb);
#ifdef CONFIG_SMP
r = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
"loongarch/pv_time:online",
pv_time_cpu_online, pv_time_cpu_down_prepare);
if (r < 0) {
has_steal_clock = 0;
pr_err("Failed to install cpu hotplug callbacks\n");
return r;
}
#endif
static_call_update(pv_steal_clock, paravt_steal_clock);
static_key_slow_inc(&paravirt_steal_enabled);
#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING
if (steal_acc)
static_key_slow_inc(&paravirt_steal_rq_enabled);
#endif
pr_info("Using paravirt steal-time\n");
return 0;
}

View File

@ -494,28 +494,14 @@ static int ptrace_hbp_fill_attr_ctrl(unsigned int note_type,
struct arch_hw_breakpoint_ctrl ctrl, struct arch_hw_breakpoint_ctrl ctrl,
struct perf_event_attr *attr) struct perf_event_attr *attr)
{ {
int err, len, type, offset; int err, len, type;
err = arch_bp_generic_fields(ctrl, &len, &type, &offset); err = arch_bp_generic_fields(ctrl, &len, &type);
if (err) if (err)
return err; return err;
switch (note_type) {
case NT_LOONGARCH_HW_BREAK:
if ((type & HW_BREAKPOINT_X) != type)
return -EINVAL;
break;
case NT_LOONGARCH_HW_WATCH:
if ((type & HW_BREAKPOINT_RW) != type)
return -EINVAL;
break;
default:
return -EINVAL;
}
attr->bp_len = len; attr->bp_len = len;
attr->bp_type = type; attr->bp_type = type;
attr->bp_addr += offset;
return 0; return 0;
} }
@ -609,10 +595,27 @@ static int ptrace_hbp_set_ctrl(unsigned int note_type,
return PTR_ERR(bp); return PTR_ERR(bp);
attr = bp->attr; attr = bp->attr;
decode_ctrl_reg(uctrl, &ctrl);
err = ptrace_hbp_fill_attr_ctrl(note_type, ctrl, &attr); switch (note_type) {
if (err) case NT_LOONGARCH_HW_BREAK:
return err; ctrl.type = LOONGARCH_BREAKPOINT_EXECUTE;
ctrl.len = LOONGARCH_BREAKPOINT_LEN_4;
break;
case NT_LOONGARCH_HW_WATCH:
decode_ctrl_reg(uctrl, &ctrl);
break;
default:
return -EINVAL;
}
if (uctrl & CTRL_PLV_ENABLE) {
err = ptrace_hbp_fill_attr_ctrl(note_type, ctrl, &attr);
if (err)
return err;
attr.disabled = 0;
} else {
attr.disabled = 1;
}
return modify_user_hw_breakpoint(bp, &attr); return modify_user_hw_breakpoint(bp, &attr);
} }
@ -643,6 +646,10 @@ static int ptrace_hbp_set_addr(unsigned int note_type,
struct perf_event *bp; struct perf_event *bp;
struct perf_event_attr attr; struct perf_event_attr attr;
/* Kernel-space address cannot be monitored by user-space */
if ((unsigned long)addr >= XKPRANGE)
return -EINVAL;
bp = ptrace_hbp_get_initialised_bp(note_type, tsk, idx); bp = ptrace_hbp_get_initialised_bp(note_type, tsk, idx);
if (IS_ERR(bp)) if (IS_ERR(bp))
return PTR_ERR(bp); return PTR_ERR(bp);

View File

@ -282,7 +282,7 @@ static void __init fdt_setup(void)
return; return;
/* Prefer to use built-in dtb, checking its legality first. */ /* Prefer to use built-in dtb, checking its legality first. */
if (!fdt_check_header(__dtb_start)) if (IS_ENABLED(CONFIG_BUILTIN_DTB) && !fdt_check_header(__dtb_start))
fdt_pointer = __dtb_start; fdt_pointer = __dtb_start;
else else
fdt_pointer = efi_fdt_pointer(); /* Fallback to firmware dtb */ fdt_pointer = efi_fdt_pointer(); /* Fallback to firmware dtb */
@ -351,10 +351,8 @@ void __init platform_init(void)
arch_reserve_vmcore(); arch_reserve_vmcore();
arch_reserve_crashkernel(); arch_reserve_crashkernel();
#ifdef CONFIG_ACPI_TABLE_UPGRADE
acpi_table_upgrade();
#endif
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
acpi_table_upgrade();
acpi_gbl_use_default_register_widths = false; acpi_gbl_use_default_register_widths = false;
acpi_boot_table_init(); acpi_boot_table_init();
#endif #endif

View File

@ -273,7 +273,6 @@ static void __init fdt_smp_setup(void)
if (cpuid == loongson_sysconf.boot_cpu_id) { if (cpuid == loongson_sysconf.boot_cpu_id) {
cpu = 0; cpu = 0;
numa_add_cpu(cpu);
} else { } else {
cpu = cpumask_next_zero(-1, cpu_present_mask); cpu = cpumask_next_zero(-1, cpu_present_mask);
} }
@ -283,6 +282,9 @@ static void __init fdt_smp_setup(void)
set_cpu_present(cpu, true); set_cpu_present(cpu, true);
__cpu_number_map[cpuid] = cpu; __cpu_number_map[cpuid] = cpu;
__cpu_logical_map[cpu] = cpuid; __cpu_logical_map[cpu] = cpuid;
early_numa_add_cpu(cpu, 0);
set_cpuid_to_node(cpuid, 0);
} }
loongson_sysconf.nr_cpus = num_processors; loongson_sysconf.nr_cpus = num_processors;
@ -468,6 +470,7 @@ void smp_prepare_boot_cpu(void)
set_cpu_possible(0, true); set_cpu_possible(0, true);
set_cpu_online(0, true); set_cpu_online(0, true);
set_my_cpu_offset(per_cpu_offset(0)); set_my_cpu_offset(per_cpu_offset(0));
numa_add_cpu(0);
rr_node = first_node(node_online_map); rr_node = first_node(node_online_map);
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {

View File

@ -22,7 +22,7 @@
#define __SYSCALL(nr, call) [nr] = (call), #define __SYSCALL(nr, call) [nr] = (call),
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long, SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long,
prot, unsigned long, flags, unsigned long, fd, off_t, offset) prot, unsigned long, flags, unsigned long, fd, unsigned long, offset)
{ {
if (offset & ~PAGE_MASK) if (offset & ~PAGE_MASK)
return -EINVAL; return -EINVAL;

View File

@ -15,6 +15,7 @@
#include <asm/cpu-features.h> #include <asm/cpu-features.h>
#include <asm/loongarch.h> #include <asm/loongarch.h>
#include <asm/paravirt.h>
#include <asm/time.h> #include <asm/time.h>
u64 cpu_clock_freq; u64 cpu_clock_freq;
@ -214,4 +215,5 @@ void __init time_init(void)
constant_clockevent_init(); constant_clockevent_init();
constant_clocksource_init(); constant_clocksource_init();
pv_time_init();
} }

View File

@ -6,6 +6,7 @@
#define PAGE_SIZE _PAGE_SIZE #define PAGE_SIZE _PAGE_SIZE
#define RO_EXCEPTION_TABLE_ALIGN 4 #define RO_EXCEPTION_TABLE_ALIGN 4
#define PHYSADDR_MASK 0xffffffffffff /* 48-bit */
/* /*
* Put .bss..swapper_pg_dir as the first thing in .bss. This will * Put .bss..swapper_pg_dir as the first thing in .bss. This will
@ -142,10 +143,11 @@ SECTIONS
#ifdef CONFIG_EFI_STUB #ifdef CONFIG_EFI_STUB
/* header symbols */ /* header symbols */
_kernel_asize = _end - _text; _kernel_entry = ABSOLUTE(kernel_entry & PHYSADDR_MASK);
_kernel_fsize = _edata - _text; _kernel_asize = ABSOLUTE(_end - _text);
_kernel_vsize = _end - __initdata_begin; _kernel_fsize = ABSOLUTE(_edata - _text);
_kernel_rsize = _edata - __initdata_begin; _kernel_vsize = ABSOLUTE(_end - __initdata_begin);
_kernel_rsize = ABSOLUTE(_edata - __initdata_begin);
#endif #endif
.gptab.sdata : { .gptab.sdata : {

Some files were not shown because too many files have changed in this diff Show More