Commit f1b744f6 authored by Linus Torvalds's avatar Linus Torvalds

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
  ...
parents fd6f57bf b579dfe7
...@@ -14,6 +14,7 @@ config RISCV ...@@ -14,6 +14,7 @@ config RISCV
def_bool y def_bool y
select ARCH_CLOCKSOURCE_INIT select ARCH_CLOCKSOURCE_INIT
select ARCH_ENABLE_HUGEPAGE_MIGRATION if HUGETLB_PAGE && MIGRATION 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_BINFMT_FLAT
select ARCH_HAS_DEBUG_VM_PGTABLE select ARCH_HAS_DEBUG_VM_PGTABLE
select ARCH_HAS_DEBUG_VIRTUAL if MMU select ARCH_HAS_DEBUG_VIRTUAL if MMU
...@@ -75,6 +76,7 @@ config RISCV ...@@ -75,6 +76,7 @@ config RISCV
select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_SECCOMP_FILTER
select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRACEHOOK
select HAVE_ARCH_TRANSPARENT_HUGEPAGE if 64BIT && MMU 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_THREAD_STRUCT_WHITELIST
select HAVE_ARCH_VMAP_STACK if MMU && 64BIT select HAVE_ARCH_VMAP_STACK if MMU && 64BIT
select HAVE_ASM_MODVERSIONS select HAVE_ASM_MODVERSIONS
...@@ -279,7 +281,7 @@ choice ...@@ -279,7 +281,7 @@ choice
depends on 32BIT depends on 32BIT
bool "1GiB" bool "1GiB"
config MAXPHYSMEM_2GB config MAXPHYSMEM_2GB
depends on 64BIT && CMODEL_MEDLOW depends on 64BIT
bool "2GiB" bool "2GiB"
config MAXPHYSMEM_128GB config MAXPHYSMEM_128GB
depends on 64BIT && CMODEL_MEDANY depends on 64BIT && CMODEL_MEDANY
......
...@@ -103,8 +103,8 @@ rom0: nvmem@1000 { ...@@ -103,8 +103,8 @@ rom0: nvmem@1000 {
clint0: timer@2000000 { clint0: timer@2000000 {
compatible = "canaan,k210-clint", "sifive,clint0"; compatible = "canaan,k210-clint", "sifive,clint0";
reg = <0x2000000 0xC000>; reg = <0x2000000 0xC000>;
interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7 interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>,
&cpu1_intc 3 &cpu1_intc 7>; <&cpu1_intc 3>, <&cpu1_intc 7>;
}; };
plic0: interrupt-controller@c000000 { plic0: interrupt-controller@c000000 {
...@@ -113,7 +113,7 @@ plic0: interrupt-controller@c000000 { ...@@ -113,7 +113,7 @@ plic0: interrupt-controller@c000000 {
compatible = "canaan,k210-plic", "sifive,plic-1.0.0"; compatible = "canaan,k210-plic", "sifive,plic-1.0.0";
reg = <0xC000000 0x4000000>; reg = <0xC000000 0x4000000>;
interrupt-controller; interrupt-controller;
interrupts-extended = <&cpu0_intc 11 &cpu1_intc 11>; interrupts-extended = <&cpu0_intc 11>, <&cpu1_intc 11>;
riscv,ndev = <65>; riscv,ndev = <65>;
}; };
...@@ -130,10 +130,11 @@ gpio0: gpio-controller@38001000 { ...@@ -130,10 +130,11 @@ gpio0: gpio-controller@38001000 {
compatible = "canaan,k210-gpiohs", "sifive,gpio0"; compatible = "canaan,k210-gpiohs", "sifive,gpio0";
reg = <0x38001000 0x1000>; reg = <0x38001000 0x1000>;
interrupt-controller; interrupt-controller;
interrupts = <34 35 36 37 38 39 40 41 interrupts = <34>, <35>, <36>, <37>, <38>, <39>, <40>,
42 43 44 45 46 47 48 49 <41>, <42>, <43>, <44>, <45>, <46>, <47>,
50 51 52 53 54 55 56 57 <48>, <49>, <50>, <51>, <52>, <53>, <54>,
58 59 60 61 62 63 64 65>; <55>, <56>, <57>, <58>, <59>, <60>, <61>,
<62>, <63>, <64>, <65>;
gpio-controller; gpio-controller;
ngpios = <32>; ngpios = <32>;
}; };
...@@ -141,7 +142,7 @@ gpio0: gpio-controller@38001000 { ...@@ -141,7 +142,7 @@ gpio0: gpio-controller@38001000 {
dmac0: dma-controller@50000000 { dmac0: dma-controller@50000000 {
compatible = "snps,axi-dma-1.01a"; compatible = "snps,axi-dma-1.01a";
reg = <0x50000000 0x1000>; reg = <0x50000000 0x1000>;
interrupts = <27 28 29 30 31 32>; interrupts = <27>, <28>, <29>, <30>, <31>, <32>;
#dma-cells = <1>; #dma-cells = <1>;
clocks = <&sysclk K210_CLK_DMA>, <&sysclk K210_CLK_DMA>; clocks = <&sysclk K210_CLK_DMA>, <&sysclk K210_CLK_DMA>;
clock-names = "core-clk", "cfgr-clk"; clock-names = "core-clk", "cfgr-clk";
...@@ -316,7 +317,7 @@ fpioa: pinmux@502b0000 { ...@@ -316,7 +317,7 @@ fpioa: pinmux@502b0000 {
timer0: timer@502d0000 { timer0: timer@502d0000 {
compatible = "snps,dw-apb-timer"; compatible = "snps,dw-apb-timer";
reg = <0x502D0000 0x100>; reg = <0x502D0000 0x100>;
interrupts = <14 15>; interrupts = <14>, <15>;
clocks = <&sysclk K210_CLK_TIMER0>, clocks = <&sysclk K210_CLK_TIMER0>,
<&sysclk K210_CLK_APB0>; <&sysclk K210_CLK_APB0>;
clock-names = "timer", "pclk"; clock-names = "timer", "pclk";
...@@ -326,7 +327,7 @@ timer0: timer@502d0000 { ...@@ -326,7 +327,7 @@ timer0: timer@502d0000 {
timer1: timer@502e0000 { timer1: timer@502e0000 {
compatible = "snps,dw-apb-timer"; compatible = "snps,dw-apb-timer";
reg = <0x502E0000 0x100>; reg = <0x502E0000 0x100>;
interrupts = <16 17>; interrupts = <16>, <17>;
clocks = <&sysclk K210_CLK_TIMER1>, clocks = <&sysclk K210_CLK_TIMER1>,
<&sysclk K210_CLK_APB0>; <&sysclk K210_CLK_APB0>;
clock-names = "timer", "pclk"; clock-names = "timer", "pclk";
...@@ -336,7 +337,7 @@ timer1: timer@502e0000 { ...@@ -336,7 +337,7 @@ timer1: timer@502e0000 {
timer2: timer@502f0000 { timer2: timer@502f0000 {
compatible = "snps,dw-apb-timer"; compatible = "snps,dw-apb-timer";
reg = <0x502F0000 0x100>; reg = <0x502F0000 0x100>;
interrupts = <18 19>; interrupts = <18>, <19>;
clocks = <&sysclk K210_CLK_TIMER2>, clocks = <&sysclk K210_CLK_TIMER2>,
<&sysclk K210_CLK_APB0>; <&sysclk K210_CLK_APB0>;
clock-names = "timer", "pclk"; clock-names = "timer", "pclk";
......
...@@ -199,7 +199,7 @@ slot@0 { ...@@ -199,7 +199,7 @@ slot@0 {
}; };
&spi3 { &spi3 {
spi-flash@0 { flash@0 {
compatible = "jedec,spi-nor"; compatible = "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <50000000>; spi-max-frequency = <50000000>;
......
...@@ -201,7 +201,7 @@ slot@0 { ...@@ -201,7 +201,7 @@ slot@0 {
}; };
&spi3 { &spi3 {
spi-flash@0 { flash@0 {
compatible = "jedec,spi-nor"; compatible = "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <50000000>; spi-max-frequency = <50000000>;
......
...@@ -209,7 +209,7 @@ slot@0 { ...@@ -209,7 +209,7 @@ slot@0 {
}; };
&spi3 { &spi3 {
spi-flash@0 { flash@0 {
compatible = "jedec,spi-nor"; compatible = "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <50000000>; spi-max-frequency = <50000000>;
......
...@@ -174,7 +174,7 @@ slot@0 { ...@@ -174,7 +174,7 @@ slot@0 {
}; };
&spi3 { &spi3 {
spi-flash@0 { flash@0 {
compatible = "jedec,spi-nor"; compatible = "jedec,spi-nor";
reg = <0>; reg = <0>;
spi-max-frequency = <50000000>; spi-max-frequency = <50000000>;
......
...@@ -35,6 +35,10 @@ memory@80000000 { ...@@ -35,6 +35,10 @@ memory@80000000 {
}; };
}; };
&refclk {
clock-frequency = <600000000>;
};
&serial0 { &serial0 {
status = "okay"; status = "okay";
}; };
......
...@@ -9,9 +9,6 @@ / { ...@@ -9,9 +9,6 @@ / {
model = "Microchip PolarFire SoC"; model = "Microchip PolarFire SoC";
compatible = "microchip,mpfs"; compatible = "microchip,mpfs";
chosen {
};
cpus { cpus {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
...@@ -142,6 +139,11 @@ cpu4_intc: interrupt-controller { ...@@ -142,6 +139,11 @@ cpu4_intc: interrupt-controller {
}; };
}; };
refclk: msspllclk {
compatible = "fixed-clock";
#clock-cells = <0>;
};
soc { soc {
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
...@@ -156,62 +158,48 @@ cache-controller@2010000 { ...@@ -156,62 +158,48 @@ cache-controller@2010000 {
cache-size = <2097152>; cache-size = <2097152>;
cache-unified; cache-unified;
interrupt-parent = <&plic>; interrupt-parent = <&plic>;
interrupts = <1 2 3>; interrupts = <1>, <2>, <3>;
reg = <0x0 0x2010000 0x0 0x1000>; reg = <0x0 0x2010000 0x0 0x1000>;
}; };
clint@2000000 { clint@2000000 {
compatible = "sifive,fu540-c000-clint", "sifive,clint0"; compatible = "sifive,fu540-c000-clint", "sifive,clint0";
reg = <0x0 0x2000000 0x0 0xC000>; reg = <0x0 0x2000000 0x0 0xC000>;
interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7 interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>,
&cpu1_intc 3 &cpu1_intc 7 <&cpu1_intc 3>, <&cpu1_intc 7>,
&cpu2_intc 3 &cpu2_intc 7 <&cpu2_intc 3>, <&cpu2_intc 7>,
&cpu3_intc 3 &cpu3_intc 7 <&cpu3_intc 3>, <&cpu3_intc 7>,
&cpu4_intc 3 &cpu4_intc 7>; <&cpu4_intc 3>, <&cpu4_intc 7>;
}; };
plic: interrupt-controller@c000000 { plic: interrupt-controller@c000000 {
#interrupt-cells = <1>;
compatible = "sifive,fu540-c000-plic", "sifive,plic-1.0.0"; compatible = "sifive,fu540-c000-plic", "sifive,plic-1.0.0";
reg = <0x0 0xc000000 0x0 0x4000000>; reg = <0x0 0xc000000 0x0 0x4000000>;
riscv,ndev = <186>; #address-cells = <0>;
#interrupt-cells = <1>;
interrupt-controller; interrupt-controller;
interrupts-extended = <&cpu0_intc 11 interrupts-extended = <&cpu0_intc 11>,
&cpu1_intc 11 &cpu1_intc 9 <&cpu1_intc 11>, <&cpu1_intc 9>,
&cpu2_intc 11 &cpu2_intc 9 <&cpu2_intc 11>, <&cpu2_intc 9>,
&cpu3_intc 11 &cpu3_intc 9 <&cpu3_intc 11>, <&cpu3_intc 9>,
&cpu4_intc 11 &cpu4_intc 9>; <&cpu4_intc 11>, <&cpu4_intc 9>;
riscv,ndev = <186>;
}; };
dma@3000000 { dma@3000000 {
compatible = "sifive,fu540-c000-pdma"; compatible = "sifive,fu540-c000-pdma";
reg = <0x0 0x3000000 0x0 0x8000>; reg = <0x0 0x3000000 0x0 0x8000>;
interrupt-parent = <&plic>; interrupt-parent = <&plic>;
interrupts = <23 24 25 26 27 28 29 30>; interrupts = <23>, <24>, <25>, <26>, <27>, <28>, <29>,
<30>;
#dma-cells = <1>; #dma-cells = <1>;
}; };
refclk: refclk {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <600000000>;
clock-output-names = "msspllclk";
};
clkcfg: clkcfg@20002000 { clkcfg: clkcfg@20002000 {
compatible = "microchip,mpfs-clkcfg"; compatible = "microchip,mpfs-clkcfg";
reg = <0x0 0x20002000 0x0 0x1000>; reg = <0x0 0x20002000 0x0 0x1000>;
reg-names = "mss_sysreg";
clocks = <&refclk>; clocks = <&refclk>;
#clock-cells = <1>; #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 { serial0: serial@20000000 {
...@@ -267,7 +255,7 @@ mmc: mmc@20008000 { ...@@ -267,7 +255,7 @@ mmc: mmc@20008000 {
compatible = "microchip,mpfs-sd4hc", "cdns,sd4hc"; compatible = "microchip,mpfs-sd4hc", "cdns,sd4hc";
reg = <0x0 0x20008000 0x0 0x1000>; reg = <0x0 0x20008000 0x0 0x1000>;
interrupt-parent = <&plic>; interrupt-parent = <&plic>;
interrupts = <88 89>; interrupts = <88>, <89>;
clocks = <&clkcfg 6>; clocks = <&clkcfg 6>;
max-frequency = <200000000>; max-frequency = <200000000>;
status = "disabled"; status = "disabled";
...@@ -277,7 +265,7 @@ emac0: ethernet@20110000 { ...@@ -277,7 +265,7 @@ emac0: ethernet@20110000 {
compatible = "cdns,macb"; compatible = "cdns,macb";
reg = <0x0 0x20110000 0x0 0x2000>; reg = <0x0 0x20110000 0x0 0x2000>;
interrupt-parent = <&plic>; interrupt-parent = <&plic>;
interrupts = <64 65 66 67>; interrupts = <64>, <65>, <66>, <67>;
local-mac-address = [00 00 00 00 00 00]; local-mac-address = [00 00 00 00 00 00];
clocks = <&clkcfg 4>, <&clkcfg 2>; clocks = <&clkcfg 4>, <&clkcfg 2>;
clock-names = "pclk", "hclk"; clock-names = "pclk", "hclk";
...@@ -290,7 +278,7 @@ emac1: ethernet@20112000 { ...@@ -290,7 +278,7 @@ emac1: ethernet@20112000 {
compatible = "cdns,macb"; compatible = "cdns,macb";
reg = <0x0 0x20112000 0x0 0x2000>; reg = <0x0 0x20112000 0x0 0x2000>;
interrupt-parent = <&plic>; interrupt-parent = <&plic>;
interrupts = <70 71 72 73>; interrupts = <70>, <71>, <72>, <73>;
local-mac-address = [00 00 00 00 00 00]; local-mac-address = [00 00 00 00 00 00];
clocks = <&clkcfg 5>, <&clkcfg 2>; clocks = <&clkcfg 5>, <&clkcfg 2>;
status = "disabled"; status = "disabled";
......
...@@ -137,20 +137,21 @@ cpu4_intc: interrupt-controller { ...@@ -137,20 +137,21 @@ cpu4_intc: interrupt-controller {
soc { soc {
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
compatible = "sifive,fu540-c000", "sifive,fu540", "simple-bus"; compatible = "simple-bus";
ranges; ranges;
plic0: interrupt-controller@c000000 { plic0: interrupt-controller@c000000 {
#interrupt-cells = <1>;
compatible = "sifive,fu540-c000-plic", "sifive,plic-1.0.0"; compatible = "sifive,fu540-c000-plic", "sifive,plic-1.0.0";
reg = <0x0 0xc000000 0x0 0x4000000>; reg = <0x0 0xc000000 0x0 0x4000000>;
riscv,ndev = <53>; #address-cells = <0>;
#interrupt-cells = <1>;
interrupt-controller; interrupt-controller;
interrupts-extended = < interrupts-extended =
&cpu0_intc 0xffffffff <&cpu0_intc 0xffffffff>,
&cpu1_intc 0xffffffff &cpu1_intc 9 <&cpu1_intc 0xffffffff>, <&cpu1_intc 9>,
&cpu2_intc 0xffffffff &cpu2_intc 9 <&cpu2_intc 0xffffffff>, <&cpu2_intc 9>,
&cpu3_intc 0xffffffff &cpu3_intc 9 <&cpu3_intc 0xffffffff>, <&cpu3_intc 9>,
&cpu4_intc 0xffffffff &cpu4_intc 9>; <&cpu4_intc 0xffffffff>, <&cpu4_intc 9>;
riscv,ndev = <53>;
}; };
prci: clock-controller@10000000 { prci: clock-controller@10000000 {
compatible = "sifive,fu540-c000-prci"; compatible = "sifive,fu540-c000-prci";
...@@ -170,7 +171,8 @@ dma: dma@3000000 { ...@@ -170,7 +171,8 @@ dma: dma@3000000 {
compatible = "sifive,fu540-c000-pdma"; compatible = "sifive,fu540-c000-pdma";
reg = <0x0 0x3000000 0x0 0x8000>; reg = <0x0 0x3000000 0x0 0x8000>;
interrupt-parent = <&plic0>; interrupt-parent = <&plic0>;
interrupts = <23 24 25 26 27 28 29 30>; interrupts = <23>, <24>, <25>, <26>, <27>, <28>, <29>,
<30>;
#dma-cells = <1>; #dma-cells = <1>;
}; };
uart1: serial@10011000 { uart1: serial@10011000 {
...@@ -195,8 +197,8 @@ i2c0: i2c@10030000 { ...@@ -195,8 +197,8 @@ i2c0: i2c@10030000 {
}; };
qspi0: spi@10040000 { qspi0: spi@10040000 {
compatible = "sifive,fu540-c000-spi", "sifive,spi0"; compatible = "sifive,fu540-c000-spi", "sifive,spi0";
reg = <0x0 0x10040000 0x0 0x1000 reg = <0x0 0x10040000 0x0 0x1000>,
0x0 0x20000000 0x0 0x10000000>; <0x0 0x20000000 0x0 0x10000000>;
interrupt-parent = <&plic0>; interrupt-parent = <&plic0>;
interrupts = <51>; interrupts = <51>;
clocks = <&prci PRCI_CLK_TLCLK>; clocks = <&prci PRCI_CLK_TLCLK>;
...@@ -206,8 +208,8 @@ qspi0: spi@10040000 { ...@@ -206,8 +208,8 @@ qspi0: spi@10040000 {
}; };
qspi1: spi@10041000 { qspi1: spi@10041000 {
compatible = "sifive,fu540-c000-spi", "sifive,spi0"; compatible = "sifive,fu540-c000-spi", "sifive,spi0";
reg = <0x0 0x10041000 0x0 0x1000 reg = <0x0 0x10041000 0x0 0x1000>,
0x0 0x30000000 0x0 0x10000000>; <0x0 0x30000000 0x0 0x10000000>;
interrupt-parent = <&plic0>; interrupt-parent = <&plic0>;
interrupts = <52>; interrupts = <52>;
clocks = <&prci PRCI_CLK_TLCLK>; clocks = <&prci PRCI_CLK_TLCLK>;
...@@ -229,8 +231,8 @@ eth0: ethernet@10090000 { ...@@ -229,8 +231,8 @@ eth0: ethernet@10090000 {
compatible = "sifive,fu540-c000-gem"; compatible = "sifive,fu540-c000-gem";
interrupt-parent = <&plic0>; interrupt-parent = <&plic0>;
interrupts = <53>; interrupts = <53>;
reg = <0x0 0x10090000 0x0 0x2000 reg = <0x0 0x10090000 0x0 0x2000>,
0x0 0x100a0000 0x0 0x1000>; <0x0 0x100a0000 0x0 0x1000>;
local-mac-address = [00 00 00 00 00 00]; local-mac-address = [00 00 00 00 00 00];
clock-names = "pclk", "hclk"; clock-names = "pclk", "hclk";
clocks = <&prci PRCI_CLK_GEMGXLPLL>, clocks = <&prci PRCI_CLK_GEMGXLPLL>,
...@@ -243,7 +245,7 @@ pwm0: pwm@10020000 { ...@@ -243,7 +245,7 @@ pwm0: pwm@10020000 {
compatible = "sifive,fu540-c000-pwm", "sifive,pwm0"; compatible = "sifive,fu540-c000-pwm", "sifive,pwm0";
reg = <0x0 0x10020000 0x0 0x1000>; reg = <0x0 0x10020000 0x0 0x1000>;
interrupt-parent = <&plic0>; interrupt-parent = <&plic0>;
interrupts = <42 43 44 45>; interrupts = <42>, <43>, <44>, <45>;
clocks = <&prci PRCI_CLK_TLCLK>; clocks = <&prci PRCI_CLK_TLCLK>;
#pwm-cells = <3>; #pwm-cells = <3>;
status = "disabled"; status = "disabled";
...@@ -252,7 +254,7 @@ pwm1: pwm@10021000 { ...@@ -252,7 +254,7 @@ pwm1: pwm@10021000 {
compatible = "sifive,fu540-c000-pwm", "sifive,pwm0"; compatible = "sifive,fu540-c000-pwm", "sifive,pwm0";
reg = <0x0 0x10021000 0x0 0x1000>; reg = <0x0 0x10021000 0x0 0x1000>;
interrupt-parent = <&plic0>; interrupt-parent = <&plic0>;
interrupts = <46 47 48 49>; interrupts = <46>, <47>, <48>, <49>;
clocks = <&prci PRCI_CLK_TLCLK>; clocks = <&prci PRCI_CLK_TLCLK>;
#pwm-cells = <3>; #pwm-cells = <3>;
status = "disabled"; status = "disabled";
...@@ -265,7 +267,7 @@ l2cache: cache-controller@2010000 { ...@@ -265,7 +267,7 @@ l2cache: cache-controller@2010000 {
cache-size = <2097152>; cache-size = <2097152>;
cache-unified; cache-unified;
interrupt-parent = <&plic0>; interrupt-parent = <&plic0>;
interrupts = <1 2 3>; interrupts = <1>, <2>, <3>;
reg = <0x0 0x2010000 0x0 0x1000>; reg = <0x0 0x2010000 0x0 0x1000>;
}; };
gpio: gpio@10060000 { gpio: gpio@10060000 {
......
...@@ -147,12 +147,12 @@ plic0: interrupt-controller@c000000 { ...@@ -147,12 +147,12 @@ plic0: interrupt-controller@c000000 {
reg = <0x0 0xc000000 0x0 0x4000000>; reg = <0x0 0xc000000 0x0 0x4000000>;
riscv,ndev = <69>; riscv,ndev = <69>;
interrupt-controller; interrupt-controller;
interrupts-extended = < interrupts-extended =
&cpu0_intc 0xffffffff <&cpu0_intc 0xffffffff>,
&cpu1_intc 0xffffffff &cpu1_intc 9 <&cpu1_intc 0xffffffff>, <&cpu1_intc 9>,
&cpu2_intc 0xffffffff &cpu2_intc 9 <&cpu2_intc 0xffffffff>, <&cpu2_intc 9>,
&cpu3_intc 0xffffffff &cpu3_intc 9 <&cpu3_intc 0xffffffff>, <&cpu3_intc 9>,
&cpu4_intc 0xffffffff &cpu4_intc 9>; <&cpu4_intc 0xffffffff>, <&cpu4_intc 9>;
}; };
prci: clock-controller@10000000 { prci: clock-controller@10000000 {
compatible = "sifive,fu740-c000-prci"; compatible = "sifive,fu740-c000-prci";
...@@ -273,7 +273,7 @@ ccache: cache-controller@2010000 { ...@@ -273,7 +273,7 @@ ccache: cache-controller@2010000 {
cache-size = <2097152>; cache-size = <2097152>;
cache-unified; cache-unified;
interrupt-parent = <&plic0>; interrupt-parent = <&plic0>;
interrupts = <19 21 22 20>; interrupts = <19>, <21>, <22>, <20>;
reg = <0x0 0x2010000 0x0 0x1000>; reg = <0x0 0x2010000 0x0 0x1000>;
}; };
gpio: gpio@10060000 { gpio: gpio@10060000 {
......
...@@ -2,6 +2,7 @@ CONFIG_SYSVIPC=y ...@@ -2,6 +2,7 @@ CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
CONFIG_NO_HZ_IDLE=y CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y CONFIG_HIGH_RES_TIMERS=y
CONFIG_BPF_SYSCALL=y
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_CGROUPS=y CONFIG_CGROUPS=y
...@@ -13,10 +14,10 @@ CONFIG_USER_NS=y ...@@ -13,10 +14,10 @@ CONFIG_USER_NS=y
CONFIG_CHECKPOINT_RESTORE=y CONFIG_CHECKPOINT_RESTORE=y
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
CONFIG_EXPERT=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_SIFIVE=y
CONFIG_SOC_VIRT=y CONFIG_SOC_VIRT=y
CONFIG_SOC_MICROCHIP_POLARFIRE=y
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_HOTPLUG_CPU=y CONFIG_HOTPLUG_CPU=y
CONFIG_VIRTUALIZATION=y CONFIG_VIRTUALIZATION=y
...@@ -70,14 +71,14 @@ CONFIG_HW_RANDOM=y ...@@ -70,14 +71,14 @@ CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_VIRTIO=y CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_SPI_SIFIVE=y CONFIG_SPI_SIFIVE=y
# CONFIG_PTP_1588_CLOCK is not set
CONFIG_GPIOLIB=y CONFIG_GPIOLIB=y
CONFIG_GPIO_SIFIVE=y CONFIG_GPIO_SIFIVE=y
# CONFIG_PTP_1588_CLOCK is not set
CONFIG_POWER_RESET=y
CONFIG_DRM=m CONFIG_DRM=m
CONFIG_DRM_RADEON=m CONFIG_DRM_RADEON=m
CONFIG_DRM_NOUVEAU=m CONFIG_DRM_NOUVEAU=m
CONFIG_DRM_VIRTIO_GPU=m CONFIG_DRM_VIRTIO_GPU=m
CONFIG_FB=y
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_HCD=y
...@@ -88,10 +89,10 @@ CONFIG_USB_OHCI_HCD=y ...@@ -88,10 +89,10 @@ CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
CONFIG_USB_UAS=y CONFIG_USB_UAS=y
CONFIG_MMC=y
CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_SDHCI_CADENCE=y CONFIG_MMC_SDHCI_CADENCE=y
CONFIG_MMC=y
CONFIG_MMC_SPI=y CONFIG_MMC_SPI=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_PCI=y
...@@ -142,5 +143,3 @@ CONFIG_RCU_EQS_DEBUG=y ...@@ -142,5 +143,3 @@ CONFIG_RCU_EQS_DEBUG=y
# CONFIG_FTRACE is not set # CONFIG_FTRACE is not set
# CONFIG_RUNTIME_TESTING_MENU is not set # CONFIG_RUNTIME_TESTING_MENU is not set
CONFIG_MEMTEST=y CONFIG_MEMTEST=y
# CONFIG_SYSFS_SYSCALL is not set
CONFIG_EFI=y
...@@ -29,7 +29,6 @@ CONFIG_EMBEDDED=y ...@@ -29,7 +29,6 @@ CONFIG_EMBEDDED=y
CONFIG_SLOB=y CONFIG_SLOB=y
# CONFIG_MMU is not set # CONFIG_MMU is not set
CONFIG_SOC_CANAAN=y CONFIG_SOC_CANAAN=y
CONFIG_SOC_CANAAN_K210_DTB_SOURCE="k210_generic"
CONFIG_MAXPHYSMEM_2GB=y CONFIG_MAXPHYSMEM_2GB=y
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_NR_CPUS=2 CONFIG_NR_CPUS=2
...@@ -75,7 +74,6 @@ CONFIG_LEDS_GPIO=y ...@@ -75,7 +74,6 @@ CONFIG_LEDS_GPIO=y
CONFIG_LEDS_USER=y CONFIG_LEDS_USER=y
# CONFIG_VIRTIO_MENU is not set # CONFIG_VIRTIO_MENU is not set
# CONFIG_VHOST_MENU is not set # CONFIG_VHOST_MENU is not set
# CONFIG_SURFACE_PLATFORMS is not set
# CONFIG_FILE_LOCKING is not set # CONFIG_FILE_LOCKING is not set
# CONFIG_DNOTIFY is not set # CONFIG_DNOTIFY is not set
# CONFIG_INOTIFY_USER is not set # CONFIG_INOTIFY_USER is not set
......
...@@ -21,7 +21,6 @@ CONFIG_EMBEDDED=y ...@@ -21,7 +21,6 @@ CONFIG_EMBEDDED=y
CONFIG_SLOB=y CONFIG_SLOB=y
# CONFIG_MMU is not set # CONFIG_MMU is not set
CONFIG_SOC_CANAAN=y CONFIG_SOC_CANAAN=y
CONFIG_SOC_CANAAN_K210_DTB_SOURCE="k210_generic"
CONFIG_MAXPHYSMEM_2GB=y CONFIG_MAXPHYSMEM_2GB=y
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_NR_CPUS=2 CONFIG_NR_CPUS=2
...@@ -30,7 +29,6 @@ CONFIG_CMDLINE_FORCE=y ...@@ -30,7 +29,6 @@ CONFIG_CMDLINE_FORCE=y
# CONFIG_SECCOMP is not set # CONFIG_SECCOMP is not set
# CONFIG_STACKPROTECTOR is not set # CONFIG_STACKPROTECTOR is not set
# CONFIG_GCC_PLUGINS 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_DEADLINE is not set
# CONFIG_MQ_IOSCHED_KYBER is not set # CONFIG_MQ_IOSCHED_KYBER is not set
CONFIG_BINFMT_FLAT=y CONFIG_BINFMT_FLAT=y
...@@ -72,7 +70,6 @@ CONFIG_LEDS_GPIO=y ...@@ -72,7 +70,6 @@ CONFIG_LEDS_GPIO=y
CONFIG_LEDS_USER=y CONFIG_LEDS_USER=y
# CONFIG_VIRTIO_MENU is not set # CONFIG_VIRTIO_MENU is not set
# CONFIG_VHOST_MENU is not set # CONFIG_VHOST_MENU is not set
# CONFIG_SURFACE_PLATFORMS is not set
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
# CONFIG_FILE_LOCKING is not set # CONFIG_FILE_LOCKING is not set
# CONFIG_DNOTIFY is not set # CONFIG_DNOTIFY is not set
......
...@@ -32,7 +32,6 @@ CONFIG_SMP=y ...@@ -32,7 +32,6 @@ CONFIG_SMP=y
CONFIG_CMDLINE="root=/dev/vda rw earlycon=uart8250,mmio,0x10000000,115200n8 console=ttyS0" CONFIG_CMDLINE="root=/dev/vda rw earlycon=uart8250,mmio,0x10000000,115200n8 console=ttyS0"
CONFIG_CMDLINE_FORCE=y CONFIG_CMDLINE_FORCE=y
CONFIG_JUMP_LABEL=y CONFIG_JUMP_LABEL=y
# CONFIG_BLK_DEV_BSG is not set
CONFIG_PARTITION_ADVANCED=y CONFIG_PARTITION_ADVANCED=y
# CONFIG_MSDOS_PARTITION is not set # CONFIG_MSDOS_PARTITION is not set
# CONFIG_EFI_PARTITION is not set # CONFIG_EFI_PARTITION is not set
......
...@@ -2,6 +2,7 @@ CONFIG_SYSVIPC=y ...@@ -2,6 +2,7 @@ CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
CONFIG_NO_HZ_IDLE=y CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y CONFIG_HIGH_RES_TIMERS=y
CONFIG_BPF_SYSCALL=y
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_CGROUPS=y CONFIG_CGROUPS=y
...@@ -13,7 +14,7 @@ CONFIG_USER_NS=y ...@@ -13,7 +14,7 @@ CONFIG_USER_NS=y
CONFIG_CHECKPOINT_RESTORE=y CONFIG_CHECKPOINT_RESTORE=y
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
CONFIG_EXPERT=y CONFIG_EXPERT=y
CONFIG_BPF_SYSCALL=y # CONFIG_SYSFS_SYSCALL is not set
CONFIG_SOC_SIFIVE=y CONFIG_SOC_SIFIVE=y
CONFIG_SOC_VIRT=y CONFIG_SOC_VIRT=y
CONFIG_ARCH_RV32I=y CONFIG_ARCH_RV32I=y
...@@ -69,10 +70,10 @@ CONFIG_HW_RANDOM_VIRTIO=y ...@@ -69,10 +70,10 @@ CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_SPI_SIFIVE=y CONFIG_SPI_SIFIVE=y
# CONFIG_PTP_1588_CLOCK is not set # CONFIG_PTP_1588_CLOCK is not set
CONFIG_POWER_RESET=y
CONFIG_DRM=y CONFIG_DRM=y
CONFIG_DRM_RADEON=y CONFIG_DRM_RADEON=y
CONFIG_DRM_VIRTIO_GPU=y CONFIG_DRM_VIRTIO_GPU=y
CONFIG_FB=y
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_HCD=y
...@@ -132,4 +133,3 @@ CONFIG_RCU_EQS_DEBUG=y ...@@ -132,4 +133,3 @@ CONFIG_RCU_EQS_DEBUG=y
# CONFIG_FTRACE is not set # CONFIG_FTRACE is not set
# CONFIG_RUNTIME_TESTING_MENU is not set # CONFIG_RUNTIME_TESTING_MENU is not set
CONFIG_MEMTEST=y CONFIG_MEMTEST=y
# CONFIG_SYSFS_SYSCALL is not set
...@@ -22,7 +22,8 @@ static struct cpu_manufacturer_info_t { ...@@ -22,7 +22,8 @@ static struct cpu_manufacturer_info_t {
} cpu_mfr_info; } cpu_mfr_info;
static void (*vendor_patch_func)(struct alt_entry *begin, struct alt_entry *end, 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) static inline void __init riscv_fill_cpu_mfr_info(void)
{ {
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
generic-y += early_ioremap.h generic-y += early_ioremap.h
generic-y += extable.h
generic-y += flat.h generic-y += flat.h
generic-y += kvm_para.h generic-y += kvm_para.h
generic-y += user.h generic-y += user.h
......
/* 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 */
/* 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 @@ ...@@ -11,6 +11,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <asm/asm.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 */ /* We don't even really need the extable code, but for now keep it simple */
#ifndef CONFIG_MMU #ifndef CONFIG_MMU
...@@ -20,23 +21,14 @@ ...@@ -20,23 +21,14 @@
#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
{ \ { \
uintptr_t tmp; \
__enable_user_access(); \ __enable_user_access(); \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
"1: " insn " \n" \ "1: " insn " \n" \
"2: \n" \ "2: \n" \
" .section .fixup,\"ax\" \n" \ _ASM_EXTABLE_UACCESS_ERR(1b, 2b, %[r]) \
" .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" \
: [r] "+r" (ret), [ov] "=&r" (oldval), \ : [r] "+r" (ret), [ov] "=&r" (oldval), \
[u] "+m" (*uaddr), [t] "=&r" (tmp) \ [u] "+m" (*uaddr) \
: [op] "Jr" (oparg), [e] "i" (-EFAULT) \ : [op] "Jr" (oparg) \
: "memory"); \ : "memory"); \
__disable_user_access(); \ __disable_user_access(); \
} }
...@@ -98,18 +90,10 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, ...@@ -98,18 +90,10 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
"2: sc.w.aqrl %[t],%z[nv],%[u] \n" "2: sc.w.aqrl %[t],%z[nv],%[u] \n"
" bnez %[t],1b \n" " bnez %[t],1b \n"
"3: \n" "3: \n"
" .section .fixup,\"ax\" \n" _ASM_EXTABLE_UACCESS_ERR(1b, 3b, %[r]) \
" .balign 4 \n" _ASM_EXTABLE_UACCESS_ERR(2b, 3b, %[r]) \
"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"
: [r] "+r" (ret), [v] "=&r" (val), [u] "+m" (*uaddr), [t] "=&r" (tmp) : [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"); : "memory");
__disable_user_access(); __disable_user_access();
......
/* 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 @@ ...@@ -31,7 +31,7 @@
* _PAGE_PROT_NONE is set on not-present pages (and ignored by the hardware) to * _PAGE_PROT_NONE is set on not-present pages (and ignored by the hardware) to
* distinguish them from swapped out pages * distinguish them from swapped out pages
*/ */
#define _PAGE_PROT_NONE _PAGE_READ #define _PAGE_PROT_NONE _PAGE_GLOBAL
#define _PAGE_PFN_SHIFT 10 #define _PAGE_PFN_SHIFT 10
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#endif #endif
#define VMALLOC_SIZE (KERN_VIRT_SIZE >> 1) #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 VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)
#define BPF_JIT_REGION_SIZE (SZ_128M) #define BPF_JIT_REGION_SIZE (SZ_128M)
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
#define VMEMMAP_SHIFT \ #define VMEMMAP_SHIFT \
(CONFIG_VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT) (CONFIG_VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT)
#define VMEMMAP_SIZE BIT(VMEMMAP_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) #define VMEMMAP_START (VMALLOC_START - VMEMMAP_SIZE)
/* /*
...@@ -119,7 +119,7 @@ ...@@ -119,7 +119,7 @@
/* Page protection bits */ /* Page protection bits */
#define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER) #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_READ __pgprot(_PAGE_BASE | _PAGE_READ)
#define PAGE_WRITE __pgprot(_PAGE_BASE | _PAGE_READ | _PAGE_WRITE) #define PAGE_WRITE __pgprot(_PAGE_BASE | _PAGE_READ | _PAGE_WRITE)
#define PAGE_EXEC __pgprot(_PAGE_BASE | _PAGE_EXEC) #define PAGE_EXEC __pgprot(_PAGE_BASE | _PAGE_EXEC)
...@@ -628,11 +628,12 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma, ...@@ -628,11 +628,12 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
* *
* Format of swap PTE: * Format of swap PTE:
* bit 0: _PAGE_PRESENT (zero) * bit 0: _PAGE_PRESENT (zero)
* bit 1: _PAGE_PROT_NONE (zero) * bit 1 to 3: _PAGE_LEAF (zero)
* bits 2 to 6: swap type * bit 5: _PAGE_PROT_NONE (zero)
* bits 7 to XLEN-1: swap offset * 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_BITS 5
#define __SWP_TYPE_MASK ((1UL << __SWP_TYPE_BITS) - 1) #define __SWP_TYPE_MASK ((1UL << __SWP_TYPE_BITS) - 1)
#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) #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, ...@@ -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 __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
#define __swp_entry_to_pte(x) ((pte_t) { (x).val }) #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 * In the RV64 Linux scheme, we give the user half of the virtual-address space
* and give the kernel the other (upper) half. * and give the kernel the other (upper) half.
......
...@@ -27,6 +27,7 @@ enum sbi_ext_id { ...@@ -27,6 +27,7 @@ enum sbi_ext_id {
SBI_EXT_IPI = 0x735049, SBI_EXT_IPI = 0x735049,
SBI_EXT_RFENCE = 0x52464E43, SBI_EXT_RFENCE = 0x52464E43,
SBI_EXT_HSM = 0x48534D, SBI_EXT_HSM = 0x48534D,
SBI_EXT_SRST = 0x53525354,
/* Experimentals extensions must lie within this range */ /* Experimentals extensions must lie within this range */
SBI_EXT_EXPERIMENTAL_START = 0x08000000, SBI_EXT_EXPERIMENTAL_START = 0x08000000,
...@@ -78,6 +79,21 @@ enum sbi_hsm_hart_status { ...@@ -78,6 +79,21 @@ enum sbi_hsm_hart_status {
SBI_HSM_HART_STATUS_STOP_PENDING, 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_DEFAULT 0x1
#define SBI_SPEC_VERSION_MAJOR_SHIFT 24 #define SBI_SPEC_VERSION_MAJOR_SHIFT 24
#define SBI_SPEC_VERSION_MAJOR_MASK 0x7f #define SBI_SPEC_VERSION_MAJOR_MASK 0x7f
...@@ -157,6 +173,14 @@ static inline unsigned long sbi_minor_version(void) ...@@ -157,6 +173,14 @@ static inline unsigned long sbi_minor_version(void)
return sbi_spec_version & SBI_SPEC_VERSION_MINOR_MASK; 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); int sbi_err_map_linux_errno(int err);
#else /* CONFIG_RISCV_SBI */ #else /* CONFIG_RISCV_SBI */
static inline int sbi_remote_fence_i(const unsigned long *hart_mask) { return -1; } 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); ...@@ -43,7 +43,6 @@ void arch_send_call_function_ipi_mask(struct cpumask *mask);
void arch_send_call_function_single_ipi(int cpu); void arch_send_call_function_single_ipi(int cpu);
int riscv_hartid_to_cpuid(int hartid); int riscv_hartid_to_cpuid(int hartid);
void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
/* Set custom IPI operations */ /* Set custom IPI operations */
void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops); void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops);
...@@ -63,8 +62,6 @@ asmlinkage void smp_callin(void); ...@@ -63,8 +62,6 @@ asmlinkage void smp_callin(void);
#if defined CONFIG_HOTPLUG_CPU #if defined CONFIG_HOTPLUG_CPU
int __cpu_disable(void); int __cpu_disable(void);
void __cpu_die(unsigned int cpu); void __cpu_die(unsigned int cpu);
void cpu_stop(void);
#else
#endif /* CONFIG_HOTPLUG_CPU */ #endif /* CONFIG_HOTPLUG_CPU */
#else #else
...@@ -85,13 +82,6 @@ static inline unsigned long cpuid_to_hartid_map(int cpu) ...@@ -85,13 +82,6 @@ static inline unsigned long cpuid_to_hartid_map(int cpu)
return boot_cpu_hartid; 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) static inline void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops)
{ {
} }
...@@ -102,6 +92,8 @@ static inline void riscv_clear_ipi(void) ...@@ -102,6 +92,8 @@ static inline void riscv_clear_ipi(void)
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
#if defined(CONFIG_HOTPLUG_CPU) && (CONFIG_SMP) #if defined(CONFIG_HOTPLUG_CPU) && (CONFIG_SMP)
bool cpu_has_hotplug(unsigned int cpu); bool cpu_has_hotplug(unsigned int cpu);
#else #else
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#ifndef _ASM_RISCV_UACCESS_H #ifndef _ASM_RISCV_UACCESS_H
#define _ASM_RISCV_UACCESS_H #define _ASM_RISCV_UACCESS_H
#include <asm/asm-extable.h>
#include <asm/pgtable.h> /* for TASK_SIZE */ #include <asm/pgtable.h> /* for TASK_SIZE */
/* /*
...@@ -80,25 +81,14 @@ static inline int __access_ok(unsigned long addr, unsigned long size) ...@@ -80,25 +81,14 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
#define __get_user_asm(insn, x, ptr, err) \ #define __get_user_asm(insn, x, ptr, err) \
do { \ do { \
uintptr_t __tmp; \
__typeof__(x) __x; \ __typeof__(x) __x; \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
"1:\n" \ "1:\n" \
" " insn " %1, %3\n" \ " " insn " %1, %2\n" \
"2:\n" \ "2:\n" \
" .section .fixup,\"ax\"\n" \ _ASM_EXTABLE_UACCESS_ERR_ZERO(1b, 2b, %0, %1) \
" .balign 4\n" \ : "+r" (err), "=&r" (__x) \
"3:\n" \ : "m" (*(ptr))); \
" 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)); \
(x) = __x; \ (x) = __x; \
} while (0) } while (0)
...@@ -110,30 +100,18 @@ do { \ ...@@ -110,30 +100,18 @@ do { \
do { \ do { \
u32 __user *__ptr = (u32 __user *)(ptr); \ u32 __user *__ptr = (u32 __user *)(ptr); \
u32 __lo, __hi; \ u32 __lo, __hi; \
uintptr_t __tmp; \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
"1:\n" \ "1:\n" \
" lw %1, %4\n" \ " lw %1, %3\n" \
"2:\n" \ "2:\n" \
" lw %2, %5\n" \ " lw %2, %4\n" \
"3:\n" \ "3:\n" \
" .section .fixup,\"ax\"\n" \ _ASM_EXTABLE_UACCESS_ERR_ZERO(1b, 3b, %0, %1) \
" .balign 4\n" \ _ASM_EXTABLE_UACCESS_ERR_ZERO(2b, 3b, %0, %1) \
"4:\n" \ : "+r" (err), "=&r" (__lo), "=r" (__hi) \
" li %0, %6\n" \ : "m" (__ptr[__LSW]), "m" (__ptr[__MSW])); \
" li %1, 0\n" \ if (err) \
" li %2, 0\n" \ __hi = 0; \
" 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)); \
(x) = (__typeof__(x))((__typeof__((x)-(x)))( \ (x) = (__typeof__(x))((__typeof__((x)-(x)))( \
(((u64)__hi << 32) | __lo))); \ (((u64)__hi << 32) | __lo))); \
} while (0) } while (0)
...@@ -221,24 +199,14 @@ do { \ ...@@ -221,24 +199,14 @@ do { \
#define __put_user_asm(insn, x, ptr, err) \ #define __put_user_asm(insn, x, ptr, err) \
do { \ do { \
uintptr_t __tmp; \
__typeof__(*(ptr)) __x = x; \ __typeof__(*(ptr)) __x = x; \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
"1:\n" \ "1:\n" \
" " insn " %z3, %2\n" \ " " insn " %z2, %1\n" \
"2:\n" \ "2:\n" \
" .section .fixup,\"ax\"\n" \ _ASM_EXTABLE_UACCESS_ERR(1b, 2b, %0) \
" .balign 4\n" \ : "+r" (err), "=m" (*(ptr)) \
"3:\n" \ : "rJ" (__x)); \
" 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)); \
} while (0) } while (0)
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
...@@ -249,28 +217,18 @@ do { \ ...@@ -249,28 +217,18 @@ do { \
do { \ do { \
u32 __user *__ptr = (u32 __user *)(ptr); \ u32 __user *__ptr = (u32 __user *)(ptr); \
u64 __x = (__typeof__((x)-(x)))(x); \ u64 __x = (__typeof__((x)-(x)))(x); \
uintptr_t __tmp; \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
"1:\n" \ "1:\n" \
" sw %z4, %2\n" \ " sw %z3, %1\n" \
"2:\n" \ "2:\n" \
" sw %z5, %3\n" \ " sw %z4, %2\n" \
"3:\n" \ "3:\n" \
" .section .fixup,\"ax\"\n" \ _ASM_EXTABLE_UACCESS_ERR(1b, 3b, %0) \
" .balign 4\n" \ _ASM_EXTABLE_UACCESS_ERR(2b, 3b, %0) \
"4:\n" \ : "+r" (err), \
" 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), \
"=m" (__ptr[__LSW]), \ "=m" (__ptr[__LSW]), \
"=m" (__ptr[__MSW]) \ "=m" (__ptr[__MSW]) \
: "rJ" (__x), "rJ" (__x >> 32), "i" (-EFAULT)); \ : "rJ" (__x), "rJ" (__x >> 32)); \
} while (0) } while (0)
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
...@@ -388,81 +346,6 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n) ...@@ -388,81 +346,6 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n)
__clear_user(to, n) : 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 HAVE_GET_KERNEL_NOFAULT
#define __get_kernel_nofault(dst, src, type, err_label) \ #define __get_kernel_nofault(dst, src, type, err_label) \
......
...@@ -14,12 +14,6 @@ ...@@ -14,12 +14,6 @@
#include <asm/cpu_ops.h> #include <asm/cpu_ops.h>
#include <asm/sbi.h> #include <asm/sbi.h>
void cpu_stop(void);
void arch_cpu_idle_dead(void)
{
cpu_stop();
}
bool cpu_has_hotplug(unsigned int cpu) bool cpu_has_hotplug(unsigned int cpu)
{ {
if (cpu_ops[cpu]->cpu_stop) if (cpu_ops[cpu]->cpu_stop)
...@@ -75,7 +69,7 @@ void __cpu_die(unsigned int cpu) ...@@ -75,7 +69,7 @@ void __cpu_die(unsigned int cpu)
/* /*
* Called from the idle thread for the CPU which has been shutdown. * 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(); idle_task_exit();
......
...@@ -135,7 +135,7 @@ relocate: ...@@ -135,7 +135,7 @@ relocate:
/* /*
* Switch to kernel page tables. A full fence is necessary in order to * Switch to kernel page tables. A full fence is necessary in order to
* avoid using the trampoline translations, which are only correct for * 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. * because that first superpage is translated the same way.
*/ */
csrw CSR_SATP, a2 csrw CSR_SATP, a2
...@@ -177,8 +177,7 @@ secondary_start_sbi: ...@@ -177,8 +177,7 @@ secondary_start_sbi:
REG_L sp, (a4) REG_L sp, (a4)
REG_L tp, (a5) REG_L tp, (a5)
.global secondary_start_common .Lsecondary_start_common:
secondary_start_common:
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
/* Enable virtual memory and relocate to virtual address */ /* Enable virtual memory and relocate to virtual address */
...@@ -365,7 +364,7 @@ clear_bss_done: ...@@ -365,7 +364,7 @@ clear_bss_done:
beqz tp, .Lwait_for_cpu_up beqz tp, .Lwait_for_cpu_up
fence fence
tail secondary_start_common tail .Lsecondary_start_common
#endif #endif
END(_start_kernel) END(_start_kernel)
...@@ -448,7 +447,3 @@ ENTRY(reset_regs) ...@@ -448,7 +447,3 @@ ENTRY(reset_regs)
ret ret
END(reset_regs) END(reset_regs)
#endif /* CONFIG_RISCV_M_MODE */ #endif /* CONFIG_RISCV_M_MODE */
__PAGE_ALIGNED_BSS
/* Empty zero page */
.balign PAGE_SIZE
...@@ -159,25 +159,15 @@ SYM_CODE_START(riscv_kexec_norelocate) ...@@ -159,25 +159,15 @@ SYM_CODE_START(riscv_kexec_norelocate)
* s0: (const) Phys address to jump to * s0: (const) Phys address to jump to
* s1: (const) Phys address of the FDT image * s1: (const) Phys address of the FDT image
* s2: (const) The hartid of the current hart * s2: (const) The hartid of the current hart
* s3: (const) kernel_map.va_pa_offset, used when switching MMU off
*/ */
mv s0, a1 mv s0, a1
mv s1, a2 mv s1, a2
mv s2, a3 mv s2, a3
mv s3, a4
/* Disable / cleanup interrupts */ /* Disable / cleanup interrupts */
csrw CSR_SIE, zero csrw CSR_SIE, zero
csrw CSR_SIP, 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*/ /* Pass the arguments to the next kernel / Cleanup*/
mv a0, s2 mv a0, s2
mv a1, s1 mv a1, s1
...@@ -214,7 +204,15 @@ SYM_CODE_START(riscv_kexec_norelocate) ...@@ -214,7 +204,15 @@ SYM_CODE_START(riscv_kexec_norelocate)
csrw CSR_SCAUSE, zero csrw CSR_SCAUSE, zero
csrw CSR_SSCRATCH, 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) SYM_CODE_END(riscv_kexec_norelocate)
.section ".rodata" .section ".rodata"
......
...@@ -169,7 +169,8 @@ machine_kexec(struct kimage *image) ...@@ -169,7 +169,8 @@ machine_kexec(struct kimage *image)
struct kimage_arch *internal = &image->arch; struct kimage_arch *internal = &image->arch;
unsigned long jump_addr = (unsigned long) image->start; unsigned long jump_addr = (unsigned long) image->start;
unsigned long first_ind_entry = (unsigned long) &image->head; 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; unsigned long fdt_addr = internal->fdt_addr;
void *control_code_buffer = page_address(image->control_code_page); void *control_code_buffer = page_address(image->control_code_page);
riscv_kexec_method kexec_method = NULL; riscv_kexec_method kexec_method = NULL;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/reboot.h>
#include <asm/sbi.h> #include <asm/sbi.h>
#include <asm/smp.h> #include <asm/smp.h>
...@@ -501,6 +502,32 @@ int sbi_remote_hfence_vvma_asid(const unsigned long *hart_mask, ...@@ -501,6 +502,32 @@ int sbi_remote_hfence_vvma_asid(const unsigned long *hart_mask,
} }
EXPORT_SYMBOL(sbi_remote_hfence_vvma_asid); 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. * sbi_probe_extension() - Check if an SBI extension ID is supported or not.
* @extid: The extension ID to be probed. * @extid: The extension ID to be probed.
...@@ -608,6 +635,14 @@ void __init sbi_init(void) ...@@ -608,6 +635,14 @@ void __init sbi_init(void)
} else { } else {
__sbi_rfence = __sbi_rfence_v01; __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 { } else {
__sbi_set_timer = __sbi_set_timer_v01; __sbi_set_timer = __sbi_set_timer_v01;
__sbi_send_ipi = __sbi_send_ipi_v01; __sbi_send_ipi = __sbi_send_ipi_v01;
......
...@@ -59,6 +59,16 @@ atomic_t hart_lottery __section(".sdata") ...@@ -59,6 +59,16 @@ atomic_t hart_lottery __section(".sdata")
unsigned long boot_cpu_hartid; unsigned long boot_cpu_hartid;
static DEFINE_PER_CPU(struct cpu, cpu_devices); 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 * Place kernel memory regions on the resource tree so that
* kexec-tools can retrieve them from /proc/iomem. While there * kexec-tools can retrieve them from /proc/iomem. While there
......
...@@ -59,16 +59,6 @@ int riscv_hartid_to_cpuid(int hartid) ...@@ -59,16 +59,6 @@ int riscv_hartid_to_cpuid(int hartid)
return -ENOENT; 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) bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
{ {
return phys_id == cpuid_to_hartid_map(cpu); return phys_id == cpuid_to_hartid_map(cpu);
......
...@@ -45,7 +45,6 @@ SECTIONS ...@@ -45,7 +45,6 @@ SECTIONS
ENTRY_TEXT ENTRY_TEXT
IRQENTRY_TEXT IRQENTRY_TEXT
SOFTIRQENTRY_TEXT SOFTIRQENTRY_TEXT
*(.fixup)
_etext = .; _etext = .;
} }
RO_DATA(L1_CACHE_BYTES) RO_DATA(L1_CACHE_BYTES)
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Copyright (C) 2017 SiFive * Copyright (C) 2017 SiFive
*/ */
#define RO_EXCEPTION_TABLE_ALIGN 16 #define RO_EXCEPTION_TABLE_ALIGN 4
#ifdef CONFIG_XIP_KERNEL #ifdef CONFIG_XIP_KERNEL
#include "vmlinux-xip.lds.S" #include "vmlinux-xip.lds.S"
...@@ -48,7 +48,6 @@ SECTIONS ...@@ -48,7 +48,6 @@ SECTIONS
ENTRY_TEXT ENTRY_TEXT
IRQENTRY_TEXT IRQENTRY_TEXT
SOFTIRQENTRY_TEXT SOFTIRQENTRY_TEXT
*(.fixup)
_etext = .; _etext = .;
} }
......
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm-generic/export.h> #include <asm-generic/export.h>
#include <asm/asm.h> #include <asm/asm.h>
#include <asm/asm-extable.h>
#include <asm/csr.h> #include <asm/csr.h>
.macro fixup op reg addr lbl .macro fixup op reg addr lbl
100: 100:
\op \reg, \addr \op \reg, \addr
.section __ex_table,"a" _asm_extable 100b, \lbl
.balign RISCV_SZPTR
RISCV_PTR 100b, \lbl
.previous
.endm .endm
ENTRY(__asm_copy_to_user) ENTRY(__asm_copy_to_user)
...@@ -173,6 +171,13 @@ ENTRY(__asm_copy_from_user) ...@@ -173,6 +171,13 @@ ENTRY(__asm_copy_from_user)
csrc CSR_STATUS, t6 csrc CSR_STATUS, t6
li a0, 0 li a0, 0
ret 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_to_user)
ENDPROC(__asm_copy_from_user) ENDPROC(__asm_copy_from_user)
EXPORT_SYMBOL(__asm_copy_to_user) EXPORT_SYMBOL(__asm_copy_to_user)
...@@ -218,19 +223,12 @@ ENTRY(__clear_user) ...@@ -218,19 +223,12 @@ ENTRY(__clear_user)
addi a0, a0, 1 addi a0, a0, 1
bltu a0, a3, 5b bltu a0, a3, 5b
j 3b j 3b
ENDPROC(__clear_user)
EXPORT_SYMBOL(__clear_user)
.section .fixup,"ax" /* Exception fixup code */
.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
11: 11:
/* Disable access to user memory */
csrs CSR_STATUS, t6 csrs CSR_STATUS, t6
mv a0, a1 mv a0, a1
ret ret
.previous ENDPROC(__clear_user)
EXPORT_SYMBOL(__clear_user)
...@@ -7,27 +7,65 @@ ...@@ -7,27 +7,65 @@
*/ */
#include <linux/bitfield.h>
#include <linux/extable.h> #include <linux/extable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/asm-extable.h>
#include <asm/ptrace.h>
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I) static inline unsigned long
int rv_bpf_fixup_exception(const struct exception_table_entry *ex, struct pt_regs *regs); get_ex_fixup(const struct exception_table_entry *ex)
#endif {
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;
}
int fixup_exception(struct pt_regs *regs) bool fixup_exception(struct pt_regs *regs)
{ {
const struct exception_table_entry *fixup; const struct exception_table_entry *ex;
fixup = search_exception_tables(regs->epc); ex = search_exception_tables(regs->epc);
if (!fixup) if (!ex)
return 0; return false;
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I) switch (ex->type) {
if (regs->epc >= BPF_JIT_REGION_START && regs->epc < BPF_JIT_REGION_END) case EX_TYPE_FIXUP:
return rv_bpf_fixup_exception(fixup, regs); return ex_handler_fixup(ex, regs);
#endif case EX_TYPE_BPF:
return ex_handler_bpf(ex, regs);
case EX_TYPE_UACCESS_ERR_ZERO:
return ex_handler_uaccess_err_zero(ex, regs);
}
regs->epc = fixup->fixup; BUG();
return 1;
} }
...@@ -235,7 +235,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs) ...@@ -235,7 +235,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs)
* only copy the information from the master page table, * only copy the information from the master page table,
* nothing more. * nothing more.
*/ */
if (unlikely((addr >= VMALLOC_START) && (addr <= VMALLOC_END))) { if (unlikely((addr >= VMALLOC_START) && (addr < VMALLOC_END))) {
vmalloc_fault(regs, code, addr); vmalloc_fault(regs, code, addr);
return; return;
} }
......
...@@ -187,10 +187,10 @@ static void __init setup_bootmem(void) ...@@ -187,10 +187,10 @@ static void __init setup_bootmem(void)
phys_ram_end = memblock_end_of_DRAM(); phys_ram_end = memblock_end_of_DRAM();
#ifndef CONFIG_64BIT
#ifndef CONFIG_XIP_KERNEL #ifndef CONFIG_XIP_KERNEL
phys_ram_base = memblock_start_of_DRAM(); phys_ram_base = memblock_start_of_DRAM();
#endif #endif
#ifndef CONFIG_64BIT
/* /*
* memblock allocator is not aware of the fact that last 4K bytes of * 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 * 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) ...@@ -367,7 +367,8 @@ static phys_addr_t __init alloc_pmd_late(uintptr_t va)
unsigned long vaddr; unsigned long vaddr;
vaddr = __get_free_page(GFP_KERNEL); vaddr = __get_free_page(GFP_KERNEL);
BUG_ON(!vaddr); BUG_ON(!vaddr || !pgtable_pmd_page_ctor(virt_to_page(vaddr)));
return __pa(vaddr); return __pa(vaddr);
} }
...@@ -812,13 +813,22 @@ static void __init reserve_crashkernel(void) ...@@ -812,13 +813,22 @@ static void __init reserve_crashkernel(void)
/* /*
* Current riscv boot protocol requires 2MB alignment for * Current riscv boot protocol requires 2MB alignment for
* RV64 and 4MB alignment for RV32 (hugepage size) * 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, 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) { if (crash_base == 0) {
pr_warn("crashkernel: couldn't allocate %lldKB\n", /* Try again without restricting region to 32bit addressible memory */
crash_size >> 10); crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
return; 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", 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) ...@@ -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_OFFSET_MASK GENMASK(26, 0)
#define BPF_FIXUP_REG_MASK GENMASK(31, 27) #define BPF_FIXUP_REG_MASK GENMASK(31, 27)
int rv_bpf_fixup_exception(const struct exception_table_entry *ex, bool ex_handler_bpf(const struct exception_table_entry *ex,
struct pt_regs *regs); struct pt_regs *regs)
int rv_bpf_fixup_exception(const struct exception_table_entry *ex,
struct pt_regs *regs)
{ {
off_t offset = FIELD_GET(BPF_FIXUP_OFFSET_MASK, ex->fixup); off_t offset = FIELD_GET(BPF_FIXUP_OFFSET_MASK, ex->fixup);
int regs_offset = FIELD_GET(BPF_FIXUP_REG_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, ...@@ -469,7 +467,7 @@ int rv_bpf_fixup_exception(const struct exception_table_entry *ex,
*(unsigned long *)((void *)regs + pt_regmap[regs_offset]) = 0; *(unsigned long *)((void *)regs + pt_regmap[regs_offset]) = 0;
regs->epc = (unsigned long)&ex->fixup - offset; regs->epc = (unsigned long)&ex->fixup - offset;
return 1; return true;
} }
/* For accesses to BTF pointers, add an entry to the exception table */ /* 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, ...@@ -515,6 +513,7 @@ static int add_exception_handler(const struct bpf_insn *insn,
ex->fixup = FIELD_PREP(BPF_FIXUP_OFFSET_MASK, offset) | ex->fixup = FIELD_PREP(BPF_FIXUP_OFFSET_MASK, offset) |
FIELD_PREP(BPF_FIXUP_REG_MASK, dst_reg); FIELD_PREP(BPF_FIXUP_REG_MASK, dst_reg);
ex->type = EX_TYPE_BPF;
ctx->nexentries++; ctx->nexentries++;
return 0; return 0;
......
...@@ -1830,6 +1830,14 @@ static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) ...@@ -1830,6 +1830,14 @@ static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
return 0; 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, static void section_rela(const char *modname, struct elf_info *elf,
Elf_Shdr *sechdr) Elf_Shdr *sechdr)
{ {
...@@ -1866,6 +1874,13 @@ static void section_rela(const char *modname, struct elf_info *elf, ...@@ -1866,6 +1874,13 @@ static void section_rela(const char *modname, struct elf_info *elf,
r_sym = ELF_R_SYM(r.r_info); r_sym = ELF_R_SYM(r.r_info);
#endif #endif
r.r_addend = TO_NATIVE(rela->r_addend); 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; sym = elf->symtab_start + r_sym;
/* Skip special sections */ /* Skip special sections */
if (is_shndx_special(sym->st_shndx)) if (is_shndx_special(sym->st_shndx))
......
...@@ -233,7 +233,7 @@ static void sort_relative_table(char *extab_image, int image_size) ...@@ -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; int i = 0;
...@@ -261,34 +261,6 @@ static void arm64_sort_relative_table(char *extab_image, int image_size) ...@@ -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) static void s390_sort_relative_table(char *extab_image, int image_size)
{ {
int i; int i;
...@@ -366,15 +338,14 @@ static int do_file(char const *const fname, void *addr) ...@@ -366,15 +338,14 @@ static int do_file(char const *const fname, void *addr)
switch (r2(&ehdr->e_machine)) { switch (r2(&ehdr->e_machine)) {
case EM_386: case EM_386:
case EM_AARCH64:
case EM_RISCV:
case EM_X86_64: case EM_X86_64:
custom_sort = x86_sort_relative_table; custom_sort = sort_relative_table_with_data;
break; break;
case EM_S390: case EM_S390:
custom_sort = s390_sort_relative_table; custom_sort = s390_sort_relative_table;
break; break;
case EM_AARCH64:
custom_sort = arm64_sort_relative_table;
break;
case EM_PARISC: case EM_PARISC:
case EM_PPC: case EM_PPC:
case EM_PPC64: case EM_PPC64:
...@@ -385,7 +356,6 @@ static int do_file(char const *const fname, void *addr) ...@@ -385,7 +356,6 @@ static int do_file(char const *const fname, void *addr)
case EM_ARM: case EM_ARM:
case EM_MICROBLAZE: case EM_MICROBLAZE:
case EM_MIPS: case EM_MIPS:
case EM_RISCV:
case EM_XTENSA: case EM_XTENSA:
break; break;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment