Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR (net-6.14-rc2). No conflicts or adjacent changes. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -142,13 +142,17 @@ Boris Brezillon <bbrezillon@kernel.org> <boris.brezillon@bootlin.com>
|
||||
Boris Brezillon <bbrezillon@kernel.org> <boris.brezillon@free-electrons.com>
|
||||
Brendan Higgins <brendan.higgins@linux.dev> <brendanhiggins@google.com>
|
||||
Brian Avery <b.avery@hp.com>
|
||||
Brian Cain <bcain@kernel.org> <brian.cain@oss.qualcomm.com>
|
||||
Brian Cain <bcain@kernel.org> <bcain@quicinc.com>
|
||||
Brian King <brking@us.ibm.com>
|
||||
Brian Silverman <bsilver16384@gmail.com> <brian.silverman@bluerivertech.com>
|
||||
Bryan Tan <bryan-bt.tan@broadcom.com> <bryantan@vmware.com>
|
||||
Cai Huoqing <cai.huoqing@linux.dev> <caihuoqing@baidu.com>
|
||||
Can Guo <quic_cang@quicinc.com> <cang@codeaurora.org>
|
||||
Carl Huang <quic_cjhuang@quicinc.com> <cjhuang@codeaurora.org>
|
||||
Carlos Bilbao <carlos.bilbao.osdev@gmail.com> <carlos.bilbao@amd.com>
|
||||
Carlos Bilbao <carlos.bilbao@kernel.org> <carlos.bilbao@amd.com>
|
||||
Carlos Bilbao <carlos.bilbao@kernel.org> <carlos.bilbao.osdev@gmail.com>
|
||||
Carlos Bilbao <carlos.bilbao@kernel.org> <bilbao@vt.edu>
|
||||
Changbin Du <changbin.du@intel.com> <changbin.du@gmail.com>
|
||||
Changbin Du <changbin.du@intel.com> <changbin.du@intel.com>
|
||||
Chao Yu <chao@kernel.org> <chao2.yu@samsung.com>
|
||||
@@ -165,6 +169,7 @@ Christian Brauner <brauner@kernel.org> <christian.brauner@canonical.com>
|
||||
Christian Brauner <brauner@kernel.org> <christian.brauner@ubuntu.com>
|
||||
Christian Marangi <ansuelsmth@gmail.com>
|
||||
Christophe Ricard <christophe.ricard@gmail.com>
|
||||
Christopher Obbard <christopher.obbard@linaro.org> <chris.obbard@collabora.com>
|
||||
Christoph Hellwig <hch@lst.de>
|
||||
Chuck Lever <chuck.lever@oracle.com> <cel@kernel.org>
|
||||
Chuck Lever <chuck.lever@oracle.com> <cel@netapp.com>
|
||||
@@ -261,6 +266,7 @@ Guo Ren <guoren@kernel.org> <ren_guo@c-sky.com>
|
||||
Guru Das Srinagesh <quic_gurus@quicinc.com> <gurus@codeaurora.org>
|
||||
Gustavo Padovan <gustavo@las.ic.unicamp.br>
|
||||
Gustavo Padovan <padovan@profusion.mobi>
|
||||
Hamza Mahfooz <hamzamahfooz@linux.microsoft.com> <hamza.mahfooz@amd.com>
|
||||
Hanjun Guo <guohanjun@huawei.com> <hanjun.guo@linaro.org>
|
||||
Hans Verkuil <hverkuil@xs4all.nl> <hansverk@cisco.com>
|
||||
Hans Verkuil <hverkuil@xs4all.nl> <hverkuil-cisco@xs4all.nl>
|
||||
@@ -761,6 +767,7 @@ Wolfram Sang <wsa@kernel.org> <wsa@the-dreams.de>
|
||||
Yakir Yang <kuankuan.y@gmail.com> <ykk@rock-chips.com>
|
||||
Yanteng Si <si.yanteng@linux.dev> <siyanteng@loongson.cn>
|
||||
Ying Huang <huang.ying.caritas@gmail.com> <ying.huang@intel.com>
|
||||
Yosry Ahmed <yosry.ahmed@linux.dev> <yosryahmed@google.com>
|
||||
Yusuke Goda <goda.yusuke@renesas.com>
|
||||
Zack Rusin <zack.rusin@broadcom.com> <zackr@vmware.com>
|
||||
Zhu Yanjun <zyjzyj2000@gmail.com> <yanjunz@nvidia.com>
|
||||
|
||||
@@ -293,3 +293,13 @@ The following keys are defined:
|
||||
|
||||
* :c:macro:`RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED`: Misaligned vector accesses are
|
||||
not supported at all and will generate a misaligned address fault.
|
||||
|
||||
* :c:macro:`RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0`: A bitmask containing the
|
||||
thead vendor extensions that are compatible with the
|
||||
:c:macro:`RISCV_HWPROBE_BASE_BEHAVIOR_IMA`: base system behavior.
|
||||
|
||||
* T-HEAD
|
||||
|
||||
* :c:macro:`RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR`: The xtheadvector vendor
|
||||
extension is supported in the T-Head ISA extensions spec starting from
|
||||
commit a18c801634 ("Add T-Head VECTOR vendor extension. ").
|
||||
|
||||
@@ -1091,6 +1091,7 @@ properties:
|
||||
- dmo,imx8mp-data-modul-edm-sbc # i.MX8MP eDM SBC
|
||||
- emcraft,imx8mp-navqp # i.MX8MP Emcraft Systems NavQ+ Kit
|
||||
- fsl,imx8mp-evk # i.MX8MP EVK Board
|
||||
- fsl,imx8mp-evk-revb4 # i.MX8MP EVK Rev B4 Board
|
||||
- gateworks,imx8mp-gw71xx-2x # i.MX8MP Gateworks Board
|
||||
- gateworks,imx8mp-gw72xx-2x # i.MX8MP Gateworks Board
|
||||
- gateworks,imx8mp-gw73xx-2x # i.MX8MP Gateworks Board
|
||||
@@ -1271,6 +1272,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- fsl,imx8qm-mek # i.MX8QM MEK Board
|
||||
- fsl,imx8qm-mek-revd # i.MX8QM MEK Rev D Board
|
||||
- toradex,apalis-imx8 # Apalis iMX8 Modules
|
||||
- toradex,apalis-imx8-v1.1 # Apalis iMX8 V1.1 Modules
|
||||
- const: fsl,imx8qm
|
||||
@@ -1299,6 +1301,7 @@ properties:
|
||||
- enum:
|
||||
- einfochips,imx8qxp-ai_ml # i.MX8QXP AI_ML Board
|
||||
- fsl,imx8qxp-mek # i.MX8QXP MEK Board
|
||||
- fsl,imx8qxp-mek-wcpu # i.MX8QXP MEK WCPU Board
|
||||
- const: fsl,imx8qxp
|
||||
|
||||
- description: i.MX8DXL based Boards
|
||||
|
||||
@@ -14,9 +14,8 @@ allOf:
|
||||
|
||||
description: |
|
||||
The Microchip LAN966x outband interrupt controller (OIC) maps the internal
|
||||
interrupt sources of the LAN966x device to an external interrupt.
|
||||
When the LAN966x device is used as a PCI device, the external interrupt is
|
||||
routed to the PCI interrupt.
|
||||
interrupt sources of the LAN966x device to a PCI interrupt when the LAN966x
|
||||
device is used as a PCI device.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -26,6 +26,18 @@ description: |
|
||||
allOf:
|
||||
- $ref: /schemas/cpu.yaml#
|
||||
- $ref: extensions.yaml
|
||||
- if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- thead,c906
|
||||
- thead,c910
|
||||
- thead,c920
|
||||
then:
|
||||
properties:
|
||||
thead,vlenb: false
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
@@ -96,6 +108,13 @@ properties:
|
||||
description:
|
||||
The blocksize in bytes for the Zicboz cache operations.
|
||||
|
||||
thead,vlenb:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
VLEN/8, the vector register length in bytes. This property is required on
|
||||
thead systems where the vector register length is not identical on all harts, or
|
||||
the vlenb CSR is not available.
|
||||
|
||||
# RISC-V has multiple properties for cache op block sizes as the sizes
|
||||
# differ between individual CBO extensions
|
||||
cache-op-block-size: false
|
||||
|
||||
@@ -621,6 +621,10 @@ properties:
|
||||
latency, as ratified in commit 56ed795 ("Update
|
||||
riscv-crypto-spec-vector.adoc") of riscv-crypto.
|
||||
|
||||
# vendor extensions, each extension sorted alphanumerically under the
|
||||
# vendor they belong to. Vendors are sorted alphanumerically as well.
|
||||
|
||||
# Andes
|
||||
- const: xandespmu
|
||||
description:
|
||||
The Andes Technology performance monitor extension for counter overflow
|
||||
@@ -628,6 +632,12 @@ properties:
|
||||
Registers in the AX45MP datasheet.
|
||||
https://www.andestech.com/wp-content/uploads/AX45MP-1C-Rev.-5.0.0-Datasheet.pdf
|
||||
|
||||
# T-HEAD
|
||||
- const: xtheadvector
|
||||
description:
|
||||
The T-HEAD specific 0.7.1 vector implementation as written in
|
||||
https://github.com/T-head-Semi/thead-extension-spec/blob/95358cb2cca9489361c61d335e03d3134b14133f/xtheadvector.adoc.
|
||||
|
||||
allOf:
|
||||
# Zcb depends on Zca
|
||||
- if:
|
||||
|
||||
@@ -14,9 +14,13 @@ maintainers:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- fsl,imx1-rtc
|
||||
- fsl,imx21-rtc
|
||||
oneOf:
|
||||
- const: fsl,imx1-rtc
|
||||
- const: fsl,imx21-rtc
|
||||
- items:
|
||||
- enum:
|
||||
- fsl,imx31-rtc
|
||||
- const: fsl,imx21-rtc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
$id: http://devicetree.org/schemas/sound/ti,pcm1681.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments PCM1681 8-channel PWM Processor
|
||||
title: Texas Instruments PCM1681 8-channel Digital-to-Analog Converter
|
||||
|
||||
maintainers:
|
||||
- Shenghao Ding <shenghao-ding@ti.com>
|
||||
|
||||
@@ -0,0 +1,308 @@
|
||||
=======================
|
||||
DWARF module versioning
|
||||
=======================
|
||||
|
||||
1. Introduction
|
||||
===============
|
||||
|
||||
When CONFIG_MODVERSIONS is enabled, symbol versions for modules
|
||||
are typically calculated from preprocessed source code using the
|
||||
**genksyms** tool. However, this is incompatible with languages such
|
||||
as Rust, where the source code has insufficient information about
|
||||
the resulting ABI. With CONFIG_GENDWARFKSYMS (and CONFIG_DEBUG_INFO)
|
||||
selected, **gendwarfksyms** is used instead to calculate symbol versions
|
||||
from the DWARF debugging information, which contains the necessary
|
||||
details about the final module ABI.
|
||||
|
||||
1.1. Usage
|
||||
==========
|
||||
|
||||
gendwarfksyms accepts a list of object files on the command line, and a
|
||||
list of symbol names (one per line) in standard input::
|
||||
|
||||
Usage: gendwarfksyms [options] elf-object-file ... < symbol-list
|
||||
|
||||
Options:
|
||||
-d, --debug Print debugging information
|
||||
--dump-dies Dump DWARF DIE contents
|
||||
--dump-die-map Print debugging information about die_map changes
|
||||
--dump-types Dump type strings
|
||||
--dump-versions Dump expanded type strings used for symbol versions
|
||||
-s, --stable Support kABI stability features
|
||||
-T, --symtypes file Write a symtypes file
|
||||
-h, --help Print this message
|
||||
|
||||
|
||||
2. Type information availability
|
||||
================================
|
||||
|
||||
While symbols are typically exported in the same translation unit (TU)
|
||||
where they're defined, it's also perfectly fine for a TU to export
|
||||
external symbols. For example, this is done when calculating symbol
|
||||
versions for exports in stand-alone assembly code.
|
||||
|
||||
To ensure the compiler emits the necessary DWARF type information in the
|
||||
TU where symbols are actually exported, gendwarfksyms adds a pointer
|
||||
to exported symbols in the `EXPORT_SYMBOL()` macro using the following
|
||||
macro::
|
||||
|
||||
#define __GENDWARFKSYMS_EXPORT(sym) \
|
||||
static typeof(sym) *__gendwarfksyms_ptr_##sym __used \
|
||||
__section(".discard.gendwarfksyms") = &sym;
|
||||
|
||||
|
||||
When a symbol pointer is found in DWARF, gendwarfksyms can use its
|
||||
type for calculating symbol versions even if the symbol is defined
|
||||
elsewhere. The name of the symbol pointer is expected to start with
|
||||
`__gendwarfksyms_ptr_`, followed by the name of the exported symbol.
|
||||
|
||||
3. Symtypes output format
|
||||
=========================
|
||||
|
||||
Similarly to genksyms, gendwarfksyms supports writing a symtypes
|
||||
file for each processed object that contain types for exported
|
||||
symbols and each referenced type that was used in calculating symbol
|
||||
versions. These files can be useful when trying to determine what
|
||||
exactly caused symbol versions to change between builds. To generate
|
||||
symtypes files during a kernel build, set `KBUILD_SYMTYPES=1`.
|
||||
|
||||
Matching the existing format, the first column of each line contains
|
||||
either a type reference or a symbol name. Type references have a
|
||||
one-letter prefix followed by "#" and the name of the type. Four
|
||||
reference types are supported::
|
||||
|
||||
e#<type> = enum
|
||||
s#<type> = struct
|
||||
t#<type> = typedef
|
||||
u#<type> = union
|
||||
|
||||
Type names with spaces in them are wrapped in single quotes, e.g.::
|
||||
|
||||
s#'core::result::Result<u8, core::num::error::ParseIntError>'
|
||||
|
||||
The rest of the line contains a type string. Unlike with genksyms that
|
||||
produces C-style type strings, gendwarfksyms uses the same simple parsed
|
||||
DWARF format produced by **--dump-dies**, but with type references
|
||||
instead of fully expanded strings.
|
||||
|
||||
4. Maintaining a stable kABI
|
||||
============================
|
||||
|
||||
Distribution maintainers often need the ability to make ABI compatible
|
||||
changes to kernel data structures due to LTS updates or backports. Using
|
||||
the traditional `#ifndef __GENKSYMS__` to hide these changes from symbol
|
||||
versioning won't work when processing object files. To support this
|
||||
use case, gendwarfksyms provides kABI stability features designed to
|
||||
hide changes that won't affect the ABI when calculating versions. These
|
||||
features are all gated behind the **--stable** command line flag and are
|
||||
not used in the mainline kernel. To use stable features during a kernel
|
||||
build, set `KBUILD_GENDWARFKSYMS_STABLE=1`.
|
||||
|
||||
Examples for using these features are provided in the
|
||||
**scripts/gendwarfksyms/examples** directory, including helper macros
|
||||
for source code annotation. Note that as these features are only used to
|
||||
transform the inputs for symbol versioning, the user is responsible for
|
||||
ensuring that their changes actually won't break the ABI.
|
||||
|
||||
4.1. kABI rules
|
||||
===============
|
||||
|
||||
kABI rules allow distributions to fine-tune certain parts
|
||||
of gendwarfksyms output and thus control how symbol
|
||||
versions are calculated. These rules are defined in the
|
||||
`.discard.gendwarfksyms.kabi_rules` section of the object file and
|
||||
consist of simple null-terminated strings with the following structure::
|
||||
|
||||
version\0type\0target\0value\0
|
||||
|
||||
This string sequence is repeated as many times as needed to express all
|
||||
the rules. The fields are as follows:
|
||||
|
||||
- `version`: Ensures backward compatibility for future changes to the
|
||||
structure. Currently expected to be "1".
|
||||
- `type`: Indicates the type of rule being applied.
|
||||
- `target`: Specifies the target of the rule, typically the fully
|
||||
qualified name of the DWARF Debugging Information Entry (DIE).
|
||||
- `value`: Provides rule-specific data.
|
||||
|
||||
The following helper macro, for example, can be used to specify rules
|
||||
in the source code::
|
||||
|
||||
#define __KABI_RULE(hint, target, value) \
|
||||
static const char __PASTE(__gendwarfksyms_rule_, \
|
||||
__COUNTER__)[] __used __aligned(1) \
|
||||
__section(".discard.gendwarfksyms.kabi_rules") = \
|
||||
"1\0" #hint "\0" #target "\0" #value
|
||||
|
||||
|
||||
Currently, only the rules discussed in this section are supported, but
|
||||
the format is extensible enough to allow further rules to be added as
|
||||
need arises.
|
||||
|
||||
4.1.1. Managing definition visibility
|
||||
=====================================
|
||||
|
||||
A declaration can change into a full definition when additional includes
|
||||
are pulled into the translation unit. This changes the versions of any
|
||||
symbol that references the type even if the ABI remains unchanged. As
|
||||
it may not be possible to drop includes without breaking the build, the
|
||||
`declonly` rule can be used to specify a type as declaration-only, even
|
||||
if the debugging information contains the full definition.
|
||||
|
||||
The rule fields are expected to be as follows:
|
||||
|
||||
- `type`: "declonly"
|
||||
- `target`: The fully qualified name of the target data structure
|
||||
(as shown in **--dump-dies** output).
|
||||
- `value`: This field is ignored.
|
||||
|
||||
Using the `__KABI_RULE` macro, this rule can be defined as::
|
||||
|
||||
#define KABI_DECLONLY(fqn) __KABI_RULE(declonly, fqn, )
|
||||
|
||||
Example usage::
|
||||
|
||||
struct s {
|
||||
/* definition */
|
||||
};
|
||||
|
||||
KABI_DECLONLY(s);
|
||||
|
||||
4.1.2. Adding enumerators
|
||||
=========================
|
||||
|
||||
For enums, all enumerators and their values are included in calculating
|
||||
symbol versions, which becomes a problem if we later need to add more
|
||||
enumerators without changing symbol versions. The `enumerator_ignore`
|
||||
rule allows us to hide named enumerators from the input.
|
||||
|
||||
The rule fields are expected to be as follows:
|
||||
|
||||
- `type`: "enumerator_ignore"
|
||||
- `target`: The fully qualified name of the target enum
|
||||
(as shown in **--dump-dies** output) and the name of the
|
||||
enumerator field separated by a space.
|
||||
- `value`: This field is ignored.
|
||||
|
||||
Using the `__KABI_RULE` macro, this rule can be defined as::
|
||||
|
||||
#define KABI_ENUMERATOR_IGNORE(fqn, field) \
|
||||
__KABI_RULE(enumerator_ignore, fqn field, )
|
||||
|
||||
Example usage::
|
||||
|
||||
enum e {
|
||||
A, B, C, D,
|
||||
};
|
||||
|
||||
KABI_ENUMERATOR_IGNORE(e, B);
|
||||
KABI_ENUMERATOR_IGNORE(e, C);
|
||||
|
||||
If the enum additionally includes an end marker and new values must
|
||||
be added in the middle, we may need to use the old value for the last
|
||||
enumerator when calculating versions. The `enumerator_value` rule allows
|
||||
us to override the value of an enumerator for version calculation:
|
||||
|
||||
- `type`: "enumerator_value"
|
||||
- `target`: The fully qualified name of the target enum
|
||||
(as shown in **--dump-dies** output) and the name of the
|
||||
enumerator field separated by a space.
|
||||
- `value`: Integer value used for the field.
|
||||
|
||||
Using the `__KABI_RULE` macro, this rule can be defined as::
|
||||
|
||||
#define KABI_ENUMERATOR_VALUE(fqn, field, value) \
|
||||
__KABI_RULE(enumerator_value, fqn field, value)
|
||||
|
||||
Example usage::
|
||||
|
||||
enum e {
|
||||
A, B, C, LAST,
|
||||
};
|
||||
|
||||
KABI_ENUMERATOR_IGNORE(e, C);
|
||||
KABI_ENUMERATOR_VALUE(e, LAST, 2);
|
||||
|
||||
4.3. Adding structure members
|
||||
=============================
|
||||
|
||||
Perhaps the most common ABI compatible change is adding a member to a
|
||||
kernel data structure. When changes to a structure are anticipated,
|
||||
distribution maintainers can pre-emptively reserve space in the
|
||||
structure and take it into use later without breaking the ABI. If
|
||||
changes are needed to data structures without reserved space, existing
|
||||
alignment holes can potentially be used instead. While kABI rules could
|
||||
be added for these type of changes, using unions is typically a more
|
||||
natural method. This section describes gendwarfksyms support for using
|
||||
reserved space in data structures and hiding members that don't change
|
||||
the ABI when calculating symbol versions.
|
||||
|
||||
4.3.1. Reserving space and replacing members
|
||||
============================================
|
||||
|
||||
Space is typically reserved for later use by appending integer types, or
|
||||
arrays, to the end of the data structure, but any type can be used. Each
|
||||
reserved member needs a unique name, but as the actual purpose is usually
|
||||
not known at the time the space is reserved, for convenience, names that
|
||||
start with `__kabi_` are left out when calculating symbol versions::
|
||||
|
||||
struct s {
|
||||
long a;
|
||||
long __kabi_reserved_0; /* reserved for future use */
|
||||
};
|
||||
|
||||
The reserved space can be taken into use by wrapping the member in a
|
||||
union, which includes the original type and the replacement member::
|
||||
|
||||
struct s {
|
||||
long a;
|
||||
union {
|
||||
long __kabi_reserved_0; /* original type */
|
||||
struct b b; /* replaced field */
|
||||
};
|
||||
};
|
||||
|
||||
If the `__kabi_` naming scheme was used when reserving space, the name
|
||||
of the first member of the union must start with `__kabi_reserved`. This
|
||||
ensures the original type is used when calculating versions, but the name
|
||||
is again left out. The rest of the union is ignored.
|
||||
|
||||
If we're replacing a member that doesn't follow this naming convention,
|
||||
we also need to preserve the original name to avoid changing versions,
|
||||
which we can do by changing the first union member's name to start with
|
||||
`__kabi_renamed` followed by the original name.
|
||||
|
||||
The examples include `KABI_(RESERVE|USE|REPLACE)*` macros that help
|
||||
simplify the process and also ensure the replacement member is correctly
|
||||
aligned and its size won't exceed the reserved space.
|
||||
|
||||
4.3.2. Hiding members
|
||||
=====================
|
||||
|
||||
Predicting which structures will require changes during the support
|
||||
timeframe isn't always possible, in which case one might have to resort
|
||||
to placing new members into existing alignment holes::
|
||||
|
||||
struct s {
|
||||
int a;
|
||||
/* a 4-byte alignment hole */
|
||||
unsigned long b;
|
||||
};
|
||||
|
||||
|
||||
While this won't change the size of the data structure, one needs to
|
||||
be able to hide the added members from symbol versioning. Similarly
|
||||
to reserved fields, this can be accomplished by wrapping the added
|
||||
member to a union where one of the fields has a name starting with
|
||||
`__kabi_ignored`::
|
||||
|
||||
struct s {
|
||||
int a;
|
||||
union {
|
||||
char __kabi_ignored_0;
|
||||
int n;
|
||||
};
|
||||
unsigned long b;
|
||||
};
|
||||
|
||||
With **--stable**, both versions produce the same symbol version.
|
||||
@@ -21,6 +21,7 @@ Kernel Build System
|
||||
reproducible-builds
|
||||
gcc-plugins
|
||||
llvm
|
||||
gendwarfksyms
|
||||
|
||||
.. only:: subproject and html
|
||||
|
||||
|
||||
@@ -423,6 +423,26 @@ Symbols From the Kernel (vmlinux + modules)
|
||||
1) It lists all exported symbols from vmlinux and all modules.
|
||||
2) It lists the CRC if CONFIG_MODVERSIONS is enabled.
|
||||
|
||||
Version Information Formats
|
||||
---------------------------
|
||||
|
||||
Exported symbols have information stored in __ksymtab or __ksymtab_gpl
|
||||
sections. Symbol names and namespaces are stored in __ksymtab_strings,
|
||||
using a format similar to the string table used for ELF. If
|
||||
CONFIG_MODVERSIONS is enabled, the CRCs corresponding to exported
|
||||
symbols will be added to the __kcrctab or __kcrctab_gpl.
|
||||
|
||||
If CONFIG_BASIC_MODVERSIONS is enabled (default with
|
||||
CONFIG_MODVERSIONS), imported symbols will have their symbol name and
|
||||
CRC stored in the __versions section of the importing module. This
|
||||
mode only supports symbols of length up to 64 bytes.
|
||||
|
||||
If CONFIG_EXTENDED_MODVERSIONS is enabled (required to enable both
|
||||
CONFIG_MODVERSIONS and CONFIG_RUST at the same time), imported symbols
|
||||
will have their symbol name recorded in the __version_ext_names
|
||||
section as a series of concatenated, null-terminated strings. CRCs for
|
||||
these symbols will be recorded in the __version_ext_crcs section.
|
||||
|
||||
Symbols and External Modules
|
||||
----------------------------
|
||||
|
||||
|
||||
@@ -59,7 +59,6 @@ iptables 1.4.2 iptables -V
|
||||
openssl & libcrypto 1.0.0 openssl version
|
||||
bc 1.06.95 bc --version
|
||||
Sphinx\ [#f1]_ 2.4.4 sphinx-build --version
|
||||
cpio any cpio --version
|
||||
GNU tar 1.28 tar --version
|
||||
gtags (optional) 6.6.5 gtags --version
|
||||
mkimage (optional) 2017.01 mkimage --version
|
||||
@@ -536,11 +535,6 @@ mcelog
|
||||
|
||||
- <https://www.mcelog.org/>
|
||||
|
||||
cpio
|
||||
----
|
||||
|
||||
- <https://www.gnu.org/software/cpio/>
|
||||
|
||||
Networking
|
||||
**********
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ Traducción al español
|
||||
|
||||
\kerneldocCJKoff
|
||||
|
||||
:maintainer: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
:maintainer: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
|
||||
.. _sp_disclaimer:
|
||||
|
||||
|
||||
+58
-6
@@ -1090,7 +1090,7 @@ F: drivers/video/fbdev/geode/
|
||||
|
||||
AMD HSMP DRIVER
|
||||
M: Naveen Krishna Chatradhi <naveenkrishna.chatradhi@amd.com>
|
||||
R: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
R: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/arch/x86/amd_hsmp.rst
|
||||
@@ -5857,7 +5857,7 @@ F: drivers/usb/atm/cxacru.c
|
||||
|
||||
CONFIDENTIAL COMPUTING THREAT MODEL FOR X86 VIRTUALIZATION (SNP/TDX)
|
||||
M: Elena Reshetova <elena.reshetova@intel.com>
|
||||
M: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
M: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
S: Maintained
|
||||
F: Documentation/security/snp-tdx-threat-model.rst
|
||||
|
||||
@@ -9641,6 +9641,13 @@ W: https://linuxtv.org
|
||||
T: git git://linuxtv.org/media.git
|
||||
F: drivers/media/radio/radio-gemtek*
|
||||
|
||||
GENDWARFKSYMS
|
||||
M: Sami Tolvanen <samitolvanen@google.com>
|
||||
L: linux-modules@vger.kernel.org
|
||||
L: linux-kbuild@vger.kernel.org
|
||||
S: Maintained
|
||||
F: scripts/gendwarfksyms/
|
||||
|
||||
GENERIC ARCHITECTURE TOPOLOGY
|
||||
M: Sudeep Holla <sudeep.holla@arm.com>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
@@ -11324,7 +11331,7 @@ S: Orphan
|
||||
F: drivers/video/fbdev/imsttfb.c
|
||||
|
||||
INDEX OF FURTHER KERNEL DOCUMENTATION
|
||||
M: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
M: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
S: Maintained
|
||||
F: Documentation/process/kernel-docs.rst
|
||||
|
||||
@@ -16455,6 +16462,22 @@ F: include/net/dsa.h
|
||||
F: net/dsa/
|
||||
F: tools/testing/selftests/drivers/net/dsa/
|
||||
|
||||
NETWORKING [ETHTOOL]
|
||||
M: Andrew Lunn <andrew@lunn.ch>
|
||||
M: Jakub Kicinski <kuba@kernel.org>
|
||||
F: Documentation/netlink/specs/ethtool.yaml
|
||||
F: Documentation/networking/ethtool-netlink.rst
|
||||
F: include/linux/ethtool*
|
||||
F: include/uapi/linux/ethtool*
|
||||
F: net/ethtool/
|
||||
F: tools/testing/selftests/drivers/net/*/ethtool*
|
||||
|
||||
NETWORKING [ETHTOOL CABLE TEST]
|
||||
M: Andrew Lunn <andrew@lunn.ch>
|
||||
F: net/ethtool/cabletest.c
|
||||
F: tools/testing/selftests/drivers/net/*/ethtool*
|
||||
K: cable_test
|
||||
|
||||
NETWORKING [GENERAL]
|
||||
M: "David S. Miller" <davem@davemloft.net>
|
||||
M: Eric Dumazet <edumazet@google.com>
|
||||
@@ -16614,6 +16637,7 @@ F: tools/testing/selftests/net/mptcp/
|
||||
NETWORKING [TCP]
|
||||
M: Eric Dumazet <edumazet@google.com>
|
||||
M: Neal Cardwell <ncardwell@google.com>
|
||||
R: Kuniyuki Iwashima <kuniyu@amazon.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/networking/net_cachelines/tcp_sock.rst
|
||||
@@ -16641,6 +16665,31 @@ F: include/net/tls.h
|
||||
F: include/uapi/linux/tls.h
|
||||
F: net/tls/*
|
||||
|
||||
NETWORKING [SOCKETS]
|
||||
M: Eric Dumazet <edumazet@google.com>
|
||||
M: Kuniyuki Iwashima <kuniyu@amazon.com>
|
||||
M: Paolo Abeni <pabeni@redhat.com>
|
||||
M: Willem de Bruijn <willemb@google.com>
|
||||
S: Maintained
|
||||
F: include/linux/sock_diag.h
|
||||
F: include/linux/socket.h
|
||||
F: include/linux/sockptr.h
|
||||
F: include/net/sock.h
|
||||
F: include/net/sock_reuseport.h
|
||||
F: include/uapi/linux/socket.h
|
||||
F: net/core/*sock*
|
||||
F: net/core/scm.c
|
||||
F: net/socket.c
|
||||
|
||||
NETWORKING [UNIX SOCKETS]
|
||||
M: Kuniyuki Iwashima <kuniyu@amazon.com>
|
||||
S: Maintained
|
||||
F: include/net/af_unix.h
|
||||
F: include/net/netns/unix.h
|
||||
F: include/uapi/linux/unix_diag.h
|
||||
F: net/unix/
|
||||
F: tools/testing/selftests/net/af_unix/
|
||||
|
||||
NETXEN (1/10) GbE SUPPORT
|
||||
M: Manish Chopra <manishc@marvell.com>
|
||||
M: Rahul Verma <rahulv@marvell.com>
|
||||
@@ -17706,6 +17755,7 @@ L: netdev@vger.kernel.org
|
||||
L: dev@openvswitch.org
|
||||
S: Maintained
|
||||
W: http://openvswitch.org
|
||||
F: Documentation/networking/openvswitch.rst
|
||||
F: include/uapi/linux/openvswitch.h
|
||||
F: net/openvswitch/
|
||||
F: tools/testing/selftests/net/openvswitch/
|
||||
@@ -19446,7 +19496,7 @@ F: drivers/misc/fastrpc.c
|
||||
F: include/uapi/misc/fastrpc.h
|
||||
|
||||
QUALCOMM HEXAGON ARCHITECTURE
|
||||
M: Brian Cain <bcain@quicinc.com>
|
||||
M: Brian Cain <brian.cain@oss.qualcomm.com>
|
||||
L: linux-hexagon@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bcain/linux.git
|
||||
@@ -22208,7 +22258,7 @@ Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
F: drivers/media/dvb-frontends/sp2*
|
||||
|
||||
SPANISH DOCUMENTATION
|
||||
M: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
|
||||
M: Carlos Bilbao <carlos.bilbao@kernel.org>
|
||||
R: Avadhut Naik <avadhut.naik@amd.com>
|
||||
S: Maintained
|
||||
F: Documentation/translations/sp_SP/
|
||||
@@ -25732,11 +25782,13 @@ F: arch/x86/entry/vdso/
|
||||
XARRAY
|
||||
M: Matthew Wilcox <willy@infradead.org>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
L: linux-mm@kvack.org
|
||||
S: Supported
|
||||
F: Documentation/core-api/xarray.rst
|
||||
F: include/linux/idr.h
|
||||
F: include/linux/xarray.h
|
||||
F: lib/idr.c
|
||||
F: lib/test_xarray.c
|
||||
F: lib/xarray.c
|
||||
F: tools/testing/radix-tree
|
||||
|
||||
@@ -26216,7 +26268,7 @@ K: zstd
|
||||
|
||||
ZSWAP COMPRESSED SWAP CACHING
|
||||
M: Johannes Weiner <hannes@cmpxchg.org>
|
||||
M: Yosry Ahmed <yosryahmed@google.com>
|
||||
M: Yosry Ahmed <yosry.ahmed@linux.dev>
|
||||
M: Nhat Pham <nphamcs@gmail.com>
|
||||
R: Chengming Zhou <chengming.zhou@linux.dev>
|
||||
L: linux-mm@kvack.org
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 13
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = -rc1
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
+4
-3
@@ -18,6 +18,7 @@ config ARC
|
||||
select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC
|
||||
select ARCH_32BIT_OFF_T
|
||||
select BUILDTIME_TABLE_SORT
|
||||
select GENERIC_BUILTIN_DTB
|
||||
select CLONE_BACKWARDS
|
||||
select COMMON_CLK
|
||||
select DMA_DIRECT_REMAP
|
||||
@@ -550,11 +551,11 @@ config ARC_DBG_JUMP_LABEL
|
||||
part of static keys (jump labels) related code.
|
||||
endif
|
||||
|
||||
config ARC_BUILTIN_DTB_NAME
|
||||
config BUILTIN_DTB_NAME
|
||||
string "Built in DTB"
|
||||
default "nsim_700"
|
||||
help
|
||||
Set the name of the DTB to embed in the vmlinux binary
|
||||
Leaving it blank selects the "nsim_700" dtb.
|
||||
Set the name of the DTB to embed in the vmlinux binary.
|
||||
|
||||
endmenu # "ARC Architecture Configuration"
|
||||
|
||||
|
||||
@@ -82,9 +82,6 @@ KBUILD_CFLAGS += $(cflags-y)
|
||||
KBUILD_AFLAGS += $(KBUILD_CFLAGS)
|
||||
KBUILD_LDFLAGS += $(ldflags-y)
|
||||
|
||||
# w/o this dtb won't embed into kernel binary
|
||||
core-y += arch/arc/boot/dts/
|
||||
|
||||
core-y += arch/arc/plat-sim/
|
||||
core-$(CONFIG_ARC_PLAT_TB10X) += arch/arc/plat-tb10x/
|
||||
core-$(CONFIG_ARC_PLAT_AXS10X) += arch/arc/plat-axs10x/
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Built-in dtb
|
||||
builtindtb-y := nsim_700
|
||||
|
||||
ifneq ($(CONFIG_ARC_BUILTIN_DTB_NAME),)
|
||||
builtindtb-y := $(CONFIG_ARC_BUILTIN_DTB_NAME)
|
||||
endif
|
||||
|
||||
obj-y += $(builtindtb-y).dtb.o
|
||||
dtb-y := $(builtindtb-y).dtb
|
||||
dtb-y := $(addsuffix .dtb, $(CONFIG_BUILTIN_DTB_NAME))
|
||||
|
||||
# for CONFIG_OF_ALL_DTBS test
|
||||
dtb- := $(patsubst $(src)/%.dts,%.dtb, $(wildcard $(src)/*.dts))
|
||||
|
||||
@@ -23,7 +23,7 @@ CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_ARC_PLAT_AXS10X=y
|
||||
CONFIG_AXS101=y
|
||||
CONFIG_ARC_CACHE_LINE_SHIFT=5
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="axs101"
|
||||
CONFIG_BUILTIN_DTB_NAME="axs101"
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_NET=y
|
||||
|
||||
@@ -22,7 +22,7 @@ CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_ARC_PLAT_AXS10X=y
|
||||
CONFIG_AXS103=y
|
||||
CONFIG_ISA_ARCV2=y
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="axs103"
|
||||
CONFIG_BUILTIN_DTB_NAME="axs103"
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_NET=y
|
||||
|
||||
@@ -22,7 +22,7 @@ CONFIG_ARC_PLAT_AXS10X=y
|
||||
CONFIG_AXS103=y
|
||||
CONFIG_ISA_ARCV2=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="axs103_idu"
|
||||
CONFIG_BUILTIN_DTB_NAME="axs103_idu"
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_NET=y
|
||||
|
||||
@@ -14,7 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="haps_hs"
|
||||
CONFIG_BUILTIN_DTB_NAME="haps_hs"
|
||||
CONFIG_MODULES=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_COMPACTION is not set
|
||||
|
||||
@@ -16,7 +16,7 @@ CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_SMP=y
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="haps_hs_idu"
|
||||
CONFIG_BUILTIN_DTB_NAME="haps_hs_idu"
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_MODULES=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
|
||||
@@ -20,7 +20,7 @@ CONFIG_ISA_ARCV2=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_LINUX_LINK_BASE=0x90000000
|
||||
CONFIG_LINUX_RAM_BASE=0x80000000
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="hsdk"
|
||||
CONFIG_BUILTIN_DTB_NAME="hsdk"
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_NET=y
|
||||
|
||||
@@ -17,7 +17,7 @@ CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_ISA_ARCOMPACT=y
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="nsim_700"
|
||||
CONFIG_BUILTIN_DTB_NAME="nsim_700"
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_MODULES=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
|
||||
@@ -19,7 +19,7 @@ CONFIG_ISA_ARCOMPACT=y
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_MODULES=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci"
|
||||
CONFIG_BUILTIN_DTB_NAME="nsimosci"
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
|
||||
@@ -19,7 +19,7 @@ CONFIG_KPROBES=y
|
||||
CONFIG_MODULES=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_ISA_ARCV2=y
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci_hs"
|
||||
CONFIG_BUILTIN_DTB_NAME="nsimosci_hs"
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
|
||||
@@ -16,7 +16,7 @@ CONFIG_MODULES=y
|
||||
CONFIG_ISA_ARCV2=y
|
||||
CONFIG_SMP=y
|
||||
# CONFIG_ARC_TIMERS_64BIT is not set
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci_hs_idu"
|
||||
CONFIG_BUILTIN_DTB_NAME="nsimosci_hs_idu"
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_NET=y
|
||||
|
||||
@@ -26,7 +26,7 @@ CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_ARC_PLAT_TB10X=y
|
||||
CONFIG_ARC_CACHE_LINE_SHIFT=5
|
||||
CONFIG_HZ=250
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="abilis_tb100_dvk"
|
||||
CONFIG_BUILTIN_DTB_NAME="abilis_tb100_dvk"
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_NET=y
|
||||
|
||||
@@ -13,7 +13,7 @@ CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_ARC_PLAT_AXS10X=y
|
||||
CONFIG_AXS103=y
|
||||
CONFIG_ISA_ARCV2=y
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="vdk_hs38"
|
||||
CONFIG_BUILTIN_DTB_NAME="vdk_hs38"
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
|
||||
@@ -15,7 +15,7 @@ CONFIG_AXS103=y
|
||||
CONFIG_ISA_ARCV2=y
|
||||
CONFIG_SMP=y
|
||||
# CONFIG_ARC_TIMERS_64BIT is not set
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME="vdk_hs38_smp"
|
||||
CONFIG_BUILTIN_DTB_NAME="vdk_hs38_smp"
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
|
||||
@@ -56,7 +56,7 @@ __arch_xchg(unsigned long x, volatile void *ptr, int size)
|
||||
__typeof__(ptr) __ptr = (ptr); \
|
||||
__typeof__(*(ptr)) __old = (old); \
|
||||
__typeof__(*(ptr)) __new = (new); \
|
||||
__typeof__(*(ptr)) __oldval = 0; \
|
||||
__typeof__(*(ptr)) __oldval = (__typeof__(*(ptr))) 0; \
|
||||
\
|
||||
asm volatile( \
|
||||
"1: %0 = memw_locked(%1);\n" \
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
* only version 2 as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_HEXAGON_SETUP_H
|
||||
#define _ASM_HEXAGON_SETUP_H
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <uapi/asm/setup.h>
|
||||
|
||||
extern char external_cmdline_buffer;
|
||||
|
||||
void __init setup_arch_memory(void);
|
||||
|
||||
#endif
|
||||
@@ -17,19 +17,9 @@
|
||||
* 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_SETUP_H
|
||||
#define _ASM_SETUP_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/init.h>
|
||||
#else
|
||||
#define __init
|
||||
#endif
|
||||
#ifndef _UAPI_ASM_HEXAGON_SETUP_H
|
||||
#define _UAPI_ASM_HEXAGON_SETUP_H
|
||||
|
||||
#include <asm-generic/setup.h>
|
||||
|
||||
extern char external_cmdline_buffer;
|
||||
|
||||
void __init setup_arch_memory(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -170,8 +170,7 @@ static void __init time_init_deferred(void)
|
||||
|
||||
ce_dev->cpumask = cpu_all_mask;
|
||||
|
||||
if (!resource)
|
||||
resource = rtos_timer_device.resource;
|
||||
resource = rtos_timer_device.resource;
|
||||
|
||||
/* ioremap here means this has to run later, after paging init */
|
||||
rtos_timer = ioremap(resource->start, resource_size(resource));
|
||||
|
||||
@@ -135,7 +135,7 @@ static void do_show_stack(struct task_struct *task, unsigned long *fp,
|
||||
}
|
||||
|
||||
/* Attempt to continue past exception. */
|
||||
if (0 == newfp) {
|
||||
if (!newfp) {
|
||||
struct pt_regs *regs = (struct pt_regs *) (((void *)fp)
|
||||
+ 8);
|
||||
|
||||
@@ -195,8 +195,10 @@ int die(const char *str, struct pt_regs *regs, long err)
|
||||
printk(KERN_EMERG "Oops: %s[#%d]:\n", str, ++die.counter);
|
||||
|
||||
if (notify_die(DIE_OOPS, str, regs, err, pt_cause(regs), SIGSEGV) ==
|
||||
NOTIFY_STOP)
|
||||
NOTIFY_STOP) {
|
||||
spin_unlock_irq(&die.lock);
|
||||
return 1;
|
||||
}
|
||||
|
||||
print_modules();
|
||||
show_regs(regs);
|
||||
|
||||
@@ -626,6 +626,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -583,6 +583,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -603,6 +603,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -575,6 +575,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -585,6 +585,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -602,6 +602,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -689,6 +689,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -575,6 +575,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -576,6 +576,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -592,6 +592,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -572,6 +572,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -573,6 +573,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -382,15 +382,15 @@
|
||||
368 o32 io_pgetevents sys_io_pgetevents_time32 compat_sys_io_pgetevents
|
||||
# room for arch specific calls
|
||||
393 o32 semget sys_semget
|
||||
394 o32 semctl sys_old_semctl compat_sys_old_semctl
|
||||
394 o32 semctl sys_semctl compat_sys_semctl
|
||||
395 o32 shmget sys_shmget
|
||||
396 o32 shmctl sys_old_shmctl compat_sys_old_shmctl
|
||||
396 o32 shmctl sys_shmctl compat_sys_shmctl
|
||||
397 o32 shmat sys_shmat compat_sys_shmat
|
||||
398 o32 shmdt sys_shmdt
|
||||
399 o32 msgget sys_msgget
|
||||
400 o32 msgsnd sys_msgsnd compat_sys_msgsnd
|
||||
401 o32 msgrcv sys_msgrcv compat_sys_msgrcv
|
||||
402 o32 msgctl sys_old_msgctl compat_sys_old_msgctl
|
||||
402 o32 msgctl sys_msgctl compat_sys_msgctl
|
||||
403 o32 clock_gettime64 sys_clock_gettime sys_clock_gettime
|
||||
404 o32 clock_settime64 sys_clock_settime sys_clock_settime
|
||||
405 o32 clock_adjtime64 sys_clock_adjtime sys_clock_adjtime
|
||||
|
||||
@@ -448,6 +448,7 @@ CONFIG_TEST_PRINTF=m
|
||||
CONFIG_TEST_SCANF=m
|
||||
CONFIG_TEST_BITMAP=m
|
||||
CONFIG_TEST_UUID=m
|
||||
CONFIG_TEST_XARRAY=m
|
||||
CONFIG_TEST_MAPLE_TREE=m
|
||||
CONFIG_TEST_RHASHTABLE=m
|
||||
CONFIG_TEST_IDA=m
|
||||
|
||||
@@ -369,6 +369,24 @@ static void dedotify_versions(struct modversion_info *vers,
|
||||
}
|
||||
}
|
||||
|
||||
/* Same as normal versions, remove a leading dot if present. */
|
||||
static void dedotify_ext_version_names(char *str_seq, unsigned long size)
|
||||
{
|
||||
unsigned long out = 0;
|
||||
unsigned long in;
|
||||
char last = '\0';
|
||||
|
||||
for (in = 0; in < size; in++) {
|
||||
/* Skip one leading dot */
|
||||
if (last == '\0' && str_seq[in] == '.')
|
||||
in++;
|
||||
last = str_seq[in];
|
||||
str_seq[out++] = last;
|
||||
}
|
||||
/* Zero the trailing portion of the names table for robustness */
|
||||
memset(&str_seq[out], 0, size - out);
|
||||
}
|
||||
|
||||
/*
|
||||
* Undefined symbols which refer to .funcname, hack to funcname. Make .TOC.
|
||||
* seem to be defined (value set later).
|
||||
@@ -438,10 +456,12 @@ int module_frob_arch_sections(Elf64_Ehdr *hdr,
|
||||
me->arch.toc_section = i;
|
||||
if (sechdrs[i].sh_addralign < 8)
|
||||
sechdrs[i].sh_addralign = 8;
|
||||
}
|
||||
else if (strcmp(secstrings+sechdrs[i].sh_name,"__versions")==0)
|
||||
} else if (strcmp(secstrings + sechdrs[i].sh_name, "__versions") == 0)
|
||||
dedotify_versions((void *)hdr + sechdrs[i].sh_offset,
|
||||
sechdrs[i].sh_size);
|
||||
else if (strcmp(secstrings + sechdrs[i].sh_name, "__version_ext_names") == 0)
|
||||
dedotify_ext_version_names((void *)hdr + sechdrs[i].sh_offset,
|
||||
sechdrs[i].sh_size);
|
||||
|
||||
if (sechdrs[i].sh_type == SHT_SYMTAB)
|
||||
dedotify((void *)hdr + sechdrs[i].sh_offset,
|
||||
|
||||
@@ -119,4 +119,15 @@ config ERRATA_THEAD_PMU
|
||||
|
||||
If you don't know what to do here, say "Y".
|
||||
|
||||
config ERRATA_THEAD_GHOSTWRITE
|
||||
bool "Apply T-Head Ghostwrite errata"
|
||||
depends on ERRATA_THEAD && RISCV_ISA_XTHEADVECTOR
|
||||
default y
|
||||
help
|
||||
The T-Head C9xx cores have a vulnerability in the xtheadvector
|
||||
instruction set. When this errata is enabled, the CPUs will be probed
|
||||
to determine if they are vulnerable and disable xtheadvector.
|
||||
|
||||
If you don't know what to do here, say "Y".
|
||||
|
||||
endmenu # "CPU errata selection"
|
||||
|
||||
@@ -16,4 +16,30 @@ config RISCV_ISA_VENDOR_EXT_ANDES
|
||||
If you don't know what to do here, say Y.
|
||||
endmenu
|
||||
|
||||
menu "T-Head"
|
||||
config RISCV_ISA_VENDOR_EXT_THEAD
|
||||
bool "T-Head vendor extension support"
|
||||
select RISCV_ISA_VENDOR_EXT
|
||||
default y
|
||||
help
|
||||
Say N here to disable detection of and support for all T-Head vendor
|
||||
extensions. Without this option enabled, T-Head vendor extensions will
|
||||
not be detected at boot and their presence not reported to userspace.
|
||||
|
||||
If you don't know what to do here, say Y.
|
||||
|
||||
config RISCV_ISA_XTHEADVECTOR
|
||||
bool "xtheadvector extension support"
|
||||
depends on RISCV_ISA_VENDOR_EXT_THEAD
|
||||
depends on RISCV_ISA_V
|
||||
depends on FPU
|
||||
default y
|
||||
help
|
||||
Say N here if you want to disable all xtheadvector related procedures
|
||||
in the kernel. This will disable vector for any T-Head board that
|
||||
contains xtheadvector rather than the standard vector.
|
||||
|
||||
If you don't know what to do here, say Y.
|
||||
endmenu
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -10,6 +10,7 @@ __archpost:
|
||||
|
||||
-include include/config/auto.conf
|
||||
include $(srctree)/scripts/Kbuild.include
|
||||
include $(srctree)/scripts/Makefile.lib
|
||||
|
||||
quiet_cmd_relocs_check = CHKREL $@
|
||||
cmd_relocs_check = \
|
||||
@@ -19,11 +20,6 @@ ifdef CONFIG_RELOCATABLE
|
||||
quiet_cmd_cp_vmlinux_relocs = CPREL vmlinux.relocs
|
||||
cmd_cp_vmlinux_relocs = cp vmlinux vmlinux.relocs
|
||||
|
||||
quiet_cmd_relocs_strip = STRIPREL $@
|
||||
cmd_relocs_strip = $(OBJCOPY) --remove-section='.rel.*' \
|
||||
--remove-section='.rel__*' \
|
||||
--remove-section='.rela.*' \
|
||||
--remove-section='.rela__*' $@
|
||||
endif
|
||||
|
||||
# `@true` prevents complaint when there is nothing to be done
|
||||
@@ -33,7 +29,7 @@ vmlinux: FORCE
|
||||
ifdef CONFIG_RELOCATABLE
|
||||
$(call if_changed,relocs_check)
|
||||
$(call if_changed,cp_vmlinux_relocs)
|
||||
$(call if_changed,relocs_strip)
|
||||
$(call if_changed,strip_relocs)
|
||||
endif
|
||||
|
||||
clean:
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
riscv,isa = "rv64imafdc";
|
||||
riscv,isa-base = "rv64i";
|
||||
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "zicntr", "zicsr",
|
||||
"zifencei", "zihpm";
|
||||
"zifencei", "zihpm", "xtheadvector";
|
||||
thead,vlenb = <128>;
|
||||
#cooling-cells = <2>;
|
||||
|
||||
cpu0_intc: interrupt-controller {
|
||||
|
||||
@@ -10,7 +10,6 @@ CONFIG_MEMCG=y
|
||||
CONFIG_BLK_CGROUP=y
|
||||
CONFIG_CGROUP_SCHED=y
|
||||
CONFIG_CFS_BANDWIDTH=y
|
||||
CONFIG_RT_GROUP_SCHED=y
|
||||
CONFIG_CGROUP_PIDS=y
|
||||
CONFIG_CGROUP_FREEZER=y
|
||||
CONFIG_CGROUP_HUGETLB=y
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/bugs.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/dma-noncoherent.h>
|
||||
@@ -142,6 +143,31 @@ static bool errata_probe_pmu(unsigned int stage,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool errata_probe_ghostwrite(unsigned int stage,
|
||||
unsigned long arch_id, unsigned long impid)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_ERRATA_THEAD_GHOSTWRITE))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* target-c9xx cores report arch_id and impid as 0
|
||||
*
|
||||
* While ghostwrite may not affect all c9xx cores that implement
|
||||
* xtheadvector, there is no futher granularity than c9xx. Assume
|
||||
* vulnerable for this entire class of processors when xtheadvector is
|
||||
* enabled.
|
||||
*/
|
||||
if (arch_id != 0 || impid != 0)
|
||||
return false;
|
||||
|
||||
if (stage != RISCV_ALTERNATIVES_EARLY_BOOT)
|
||||
return false;
|
||||
|
||||
ghostwrite_set_vulnerable();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static u32 thead_errata_probe(unsigned int stage,
|
||||
unsigned long archid, unsigned long impid)
|
||||
{
|
||||
@@ -155,6 +181,8 @@ static u32 thead_errata_probe(unsigned int stage,
|
||||
if (errata_probe_pmu(stage, archid, impid))
|
||||
cpu_req_errata |= BIT(ERRATA_THEAD_PMU);
|
||||
|
||||
errata_probe_ghostwrite(stage, archid, impid);
|
||||
|
||||
return cpu_req_errata;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Interface for managing mitigations for riscv vulnerabilities.
|
||||
*
|
||||
* Copyright (C) 2024 Rivos Inc.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_BUGS_H
|
||||
#define __ASM_BUGS_H
|
||||
|
||||
/* Watch out, ordering is important here. */
|
||||
enum mitigation_state {
|
||||
UNAFFECTED,
|
||||
MITIGATED,
|
||||
VULNERABLE,
|
||||
};
|
||||
|
||||
void ghostwrite_set_vulnerable(void);
|
||||
bool ghostwrite_enable_mitigation(void);
|
||||
enum mitigation_state ghostwrite_get_state(void);
|
||||
|
||||
#endif /* __ASM_BUGS_H */
|
||||
@@ -34,6 +34,8 @@ DECLARE_PER_CPU(struct riscv_cpuinfo, riscv_cpuinfo);
|
||||
/* Per-cpu ISA extensions. */
|
||||
extern struct riscv_isainfo hart_isa[NR_CPUS];
|
||||
|
||||
extern u32 thead_vlenb_of;
|
||||
|
||||
void __init riscv_user_isa_enable(void);
|
||||
|
||||
#define _RISCV_ISA_EXT_DATA(_name, _id, _subset_exts, _subset_exts_size, _validate) { \
|
||||
|
||||
@@ -30,6 +30,12 @@
|
||||
#define SR_VS_CLEAN _AC(0x00000400, UL)
|
||||
#define SR_VS_DIRTY _AC(0x00000600, UL)
|
||||
|
||||
#define SR_VS_THEAD _AC(0x01800000, UL) /* xtheadvector Status */
|
||||
#define SR_VS_OFF_THEAD _AC(0x00000000, UL)
|
||||
#define SR_VS_INITIAL_THEAD _AC(0x00800000, UL)
|
||||
#define SR_VS_CLEAN_THEAD _AC(0x01000000, UL)
|
||||
#define SR_VS_DIRTY_THEAD _AC(0x01800000, UL)
|
||||
|
||||
#define SR_XS _AC(0x00018000, UL) /* Extension Status */
|
||||
#define SR_XS_OFF _AC(0x00000000, UL)
|
||||
#define SR_XS_INITIAL _AC(0x00008000, UL)
|
||||
@@ -315,6 +321,15 @@
|
||||
#define CSR_STIMECMP 0x14D
|
||||
#define CSR_STIMECMPH 0x15D
|
||||
|
||||
/* xtheadvector symbolic CSR names */
|
||||
#define CSR_VXSAT 0x9
|
||||
#define CSR_VXRM 0xa
|
||||
|
||||
/* xtheadvector CSR masks */
|
||||
#define CSR_VXRM_MASK 3
|
||||
#define CSR_VXRM_SHIFT 1
|
||||
#define CSR_VXSAT_MASK 1
|
||||
|
||||
/* Supervisor-Level Window to Indirectly Accessed Registers (AIA) */
|
||||
#define CSR_SISELECT 0x150
|
||||
#define CSR_SIREG 0x151
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
#ifdef CONFIG_ERRATA_THEAD
|
||||
#define ERRATA_THEAD_MAE 0
|
||||
#define ERRATA_THEAD_PMU 1
|
||||
#define ERRATA_THEAD_NUMBER 2
|
||||
#define ERRATA_THEAD_GHOSTWRITE 2
|
||||
#define ERRATA_THEAD_NUMBER 3
|
||||
#endif
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
|
||||
@@ -85,7 +85,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
||||
|
||||
__enable_user_access();
|
||||
__asm__ __volatile__ (
|
||||
"1: lr.w.aqrl %[v],%[u] \n"
|
||||
"1: lr.w %[v],%[u] \n"
|
||||
" bne %[v],%z[ov],3f \n"
|
||||
"2: sc.w.aqrl %[t],%z[nv],%[u] \n"
|
||||
" bnez %[t],1b \n"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* Copyright 2023 Rivos, Inc
|
||||
* Copyright 2023-2024 Rivos, Inc
|
||||
*/
|
||||
|
||||
#ifndef _ASM_HWPROBE_H
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#include <uapi/asm/hwprobe.h>
|
||||
|
||||
#define RISCV_HWPROBE_MAX_KEY 10
|
||||
#define RISCV_HWPROBE_MAX_KEY 11
|
||||
|
||||
static inline bool riscv_hwprobe_key_is_valid(__s64 key)
|
||||
{
|
||||
@@ -21,6 +21,7 @@ static inline bool hwprobe_key_is_bitmask(__s64 key)
|
||||
case RISCV_HWPROBE_KEY_BASE_BEHAVIOR:
|
||||
case RISCV_HWPROBE_KEY_IMA_EXT_0:
|
||||
case RISCV_HWPROBE_KEY_CPUPERF_0:
|
||||
case RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0:
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ do { \
|
||||
__set_prev_cpu(__prev->thread); \
|
||||
if (has_fpu()) \
|
||||
__switch_to_fpu(__prev, __next); \
|
||||
if (has_vector()) \
|
||||
if (has_vector() || has_xtheadvector()) \
|
||||
__switch_to_vector(__prev, __next); \
|
||||
if (switch_to_should_flush_icache(__next)) \
|
||||
local_flush_icache_all(); \
|
||||
|
||||
+173
-49
@@ -18,6 +18,27 @@
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/csr.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/vendorid_list.h>
|
||||
#include <asm/vendor_extensions.h>
|
||||
#include <asm/vendor_extensions/thead.h>
|
||||
|
||||
#define __riscv_v_vstate_or(_val, TYPE) ({ \
|
||||
typeof(_val) _res = _val; \
|
||||
if (has_xtheadvector()) \
|
||||
_res = (_res & ~SR_VS_THEAD) | SR_VS_##TYPE##_THEAD; \
|
||||
else \
|
||||
_res = (_res & ~SR_VS) | SR_VS_##TYPE; \
|
||||
_res; \
|
||||
})
|
||||
|
||||
#define __riscv_v_vstate_check(_val, TYPE) ({ \
|
||||
bool _res; \
|
||||
if (has_xtheadvector()) \
|
||||
_res = ((_val) & SR_VS_THEAD) == SR_VS_##TYPE##_THEAD; \
|
||||
else \
|
||||
_res = ((_val) & SR_VS) == SR_VS_##TYPE; \
|
||||
_res; \
|
||||
})
|
||||
|
||||
extern unsigned long riscv_v_vsize;
|
||||
int riscv_v_setup_vsize(void);
|
||||
@@ -41,39 +62,62 @@ static __always_inline bool has_vector(void)
|
||||
return riscv_has_extension_unlikely(RISCV_ISA_EXT_ZVE32X);
|
||||
}
|
||||
|
||||
static __always_inline bool has_xtheadvector_no_alternatives(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR))
|
||||
return riscv_isa_vendor_extension_available(THEAD_VENDOR_ID, XTHEADVECTOR);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
static __always_inline bool has_xtheadvector(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR))
|
||||
return riscv_has_vendor_extension_unlikely(THEAD_VENDOR_ID,
|
||||
RISCV_ISA_VENDOR_EXT_XTHEADVECTOR);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void __riscv_v_vstate_clean(struct pt_regs *regs)
|
||||
{
|
||||
regs->status = (regs->status & ~SR_VS) | SR_VS_CLEAN;
|
||||
regs->status = __riscv_v_vstate_or(regs->status, CLEAN);
|
||||
}
|
||||
|
||||
static inline void __riscv_v_vstate_dirty(struct pt_regs *regs)
|
||||
{
|
||||
regs->status = (regs->status & ~SR_VS) | SR_VS_DIRTY;
|
||||
regs->status = __riscv_v_vstate_or(regs->status, DIRTY);
|
||||
}
|
||||
|
||||
static inline void riscv_v_vstate_off(struct pt_regs *regs)
|
||||
{
|
||||
regs->status = (regs->status & ~SR_VS) | SR_VS_OFF;
|
||||
regs->status = __riscv_v_vstate_or(regs->status, OFF);
|
||||
}
|
||||
|
||||
static inline void riscv_v_vstate_on(struct pt_regs *regs)
|
||||
{
|
||||
regs->status = (regs->status & ~SR_VS) | SR_VS_INITIAL;
|
||||
regs->status = __riscv_v_vstate_or(regs->status, INITIAL);
|
||||
}
|
||||
|
||||
static inline bool riscv_v_vstate_query(struct pt_regs *regs)
|
||||
{
|
||||
return (regs->status & SR_VS) != 0;
|
||||
return !__riscv_v_vstate_check(regs->status, OFF);
|
||||
}
|
||||
|
||||
static __always_inline void riscv_v_enable(void)
|
||||
{
|
||||
csr_set(CSR_SSTATUS, SR_VS);
|
||||
if (has_xtheadvector())
|
||||
csr_set(CSR_SSTATUS, SR_VS_THEAD);
|
||||
else
|
||||
csr_set(CSR_SSTATUS, SR_VS);
|
||||
}
|
||||
|
||||
static __always_inline void riscv_v_disable(void)
|
||||
{
|
||||
csr_clear(CSR_SSTATUS, SR_VS);
|
||||
if (has_xtheadvector())
|
||||
csr_clear(CSR_SSTATUS, SR_VS_THEAD);
|
||||
else
|
||||
csr_clear(CSR_SSTATUS, SR_VS);
|
||||
}
|
||||
|
||||
static __always_inline void __vstate_csr_save(struct __riscv_v_ext_state *dest)
|
||||
@@ -82,10 +126,36 @@ static __always_inline void __vstate_csr_save(struct __riscv_v_ext_state *dest)
|
||||
"csrr %0, " __stringify(CSR_VSTART) "\n\t"
|
||||
"csrr %1, " __stringify(CSR_VTYPE) "\n\t"
|
||||
"csrr %2, " __stringify(CSR_VL) "\n\t"
|
||||
"csrr %3, " __stringify(CSR_VCSR) "\n\t"
|
||||
"csrr %4, " __stringify(CSR_VLENB) "\n\t"
|
||||
: "=r" (dest->vstart), "=r" (dest->vtype), "=r" (dest->vl),
|
||||
"=r" (dest->vcsr), "=r" (dest->vlenb) : :);
|
||||
"=r" (dest->vcsr) : :);
|
||||
|
||||
if (has_xtheadvector()) {
|
||||
unsigned long status;
|
||||
|
||||
/*
|
||||
* CSR_VCSR is defined as
|
||||
* [2:1] - vxrm[1:0]
|
||||
* [0] - vxsat
|
||||
* The earlier vector spec implemented by T-Head uses separate
|
||||
* registers for the same bit-elements, so just combine those
|
||||
* into the existing output field.
|
||||
*
|
||||
* Additionally T-Head cores need FS to be enabled when accessing
|
||||
* the VXRM and VXSAT CSRs, otherwise ending in illegal instructions.
|
||||
* Though the cores do not implement the VXRM and VXSAT fields in the
|
||||
* FCSR CSR that vector-0.7.1 specifies.
|
||||
*/
|
||||
status = csr_read_set(CSR_STATUS, SR_FS_DIRTY);
|
||||
dest->vcsr = csr_read(CSR_VXSAT) | csr_read(CSR_VXRM) << CSR_VXRM_SHIFT;
|
||||
|
||||
dest->vlenb = riscv_v_vsize / 32;
|
||||
|
||||
if ((status & SR_FS) != SR_FS_DIRTY)
|
||||
csr_write(CSR_STATUS, status);
|
||||
} else {
|
||||
dest->vcsr = csr_read(CSR_VCSR);
|
||||
dest->vlenb = csr_read(CSR_VLENB);
|
||||
}
|
||||
}
|
||||
|
||||
static __always_inline void __vstate_csr_restore(struct __riscv_v_ext_state *src)
|
||||
@@ -96,9 +166,25 @@ static __always_inline void __vstate_csr_restore(struct __riscv_v_ext_state *src
|
||||
"vsetvl x0, %2, %1\n\t"
|
||||
".option pop\n\t"
|
||||
"csrw " __stringify(CSR_VSTART) ", %0\n\t"
|
||||
"csrw " __stringify(CSR_VCSR) ", %3\n\t"
|
||||
: : "r" (src->vstart), "r" (src->vtype), "r" (src->vl),
|
||||
"r" (src->vcsr) :);
|
||||
: : "r" (src->vstart), "r" (src->vtype), "r" (src->vl));
|
||||
|
||||
if (has_xtheadvector()) {
|
||||
unsigned long status = csr_read(CSR_SSTATUS);
|
||||
|
||||
/*
|
||||
* Similar to __vstate_csr_save above, restore values for the
|
||||
* separate VXRM and VXSAT CSRs from the vcsr variable.
|
||||
*/
|
||||
status = csr_read_set(CSR_STATUS, SR_FS_DIRTY);
|
||||
|
||||
csr_write(CSR_VXRM, (src->vcsr >> CSR_VXRM_SHIFT) & CSR_VXRM_MASK);
|
||||
csr_write(CSR_VXSAT, src->vcsr & CSR_VXSAT_MASK);
|
||||
|
||||
if ((status & SR_FS) != SR_FS_DIRTY)
|
||||
csr_write(CSR_STATUS, status);
|
||||
} else {
|
||||
csr_write(CSR_VCSR, src->vcsr);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void __riscv_v_vstate_save(struct __riscv_v_ext_state *save_to,
|
||||
@@ -108,19 +194,33 @@ static inline void __riscv_v_vstate_save(struct __riscv_v_ext_state *save_to,
|
||||
|
||||
riscv_v_enable();
|
||||
__vstate_csr_save(save_to);
|
||||
asm volatile (
|
||||
".option push\n\t"
|
||||
".option arch, +zve32x\n\t"
|
||||
"vsetvli %0, x0, e8, m8, ta, ma\n\t"
|
||||
"vse8.v v0, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vse8.v v8, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vse8.v v16, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vse8.v v24, (%1)\n\t"
|
||||
".option pop\n\t"
|
||||
: "=&r" (vl) : "r" (datap) : "memory");
|
||||
if (has_xtheadvector()) {
|
||||
asm volatile (
|
||||
"mv t0, %0\n\t"
|
||||
THEAD_VSETVLI_T4X0E8M8D1
|
||||
THEAD_VSB_V_V0T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VSB_V_V0T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VSB_V_V0T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VSB_V_V0T0
|
||||
: : "r" (datap) : "memory", "t0", "t4");
|
||||
} else {
|
||||
asm volatile (
|
||||
".option push\n\t"
|
||||
".option arch, +zve32x\n\t"
|
||||
"vsetvli %0, x0, e8, m8, ta, ma\n\t"
|
||||
"vse8.v v0, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vse8.v v8, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vse8.v v16, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vse8.v v24, (%1)\n\t"
|
||||
".option pop\n\t"
|
||||
: "=&r" (vl) : "r" (datap) : "memory");
|
||||
}
|
||||
riscv_v_disable();
|
||||
}
|
||||
|
||||
@@ -130,19 +230,33 @@ static inline void __riscv_v_vstate_restore(struct __riscv_v_ext_state *restore_
|
||||
unsigned long vl;
|
||||
|
||||
riscv_v_enable();
|
||||
asm volatile (
|
||||
".option push\n\t"
|
||||
".option arch, +zve32x\n\t"
|
||||
"vsetvli %0, x0, e8, m8, ta, ma\n\t"
|
||||
"vle8.v v0, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vle8.v v8, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vle8.v v16, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vle8.v v24, (%1)\n\t"
|
||||
".option pop\n\t"
|
||||
: "=&r" (vl) : "r" (datap) : "memory");
|
||||
if (has_xtheadvector()) {
|
||||
asm volatile (
|
||||
"mv t0, %0\n\t"
|
||||
THEAD_VSETVLI_T4X0E8M8D1
|
||||
THEAD_VLB_V_V0T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VLB_V_V0T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VLB_V_V0T0
|
||||
"add t0, t0, t4\n\t"
|
||||
THEAD_VLB_V_V0T0
|
||||
: : "r" (datap) : "memory", "t0", "t4");
|
||||
} else {
|
||||
asm volatile (
|
||||
".option push\n\t"
|
||||
".option arch, +zve32x\n\t"
|
||||
"vsetvli %0, x0, e8, m8, ta, ma\n\t"
|
||||
"vle8.v v0, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vle8.v v8, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vle8.v v16, (%1)\n\t"
|
||||
"add %1, %1, %0\n\t"
|
||||
"vle8.v v24, (%1)\n\t"
|
||||
".option pop\n\t"
|
||||
: "=&r" (vl) : "r" (datap) : "memory");
|
||||
}
|
||||
__vstate_csr_restore(restore_from);
|
||||
riscv_v_disable();
|
||||
}
|
||||
@@ -152,33 +266,41 @@ static inline void __riscv_v_vstate_discard(void)
|
||||
unsigned long vl, vtype_inval = 1UL << (BITS_PER_LONG - 1);
|
||||
|
||||
riscv_v_enable();
|
||||
if (has_xtheadvector())
|
||||
asm volatile (THEAD_VSETVLI_T4X0E8M8D1 : : : "t4");
|
||||
else
|
||||
asm volatile (
|
||||
".option push\n\t"
|
||||
".option arch, +zve32x\n\t"
|
||||
"vsetvli %0, x0, e8, m8, ta, ma\n\t"
|
||||
".option pop\n\t": "=&r" (vl));
|
||||
|
||||
asm volatile (
|
||||
".option push\n\t"
|
||||
".option arch, +zve32x\n\t"
|
||||
"vsetvli %0, x0, e8, m8, ta, ma\n\t"
|
||||
"vmv.v.i v0, -1\n\t"
|
||||
"vmv.v.i v8, -1\n\t"
|
||||
"vmv.v.i v16, -1\n\t"
|
||||
"vmv.v.i v24, -1\n\t"
|
||||
"vsetvl %0, x0, %1\n\t"
|
||||
".option pop\n\t"
|
||||
: "=&r" (vl) : "r" (vtype_inval) : "memory");
|
||||
: "=&r" (vl) : "r" (vtype_inval));
|
||||
|
||||
riscv_v_disable();
|
||||
}
|
||||
|
||||
static inline void riscv_v_vstate_discard(struct pt_regs *regs)
|
||||
{
|
||||
if ((regs->status & SR_VS) == SR_VS_OFF)
|
||||
return;
|
||||
|
||||
__riscv_v_vstate_discard();
|
||||
__riscv_v_vstate_dirty(regs);
|
||||
if (riscv_v_vstate_query(regs)) {
|
||||
__riscv_v_vstate_discard();
|
||||
__riscv_v_vstate_dirty(regs);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void riscv_v_vstate_save(struct __riscv_v_ext_state *vstate,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
if ((regs->status & SR_VS) == SR_VS_DIRTY) {
|
||||
if (__riscv_v_vstate_check(regs->status, DIRTY)) {
|
||||
__riscv_v_vstate_save(vstate, vstate->datap);
|
||||
__riscv_v_vstate_clean(regs);
|
||||
}
|
||||
@@ -187,7 +309,7 @@ static inline void riscv_v_vstate_save(struct __riscv_v_ext_state *vstate,
|
||||
static inline void riscv_v_vstate_restore(struct __riscv_v_ext_state *vstate,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
if ((regs->status & SR_VS) != SR_VS_OFF) {
|
||||
if (riscv_v_vstate_query(regs)) {
|
||||
__riscv_v_vstate_restore(vstate, vstate->datap);
|
||||
__riscv_v_vstate_clean(regs);
|
||||
}
|
||||
@@ -196,7 +318,7 @@ static inline void riscv_v_vstate_restore(struct __riscv_v_ext_state *vstate,
|
||||
static inline void riscv_v_vstate_set_restore(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
if ((regs->status & SR_VS) != SR_VS_OFF) {
|
||||
if (riscv_v_vstate_query(regs)) {
|
||||
set_tsk_thread_flag(task, TIF_RISCV_V_DEFER_RESTORE);
|
||||
riscv_v_vstate_on(regs);
|
||||
}
|
||||
@@ -270,6 +392,8 @@ struct pt_regs;
|
||||
static inline int riscv_v_setup_vsize(void) { return -EOPNOTSUPP; }
|
||||
static __always_inline bool has_vector(void) { return false; }
|
||||
static __always_inline bool insn_is_vector(u32 insn_buf) { return false; }
|
||||
static __always_inline bool has_xtheadvector_no_alternatives(void) { return false; }
|
||||
static __always_inline bool has_xtheadvector(void) { return false; }
|
||||
static inline bool riscv_v_first_use_handler(struct pt_regs *regs) { return false; }
|
||||
static inline bool riscv_v_vstate_query(struct pt_regs *regs) { return false; }
|
||||
static inline bool riscv_v_vstate_ctrl_user_allowed(void) { return false; }
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_H
|
||||
#define _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_H
|
||||
|
||||
#include <asm/vendor_extensions.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* Extension keys must be strictly less than RISCV_ISA_VENDOR_EXT_MAX.
|
||||
*/
|
||||
#define RISCV_ISA_VENDOR_EXT_XTHEADVECTOR 0
|
||||
|
||||
extern struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead;
|
||||
|
||||
#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD
|
||||
void disable_xtheadvector(void);
|
||||
#else
|
||||
static inline void disable_xtheadvector(void) { }
|
||||
#endif
|
||||
|
||||
/* Extension specific helpers */
|
||||
|
||||
/*
|
||||
* Vector 0.7.1 as used for example on T-Head Xuantie cores, uses an older
|
||||
* encoding for vsetvli (ta, ma vs. d1), so provide an instruction for
|
||||
* vsetvli t4, x0, e8, m8, d1
|
||||
*/
|
||||
#define THEAD_VSETVLI_T4X0E8M8D1 ".long 0x00307ed7\n\t"
|
||||
|
||||
/*
|
||||
* While in theory, the vector-0.7.1 vsb.v and vlb.v result in the same
|
||||
* encoding as the standard vse8.v and vle8.v, compilers seem to optimize
|
||||
* the call resulting in a different encoding and then using a value for
|
||||
* the "mop" field that is not part of vector-0.7.1
|
||||
* So encode specific variants for vstate_save and _restore.
|
||||
*/
|
||||
#define THEAD_VSB_V_V0T0 ".long 0x02028027\n\t"
|
||||
#define THEAD_VSB_V_V8T0 ".long 0x02028427\n\t"
|
||||
#define THEAD_VSB_V_V16T0 ".long 0x02028827\n\t"
|
||||
#define THEAD_VSB_V_V24T0 ".long 0x02028c27\n\t"
|
||||
#define THEAD_VLB_V_V0T0 ".long 0x012028007\n\t"
|
||||
#define THEAD_VLB_V_V8T0 ".long 0x012028407\n\t"
|
||||
#define THEAD_VLB_V_V16T0 ".long 0x012028807\n\t"
|
||||
#define THEAD_VLB_V_V24T0 ".long 0x012028c07\n\t"
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,19 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_HWPROBE_H
|
||||
#define _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_HWPROBE_H
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
|
||||
#include <uapi/asm/hwprobe.h>
|
||||
|
||||
#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD
|
||||
void hwprobe_isa_vendor_ext_thead_0(struct riscv_hwprobe *pair, const struct cpumask *cpus);
|
||||
#else
|
||||
static inline void hwprobe_isa_vendor_ext_thead_0(struct riscv_hwprobe *pair,
|
||||
const struct cpumask *cpus)
|
||||
{
|
||||
pair->value = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,37 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright 2024 Rivos, Inc
|
||||
*/
|
||||
|
||||
#ifndef _ASM_RISCV_SYS_HWPROBE_H
|
||||
#define _ASM_RISCV_SYS_HWPROBE_H
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
#define VENDOR_EXT_KEY(ext) \
|
||||
do { \
|
||||
if (__riscv_isa_extension_available(isainfo->isa, RISCV_ISA_VENDOR_EXT_##ext)) \
|
||||
pair->value |= RISCV_HWPROBE_VENDOR_EXT_##ext; \
|
||||
else \
|
||||
missing |= RISCV_HWPROBE_VENDOR_EXT_##ext; \
|
||||
} while (false)
|
||||
|
||||
/*
|
||||
* Loop through and record extensions that 1) anyone has, and 2) anyone
|
||||
* doesn't have.
|
||||
*
|
||||
* _extension_checks is an arbitrary C block to set the values of pair->value
|
||||
* and missing. It should be filled with VENDOR_EXT_KEY expressions.
|
||||
*/
|
||||
#define VENDOR_EXTENSION_SUPPORTED(pair, cpus, per_hart_vendor_bitmap, _extension_checks) \
|
||||
do { \
|
||||
int cpu; \
|
||||
u64 missing = 0; \
|
||||
for_each_cpu(cpu, (cpus)) { \
|
||||
struct riscv_isavendorinfo *isainfo = &(per_hart_vendor_bitmap)[cpu]; \
|
||||
_extension_checks \
|
||||
} \
|
||||
(pair)->value &= ~missing; \
|
||||
} while (false) \
|
||||
|
||||
#endif /* _ASM_RISCV_SYS_HWPROBE_H */
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* Copyright 2023 Rivos, Inc
|
||||
* Copyright 2023-2024 Rivos, Inc
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_ASM_HWPROBE_H
|
||||
@@ -94,6 +94,7 @@ struct riscv_hwprobe {
|
||||
#define RISCV_HWPROBE_MISALIGNED_VECTOR_SLOW 2
|
||||
#define RISCV_HWPROBE_MISALIGNED_VECTOR_FAST 3
|
||||
#define RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED 4
|
||||
#define RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0 11
|
||||
/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
|
||||
|
||||
/* Flags */
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
|
||||
#define RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR (1 << 0)
|
||||
@@ -123,3 +123,5 @@ obj-$(CONFIG_COMPAT) += compat_vdso/
|
||||
obj-$(CONFIG_64BIT) += pi/
|
||||
obj-$(CONFIG_ACPI) += acpi.o
|
||||
obj-$(CONFIG_ACPI_NUMA) += acpi_numa.o
|
||||
|
||||
obj-$(CONFIG_GENERIC_CPU_VULNERABILITIES) += bugs.o
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2024 Rivos Inc.
|
||||
*/
|
||||
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/sprintf.h>
|
||||
|
||||
#include <asm/bugs.h>
|
||||
#include <asm/vendor_extensions/thead.h>
|
||||
|
||||
static enum mitigation_state ghostwrite_state;
|
||||
|
||||
void ghostwrite_set_vulnerable(void)
|
||||
{
|
||||
ghostwrite_state = VULNERABLE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Vendor extension alternatives will use the value set at the time of boot
|
||||
* alternative patching, thus this must be called before boot alternatives are
|
||||
* patched (and after extension probing) to be effective.
|
||||
*
|
||||
* Returns true if mitgated, false otherwise.
|
||||
*/
|
||||
bool ghostwrite_enable_mitigation(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR) &&
|
||||
ghostwrite_state == VULNERABLE && !cpu_mitigations_off()) {
|
||||
disable_xtheadvector();
|
||||
ghostwrite_state = MITIGATED;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
enum mitigation_state ghostwrite_get_state(void)
|
||||
{
|
||||
return ghostwrite_state;
|
||||
}
|
||||
|
||||
ssize_t cpu_show_ghostwrite(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR)) {
|
||||
switch (ghostwrite_state) {
|
||||
case UNAFFECTED:
|
||||
return sprintf(buf, "Not affected\n");
|
||||
case MITIGATED:
|
||||
return sprintf(buf, "Mitigation: xtheadvector disabled\n");
|
||||
case VULNERABLE:
|
||||
fallthrough;
|
||||
default:
|
||||
return sprintf(buf, "Vulnerable\n");
|
||||
}
|
||||
} else {
|
||||
return sprintf(buf, "Not affected\n");
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/bugs.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/hwcap.h>
|
||||
@@ -26,6 +27,7 @@
|
||||
#include <asm/sbi.h>
|
||||
#include <asm/vector.h>
|
||||
#include <asm/vendor_extensions.h>
|
||||
#include <asm/vendor_extensions/thead.h>
|
||||
|
||||
#define NUM_ALPHA_EXTS ('z' - 'a' + 1)
|
||||
|
||||
@@ -39,6 +41,8 @@ static DECLARE_BITMAP(riscv_isa, RISCV_ISA_EXT_MAX) __read_mostly;
|
||||
/* Per-cpu ISA extensions. */
|
||||
struct riscv_isainfo hart_isa[NR_CPUS];
|
||||
|
||||
u32 thead_vlenb_of;
|
||||
|
||||
/**
|
||||
* riscv_isa_extension_base() - Get base extension word
|
||||
*
|
||||
@@ -791,9 +795,50 @@ static void __init riscv_fill_vendor_ext_list(int cpu)
|
||||
}
|
||||
}
|
||||
|
||||
static int has_thead_homogeneous_vlenb(void)
|
||||
{
|
||||
int cpu;
|
||||
u32 prev_vlenb = 0;
|
||||
u32 vlenb;
|
||||
|
||||
/* Ignore thead,vlenb property if xtheavector is not enabled in the kernel */
|
||||
if (!IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR))
|
||||
return 0;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct device_node *cpu_node;
|
||||
|
||||
cpu_node = of_cpu_device_node_get(cpu);
|
||||
if (!cpu_node) {
|
||||
pr_warn("Unable to find cpu node\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
if (of_property_read_u32(cpu_node, "thead,vlenb", &vlenb)) {
|
||||
of_node_put(cpu_node);
|
||||
|
||||
if (prev_vlenb)
|
||||
return -ENOENT;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (prev_vlenb && vlenb != prev_vlenb) {
|
||||
of_node_put(cpu_node);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
prev_vlenb = vlenb;
|
||||
of_node_put(cpu_node);
|
||||
}
|
||||
|
||||
thead_vlenb_of = vlenb;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap)
|
||||
{
|
||||
unsigned int cpu;
|
||||
bool mitigated;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
unsigned long this_hwcap = 0;
|
||||
@@ -844,6 +889,17 @@ static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap)
|
||||
riscv_fill_vendor_ext_list(cpu);
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute ghostwrite mitigation immediately after detecting extensions
|
||||
* to disable xtheadvector if necessary.
|
||||
*/
|
||||
mitigated = ghostwrite_enable_mitigation();
|
||||
|
||||
if (!mitigated && has_xtheadvector_no_alternatives() && has_thead_homogeneous_vlenb() < 0) {
|
||||
pr_warn("Unsupported heterogeneous vlenb detected, vector extension disabled.\n");
|
||||
disable_xtheadvector();
|
||||
}
|
||||
|
||||
if (bitmap_empty(riscv_isa, RISCV_ISA_EXT_MAX))
|
||||
return -ENOENT;
|
||||
|
||||
@@ -896,7 +952,8 @@ void __init riscv_fill_hwcap(void)
|
||||
elf_hwcap &= ~COMPAT_HWCAP_ISA_F;
|
||||
}
|
||||
|
||||
if (__riscv_isa_extension_available(NULL, RISCV_ISA_EXT_ZVE32X)) {
|
||||
if (__riscv_isa_extension_available(NULL, RISCV_ISA_EXT_ZVE32X) ||
|
||||
has_xtheadvector_no_alternatives()) {
|
||||
/*
|
||||
* This cannot fail when called on the boot hart
|
||||
*/
|
||||
|
||||
@@ -143,7 +143,7 @@ static int riscv_v_start_kernel_context(bool *is_nested)
|
||||
|
||||
/* Transfer the ownership of V from user to kernel, then save */
|
||||
riscv_v_start(RISCV_PREEMPT_V | RISCV_PREEMPT_V_DIRTY);
|
||||
if ((task_pt_regs(current)->status & SR_VS) == SR_VS_DIRTY) {
|
||||
if (__riscv_v_vstate_check(task_pt_regs(current)->status, DIRTY)) {
|
||||
uvstate = ¤t->thread.vstate;
|
||||
__riscv_v_vstate_save(uvstate, uvstate->datap);
|
||||
}
|
||||
@@ -160,7 +160,7 @@ asmlinkage void riscv_v_context_nesting_start(struct pt_regs *regs)
|
||||
return;
|
||||
|
||||
depth = riscv_v_ctx_get_depth();
|
||||
if (depth == 0 && (regs->status & SR_VS) == SR_VS_DIRTY)
|
||||
if (depth == 0 && __riscv_v_vstate_check(regs->status, DIRTY))
|
||||
riscv_preempt_v_set_dirty();
|
||||
|
||||
riscv_v_ctx_depth_inc();
|
||||
@@ -208,7 +208,7 @@ void kernel_vector_begin(void)
|
||||
{
|
||||
bool nested = false;
|
||||
|
||||
if (WARN_ON(!has_vector()))
|
||||
if (WARN_ON(!(has_vector() || has_xtheadvector())))
|
||||
return;
|
||||
|
||||
BUG_ON(!may_use_simd());
|
||||
@@ -236,7 +236,7 @@ EXPORT_SYMBOL_GPL(kernel_vector_begin);
|
||||
*/
|
||||
void kernel_vector_end(void)
|
||||
{
|
||||
if (WARN_ON(!has_vector()))
|
||||
if (WARN_ON(!(has_vector() || has_xtheadvector())))
|
||||
return;
|
||||
|
||||
riscv_v_disable();
|
||||
|
||||
@@ -190,7 +190,7 @@ void flush_thread(void)
|
||||
void arch_release_task_struct(struct task_struct *tsk)
|
||||
{
|
||||
/* Free the vector context of datap. */
|
||||
if (has_vector())
|
||||
if (has_vector() || has_xtheadvector())
|
||||
riscv_v_thread_free(tsk);
|
||||
}
|
||||
|
||||
@@ -240,7 +240,7 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
|
||||
p->thread.s[0] = 0;
|
||||
}
|
||||
p->thread.riscv_v_flags = 0;
|
||||
if (has_vector())
|
||||
if (has_vector() || has_xtheadvector())
|
||||
riscv_v_thread_alloc(p);
|
||||
p->thread.ra = (unsigned long)ret_from_fork;
|
||||
p->thread.sp = (unsigned long)childregs; /* kernel sp */
|
||||
|
||||
@@ -189,7 +189,7 @@ static long restore_sigcontext(struct pt_regs *regs,
|
||||
|
||||
return 0;
|
||||
case RISCV_V_MAGIC:
|
||||
if (!has_vector() || !riscv_v_vstate_query(regs) ||
|
||||
if (!(has_vector() || has_xtheadvector()) || !riscv_v_vstate_query(regs) ||
|
||||
size != riscv_v_sc_size)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -211,7 +211,7 @@ static size_t get_rt_frame_size(bool cal_all)
|
||||
|
||||
frame_size = sizeof(*frame);
|
||||
|
||||
if (has_vector()) {
|
||||
if (has_vector() || has_xtheadvector()) {
|
||||
if (cal_all || riscv_v_vstate_query(task_pt_regs(current)))
|
||||
total_context_size += riscv_v_sc_size;
|
||||
}
|
||||
@@ -284,7 +284,7 @@ static long setup_sigcontext(struct rt_sigframe __user *frame,
|
||||
if (has_fpu())
|
||||
err |= save_fp_state(regs, &sc->sc_fpregs);
|
||||
/* Save the vector state. */
|
||||
if (has_vector() && riscv_v_vstate_query(regs))
|
||||
if ((has_vector() || has_xtheadvector()) && riscv_v_vstate_query(regs))
|
||||
err |= save_v_state(regs, (void __user **)&sc_ext_ptr);
|
||||
/* Write zero to fp-reserved space and check it on restore_sigcontext */
|
||||
err |= __put_user(0, &sc->sc_extdesc.reserved);
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/vector.h>
|
||||
#include <asm/vendor_extensions/thead_hwprobe.h>
|
||||
#include <vdso/vsyscall.h>
|
||||
|
||||
|
||||
@@ -286,6 +287,10 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pair,
|
||||
pair->value = riscv_timebase;
|
||||
break;
|
||||
|
||||
case RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0:
|
||||
hwprobe_isa_vendor_ext_thead_0(pair, cpus);
|
||||
break;
|
||||
|
||||
/*
|
||||
* For forward compatibility, unknown keys don't fail the whole
|
||||
* call, but get their element key set to -1 and value set to 0
|
||||
|
||||
@@ -33,7 +33,17 @@ int riscv_v_setup_vsize(void)
|
||||
{
|
||||
unsigned long this_vsize;
|
||||
|
||||
/* There are 32 vector registers with vlenb length. */
|
||||
/*
|
||||
* There are 32 vector registers with vlenb length.
|
||||
*
|
||||
* If the thead,vlenb property was provided by the firmware, use that
|
||||
* instead of probing the CSRs.
|
||||
*/
|
||||
if (thead_vlenb_of) {
|
||||
riscv_v_vsize = thead_vlenb_of * 32;
|
||||
return 0;
|
||||
}
|
||||
|
||||
riscv_v_enable();
|
||||
this_vsize = csr_read(CSR_VLENB) * 32;
|
||||
riscv_v_disable();
|
||||
@@ -53,7 +63,7 @@ int riscv_v_setup_vsize(void)
|
||||
|
||||
void __init riscv_v_setup_ctx_cache(void)
|
||||
{
|
||||
if (!has_vector())
|
||||
if (!(has_vector() || has_xtheadvector()))
|
||||
return;
|
||||
|
||||
riscv_v_user_cachep = kmem_cache_create_usercopy("riscv_vector_ctx",
|
||||
@@ -173,7 +183,7 @@ bool riscv_v_first_use_handler(struct pt_regs *regs)
|
||||
u32 __user *epc = (u32 __user *)regs->epc;
|
||||
u32 insn = (u32)regs->badaddr;
|
||||
|
||||
if (!has_vector())
|
||||
if (!(has_vector() || has_xtheadvector()))
|
||||
return false;
|
||||
|
||||
/* Do not handle if V is not supported, or disabled */
|
||||
@@ -216,7 +226,7 @@ void riscv_v_vstate_ctrl_init(struct task_struct *tsk)
|
||||
bool inherit;
|
||||
int cur, next;
|
||||
|
||||
if (!has_vector())
|
||||
if (!(has_vector() || has_xtheadvector()))
|
||||
return;
|
||||
|
||||
next = riscv_v_ctrl_get_next(tsk);
|
||||
@@ -238,7 +248,7 @@ void riscv_v_vstate_ctrl_init(struct task_struct *tsk)
|
||||
|
||||
long riscv_v_vstate_ctrl_get_current(void)
|
||||
{
|
||||
if (!has_vector())
|
||||
if (!(has_vector() || has_xtheadvector()))
|
||||
return -EINVAL;
|
||||
|
||||
return current->thread.vstate_ctrl & PR_RISCV_V_VSTATE_CTRL_MASK;
|
||||
@@ -249,7 +259,7 @@ long riscv_v_vstate_ctrl_set_current(unsigned long arg)
|
||||
bool inherit;
|
||||
int cur, next;
|
||||
|
||||
if (!has_vector())
|
||||
if (!(has_vector() || has_xtheadvector()))
|
||||
return -EINVAL;
|
||||
|
||||
if (arg & ~PR_RISCV_V_VSTATE_CTRL_MASK)
|
||||
@@ -299,7 +309,7 @@ static const struct ctl_table riscv_v_default_vstate_table[] = {
|
||||
|
||||
static int __init riscv_v_sysctl_init(void)
|
||||
{
|
||||
if (has_vector())
|
||||
if (has_vector() || has_xtheadvector())
|
||||
if (!register_sysctl("abi", riscv_v_default_vstate_table))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
@@ -309,7 +319,7 @@ static int __init riscv_v_sysctl_init(void)
|
||||
static int __init riscv_v_sysctl_init(void) { return 0; }
|
||||
#endif /* ! CONFIG_SYSCTL */
|
||||
|
||||
static int riscv_v_init(void)
|
||||
static int __init riscv_v_init(void)
|
||||
{
|
||||
return riscv_v_sysctl_init();
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <asm/vendorid_list.h>
|
||||
#include <asm/vendor_extensions.h>
|
||||
#include <asm/vendor_extensions/andes.h>
|
||||
#include <asm/vendor_extensions/thead.h>
|
||||
|
||||
#include <linux/array_size.h>
|
||||
#include <linux/types.h>
|
||||
@@ -14,6 +15,9 @@ struct riscv_isa_vendor_ext_data_list *riscv_isa_vendor_ext_list[] = {
|
||||
#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_ANDES
|
||||
&riscv_isa_vendor_ext_list_andes,
|
||||
#endif
|
||||
#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD
|
||||
&riscv_isa_vendor_ext_list_thead,
|
||||
#endif
|
||||
};
|
||||
|
||||
const size_t riscv_isa_vendor_ext_list_size = ARRAY_SIZE(riscv_isa_vendor_ext_list);
|
||||
@@ -41,6 +45,12 @@ bool __riscv_isa_vendor_extension_available(int cpu, unsigned long vendor, unsig
|
||||
cpu_bmap = riscv_isa_vendor_ext_list_andes.per_hart_isa_bitmap;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD
|
||||
case THEAD_VENDOR_ID:
|
||||
bmap = &riscv_isa_vendor_ext_list_thead.all_harts_isa_bitmap;
|
||||
cpu_bmap = riscv_isa_vendor_ext_list_thead.per_hart_isa_bitmap;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_ANDES) += andes.o
|
||||
obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_THEAD) += thead.o
|
||||
obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_THEAD) += thead_hwprobe.o
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/vendor_extensions.h>
|
||||
#include <asm/vendor_extensions/thead.h>
|
||||
|
||||
#include <linux/array_size.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/* All T-Head vendor extensions supported in Linux */
|
||||
static const struct riscv_isa_ext_data riscv_isa_vendor_ext_thead[] = {
|
||||
__RISCV_ISA_EXT_DATA(xtheadvector, RISCV_ISA_VENDOR_EXT_XTHEADVECTOR),
|
||||
};
|
||||
|
||||
struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead = {
|
||||
.ext_data_count = ARRAY_SIZE(riscv_isa_vendor_ext_thead),
|
||||
.ext_data = riscv_isa_vendor_ext_thead,
|
||||
};
|
||||
|
||||
void disable_xtheadvector(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
clear_bit(RISCV_ISA_VENDOR_EXT_XTHEADVECTOR, riscv_isa_vendor_ext_list_thead.per_hart_isa_bitmap[cpu].isa);
|
||||
|
||||
clear_bit(RISCV_ISA_VENDOR_EXT_XTHEADVECTOR, riscv_isa_vendor_ext_list_thead.all_harts_isa_bitmap.isa);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
#include <asm/vendor_extensions/thead.h>
|
||||
#include <asm/vendor_extensions/thead_hwprobe.h>
|
||||
#include <asm/vendor_extensions/vendor_hwprobe.h>
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <uapi/asm/hwprobe.h>
|
||||
#include <uapi/asm/vendor/thead.h>
|
||||
|
||||
void hwprobe_isa_vendor_ext_thead_0(struct riscv_hwprobe *pair, const struct cpumask *cpus)
|
||||
{
|
||||
VENDOR_EXTENSION_SUPPORTED(pair, cpus,
|
||||
riscv_isa_vendor_ext_list_thead.per_hart_isa_bitmap, {
|
||||
VENDOR_EXT_KEY(XTHEADVECTOR);
|
||||
});
|
||||
}
|
||||
@@ -22,6 +22,57 @@
|
||||
|
||||
#include "../kernel/head.h"
|
||||
|
||||
static void show_pte(unsigned long addr)
|
||||
{
|
||||
pgd_t *pgdp, pgd;
|
||||
p4d_t *p4dp, p4d;
|
||||
pud_t *pudp, pud;
|
||||
pmd_t *pmdp, pmd;
|
||||
pte_t *ptep, pte;
|
||||
struct mm_struct *mm = current->mm;
|
||||
|
||||
if (!mm)
|
||||
mm = &init_mm;
|
||||
|
||||
pr_alert("Current %s pgtable: %luK pagesize, %d-bit VAs, pgdp=0x%016llx\n",
|
||||
current->comm, PAGE_SIZE / SZ_1K, VA_BITS,
|
||||
mm == &init_mm ? (u64)__pa_symbol(mm->pgd) : virt_to_phys(mm->pgd));
|
||||
|
||||
pgdp = pgd_offset(mm, addr);
|
||||
pgd = pgdp_get(pgdp);
|
||||
pr_alert("[%016lx] pgd=%016lx", addr, pgd_val(pgd));
|
||||
if (pgd_none(pgd) || pgd_bad(pgd) || pgd_leaf(pgd))
|
||||
goto out;
|
||||
|
||||
p4dp = p4d_offset(pgdp, addr);
|
||||
p4d = p4dp_get(p4dp);
|
||||
pr_cont(", p4d=%016lx", p4d_val(p4d));
|
||||
if (p4d_none(p4d) || p4d_bad(p4d) || p4d_leaf(p4d))
|
||||
goto out;
|
||||
|
||||
pudp = pud_offset(p4dp, addr);
|
||||
pud = pudp_get(pudp);
|
||||
pr_cont(", pud=%016lx", pud_val(pud));
|
||||
if (pud_none(pud) || pud_bad(pud) || pud_leaf(pud))
|
||||
goto out;
|
||||
|
||||
pmdp = pmd_offset(pudp, addr);
|
||||
pmd = pmdp_get(pmdp);
|
||||
pr_cont(", pmd=%016lx", pmd_val(pmd));
|
||||
if (pmd_none(pmd) || pmd_bad(pmd) || pmd_leaf(pmd))
|
||||
goto out;
|
||||
|
||||
ptep = pte_offset_map(pmdp, addr);
|
||||
if (!ptep)
|
||||
goto out;
|
||||
|
||||
pte = ptep_get(ptep);
|
||||
pr_cont(", pte=%016lx", pte_val(pte));
|
||||
pte_unmap(ptep);
|
||||
out:
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
static void die_kernel_fault(const char *msg, unsigned long addr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
@@ -31,6 +82,7 @@ static void die_kernel_fault(const char *msg, unsigned long addr,
|
||||
addr);
|
||||
|
||||
bust_spinlocks(0);
|
||||
show_pte(addr);
|
||||
die(regs, "Oops");
|
||||
make_task_dead(SIGKILL);
|
||||
}
|
||||
|
||||
@@ -268,8 +268,12 @@ static void __init setup_bootmem(void)
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_64BIT) && IS_ENABLED(CONFIG_MMU)) {
|
||||
max_mapped_addr = __pa(PAGE_OFFSET) + KERN_VIRT_SIZE;
|
||||
memblock_cap_memory_range(phys_ram_base,
|
||||
max_mapped_addr - phys_ram_base);
|
||||
if (memblock_end_of_DRAM() > max_mapped_addr) {
|
||||
memblock_cap_memory_range(phys_ram_base,
|
||||
max_mapped_addr - phys_ram_base);
|
||||
pr_warn("Physical memory overflows the linear mapping size: region above %pa removed",
|
||||
&max_mapped_addr);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -11,6 +11,7 @@ __archpost:
|
||||
|
||||
-include include/config/auto.conf
|
||||
include $(srctree)/scripts/Kbuild.include
|
||||
include $(srctree)/scripts/Makefile.lib
|
||||
|
||||
CMD_RELOCS=arch/s390/tools/relocs
|
||||
OUT_RELOCS = arch/s390/boot
|
||||
@@ -19,11 +20,6 @@ quiet_cmd_relocs = RELOCS $(OUT_RELOCS)/relocs.S
|
||||
mkdir -p $(OUT_RELOCS); \
|
||||
$(CMD_RELOCS) $@ > $(OUT_RELOCS)/relocs.S
|
||||
|
||||
quiet_cmd_strip_relocs = RSTRIP $@
|
||||
cmd_strip_relocs = \
|
||||
$(OBJCOPY) --remove-section='.rel.*' --remove-section='.rel__*' \
|
||||
--remove-section='.rela.*' --remove-section='.rela__*' $@
|
||||
|
||||
vmlinux: FORCE
|
||||
$(call cmd,relocs)
|
||||
$(call cmd,strip_relocs)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-y += kernel/ mm/ boards/
|
||||
obj-$(CONFIG_SH_FPU_EMU) += math-emu/
|
||||
obj-$(CONFIG_USE_BUILTIN_DTB) += boot/dts/
|
||||
|
||||
obj-$(CONFIG_HD6446X_SERIES) += cchips/hd6446x/
|
||||
|
||||
|
||||
+4
-3
@@ -648,10 +648,11 @@ endmenu
|
||||
|
||||
menu "Boot options"
|
||||
|
||||
config USE_BUILTIN_DTB
|
||||
config BUILTIN_DTB
|
||||
bool "Use builtin DTB"
|
||||
default n
|
||||
depends on SH_DEVICE_TREE
|
||||
select GENERIC_BUILTIN_DTB
|
||||
help
|
||||
Link a device tree blob for particular hardware into the kernel,
|
||||
suppressing use of the DTB pointer provided by the bootloader.
|
||||
@@ -659,10 +660,10 @@ config USE_BUILTIN_DTB
|
||||
not capable of providing a DTB to the kernel, or for experimental
|
||||
hardware without stable device tree bindings.
|
||||
|
||||
config BUILTIN_DTB_SOURCE
|
||||
config BUILTIN_DTB_NAME
|
||||
string "Source file for builtin DTB"
|
||||
default ""
|
||||
depends on USE_BUILTIN_DTB
|
||||
depends on BUILTIN_DTB
|
||||
help
|
||||
Base name (without suffix, relative to arch/sh/boot/dts) for the
|
||||
a DTS file that will be used to produce the DTB linked into the
|
||||
|
||||
@@ -80,8 +80,8 @@ config SH_7724_SOLUTION_ENGINE
|
||||
select SOLUTION_ENGINE
|
||||
depends on CPU_SUBTYPE_SH7724
|
||||
select GPIOLIB
|
||||
select SND_SOC_AK4642 if SND_SIMPLE_CARD
|
||||
select REGULATOR_FIXED_VOLTAGE if REGULATOR
|
||||
imply SND_SOC_AK4642 if SND_SIMPLE_CARD
|
||||
help
|
||||
Select 7724 SolutionEngine if configuring for a Hitachi SH7724
|
||||
evaluation board.
|
||||
@@ -259,8 +259,8 @@ config SH_ECOVEC
|
||||
bool "EcoVec"
|
||||
depends on CPU_SUBTYPE_SH7724
|
||||
select GPIOLIB
|
||||
select SND_SOC_DA7210 if SND_SIMPLE_CARD
|
||||
select REGULATOR_FIXED_VOLTAGE if REGULATOR
|
||||
imply SND_SOC_DA7210 if SND_SIMPLE_CARD
|
||||
help
|
||||
Renesas "R0P7724LC0011/21RL (EcoVec)" support.
|
||||
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-$(CONFIG_USE_BUILTIN_DTB) += $(addsuffix .dtb.o, $(CONFIG_BUILTIN_DTB_SOURCE))
|
||||
obj-$(CONFIG_BUILTIN_DTB) += $(addsuffix .dtb.o, $(CONFIG_BUILTIN_DTB_NAME))
|
||||
|
||||
@@ -43,9 +43,9 @@ int arch_show_interrupts(struct seq_file *p, int prec)
|
||||
{
|
||||
int j;
|
||||
|
||||
seq_printf(p, "%*s: ", prec, "NMI");
|
||||
seq_printf(p, "%*s:", prec, "NMI");
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", per_cpu(irq_stat.__nmi_count, j));
|
||||
seq_put_decimal_ull_width(p, " ", per_cpu(irq_stat.__nmi_count, j), 10);
|
||||
seq_printf(p, " Non-maskable interrupts\n");
|
||||
|
||||
seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count));
|
||||
|
||||
@@ -249,7 +249,7 @@ void __ref sh_fdt_init(phys_addr_t dt_phys)
|
||||
/* Avoid calling an __init function on secondary cpus. */
|
||||
if (done) return;
|
||||
|
||||
#ifdef CONFIG_USE_BUILTIN_DTB
|
||||
#ifdef CONFIG_BUILTIN_DTB
|
||||
dt_virt = __dtb_start;
|
||||
#else
|
||||
dt_virt = phys_to_virt(dt_phys);
|
||||
@@ -323,7 +323,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
sh_early_platform_driver_probe("earlyprintk", 1, 1);
|
||||
|
||||
#ifdef CONFIG_OF_EARLY_FLATTREE
|
||||
#ifdef CONFIG_USE_BUILTIN_DTB
|
||||
#ifdef CONFIG_BUILTIN_DTB
|
||||
unflatten_and_copy_device_tree();
|
||||
#else
|
||||
unflatten_device_tree();
|
||||
|
||||
@@ -51,6 +51,7 @@ static int uml_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
|
||||
static int uml_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
|
||||
{
|
||||
struct timespec64 ts;
|
||||
unsigned long long secs;
|
||||
|
||||
if (!enable && !uml_rtc_alarm_enabled)
|
||||
@@ -58,7 +59,8 @@ static int uml_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
|
||||
|
||||
uml_rtc_alarm_enabled = enable;
|
||||
|
||||
secs = uml_rtc_alarm_time - ktime_get_real_seconds();
|
||||
read_persistent_clock64(&ts);
|
||||
secs = uml_rtc_alarm_time - ts.tv_sec;
|
||||
|
||||
if (time_travel_mode == TT_MODE_OFF) {
|
||||
if (!enable) {
|
||||
@@ -73,7 +75,8 @@ static int uml_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
|
||||
|
||||
if (enable)
|
||||
time_travel_add_event_rel(¨_rtc_alarm_event,
|
||||
secs * NSEC_PER_SEC);
|
||||
secs * NSEC_PER_SEC -
|
||||
ts.tv_nsec);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __UM_FIXMAP_H
|
||||
#define __UM_FIXMAP_H
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/archparam.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/threads.h>
|
||||
|
||||
/*
|
||||
* Here we define all the compile-time 'special' virtual
|
||||
* addresses. The point is to have a constant address at
|
||||
* compile time, but to set the physical address only
|
||||
* in the boot process. We allocate these special addresses
|
||||
* from the end of virtual memory (0xfffff000) backwards.
|
||||
* Also this lets us do fail-safe vmalloc(), we
|
||||
* can guarantee that these special addresses and
|
||||
* vmalloc()-ed addresses never overlap.
|
||||
*
|
||||
* these 'compile-time allocated' memory buffers are
|
||||
* fixed-size 4k pages. (or larger if used with an increment
|
||||
* highger than 1) use fixmap_set(idx,phys) to associate
|
||||
* physical memory with fixmap indices.
|
||||
*
|
||||
* TLB entries of such buffers will not be flushed across
|
||||
* task switches.
|
||||
*/
|
||||
|
||||
/*
|
||||
* on UP currently we will have no trace of the fixmap mechanizm,
|
||||
* no page table allocations, etc. This might change in the
|
||||
* future, say framebuffers for the console driver(s) could be
|
||||
* fix-mapped?
|
||||
*/
|
||||
enum fixed_addresses {
|
||||
__end_of_fixed_addresses
|
||||
};
|
||||
|
||||
extern void __set_fixmap (enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
|
||||
/*
|
||||
* used by vmalloc.c.
|
||||
*
|
||||
* Leave one empty page between vmalloc'ed areas and
|
||||
* the start of the fixmap, and leave one page empty
|
||||
* at the top of mem..
|
||||
*/
|
||||
|
||||
#define FIXADDR_TOP (TASK_SIZE - 2 * PAGE_SIZE)
|
||||
#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
||||
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
|
||||
|
||||
#include <asm-generic/fixmap.h>
|
||||
|
||||
#endif
|
||||
@@ -8,7 +8,8 @@
|
||||
#ifndef __UM_PGTABLE_H
|
||||
#define __UM_PGTABLE_H
|
||||
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/mm_types.h>
|
||||
|
||||
#define _PAGE_PRESENT 0x001
|
||||
#define _PAGE_NEEDSYNC 0x002
|
||||
@@ -48,11 +49,9 @@ extern unsigned long end_iomem;
|
||||
|
||||
#define VMALLOC_OFFSET (__va_space)
|
||||
#define VMALLOC_START ((end_iomem + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
|
||||
#define PKMAP_BASE ((FIXADDR_START - LAST_PKMAP * PAGE_SIZE) & PMD_MASK)
|
||||
#define VMALLOC_END (FIXADDR_START-2*PAGE_SIZE)
|
||||
#define VMALLOC_END (TASK_SIZE-2*PAGE_SIZE)
|
||||
#define MODULES_VADDR VMALLOC_START
|
||||
#define MODULES_END VMALLOC_END
|
||||
#define MODULES_LEN (MODULES_VADDR - MODULES_END)
|
||||
|
||||
#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
|
||||
#define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
|
||||
|
||||
+4
-11
@@ -9,7 +9,6 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <as-layout.h>
|
||||
@@ -74,6 +73,7 @@ void __init mem_init(void)
|
||||
kmalloc_ok = 1;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA)
|
||||
/*
|
||||
* Create a page table and place a pointer to it in a middle page
|
||||
* directory entry.
|
||||
@@ -152,7 +152,6 @@ static void __init fixrange_init(unsigned long start, unsigned long end,
|
||||
|
||||
static void __init fixaddr_user_init( void)
|
||||
{
|
||||
#ifdef CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA
|
||||
long size = FIXADDR_USER_END - FIXADDR_USER_START;
|
||||
pte_t *pte;
|
||||
phys_t p;
|
||||
@@ -174,13 +173,12 @@ static void __init fixaddr_user_init( void)
|
||||
pte = virt_to_kpte(vaddr);
|
||||
pte_set_val(*pte, p, PAGE_READONLY);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
void __init paging_init(void)
|
||||
{
|
||||
unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
|
||||
unsigned long vaddr;
|
||||
|
||||
empty_zero_page = (unsigned long *) memblock_alloc_low(PAGE_SIZE,
|
||||
PAGE_SIZE);
|
||||
@@ -191,14 +189,9 @@ void __init paging_init(void)
|
||||
max_zone_pfn[ZONE_NORMAL] = end_iomem >> PAGE_SHIFT;
|
||||
free_area_init(max_zone_pfn);
|
||||
|
||||
/*
|
||||
* Fixed mappings, only the page table structure has to be
|
||||
* created - mappings will be set by set_fixmap():
|
||||
*/
|
||||
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
|
||||
fixrange_init(vaddr, FIXADDR_TOP, swapper_pg_dir);
|
||||
|
||||
#if IS_ENABLED(CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA)
|
||||
fixaddr_user_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -213,14 +213,6 @@ int __uml_cant_sleep(void) {
|
||||
/* Is in_interrupt() really needed? */
|
||||
}
|
||||
|
||||
int user_context(unsigned long sp)
|
||||
{
|
||||
unsigned long stack;
|
||||
|
||||
stack = sp & (PAGE_MASK << CONFIG_KERNEL_STACK_ORDER);
|
||||
return stack != (unsigned long) current_thread_info();
|
||||
}
|
||||
|
||||
extern exitcall_t __uml_exitcall_begin, __uml_exitcall_end;
|
||||
|
||||
void do_uml_exitcalls(void)
|
||||
|
||||
@@ -264,7 +264,7 @@ EXPORT_SYMBOL(end_iomem);
|
||||
|
||||
#define MIN_VMALLOC (32 * 1024 * 1024)
|
||||
|
||||
static void parse_host_cpu_flags(char *line)
|
||||
static void __init parse_host_cpu_flags(char *line)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 32*NCAPINTS; i++) {
|
||||
@@ -272,7 +272,8 @@ static void parse_host_cpu_flags(char *line)
|
||||
set_cpu_cap(&boot_cpu_data, i);
|
||||
}
|
||||
}
|
||||
static void parse_cache_line(char *line)
|
||||
|
||||
static void __init parse_cache_line(char *line)
|
||||
{
|
||||
long res;
|
||||
char *to_parse = strstr(line, ":");
|
||||
@@ -288,7 +289,7 @@ static void parse_cache_line(char *line)
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned long get_top_address(char **envp)
|
||||
static unsigned long __init get_top_address(char **envp)
|
||||
{
|
||||
unsigned long top_addr = (unsigned long) &top_addr;
|
||||
int i;
|
||||
@@ -376,9 +377,8 @@ int __init linux_main(int argc, char **argv, char **envp)
|
||||
iomem_size = (iomem_size + PAGE_SIZE - 1) & PAGE_MASK;
|
||||
|
||||
max_physmem = TASK_SIZE - uml_physmem - iomem_size - MIN_VMALLOC;
|
||||
|
||||
if (physmem_size + iomem_size > max_physmem) {
|
||||
physmem_size = max_physmem - iomem_size;
|
||||
if (physmem_size > max_physmem) {
|
||||
physmem_size = max_physmem;
|
||||
os_info("Physical memory size shrunk to %llu bytes\n",
|
||||
physmem_size);
|
||||
}
|
||||
|
||||
@@ -19,13 +19,11 @@
|
||||
#include <um_malloc.h>
|
||||
#include "internal.h"
|
||||
|
||||
#define PGD_BOUND (4 * 1024 * 1024)
|
||||
#define STACKSIZE (8 * 1024 * 1024)
|
||||
#define THREAD_NAME_LEN (256)
|
||||
|
||||
long elf_aux_hwcap;
|
||||
|
||||
static void set_stklim(void)
|
||||
static void __init set_stklim(void)
|
||||
{
|
||||
struct rlimit lim;
|
||||
|
||||
@@ -48,7 +46,7 @@ static void last_ditch_exit(int sig)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void install_fatal_handler(int sig)
|
||||
static void __init install_fatal_handler(int sig)
|
||||
{
|
||||
struct sigaction action;
|
||||
|
||||
@@ -73,7 +71,7 @@ static void install_fatal_handler(int sig)
|
||||
|
||||
#define UML_LIB_PATH ":" OS_LIB_PATH "/uml"
|
||||
|
||||
static void setup_env_path(void)
|
||||
static void __init setup_env_path(void)
|
||||
{
|
||||
char *new_path = NULL;
|
||||
char *old_path = NULL;
|
||||
|
||||
@@ -11,6 +11,7 @@ __archpost:
|
||||
|
||||
-include include/config/auto.conf
|
||||
include $(srctree)/scripts/Kbuild.include
|
||||
include $(srctree)/scripts/Makefile.lib
|
||||
|
||||
CMD_RELOCS = arch/x86/tools/relocs
|
||||
OUT_RELOCS = arch/x86/boot/compressed
|
||||
@@ -20,11 +21,6 @@ quiet_cmd_relocs = RELOCS $(OUT_RELOCS)/$@.relocs
|
||||
$(CMD_RELOCS) $@ > $(OUT_RELOCS)/$@.relocs; \
|
||||
$(CMD_RELOCS) --abs-relocs $@
|
||||
|
||||
quiet_cmd_strip_relocs = RSTRIP $@
|
||||
cmd_strip_relocs = \
|
||||
$(OBJCOPY) --remove-section='.rel.*' --remove-section='.rel__*' \
|
||||
--remove-section='.rela.*' --remove-section='.rela__*' $@
|
||||
|
||||
# `@true` prevents complaint when there is nothing to be done
|
||||
|
||||
vmlinux: FORCE
|
||||
|
||||
@@ -84,7 +84,6 @@ extern int hpet_set_rtc_irq_bit(unsigned long bit_mask);
|
||||
extern int hpet_set_alarm_time(unsigned char hrs, unsigned char min,
|
||||
unsigned char sec);
|
||||
extern int hpet_set_periodic_freq(unsigned long freq);
|
||||
extern int hpet_rtc_dropped_irq(void);
|
||||
extern int hpet_rtc_timer_init(void);
|
||||
extern irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id);
|
||||
extern int hpet_register_irq_handler(rtc_irq_handler handler);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user