forked from luck/tmp_suning_uos_patched
Merge remote-tracking branch 'torvalds/master' into perf/core
Minor conflict in tools/perf/arch/arm/util/auxtrace.c as one fix there was cherry-picked for the last perf/urgent pull req to Linus, so was already there. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
commit
b1aa3db2c1
8
.mailmap
8
.mailmap
|
@ -90,11 +90,16 @@ Frank Rowand <frowand.list@gmail.com> <frank.rowand@sonymobile.com>
|
||||||
Frank Zago <fzago@systemfabricworks.com>
|
Frank Zago <fzago@systemfabricworks.com>
|
||||||
Gao Xiang <xiang@kernel.org> <gaoxiang25@huawei.com>
|
Gao Xiang <xiang@kernel.org> <gaoxiang25@huawei.com>
|
||||||
Gao Xiang <xiang@kernel.org> <hsiangkao@aol.com>
|
Gao Xiang <xiang@kernel.org> <hsiangkao@aol.com>
|
||||||
|
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <gerald.schaefer@de.ibm.com>
|
||||||
|
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <geraldsc@de.ibm.com>
|
||||||
|
Gerald Schaefer <gerald.schaefer@linux.ibm.com> <geraldsc@linux.vnet.ibm.com>
|
||||||
Greg Kroah-Hartman <greg@echidna.(none)>
|
Greg Kroah-Hartman <greg@echidna.(none)>
|
||||||
Greg Kroah-Hartman <gregkh@suse.de>
|
Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
Greg Kroah-Hartman <greg@kroah.com>
|
Greg Kroah-Hartman <greg@kroah.com>
|
||||||
Gregory CLEMENT <gregory.clement@bootlin.com> <gregory.clement@free-electrons.com>
|
Gregory CLEMENT <gregory.clement@bootlin.com> <gregory.clement@free-electrons.com>
|
||||||
Hanjun Guo <guohanjun@huawei.com> <hanjun.guo@linaro.org>
|
Hanjun Guo <guohanjun@huawei.com> <hanjun.guo@linaro.org>
|
||||||
|
Heiko Carstens <hca@linux.ibm.com> <h.carstens@de.ibm.com>
|
||||||
|
Heiko Carstens <hca@linux.ibm.com> <heiko.carstens@de.ibm.com>
|
||||||
Henk Vergonet <Henk.Vergonet@gmail.com>
|
Henk Vergonet <Henk.Vergonet@gmail.com>
|
||||||
Henrik Kretzschmar <henne@nachtwindheim.de>
|
Henrik Kretzschmar <henne@nachtwindheim.de>
|
||||||
Henrik Rydberg <rydberg@bitmath.org>
|
Henrik Rydberg <rydberg@bitmath.org>
|
||||||
|
@ -193,6 +198,9 @@ Maxime Ripard <mripard@kernel.org> <maxime.ripard@free-electrons.com>
|
||||||
Mayuresh Janorkar <mayur@ti.com>
|
Mayuresh Janorkar <mayur@ti.com>
|
||||||
Michael Buesch <m@bues.ch>
|
Michael Buesch <m@bues.ch>
|
||||||
Michel Dänzer <michel@tungstengraphics.com>
|
Michel Dänzer <michel@tungstengraphics.com>
|
||||||
|
Mike Rapoport <rppt@kernel.org> <mike@compulab.co.il>
|
||||||
|
Mike Rapoport <rppt@kernel.org> <mike.rapoport@gmail.com>
|
||||||
|
Mike Rapoport <rppt@kernel.org> <rppt@linux.ibm.com>
|
||||||
Miodrag Dinic <miodrag.dinic@mips.com> <miodrag.dinic@imgtec.com>
|
Miodrag Dinic <miodrag.dinic@mips.com> <miodrag.dinic@imgtec.com>
|
||||||
Miquel Raynal <miquel.raynal@bootlin.com> <miquel.raynal@free-electrons.com>
|
Miquel Raynal <miquel.raynal@bootlin.com> <miquel.raynal@free-electrons.com>
|
||||||
Mitesh shah <mshah@teja.com>
|
Mitesh shah <mshah@teja.com>
|
||||||
|
|
|
@ -16,7 +16,16 @@ Description: Allow the root user to disable/enable in runtime the clock
|
||||||
gating mechanism in Gaudi. Due to how Gaudi is built, the
|
gating mechanism in Gaudi. Due to how Gaudi is built, the
|
||||||
clock gating needs to be disabled in order to access the
|
clock gating needs to be disabled in order to access the
|
||||||
registers of the TPC and MME engines. This is sometimes needed
|
registers of the TPC and MME engines. This is sometimes needed
|
||||||
during debug by the user and hence the user needs this option
|
during debug by the user and hence the user needs this option.
|
||||||
|
The user can supply a bitmask value, each bit represents
|
||||||
|
a different engine to disable/enable its clock gating feature.
|
||||||
|
The bitmask is composed of 20 bits:
|
||||||
|
0 - 7 : DMA channels
|
||||||
|
8 - 11 : MME engines
|
||||||
|
12 - 19 : TPC engines
|
||||||
|
The bit's location of a specific engine can be determined
|
||||||
|
using (1 << GAUDI_ENGINE_ID_*). GAUDI_ENGINE_ID_* values
|
||||||
|
are defined in uapi habanalabs.h file in enum gaudi_engine_id
|
||||||
|
|
||||||
What: /sys/kernel/debug/habanalabs/hl<n>/command_buffers
|
What: /sys/kernel/debug/habanalabs/hl<n>/command_buffers
|
||||||
Date: Jan 2019
|
Date: Jan 2019
|
||||||
|
|
|
@ -258,7 +258,7 @@ Configuring the kernel
|
||||||
Compiling the kernel
|
Compiling the kernel
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
- Make sure you have at least gcc 4.6 available.
|
- Make sure you have at least gcc 4.9 available.
|
||||||
For more information, refer to :ref:`Documentation/process/changes.rst <changes>`.
|
For more information, refer to :ref:`Documentation/process/changes.rst <changes>`.
|
||||||
|
|
||||||
Please note that you can still run a.out user programs with this kernel.
|
Please note that you can still run a.out user programs with this kernel.
|
||||||
|
|
|
@ -171,6 +171,7 @@ infrastructure:
|
||||||
|
|
||||||
|
|
||||||
3) ID_AA64PFR1_EL1 - Processor Feature Register 1
|
3) ID_AA64PFR1_EL1 - Processor Feature Register 1
|
||||||
|
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| Name | bits | visible |
|
| Name | bits | visible |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
|
@ -181,6 +182,7 @@ infrastructure:
|
||||||
|
|
||||||
|
|
||||||
4) MIDR_EL1 - Main ID Register
|
4) MIDR_EL1 - Main ID Register
|
||||||
|
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
| Name | bits | visible |
|
| Name | bits | visible |
|
||||||
+------------------------------+---------+---------+
|
+------------------------------+---------+---------+
|
||||||
|
|
|
@ -492,13 +492,6 @@ set max_budget to higher values than those to which BFQ would have set
|
||||||
it with auto-tuning. An alternative way to achieve this goal is to
|
it with auto-tuning. An alternative way to achieve this goal is to
|
||||||
just increase the value of timeout_sync, leaving max_budget equal to 0.
|
just increase the value of timeout_sync, leaving max_budget equal to 0.
|
||||||
|
|
||||||
weights
|
|
||||||
-------
|
|
||||||
|
|
||||||
Read-only parameter, used to show the weights of the currently active
|
|
||||||
BFQ queues.
|
|
||||||
|
|
||||||
|
|
||||||
4. Group scheduling with BFQ
|
4. Group scheduling with BFQ
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
@ -566,7 +559,7 @@ Parameters to set
|
||||||
For each group, there is only the following parameter to set.
|
For each group, there is only the following parameter to set.
|
||||||
|
|
||||||
weight (namely blkio.bfq.weight or io.bfq-weight): the weight of the
|
weight (namely blkio.bfq.weight or io.bfq-weight): the weight of the
|
||||||
group inside its parent. Available values: 1..10000 (default 100). The
|
group inside its parent. Available values: 1..1000 (default 100). The
|
||||||
linear mapping between ioprio and weights, described at the beginning
|
linear mapping between ioprio and weights, described at the beginning
|
||||||
of the tunable section, is still valid, but all weights higher than
|
of the tunable section, is still valid, but all weights higher than
|
||||||
IOPRIO_BE_NR*10 are mapped to ioprio 0.
|
IOPRIO_BE_NR*10 are mapped to ioprio 0.
|
||||||
|
|
|
@ -204,6 +204,14 @@ Returns the maximum size of a mapping for the device. The size parameter
|
||||||
of the mapping functions like dma_map_single(), dma_map_page() and
|
of the mapping functions like dma_map_single(), dma_map_page() and
|
||||||
others should not be larger than the returned value.
|
others should not be larger than the returned value.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
bool
|
||||||
|
dma_need_sync(struct device *dev, dma_addr_t dma_addr);
|
||||||
|
|
||||||
|
Returns %true if dma_sync_single_for_{device,cpu} calls are required to
|
||||||
|
transfer memory ownership. Returns %false if those calls can be skipped.
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
unsigned long
|
unsigned long
|
||||||
|
|
|
@ -47,6 +47,9 @@ properties:
|
||||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||||
description: Phandle to the device SRAM
|
description: Phandle to the device SRAM
|
||||||
|
|
||||||
|
iommus:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
memory-region:
|
memory-region:
|
||||||
description:
|
description:
|
||||||
CMA pool to use for buffers allocation instead of the default
|
CMA pool to use for buffers allocation instead of the default
|
||||||
|
|
|
@ -378,6 +378,8 @@ examples:
|
||||||
- |
|
- |
|
||||||
sound {
|
sound {
|
||||||
compatible = "simple-audio-card";
|
compatible = "simple-audio-card";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
simple-audio-card,name = "rsnd-ak4643";
|
simple-audio-card,name = "rsnd-ak4643";
|
||||||
simple-audio-card,format = "left_j";
|
simple-audio-card,format = "left_j";
|
||||||
|
@ -391,10 +393,12 @@ examples:
|
||||||
"ak4642 Playback", "DAI1 Playback";
|
"ak4642 Playback", "DAI1 Playback";
|
||||||
|
|
||||||
dpcmcpu: simple-audio-card,cpu@0 {
|
dpcmcpu: simple-audio-card,cpu@0 {
|
||||||
|
reg = <0>;
|
||||||
sound-dai = <&rcar_sound 0>;
|
sound-dai = <&rcar_sound 0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
simple-audio-card,cpu@1 {
|
simple-audio-card,cpu@1 {
|
||||||
|
reg = <1>;
|
||||||
sound-dai = <&rcar_sound 1>;
|
sound-dai = <&rcar_sound 1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -418,6 +422,8 @@ examples:
|
||||||
- |
|
- |
|
||||||
sound {
|
sound {
|
||||||
compatible = "simple-audio-card";
|
compatible = "simple-audio-card";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
simple-audio-card,routing =
|
simple-audio-card,routing =
|
||||||
"pcm3168a Playback", "DAI1 Playback",
|
"pcm3168a Playback", "DAI1 Playback",
|
||||||
|
@ -426,6 +432,7 @@ examples:
|
||||||
"pcm3168a Playback", "DAI4 Playback";
|
"pcm3168a Playback", "DAI4 Playback";
|
||||||
|
|
||||||
simple-audio-card,dai-link@0 {
|
simple-audio-card,dai-link@0 {
|
||||||
|
reg = <0>;
|
||||||
format = "left_j";
|
format = "left_j";
|
||||||
bitclock-master = <&sndcpu0>;
|
bitclock-master = <&sndcpu0>;
|
||||||
frame-master = <&sndcpu0>;
|
frame-master = <&sndcpu0>;
|
||||||
|
@ -439,22 +446,23 @@ examples:
|
||||||
};
|
};
|
||||||
|
|
||||||
simple-audio-card,dai-link@1 {
|
simple-audio-card,dai-link@1 {
|
||||||
|
reg = <1>;
|
||||||
format = "i2s";
|
format = "i2s";
|
||||||
bitclock-master = <&sndcpu1>;
|
bitclock-master = <&sndcpu1>;
|
||||||
frame-master = <&sndcpu1>;
|
frame-master = <&sndcpu1>;
|
||||||
|
|
||||||
convert-channels = <8>; /* TDM Split */
|
convert-channels = <8>; /* TDM Split */
|
||||||
|
|
||||||
sndcpu1: cpu@0 {
|
sndcpu1: cpu0 {
|
||||||
sound-dai = <&rcar_sound 1>;
|
sound-dai = <&rcar_sound 1>;
|
||||||
};
|
};
|
||||||
cpu@1 {
|
cpu1 {
|
||||||
sound-dai = <&rcar_sound 2>;
|
sound-dai = <&rcar_sound 2>;
|
||||||
};
|
};
|
||||||
cpu@2 {
|
cpu2 {
|
||||||
sound-dai = <&rcar_sound 3>;
|
sound-dai = <&rcar_sound 3>;
|
||||||
};
|
};
|
||||||
cpu@3 {
|
cpu3 {
|
||||||
sound-dai = <&rcar_sound 4>;
|
sound-dai = <&rcar_sound 4>;
|
||||||
};
|
};
|
||||||
codec {
|
codec {
|
||||||
|
@ -466,6 +474,7 @@ examples:
|
||||||
};
|
};
|
||||||
|
|
||||||
simple-audio-card,dai-link@2 {
|
simple-audio-card,dai-link@2 {
|
||||||
|
reg = <2>;
|
||||||
format = "i2s";
|
format = "i2s";
|
||||||
bitclock-master = <&sndcpu2>;
|
bitclock-master = <&sndcpu2>;
|
||||||
frame-master = <&sndcpu2>;
|
frame-master = <&sndcpu2>;
|
||||||
|
|
|
@ -23,6 +23,7 @@ PTP hardware clock infrastructure for Linux
|
||||||
+ Ancillary clock features
|
+ Ancillary clock features
|
||||||
- Time stamp external events
|
- Time stamp external events
|
||||||
- Period output signals configurable from user space
|
- Period output signals configurable from user space
|
||||||
|
- Low Pass Filter (LPF) access from user space
|
||||||
- Synchronization of the Linux system time via the PPS subsystem
|
- Synchronization of the Linux system time via the PPS subsystem
|
||||||
|
|
||||||
PTP hardware clock kernel API
|
PTP hardware clock kernel API
|
||||||
|
@ -94,3 +95,14 @@ Supported hardware
|
||||||
|
|
||||||
- Auxiliary Slave/Master Mode Snapshot (optional interrupt)
|
- Auxiliary Slave/Master Mode Snapshot (optional interrupt)
|
||||||
- Target Time (optional interrupt)
|
- Target Time (optional interrupt)
|
||||||
|
|
||||||
|
* Renesas (IDT) ClockMatrix™
|
||||||
|
|
||||||
|
- Up to 4 independent PHC channels
|
||||||
|
- Integrated low pass filter (LPF), access via .adjPhase (compliant to ITU-T G.8273.2)
|
||||||
|
- Programmable output periodic signals
|
||||||
|
- Programmable inputs can time stamp external triggers
|
||||||
|
- Driver and/or hardware configuration through firmware (idtcm.bin)
|
||||||
|
- LPF settings (bandwidth, phase limiting, automatic holdover, physical layer assist (per ITU-T G.8273.2))
|
||||||
|
- Programmable output PTP clocks, any frequency up to 1GHz (to other PHY/MAC time stampers, refclk to ASSPs/SoCs/FPGAs)
|
||||||
|
- Lock to GNSS input, automatic switching between GNSS and user-space PHC control (optional)
|
||||||
|
|
|
@ -560,8 +560,8 @@ When the NFS export feature is enabled, all directory index entries are
|
||||||
verified on mount time to check that upper file handles are not stale.
|
verified on mount time to check that upper file handles are not stale.
|
||||||
This verification may cause significant overhead in some cases.
|
This verification may cause significant overhead in some cases.
|
||||||
|
|
||||||
Note: the mount options index=off,nfs_export=on are conflicting and will
|
Note: the mount options index=off,nfs_export=on are conflicting for a
|
||||||
result in an error.
|
read-write mount and will result in an error.
|
||||||
|
|
||||||
|
|
||||||
Testsuite
|
Testsuite
|
||||||
|
|
|
@ -434,7 +434,7 @@ can set up your network then:
|
||||||
ifconfig arc0 insight
|
ifconfig arc0 insight
|
||||||
route add insight arc0
|
route add insight arc0
|
||||||
route add freedom arc0 /* I would use the subnet here (like I said
|
route add freedom arc0 /* I would use the subnet here (like I said
|
||||||
to to in "single protocol" above),
|
to in "single protocol" above),
|
||||||
but the rest of the subnet
|
but the rest of the subnet
|
||||||
unfortunately lies across the PPP
|
unfortunately lies across the PPP
|
||||||
link on freedom, which confuses
|
link on freedom, which confuses
|
||||||
|
|
|
@ -6,7 +6,7 @@ AX.25
|
||||||
|
|
||||||
To use the amateur radio protocols within Linux you will need to get a
|
To use the amateur radio protocols within Linux you will need to get a
|
||||||
suitable copy of the AX.25 Utilities. More detailed information about
|
suitable copy of the AX.25 Utilities. More detailed information about
|
||||||
AX.25, NET/ROM and ROSE, associated programs and and utilities can be
|
AX.25, NET/ROM and ROSE, associated programs and utilities can be
|
||||||
found on http://www.linux-ax25.org.
|
found on http://www.linux-ax25.org.
|
||||||
|
|
||||||
There is an active mailing list for discussing Linux amateur radio matters
|
There is an active mailing list for discussing Linux amateur radio matters
|
||||||
|
|
|
@ -8,9 +8,8 @@ There are various L3 encapsulation standards using UDP being discussed to
|
||||||
leverage the UDP based load balancing capability of different networks.
|
leverage the UDP based load balancing capability of different networks.
|
||||||
MPLSoUDP (__ https://tools.ietf.org/html/rfc7510) is one among them.
|
MPLSoUDP (__ https://tools.ietf.org/html/rfc7510) is one among them.
|
||||||
|
|
||||||
The Bareudp tunnel module provides a generic L3 encapsulation tunnelling
|
The Bareudp tunnel module provides a generic L3 encapsulation support for
|
||||||
support for tunnelling different L3 protocols like MPLS, IP, NSH etc. inside
|
tunnelling different L3 protocols like MPLS, IP, NSH etc. inside a UDP tunnel.
|
||||||
a UDP tunnel.
|
|
||||||
|
|
||||||
Special Handling
|
Special Handling
|
||||||
----------------
|
----------------
|
||||||
|
@ -26,7 +25,7 @@ Usage
|
||||||
|
|
||||||
1) Device creation & deletion
|
1) Device creation & deletion
|
||||||
|
|
||||||
a) ip link add dev bareudp0 type bareudp dstport 6635 ethertype 0x8847.
|
a) ip link add dev bareudp0 type bareudp dstport 6635 ethertype mpls_uc
|
||||||
|
|
||||||
This creates a bareudp tunnel device which tunnels L3 traffic with ethertype
|
This creates a bareudp tunnel device which tunnels L3 traffic with ethertype
|
||||||
0x8847 (MPLS traffic). The destination port of the UDP header will be set to
|
0x8847 (MPLS traffic). The destination port of the UDP header will be set to
|
||||||
|
@ -34,14 +33,21 @@ Usage
|
||||||
|
|
||||||
b) ip link delete bareudp0
|
b) ip link delete bareudp0
|
||||||
|
|
||||||
2) Device creation with multiple proto mode enabled
|
2) Device creation with multiproto mode enabled
|
||||||
|
|
||||||
There are two ways to create a bareudp device for MPLS & IP with multiproto mode
|
The multiproto mode allows bareudp tunnels to handle several protocols of the
|
||||||
enabled.
|
same family. It is currently only available for IP and MPLS. This mode has to
|
||||||
|
be enabled explicitly with the "multiproto" flag.
|
||||||
|
|
||||||
a) ip link add dev bareudp0 type bareudp dstport 6635 ethertype 0x8847 multiproto
|
a) ip link add dev bareudp0 type bareudp dstport 6635 ethertype ipv4 multiproto
|
||||||
|
|
||||||
b) ip link add dev bareudp0 type bareudp dstport 6635 ethertype mpls
|
For an IPv4 tunnel the multiproto mode allows the tunnel to also handle
|
||||||
|
IPv6.
|
||||||
|
|
||||||
|
b) ip link add dev bareudp0 type bareudp dstport 6635 ethertype mpls_uc multiproto
|
||||||
|
|
||||||
|
For MPLS, the multiproto mode allows the tunnel to handle both unicast
|
||||||
|
and multicast MPLS packets.
|
||||||
|
|
||||||
3) Device Usage
|
3) Device Usage
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,7 @@ UCAN_COMMAND_SET_BITTIMING
|
||||||
|
|
||||||
*Host2Dev; mandatory*
|
*Host2Dev; mandatory*
|
||||||
|
|
||||||
Setup bittiming by sending the the structure
|
Setup bittiming by sending the structure
|
||||||
``ucan_ctl_payload_t.cmd_set_bittiming`` (see ``struct bittiming`` for
|
``ucan_ctl_payload_t.cmd_set_bittiming`` (see ``struct bittiming`` for
|
||||||
details)
|
details)
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ UCAN_IN_TX_COMPLETE
|
||||||
zero
|
zero
|
||||||
|
|
||||||
The CAN device has sent a message to the CAN bus. It answers with a
|
The CAN device has sent a message to the CAN bus. It answers with a
|
||||||
list of of tuples <echo-ids, flags>.
|
list of tuples <echo-ids, flags>.
|
||||||
|
|
||||||
The echo-id identifies the frame from (echos the id from a previous
|
The echo-id identifies the frame from (echos the id from a previous
|
||||||
UCAN_OUT_TX message). The flag indicates the result of the
|
UCAN_OUT_TX message). The flag indicates the result of the
|
||||||
|
|
|
@ -486,6 +486,10 @@ narrow. The description of these groups must be added to the following table:
|
||||||
- Contains packet traps for packets that should be locally delivered after
|
- Contains packet traps for packets that should be locally delivered after
|
||||||
routing, but do not match more specific packet traps (e.g.,
|
routing, but do not match more specific packet traps (e.g.,
|
||||||
``ipv4_bgp``)
|
``ipv4_bgp``)
|
||||||
|
* - ``external_delivery``
|
||||||
|
- Contains packet traps for packets that should be routed through an
|
||||||
|
external interface (e.g., management interface) that does not belong to
|
||||||
|
the same device (e.g., switch ASIC) as the ingress interface
|
||||||
* - ``ipv6``
|
* - ``ipv6``
|
||||||
- Contains packet traps for various IPv6 control packets (e.g., Router
|
- Contains packet traps for various IPv6 control packets (e.g., Router
|
||||||
Advertisements)
|
Advertisements)
|
||||||
|
|
|
@ -95,7 +95,7 @@ Ethernet switch.
|
||||||
Networking stack hooks
|
Networking stack hooks
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
When a master netdev is used with DSA, a small hook is placed in in the
|
When a master netdev is used with DSA, a small hook is placed in the
|
||||||
networking stack is in order to have the DSA subsystem process the Ethernet
|
networking stack is in order to have the DSA subsystem process the Ethernet
|
||||||
switch specific tagging protocol. DSA accomplishes this by registering a
|
switch specific tagging protocol. DSA accomplishes this by registering a
|
||||||
specific (and fake) Ethernet type (later becoming ``skb->protocol``) with the
|
specific (and fake) Ethernet type (later becoming ``skb->protocol``) with the
|
||||||
|
|
|
@ -741,7 +741,7 @@ tcp_fastopen - INTEGER
|
||||||
|
|
||||||
Default: 0x1
|
Default: 0x1
|
||||||
|
|
||||||
Note that that additional client or server features are only
|
Note that additional client or server features are only
|
||||||
effective if the basic support (0x1 and 0x2) are enabled respectively.
|
effective if the basic support (0x1 and 0x2) are enabled respectively.
|
||||||
|
|
||||||
tcp_fastopen_blackhole_timeout_sec - INTEGER
|
tcp_fastopen_blackhole_timeout_sec - INTEGER
|
||||||
|
|
|
@ -114,7 +114,7 @@ drop_entry - INTEGER
|
||||||
modes (when there is no enough available memory, the strategy
|
modes (when there is no enough available memory, the strategy
|
||||||
is enabled and the variable is automatically set to 2,
|
is enabled and the variable is automatically set to 2,
|
||||||
otherwise the strategy is disabled and the variable is set to
|
otherwise the strategy is disabled and the variable is set to
|
||||||
1), and 3 means that that the strategy is always enabled.
|
1), and 3 means that the strategy is always enabled.
|
||||||
|
|
||||||
drop_packet - INTEGER
|
drop_packet - INTEGER
|
||||||
- 0 - disabled (default)
|
- 0 - disabled (default)
|
||||||
|
|
|
@ -186,7 +186,7 @@ About the AF_RXRPC driver:
|
||||||
time [tunable] after the last connection using it discarded, in case a new
|
time [tunable] after the last connection using it discarded, in case a new
|
||||||
connection is made that could use it.
|
connection is made that could use it.
|
||||||
|
|
||||||
(#) A client-side connection is only shared between calls if they have have
|
(#) A client-side connection is only shared between calls if they have
|
||||||
the same key struct describing their security (and assuming the calls
|
the same key struct describing their security (and assuming the calls
|
||||||
would otherwise share the connection). Non-secured calls would also be
|
would otherwise share the connection). Non-secured calls would also be
|
||||||
able to share connections with each other.
|
able to share connections with each other.
|
||||||
|
|
|
@ -213,7 +213,7 @@ request buffers are not in memory. The operating system handles the fault by
|
||||||
updating CSB with the following data:
|
updating CSB with the following data:
|
||||||
|
|
||||||
csb.flags = CSB_V;
|
csb.flags = CSB_V;
|
||||||
csb.cc = CSB_CC_TRANSLATION;
|
csb.cc = CSB_CC_FAULT_ADDRESS;
|
||||||
csb.ce = CSB_CE_TERMINATION;
|
csb.ce = CSB_CE_TERMINATION;
|
||||||
csb.address = fault_address;
|
csb.address = fault_address;
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ you probably needn't concern yourself with pcmciautils.
|
||||||
====================== =============== ========================================
|
====================== =============== ========================================
|
||||||
Program Minimal version Command to check the version
|
Program Minimal version Command to check the version
|
||||||
====================== =============== ========================================
|
====================== =============== ========================================
|
||||||
GNU C 4.8 gcc --version
|
GNU C 4.9 gcc --version
|
||||||
GNU make 3.81 make --version
|
GNU make 3.81 make --version
|
||||||
binutils 2.23 ld -v
|
binutils 2.23 ld -v
|
||||||
flex 2.5.35 flex --version
|
flex 2.5.35 flex --version
|
||||||
|
|
|
@ -319,6 +319,26 @@ If you are afraid to mix up your local variable names, you have another
|
||||||
problem, which is called the function-growth-hormone-imbalance syndrome.
|
problem, which is called the function-growth-hormone-imbalance syndrome.
|
||||||
See chapter 6 (Functions).
|
See chapter 6 (Functions).
|
||||||
|
|
||||||
|
For symbol names and documentation, avoid introducing new usage of
|
||||||
|
'master / slave' (or 'slave' independent of 'master') and 'blacklist /
|
||||||
|
whitelist'.
|
||||||
|
|
||||||
|
Recommended replacements for 'master / slave' are:
|
||||||
|
'{primary,main} / {secondary,replica,subordinate}'
|
||||||
|
'{initiator,requester} / {target,responder}'
|
||||||
|
'{controller,host} / {device,worker,proxy}'
|
||||||
|
'leader / follower'
|
||||||
|
'director / performer'
|
||||||
|
|
||||||
|
Recommended replacements for 'blacklist/whitelist' are:
|
||||||
|
'denylist / allowlist'
|
||||||
|
'blocklist / passlist'
|
||||||
|
|
||||||
|
Exceptions for introducing new usage is to maintain a userspace ABI/API,
|
||||||
|
or when updating code for an existing (as of 2020) hardware or protocol
|
||||||
|
specification that mandates those terms. For new specifications
|
||||||
|
translate specification usage of the terminology to the kernel coding
|
||||||
|
standard where possible.
|
||||||
|
|
||||||
5) Typedefs
|
5) Typedefs
|
||||||
-----------
|
-----------
|
||||||
|
|
|
@ -4339,14 +4339,15 @@ Errors:
|
||||||
#define KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE 0x00000001
|
#define KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE 0x00000001
|
||||||
|
|
||||||
struct kvm_vmx_nested_state_hdr {
|
struct kvm_vmx_nested_state_hdr {
|
||||||
__u32 flags;
|
|
||||||
__u64 vmxon_pa;
|
__u64 vmxon_pa;
|
||||||
__u64 vmcs12_pa;
|
__u64 vmcs12_pa;
|
||||||
__u64 preemption_timer_deadline;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
__u16 flags;
|
__u16 flags;
|
||||||
} smm;
|
} smm;
|
||||||
|
|
||||||
|
__u32 flags;
|
||||||
|
__u64 preemption_timer_deadline;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kvm_vmx_nested_state_data {
|
struct kvm_vmx_nested_state_data {
|
||||||
|
|
44
MAINTAINERS
44
MAINTAINERS
|
@ -782,7 +782,7 @@ F: include/dt-bindings/reset/altr,rst-mgr-a10sr.h
|
||||||
F: include/linux/mfd/altera-a10sr.h
|
F: include/linux/mfd/altera-a10sr.h
|
||||||
|
|
||||||
ALTERA TRIPLE SPEED ETHERNET DRIVER
|
ALTERA TRIPLE SPEED ETHERNET DRIVER
|
||||||
M: Thor Thayer <thor.thayer@linux.intel.com>
|
M: Joyce Ooi <joyce.ooi@intel.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ethernet/altera/
|
F: drivers/net/ethernet/altera/
|
||||||
|
@ -1425,7 +1425,7 @@ F: arch/arm*/include/asm/perf_event.h
|
||||||
F: arch/arm*/kernel/hw_breakpoint.c
|
F: arch/arm*/kernel/hw_breakpoint.c
|
||||||
F: arch/arm*/kernel/perf_*
|
F: arch/arm*/kernel/perf_*
|
||||||
F: arch/arm/oprofile/common.c
|
F: arch/arm/oprofile/common.c
|
||||||
F: drivers/perf/*
|
F: drivers/perf/
|
||||||
F: include/linux/perf/arm_pmu.h
|
F: include/linux/perf/arm_pmu.h
|
||||||
|
|
||||||
ARM PORT
|
ARM PORT
|
||||||
|
@ -2929,6 +2929,7 @@ F: include/uapi/linux/atm*
|
||||||
|
|
||||||
ATMEL MACB ETHERNET DRIVER
|
ATMEL MACB ETHERNET DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
||||||
|
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/cadence/
|
F: drivers/net/ethernet/cadence/
|
||||||
|
|
||||||
|
@ -3306,7 +3307,7 @@ X: arch/riscv/net/bpf_jit_comp32.c
|
||||||
|
|
||||||
BPF JIT for S390
|
BPF JIT for S390
|
||||||
M: Ilya Leoshkevich <iii@linux.ibm.com>
|
M: Ilya Leoshkevich <iii@linux.ibm.com>
|
||||||
M: Heiko Carstens <heiko.carstens@de.ibm.com>
|
M: Heiko Carstens <hca@linux.ibm.com>
|
||||||
M: Vasily Gorbik <gor@linux.ibm.com>
|
M: Vasily Gorbik <gor@linux.ibm.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
|
@ -5021,7 +5022,6 @@ F: drivers/mfd/da91??-*.c
|
||||||
F: drivers/pinctrl/pinctrl-da90??.c
|
F: drivers/pinctrl/pinctrl-da90??.c
|
||||||
F: drivers/power/supply/da9052-battery.c
|
F: drivers/power/supply/da9052-battery.c
|
||||||
F: drivers/power/supply/da91??-*.c
|
F: drivers/power/supply/da91??-*.c
|
||||||
F: drivers/regulator/da903x.c
|
|
||||||
F: drivers/regulator/da9???-regulator.[ch]
|
F: drivers/regulator/da9???-regulator.[ch]
|
||||||
F: drivers/regulator/slg51000-regulator.[ch]
|
F: drivers/regulator/slg51000-regulator.[ch]
|
||||||
F: drivers/rtc/rtc-da90??.c
|
F: drivers/rtc/rtc-da90??.c
|
||||||
|
@ -5111,7 +5111,7 @@ M: Vinod Koul <vkoul@kernel.org>
|
||||||
L: dmaengine@vger.kernel.org
|
L: dmaengine@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
Q: https://patchwork.kernel.org/project/linux-dmaengine/list/
|
Q: https://patchwork.kernel.org/project/linux-dmaengine/list/
|
||||||
T: git git://git.infradead.org/users/vkoul/slave-dma.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine.git
|
||||||
F: Documentation/devicetree/bindings/dma/
|
F: Documentation/devicetree/bindings/dma/
|
||||||
F: Documentation/driver-api/dmaengine/
|
F: Documentation/driver-api/dmaengine/
|
||||||
F: drivers/dma/
|
F: drivers/dma/
|
||||||
|
@ -6956,6 +6956,7 @@ M: Timur Tabi <timur@kernel.org>
|
||||||
M: Nicolin Chen <nicoleotsuka@gmail.com>
|
M: Nicolin Chen <nicoleotsuka@gmail.com>
|
||||||
M: Xiubo Li <Xiubo.Lee@gmail.com>
|
M: Xiubo Li <Xiubo.Lee@gmail.com>
|
||||||
R: Fabio Estevam <festevam@gmail.com>
|
R: Fabio Estevam <festevam@gmail.com>
|
||||||
|
R: Shengjiu Wang <shengjiu.wang@gmail.com>
|
||||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
L: linuxppc-dev@lists.ozlabs.org
|
L: linuxppc-dev@lists.ozlabs.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -9305,6 +9306,17 @@ F: Documentation/kbuild/kconfig*
|
||||||
F: scripts/Kconfig.include
|
F: scripts/Kconfig.include
|
||||||
F: scripts/kconfig/
|
F: scripts/kconfig/
|
||||||
|
|
||||||
|
KCOV
|
||||||
|
R: Dmitry Vyukov <dvyukov@google.com>
|
||||||
|
R: Andrey Konovalov <andreyknvl@google.com>
|
||||||
|
L: kasan-dev@googlegroups.com
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/dev-tools/kcov.rst
|
||||||
|
F: include/linux/kcov.h
|
||||||
|
F: include/uapi/linux/kcov.h
|
||||||
|
F: kernel/kcov.c
|
||||||
|
F: scripts/Makefile.kcov
|
||||||
|
|
||||||
KCSAN
|
KCSAN
|
||||||
M: Marco Elver <elver@google.com>
|
M: Marco Elver <elver@google.com>
|
||||||
R: Dmitry Vyukov <dvyukov@google.com>
|
R: Dmitry Vyukov <dvyukov@google.com>
|
||||||
|
@ -11240,7 +11252,7 @@ S: Maintained
|
||||||
F: drivers/crypto/atmel-ecc.*
|
F: drivers/crypto/atmel-ecc.*
|
||||||
|
|
||||||
MICROCHIP I2C DRIVER
|
MICROCHIP I2C DRIVER
|
||||||
M: Ludovic Desroches <ludovic.desroches@microchip.com>
|
M: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
|
||||||
L: linux-i2c@vger.kernel.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/i2c/busses/i2c-at91-*.c
|
F: drivers/i2c/busses/i2c-at91-*.c
|
||||||
|
@ -11333,17 +11345,17 @@ F: drivers/iio/adc/at91-sama5d2_adc.c
|
||||||
F: include/dt-bindings/iio/adc/at91-sama5d2_adc.h
|
F: include/dt-bindings/iio/adc/at91-sama5d2_adc.h
|
||||||
|
|
||||||
MICROCHIP SAMA5D2-COMPATIBLE SHUTDOWN CONTROLLER
|
MICROCHIP SAMA5D2-COMPATIBLE SHUTDOWN CONTROLLER
|
||||||
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/power/reset/at91-sama5d2_shdwc.c
|
F: drivers/power/reset/at91-sama5d2_shdwc.c
|
||||||
|
|
||||||
MICROCHIP SPI DRIVER
|
MICROCHIP SPI DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
M: Tudor Ambarus <tudor.ambarus@microchip.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/spi/spi-atmel.*
|
F: drivers/spi/spi-atmel.*
|
||||||
|
|
||||||
MICROCHIP SSC DRIVER
|
MICROCHIP SSC DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@microchip.com>
|
M: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/misc/atmel-ssc.c
|
F: drivers/misc/atmel-ssc.c
|
||||||
|
@ -14176,7 +14188,8 @@ F: Documentation/devicetree/bindings/net/qcom,ethqos.txt
|
||||||
F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
|
F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
|
||||||
|
|
||||||
QUALCOMM GENERIC INTERFACE I2C DRIVER
|
QUALCOMM GENERIC INTERFACE I2C DRIVER
|
||||||
M: Alok Chauhan <alokc@codeaurora.org>
|
M: Akash Asthana <akashast@codeaurora.org>
|
||||||
|
M: Mukesh Savaliya <msavaliy@codeaurora.org>
|
||||||
L: linux-i2c@vger.kernel.org
|
L: linux-i2c@vger.kernel.org
|
||||||
L: linux-arm-msm@vger.kernel.org
|
L: linux-arm-msm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -14831,7 +14844,7 @@ S: Maintained
|
||||||
F: drivers/video/fbdev/savage/
|
F: drivers/video/fbdev/savage/
|
||||||
|
|
||||||
S390
|
S390
|
||||||
M: Heiko Carstens <heiko.carstens@de.ibm.com>
|
M: Heiko Carstens <hca@linux.ibm.com>
|
||||||
M: Vasily Gorbik <gor@linux.ibm.com>
|
M: Vasily Gorbik <gor@linux.ibm.com>
|
||||||
M: Christian Borntraeger <borntraeger@de.ibm.com>
|
M: Christian Borntraeger <borntraeger@de.ibm.com>
|
||||||
L: linux-s390@vger.kernel.org
|
L: linux-s390@vger.kernel.org
|
||||||
|
@ -14862,7 +14875,8 @@ F: drivers/s390/block/dasd*
|
||||||
F: include/linux/dasd_mod.h
|
F: include/linux/dasd_mod.h
|
||||||
|
|
||||||
S390 IOMMU (PCI)
|
S390 IOMMU (PCI)
|
||||||
M: Gerald Schaefer <gerald.schaefer@de.ibm.com>
|
M: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||||
|
M: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
|
||||||
L: linux-s390@vger.kernel.org
|
L: linux-s390@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||||
|
@ -14890,7 +14904,7 @@ F: drivers/s390/net/
|
||||||
|
|
||||||
S390 PCI SUBSYSTEM
|
S390 PCI SUBSYSTEM
|
||||||
M: Niklas Schnelle <schnelle@linux.ibm.com>
|
M: Niklas Schnelle <schnelle@linux.ibm.com>
|
||||||
M: Gerald Schaefer <gerald.schaefer@de.ibm.com>
|
M: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
|
||||||
L: linux-s390@vger.kernel.org
|
L: linux-s390@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||||
|
@ -17513,7 +17527,7 @@ F: Documentation/admin-guide/ufs.rst
|
||||||
F: fs/ufs/
|
F: fs/ufs/
|
||||||
|
|
||||||
UHID USERSPACE HID IO DRIVER
|
UHID USERSPACE HID IO DRIVER
|
||||||
M: David Herrmann <dh.herrmann@googlemail.com>
|
M: David Rheinsberg <david.rheinsberg@gmail.com>
|
||||||
L: linux-input@vger.kernel.org
|
L: linux-input@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/hid/uhid.c
|
F: drivers/hid/uhid.c
|
||||||
|
@ -18472,7 +18486,7 @@ S: Maintained
|
||||||
F: drivers/rtc/rtc-sd3078.c
|
F: drivers/rtc/rtc-sd3078.c
|
||||||
|
|
||||||
WIIMOTE HID DRIVER
|
WIIMOTE HID DRIVER
|
||||||
M: David Herrmann <dh.herrmann@googlemail.com>
|
M: David Rheinsberg <david.rheinsberg@gmail.com>
|
||||||
L: linux-input@vger.kernel.org
|
L: linux-input@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/hid/hid-wiimote*
|
F: drivers/hid/hid-wiimote*
|
||||||
|
|
6
Makefile
6
Makefile
|
@ -2,7 +2,7 @@
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 8
|
PATCHLEVEL = 8
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc4
|
EXTRAVERSION =
|
||||||
NAME = Kleptomaniac Octopus
|
NAME = Kleptomaniac Octopus
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -567,7 +567,7 @@ ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
|
||||||
ifneq ($(CROSS_COMPILE),)
|
ifneq ($(CROSS_COMPILE),)
|
||||||
CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
|
CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
|
||||||
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
|
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
|
||||||
CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)
|
CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))
|
||||||
GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
|
GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
|
||||||
endif
|
endif
|
||||||
ifneq ($(GCC_TOOLCHAIN),)
|
ifneq ($(GCC_TOOLCHAIN),)
|
||||||
|
@ -1754,7 +1754,7 @@ PHONY += descend $(build-dirs)
|
||||||
descend: $(build-dirs)
|
descend: $(build-dirs)
|
||||||
$(build-dirs): prepare
|
$(build-dirs): prepare
|
||||||
$(Q)$(MAKE) $(build)=$@ \
|
$(Q)$(MAKE) $(build)=$@ \
|
||||||
single-build=$(if $(filter-out $@/, $(filter $@/%, $(single-no-ko))),1) \
|
single-build=$(if $(filter-out $@/, $(filter $@/%, $(KBUILD_SINGLE_TARGETS))),1) \
|
||||||
need-builtin=1 need-modorder=1
|
need-builtin=1 need-modorder=1
|
||||||
|
|
||||||
clean-dirs := $(addprefix _clean_, $(clean-dirs))
|
clean-dirs := $(addprefix _clean_, $(clean-dirs))
|
||||||
|
|
|
@ -1540,8 +1540,9 @@ target-module@cc000 { /* 0x481cc000, ap 50 46.0 */
|
||||||
reg = <0xcc020 0x4>;
|
reg = <0xcc020 0x4>;
|
||||||
reg-names = "rev";
|
reg-names = "rev";
|
||||||
/* Domains (P, C): per_pwrdm, l4ls_clkdm */
|
/* Domains (P, C): per_pwrdm, l4ls_clkdm */
|
||||||
clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN0_CLKCTRL 0>;
|
clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN0_CLKCTRL 0>,
|
||||||
clock-names = "fck";
|
<&dcan0_fck>;
|
||||||
|
clock-names = "fck", "osc";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
ranges = <0x0 0xcc000 0x2000>;
|
ranges = <0x0 0xcc000 0x2000>;
|
||||||
|
@ -1549,6 +1550,8 @@ target-module@cc000 { /* 0x481cc000, ap 50 46.0 */
|
||||||
dcan0: can@0 {
|
dcan0: can@0 {
|
||||||
compatible = "ti,am4372-d_can", "ti,am3352-d_can";
|
compatible = "ti,am4372-d_can", "ti,am3352-d_can";
|
||||||
reg = <0x0 0x2000>;
|
reg = <0x0 0x2000>;
|
||||||
|
clocks = <&dcan0_fck>;
|
||||||
|
clock-names = "fck";
|
||||||
syscon-raminit = <&scm_conf 0x644 0>;
|
syscon-raminit = <&scm_conf 0x644 0>;
|
||||||
interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -1560,8 +1563,9 @@ target-module@d0000 { /* 0x481d0000, ap 52 3a.0 */
|
||||||
reg = <0xd0020 0x4>;
|
reg = <0xd0020 0x4>;
|
||||||
reg-names = "rev";
|
reg-names = "rev";
|
||||||
/* Domains (P, C): per_pwrdm, l4ls_clkdm */
|
/* Domains (P, C): per_pwrdm, l4ls_clkdm */
|
||||||
clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN1_CLKCTRL 0>;
|
clocks = <&l4ls_clkctrl AM4_L4LS_D_CAN1_CLKCTRL 0>,
|
||||||
clock-names = "fck";
|
<&dcan1_fck>;
|
||||||
|
clock-names = "fck", "osc";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
ranges = <0x0 0xd0000 0x2000>;
|
ranges = <0x0 0xd0000 0x2000>;
|
||||||
|
@ -1569,6 +1573,8 @@ target-module@d0000 { /* 0x481d0000, ap 52 3a.0 */
|
||||||
dcan1: can@0 {
|
dcan1: can@0 {
|
||||||
compatible = "ti,am4372-d_can", "ti,am3352-d_can";
|
compatible = "ti,am4372-d_can", "ti,am3352-d_can";
|
||||||
reg = <0x0 0x2000>;
|
reg = <0x0 0x2000>;
|
||||||
|
clocks = <&dcan1_fck>;
|
||||||
|
clock-name = "fck";
|
||||||
syscon-raminit = <&scm_conf 0x644 1>;
|
syscon-raminit = <&scm_conf 0x644 1>;
|
||||||
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -342,7 +342,8 @@ gateclk: clock-gating-control@18220 {
|
||||||
|
|
||||||
comphy: phy@18300 {
|
comphy: phy@18300 {
|
||||||
compatible = "marvell,armada-380-comphy";
|
compatible = "marvell,armada-380-comphy";
|
||||||
reg = <0x18300 0x100>;
|
reg-names = "comphy", "conf";
|
||||||
|
reg = <0x18300 0x100>, <0x18460 4>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,7 @@ sound-digital {
|
||||||
simple-audio-card,frame-master = <&sound_codec>;
|
simple-audio-card,frame-master = <&sound_codec>;
|
||||||
|
|
||||||
sound_cpu: simple-audio-card,cpu {
|
sound_cpu: simple-audio-card,cpu {
|
||||||
sound-dai = <&ssi2>;
|
sound-dai = <&ssi1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
sound_codec: simple-audio-card,codec {
|
sound_codec: simple-audio-card,codec {
|
||||||
|
|
|
@ -397,7 +397,7 @@ MX6QDL_PAD_SD4_DAT1__PWM3_OUT 0x1b0b1
|
||||||
|
|
||||||
pinctrl_usbotg: usbotggrp {
|
pinctrl_usbotg: usbotggrp {
|
||||||
fsl,pins = <
|
fsl,pins = <
|
||||||
MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x17059
|
MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID 0x17059
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -409,6 +409,7 @@ MX6QDL_PAD_SD1_DAT0__SD1_DATA0 0x17070
|
||||||
MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x17070
|
MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x17070
|
||||||
MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x17070
|
MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x17070
|
||||||
MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x17070
|
MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x17070
|
||||||
|
MX6QDL_PAD_GPIO_1__GPIO1_IO01 0x1b0b0
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ ethphy1: ethernet-phy@1 {
|
||||||
&fec2 {
|
&fec2 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_enet2>;
|
pinctrl-0 = <&pinctrl_enet2>;
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii-id";
|
||||||
phy-handle = <ðphy0>;
|
phy-handle = <ðphy0>;
|
||||||
fsl,magic-packet;
|
fsl,magic-packet;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
|
@ -213,7 +213,7 @@ ethphy2: ethernet-phy@2 {
|
||||||
&fec2 {
|
&fec2 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_enet2>;
|
pinctrl-0 = <&pinctrl_enet2>;
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii-id";
|
||||||
phy-handle = <ðphy2>;
|
phy-handle = <ðphy2>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
|
@ -402,7 +402,7 @@ ethphy0: ethernet-phy@0 {
|
||||||
|
|
||||||
&gbe0 {
|
&gbe0 {
|
||||||
phy-handle = <ðphy0>;
|
phy-handle = <ðphy0>;
|
||||||
phy-mode = "rgmii-id";
|
phy-mode = "rgmii-rxid";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ / {
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
interrupt-parent = <&gic>;
|
interrupt-parent = <&gic>;
|
||||||
|
|
||||||
L2: l2-cache-controller@c4200000 {
|
L2: cache-controller@c4200000 {
|
||||||
compatible = "arm,pl310-cache";
|
compatible = "arm,pl310-cache";
|
||||||
reg = <0xc4200000 0x1000>;
|
reg = <0xc4200000 0x1000>;
|
||||||
cache-unified;
|
cache-unified;
|
||||||
|
|
|
@ -105,6 +105,14 @@ proximity_sensor {
|
||||||
linux,code = <SW_FRONT_PROXIMITY>;
|
linux,code = <SW_FRONT_PROXIMITY>;
|
||||||
linux,can-disable;
|
linux,can-disable;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
machine_cover {
|
||||||
|
label = "Machine Cover";
|
||||||
|
gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; /* 160 */
|
||||||
|
linux,input-type = <EV_SW>;
|
||||||
|
linux,code = <SW_MACHINE_COVER>;
|
||||||
|
linux,can-disable;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
isp1707: isp1707 {
|
isp1707: isp1707 {
|
||||||
|
@ -819,10 +827,6 @@ &mmc1 {
|
||||||
pinctrl-0 = <&mmc1_pins>;
|
pinctrl-0 = <&mmc1_pins>;
|
||||||
vmmc-supply = <&vmmc1>;
|
vmmc-supply = <&vmmc1>;
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
/* For debugging, it is often good idea to remove this GPIO.
|
|
||||||
It means you can remove back cover (to reboot by removing
|
|
||||||
battery) and still use the MMC card. */
|
|
||||||
cd-gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; /* 160 */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* most boards use vaux3, only some old versions use vmmc2 instead */
|
/* most boards use vaux3, only some old versions use vmmc2 instead */
|
||||||
|
|
|
@ -726,7 +726,7 @@ ocram-ecc@ffd08144 {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
L2: l2-cache@fffef000 {
|
L2: cache-controller@fffef000 {
|
||||||
compatible = "arm,pl310-cache";
|
compatible = "arm,pl310-cache";
|
||||||
reg = <0xfffef000 0x1000>;
|
reg = <0xfffef000 0x1000>;
|
||||||
interrupts = <0 38 0x04>;
|
interrupts = <0 38 0x04>;
|
||||||
|
|
|
@ -636,7 +636,7 @@ sdr: sdr@ffcfb100 {
|
||||||
reg = <0xffcfb100 0x80>;
|
reg = <0xffcfb100 0x80>;
|
||||||
};
|
};
|
||||||
|
|
||||||
L2: l2-cache@fffff000 {
|
L2: cache-controller@fffff000 {
|
||||||
compatible = "arm,pl310-cache";
|
compatible = "arm,pl310-cache";
|
||||||
reg = <0xfffff000 0x1000>;
|
reg = <0xfffff000 0x1000>;
|
||||||
interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|
|
@ -198,7 +198,7 @@ reserved-memory {
|
||||||
default-pool {
|
default-pool {
|
||||||
compatible = "shared-dma-pool";
|
compatible = "shared-dma-pool";
|
||||||
size = <0x6000000>;
|
size = <0x6000000>;
|
||||||
alloc-ranges = <0x4a000000 0x6000000>;
|
alloc-ranges = <0x40000000 0x10000000>;
|
||||||
reusable;
|
reusable;
|
||||||
linux,cma-default;
|
linux,cma-default;
|
||||||
};
|
};
|
||||||
|
|
|
@ -117,7 +117,7 @@ reserved-memory {
|
||||||
default-pool {
|
default-pool {
|
||||||
compatible = "shared-dma-pool";
|
compatible = "shared-dma-pool";
|
||||||
size = <0x6000000>;
|
size = <0x6000000>;
|
||||||
alloc-ranges = <0x4a000000 0x6000000>;
|
alloc-ranges = <0x40000000 0x10000000>;
|
||||||
reusable;
|
reusable;
|
||||||
linux,cma-default;
|
linux,cma-default;
|
||||||
};
|
};
|
||||||
|
|
|
@ -181,7 +181,7 @@ reserved-memory {
|
||||||
default-pool {
|
default-pool {
|
||||||
compatible = "shared-dma-pool";
|
compatible = "shared-dma-pool";
|
||||||
size = <0x6000000>;
|
size = <0x6000000>;
|
||||||
alloc-ranges = <0x4a000000 0x6000000>;
|
alloc-ranges = <0x40000000 0x10000000>;
|
||||||
reusable;
|
reusable;
|
||||||
linux,cma-default;
|
linux,cma-default;
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#ifndef _ASM_ARM_PERCPU_H_
|
#ifndef _ASM_ARM_PERCPU_H_
|
||||||
#define _ASM_ARM_PERCPU_H_
|
#define _ASM_ARM_PERCPU_H_
|
||||||
|
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Same as asm-generic/percpu.h, except that we store the per cpu offset
|
* Same as asm-generic/percpu.h, except that we store the per cpu offset
|
||||||
* in the TPIDRPRW. TPIDRPRW only exists on V6K and V7
|
* in the TPIDRPRW. TPIDRPRW only exists on V6K and V7
|
||||||
|
|
|
@ -31,15 +31,6 @@
|
||||||
#if defined(__APCS_26__)
|
#if defined(__APCS_26__)
|
||||||
#error Sorry, your compiler targets APCS-26 but this kernel requires APCS-32
|
#error Sorry, your compiler targets APCS-26 but this kernel requires APCS-32
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* GCC 4.8.0-4.8.2: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58854
|
|
||||||
* miscompiles find_get_entry(), and can result in EXT3 and EXT4
|
|
||||||
* filesystem corruption (possibly other FS too).
|
|
||||||
*/
|
|
||||||
#if defined(GCC_VERSION) && GCC_VERSION >= 40800 && GCC_VERSION < 40803
|
|
||||||
#error Your compiler is too buggy; it is known to miscompile kernels
|
|
||||||
#error and result in filesystem corruption and oopses.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -683,6 +683,12 @@ static void disable_single_step(struct perf_event *bp)
|
||||||
arch_install_hw_breakpoint(bp);
|
arch_install_hw_breakpoint(bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int watchpoint_fault_on_uaccess(struct pt_regs *regs,
|
||||||
|
struct arch_hw_breakpoint *info)
|
||||||
|
{
|
||||||
|
return !user_mode(regs) && info->ctrl.privilege == ARM_BREAKPOINT_USER;
|
||||||
|
}
|
||||||
|
|
||||||
static void watchpoint_handler(unsigned long addr, unsigned int fsr,
|
static void watchpoint_handler(unsigned long addr, unsigned int fsr,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
@ -742,16 +748,27 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr,
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("watchpoint fired: address = 0x%x\n", info->trigger);
|
pr_debug("watchpoint fired: address = 0x%x\n", info->trigger);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we triggered a user watchpoint from a uaccess routine,
|
||||||
|
* then handle the stepping ourselves since userspace really
|
||||||
|
* can't help us with this.
|
||||||
|
*/
|
||||||
|
if (watchpoint_fault_on_uaccess(regs, info))
|
||||||
|
goto step;
|
||||||
|
|
||||||
perf_bp_event(wp, regs);
|
perf_bp_event(wp, regs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If no overflow handler is present, insert a temporary
|
* Defer stepping to the overflow handler if one is installed.
|
||||||
* mismatch breakpoint so we can single-step over the
|
* Otherwise, insert a temporary mismatch breakpoint so that
|
||||||
* watchpoint trigger.
|
* we can single-step over the watchpoint trigger.
|
||||||
*/
|
*/
|
||||||
if (is_default_overflow_handler(wp))
|
if (!is_default_overflow_handler(wp))
|
||||||
enable_single_step(wp, instruction_pointer(regs));
|
goto unlock;
|
||||||
|
|
||||||
|
step:
|
||||||
|
enable_single_step(wp, instruction_pointer(regs));
|
||||||
unlock:
|
unlock:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,6 +184,7 @@ static void __init patch_vdso(void *ehdr)
|
||||||
if (!cntvct_ok) {
|
if (!cntvct_ok) {
|
||||||
vdso_nullpatch_one(&einfo, "__vdso_gettimeofday");
|
vdso_nullpatch_one(&einfo, "__vdso_gettimeofday");
|
||||||
vdso_nullpatch_one(&einfo, "__vdso_clock_gettime");
|
vdso_nullpatch_one(&einfo, "__vdso_clock_gettime");
|
||||||
|
vdso_nullpatch_one(&einfo, "__vdso_clock_gettime64");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -289,6 +289,6 @@ struct platform_device *__init imx_add_spi_imx(
|
||||||
const struct spi_imx_master *pdata);
|
const struct spi_imx_master *pdata);
|
||||||
|
|
||||||
struct platform_device *imx_add_imx_dma(char *name, resource_size_t iobase,
|
struct platform_device *imx_add_imx_dma(char *name, resource_size_t iobase,
|
||||||
int irq, int irq_err);
|
int irq);
|
||||||
struct platform_device *imx_add_imx_sdma(char *name,
|
struct platform_device *imx_add_imx_sdma(char *name,
|
||||||
resource_size_t iobase, int irq, struct sdma_platform_data *pdata);
|
resource_size_t iobase, int irq, struct sdma_platform_data *pdata);
|
||||||
|
|
|
@ -24,7 +24,8 @@ struct platform_device *__init mxc_register_gpio(char *name, int id,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
unsigned int nres;
|
||||||
|
|
||||||
return platform_device_register_resndata(&mxc_aips_bus,
|
nres = irq_high ? ARRAY_SIZE(res) : ARRAY_SIZE(res) - 1;
|
||||||
name, id, res, ARRAY_SIZE(res), NULL, 0);
|
return platform_device_register_resndata(&mxc_aips_bus, name, id, res, nres, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "devices-common.h"
|
#include "devices-common.h"
|
||||||
|
|
||||||
struct platform_device __init __maybe_unused *imx_add_imx_dma(char *name,
|
struct platform_device __init __maybe_unused *imx_add_imx_dma(char *name,
|
||||||
resource_size_t iobase, int irq, int irq_err)
|
resource_size_t iobase, int irq)
|
||||||
{
|
{
|
||||||
struct resource res[] = {
|
struct resource res[] = {
|
||||||
{
|
{
|
||||||
|
@ -17,10 +17,6 @@ struct platform_device __init __maybe_unused *imx_add_imx_dma(char *name,
|
||||||
.start = irq,
|
.start = irq,
|
||||||
.end = irq,
|
.end = irq,
|
||||||
.flags = IORESOURCE_IRQ,
|
.flags = IORESOURCE_IRQ,
|
||||||
}, {
|
|
||||||
.start = irq_err,
|
|
||||||
.end = irq_err,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -78,8 +78,7 @@ void __init imx21_soc_init(void)
|
||||||
mxc_register_gpio("imx21-gpio", 5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
|
mxc_register_gpio("imx21-gpio", 5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
|
||||||
|
|
||||||
pinctrl_provide_dummies();
|
pinctrl_provide_dummies();
|
||||||
imx_add_imx_dma("imx21-dma", MX21_DMA_BASE_ADDR,
|
imx_add_imx_dma("imx21-dma", MX21_DMA_BASE_ADDR, MX21_INT_DMACH0);
|
||||||
MX21_INT_DMACH0, 0); /* No ERR irq */
|
|
||||||
platform_device_register_simple("imx21-audmux", 0, imx21_audmux_res,
|
platform_device_register_simple("imx21-audmux", 0, imx21_audmux_res,
|
||||||
ARRAY_SIZE(imx21_audmux_res));
|
ARRAY_SIZE(imx21_audmux_res));
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,8 +79,7 @@ void __init imx27_soc_init(void)
|
||||||
mxc_register_gpio("imx21-gpio", 5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
|
mxc_register_gpio("imx21-gpio", 5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
|
||||||
|
|
||||||
pinctrl_provide_dummies();
|
pinctrl_provide_dummies();
|
||||||
imx_add_imx_dma("imx27-dma", MX27_DMA_BASE_ADDR,
|
imx_add_imx_dma("imx27-dma", MX27_DMA_BASE_ADDR, MX27_INT_DMACH0);
|
||||||
MX27_INT_DMACH0, 0); /* No ERR irq */
|
|
||||||
/* imx27 has the imx21 type audmux */
|
/* imx27 has the imx21 type audmux */
|
||||||
platform_device_register_simple("imx21-audmux", 0, imx27_audmux_res,
|
platform_device_register_simple("imx21-audmux", 0, imx27_audmux_res,
|
||||||
ARRAY_SIZE(imx27_audmux_res));
|
ARRAY_SIZE(imx27_audmux_res));
|
||||||
|
|
|
@ -3435,7 +3435,7 @@ static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
|
||||||
regs = ioremap(data->module_pa,
|
regs = ioremap(data->module_pa,
|
||||||
data->module_size);
|
data->module_size);
|
||||||
if (!regs)
|
if (!regs)
|
||||||
return -ENOMEM;
|
goto out_free_sysc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3445,13 +3445,13 @@ static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
|
||||||
if (oh->class->name && strcmp(oh->class->name, data->name)) {
|
if (oh->class->name && strcmp(oh->class->name, data->name)) {
|
||||||
class = kmemdup(oh->class, sizeof(*oh->class), GFP_KERNEL);
|
class = kmemdup(oh->class, sizeof(*oh->class), GFP_KERNEL);
|
||||||
if (!class)
|
if (!class)
|
||||||
return -ENOMEM;
|
goto out_unmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list_empty(&oh->slave_ports)) {
|
if (list_empty(&oh->slave_ports)) {
|
||||||
oi = kcalloc(1, sizeof(*oi), GFP_KERNEL);
|
oi = kcalloc(1, sizeof(*oi), GFP_KERNEL);
|
||||||
if (!oi)
|
if (!oi)
|
||||||
return -ENOMEM;
|
goto out_free_class;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note that we assume interconnect interface clocks will be
|
* Note that we assume interconnect interface clocks will be
|
||||||
|
@ -3478,6 +3478,14 @@ static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
|
||||||
spin_unlock_irqrestore(&oh->_lock, flags);
|
spin_unlock_irqrestore(&oh->_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_free_class:
|
||||||
|
kfree(class);
|
||||||
|
out_unmap:
|
||||||
|
iounmap(regs);
|
||||||
|
out_free_sysc:
|
||||||
|
kfree(sysc);
|
||||||
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct omap_hwmod_reset omap24xx_reset_quirks[] = {
|
static const struct omap_hwmod_reset omap24xx_reset_quirks[] = {
|
||||||
|
|
|
@ -966,7 +966,7 @@ void __init create_mapping_late(struct mm_struct *mm, struct map_desc *md,
|
||||||
pud_t *pud;
|
pud_t *pud;
|
||||||
|
|
||||||
p4d = p4d_alloc(mm, pgd_offset(mm, md->virtual), md->virtual);
|
p4d = p4d_alloc(mm, pgd_offset(mm, md->virtual), md->virtual);
|
||||||
if (!WARN_ON(!p4d))
|
if (WARN_ON(!p4d))
|
||||||
return;
|
return;
|
||||||
pud = pud_alloc(mm, p4d, md->virtual);
|
pud = pud_alloc(mm, p4d, md->virtual);
|
||||||
if (WARN_ON(!pud))
|
if (WARN_ON(!pud))
|
||||||
|
|
|
@ -137,7 +137,7 @@ export TEXT_OFFSET
|
||||||
|
|
||||||
core-y += arch/arm64/
|
core-y += arch/arm64/
|
||||||
libs-y := arch/arm64/lib/ $(libs-y)
|
libs-y := arch/arm64/lib/ $(libs-y)
|
||||||
core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
|
libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
|
||||||
|
|
||||||
# Default target when executing plain make
|
# Default target when executing plain make
|
||||||
boot := arch/arm64/boot
|
boot := arch/arm64/boot
|
||||||
|
|
|
@ -161,6 +161,7 @@ video-codec@1c0e000 {
|
||||||
resets = <&ccu RST_BUS_VE>;
|
resets = <&ccu RST_BUS_VE>;
|
||||||
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
allwinner,sram = <&ve_sram 1>;
|
allwinner,sram = <&ve_sram 1>;
|
||||||
|
iommus = <&iommu 3>;
|
||||||
};
|
};
|
||||||
|
|
||||||
gpu: gpu@1800000 {
|
gpu: gpu@1800000 {
|
||||||
|
|
|
@ -77,7 +77,7 @@ psci {
|
||||||
method = "smc";
|
method = "smc";
|
||||||
};
|
};
|
||||||
|
|
||||||
intc: intc@fffc1000 {
|
intc: interrupt-controller@fffc1000 {
|
||||||
compatible = "arm,gic-400", "arm,cortex-a15-gic";
|
compatible = "arm,gic-400", "arm,cortex-a15-gic";
|
||||||
#interrupt-cells = <3>;
|
#interrupt-cells = <3>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
|
@ -302,7 +302,7 @@ mmc: dwmmc0@ff808000 {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
nand: nand@ffb90000 {
|
nand: nand-controller@ffb90000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "altr,socfpga-denali-nand";
|
compatible = "altr,socfpga-denali-nand";
|
||||||
|
@ -445,7 +445,7 @@ timer3: timer3@ffd00100 {
|
||||||
clock-names = "timer";
|
clock-names = "timer";
|
||||||
};
|
};
|
||||||
|
|
||||||
uart0: serial0@ffc02000 {
|
uart0: serial@ffc02000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0xffc02000 0x100>;
|
reg = <0xffc02000 0x100>;
|
||||||
interrupts = <0 108 4>;
|
interrupts = <0 108 4>;
|
||||||
|
@ -456,7 +456,7 @@ uart0: serial0@ffc02000 {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
uart1: serial1@ffc02100 {
|
uart1: serial@ffc02100 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0xffc02100 0x100>;
|
reg = <0xffc02100 0x100>;
|
||||||
interrupts = <0 109 4>;
|
interrupts = <0 109 4>;
|
||||||
|
|
|
@ -155,6 +155,7 @@ rtc@68 {
|
||||||
};
|
};
|
||||||
|
|
||||||
&qspi {
|
&qspi {
|
||||||
|
status = "okay";
|
||||||
flash@0 {
|
flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
|
@ -188,6 +188,7 @@ rtc@68 {
|
||||||
};
|
};
|
||||||
|
|
||||||
&qspi {
|
&qspi {
|
||||||
|
status = "okay";
|
||||||
flash@0 {
|
flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
@ -211,12 +212,12 @@ partitions {
|
||||||
|
|
||||||
qspi_boot: partition@0 {
|
qspi_boot: partition@0 {
|
||||||
label = "Boot and fpga data";
|
label = "Boot and fpga data";
|
||||||
reg = <0x0 0x034B0000>;
|
reg = <0x0 0x03FE0000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
qspi_rootfs: partition@4000000 {
|
qspi_rootfs: partition@3FE0000 {
|
||||||
label = "Root Filesystem - JFFS2";
|
label = "Root Filesystem - JFFS2";
|
||||||
reg = <0x034B0000 0x0EB50000>;
|
reg = <0x03FE0000 0x0C020000>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#include <dt-bindings/input/input.h>
|
#include <dt-bindings/input/input.h>
|
||||||
#include <dt-bindings/sound/meson-aiu.h>
|
#include <dt-bindings/sound/meson-aiu.h>
|
||||||
|
|
||||||
#include "meson-gxl-s905x.dtsi"
|
#include "meson-gxl-s805x.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
compatible = "libretech,aml-s805x-ac", "amlogic,s805x",
|
compatible = "libretech,aml-s805x-ac", "amlogic,s805x",
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
#include <dt-bindings/input/input.h>
|
#include <dt-bindings/input/input.h>
|
||||||
|
|
||||||
#include "meson-gxl-s905x.dtsi"
|
#include "meson-gxl-s805x.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
compatible = "amlogic,p241", "amlogic,s805x", "amlogic,meson-gxl";
|
compatible = "amlogic,p241", "amlogic,s805x", "amlogic,meson-gxl";
|
||||||
|
|
24
arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi
Normal file
24
arch/arm64/boot/dts/amlogic/meson-gxl-s805x.dtsi
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020 BayLibre SAS
|
||||||
|
* Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "meson-gxl-s905x.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "amlogic,s805x", "amlogic,meson-gxl";
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The S805X Package doesn't seem to handle the 744MHz OPP correctly */
|
||||||
|
&mali {
|
||||||
|
assigned-clocks = <&clkc CLKID_MALI_0_SEL>,
|
||||||
|
<&clkc CLKID_MALI_0>,
|
||||||
|
<&clkc CLKID_MALI>; /* Glitch free mux */
|
||||||
|
assigned-clock-parents = <&clkc CLKID_FCLK_DIV3>,
|
||||||
|
<0>, /* Do Nothing */
|
||||||
|
<&clkc CLKID_MALI_0>;
|
||||||
|
assigned-clock-rates = <0>, /* Do Nothing */
|
||||||
|
<666666666>,
|
||||||
|
<0>; /* Do Nothing */
|
||||||
|
};
|
|
@ -337,6 +337,11 @@ clkc: clock-controller {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&hwrng {
|
||||||
|
clocks = <&clkc CLKID_RNG0>;
|
||||||
|
clock-names = "core";
|
||||||
|
};
|
||||||
|
|
||||||
&i2c_A {
|
&i2c_A {
|
||||||
clocks = <&clkc CLKID_I2C>;
|
clocks = <&clkc CLKID_I2C>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -98,6 +98,7 @@ &watchdog0 {
|
||||||
};
|
};
|
||||||
|
|
||||||
&qspi {
|
&qspi {
|
||||||
|
status = "okay";
|
||||||
flash@0 {
|
flash@0 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
|
@ -454,10 +454,7 @@ &cp1_eth2 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
phy-mode = "2500base-x";
|
phy-mode = "2500base-x";
|
||||||
phys = <&cp1_comphy5 2>;
|
phys = <&cp1_comphy5 2>;
|
||||||
fixed-link {
|
managed = "in-band-status";
|
||||||
speed = <2500>;
|
|
||||||
full-duplex;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
&cp1_spi1 {
|
&cp1_spi1 {
|
||||||
|
|
|
@ -194,7 +194,7 @@ CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_ACPI=y
|
CONFIG_HOTPLUG_PCI_ACPI=y
|
||||||
CONFIG_PCI_AARDVARK=y
|
CONFIG_PCI_AARDVARK=y
|
||||||
CONFIG_PCI_TEGRA=y
|
CONFIG_PCI_TEGRA=y
|
||||||
CONFIG_PCIE_RCAR=y
|
CONFIG_PCIE_RCAR_HOST=y
|
||||||
CONFIG_PCI_HOST_GENERIC=y
|
CONFIG_PCI_HOST_GENERIC=y
|
||||||
CONFIG_PCI_XGENE=y
|
CONFIG_PCI_XGENE=y
|
||||||
CONFIG_PCIE_ALTERA=y
|
CONFIG_PCIE_ALTERA=y
|
||||||
|
|
|
@ -77,9 +77,9 @@ static inline void apply_alternatives_module(void *start, size_t length) { }
|
||||||
"663:\n\t" \
|
"663:\n\t" \
|
||||||
newinstr "\n" \
|
newinstr "\n" \
|
||||||
"664:\n\t" \
|
"664:\n\t" \
|
||||||
".previous\n\t" \
|
|
||||||
".org . - (664b-663b) + (662b-661b)\n\t" \
|
".org . - (664b-663b) + (662b-661b)\n\t" \
|
||||||
".org . - (662b-661b) + (664b-663b)\n" \
|
".org . - (662b-661b) + (664b-663b)\n\t" \
|
||||||
|
".previous\n" \
|
||||||
".endif\n"
|
".endif\n"
|
||||||
|
|
||||||
#define __ALTERNATIVE_CFG_CB(oldinstr, feature, cfg_enabled, cb) \
|
#define __ALTERNATIVE_CFG_CB(oldinstr, feature, cfg_enabled, cb) \
|
||||||
|
|
|
@ -58,6 +58,7 @@ struct arch_timer_erratum_workaround {
|
||||||
u64 (*read_cntvct_el0)(void);
|
u64 (*read_cntvct_el0)(void);
|
||||||
int (*set_next_event_phys)(unsigned long, struct clock_event_device *);
|
int (*set_next_event_phys)(unsigned long, struct clock_event_device *);
|
||||||
int (*set_next_event_virt)(unsigned long, struct clock_event_device *);
|
int (*set_next_event_virt)(unsigned long, struct clock_event_device *);
|
||||||
|
bool disable_compat_vdso;
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_PER_CPU(const struct arch_timer_erratum_workaround *,
|
DECLARE_PER_CPU(const struct arch_timer_erratum_workaround *,
|
||||||
|
|
|
@ -24,16 +24,17 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
|
||||||
{
|
{
|
||||||
__uint128_t tmp;
|
__uint128_t tmp;
|
||||||
u64 sum;
|
u64 sum;
|
||||||
|
int n = ihl; /* we want it signed */
|
||||||
|
|
||||||
tmp = *(const __uint128_t *)iph;
|
tmp = *(const __uint128_t *)iph;
|
||||||
iph += 16;
|
iph += 16;
|
||||||
ihl -= 4;
|
n -= 4;
|
||||||
tmp += ((tmp >> 64) | (tmp << 64));
|
tmp += ((tmp >> 64) | (tmp << 64));
|
||||||
sum = tmp >> 64;
|
sum = tmp >> 64;
|
||||||
do {
|
do {
|
||||||
sum += *(const u32 *)iph;
|
sum += *(const u32 *)iph;
|
||||||
iph += 4;
|
iph += 4;
|
||||||
} while (--ihl);
|
} while (--n > 0);
|
||||||
|
|
||||||
sum += ((sum >> 32) | (sum << 32));
|
sum += ((sum >> 32) | (sum << 32));
|
||||||
return csum_fold((__force u32)(sum >> 32));
|
return csum_fold((__force u32)(sum >> 32));
|
||||||
|
|
|
@ -109,6 +109,8 @@ void disable_debug_monitors(enum dbg_active_el el);
|
||||||
|
|
||||||
void user_rewind_single_step(struct task_struct *task);
|
void user_rewind_single_step(struct task_struct *task);
|
||||||
void user_fastforward_single_step(struct task_struct *task);
|
void user_fastforward_single_step(struct task_struct *task);
|
||||||
|
void user_regs_reset_single_step(struct user_pt_regs *regs,
|
||||||
|
struct task_struct *task);
|
||||||
|
|
||||||
void kernel_enable_single_step(struct pt_regs *regs);
|
void kernel_enable_single_step(struct pt_regs *regs);
|
||||||
void kernel_disable_single_step(void);
|
void kernel_disable_single_step(void);
|
||||||
|
|
|
@ -380,9 +380,14 @@ struct kvm_vcpu_arch {
|
||||||
#define vcpu_has_sve(vcpu) (system_supports_sve() && \
|
#define vcpu_has_sve(vcpu) (system_supports_sve() && \
|
||||||
((vcpu)->arch.flags & KVM_ARM64_GUEST_HAS_SVE))
|
((vcpu)->arch.flags & KVM_ARM64_GUEST_HAS_SVE))
|
||||||
|
|
||||||
#define vcpu_has_ptrauth(vcpu) ((system_supports_address_auth() || \
|
#ifdef CONFIG_ARM64_PTR_AUTH
|
||||||
system_supports_generic_auth()) && \
|
#define vcpu_has_ptrauth(vcpu) \
|
||||||
((vcpu)->arch.flags & KVM_ARM64_GUEST_HAS_PTRAUTH))
|
((cpus_have_final_cap(ARM64_HAS_ADDRESS_AUTH) || \
|
||||||
|
cpus_have_final_cap(ARM64_HAS_GENERIC_AUTH)) && \
|
||||||
|
(vcpu)->arch.flags & KVM_ARM64_GUEST_HAS_PTRAUTH)
|
||||||
|
#else
|
||||||
|
#define vcpu_has_ptrauth(vcpu) false
|
||||||
|
#endif
|
||||||
|
|
||||||
#define vcpu_gp_regs(v) (&(v)->arch.ctxt.gp_regs)
|
#define vcpu_gp_regs(v) (&(v)->arch.ctxt.gp_regs)
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ extern bool arm64_use_ng_mappings;
|
||||||
#define PAGE_HYP __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_HYP_XN)
|
#define PAGE_HYP __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_HYP_XN)
|
||||||
#define PAGE_HYP_EXEC __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_RDONLY)
|
#define PAGE_HYP_EXEC __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_RDONLY)
|
||||||
#define PAGE_HYP_RO __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_RDONLY | PTE_HYP_XN)
|
#define PAGE_HYP_RO __pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_RDONLY | PTE_HYP_XN)
|
||||||
#define PAGE_HYP_DEVICE __pgprot(PROT_DEVICE_nGnRE | PTE_HYP)
|
#define PAGE_HYP_DEVICE __pgprot(_PROT_DEFAULT | PTE_ATTRINDX(MT_DEVICE_nGnRE) | PTE_HYP | PTE_HYP_XN)
|
||||||
|
|
||||||
#define PAGE_S2_MEMATTR(attr) \
|
#define PAGE_S2_MEMATTR(attr) \
|
||||||
({ \
|
({ \
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include <linux/threads.h>
|
#include <linux/threads.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
#include <linux/thread_info.h>
|
#include <linux/thread_info.h>
|
||||||
#include <asm/pointer_auth.h>
|
|
||||||
|
|
||||||
DECLARE_PER_CPU_READ_MOSTLY(int, cpu_number);
|
DECLARE_PER_CPU_READ_MOSTLY(int, cpu_number);
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,10 @@ static inline long syscall_get_error(struct task_struct *task,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long error = regs->regs[0];
|
unsigned long error = regs->regs[0];
|
||||||
|
|
||||||
|
if (is_compat_thread(task_thread_info(task)))
|
||||||
|
error = sign_extend64(error, 31);
|
||||||
|
|
||||||
return IS_ERR_VALUE(error) ? error : 0;
|
return IS_ERR_VALUE(error) ? error : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +51,13 @@ static inline void syscall_set_return_value(struct task_struct *task,
|
||||||
struct pt_regs *regs,
|
struct pt_regs *regs,
|
||||||
int error, long val)
|
int error, long val)
|
||||||
{
|
{
|
||||||
regs->regs[0] = (long) error ? error : val;
|
if (error)
|
||||||
|
val = error;
|
||||||
|
|
||||||
|
if (is_compat_thread(task_thread_info(task)))
|
||||||
|
val = lower_32_bits(val);
|
||||||
|
|
||||||
|
regs->regs[0] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SYSCALL_MAX_ARGS 6
|
#define SYSCALL_MAX_ARGS 6
|
||||||
|
|
|
@ -93,6 +93,7 @@ void arch_release_task_struct(struct task_struct *tsk);
|
||||||
#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU)
|
#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU)
|
||||||
#define _TIF_UPROBE (1 << TIF_UPROBE)
|
#define _TIF_UPROBE (1 << TIF_UPROBE)
|
||||||
#define _TIF_FSCHECK (1 << TIF_FSCHECK)
|
#define _TIF_FSCHECK (1 << TIF_FSCHECK)
|
||||||
|
#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
|
||||||
#define _TIF_32BIT (1 << TIF_32BIT)
|
#define _TIF_32BIT (1 << TIF_32BIT)
|
||||||
#define _TIF_SVE (1 << TIF_SVE)
|
#define _TIF_SVE (1 << TIF_SVE)
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,10 @@
|
||||||
#ifndef __ASM_VDSOCLOCKSOURCE_H
|
#ifndef __ASM_VDSOCLOCKSOURCE_H
|
||||||
#define __ASM_VDSOCLOCKSOURCE_H
|
#define __ASM_VDSOCLOCKSOURCE_H
|
||||||
|
|
||||||
#define VDSO_ARCH_CLOCKMODES \
|
#define VDSO_ARCH_CLOCKMODES \
|
||||||
VDSO_CLOCKMODE_ARCHTIMER
|
/* vdso clocksource for both 32 and 64bit tasks */ \
|
||||||
|
VDSO_CLOCKMODE_ARCHTIMER, \
|
||||||
|
/* vdso clocksource for 64bit tasks only */ \
|
||||||
|
VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -111,7 +111,7 @@ static __always_inline u64 __arch_get_hw_counter(s32 clock_mode)
|
||||||
* update. Return something. Core will do another round and then
|
* update. Return something. Core will do another round and then
|
||||||
* see the mode change and fallback to the syscall.
|
* see the mode change and fallback to the syscall.
|
||||||
*/
|
*/
|
||||||
if (clock_mode == VDSO_CLOCKMODE_NONE)
|
if (clock_mode != VDSO_CLOCKMODE_ARCHTIMER)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -152,6 +152,12 @@ static __always_inline const struct vdso_data *__arch_get_vdso_data(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool vdso_clocksource_ok(const struct vdso_data *vd)
|
||||||
|
{
|
||||||
|
return vd->clock_mode == VDSO_CLOCKMODE_ARCHTIMER;
|
||||||
|
}
|
||||||
|
#define vdso_clocksource_ok vdso_clocksource_ok
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* __ASM_VDSO_GETTIMEOFDAY_H */
|
#endif /* __ASM_VDSO_GETTIMEOFDAY_H */
|
||||||
|
|
|
@ -43,20 +43,8 @@ bool alternative_is_applied(u16 cpufeature)
|
||||||
*/
|
*/
|
||||||
static bool branch_insn_requires_update(struct alt_instr *alt, unsigned long pc)
|
static bool branch_insn_requires_update(struct alt_instr *alt, unsigned long pc)
|
||||||
{
|
{
|
||||||
unsigned long replptr;
|
unsigned long replptr = (unsigned long)ALT_REPL_PTR(alt);
|
||||||
|
return !(pc >= replptr && pc <= (replptr + alt->alt_len));
|
||||||
if (kernel_text_address(pc))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
replptr = (unsigned long)ALT_REPL_PTR(alt);
|
|
||||||
if (pc >= replptr && pc <= (replptr + alt->alt_len))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Branching into *another* alternate sequence is doomed, and
|
|
||||||
* we're not even trying to fix it up.
|
|
||||||
*/
|
|
||||||
BUG();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define align_down(x, a) ((unsigned long)(x) & ~(((unsigned long)(a)) - 1))
|
#define align_down(x, a) ((unsigned long)(x) & ~(((unsigned long)(a)) - 1))
|
||||||
|
|
|
@ -782,6 +782,7 @@ static const struct midr_range erratum_1463225[] = {
|
||||||
MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 1),
|
MIDR_RANGE(MIDR_CORTEX_A76, 0, 0, 3, 1),
|
||||||
/* Kryo4xx Gold (rcpe to rfpf) => (r0p0 to r3p1) */
|
/* Kryo4xx Gold (rcpe to rfpf) => (r0p0 to r3p1) */
|
||||||
MIDR_RANGE(MIDR_QCOM_KRYO_4XX_GOLD, 0xc, 0xe, 0xf, 0xf),
|
MIDR_RANGE(MIDR_QCOM_KRYO_4XX_GOLD, 0xc, 0xe, 0xf, 0xf),
|
||||||
|
{},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -141,17 +141,20 @@ postcore_initcall(debug_monitors_init);
|
||||||
/*
|
/*
|
||||||
* Single step API and exception handling.
|
* Single step API and exception handling.
|
||||||
*/
|
*/
|
||||||
static void set_regs_spsr_ss(struct pt_regs *regs)
|
static void set_user_regs_spsr_ss(struct user_pt_regs *regs)
|
||||||
{
|
{
|
||||||
regs->pstate |= DBG_SPSR_SS;
|
regs->pstate |= DBG_SPSR_SS;
|
||||||
}
|
}
|
||||||
NOKPROBE_SYMBOL(set_regs_spsr_ss);
|
NOKPROBE_SYMBOL(set_user_regs_spsr_ss);
|
||||||
|
|
||||||
static void clear_regs_spsr_ss(struct pt_regs *regs)
|
static void clear_user_regs_spsr_ss(struct user_pt_regs *regs)
|
||||||
{
|
{
|
||||||
regs->pstate &= ~DBG_SPSR_SS;
|
regs->pstate &= ~DBG_SPSR_SS;
|
||||||
}
|
}
|
||||||
NOKPROBE_SYMBOL(clear_regs_spsr_ss);
|
NOKPROBE_SYMBOL(clear_user_regs_spsr_ss);
|
||||||
|
|
||||||
|
#define set_regs_spsr_ss(r) set_user_regs_spsr_ss(&(r)->user_regs)
|
||||||
|
#define clear_regs_spsr_ss(r) clear_user_regs_spsr_ss(&(r)->user_regs)
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(debug_hook_lock);
|
static DEFINE_SPINLOCK(debug_hook_lock);
|
||||||
static LIST_HEAD(user_step_hook);
|
static LIST_HEAD(user_step_hook);
|
||||||
|
@ -391,17 +394,26 @@ void user_rewind_single_step(struct task_struct *task)
|
||||||
* If single step is active for this thread, then set SPSR.SS
|
* If single step is active for this thread, then set SPSR.SS
|
||||||
* to 1 to avoid returning to the active-pending state.
|
* to 1 to avoid returning to the active-pending state.
|
||||||
*/
|
*/
|
||||||
if (test_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP))
|
if (test_tsk_thread_flag(task, TIF_SINGLESTEP))
|
||||||
set_regs_spsr_ss(task_pt_regs(task));
|
set_regs_spsr_ss(task_pt_regs(task));
|
||||||
}
|
}
|
||||||
NOKPROBE_SYMBOL(user_rewind_single_step);
|
NOKPROBE_SYMBOL(user_rewind_single_step);
|
||||||
|
|
||||||
void user_fastforward_single_step(struct task_struct *task)
|
void user_fastforward_single_step(struct task_struct *task)
|
||||||
{
|
{
|
||||||
if (test_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP))
|
if (test_tsk_thread_flag(task, TIF_SINGLESTEP))
|
||||||
clear_regs_spsr_ss(task_pt_regs(task));
|
clear_regs_spsr_ss(task_pt_regs(task));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void user_regs_reset_single_step(struct user_pt_regs *regs,
|
||||||
|
struct task_struct *task)
|
||||||
|
{
|
||||||
|
if (test_tsk_thread_flag(task, TIF_SINGLESTEP))
|
||||||
|
set_user_regs_spsr_ss(regs);
|
||||||
|
else
|
||||||
|
clear_user_regs_spsr_ss(regs);
|
||||||
|
}
|
||||||
|
|
||||||
/* Kernel API */
|
/* Kernel API */
|
||||||
void kernel_enable_single_step(struct pt_regs *regs)
|
void kernel_enable_single_step(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,7 +57,7 @@ static void notrace el1_dbg(struct pt_regs *regs, unsigned long esr)
|
||||||
/*
|
/*
|
||||||
* The CPU masked interrupts, and we are leaving them masked during
|
* The CPU masked interrupts, and we are leaving them masked during
|
||||||
* do_debug_exception(). Update PMR as if we had called
|
* do_debug_exception(). Update PMR as if we had called
|
||||||
* local_mask_daif().
|
* local_daif_mask().
|
||||||
*/
|
*/
|
||||||
if (system_uses_irq_prio_masking())
|
if (system_uses_irq_prio_masking())
|
||||||
gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
|
gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET);
|
||||||
|
|
|
@ -126,8 +126,10 @@ alternative_else_nop_endif
|
||||||
add \dst, \dst, #(\sym - .entry.tramp.text)
|
add \dst, \dst, #(\sym - .entry.tramp.text)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
// This macro corrupts x0-x3. It is the caller's duty
|
/*
|
||||||
// to save/restore them if required.
|
* This macro corrupts x0-x3. It is the caller's duty to save/restore
|
||||||
|
* them if required.
|
||||||
|
*/
|
||||||
.macro apply_ssbd, state, tmp1, tmp2
|
.macro apply_ssbd, state, tmp1, tmp2
|
||||||
#ifdef CONFIG_ARM64_SSBD
|
#ifdef CONFIG_ARM64_SSBD
|
||||||
alternative_cb arm64_enable_wa2_handling
|
alternative_cb arm64_enable_wa2_handling
|
||||||
|
@ -167,13 +169,28 @@ alternative_cb_end
|
||||||
stp x28, x29, [sp, #16 * 14]
|
stp x28, x29, [sp, #16 * 14]
|
||||||
|
|
||||||
.if \el == 0
|
.if \el == 0
|
||||||
|
.if \regsize == 32
|
||||||
|
/*
|
||||||
|
* If we're returning from a 32-bit task on a system affected by
|
||||||
|
* 1418040 then re-enable userspace access to the virtual counter.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_ARM64_ERRATUM_1418040
|
||||||
|
alternative_if ARM64_WORKAROUND_1418040
|
||||||
|
mrs x0, cntkctl_el1
|
||||||
|
orr x0, x0, #2 // ARCH_TIMER_USR_VCT_ACCESS_EN
|
||||||
|
msr cntkctl_el1, x0
|
||||||
|
alternative_else_nop_endif
|
||||||
|
#endif
|
||||||
|
.endif
|
||||||
clear_gp_regs
|
clear_gp_regs
|
||||||
mrs x21, sp_el0
|
mrs x21, sp_el0
|
||||||
ldr_this_cpu tsk, __entry_task, x20
|
ldr_this_cpu tsk, __entry_task, x20
|
||||||
msr sp_el0, tsk
|
msr sp_el0, tsk
|
||||||
|
|
||||||
// Ensure MDSCR_EL1.SS is clear, since we can unmask debug exceptions
|
/*
|
||||||
// when scheduling.
|
* Ensure MDSCR_EL1.SS is clear, since we can unmask debug exceptions
|
||||||
|
* when scheduling.
|
||||||
|
*/
|
||||||
ldr x19, [tsk, #TSK_TI_FLAGS]
|
ldr x19, [tsk, #TSK_TI_FLAGS]
|
||||||
disable_step_tsk x19, x20
|
disable_step_tsk x19, x20
|
||||||
|
|
||||||
|
@ -320,6 +337,14 @@ alternative_else_nop_endif
|
||||||
tst x22, #PSR_MODE32_BIT // native task?
|
tst x22, #PSR_MODE32_BIT // native task?
|
||||||
b.eq 3f
|
b.eq 3f
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM64_ERRATUM_1418040
|
||||||
|
alternative_if ARM64_WORKAROUND_1418040
|
||||||
|
mrs x0, cntkctl_el1
|
||||||
|
bic x0, x0, #2 // ARCH_TIMER_USR_VCT_ACCESS_EN
|
||||||
|
msr cntkctl_el1, x0
|
||||||
|
alternative_else_nop_endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64_ERRATUM_845719
|
#ifdef CONFIG_ARM64_ERRATUM_845719
|
||||||
alternative_if ARM64_WORKAROUND_845719
|
alternative_if ARM64_WORKAROUND_845719
|
||||||
#ifdef CONFIG_PID_IN_CONTEXTIDR
|
#ifdef CONFIG_PID_IN_CONTEXTIDR
|
||||||
|
@ -331,21 +356,6 @@ alternative_if ARM64_WORKAROUND_845719
|
||||||
alternative_else_nop_endif
|
alternative_else_nop_endif
|
||||||
#endif
|
#endif
|
||||||
3:
|
3:
|
||||||
#ifdef CONFIG_ARM64_ERRATUM_1418040
|
|
||||||
alternative_if_not ARM64_WORKAROUND_1418040
|
|
||||||
b 4f
|
|
||||||
alternative_else_nop_endif
|
|
||||||
/*
|
|
||||||
* if (x22.mode32 == cntkctl_el1.el0vcten)
|
|
||||||
* cntkctl_el1.el0vcten = ~cntkctl_el1.el0vcten
|
|
||||||
*/
|
|
||||||
mrs x1, cntkctl_el1
|
|
||||||
eon x0, x1, x22, lsr #3
|
|
||||||
tbz x0, #1, 4f
|
|
||||||
eor x1, x1, #2 // ARCH_TIMER_USR_VCT_ACCESS_EN
|
|
||||||
msr cntkctl_el1, x1
|
|
||||||
4:
|
|
||||||
#endif
|
|
||||||
scs_save tsk, x0
|
scs_save tsk, x0
|
||||||
|
|
||||||
/* No kernel C function calls after this as user keys are set. */
|
/* No kernel C function calls after this as user keys are set. */
|
||||||
|
@ -377,11 +387,11 @@ alternative_else_nop_endif
|
||||||
.if \el == 0
|
.if \el == 0
|
||||||
alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0
|
alternative_insn eret, nop, ARM64_UNMAP_KERNEL_AT_EL0
|
||||||
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
|
||||||
bne 5f
|
bne 4f
|
||||||
msr far_el1, x30
|
msr far_el1, x30
|
||||||
tramp_alias x30, tramp_exit_native
|
tramp_alias x30, tramp_exit_native
|
||||||
br x30
|
br x30
|
||||||
5:
|
4:
|
||||||
tramp_alias x30, tramp_exit_compat
|
tramp_alias x30, tramp_exit_compat
|
||||||
br x30
|
br x30
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -252,7 +252,7 @@ static int kgdb_step_brk_fn(struct pt_regs *regs, unsigned int esr)
|
||||||
if (!kgdb_single_step)
|
if (!kgdb_single_step)
|
||||||
return DBG_HOOK_ERROR;
|
return DBG_HOOK_ERROR;
|
||||||
|
|
||||||
kgdb_handle_exception(1, SIGTRAP, 0, regs);
|
kgdb_handle_exception(0, SIGTRAP, 0, regs);
|
||||||
return DBG_HOOK_HANDLED;
|
return DBG_HOOK_HANDLED;
|
||||||
}
|
}
|
||||||
NOKPROBE_SYMBOL(kgdb_step_brk_fn);
|
NOKPROBE_SYMBOL(kgdb_step_brk_fn);
|
||||||
|
|
|
@ -1811,19 +1811,42 @@ static void tracehook_report_syscall(struct pt_regs *regs,
|
||||||
unsigned long saved_reg;
|
unsigned long saved_reg;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A scratch register (ip(r12) on AArch32, x7 on AArch64) is
|
* We have some ABI weirdness here in the way that we handle syscall
|
||||||
* used to denote syscall entry/exit:
|
* exit stops because we indicate whether or not the stop has been
|
||||||
|
* signalled from syscall entry or syscall exit by clobbering a general
|
||||||
|
* purpose register (ip/r12 for AArch32, x7 for AArch64) in the tracee
|
||||||
|
* and restoring its old value after the stop. This means that:
|
||||||
|
*
|
||||||
|
* - Any writes by the tracer to this register during the stop are
|
||||||
|
* ignored/discarded.
|
||||||
|
*
|
||||||
|
* - The actual value of the register is not available during the stop,
|
||||||
|
* so the tracer cannot save it and restore it later.
|
||||||
|
*
|
||||||
|
* - Syscall stops behave differently to seccomp and pseudo-step traps
|
||||||
|
* (the latter do not nobble any registers).
|
||||||
*/
|
*/
|
||||||
regno = (is_compat_task() ? 12 : 7);
|
regno = (is_compat_task() ? 12 : 7);
|
||||||
saved_reg = regs->regs[regno];
|
saved_reg = regs->regs[regno];
|
||||||
regs->regs[regno] = dir;
|
regs->regs[regno] = dir;
|
||||||
|
|
||||||
if (dir == PTRACE_SYSCALL_EXIT)
|
if (dir == PTRACE_SYSCALL_ENTER) {
|
||||||
|
if (tracehook_report_syscall_entry(regs))
|
||||||
|
forget_syscall(regs);
|
||||||
|
regs->regs[regno] = saved_reg;
|
||||||
|
} else if (!test_thread_flag(TIF_SINGLESTEP)) {
|
||||||
tracehook_report_syscall_exit(regs, 0);
|
tracehook_report_syscall_exit(regs, 0);
|
||||||
else if (tracehook_report_syscall_entry(regs))
|
regs->regs[regno] = saved_reg;
|
||||||
forget_syscall(regs);
|
} else {
|
||||||
|
regs->regs[regno] = saved_reg;
|
||||||
|
|
||||||
regs->regs[regno] = saved_reg;
|
/*
|
||||||
|
* Signal a pseudo-step exception since we are stepping but
|
||||||
|
* tracer modifications to the registers may have rewound the
|
||||||
|
* state machine.
|
||||||
|
*/
|
||||||
|
tracehook_report_syscall_exit(regs, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int syscall_trace_enter(struct pt_regs *regs)
|
int syscall_trace_enter(struct pt_regs *regs)
|
||||||
|
@ -1833,12 +1856,12 @@ int syscall_trace_enter(struct pt_regs *regs)
|
||||||
if (flags & (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE)) {
|
if (flags & (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE)) {
|
||||||
tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
|
tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
|
||||||
if (!in_syscall(regs) || (flags & _TIF_SYSCALL_EMU))
|
if (!in_syscall(regs) || (flags & _TIF_SYSCALL_EMU))
|
||||||
return -1;
|
return NO_SYSCALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do the secure computing after ptrace; failures should be fast. */
|
/* Do the secure computing after ptrace; failures should be fast. */
|
||||||
if (secure_computing() == -1)
|
if (secure_computing() == -1)
|
||||||
return -1;
|
return NO_SYSCALL;
|
||||||
|
|
||||||
if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
|
if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
|
||||||
trace_sys_enter(regs, regs->syscallno);
|
trace_sys_enter(regs, regs->syscallno);
|
||||||
|
@ -1851,12 +1874,14 @@ int syscall_trace_enter(struct pt_regs *regs)
|
||||||
|
|
||||||
void syscall_trace_exit(struct pt_regs *regs)
|
void syscall_trace_exit(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
unsigned long flags = READ_ONCE(current_thread_info()->flags);
|
||||||
|
|
||||||
audit_syscall_exit(regs);
|
audit_syscall_exit(regs);
|
||||||
|
|
||||||
if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
|
if (flags & _TIF_SYSCALL_TRACEPOINT)
|
||||||
trace_sys_exit(regs, regs_return_value(regs));
|
trace_sys_exit(regs, regs_return_value(regs));
|
||||||
|
|
||||||
if (test_thread_flag(TIF_SYSCALL_TRACE))
|
if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP))
|
||||||
tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);
|
tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);
|
||||||
|
|
||||||
rseq_syscall(regs);
|
rseq_syscall(regs);
|
||||||
|
@ -1934,8 +1959,8 @@ static int valid_native_regs(struct user_pt_regs *regs)
|
||||||
*/
|
*/
|
||||||
int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task)
|
int valid_user_regs(struct user_pt_regs *regs, struct task_struct *task)
|
||||||
{
|
{
|
||||||
if (!test_tsk_thread_flag(task, TIF_SINGLESTEP))
|
/* https://lore.kernel.org/lkml/20191118131525.GA4180@willie-the-truck */
|
||||||
regs->pstate &= ~DBG_SPSR_SS;
|
user_regs_reset_single_step(regs, task);
|
||||||
|
|
||||||
if (is_compat_thread(task_thread_info(task)))
|
if (is_compat_thread(task_thread_info(task)))
|
||||||
return valid_compat_regs(regs);
|
return valid_compat_regs(regs);
|
||||||
|
|
|
@ -800,7 +800,6 @@ static void setup_restart_syscall(struct pt_regs *regs)
|
||||||
*/
|
*/
|
||||||
static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
|
||||||
sigset_t *oldset = sigmask_to_save();
|
sigset_t *oldset = sigmask_to_save();
|
||||||
int usig = ksig->sig;
|
int usig = ksig->sig;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -824,14 +823,8 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
|
||||||
*/
|
*/
|
||||||
ret |= !valid_user_regs(®s->user_regs, current);
|
ret |= !valid_user_regs(®s->user_regs, current);
|
||||||
|
|
||||||
/*
|
/* Step into the signal handler if we are stepping */
|
||||||
* Fast forward the stepping logic so we step into the signal
|
signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
|
||||||
* handler.
|
|
||||||
*/
|
|
||||||
if (!ret)
|
|
||||||
user_fastforward_single_step(tsk);
|
|
||||||
|
|
||||||
signal_setup_done(ret, ksig, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -50,6 +50,9 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
|
||||||
ret = do_ni_syscall(regs, scno);
|
ret = do_ni_syscall(regs, scno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_compat_task())
|
||||||
|
ret = lower_32_bits(ret);
|
||||||
|
|
||||||
regs->regs[0] = ret;
|
regs->regs[0] = ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +124,21 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
|
||||||
user_exit();
|
user_exit();
|
||||||
|
|
||||||
if (has_syscall_work(flags)) {
|
if (has_syscall_work(flags)) {
|
||||||
/* set default errno for user-issued syscall(-1) */
|
/*
|
||||||
|
* The de-facto standard way to skip a system call using ptrace
|
||||||
|
* is to set the system call to -1 (NO_SYSCALL) and set x0 to a
|
||||||
|
* suitable error code for consumption by userspace. However,
|
||||||
|
* this cannot be distinguished from a user-issued syscall(-1)
|
||||||
|
* and so we must set x0 to -ENOSYS here in case the tracer doesn't
|
||||||
|
* issue the skip and we fall into trace_exit with x0 preserved.
|
||||||
|
*
|
||||||
|
* This is slightly odd because it also means that if a tracer
|
||||||
|
* sets the system call number to -1 but does not initialise x0,
|
||||||
|
* then x0 will be preserved for all system calls apart from a
|
||||||
|
* user-issued syscall(-1). However, requesting a skip and not
|
||||||
|
* setting the return value is unlikely to do anything sensible
|
||||||
|
* anyway.
|
||||||
|
*/
|
||||||
if (scno == NO_SYSCALL)
|
if (scno == NO_SYSCALL)
|
||||||
regs->regs[0] = -ENOSYS;
|
regs->regs[0] = -ENOSYS;
|
||||||
scno = syscall_trace_enter(regs);
|
scno = syscall_trace_enter(regs);
|
||||||
|
@ -139,7 +156,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
|
||||||
if (!has_syscall_work(flags) && !IS_ENABLED(CONFIG_DEBUG_RSEQ)) {
|
if (!has_syscall_work(flags) && !IS_ENABLED(CONFIG_DEBUG_RSEQ)) {
|
||||||
local_daif_mask();
|
local_daif_mask();
|
||||||
flags = current_thread_info()->flags;
|
flags = current_thread_info()->flags;
|
||||||
if (!has_syscall_work(flags)) {
|
if (!has_syscall_work(flags) && !(flags & _TIF_SINGLESTEP)) {
|
||||||
/*
|
/*
|
||||||
* We're off to userspace, where interrupts are
|
* We're off to userspace, where interrupts are
|
||||||
* always enabled after we restore the flags from
|
* always enabled after we restore the flags from
|
||||||
|
|
|
@ -14,7 +14,7 @@ COMPAT_GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE_COMPAT)elfedit))
|
||||||
COMPAT_GCC_TOOLCHAIN := $(realpath $(COMPAT_GCC_TOOLCHAIN_DIR)/..)
|
COMPAT_GCC_TOOLCHAIN := $(realpath $(COMPAT_GCC_TOOLCHAIN_DIR)/..)
|
||||||
|
|
||||||
CC_COMPAT_CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE_COMPAT:%-=%))
|
CC_COMPAT_CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE_COMPAT:%-=%))
|
||||||
CC_COMPAT_CLANG_FLAGS += --prefix=$(COMPAT_GCC_TOOLCHAIN_DIR)
|
CC_COMPAT_CLANG_FLAGS += --prefix=$(COMPAT_GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE_COMPAT))
|
||||||
CC_COMPAT_CLANG_FLAGS += -no-integrated-as -Qunused-arguments
|
CC_COMPAT_CLANG_FLAGS += -no-integrated-as -Qunused-arguments
|
||||||
ifneq ($(COMPAT_GCC_TOOLCHAIN),)
|
ifneq ($(COMPAT_GCC_TOOLCHAIN),)
|
||||||
CC_COMPAT_CLANG_FLAGS += --gcc-toolchain=$(COMPAT_GCC_TOOLCHAIN)
|
CC_COMPAT_CLANG_FLAGS += --gcc-toolchain=$(COMPAT_GCC_TOOLCHAIN)
|
||||||
|
|
|
@ -1326,7 +1326,7 @@ static bool stage2_get_leaf_entry(struct kvm *kvm, phys_addr_t addr,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool stage2_is_exec(struct kvm *kvm, phys_addr_t addr)
|
static bool stage2_is_exec(struct kvm *kvm, phys_addr_t addr, unsigned long sz)
|
||||||
{
|
{
|
||||||
pud_t *pudp;
|
pud_t *pudp;
|
||||||
pmd_t *pmdp;
|
pmd_t *pmdp;
|
||||||
|
@ -1338,11 +1338,11 @@ static bool stage2_is_exec(struct kvm *kvm, phys_addr_t addr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (pudp)
|
if (pudp)
|
||||||
return kvm_s2pud_exec(pudp);
|
return sz <= PUD_SIZE && kvm_s2pud_exec(pudp);
|
||||||
else if (pmdp)
|
else if (pmdp)
|
||||||
return kvm_s2pmd_exec(pmdp);
|
return sz <= PMD_SIZE && kvm_s2pmd_exec(pmdp);
|
||||||
else
|
else
|
||||||
return kvm_s2pte_exec(ptep);
|
return sz == PAGE_SIZE && kvm_s2pte_exec(ptep);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache,
|
static int stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache,
|
||||||
|
@ -1958,7 +1958,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
|
||||||
* execute permissions, and we preserve whatever we have.
|
* execute permissions, and we preserve whatever we have.
|
||||||
*/
|
*/
|
||||||
needs_exec = exec_fault ||
|
needs_exec = exec_fault ||
|
||||||
(fault_status == FSC_PERM && stage2_is_exec(kvm, fault_ipa));
|
(fault_status == FSC_PERM &&
|
||||||
|
stage2_is_exec(kvm, fault_ipa, vma_pagesize));
|
||||||
|
|
||||||
if (vma_pagesize == PUD_SIZE) {
|
if (vma_pagesize == PUD_SIZE) {
|
||||||
pud_t new_pud = kvm_pfn_pud(pfn, mem_type);
|
pud_t new_pud = kvm_pfn_pud(pfn, mem_type);
|
||||||
|
|
|
@ -19,15 +19,13 @@
|
||||||
\
|
\
|
||||||
/* \
|
/* \
|
||||||
* We can't unroll if the number of iterations isn't \
|
* We can't unroll if the number of iterations isn't \
|
||||||
* compile-time constant. Unfortunately GCC versions \
|
* compile-time constant. Unfortunately clang versions \
|
||||||
* up until 4.6 tend to miss obvious constants & cause \
|
* up until 8.0 tend to miss obvious constants & cause \
|
||||||
* this check to fail, even though they go on to \
|
* this check to fail, even though they go on to \
|
||||||
* generate reasonable code for the switch statement, \
|
* generate reasonable code for the switch statement, \
|
||||||
* so we skip the sanity check for those compilers. \
|
* so we skip the sanity check for those compilers. \
|
||||||
*/ \
|
*/ \
|
||||||
BUILD_BUG_ON((CONFIG_GCC_VERSION >= 40700 || \
|
BUILD_BUG_ON(!__builtin_constant_p(times)); \
|
||||||
CONFIG_CLANG_VERSION >= 80000) && \
|
|
||||||
!__builtin_constant_p(times)); \
|
|
||||||
\
|
\
|
||||||
switch (times) { \
|
switch (times) { \
|
||||||
case 32: fn(__VA_ARGS__); /* fall through */ \
|
case 32: fn(__VA_ARGS__); /* fall through */ \
|
||||||
|
|
|
@ -1722,6 +1722,7 @@ enum emulation_result kvm_mips_emulate_store(union mips_instruction inst,
|
||||||
vcpu->arch.gprs[rt], *(u32 *)data);
|
vcpu->arch.gprs[rt], *(u32 *)data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if defined(CONFIG_64BIT) && defined(CONFIG_KVM_MIPS_VZ)
|
||||||
case sdl_op:
|
case sdl_op:
|
||||||
run->mmio.phys_addr = kvm_mips_callbacks->gva_to_gpa(
|
run->mmio.phys_addr = kvm_mips_callbacks->gva_to_gpa(
|
||||||
vcpu->arch.host_cp0_badvaddr) & (~0x7);
|
vcpu->arch.host_cp0_badvaddr) & (~0x7);
|
||||||
|
@ -1815,6 +1816,7 @@ enum emulation_result kvm_mips_emulate_store(union mips_instruction inst,
|
||||||
vcpu->arch.pc, vcpu->arch.host_cp0_badvaddr,
|
vcpu->arch.pc, vcpu->arch.host_cp0_badvaddr,
|
||||||
vcpu->arch.gprs[rt], *(u64 *)data);
|
vcpu->arch.gprs[rt], *(u64 *)data);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_LOONGSON64
|
#ifdef CONFIG_CPU_LOONGSON64
|
||||||
case sdc2_op:
|
case sdc2_op:
|
||||||
|
@ -2002,6 +2004,7 @@ enum emulation_result kvm_mips_emulate_load(union mips_instruction inst,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if defined(CONFIG_64BIT) && defined(CONFIG_KVM_MIPS_VZ)
|
||||||
case ldl_op:
|
case ldl_op:
|
||||||
run->mmio.phys_addr = kvm_mips_callbacks->gva_to_gpa(
|
run->mmio.phys_addr = kvm_mips_callbacks->gva_to_gpa(
|
||||||
vcpu->arch.host_cp0_badvaddr) & (~0x7);
|
vcpu->arch.host_cp0_badvaddr) & (~0x7);
|
||||||
|
@ -2073,6 +2076,7 @@ enum emulation_result kvm_mips_emulate_load(union mips_instruction inst,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_LOONGSON64
|
#ifdef CONFIG_CPU_LOONGSON64
|
||||||
case ldc2_op:
|
case ldc2_op:
|
||||||
|
|
|
@ -627,9 +627,10 @@ static int bridge_probe(struct platform_device *pdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
domain = irq_domain_create_hierarchy(parent, 0, 8, fn,
|
domain = irq_domain_create_hierarchy(parent, 0, 8, fn,
|
||||||
&bridge_domain_ops, NULL);
|
&bridge_domain_ops, NULL);
|
||||||
irq_domain_free_fwnode(fn);
|
if (!domain) {
|
||||||
if (!domain)
|
irq_domain_free_fwnode(fn);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
pci_set_flags(PCI_PROBE_ONLY);
|
pci_set_flags(PCI_PROBE_ONLY);
|
||||||
|
|
||||||
|
|
|
@ -212,6 +212,8 @@ atomic64_set(atomic64_t *v, s64 i)
|
||||||
_atomic_spin_unlock_irqrestore(v, flags);
|
_atomic_spin_unlock_irqrestore(v, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define atomic64_set_release(v, i) atomic64_set((v), (i))
|
||||||
|
|
||||||
static __inline__ s64
|
static __inline__ s64
|
||||||
atomic64_read(const atomic64_t *v)
|
atomic64_read(const atomic64_t *v)
|
||||||
{
|
{
|
||||||
|
|
|
@ -60,6 +60,7 @@ extern void __cmpxchg_called_with_bad_pointer(void);
|
||||||
extern unsigned long __cmpxchg_u32(volatile unsigned int *m, unsigned int old,
|
extern unsigned long __cmpxchg_u32(volatile unsigned int *m, unsigned int old,
|
||||||
unsigned int new_);
|
unsigned int new_);
|
||||||
extern u64 __cmpxchg_u64(volatile u64 *ptr, u64 old, u64 new_);
|
extern u64 __cmpxchg_u64(volatile u64 *ptr, u64 old, u64 new_);
|
||||||
|
extern u8 __cmpxchg_u8(volatile u8 *ptr, u8 old, u8 new_);
|
||||||
|
|
||||||
/* don't worry...optimizer will get rid of most of this */
|
/* don't worry...optimizer will get rid of most of this */
|
||||||
static inline unsigned long
|
static inline unsigned long
|
||||||
|
@ -71,6 +72,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size)
|
||||||
#endif
|
#endif
|
||||||
case 4: return __cmpxchg_u32((unsigned int *)ptr,
|
case 4: return __cmpxchg_u32((unsigned int *)ptr,
|
||||||
(unsigned int)old, (unsigned int)new_);
|
(unsigned int)old, (unsigned int)new_);
|
||||||
|
case 1: return __cmpxchg_u8((u8 *)ptr, (u8)old, (u8)new_);
|
||||||
}
|
}
|
||||||
__cmpxchg_called_with_bad_pointer();
|
__cmpxchg_called_with_bad_pointer();
|
||||||
return old;
|
return old;
|
||||||
|
|
|
@ -79,3 +79,15 @@ unsigned long __cmpxchg_u32(volatile unsigned int *ptr, unsigned int old, unsign
|
||||||
_atomic_spin_unlock_irqrestore(ptr, flags);
|
_atomic_spin_unlock_irqrestore(ptr, flags);
|
||||||
return (unsigned long)prev;
|
return (unsigned long)prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u8 __cmpxchg_u8(volatile u8 *ptr, u8 old, u8 new)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
u8 prev;
|
||||||
|
|
||||||
|
_atomic_spin_lock_irqsave(ptr, flags);
|
||||||
|
if ((prev = *ptr) == old)
|
||||||
|
*ptr = new;
|
||||||
|
_atomic_spin_unlock_irqrestore(ptr, flags);
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
|
@ -77,6 +77,8 @@ struct coprocessor_completion_block {
|
||||||
#define CSB_CC_CHAIN (37)
|
#define CSB_CC_CHAIN (37)
|
||||||
#define CSB_CC_SEQUENCE (38)
|
#define CSB_CC_SEQUENCE (38)
|
||||||
#define CSB_CC_HW (39)
|
#define CSB_CC_HW (39)
|
||||||
|
/* P9 DD2 NX Workbook 3.2 (Table 4-36): Address translation fault */
|
||||||
|
#define CSB_CC_FAULT_ADDRESS (250)
|
||||||
|
|
||||||
#define CSB_SIZE (0x10)
|
#define CSB_SIZE (0x10)
|
||||||
#define CSB_ALIGN CSB_SIZE
|
#define CSB_ALIGN CSB_SIZE
|
||||||
|
|
|
@ -2551,7 +2551,7 @@ EXC_VIRT_NONE(0x5400, 0x100)
|
||||||
INT_DEFINE_BEGIN(denorm_exception)
|
INT_DEFINE_BEGIN(denorm_exception)
|
||||||
IVEC=0x1500
|
IVEC=0x1500
|
||||||
IHSRR=1
|
IHSRR=1
|
||||||
IBRANCH_COMMON=0
|
IBRANCH_TO_COMMON=0
|
||||||
IKVM_REAL=1
|
IKVM_REAL=1
|
||||||
INT_DEFINE_END(denorm_exception)
|
INT_DEFINE_END(denorm_exception)
|
||||||
|
|
||||||
|
@ -3072,10 +3072,18 @@ do_hash_page:
|
||||||
ori r0,r0,DSISR_BAD_FAULT_64S@l
|
ori r0,r0,DSISR_BAD_FAULT_64S@l
|
||||||
and. r0,r5,r0 /* weird error? */
|
and. r0,r5,r0 /* weird error? */
|
||||||
bne- handle_page_fault /* if not, try to insert a HPTE */
|
bne- handle_page_fault /* if not, try to insert a HPTE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we are in an "NMI" (e.g., an interrupt when soft-disabled), then
|
||||||
|
* don't call hash_page, just fail the fault. This is required to
|
||||||
|
* prevent re-entrancy problems in the hash code, namely perf
|
||||||
|
* interrupts hitting while something holds H_PAGE_BUSY, and taking a
|
||||||
|
* hash fault. See the comment in hash_preload().
|
||||||
|
*/
|
||||||
ld r11, PACA_THREAD_INFO(r13)
|
ld r11, PACA_THREAD_INFO(r13)
|
||||||
lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */
|
lwz r0,TI_PREEMPT(r11)
|
||||||
andis. r0,r0,NMI_MASK@h /* (i.e. an irq when soft-disabled) */
|
andis. r0,r0,NMI_MASK@h
|
||||||
bne 77f /* then don't call hash_page now */
|
bne 77f
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* r3 contains the trap number
|
* r3 contains the trap number
|
||||||
|
|
|
@ -87,7 +87,7 @@ static void *__init alloc_shared_lppaca(unsigned long size, unsigned long align,
|
||||||
* This is very early in boot, so no harm done if the kernel crashes at
|
* This is very early in boot, so no harm done if the kernel crashes at
|
||||||
* this point.
|
* this point.
|
||||||
*/
|
*/
|
||||||
BUG_ON(shared_lppaca_size >= shared_lppaca_total_size);
|
BUG_ON(shared_lppaca_size > shared_lppaca_total_size);
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1559,6 +1559,7 @@ static void hash_preload(struct mm_struct *mm, pte_t *ptep, unsigned long ea,
|
||||||
pgd_t *pgdir;
|
pgd_t *pgdir;
|
||||||
int rc, ssize, update_flags = 0;
|
int rc, ssize, update_flags = 0;
|
||||||
unsigned long access = _PAGE_PRESENT | _PAGE_READ | (is_exec ? _PAGE_EXEC : 0);
|
unsigned long access = _PAGE_PRESENT | _PAGE_READ | (is_exec ? _PAGE_EXEC : 0);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
BUG_ON(get_region_id(ea) != USER_REGION_ID);
|
BUG_ON(get_region_id(ea) != USER_REGION_ID);
|
||||||
|
|
||||||
|
@ -1592,6 +1593,28 @@ static void hash_preload(struct mm_struct *mm, pte_t *ptep, unsigned long ea,
|
||||||
return;
|
return;
|
||||||
#endif /* CONFIG_PPC_64K_PAGES */
|
#endif /* CONFIG_PPC_64K_PAGES */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* __hash_page_* must run with interrupts off, as it sets the
|
||||||
|
* H_PAGE_BUSY bit. It's possible for perf interrupts to hit at any
|
||||||
|
* time and may take a hash fault reading the user stack, see
|
||||||
|
* read_user_stack_slow() in the powerpc/perf code.
|
||||||
|
*
|
||||||
|
* If that takes a hash fault on the same page as we lock here, it
|
||||||
|
* will bail out when seeing H_PAGE_BUSY set, and retry the access
|
||||||
|
* leading to an infinite loop.
|
||||||
|
*
|
||||||
|
* Disabling interrupts here does not prevent perf interrupts, but it
|
||||||
|
* will prevent them taking hash faults (see the NMI test in
|
||||||
|
* do_hash_page), then read_user_stack's copy_from_user_nofault will
|
||||||
|
* fail and perf will fall back to read_user_stack_slow(), which
|
||||||
|
* walks the Linux page tables.
|
||||||
|
*
|
||||||
|
* Interrupts must also be off for the duration of the
|
||||||
|
* mm_is_thread_local test and update, to prevent preempt running the
|
||||||
|
* mm on another CPU (XXX: this may be racy vs kthread_use_mm).
|
||||||
|
*/
|
||||||
|
local_irq_save(flags);
|
||||||
|
|
||||||
/* Is that local to this CPU ? */
|
/* Is that local to this CPU ? */
|
||||||
if (mm_is_thread_local(mm))
|
if (mm_is_thread_local(mm))
|
||||||
update_flags |= HPTE_LOCAL_UPDATE;
|
update_flags |= HPTE_LOCAL_UPDATE;
|
||||||
|
@ -1614,6 +1637,8 @@ static void hash_preload(struct mm_struct *mm, pte_t *ptep, unsigned long ea,
|
||||||
mm_ctx_user_psize(&mm->context),
|
mm_ctx_user_psize(&mm->context),
|
||||||
mm_ctx_user_psize(&mm->context),
|
mm_ctx_user_psize(&mm->context),
|
||||||
pte_val(*ptep));
|
pte_val(*ptep));
|
||||||
|
|
||||||
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -354,12 +354,14 @@ static bool pkey_access_permitted(int pkey, bool write, bool execute)
|
||||||
u64 amr;
|
u64 amr;
|
||||||
|
|
||||||
pkey_shift = pkeyshift(pkey);
|
pkey_shift = pkeyshift(pkey);
|
||||||
if (execute && !(read_iamr() & (IAMR_EX_BIT << pkey_shift)))
|
if (execute)
|
||||||
return true;
|
return !(read_iamr() & (IAMR_EX_BIT << pkey_shift));
|
||||||
|
|
||||||
amr = read_amr(); /* Delay reading amr until absolutely needed */
|
amr = read_amr();
|
||||||
return ((!write && !(amr & (AMR_RD_BIT << pkey_shift))) ||
|
if (write)
|
||||||
(write && !(amr & (AMR_WR_BIT << pkey_shift))));
|
return !(amr & (AMR_WR_BIT << pkey_shift));
|
||||||
|
|
||||||
|
return !(amr & (AMR_RD_BIT << pkey_shift));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool arch_pte_access_permitted(u64 pte, bool write, bool execute)
|
bool arch_pte_access_permitted(u64 pte, bool write, bool execute)
|
||||||
|
|
|
@ -2179,6 +2179,12 @@ static void __perf_event_interrupt(struct pt_regs *regs)
|
||||||
|
|
||||||
perf_read_regs(regs);
|
perf_read_regs(regs);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If perf interrupts hit in a local_irq_disable (soft-masked) region,
|
||||||
|
* we consider them as NMIs. This is required to prevent hash faults on
|
||||||
|
* user addresses when reading callchains. See the NMI test in
|
||||||
|
* do_hash_page.
|
||||||
|
*/
|
||||||
nmi = perf_intr_is_nmi(regs);
|
nmi = perf_intr_is_nmi(regs);
|
||||||
if (nmi)
|
if (nmi)
|
||||||
nmi_enter();
|
nmi_enter();
|
||||||
|
|
|
@ -79,7 +79,7 @@ static void update_csb(struct vas_window *window,
|
||||||
csb_addr = (void __user *)be64_to_cpu(crb->csb_addr);
|
csb_addr = (void __user *)be64_to_cpu(crb->csb_addr);
|
||||||
|
|
||||||
memset(&csb, 0, sizeof(csb));
|
memset(&csb, 0, sizeof(csb));
|
||||||
csb.cc = CSB_CC_TRANSLATION;
|
csb.cc = CSB_CC_FAULT_ADDRESS;
|
||||||
csb.ce = CSB_CE_TERMINATION;
|
csb.ce = CSB_CE_TERMINATION;
|
||||||
csb.cs = 0;
|
csb.cs = 0;
|
||||||
csb.count = 0;
|
csb.count = 0;
|
||||||
|
|
|
@ -23,6 +23,8 @@ config RISCV
|
||||||
select ARCH_HAS_SET_DIRECT_MAP
|
select ARCH_HAS_SET_DIRECT_MAP
|
||||||
select ARCH_HAS_SET_MEMORY
|
select ARCH_HAS_SET_MEMORY
|
||||||
select ARCH_HAS_STRICT_KERNEL_RWX if MMU
|
select ARCH_HAS_STRICT_KERNEL_RWX if MMU
|
||||||
|
select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX
|
||||||
|
select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT
|
||||||
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
|
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
|
||||||
select ARCH_WANT_FRAME_POINTERS
|
select ARCH_WANT_FRAME_POINTERS
|
||||||
select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
|
select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
|
||||||
|
|
|
@ -58,8 +58,16 @@ do { \
|
||||||
* The AQ/RL pair provides a RCpc critical section, but there's not really any
|
* The AQ/RL pair provides a RCpc critical section, but there's not really any
|
||||||
* way we can take advantage of that here because the ordering is only enforced
|
* way we can take advantage of that here because the ordering is only enforced
|
||||||
* on that one lock. Thus, we're just doing a full fence.
|
* on that one lock. Thus, we're just doing a full fence.
|
||||||
|
*
|
||||||
|
* Since we allow writeX to be called from preemptive regions we need at least
|
||||||
|
* an "o" in the predecessor set to ensure device writes are visible before the
|
||||||
|
* task is marked as available for scheduling on a new hart. While I don't see
|
||||||
|
* any concrete reason we need a full IO fence, it seems safer to just upgrade
|
||||||
|
* this in order to avoid any IO crossing a scheduling boundary. In both
|
||||||
|
* instances the scheduler pairs this with an mb(), so nothing is necessary on
|
||||||
|
* the new hart.
|
||||||
*/
|
*/
|
||||||
#define smp_mb__after_spinlock() RISCV_FENCE(rw,rw)
|
#define smp_mb__after_spinlock() RISCV_FENCE(iorw,iorw)
|
||||||
|
|
||||||
#include <asm-generic/barrier.h>
|
#include <asm-generic/barrier.h>
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,7 @@
|
||||||
#ifndef __ASM_GDB_XML_H_
|
#ifndef __ASM_GDB_XML_H_
|
||||||
#define __ASM_GDB_XML_H_
|
#define __ASM_GDB_XML_H_
|
||||||
|
|
||||||
#define kgdb_arch_gdb_stub_feature riscv_gdb_stub_feature
|
const char riscv_gdb_stub_feature[64] =
|
||||||
static const char riscv_gdb_stub_feature[64] =
|
|
||||||
"PacketSize=800;qXfer:features:read+;";
|
"PacketSize=800;qXfer:features:read+;";
|
||||||
|
|
||||||
static const char gdb_xfer_read_target[31] = "qXfer:features:read:target.xml:";
|
static const char gdb_xfer_read_target[31] = "qXfer:features:read:target.xml:";
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user