mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
RISC-V Patches for the 5.17 Merge Window, Part 1
* Support for the DA9063 as used on the HiFive Unmatched. * Support for relative extables, which puts us in line with other architectures and save some space in vmlinux. * A handful of kexec fixes/improvements, including the ability to run crash kernels from PCI-addressable memory on the HiFive Unmatched. * Support for the SBI SRST extension, which allows systems that do not have an explicit driver in Linux to reboot. * A handful of fixes and cleanups, including to the defconfigs and device trees. --- This time I do expect to have a part 2, as there's still some smaller patches on the list. I was hoping to get through more of that over the weekend, but I got distracted with the ABI issues. Figured it's better to send this sooner rather than waiting. Included are my merge resolutions against a master from this morning, if that helps any: diff --cc arch/riscv/include/asm/sbi.h index 289621da4a2a,9c46dd3ff4a2..000000000000 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@@ -27,7 -27,14 +27,15 @@@ enum sbi_ext_id SBI_EXT_IPI = 0x735049, SBI_EXT_RFENCE = 0x52464E43, SBI_EXT_HSM = 0x48534D, + SBI_EXT_SRST = 0x53525354, + + /* Experimentals extensions must lie within this range */ + SBI_EXT_EXPERIMENTAL_START = 0x08000000, + SBI_EXT_EXPERIMENTAL_END = 0x08FFFFFF, + + /* Vendor extensions must lie within this range */ + SBI_EXT_VENDOR_START = 0x09000000, + SBI_EXT_VENDOR_END = 0x09FFFFFF, }; enum sbi_ext_base_fid { diff --git a/arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dts b/arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dts index e03a4c94cf3f..6bfa1f24d3de 100644 --- a/arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dts +++ b/arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dts @@ -188,14 +188,6 @@ vdd_ldo11: ldo11 { regulator-always-on; }; }; - - rtc { - compatible = "dlg,da9063-rtc"; - }; - - wdt { - compatible = "dlg,da9063-watchdog"; - }; }; }; -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEKzw3R0RoQ7JKlDp6LhMZ81+7GIkFAmHnDV4THHBhbG1lckBk YWJiZWx0LmNvbQAKCRAuExnzX7sYiaGWD/wOMHVLrkLZDxKHY3lFU7S7FanpFgcU L265fgKtoG/QOI9WPuQlN7pYvrC4ssUvtQ23WwZ+iz4pJlUwoMb2TAqBBeTXxEbW pVF2QqnlPdv2ZEn95MFxZ0HQB2+xgJKPL5gdD6Iz7oe2378lf7tywSF7MYpxG/AA CeHUxzhEPhQJntufTievMhvYpM7ZyhCr19ZAHXRaPoGReJK5ZMCeYHGTrHD4EisG hO/Pg2vx/Ynxi/vb/C69kpTBvu4Qsxnbhgfy1SowrO3FhxcZTbyrZ6l8uRxSAHIg dA0NLPh/YDQCPXYnphQcLo+Q9Gy4Sz5es7ULnnMyyEOZxoVyy4up3rCAFAL3Ubav CNQdk/ZWtrZ+s4chilA1kW97apxocvmq5ULg+7Hi58ZUzk+y7MQBVCClohyONVEU /leJzJ3nq3YHFgfo8Uh7L+iPzlNgycfi4gRnGJIkEVRhXBPTfJ/Pc5wjPoPVsFvt pjEYT4YaXITZ0QBLdcuPex5h3PXkRsORsZl8eJGnIz8742KA4tfFraZ4BkbrjoqC tLsi7Si9hN3JKhLsNgclb76tDkoz4CY7yZ7TT7hRbKdZZJkVRu1XqUq75X18CVQv 9p7Q7j1b5H3Z+/5KOxwS0UO73y92yvyVvi0cLqBoD2Tkeq3beumxmy50Qy+O+h1D Ut7GwcyavzfS8Q== =uqtf -----END PGP SIGNATURE----- Merge tag 'riscv-for-linus-5.17-mw0' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux Pull RISC-V updates from Palmer Dabbelt: - Support for the DA9063 as used on the HiFive Unmatched. - Support for relative extables, which puts us in line with other architectures and save some space in vmlinux. - A handful of kexec fixes/improvements, including the ability to run crash kernels from PCI-addressable memory on the HiFive Unmatched. - Support for the SBI SRST extension, which allows systems that do not have an explicit driver in Linux to reboot. - A handful of fixes and cleanups, including to the defconfigs and device trees. * tag 'riscv-for-linus-5.17-mw0' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: (52 commits) RISC-V: Use SBI SRST extension when available riscv: mm: fix wrong phys_ram_base value for RV64 RISC-V: Use common riscv_cpuid_to_hartid_mask() for both SMP=y and SMP=n riscv: head: remove useless __PAGE_ALIGNED_BSS and .balign riscv: errata: alternative: mark vendor_patch_func __initdata riscv: head: make secondary_start_common() static riscv: remove cpu_stop() riscv: try to allocate crashkern region from 32bit addressible memory riscv: use hart id instead of cpu id on machine_kexec riscv: Don't use va_pa_offset on kdump riscv: dts: sifive: fu540-c000: Fix PLIC node riscv: dts: sifive: fu540-c000: Drop bogus soc node compatible values riscv: dts: sifive: Group tuples in register properties riscv: dts: sifive: Group tuples in interrupt properties riscv: dts: microchip: mpfs: Group tuples in interrupt properties riscv: dts: microchip: mpfs: Fix clock controller node riscv: dts: microchip: mpfs: Fix reference clock node riscv: dts: microchip: mpfs: Fix PLIC node riscv: dts: microchip: mpfs: Drop empty chosen node riscv: dts: canaan: Group tuples in interrupt properties ...
This commit is contained in:
commit
f1b744f65e
@ -14,6 +14,7 @@ config RISCV
|
||||
def_bool y
|
||||
select ARCH_CLOCKSOURCE_INIT
|
||||
select ARCH_ENABLE_HUGEPAGE_MIGRATION if HUGETLB_PAGE && MIGRATION
|
||||
select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2
|
||||
select ARCH_HAS_BINFMT_FLAT
|
||||
select ARCH_HAS_DEBUG_VM_PGTABLE
|
||||
select ARCH_HAS_DEBUG_VIRTUAL if MMU
|
||||
@ -75,6 +76,7 @@ config RISCV
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE if 64BIT && MMU
|
||||
select ARCH_ENABLE_THP_MIGRATION if TRANSPARENT_HUGEPAGE
|
||||
select HAVE_ARCH_THREAD_STRUCT_WHITELIST
|
||||
select HAVE_ARCH_VMAP_STACK if MMU && 64BIT
|
||||
select HAVE_ASM_MODVERSIONS
|
||||
@ -279,7 +281,7 @@ choice
|
||||
depends on 32BIT
|
||||
bool "1GiB"
|
||||
config MAXPHYSMEM_2GB
|
||||
depends on 64BIT && CMODEL_MEDLOW
|
||||
depends on 64BIT
|
||||
bool "2GiB"
|
||||
config MAXPHYSMEM_128GB
|
||||
depends on 64BIT && CMODEL_MEDANY
|
||||
|
@ -103,8 +103,8 @@ rom0: nvmem@1000 {
|
||||
clint0: timer@2000000 {
|
||||
compatible = "canaan,k210-clint", "sifive,clint0";
|
||||
reg = <0x2000000 0xC000>;
|
||||
interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7
|
||||
&cpu1_intc 3 &cpu1_intc 7>;
|
||||
interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>,
|
||||
<&cpu1_intc 3>, <&cpu1_intc 7>;
|
||||
};
|
||||
|
||||
plic0: interrupt-controller@c000000 {
|
||||
@ -113,7 +113,7 @@ plic0: interrupt-controller@c000000 {
|
||||
compatible = "canaan,k210-plic", "sifive,plic-1.0.0";
|
||||
reg = <0xC000000 0x4000000>;
|
||||
interrupt-controller;
|
||||
interrupts-extended = <&cpu0_intc 11 &cpu1_intc 11>;
|
||||
interrupts-extended = <&cpu0_intc 11>, <&cpu1_intc 11>;
|
||||
riscv,ndev = <65>;
|
||||
};
|
||||
|
||||
@ -130,10 +130,11 @@ gpio0: gpio-controller@38001000 {
|
||||
compatible = "canaan,k210-gpiohs", "sifive,gpio0";
|
||||
reg = <0x38001000 0x1000>;
|
||||
interrupt-controller;
|
||||
interrupts = <34 35 36 37 38 39 40 41
|
||||
42 43 44 45 46 47 48 49
|
||||
50 51 52 53 54 55 56 57
|
||||
58 59 60 61 62 63 64 65>;
|
||||
interrupts = <34>, <35>, <36>, <37>, <38>, <39>, <40>,
|
||||
<41>, <42>, <43>, <44>, <45>, <46>, <47>,
|
||||
<48>, <49>, <50>, <51>, <52>, <53>, <54>,
|
||||
<55>, <56>, <57>, <58>, <59>, <60>, <61>,
|
||||
<62>, <63>, <64>, <65>;
|
||||
gpio-controller;
|
||||
ngpios = <32>;
|
||||
};
|
||||
@ -141,7 +142,7 @@ gpio0: gpio-controller@38001000 {
|
||||
dmac0: dma-controller@50000000 {
|
||||
compatible = "snps,axi-dma-1.01a";
|
||||
reg = <0x50000000 0x1000>;
|
||||
interrupts = <27 28 29 30 31 32>;
|
||||
interrupts = <27>, <28>, <29>, <30>, <31>, <32>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&sysclk K210_CLK_DMA>, <&sysclk K210_CLK_DMA>;
|
||||
clock-names = "core-clk", "cfgr-clk";
|
||||
@ -316,7 +317,7 @@ fpioa: pinmux@502b0000 {
|
||||
timer0: timer@502d0000 {
|
||||
compatible = "snps,dw-apb-timer";
|
||||
reg = <0x502D0000 0x100>;
|
||||
interrupts = <14 15>;
|
||||
interrupts = <14>, <15>;
|
||||
clocks = <&sysclk K210_CLK_TIMER0>,
|
||||
<&sysclk K210_CLK_APB0>;
|
||||
clock-names = "timer", "pclk";
|
||||
@ -326,7 +327,7 @@ timer0: timer@502d0000 {
|
||||
timer1: timer@502e0000 {
|
||||
compatible = "snps,dw-apb-timer";
|
||||
reg = <0x502E0000 0x100>;
|
||||
interrupts = <16 17>;
|
||||
interrupts = <16>, <17>;
|
||||
clocks = <&sysclk K210_CLK_TIMER1>,
|
||||
<&sysclk K210_CLK_APB0>;
|
||||
clock-names = "timer", "pclk";
|
||||
@ -336,7 +337,7 @@ timer1: timer@502e0000 {
|
||||
timer2: timer@502f0000 {
|
||||
compatible = "snps,dw-apb-timer";
|
||||
reg = <0x502F0000 0x100>;
|
||||
interrupts = <18 19>;
|
||||
interrupts = <18>, <19>;
|
||||
clocks = <&sysclk K210_CLK_TIMER2>,
|
||||
<&sysclk K210_CLK_APB0>;
|
||||
clock-names = "timer", "pclk";
|
||||
|
@ -199,7 +199,7 @@ slot@0 {
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
spi-flash@0 {
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
@ -201,7 +201,7 @@ slot@0 {
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
spi-flash@0 {
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
@ -209,7 +209,7 @@ slot@0 {
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
spi-flash@0 {
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
@ -174,7 +174,7 @@ slot@0 {
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
spi-flash@0 {
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
@ -35,6 +35,10 @@ memory@80000000 {
|
||||
};
|
||||
};
|
||||
|
||||
&refclk {
|
||||
clock-frequency = <600000000>;
|
||||
};
|
||||
|
||||
&serial0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -9,9 +9,6 @@ / {
|
||||
model = "Microchip PolarFire SoC";
|
||||
compatible = "microchip,mpfs";
|
||||
|
||||
chosen {
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
@ -142,6 +139,11 @@ cpu4_intc: interrupt-controller {
|
||||
};
|
||||
};
|
||||
|
||||
refclk: msspllclk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
@ -156,62 +158,48 @@ cache-controller@2010000 {
|
||||
cache-size = <2097152>;
|
||||
cache-unified;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <1 2 3>;
|
||||
interrupts = <1>, <2>, <3>;
|
||||
reg = <0x0 0x2010000 0x0 0x1000>;
|
||||
};
|
||||
|
||||
clint@2000000 {
|
||||
compatible = "sifive,fu540-c000-clint", "sifive,clint0";
|
||||
reg = <0x0 0x2000000 0x0 0xC000>;
|
||||
interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7
|
||||
&cpu1_intc 3 &cpu1_intc 7
|
||||
&cpu2_intc 3 &cpu2_intc 7
|
||||
&cpu3_intc 3 &cpu3_intc 7
|
||||
&cpu4_intc 3 &cpu4_intc 7>;
|
||||
interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>,
|
||||
<&cpu1_intc 3>, <&cpu1_intc 7>,
|
||||
<&cpu2_intc 3>, <&cpu2_intc 7>,
|
||||
<&cpu3_intc 3>, <&cpu3_intc 7>,
|
||||
<&cpu4_intc 3>, <&cpu4_intc 7>;
|
||||
};
|
||||
|
||||
plic: interrupt-controller@c000000 {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "sifive,fu540-c000-plic", "sifive,plic-1.0.0";
|
||||
reg = <0x0 0xc000000 0x0 0x4000000>;
|
||||
riscv,ndev = <186>;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-controller;
|
||||
interrupts-extended = <&cpu0_intc 11
|
||||
&cpu1_intc 11 &cpu1_intc 9
|
||||
&cpu2_intc 11 &cpu2_intc 9
|
||||
&cpu3_intc 11 &cpu3_intc 9
|
||||
&cpu4_intc 11 &cpu4_intc 9>;
|
||||
interrupts-extended = <&cpu0_intc 11>,
|
||||
<&cpu1_intc 11>, <&cpu1_intc 9>,
|
||||
<&cpu2_intc 11>, <&cpu2_intc 9>,
|
||||
<&cpu3_intc 11>, <&cpu3_intc 9>,
|
||||
<&cpu4_intc 11>, <&cpu4_intc 9>;
|
||||
riscv,ndev = <186>;
|
||||
};
|
||||
|
||||
dma@3000000 {
|
||||
compatible = "sifive,fu540-c000-pdma";
|
||||
reg = <0x0 0x3000000 0x0 0x8000>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <23 24 25 26 27 28 29 30>;
|
||||
interrupts = <23>, <24>, <25>, <26>, <27>, <28>, <29>,
|
||||
<30>;
|
||||
#dma-cells = <1>;
|
||||
};
|
||||
|
||||
refclk: refclk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <600000000>;
|
||||
clock-output-names = "msspllclk";
|
||||
};
|
||||
|
||||
clkcfg: clkcfg@20002000 {
|
||||
compatible = "microchip,mpfs-clkcfg";
|
||||
reg = <0x0 0x20002000 0x0 0x1000>;
|
||||
reg-names = "mss_sysreg";
|
||||
clocks = <&refclk>;
|
||||
#clock-cells = <1>;
|
||||
clock-output-names = "cpu", "axi", "ahb", "envm", /* 0-3 */
|
||||
"mac0", "mac1", "mmc", "timer", /* 4-7 */
|
||||
"mmuart0", "mmuart1", "mmuart2", "mmuart3", /* 8-11 */
|
||||
"mmuart4", "spi0", "spi1", "i2c0", /* 12-15 */
|
||||
"i2c1", "can0", "can1", "usb", /* 16-19 */
|
||||
"rsvd", "rtc", "qspi", "gpio0", /* 20-23 */
|
||||
"gpio1", "gpio2", "ddrc", "fic0", /* 24-27 */
|
||||
"fic1", "fic2", "fic3", "athena", "cfm"; /* 28-32 */
|
||||
};
|
||||
|
||||
serial0: serial@20000000 {
|
||||
@ -267,7 +255,7 @@ mmc: mmc@20008000 {
|
||||
compatible = "microchip,mpfs-sd4hc", "cdns,sd4hc";
|
||||
reg = <0x0 0x20008000 0x0 0x1000>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <88 89>;
|
||||
interrupts = <88>, <89>;
|
||||
clocks = <&clkcfg 6>;
|
||||
max-frequency = <200000000>;
|
||||
status = "disabled";
|
||||
@ -277,7 +265,7 @@ emac0: ethernet@20110000 {
|
||||
compatible = "cdns,macb";
|
||||
reg = <0x0 0x20110000 0x0 0x2000>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <64 65 66 67>;
|
||||
interrupts = <64>, <65>, <66>, <67>;
|
||||
local-mac-address = [00 00 00 00 00 00];
|
||||
clocks = <&clkcfg 4>, <&clkcfg 2>;
|
||||
clock-names = "pclk", "hclk";
|
||||
@ -290,7 +278,7 @@ emac1: ethernet@20112000 {
|
||||
compatible = "cdns,macb";
|
||||
reg = <0x0 0x20112000 0x0 0x2000>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <70 71 72 73>;
|
||||
interrupts = <70>, <71>, <72>, <73>;
|
||||
local-mac-address = [00 00 00 00 00 00];
|
||||
clocks = <&clkcfg 5>, <&clkcfg 2>;
|
||||
status = "disabled";
|
||||
|
@ -137,20 +137,21 @@ cpu4_intc: interrupt-controller {
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
compatible = "sifive,fu540-c000", "sifive,fu540", "simple-bus";
|
||||
compatible = "simple-bus";
|
||||
ranges;
|
||||
plic0: interrupt-controller@c000000 {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "sifive,fu540-c000-plic", "sifive,plic-1.0.0";
|
||||
reg = <0x0 0xc000000 0x0 0x4000000>;
|
||||
riscv,ndev = <53>;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-controller;
|
||||
interrupts-extended = <
|
||||
&cpu0_intc 0xffffffff
|
||||
&cpu1_intc 0xffffffff &cpu1_intc 9
|
||||
&cpu2_intc 0xffffffff &cpu2_intc 9
|
||||
&cpu3_intc 0xffffffff &cpu3_intc 9
|
||||
&cpu4_intc 0xffffffff &cpu4_intc 9>;
|
||||
interrupts-extended =
|
||||
<&cpu0_intc 0xffffffff>,
|
||||
<&cpu1_intc 0xffffffff>, <&cpu1_intc 9>,
|
||||
<&cpu2_intc 0xffffffff>, <&cpu2_intc 9>,
|
||||
<&cpu3_intc 0xffffffff>, <&cpu3_intc 9>,
|
||||
<&cpu4_intc 0xffffffff>, <&cpu4_intc 9>;
|
||||
riscv,ndev = <53>;
|
||||
};
|
||||
prci: clock-controller@10000000 {
|
||||
compatible = "sifive,fu540-c000-prci";
|
||||
@ -170,7 +171,8 @@ dma: dma@3000000 {
|
||||
compatible = "sifive,fu540-c000-pdma";
|
||||
reg = <0x0 0x3000000 0x0 0x8000>;
|
||||
interrupt-parent = <&plic0>;
|
||||
interrupts = <23 24 25 26 27 28 29 30>;
|
||||
interrupts = <23>, <24>, <25>, <26>, <27>, <28>, <29>,
|
||||
<30>;
|
||||
#dma-cells = <1>;
|
||||
};
|
||||
uart1: serial@10011000 {
|
||||
@ -195,8 +197,8 @@ i2c0: i2c@10030000 {
|
||||
};
|
||||
qspi0: spi@10040000 {
|
||||
compatible = "sifive,fu540-c000-spi", "sifive,spi0";
|
||||
reg = <0x0 0x10040000 0x0 0x1000
|
||||
0x0 0x20000000 0x0 0x10000000>;
|
||||
reg = <0x0 0x10040000 0x0 0x1000>,
|
||||
<0x0 0x20000000 0x0 0x10000000>;
|
||||
interrupt-parent = <&plic0>;
|
||||
interrupts = <51>;
|
||||
clocks = <&prci PRCI_CLK_TLCLK>;
|
||||
@ -206,8 +208,8 @@ qspi0: spi@10040000 {
|
||||
};
|
||||
qspi1: spi@10041000 {
|
||||
compatible = "sifive,fu540-c000-spi", "sifive,spi0";
|
||||
reg = <0x0 0x10041000 0x0 0x1000
|
||||
0x0 0x30000000 0x0 0x10000000>;
|
||||
reg = <0x0 0x10041000 0x0 0x1000>,
|
||||
<0x0 0x30000000 0x0 0x10000000>;
|
||||
interrupt-parent = <&plic0>;
|
||||
interrupts = <52>;
|
||||
clocks = <&prci PRCI_CLK_TLCLK>;
|
||||
@ -229,8 +231,8 @@ eth0: ethernet@10090000 {
|
||||
compatible = "sifive,fu540-c000-gem";
|
||||
interrupt-parent = <&plic0>;
|
||||
interrupts = <53>;
|
||||
reg = <0x0 0x10090000 0x0 0x2000
|
||||
0x0 0x100a0000 0x0 0x1000>;
|
||||
reg = <0x0 0x10090000 0x0 0x2000>,
|
||||
<0x0 0x100a0000 0x0 0x1000>;
|
||||
local-mac-address = [00 00 00 00 00 00];
|
||||
clock-names = "pclk", "hclk";
|
||||
clocks = <&prci PRCI_CLK_GEMGXLPLL>,
|
||||
@ -243,7 +245,7 @@ pwm0: pwm@10020000 {
|
||||
compatible = "sifive,fu540-c000-pwm", "sifive,pwm0";
|
||||
reg = <0x0 0x10020000 0x0 0x1000>;
|
||||
interrupt-parent = <&plic0>;
|
||||
interrupts = <42 43 44 45>;
|
||||
interrupts = <42>, <43>, <44>, <45>;
|
||||
clocks = <&prci PRCI_CLK_TLCLK>;
|
||||
#pwm-cells = <3>;
|
||||
status = "disabled";
|
||||
@ -252,7 +254,7 @@ pwm1: pwm@10021000 {
|
||||
compatible = "sifive,fu540-c000-pwm", "sifive,pwm0";
|
||||
reg = <0x0 0x10021000 0x0 0x1000>;
|
||||
interrupt-parent = <&plic0>;
|
||||
interrupts = <46 47 48 49>;
|
||||
interrupts = <46>, <47>, <48>, <49>;
|
||||
clocks = <&prci PRCI_CLK_TLCLK>;
|
||||
#pwm-cells = <3>;
|
||||
status = "disabled";
|
||||
@ -265,7 +267,7 @@ l2cache: cache-controller@2010000 {
|
||||
cache-size = <2097152>;
|
||||
cache-unified;
|
||||
interrupt-parent = <&plic0>;
|
||||
interrupts = <1 2 3>;
|
||||
interrupts = <1>, <2>, <3>;
|
||||
reg = <0x0 0x2010000 0x0 0x1000>;
|
||||
};
|
||||
gpio: gpio@10060000 {
|
||||
|
@ -147,12 +147,12 @@ plic0: interrupt-controller@c000000 {
|
||||
reg = <0x0 0xc000000 0x0 0x4000000>;
|
||||
riscv,ndev = <69>;
|
||||
interrupt-controller;
|
||||
interrupts-extended = <
|
||||
&cpu0_intc 0xffffffff
|
||||
&cpu1_intc 0xffffffff &cpu1_intc 9
|
||||
&cpu2_intc 0xffffffff &cpu2_intc 9
|
||||
&cpu3_intc 0xffffffff &cpu3_intc 9
|
||||
&cpu4_intc 0xffffffff &cpu4_intc 9>;
|
||||
interrupts-extended =
|
||||
<&cpu0_intc 0xffffffff>,
|
||||
<&cpu1_intc 0xffffffff>, <&cpu1_intc 9>,
|
||||
<&cpu2_intc 0xffffffff>, <&cpu2_intc 9>,
|
||||
<&cpu3_intc 0xffffffff>, <&cpu3_intc 9>,
|
||||
<&cpu4_intc 0xffffffff>, <&cpu4_intc 9>;
|
||||
};
|
||||
prci: clock-controller@10000000 {
|
||||
compatible = "sifive,fu740-c000-prci";
|
||||
@ -273,7 +273,7 @@ ccache: cache-controller@2010000 {
|
||||
cache-size = <2097152>;
|
||||
cache-unified;
|
||||
interrupt-parent = <&plic0>;
|
||||
interrupts = <19 21 22 20>;
|
||||
interrupts = <19>, <21>, <22>, <20>;
|
||||
reg = <0x0 0x2010000 0x0 0x1000>;
|
||||
};
|
||||
gpio: gpio@10060000 {
|
||||
|
@ -2,6 +2,7 @@ CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_CGROUPS=y
|
||||
@ -13,10 +14,10 @@ CONFIG_USER_NS=y
|
||||
CONFIG_CHECKPOINT_RESTORE=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
# CONFIG_SYSFS_SYSCALL is not set
|
||||
CONFIG_SOC_MICROCHIP_POLARFIRE=y
|
||||
CONFIG_SOC_SIFIVE=y
|
||||
CONFIG_SOC_VIRT=y
|
||||
CONFIG_SOC_MICROCHIP_POLARFIRE=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_VIRTUALIZATION=y
|
||||
@ -70,14 +71,14 @@ CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_VIRTIO=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_SIFIVE=y
|
||||
# CONFIG_PTP_1588_CLOCK is not set
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_SIFIVE=y
|
||||
# CONFIG_PTP_1588_CLOCK is not set
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_DRM=m
|
||||
CONFIG_DRM_RADEON=m
|
||||
CONFIG_DRM_NOUVEAU=m
|
||||
CONFIG_DRM_VIRTIO_GPU=m
|
||||
CONFIG_FB=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
@ -88,10 +89,10 @@ CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_OHCI_HCD_PLATFORM=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_UAS=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MMC_SDHCI_CADENCE=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SPI=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
@ -142,5 +143,3 @@ CONFIG_RCU_EQS_DEBUG=y
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
CONFIG_MEMTEST=y
|
||||
# CONFIG_SYSFS_SYSCALL is not set
|
||||
CONFIG_EFI=y
|
||||
|
@ -29,7 +29,6 @@ CONFIG_EMBEDDED=y
|
||||
CONFIG_SLOB=y
|
||||
# CONFIG_MMU is not set
|
||||
CONFIG_SOC_CANAAN=y
|
||||
CONFIG_SOC_CANAAN_K210_DTB_SOURCE="k210_generic"
|
||||
CONFIG_MAXPHYSMEM_2GB=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
@ -75,7 +74,6 @@ CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_USER=y
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_SURFACE_PLATFORMS is not set
|
||||
# CONFIG_FILE_LOCKING is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_INOTIFY_USER is not set
|
||||
|
@ -21,7 +21,6 @@ CONFIG_EMBEDDED=y
|
||||
CONFIG_SLOB=y
|
||||
# CONFIG_MMU is not set
|
||||
CONFIG_SOC_CANAAN=y
|
||||
CONFIG_SOC_CANAAN_K210_DTB_SOURCE="k210_generic"
|
||||
CONFIG_MAXPHYSMEM_2GB=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
@ -30,7 +29,6 @@ CONFIG_CMDLINE_FORCE=y
|
||||
# CONFIG_SECCOMP is not set
|
||||
# CONFIG_STACKPROTECTOR is not set
|
||||
# CONFIG_GCC_PLUGINS is not set
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_MQ_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_MQ_IOSCHED_KYBER is not set
|
||||
CONFIG_BINFMT_FLAT=y
|
||||
@ -72,7 +70,6 @@ CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_USER=y
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
# CONFIG_SURFACE_PLATFORMS is not set
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_FILE_LOCKING is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
|
@ -32,7 +32,6 @@ CONFIG_SMP=y
|
||||
CONFIG_CMDLINE="root=/dev/vda rw earlycon=uart8250,mmio,0x10000000,115200n8 console=ttyS0"
|
||||
CONFIG_CMDLINE_FORCE=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_MSDOS_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
|
@ -2,6 +2,7 @@ CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_CGROUPS=y
|
||||
@ -13,7 +14,7 @@ CONFIG_USER_NS=y
|
||||
CONFIG_CHECKPOINT_RESTORE=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
# CONFIG_SYSFS_SYSCALL is not set
|
||||
CONFIG_SOC_SIFIVE=y
|
||||
CONFIG_SOC_VIRT=y
|
||||
CONFIG_ARCH_RV32I=y
|
||||
@ -69,10 +70,10 @@ CONFIG_HW_RANDOM_VIRTIO=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_SIFIVE=y
|
||||
# CONFIG_PTP_1588_CLOCK is not set
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_RADEON=y
|
||||
CONFIG_DRM_VIRTIO_GPU=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
@ -132,4 +133,3 @@ CONFIG_RCU_EQS_DEBUG=y
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
CONFIG_MEMTEST=y
|
||||
# CONFIG_SYSFS_SYSCALL is not set
|
||||
|
@ -22,7 +22,8 @@ static struct cpu_manufacturer_info_t {
|
||||
} cpu_mfr_info;
|
||||
|
||||
static void (*vendor_patch_func)(struct alt_entry *begin, struct alt_entry *end,
|
||||
unsigned long archid, unsigned long impid);
|
||||
unsigned long archid,
|
||||
unsigned long impid) __initdata;
|
||||
|
||||
static inline void __init riscv_fill_cpu_mfr_info(void)
|
||||
{
|
||||
|
@ -1,6 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
generic-y += early_ioremap.h
|
||||
generic-y += extable.h
|
||||
generic-y += flat.h
|
||||
generic-y += kvm_para.h
|
||||
generic-y += user.h
|
||||
|
65
arch/riscv/include/asm/asm-extable.h
Normal file
65
arch/riscv/include/asm/asm-extable.h
Normal file
@ -0,0 +1,65 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef __ASM_ASM_EXTABLE_H
|
||||
#define __ASM_ASM_EXTABLE_H
|
||||
|
||||
#define EX_TYPE_NONE 0
|
||||
#define EX_TYPE_FIXUP 1
|
||||
#define EX_TYPE_BPF 2
|
||||
#define EX_TYPE_UACCESS_ERR_ZERO 3
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
|
||||
#define __ASM_EXTABLE_RAW(insn, fixup, type, data) \
|
||||
.pushsection __ex_table, "a"; \
|
||||
.balign 4; \
|
||||
.long ((insn) - .); \
|
||||
.long ((fixup) - .); \
|
||||
.short (type); \
|
||||
.short (data); \
|
||||
.popsection;
|
||||
|
||||
.macro _asm_extable, insn, fixup
|
||||
__ASM_EXTABLE_RAW(\insn, \fixup, EX_TYPE_FIXUP, 0)
|
||||
.endm
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <asm/gpr-num.h>
|
||||
|
||||
#define __ASM_EXTABLE_RAW(insn, fixup, type, data) \
|
||||
".pushsection __ex_table, \"a\"\n" \
|
||||
".balign 4\n" \
|
||||
".long ((" insn ") - .)\n" \
|
||||
".long ((" fixup ") - .)\n" \
|
||||
".short (" type ")\n" \
|
||||
".short (" data ")\n" \
|
||||
".popsection\n"
|
||||
|
||||
#define _ASM_EXTABLE(insn, fixup) \
|
||||
__ASM_EXTABLE_RAW(#insn, #fixup, __stringify(EX_TYPE_FIXUP), "0")
|
||||
|
||||
#define EX_DATA_REG_ERR_SHIFT 0
|
||||
#define EX_DATA_REG_ERR GENMASK(4, 0)
|
||||
#define EX_DATA_REG_ZERO_SHIFT 5
|
||||
#define EX_DATA_REG_ZERO GENMASK(9, 5)
|
||||
|
||||
#define EX_DATA_REG(reg, gpr) \
|
||||
"((.L__gpr_num_" #gpr ") << " __stringify(EX_DATA_REG_##reg##_SHIFT) ")"
|
||||
|
||||
#define _ASM_EXTABLE_UACCESS_ERR_ZERO(insn, fixup, err, zero) \
|
||||
__DEFINE_ASM_GPR_NUMS \
|
||||
__ASM_EXTABLE_RAW(#insn, #fixup, \
|
||||
__stringify(EX_TYPE_UACCESS_ERR_ZERO), \
|
||||
"(" \
|
||||
EX_DATA_REG(ERR, err) " | " \
|
||||
EX_DATA_REG(ZERO, zero) \
|
||||
")")
|
||||
|
||||
#define _ASM_EXTABLE_UACCESS_ERR(insn, fixup, err) \
|
||||
_ASM_EXTABLE_UACCESS_ERR_ZERO(insn, fixup, err, zero)
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_ASM_EXTABLE_H */
|
48
arch/riscv/include/asm/extable.h
Normal file
48
arch/riscv/include/asm/extable.h
Normal file
@ -0,0 +1,48 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_RISCV_EXTABLE_H
|
||||
#define _ASM_RISCV_EXTABLE_H
|
||||
|
||||
/*
|
||||
* The exception table consists of pairs of relative offsets: the first
|
||||
* is the relative offset to an instruction that is allowed to fault,
|
||||
* and the second is the relative offset at which the program should
|
||||
* continue. No registers are modified, so it is entirely up to the
|
||||
* continuation code to figure out what to do.
|
||||
*
|
||||
* All the routines below use bits of fixup code that are out of line
|
||||
* with the main instruction path. This means when everything is well,
|
||||
* we don't even have to jump over them. Further, they do not intrude
|
||||
* on our cache or tlb entries.
|
||||
*/
|
||||
|
||||
struct exception_table_entry {
|
||||
int insn, fixup;
|
||||
short type, data;
|
||||
};
|
||||
|
||||
#define ARCH_HAS_RELATIVE_EXTABLE
|
||||
|
||||
#define swap_ex_entry_fixup(a, b, tmp, delta) \
|
||||
do { \
|
||||
(a)->fixup = (b)->fixup + (delta); \
|
||||
(b)->fixup = (tmp).fixup - (delta); \
|
||||
(a)->type = (b)->type; \
|
||||
(b)->type = (tmp).type; \
|
||||
(a)->data = (b)->data; \
|
||||
(b)->data = (tmp).data; \
|
||||
} while (0)
|
||||
|
||||
bool fixup_exception(struct pt_regs *regs);
|
||||
|
||||
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I)
|
||||
bool ex_handler_bpf(const struct exception_table_entry *ex, struct pt_regs *regs);
|
||||
#else
|
||||
static inline bool
|
||||
ex_handler_bpf(const struct exception_table_entry *ex,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
@ -11,6 +11,7 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/errno.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asm-extable.h>
|
||||
|
||||
/* We don't even really need the extable code, but for now keep it simple */
|
||||
#ifndef CONFIG_MMU
|
||||
@ -20,23 +21,14 @@
|
||||
|
||||
#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
|
||||
{ \
|
||||
uintptr_t tmp; \
|
||||
__enable_user_access(); \
|
||||
__asm__ __volatile__ ( \
|
||||
"1: " insn " \n" \
|
||||
"2: \n" \
|
||||
" .section .fixup,\"ax\" \n" \
|
||||
" .balign 4 \n" \
|
||||
"3: li %[r],%[e] \n" \
|
||||
" jump 2b,%[t] \n" \
|
||||
" .previous \n" \
|
||||
" .section __ex_table,\"a\" \n" \
|
||||
" .balign " RISCV_SZPTR " \n" \
|
||||
" " RISCV_PTR " 1b, 3b \n" \
|
||||
" .previous \n" \
|
||||
_ASM_EXTABLE_UACCESS_ERR(1b, 2b, %[r]) \
|
||||
: [r] "+r" (ret), [ov] "=&r" (oldval), \
|
||||
[u] "+m" (*uaddr), [t] "=&r" (tmp) \
|
||||
: [op] "Jr" (oparg), [e] "i" (-EFAULT) \
|
||||
[u] "+m" (*uaddr) \
|
||||
: [op] "Jr" (oparg) \
|
||||
: "memory"); \
|
||||
__disable_user_access(); \
|
||||
}
|
||||
@ -98,18 +90,10 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
||||
"2: sc.w.aqrl %[t],%z[nv],%[u] \n"
|
||||
" bnez %[t],1b \n"
|
||||
"3: \n"
|
||||
" .section .fixup,\"ax\" \n"
|
||||
" .balign 4 \n"
|
||||
"4: li %[r],%[e] \n"
|
||||
" jump 3b,%[t] \n"
|
||||
" .previous \n"
|
||||
" .section __ex_table,\"a\" \n"
|
||||
" .balign " RISCV_SZPTR " \n"
|
||||
" " RISCV_PTR " 1b, 4b \n"
|
||||
" " RISCV_PTR " 2b, 4b \n"
|
||||
" .previous \n"
|
||||
_ASM_EXTABLE_UACCESS_ERR(1b, 3b, %[r]) \
|
||||
_ASM_EXTABLE_UACCESS_ERR(2b, 3b, %[r]) \
|
||||
: [r] "+r" (ret), [v] "=&r" (val), [u] "+m" (*uaddr), [t] "=&r" (tmp)
|
||||
: [ov] "Jr" (oldval), [nv] "Jr" (newval), [e] "i" (-EFAULT)
|
||||
: [ov] "Jr" (oldval), [nv] "Jr" (newval)
|
||||
: "memory");
|
||||
__disable_user_access();
|
||||
|
||||
|
77
arch/riscv/include/asm/gpr-num.h
Normal file
77
arch/riscv/include/asm/gpr-num.h
Normal file
@ -0,0 +1,77 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef __ASM_GPR_NUM_H
|
||||
#define __ASM_GPR_NUM_H
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
.equ .L__gpr_num_zero, 0
|
||||
.equ .L__gpr_num_ra, 1
|
||||
.equ .L__gpr_num_sp, 2
|
||||
.equ .L__gpr_num_gp, 3
|
||||
.equ .L__gpr_num_tp, 4
|
||||
.equ .L__gpr_num_t0, 5
|
||||
.equ .L__gpr_num_t1, 6
|
||||
.equ .L__gpr_num_t2, 7
|
||||
.equ .L__gpr_num_s0, 8
|
||||
.equ .L__gpr_num_s1, 9
|
||||
.equ .L__gpr_num_a0, 10
|
||||
.equ .L__gpr_num_a1, 11
|
||||
.equ .L__gpr_num_a2, 12
|
||||
.equ .L__gpr_num_a3, 13
|
||||
.equ .L__gpr_num_a4, 14
|
||||
.equ .L__gpr_num_a5, 15
|
||||
.equ .L__gpr_num_a6, 16
|
||||
.equ .L__gpr_num_a7, 17
|
||||
.equ .L__gpr_num_s2, 18
|
||||
.equ .L__gpr_num_s3, 19
|
||||
.equ .L__gpr_num_s4, 20
|
||||
.equ .L__gpr_num_s5, 21
|
||||
.equ .L__gpr_num_s6, 22
|
||||
.equ .L__gpr_num_s7, 23
|
||||
.equ .L__gpr_num_s8, 24
|
||||
.equ .L__gpr_num_s9, 25
|
||||
.equ .L__gpr_num_s10, 26
|
||||
.equ .L__gpr_num_s11, 27
|
||||
.equ .L__gpr_num_t3, 28
|
||||
.equ .L__gpr_num_t4, 29
|
||||
.equ .L__gpr_num_t5, 30
|
||||
.equ .L__gpr_num_t6, 31
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
#define __DEFINE_ASM_GPR_NUMS \
|
||||
" .equ .L__gpr_num_zero, 0\n" \
|
||||
" .equ .L__gpr_num_ra, 1\n" \
|
||||
" .equ .L__gpr_num_sp, 2\n" \
|
||||
" .equ .L__gpr_num_gp, 3\n" \
|
||||
" .equ .L__gpr_num_tp, 4\n" \
|
||||
" .equ .L__gpr_num_t0, 5\n" \
|
||||
" .equ .L__gpr_num_t1, 6\n" \
|
||||
" .equ .L__gpr_num_t2, 7\n" \
|
||||
" .equ .L__gpr_num_s0, 8\n" \
|
||||
" .equ .L__gpr_num_s1, 9\n" \
|
||||
" .equ .L__gpr_num_a0, 10\n" \
|
||||
" .equ .L__gpr_num_a1, 11\n" \
|
||||
" .equ .L__gpr_num_a2, 12\n" \
|
||||
" .equ .L__gpr_num_a3, 13\n" \
|
||||
" .equ .L__gpr_num_a4, 14\n" \
|
||||
" .equ .L__gpr_num_a5, 15\n" \
|
||||
" .equ .L__gpr_num_a6, 16\n" \
|
||||
" .equ .L__gpr_num_a7, 17\n" \
|
||||
" .equ .L__gpr_num_s2, 18\n" \
|
||||
" .equ .L__gpr_num_s3, 19\n" \
|
||||
" .equ .L__gpr_num_s4, 20\n" \
|
||||
" .equ .L__gpr_num_s5, 21\n" \
|
||||
" .equ .L__gpr_num_s6, 22\n" \
|
||||
" .equ .L__gpr_num_s7, 23\n" \
|
||||
" .equ .L__gpr_num_s8, 24\n" \
|
||||
" .equ .L__gpr_num_s9, 25\n" \
|
||||
" .equ .L__gpr_num_s10, 26\n" \
|
||||
" .equ .L__gpr_num_s11, 27\n" \
|
||||
" .equ .L__gpr_num_t3, 28\n" \
|
||||
" .equ .L__gpr_num_t4, 29\n" \
|
||||
" .equ .L__gpr_num_t5, 30\n" \
|
||||
" .equ .L__gpr_num_t6, 31\n"
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_GPR_NUM_H */
|
@ -31,7 +31,7 @@
|
||||
* _PAGE_PROT_NONE is set on not-present pages (and ignored by the hardware) to
|
||||
* distinguish them from swapped out pages
|
||||
*/
|
||||
#define _PAGE_PROT_NONE _PAGE_READ
|
||||
#define _PAGE_PROT_NONE _PAGE_GLOBAL
|
||||
|
||||
#define _PAGE_PFN_SHIFT 10
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
#endif
|
||||
|
||||
#define VMALLOC_SIZE (KERN_VIRT_SIZE >> 1)
|
||||
#define VMALLOC_END (PAGE_OFFSET - 1)
|
||||
#define VMALLOC_END PAGE_OFFSET
|
||||
#define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)
|
||||
|
||||
#define BPF_JIT_REGION_SIZE (SZ_128M)
|
||||
@ -51,7 +51,7 @@
|
||||
#define VMEMMAP_SHIFT \
|
||||
(CONFIG_VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT)
|
||||
#define VMEMMAP_SIZE BIT(VMEMMAP_SHIFT)
|
||||
#define VMEMMAP_END (VMALLOC_START - 1)
|
||||
#define VMEMMAP_END VMALLOC_START
|
||||
#define VMEMMAP_START (VMALLOC_START - VMEMMAP_SIZE)
|
||||
|
||||
/*
|
||||
@ -119,7 +119,7 @@
|
||||
/* Page protection bits */
|
||||
#define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER)
|
||||
|
||||
#define PAGE_NONE __pgprot(_PAGE_PROT_NONE)
|
||||
#define PAGE_NONE __pgprot(_PAGE_PROT_NONE | _PAGE_READ)
|
||||
#define PAGE_READ __pgprot(_PAGE_BASE | _PAGE_READ)
|
||||
#define PAGE_WRITE __pgprot(_PAGE_BASE | _PAGE_READ | _PAGE_WRITE)
|
||||
#define PAGE_EXEC __pgprot(_PAGE_BASE | _PAGE_EXEC)
|
||||
@ -628,11 +628,12 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
|
||||
*
|
||||
* Format of swap PTE:
|
||||
* bit 0: _PAGE_PRESENT (zero)
|
||||
* bit 1: _PAGE_PROT_NONE (zero)
|
||||
* bits 2 to 6: swap type
|
||||
* bits 7 to XLEN-1: swap offset
|
||||
* bit 1 to 3: _PAGE_LEAF (zero)
|
||||
* bit 5: _PAGE_PROT_NONE (zero)
|
||||
* bits 6 to 10: swap type
|
||||
* bits 10 to XLEN-1: swap offset
|
||||
*/
|
||||
#define __SWP_TYPE_SHIFT 2
|
||||
#define __SWP_TYPE_SHIFT 6
|
||||
#define __SWP_TYPE_BITS 5
|
||||
#define __SWP_TYPE_MASK ((1UL << __SWP_TYPE_BITS) - 1)
|
||||
#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
|
||||
@ -648,6 +649,11 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
|
||||
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
||||
#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
||||
|
||||
#ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
|
||||
#define __pmd_to_swp_entry(pmd) ((swp_entry_t) { pmd_val(pmd) })
|
||||
#define __swp_entry_to_pmd(swp) __pmd((swp).val)
|
||||
#endif /* CONFIG_ARCH_ENABLE_THP_MIGRATION */
|
||||
|
||||
/*
|
||||
* In the RV64 Linux scheme, we give the user half of the virtual-address space
|
||||
* and give the kernel the other (upper) half.
|
||||
|
@ -27,6 +27,7 @@ enum sbi_ext_id {
|
||||
SBI_EXT_IPI = 0x735049,
|
||||
SBI_EXT_RFENCE = 0x52464E43,
|
||||
SBI_EXT_HSM = 0x48534D,
|
||||
SBI_EXT_SRST = 0x53525354,
|
||||
|
||||
/* Experimentals extensions must lie within this range */
|
||||
SBI_EXT_EXPERIMENTAL_START = 0x08000000,
|
||||
@ -78,6 +79,21 @@ enum sbi_hsm_hart_status {
|
||||
SBI_HSM_HART_STATUS_STOP_PENDING,
|
||||
};
|
||||
|
||||
enum sbi_ext_srst_fid {
|
||||
SBI_EXT_SRST_RESET = 0,
|
||||
};
|
||||
|
||||
enum sbi_srst_reset_type {
|
||||
SBI_SRST_RESET_TYPE_SHUTDOWN = 0,
|
||||
SBI_SRST_RESET_TYPE_COLD_REBOOT,
|
||||
SBI_SRST_RESET_TYPE_WARM_REBOOT,
|
||||
};
|
||||
|
||||
enum sbi_srst_reset_reason {
|
||||
SBI_SRST_RESET_REASON_NONE = 0,
|
||||
SBI_SRST_RESET_REASON_SYS_FAILURE,
|
||||
};
|
||||
|
||||
#define SBI_SPEC_VERSION_DEFAULT 0x1
|
||||
#define SBI_SPEC_VERSION_MAJOR_SHIFT 24
|
||||
#define SBI_SPEC_VERSION_MAJOR_MASK 0x7f
|
||||
@ -157,6 +173,14 @@ static inline unsigned long sbi_minor_version(void)
|
||||
return sbi_spec_version & SBI_SPEC_VERSION_MINOR_MASK;
|
||||
}
|
||||
|
||||
/* Make SBI version */
|
||||
static inline unsigned long sbi_mk_version(unsigned long major,
|
||||
unsigned long minor)
|
||||
{
|
||||
return ((major & SBI_SPEC_VERSION_MAJOR_MASK) <<
|
||||
SBI_SPEC_VERSION_MAJOR_SHIFT) | minor;
|
||||
}
|
||||
|
||||
int sbi_err_map_linux_errno(int err);
|
||||
#else /* CONFIG_RISCV_SBI */
|
||||
static inline int sbi_remote_fence_i(const unsigned long *hart_mask) { return -1; }
|
||||
|
@ -43,7 +43,6 @@ void arch_send_call_function_ipi_mask(struct cpumask *mask);
|
||||
void arch_send_call_function_single_ipi(int cpu);
|
||||
|
||||
int riscv_hartid_to_cpuid(int hartid);
|
||||
void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
|
||||
|
||||
/* Set custom IPI operations */
|
||||
void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops);
|
||||
@ -63,8 +62,6 @@ asmlinkage void smp_callin(void);
|
||||
#if defined CONFIG_HOTPLUG_CPU
|
||||
int __cpu_disable(void);
|
||||
void __cpu_die(unsigned int cpu);
|
||||
void cpu_stop(void);
|
||||
#else
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
#else
|
||||
@ -85,13 +82,6 @@ static inline unsigned long cpuid_to_hartid_map(int cpu)
|
||||
return boot_cpu_hartid;
|
||||
}
|
||||
|
||||
static inline void riscv_cpuid_to_hartid_mask(const struct cpumask *in,
|
||||
struct cpumask *out)
|
||||
{
|
||||
cpumask_clear(out);
|
||||
cpumask_set_cpu(boot_cpu_hartid, out);
|
||||
}
|
||||
|
||||
static inline void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops)
|
||||
{
|
||||
}
|
||||
@ -102,6 +92,8 @@ static inline void riscv_clear_ipi(void)
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
|
||||
|
||||
#if defined(CONFIG_HOTPLUG_CPU) && (CONFIG_SMP)
|
||||
bool cpu_has_hotplug(unsigned int cpu);
|
||||
#else
|
||||
|
@ -8,6 +8,7 @@
|
||||
#ifndef _ASM_RISCV_UACCESS_H
|
||||
#define _ASM_RISCV_UACCESS_H
|
||||
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/pgtable.h> /* for TASK_SIZE */
|
||||
|
||||
/*
|
||||
@ -80,25 +81,14 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
|
||||
|
||||
#define __get_user_asm(insn, x, ptr, err) \
|
||||
do { \
|
||||
uintptr_t __tmp; \
|
||||
__typeof__(x) __x; \
|
||||
__asm__ __volatile__ ( \
|
||||
"1:\n" \
|
||||
" " insn " %1, %3\n" \
|
||||
" " insn " %1, %2\n" \
|
||||
"2:\n" \
|
||||
" .section .fixup,\"ax\"\n" \
|
||||
" .balign 4\n" \
|
||||
"3:\n" \
|
||||
" li %0, %4\n" \
|
||||
" li %1, 0\n" \
|
||||
" jump 2b, %2\n" \
|
||||
" .previous\n" \
|
||||
" .section __ex_table,\"a\"\n" \
|
||||
" .balign " RISCV_SZPTR "\n" \
|
||||
" " RISCV_PTR " 1b, 3b\n" \
|
||||
" .previous" \
|
||||
: "+r" (err), "=&r" (__x), "=r" (__tmp) \
|
||||
: "m" (*(ptr)), "i" (-EFAULT)); \
|
||||
_ASM_EXTABLE_UACCESS_ERR_ZERO(1b, 2b, %0, %1) \
|
||||
: "+r" (err), "=&r" (__x) \
|
||||
: "m" (*(ptr))); \
|
||||
(x) = __x; \
|
||||
} while (0)
|
||||
|
||||
@ -110,30 +100,18 @@ do { \
|
||||
do { \
|
||||
u32 __user *__ptr = (u32 __user *)(ptr); \
|
||||
u32 __lo, __hi; \
|
||||
uintptr_t __tmp; \
|
||||
__asm__ __volatile__ ( \
|
||||
"1:\n" \
|
||||
" lw %1, %4\n" \
|
||||
" lw %1, %3\n" \
|
||||
"2:\n" \
|
||||
" lw %2, %5\n" \
|
||||
" lw %2, %4\n" \
|
||||
"3:\n" \
|
||||
" .section .fixup,\"ax\"\n" \
|
||||
" .balign 4\n" \
|
||||
"4:\n" \
|
||||
" li %0, %6\n" \
|
||||
" li %1, 0\n" \
|
||||
" li %2, 0\n" \
|
||||
" jump 3b, %3\n" \
|
||||
" .previous\n" \
|
||||
" .section __ex_table,\"a\"\n" \
|
||||
" .balign " RISCV_SZPTR "\n" \
|
||||
" " RISCV_PTR " 1b, 4b\n" \
|
||||
" " RISCV_PTR " 2b, 4b\n" \
|
||||
" .previous" \
|
||||
: "+r" (err), "=&r" (__lo), "=r" (__hi), \
|
||||
"=r" (__tmp) \
|
||||
: "m" (__ptr[__LSW]), "m" (__ptr[__MSW]), \
|
||||
"i" (-EFAULT)); \
|
||||
_ASM_EXTABLE_UACCESS_ERR_ZERO(1b, 3b, %0, %1) \
|
||||
_ASM_EXTABLE_UACCESS_ERR_ZERO(2b, 3b, %0, %1) \
|
||||
: "+r" (err), "=&r" (__lo), "=r" (__hi) \
|
||||
: "m" (__ptr[__LSW]), "m" (__ptr[__MSW])); \
|
||||
if (err) \
|
||||
__hi = 0; \
|
||||
(x) = (__typeof__(x))((__typeof__((x)-(x)))( \
|
||||
(((u64)__hi << 32) | __lo))); \
|
||||
} while (0)
|
||||
@ -221,24 +199,14 @@ do { \
|
||||
|
||||
#define __put_user_asm(insn, x, ptr, err) \
|
||||
do { \
|
||||
uintptr_t __tmp; \
|
||||
__typeof__(*(ptr)) __x = x; \
|
||||
__asm__ __volatile__ ( \
|
||||
"1:\n" \
|
||||
" " insn " %z3, %2\n" \
|
||||
" " insn " %z2, %1\n" \
|
||||
"2:\n" \
|
||||
" .section .fixup,\"ax\"\n" \
|
||||
" .balign 4\n" \
|
||||
"3:\n" \
|
||||
" li %0, %4\n" \
|
||||
" jump 2b, %1\n" \
|
||||
" .previous\n" \
|
||||
" .section __ex_table,\"a\"\n" \
|
||||
" .balign " RISCV_SZPTR "\n" \
|
||||
" " RISCV_PTR " 1b, 3b\n" \
|
||||
" .previous" \
|
||||
: "+r" (err), "=r" (__tmp), "=m" (*(ptr)) \
|
||||
: "rJ" (__x), "i" (-EFAULT)); \
|
||||
_ASM_EXTABLE_UACCESS_ERR(1b, 2b, %0) \
|
||||
: "+r" (err), "=m" (*(ptr)) \
|
||||
: "rJ" (__x)); \
|
||||
} while (0)
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
@ -249,28 +217,18 @@ do { \
|
||||
do { \
|
||||
u32 __user *__ptr = (u32 __user *)(ptr); \
|
||||
u64 __x = (__typeof__((x)-(x)))(x); \
|
||||
uintptr_t __tmp; \
|
||||
__asm__ __volatile__ ( \
|
||||
"1:\n" \
|
||||
" sw %z4, %2\n" \
|
||||
" sw %z3, %1\n" \
|
||||
"2:\n" \
|
||||
" sw %z5, %3\n" \
|
||||
" sw %z4, %2\n" \
|
||||
"3:\n" \
|
||||
" .section .fixup,\"ax\"\n" \
|
||||
" .balign 4\n" \
|
||||
"4:\n" \
|
||||
" li %0, %6\n" \
|
||||
" jump 3b, %1\n" \
|
||||
" .previous\n" \
|
||||
" .section __ex_table,\"a\"\n" \
|
||||
" .balign " RISCV_SZPTR "\n" \
|
||||
" " RISCV_PTR " 1b, 4b\n" \
|
||||
" " RISCV_PTR " 2b, 4b\n" \
|
||||
" .previous" \
|
||||
: "+r" (err), "=r" (__tmp), \
|
||||
_ASM_EXTABLE_UACCESS_ERR(1b, 3b, %0) \
|
||||
_ASM_EXTABLE_UACCESS_ERR(2b, 3b, %0) \
|
||||
: "+r" (err), \
|
||||
"=m" (__ptr[__LSW]), \
|
||||
"=m" (__ptr[__MSW]) \
|
||||
: "rJ" (__x), "rJ" (__x >> 32), "i" (-EFAULT)); \
|
||||
: "rJ" (__x), "rJ" (__x >> 32)); \
|
||||
} while (0)
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
@ -388,81 +346,6 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n)
|
||||
__clear_user(to, n) : n;
|
||||
}
|
||||
|
||||
/*
|
||||
* Atomic compare-and-exchange, but with a fixup for userspace faults. Faults
|
||||
* will set "err" to -EFAULT, while successful accesses return the previous
|
||||
* value.
|
||||
*/
|
||||
#define __cmpxchg_user(ptr, old, new, err, size, lrb, scb) \
|
||||
({ \
|
||||
__typeof__(ptr) __ptr = (ptr); \
|
||||
__typeof__(*(ptr)) __old = (old); \
|
||||
__typeof__(*(ptr)) __new = (new); \
|
||||
__typeof__(*(ptr)) __ret; \
|
||||
__typeof__(err) __err = 0; \
|
||||
register unsigned int __rc; \
|
||||
__enable_user_access(); \
|
||||
switch (size) { \
|
||||
case 4: \
|
||||
__asm__ __volatile__ ( \
|
||||
"0:\n" \
|
||||
" lr.w" #scb " %[ret], %[ptr]\n" \
|
||||
" bne %[ret], %z[old], 1f\n" \
|
||||
" sc.w" #lrb " %[rc], %z[new], %[ptr]\n" \
|
||||
" bnez %[rc], 0b\n" \
|
||||
"1:\n" \
|
||||
".section .fixup,\"ax\"\n" \
|
||||
".balign 4\n" \
|
||||
"2:\n" \
|
||||
" li %[err], %[efault]\n" \
|
||||
" jump 1b, %[rc]\n" \
|
||||
".previous\n" \
|
||||
".section __ex_table,\"a\"\n" \
|
||||
".balign " RISCV_SZPTR "\n" \
|
||||
" " RISCV_PTR " 1b, 2b\n" \
|
||||
".previous\n" \
|
||||
: [ret] "=&r" (__ret), \
|
||||
[rc] "=&r" (__rc), \
|
||||
[ptr] "+A" (*__ptr), \
|
||||
[err] "=&r" (__err) \
|
||||
: [old] "rJ" (__old), \
|
||||
[new] "rJ" (__new), \
|
||||
[efault] "i" (-EFAULT)); \
|
||||
break; \
|
||||
case 8: \
|
||||
__asm__ __volatile__ ( \
|
||||
"0:\n" \
|
||||
" lr.d" #scb " %[ret], %[ptr]\n" \
|
||||
" bne %[ret], %z[old], 1f\n" \
|
||||
" sc.d" #lrb " %[rc], %z[new], %[ptr]\n" \
|
||||
" bnez %[rc], 0b\n" \
|
||||
"1:\n" \
|
||||
".section .fixup,\"ax\"\n" \
|
||||
".balign 4\n" \
|
||||
"2:\n" \
|
||||
" li %[err], %[efault]\n" \
|
||||
" jump 1b, %[rc]\n" \
|
||||
".previous\n" \
|
||||
".section __ex_table,\"a\"\n" \
|
||||
".balign " RISCV_SZPTR "\n" \
|
||||
" " RISCV_PTR " 1b, 2b\n" \
|
||||
".previous\n" \
|
||||
: [ret] "=&r" (__ret), \
|
||||
[rc] "=&r" (__rc), \
|
||||
[ptr] "+A" (*__ptr), \
|
||||
[err] "=&r" (__err) \
|
||||
: [old] "rJ" (__old), \
|
||||
[new] "rJ" (__new), \
|
||||
[efault] "i" (-EFAULT)); \
|
||||
break; \
|
||||
default: \
|
||||
BUILD_BUG(); \
|
||||
} \
|
||||
__disable_user_access(); \
|
||||
(err) = __err; \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define HAVE_GET_KERNEL_NOFAULT
|
||||
|
||||
#define __get_kernel_nofault(dst, src, type, err_label) \
|
||||
|
@ -14,12 +14,6 @@
|
||||
#include <asm/cpu_ops.h>
|
||||
#include <asm/sbi.h>
|
||||
|
||||
void cpu_stop(void);
|
||||
void arch_cpu_idle_dead(void)
|
||||
{
|
||||
cpu_stop();
|
||||
}
|
||||
|
||||
bool cpu_has_hotplug(unsigned int cpu)
|
||||
{
|
||||
if (cpu_ops[cpu]->cpu_stop)
|
||||
@ -75,7 +69,7 @@ void __cpu_die(unsigned int cpu)
|
||||
/*
|
||||
* Called from the idle thread for the CPU which has been shutdown.
|
||||
*/
|
||||
void cpu_stop(void)
|
||||
void arch_cpu_idle_dead(void)
|
||||
{
|
||||
idle_task_exit();
|
||||
|
||||
|
@ -135,7 +135,7 @@ relocate:
|
||||
/*
|
||||
* Switch to kernel page tables. A full fence is necessary in order to
|
||||
* avoid using the trampoline translations, which are only correct for
|
||||
* the first superpage. Fetching the fence is guarnteed to work
|
||||
* the first superpage. Fetching the fence is guaranteed to work
|
||||
* because that first superpage is translated the same way.
|
||||
*/
|
||||
csrw CSR_SATP, a2
|
||||
@ -177,8 +177,7 @@ secondary_start_sbi:
|
||||
REG_L sp, (a4)
|
||||
REG_L tp, (a5)
|
||||
|
||||
.global secondary_start_common
|
||||
secondary_start_common:
|
||||
.Lsecondary_start_common:
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
/* Enable virtual memory and relocate to virtual address */
|
||||
@ -365,7 +364,7 @@ clear_bss_done:
|
||||
beqz tp, .Lwait_for_cpu_up
|
||||
fence
|
||||
|
||||
tail secondary_start_common
|
||||
tail .Lsecondary_start_common
|
||||
#endif
|
||||
|
||||
END(_start_kernel)
|
||||
@ -448,7 +447,3 @@ ENTRY(reset_regs)
|
||||
ret
|
||||
END(reset_regs)
|
||||
#endif /* CONFIG_RISCV_M_MODE */
|
||||
|
||||
__PAGE_ALIGNED_BSS
|
||||
/* Empty zero page */
|
||||
.balign PAGE_SIZE
|
||||
|
@ -159,25 +159,15 @@ SYM_CODE_START(riscv_kexec_norelocate)
|
||||
* s0: (const) Phys address to jump to
|
||||
* s1: (const) Phys address of the FDT image
|
||||
* s2: (const) The hartid of the current hart
|
||||
* s3: (const) kernel_map.va_pa_offset, used when switching MMU off
|
||||
*/
|
||||
mv s0, a1
|
||||
mv s1, a2
|
||||
mv s2, a3
|
||||
mv s3, a4
|
||||
|
||||
/* Disable / cleanup interrupts */
|
||||
csrw CSR_SIE, zero
|
||||
csrw CSR_SIP, zero
|
||||
|
||||
/* Switch to physical addressing */
|
||||
la s4, 1f
|
||||
sub s4, s4, s3
|
||||
csrw CSR_STVEC, s4
|
||||
csrw CSR_SATP, zero
|
||||
|
||||
.align 2
|
||||
1:
|
||||
/* Pass the arguments to the next kernel / Cleanup*/
|
||||
mv a0, s2
|
||||
mv a1, s1
|
||||
@ -214,7 +204,15 @@ SYM_CODE_START(riscv_kexec_norelocate)
|
||||
csrw CSR_SCAUSE, zero
|
||||
csrw CSR_SSCRATCH, zero
|
||||
|
||||
jalr zero, a2, 0
|
||||
/*
|
||||
* Switch to physical addressing
|
||||
* This will also trigger a jump to CSR_STVEC
|
||||
* which in this case is the address of the new
|
||||
* kernel.
|
||||
*/
|
||||
csrw CSR_STVEC, a2
|
||||
csrw CSR_SATP, zero
|
||||
|
||||
SYM_CODE_END(riscv_kexec_norelocate)
|
||||
|
||||
.section ".rodata"
|
||||
|
@ -169,7 +169,8 @@ machine_kexec(struct kimage *image)
|
||||
struct kimage_arch *internal = &image->arch;
|
||||
unsigned long jump_addr = (unsigned long) image->start;
|
||||
unsigned long first_ind_entry = (unsigned long) &image->head;
|
||||
unsigned long this_hart_id = raw_smp_processor_id();
|
||||
unsigned long this_cpu_id = smp_processor_id();
|
||||
unsigned long this_hart_id = cpuid_to_hartid_map(this_cpu_id);
|
||||
unsigned long fdt_addr = internal->fdt_addr;
|
||||
void *control_code_buffer = page_address(image->control_code_page);
|
||||
riscv_kexec_method kexec_method = NULL;
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <asm/sbi.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
@ -501,6 +502,32 @@ int sbi_remote_hfence_vvma_asid(const unsigned long *hart_mask,
|
||||
}
|
||||
EXPORT_SYMBOL(sbi_remote_hfence_vvma_asid);
|
||||
|
||||
static void sbi_srst_reset(unsigned long type, unsigned long reason)
|
||||
{
|
||||
sbi_ecall(SBI_EXT_SRST, SBI_EXT_SRST_RESET, type, reason,
|
||||
0, 0, 0, 0);
|
||||
pr_warn("%s: type=0x%lx reason=0x%lx failed\n",
|
||||
__func__, type, reason);
|
||||
}
|
||||
|
||||
static int sbi_srst_reboot(struct notifier_block *this,
|
||||
unsigned long mode, void *cmd)
|
||||
{
|
||||
sbi_srst_reset((mode == REBOOT_WARM || mode == REBOOT_SOFT) ?
|
||||
SBI_SRST_RESET_TYPE_WARM_REBOOT :
|
||||
SBI_SRST_RESET_TYPE_COLD_REBOOT,
|
||||
SBI_SRST_RESET_REASON_NONE);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block sbi_srst_reboot_nb;
|
||||
|
||||
static void sbi_srst_power_off(void)
|
||||
{
|
||||
sbi_srst_reset(SBI_SRST_RESET_TYPE_SHUTDOWN,
|
||||
SBI_SRST_RESET_REASON_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* sbi_probe_extension() - Check if an SBI extension ID is supported or not.
|
||||
* @extid: The extension ID to be probed.
|
||||
@ -608,6 +635,14 @@ void __init sbi_init(void)
|
||||
} else {
|
||||
__sbi_rfence = __sbi_rfence_v01;
|
||||
}
|
||||
if ((sbi_spec_version >= sbi_mk_version(0, 3)) &&
|
||||
(sbi_probe_extension(SBI_EXT_SRST) > 0)) {
|
||||
pr_info("SBI SRST extension detected\n");
|
||||
pm_power_off = sbi_srst_power_off;
|
||||
sbi_srst_reboot_nb.notifier_call = sbi_srst_reboot;
|
||||
sbi_srst_reboot_nb.priority = 192;
|
||||
register_restart_handler(&sbi_srst_reboot_nb);
|
||||
}
|
||||
} else {
|
||||
__sbi_set_timer = __sbi_set_timer_v01;
|
||||
__sbi_send_ipi = __sbi_send_ipi_v01;
|
||||
|
@ -59,6 +59,16 @@ atomic_t hart_lottery __section(".sdata")
|
||||
unsigned long boot_cpu_hartid;
|
||||
static DEFINE_PER_CPU(struct cpu, cpu_devices);
|
||||
|
||||
void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
cpumask_clear(out);
|
||||
for_each_cpu(cpu, in)
|
||||
cpumask_set_cpu(cpuid_to_hartid_map(cpu), out);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(riscv_cpuid_to_hartid_mask);
|
||||
|
||||
/*
|
||||
* Place kernel memory regions on the resource tree so that
|
||||
* kexec-tools can retrieve them from /proc/iomem. While there
|
||||
|
@ -59,16 +59,6 @@ int riscv_hartid_to_cpuid(int hartid)
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
cpumask_clear(out);
|
||||
for_each_cpu(cpu, in)
|
||||
cpumask_set_cpu(cpuid_to_hartid_map(cpu), out);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(riscv_cpuid_to_hartid_mask);
|
||||
|
||||
bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
|
||||
{
|
||||
return phys_id == cpuid_to_hartid_map(cpu);
|
||||
|
@ -45,7 +45,6 @@ SECTIONS
|
||||
ENTRY_TEXT
|
||||
IRQENTRY_TEXT
|
||||
SOFTIRQENTRY_TEXT
|
||||
*(.fixup)
|
||||
_etext = .;
|
||||
}
|
||||
RO_DATA(L1_CACHE_BYTES)
|
||||
|
@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2017 SiFive
|
||||
*/
|
||||
|
||||
#define RO_EXCEPTION_TABLE_ALIGN 16
|
||||
#define RO_EXCEPTION_TABLE_ALIGN 4
|
||||
|
||||
#ifdef CONFIG_XIP_KERNEL
|
||||
#include "vmlinux-xip.lds.S"
|
||||
@ -48,7 +48,6 @@ SECTIONS
|
||||
ENTRY_TEXT
|
||||
IRQENTRY_TEXT
|
||||
SOFTIRQENTRY_TEXT
|
||||
*(.fixup)
|
||||
_etext = .;
|
||||
}
|
||||
|
||||
|
@ -1,15 +1,13 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm-generic/export.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/csr.h>
|
||||
|
||||
.macro fixup op reg addr lbl
|
||||
100:
|
||||
\op \reg, \addr
|
||||
.section __ex_table,"a"
|
||||
.balign RISCV_SZPTR
|
||||
RISCV_PTR 100b, \lbl
|
||||
.previous
|
||||
_asm_extable 100b, \lbl
|
||||
.endm
|
||||
|
||||
ENTRY(__asm_copy_to_user)
|
||||
@ -173,6 +171,13 @@ ENTRY(__asm_copy_from_user)
|
||||
csrc CSR_STATUS, t6
|
||||
li a0, 0
|
||||
ret
|
||||
|
||||
/* Exception fixup code */
|
||||
10:
|
||||
/* Disable access to user memory */
|
||||
csrs CSR_STATUS, t6
|
||||
mv a0, t5
|
||||
ret
|
||||
ENDPROC(__asm_copy_to_user)
|
||||
ENDPROC(__asm_copy_from_user)
|
||||
EXPORT_SYMBOL(__asm_copy_to_user)
|
||||
@ -218,19 +223,12 @@ ENTRY(__clear_user)
|
||||
addi a0, a0, 1
|
||||
bltu a0, a3, 5b
|
||||
j 3b
|
||||
ENDPROC(__clear_user)
|
||||
EXPORT_SYMBOL(__clear_user)
|
||||
|
||||
.section .fixup,"ax"
|
||||
.balign 4
|
||||
/* Fixup code for __copy_user(10) and __clear_user(11) */
|
||||
10:
|
||||
/* Disable access to user memory */
|
||||
csrs CSR_STATUS, t6
|
||||
mv a0, t5
|
||||
ret
|
||||
/* Exception fixup code */
|
||||
11:
|
||||
/* Disable access to user memory */
|
||||
csrs CSR_STATUS, t6
|
||||
mv a0, a1
|
||||
ret
|
||||
.previous
|
||||
ENDPROC(__clear_user)
|
||||
EXPORT_SYMBOL(__clear_user)
|
||||
|
@ -7,27 +7,65 @@
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I)
|
||||
int rv_bpf_fixup_exception(const struct exception_table_entry *ex, struct pt_regs *regs);
|
||||
#endif
|
||||
|
||||
int fixup_exception(struct pt_regs *regs)
|
||||
static inline unsigned long
|
||||
get_ex_fixup(const struct exception_table_entry *ex)
|
||||
{
|
||||
const struct exception_table_entry *fixup;
|
||||
|
||||
fixup = search_exception_tables(regs->epc);
|
||||
if (!fixup)
|
||||
return 0;
|
||||
|
||||
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I)
|
||||
if (regs->epc >= BPF_JIT_REGION_START && regs->epc < BPF_JIT_REGION_END)
|
||||
return rv_bpf_fixup_exception(fixup, regs);
|
||||
#endif
|
||||
|
||||
regs->epc = fixup->fixup;
|
||||
return 1;
|
||||
return ((unsigned long)&ex->fixup + ex->fixup);
|
||||
}
|
||||
|
||||
static bool ex_handler_fixup(const struct exception_table_entry *ex,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
regs->epc = get_ex_fixup(ex);
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline void regs_set_gpr(struct pt_regs *regs, unsigned int offset,
|
||||
unsigned long val)
|
||||
{
|
||||
if (unlikely(offset > MAX_REG_OFFSET))
|
||||
return;
|
||||
|
||||
if (!offset)
|
||||
*(unsigned long *)((unsigned long)regs + offset) = val;
|
||||
}
|
||||
|
||||
static bool ex_handler_uaccess_err_zero(const struct exception_table_entry *ex,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
int reg_err = FIELD_GET(EX_DATA_REG_ERR, ex->data);
|
||||
int reg_zero = FIELD_GET(EX_DATA_REG_ZERO, ex->data);
|
||||
|
||||
regs_set_gpr(regs, reg_err, -EFAULT);
|
||||
regs_set_gpr(regs, reg_zero, 0);
|
||||
|
||||
regs->epc = get_ex_fixup(ex);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool fixup_exception(struct pt_regs *regs)
|
||||
{
|
||||
const struct exception_table_entry *ex;
|
||||
|
||||
ex = search_exception_tables(regs->epc);
|
||||
if (!ex)
|
||||
return false;
|
||||
|
||||
switch (ex->type) {
|
||||
case EX_TYPE_FIXUP:
|
||||
return ex_handler_fixup(ex, regs);
|
||||
case EX_TYPE_BPF:
|
||||
return ex_handler_bpf(ex, regs);
|
||||
case EX_TYPE_UACCESS_ERR_ZERO:
|
||||
return ex_handler_uaccess_err_zero(ex, regs);
|
||||
}
|
||||
|
||||
BUG();
|
||||
}
|
||||
|
@ -235,7 +235,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs)
|
||||
* only copy the information from the master page table,
|
||||
* nothing more.
|
||||
*/
|
||||
if (unlikely((addr >= VMALLOC_START) && (addr <= VMALLOC_END))) {
|
||||
if (unlikely((addr >= VMALLOC_START) && (addr < VMALLOC_END))) {
|
||||
vmalloc_fault(regs, code, addr);
|
||||
return;
|
||||
}
|
||||
|
@ -187,10 +187,10 @@ static void __init setup_bootmem(void)
|
||||
|
||||
|
||||
phys_ram_end = memblock_end_of_DRAM();
|
||||
#ifndef CONFIG_64BIT
|
||||
#ifndef CONFIG_XIP_KERNEL
|
||||
phys_ram_base = memblock_start_of_DRAM();
|
||||
#endif
|
||||
#ifndef CONFIG_64BIT
|
||||
/*
|
||||
* memblock allocator is not aware of the fact that last 4K bytes of
|
||||
* the addressable memory can not be mapped because of IS_ERR_VALUE
|
||||
@ -367,7 +367,8 @@ static phys_addr_t __init alloc_pmd_late(uintptr_t va)
|
||||
unsigned long vaddr;
|
||||
|
||||
vaddr = __get_free_page(GFP_KERNEL);
|
||||
BUG_ON(!vaddr);
|
||||
BUG_ON(!vaddr || !pgtable_pmd_page_ctor(virt_to_page(vaddr)));
|
||||
|
||||
return __pa(vaddr);
|
||||
}
|
||||
|
||||
@ -812,13 +813,22 @@ static void __init reserve_crashkernel(void)
|
||||
/*
|
||||
* Current riscv boot protocol requires 2MB alignment for
|
||||
* RV64 and 4MB alignment for RV32 (hugepage size)
|
||||
*
|
||||
* Try to alloc from 32bit addressible physical memory so that
|
||||
* swiotlb can work on the crash kernel.
|
||||
*/
|
||||
crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
|
||||
search_start, search_end);
|
||||
search_start,
|
||||
min(search_end, (unsigned long) SZ_4G));
|
||||
if (crash_base == 0) {
|
||||
pr_warn("crashkernel: couldn't allocate %lldKB\n",
|
||||
crash_size >> 10);
|
||||
return;
|
||||
/* Try again without restricting region to 32bit addressible memory */
|
||||
crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
|
||||
search_start, search_end);
|
||||
if (crash_base == 0) {
|
||||
pr_warn("crashkernel: couldn't allocate %lldKB\n",
|
||||
crash_size >> 10);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pr_info("crashkernel: reserved 0x%016llx - 0x%016llx (%lld MB)\n",
|
||||
|
@ -458,10 +458,8 @@ static int emit_call(bool fixed, u64 addr, struct rv_jit_context *ctx)
|
||||
#define BPF_FIXUP_OFFSET_MASK GENMASK(26, 0)
|
||||
#define BPF_FIXUP_REG_MASK GENMASK(31, 27)
|
||||
|
||||
int rv_bpf_fixup_exception(const struct exception_table_entry *ex,
|
||||
struct pt_regs *regs);
|
||||
int rv_bpf_fixup_exception(const struct exception_table_entry *ex,
|
||||
struct pt_regs *regs)
|
||||
bool ex_handler_bpf(const struct exception_table_entry *ex,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
off_t offset = FIELD_GET(BPF_FIXUP_OFFSET_MASK, ex->fixup);
|
||||
int regs_offset = FIELD_GET(BPF_FIXUP_REG_MASK, ex->fixup);
|
||||
@ -469,7 +467,7 @@ int rv_bpf_fixup_exception(const struct exception_table_entry *ex,
|
||||
*(unsigned long *)((void *)regs + pt_regmap[regs_offset]) = 0;
|
||||
regs->epc = (unsigned long)&ex->fixup - offset;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* For accesses to BTF pointers, add an entry to the exception table */
|
||||
@ -515,6 +513,7 @@ static int add_exception_handler(const struct bpf_insn *insn,
|
||||
|
||||
ex->fixup = FIELD_PREP(BPF_FIXUP_OFFSET_MASK, offset) |
|
||||
FIELD_PREP(BPF_FIXUP_REG_MASK, dst_reg);
|
||||
ex->type = EX_TYPE_BPF;
|
||||
|
||||
ctx->nexentries++;
|
||||
return 0;
|
||||
|
@ -1830,6 +1830,14 @@ static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef EM_RISCV
|
||||
#define EM_RISCV 243
|
||||
#endif
|
||||
|
||||
#ifndef R_RISCV_SUB32
|
||||
#define R_RISCV_SUB32 39
|
||||
#endif
|
||||
|
||||
static void section_rela(const char *modname, struct elf_info *elf,
|
||||
Elf_Shdr *sechdr)
|
||||
{
|
||||
@ -1866,6 +1874,13 @@ static void section_rela(const char *modname, struct elf_info *elf,
|
||||
r_sym = ELF_R_SYM(r.r_info);
|
||||
#endif
|
||||
r.r_addend = TO_NATIVE(rela->r_addend);
|
||||
switch (elf->hdr->e_machine) {
|
||||
case EM_RISCV:
|
||||
if (!strcmp("__ex_table", fromsec) &&
|
||||
ELF_R_TYPE(r.r_info) == R_RISCV_SUB32)
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
sym = elf->symtab_start + r_sym;
|
||||
/* Skip special sections */
|
||||
if (is_shndx_special(sym->st_shndx))
|
||||
|
@ -233,7 +233,7 @@ static void sort_relative_table(char *extab_image, int image_size)
|
||||
}
|
||||
}
|
||||
|
||||
static void arm64_sort_relative_table(char *extab_image, int image_size)
|
||||
static void sort_relative_table_with_data(char *extab_image, int image_size)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
@ -261,34 +261,6 @@ static void arm64_sort_relative_table(char *extab_image, int image_size)
|
||||
}
|
||||
}
|
||||
|
||||
static void x86_sort_relative_table(char *extab_image, int image_size)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (i < image_size) {
|
||||
uint32_t *loc = (uint32_t *)(extab_image + i);
|
||||
|
||||
w(r(loc) + i, loc);
|
||||
w(r(loc + 1) + i + 4, loc + 1);
|
||||
/* Don't touch the fixup type */
|
||||
|
||||
i += sizeof(uint32_t) * 3;
|
||||
}
|
||||
|
||||
qsort(extab_image, image_size / 12, 12, compare_relative_table);
|
||||
|
||||
i = 0;
|
||||
while (i < image_size) {
|
||||
uint32_t *loc = (uint32_t *)(extab_image + i);
|
||||
|
||||
w(r(loc) - i, loc);
|
||||
w(r(loc + 1) - (i + 4), loc + 1);
|
||||
/* Don't touch the fixup type */
|
||||
|
||||
i += sizeof(uint32_t) * 3;
|
||||
}
|
||||
}
|
||||
|
||||
static void s390_sort_relative_table(char *extab_image, int image_size)
|
||||
{
|
||||
int i;
|
||||
@ -366,15 +338,14 @@ static int do_file(char const *const fname, void *addr)
|
||||
|
||||
switch (r2(&ehdr->e_machine)) {
|
||||
case EM_386:
|
||||
case EM_AARCH64:
|
||||
case EM_RISCV:
|
||||
case EM_X86_64:
|
||||
custom_sort = x86_sort_relative_table;
|
||||
custom_sort = sort_relative_table_with_data;
|
||||
break;
|
||||
case EM_S390:
|
||||
custom_sort = s390_sort_relative_table;
|
||||
break;
|
||||
case EM_AARCH64:
|
||||
custom_sort = arm64_sort_relative_table;
|
||||
break;
|
||||
case EM_PARISC:
|
||||
case EM_PPC:
|
||||
case EM_PPC64:
|
||||
@ -385,7 +356,6 @@ static int do_file(char const *const fname, void *addr)
|
||||
case EM_ARM:
|
||||
case EM_MICROBLAZE:
|
||||
case EM_MIPS:
|
||||
case EM_RISCV:
|
||||
case EM_XTENSA:
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user