diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-06 11:28:54 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-06 11:28:54 -0500 |
| commit | dbf3b7ddbaaf65c7da9b99a686b25fd06fd75073 (patch) | |
| tree | 42436f3c16b02d8980da77b101928cd73e082bfe | |
| parent | 9d82f5eb3376cbae96ad36a063a9390de1694546 (diff) | |
| parent | 1b6af71a8f50f59a96f65ad90e4d20612d2a2526 (diff) | |
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS fixes from Ralf Baechle:
"The pending MIPS fixes for 3.19. All across the field and nothing
particularly severe or dramatic"
* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: (23 commits)
IRQCHIP: mips-gic: Avoid rerouting timer IRQs for smp-cmp
MIPS: Fix syscall_get_nr for the syscall exit tracing.
MIPS: elf2ecoff: Ignore PT_MIPS_ABIFLAGS program headers.
MIPS: elf2ecoff: Rewrite main processing loop to switch.
MIPS: fork: Fix MSA/FPU/DSP context duplication race
MIPS: Fix C0_Pagegrain[IEC] support.
MIPS: traps: Fix inline asm ctc1 missing .set hardfloat
MIPS: mipsregs.h: Add write_32bit_cp1_register()
MIPS: Fix kernel lockup or crash after CPU offline/online
MIPS: OCTEON: fix kernel crash when offlining a CPU
MIPS: ARC: Fix build error.
MIPS: IRQ: Fix disable_irq on CPU IRQs
MIPS: smp-mt,smp-cmp: Enable all HW IRQs on secondary CPUs
MIPS: Fix restart of indirect syscalls
MIPS: ELF: fix loading o32 binaries on 64-bit kernels
MIPS: mips-cm: Fix sparse warnings
MIPS: Kconfig: Fix recursive dependency.
MIPS: Compat: Fix build error if CONFIG_MIPS32_COMPAT but no compat ABI.
MIPS: JZ4740: Fixup #include's (sparse)
MIPS: Wire up execveat(2).
...
26 files changed, 186 insertions, 111 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 3289969ee423..843713c05b79 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -2656,27 +2656,21 @@ config TRAD_SIGNALS | |||
| 2656 | bool | 2656 | bool |
| 2657 | 2657 | ||
| 2658 | config MIPS32_COMPAT | 2658 | config MIPS32_COMPAT |
| 2659 | bool "Kernel support for Linux/MIPS 32-bit binary compatibility" | 2659 | bool |
| 2660 | depends on 64BIT | ||
| 2661 | help | ||
| 2662 | Select this option if you want Linux/MIPS 32-bit binary | ||
| 2663 | compatibility. Since all software available for Linux/MIPS is | ||
| 2664 | currently 32-bit you should say Y here. | ||
| 2665 | 2660 | ||
| 2666 | config COMPAT | 2661 | config COMPAT |
| 2667 | bool | 2662 | bool |
| 2668 | depends on MIPS32_COMPAT | ||
| 2669 | select ARCH_WANT_OLD_COMPAT_IPC | ||
| 2670 | default y | ||
| 2671 | 2663 | ||
| 2672 | config SYSVIPC_COMPAT | 2664 | config SYSVIPC_COMPAT |
| 2673 | bool | 2665 | bool |
| 2674 | depends on COMPAT && SYSVIPC | ||
| 2675 | default y | ||
| 2676 | 2666 | ||
| 2677 | config MIPS32_O32 | 2667 | config MIPS32_O32 |
| 2678 | bool "Kernel support for o32 binaries" | 2668 | bool "Kernel support for o32 binaries" |
| 2679 | depends on MIPS32_COMPAT | 2669 | depends on 64BIT |
| 2670 | select ARCH_WANT_OLD_COMPAT_IPC | ||
| 2671 | select COMPAT | ||
| 2672 | select MIPS32_COMPAT | ||
| 2673 | select SYSVIPC_COMPAT if SYSVIPC | ||
| 2680 | help | 2674 | help |
| 2681 | Select this option if you want to run o32 binaries. These are pure | 2675 | Select this option if you want to run o32 binaries. These are pure |
| 2682 | 32-bit binaries as used by the 32-bit Linux/MIPS port. Most of | 2676 | 32-bit binaries as used by the 32-bit Linux/MIPS port. Most of |
| @@ -2686,7 +2680,10 @@ config MIPS32_O32 | |||
| 2686 | 2680 | ||
| 2687 | config MIPS32_N32 | 2681 | config MIPS32_N32 |
| 2688 | bool "Kernel support for n32 binaries" | 2682 | bool "Kernel support for n32 binaries" |
| 2689 | depends on MIPS32_COMPAT | 2683 | depends on 64BIT |
| 2684 | select COMPAT | ||
| 2685 | select MIPS32_COMPAT | ||
| 2686 | select SYSVIPC_COMPAT if SYSVIPC | ||
| 2690 | help | 2687 | help |
| 2691 | Select this option if you want to run n32 binaries. These are | 2688 | Select this option if you want to run n32 binaries. These are |
| 2692 | 64-bit binaries using 32-bit quantities for addressing and certain | 2689 | 64-bit binaries using 32-bit quantities for addressing and certain |
diff --git a/arch/mips/boot/elf2ecoff.c b/arch/mips/boot/elf2ecoff.c index 8585078ae50e..2a4c52e27f41 100644 --- a/arch/mips/boot/elf2ecoff.c +++ b/arch/mips/boot/elf2ecoff.c | |||
| @@ -49,7 +49,8 @@ | |||
| 49 | /* | 49 | /* |
| 50 | * Some extra ELF definitions | 50 | * Some extra ELF definitions |
| 51 | */ | 51 | */ |
| 52 | #define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ | 52 | #define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ |
| 53 | #define PT_MIPS_ABIFLAGS 0x70000003 /* Records ABI related flags */ | ||
| 53 | 54 | ||
| 54 | /* -------------------------------------------------------------------- */ | 55 | /* -------------------------------------------------------------------- */ |
| 55 | 56 | ||
| @@ -349,39 +350,46 @@ int main(int argc, char *argv[]) | |||
| 349 | 350 | ||
| 350 | for (i = 0; i < ex.e_phnum; i++) { | 351 | for (i = 0; i < ex.e_phnum; i++) { |
| 351 | /* Section types we can ignore... */ | 352 | /* Section types we can ignore... */ |
| 352 | if (ph[i].p_type == PT_NULL || ph[i].p_type == PT_NOTE || | 353 | switch (ph[i].p_type) { |
| 353 | ph[i].p_type == PT_PHDR | 354 | case PT_NULL: |
| 354 | || ph[i].p_type == PT_MIPS_REGINFO) | 355 | case PT_NOTE: |
| 356 | case PT_PHDR: | ||
| 357 | case PT_MIPS_REGINFO: | ||
| 358 | case PT_MIPS_ABIFLAGS: | ||
| 355 | continue; | 359 | continue; |
| 356 | /* Section types we can't handle... */ | ||
| 357 | else if (ph[i].p_type != PT_LOAD) { | ||
| 358 | fprintf(stderr, | ||
| 359 | "Program header %d type %d can't be converted.\n", | ||
| 360 | ex.e_phnum, ph[i].p_type); | ||
| 361 | exit(1); | ||
| 362 | } | ||
| 363 | /* Writable (data) segment? */ | ||
| 364 | if (ph[i].p_flags & PF_W) { | ||
| 365 | struct sect ndata, nbss; | ||
| 366 | 360 | ||
| 367 | ndata.vaddr = ph[i].p_vaddr; | 361 | case PT_LOAD: |
| 368 | ndata.len = ph[i].p_filesz; | 362 | /* Writable (data) segment? */ |
| 369 | nbss.vaddr = ph[i].p_vaddr + ph[i].p_filesz; | 363 | if (ph[i].p_flags & PF_W) { |
| 370 | nbss.len = ph[i].p_memsz - ph[i].p_filesz; | 364 | struct sect ndata, nbss; |
| 365 | |||
| 366 | ndata.vaddr = ph[i].p_vaddr; | ||
| 367 | ndata.len = ph[i].p_filesz; | ||
| 368 | nbss.vaddr = ph[i].p_vaddr + ph[i].p_filesz; | ||
| 369 | nbss.len = ph[i].p_memsz - ph[i].p_filesz; | ||
| 371 | 370 | ||
| 372 | combine(&data, &ndata, 0); | 371 | combine(&data, &ndata, 0); |
| 373 | combine(&bss, &nbss, 1); | 372 | combine(&bss, &nbss, 1); |
| 374 | } else { | 373 | } else { |
| 375 | struct sect ntxt; | 374 | struct sect ntxt; |
| 376 | 375 | ||
| 377 | ntxt.vaddr = ph[i].p_vaddr; | 376 | ntxt.vaddr = ph[i].p_vaddr; |
| 378 | ntxt.len = ph[i].p_filesz; | 377 | ntxt.len = ph[i].p_filesz; |
| 379 | 378 | ||
| 380 | combine(&text, &ntxt, 0); | 379 | combine(&text, &ntxt, 0); |
| 380 | } | ||
| 381 | /* Remember the lowest segment start address. */ | ||
| 382 | if (ph[i].p_vaddr < cur_vma) | ||
| 383 | cur_vma = ph[i].p_vaddr; | ||
| 384 | break; | ||
| 385 | |||
| 386 | default: | ||
| 387 | /* Section types we can't handle... */ | ||
| 388 | fprintf(stderr, | ||
| 389 | "Program header %d type %d can't be converted.\n", | ||
| 390 | ex.e_phnum, ph[i].p_type); | ||
| 391 | exit(1); | ||
| 381 | } | 392 | } |
| 382 | /* Remember the lowest segment start address. */ | ||
| 383 | if (ph[i].p_vaddr < cur_vma) | ||
| 384 | cur_vma = ph[i].p_vaddr; | ||
| 385 | } | 393 | } |
| 386 | 394 | ||
| 387 | /* Sections must be in order to be converted... */ | 395 | /* Sections must be in order to be converted... */ |
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c index ecd903dd1c45..8b1eeffa12ed 100644 --- a/arch/mips/cavium-octeon/smp.c +++ b/arch/mips/cavium-octeon/smp.c | |||
| @@ -240,9 +240,7 @@ static int octeon_cpu_disable(void) | |||
| 240 | 240 | ||
| 241 | set_cpu_online(cpu, false); | 241 | set_cpu_online(cpu, false); |
| 242 | cpu_clear(cpu, cpu_callin_map); | 242 | cpu_clear(cpu, cpu_callin_map); |
| 243 | local_irq_disable(); | ||
| 244 | octeon_fixup_irqs(); | 243 | octeon_fixup_irqs(); |
| 245 | local_irq_enable(); | ||
| 246 | 244 | ||
| 247 | flush_cache_all(); | 245 | flush_cache_all(); |
| 248 | local_flush_tlb_all(); | 246 | local_flush_tlb_all(); |
diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig index f57b96dcf7df..61a4460d67d3 100644 --- a/arch/mips/configs/malta_defconfig +++ b/arch/mips/configs/malta_defconfig | |||
| @@ -132,7 +132,6 @@ CONFIG_IP_NF_MATCH_ECN=m | |||
| 132 | CONFIG_IP_NF_MATCH_TTL=m | 132 | CONFIG_IP_NF_MATCH_TTL=m |
| 133 | CONFIG_IP_NF_FILTER=m | 133 | CONFIG_IP_NF_FILTER=m |
| 134 | CONFIG_IP_NF_TARGET_REJECT=m | 134 | CONFIG_IP_NF_TARGET_REJECT=m |
| 135 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 136 | CONFIG_IP_NF_MANGLE=m | 135 | CONFIG_IP_NF_MANGLE=m |
| 137 | CONFIG_IP_NF_TARGET_CLUSTERIP=m | 136 | CONFIG_IP_NF_TARGET_CLUSTERIP=m |
| 138 | CONFIG_IP_NF_TARGET_ECN=m | 137 | CONFIG_IP_NF_TARGET_ECN=m |
| @@ -175,7 +174,6 @@ CONFIG_BRIDGE_EBT_MARK_T=m | |||
| 175 | CONFIG_BRIDGE_EBT_REDIRECT=m | 174 | CONFIG_BRIDGE_EBT_REDIRECT=m |
| 176 | CONFIG_BRIDGE_EBT_SNAT=m | 175 | CONFIG_BRIDGE_EBT_SNAT=m |
| 177 | CONFIG_BRIDGE_EBT_LOG=m | 176 | CONFIG_BRIDGE_EBT_LOG=m |
| 178 | CONFIG_BRIDGE_EBT_ULOG=m | ||
| 179 | CONFIG_BRIDGE_EBT_NFLOG=m | 177 | CONFIG_BRIDGE_EBT_NFLOG=m |
| 180 | CONFIG_IP_SCTP=m | 178 | CONFIG_IP_SCTP=m |
| 181 | CONFIG_BRIDGE=m | 179 | CONFIG_BRIDGE=m |
| @@ -220,8 +218,6 @@ CONFIG_NET_ACT_SKBEDIT=m | |||
| 220 | CONFIG_NET_CLS_IND=y | 218 | CONFIG_NET_CLS_IND=y |
| 221 | CONFIG_CFG80211=m | 219 | CONFIG_CFG80211=m |
| 222 | CONFIG_MAC80211=m | 220 | CONFIG_MAC80211=m |
| 223 | CONFIG_MAC80211_RC_PID=y | ||
| 224 | CONFIG_MAC80211_RC_DEFAULT_PID=y | ||
| 225 | CONFIG_MAC80211_MESH=y | 221 | CONFIG_MAC80211_MESH=y |
| 226 | CONFIG_RFKILL=m | 222 | CONFIG_RFKILL=m |
| 227 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 223 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| @@ -248,19 +244,13 @@ CONFIG_ATA_OVER_ETH=m | |||
| 248 | CONFIG_IDE=y | 244 | CONFIG_IDE=y |
| 249 | CONFIG_BLK_DEV_IDECD=y | 245 | CONFIG_BLK_DEV_IDECD=y |
| 250 | CONFIG_IDE_GENERIC=y | 246 | CONFIG_IDE_GENERIC=y |
| 251 | CONFIG_BLK_DEV_GENERIC=y | ||
| 252 | CONFIG_BLK_DEV_PIIX=y | ||
| 253 | CONFIG_BLK_DEV_IT8213=m | ||
| 254 | CONFIG_BLK_DEV_TC86C001=m | ||
| 255 | CONFIG_RAID_ATTRS=m | 247 | CONFIG_RAID_ATTRS=m |
| 256 | CONFIG_SCSI=m | 248 | CONFIG_BLK_DEV_SD=y |
| 257 | CONFIG_BLK_DEV_SD=m | ||
| 258 | CONFIG_CHR_DEV_ST=m | 249 | CONFIG_CHR_DEV_ST=m |
| 259 | CONFIG_CHR_DEV_OSST=m | 250 | CONFIG_CHR_DEV_OSST=m |
| 260 | CONFIG_BLK_DEV_SR=m | 251 | CONFIG_BLK_DEV_SR=m |
| 261 | CONFIG_BLK_DEV_SR_VENDOR=y | 252 | CONFIG_BLK_DEV_SR_VENDOR=y |
| 262 | CONFIG_CHR_DEV_SG=m | 253 | CONFIG_CHR_DEV_SG=m |
| 263 | CONFIG_SCSI_MULTI_LUN=y | ||
| 264 | CONFIG_SCSI_CONSTANTS=y | 254 | CONFIG_SCSI_CONSTANTS=y |
| 265 | CONFIG_SCSI_LOGGING=y | 255 | CONFIG_SCSI_LOGGING=y |
| 266 | CONFIG_SCSI_SCAN_ASYNC=y | 256 | CONFIG_SCSI_SCAN_ASYNC=y |
| @@ -273,6 +263,8 @@ CONFIG_SCSI_AACRAID=m | |||
| 273 | CONFIG_SCSI_AIC7XXX=m | 263 | CONFIG_SCSI_AIC7XXX=m |
| 274 | CONFIG_AIC7XXX_RESET_DELAY_MS=15000 | 264 | CONFIG_AIC7XXX_RESET_DELAY_MS=15000 |
| 275 | # CONFIG_AIC7XXX_DEBUG_ENABLE is not set | 265 | # CONFIG_AIC7XXX_DEBUG_ENABLE is not set |
| 266 | CONFIG_ATA=y | ||
| 267 | CONFIG_ATA_PIIX=y | ||
| 276 | CONFIG_MD=y | 268 | CONFIG_MD=y |
| 277 | CONFIG_BLK_DEV_MD=m | 269 | CONFIG_BLK_DEV_MD=m |
| 278 | CONFIG_MD_LINEAR=m | 270 | CONFIG_MD_LINEAR=m |
| @@ -340,6 +332,7 @@ CONFIG_UIO=m | |||
| 340 | CONFIG_UIO_CIF=m | 332 | CONFIG_UIO_CIF=m |
| 341 | CONFIG_EXT2_FS=y | 333 | CONFIG_EXT2_FS=y |
| 342 | CONFIG_EXT3_FS=y | 334 | CONFIG_EXT3_FS=y |
| 335 | CONFIG_EXT4_FS=y | ||
| 343 | CONFIG_REISERFS_FS=m | 336 | CONFIG_REISERFS_FS=m |
| 344 | CONFIG_REISERFS_PROC_INFO=y | 337 | CONFIG_REISERFS_PROC_INFO=y |
| 345 | CONFIG_REISERFS_FS_XATTR=y | 338 | CONFIG_REISERFS_FS_XATTR=y |
| @@ -441,4 +434,3 @@ CONFIG_CRYPTO_SERPENT=m | |||
| 441 | CONFIG_CRYPTO_TEA=m | 434 | CONFIG_CRYPTO_TEA=m |
| 442 | CONFIG_CRYPTO_TWOFISH=m | 435 | CONFIG_CRYPTO_TWOFISH=m |
| 443 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 436 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
| 444 | CONFIG_CRC16=m | ||
diff --git a/arch/mips/include/asm/fpu.h b/arch/mips/include/asm/fpu.h index 994d21939676..affebb78f5d6 100644 --- a/arch/mips/include/asm/fpu.h +++ b/arch/mips/include/asm/fpu.h | |||
| @@ -64,7 +64,7 @@ static inline int __enable_fpu(enum fpu_mode mode) | |||
| 64 | return SIGFPE; | 64 | return SIGFPE; |
| 65 | 65 | ||
| 66 | /* set FRE */ | 66 | /* set FRE */ |
| 67 | write_c0_config5(read_c0_config5() | MIPS_CONF5_FRE); | 67 | set_c0_config5(MIPS_CONF5_FRE); |
| 68 | goto fr_common; | 68 | goto fr_common; |
| 69 | 69 | ||
| 70 | case FPU_64BIT: | 70 | case FPU_64BIT: |
| @@ -74,8 +74,10 @@ static inline int __enable_fpu(enum fpu_mode mode) | |||
| 74 | #endif | 74 | #endif |
| 75 | /* fall through */ | 75 | /* fall through */ |
| 76 | case FPU_32BIT: | 76 | case FPU_32BIT: |
| 77 | /* clear FRE */ | 77 | if (cpu_has_fre) { |
| 78 | write_c0_config5(read_c0_config5() & ~MIPS_CONF5_FRE); | 78 | /* clear FRE */ |
| 79 | clear_c0_config5(MIPS_CONF5_FRE); | ||
| 80 | } | ||
| 79 | fr_common: | 81 | fr_common: |
| 80 | /* set CU1 & change FR appropriately */ | 82 | /* set CU1 & change FR appropriately */ |
| 81 | fr = (int)mode & FPU_FR_MASK; | 83 | fr = (int)mode & FPU_FR_MASK; |
| @@ -182,25 +184,32 @@ static inline int init_fpu(void) | |||
| 182 | int ret = 0; | 184 | int ret = 0; |
| 183 | 185 | ||
| 184 | if (cpu_has_fpu) { | 186 | if (cpu_has_fpu) { |
| 187 | unsigned int config5; | ||
| 188 | |||
| 185 | ret = __own_fpu(); | 189 | ret = __own_fpu(); |
| 186 | if (!ret) { | 190 | if (ret) |
| 187 | unsigned int config5 = read_c0_config5(); | 191 | return ret; |
| 188 | |||
| 189 | /* | ||
| 190 | * Ensure FRE is clear whilst running _init_fpu, since | ||
| 191 | * single precision FP instructions are used. If FRE | ||
| 192 | * was set then we'll just end up initialising all 32 | ||
| 193 | * 64b registers. | ||
| 194 | */ | ||
| 195 | write_c0_config5(config5 & ~MIPS_CONF5_FRE); | ||
| 196 | enable_fpu_hazard(); | ||
| 197 | 192 | ||
| 193 | if (!cpu_has_fre) { | ||
| 198 | _init_fpu(); | 194 | _init_fpu(); |
| 199 | 195 | ||
| 200 | /* Restore FRE */ | 196 | return 0; |
| 201 | write_c0_config5(config5); | ||
| 202 | enable_fpu_hazard(); | ||
| 203 | } | 197 | } |
| 198 | |||
| 199 | /* | ||
| 200 | * Ensure FRE is clear whilst running _init_fpu, since | ||
| 201 | * single precision FP instructions are used. If FRE | ||
| 202 | * was set then we'll just end up initialising all 32 | ||
| 203 | * 64b registers. | ||
| 204 | */ | ||
| 205 | config5 = clear_c0_config5(MIPS_CONF5_FRE); | ||
| 206 | enable_fpu_hazard(); | ||
| 207 | |||
| 208 | _init_fpu(); | ||
| 209 | |||
| 210 | /* Restore FRE */ | ||
| 211 | write_c0_config5(config5); | ||
| 212 | enable_fpu_hazard(); | ||
| 204 | } else | 213 | } else |
| 205 | fpu_emulator_init_fpu(); | 214 | fpu_emulator_init_fpu(); |
| 206 | 215 | ||
diff --git a/arch/mips/include/asm/fw/arc/hinv.h b/arch/mips/include/asm/fw/arc/hinv.h index f8d37d1df5de..9fac64a26353 100644 --- a/arch/mips/include/asm/fw/arc/hinv.h +++ b/arch/mips/include/asm/fw/arc/hinv.h | |||
| @@ -119,7 +119,7 @@ union key_u { | |||
| 119 | #define SGI_ARCS_REV 10 /* rev .10, 3/04/92 */ | 119 | #define SGI_ARCS_REV 10 /* rev .10, 3/04/92 */ |
| 120 | #endif | 120 | #endif |
| 121 | 121 | ||
| 122 | typedef struct component { | 122 | typedef struct { |
| 123 | CONFIGCLASS Class; | 123 | CONFIGCLASS Class; |
| 124 | CONFIGTYPE Type; | 124 | CONFIGTYPE Type; |
| 125 | IDENTIFIERFLAG Flags; | 125 | IDENTIFIERFLAG Flags; |
| @@ -140,7 +140,7 @@ struct cfgdata { | |||
| 140 | }; | 140 | }; |
| 141 | 141 | ||
| 142 | /* System ID */ | 142 | /* System ID */ |
| 143 | typedef struct systemid { | 143 | typedef struct { |
| 144 | CHAR VendorId[8]; | 144 | CHAR VendorId[8]; |
| 145 | CHAR ProductId[8]; | 145 | CHAR ProductId[8]; |
| 146 | } SYSTEMID; | 146 | } SYSTEMID; |
| @@ -166,7 +166,7 @@ typedef enum memorytype { | |||
| 166 | #endif /* _NT_PROM */ | 166 | #endif /* _NT_PROM */ |
| 167 | } MEMORYTYPE; | 167 | } MEMORYTYPE; |
| 168 | 168 | ||
| 169 | typedef struct memorydescriptor { | 169 | typedef struct { |
| 170 | MEMORYTYPE Type; | 170 | MEMORYTYPE Type; |
| 171 | LONG BasePage; | 171 | LONG BasePage; |
| 172 | LONG PageCount; | 172 | LONG PageCount; |
diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h index b95a827d763e..59c0901bdd84 100644 --- a/arch/mips/include/asm/mips-cm.h +++ b/arch/mips/include/asm/mips-cm.h | |||
| @@ -89,9 +89,9 @@ static inline bool mips_cm_has_l2sync(void) | |||
| 89 | 89 | ||
| 90 | /* Macros to ease the creation of register access functions */ | 90 | /* Macros to ease the creation of register access functions */ |
| 91 | #define BUILD_CM_R_(name, off) \ | 91 | #define BUILD_CM_R_(name, off) \ |
| 92 | static inline u32 *addr_gcr_##name(void) \ | 92 | static inline u32 __iomem *addr_gcr_##name(void) \ |
| 93 | { \ | 93 | { \ |
| 94 | return (u32 *)(mips_cm_base + (off)); \ | 94 | return (u32 __iomem *)(mips_cm_base + (off)); \ |
| 95 | } \ | 95 | } \ |
| 96 | \ | 96 | \ |
| 97 | static inline u32 read_gcr_##name(void) \ | 97 | static inline u32 read_gcr_##name(void) \ |
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 5e4aef304b02..5b720d8c2745 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h | |||
| @@ -1386,12 +1386,27 @@ do { \ | |||
| 1386 | __res; \ | 1386 | __res; \ |
| 1387 | }) | 1387 | }) |
| 1388 | 1388 | ||
| 1389 | #define _write_32bit_cp1_register(dest, val, gas_hardfloat) \ | ||
| 1390 | do { \ | ||
| 1391 | __asm__ __volatile__( \ | ||
| 1392 | " .set push \n" \ | ||
| 1393 | " .set reorder \n" \ | ||
| 1394 | " "STR(gas_hardfloat)" \n" \ | ||
| 1395 | " ctc1 %0,"STR(dest)" \n" \ | ||
| 1396 | " .set pop \n" \ | ||
| 1397 | : : "r" (val)); \ | ||
| 1398 | } while (0) | ||
| 1399 | |||
| 1389 | #ifdef GAS_HAS_SET_HARDFLOAT | 1400 | #ifdef GAS_HAS_SET_HARDFLOAT |
| 1390 | #define read_32bit_cp1_register(source) \ | 1401 | #define read_32bit_cp1_register(source) \ |
| 1391 | _read_32bit_cp1_register(source, .set hardfloat) | 1402 | _read_32bit_cp1_register(source, .set hardfloat) |
| 1403 | #define write_32bit_cp1_register(dest, val) \ | ||
| 1404 | _write_32bit_cp1_register(dest, val, .set hardfloat) | ||
| 1392 | #else | 1405 | #else |
| 1393 | #define read_32bit_cp1_register(source) \ | 1406 | #define read_32bit_cp1_register(source) \ |
| 1394 | _read_32bit_cp1_register(source, ) | 1407 | _read_32bit_cp1_register(source, ) |
| 1408 | #define write_32bit_cp1_register(dest, val) \ | ||
| 1409 | _write_32bit_cp1_register(dest, val, ) | ||
| 1395 | #endif | 1410 | #endif |
| 1396 | 1411 | ||
| 1397 | #ifdef HAVE_AS_DSP | 1412 | #ifdef HAVE_AS_DSP |
diff --git a/arch/mips/include/asm/syscall.h b/arch/mips/include/asm/syscall.h index bb7963753730..6499d93ae68d 100644 --- a/arch/mips/include/asm/syscall.h +++ b/arch/mips/include/asm/syscall.h | |||
| @@ -29,13 +29,7 @@ | |||
| 29 | static inline long syscall_get_nr(struct task_struct *task, | 29 | static inline long syscall_get_nr(struct task_struct *task, |
| 30 | struct pt_regs *regs) | 30 | struct pt_regs *regs) |
| 31 | { | 31 | { |
| 32 | /* O32 ABI syscall() - Either 64-bit with O32 or 32-bit */ | 32 | return current_thread_info()->syscall; |
| 33 | if ((config_enabled(CONFIG_32BIT) || | ||
| 34 | test_tsk_thread_flag(task, TIF_32BIT_REGS)) && | ||
| 35 | (regs->regs[2] == __NR_syscall)) | ||
| 36 | return regs->regs[4]; | ||
| 37 | else | ||
| 38 | return regs->regs[2]; | ||
| 39 | } | 33 | } |
| 40 | 34 | ||
| 41 | static inline unsigned long mips_get_syscall_arg(unsigned long *arg, | 35 | static inline unsigned long mips_get_syscall_arg(unsigned long *arg, |
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index 99eea59604e9..e4440f92b366 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h | |||
| @@ -36,6 +36,7 @@ struct thread_info { | |||
| 36 | */ | 36 | */ |
| 37 | struct restart_block restart_block; | 37 | struct restart_block restart_block; |
| 38 | struct pt_regs *regs; | 38 | struct pt_regs *regs; |
| 39 | long syscall; /* syscall number */ | ||
| 39 | }; | 40 | }; |
| 40 | 41 | ||
| 41 | /* | 42 | /* |
diff --git a/arch/mips/include/uapi/asm/unistd.h b/arch/mips/include/uapi/asm/unistd.h index d001bb1ad177..c03088f9f514 100644 --- a/arch/mips/include/uapi/asm/unistd.h +++ b/arch/mips/include/uapi/asm/unistd.h | |||
| @@ -376,16 +376,17 @@ | |||
| 376 | #define __NR_getrandom (__NR_Linux + 353) | 376 | #define __NR_getrandom (__NR_Linux + 353) |
| 377 | #define __NR_memfd_create (__NR_Linux + 354) | 377 | #define __NR_memfd_create (__NR_Linux + 354) |
| 378 | #define __NR_bpf (__NR_Linux + 355) | 378 | #define __NR_bpf (__NR_Linux + 355) |
| 379 | #define __NR_execveat (__NR_Linux + 356) | ||
| 379 | 380 | ||
| 380 | /* | 381 | /* |
| 381 | * Offset of the last Linux o32 flavoured syscall | 382 | * Offset of the last Linux o32 flavoured syscall |
| 382 | */ | 383 | */ |
| 383 | #define __NR_Linux_syscalls 355 | 384 | #define __NR_Linux_syscalls 356 |
| 384 | 385 | ||
| 385 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | 386 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ |
| 386 | 387 | ||
| 387 | #define __NR_O32_Linux 4000 | 388 | #define __NR_O32_Linux 4000 |
| 388 | #define __NR_O32_Linux_syscalls 355 | 389 | #define __NR_O32_Linux_syscalls 356 |
| 389 | 390 | ||
| 390 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | 391 | #if _MIPS_SIM == _MIPS_SIM_ABI64 |
| 391 | 392 | ||
| @@ -709,16 +710,17 @@ | |||
| 709 | #define __NR_getrandom (__NR_Linux + 313) | 710 | #define __NR_getrandom (__NR_Linux + 313) |
| 710 | #define __NR_memfd_create (__NR_Linux + 314) | 711 | #define __NR_memfd_create (__NR_Linux + 314) |
| 711 | #define __NR_bpf (__NR_Linux + 315) | 712 | #define __NR_bpf (__NR_Linux + 315) |
| 713 | #define __NR_execveat (__NR_Linux + 316) | ||
| 712 | 714 | ||
| 713 | /* | 715 | /* |
| 714 | * Offset of the last Linux 64-bit flavoured syscall | 716 | * Offset of the last Linux 64-bit flavoured syscall |
| 715 | */ | 717 | */ |
| 716 | #define __NR_Linux_syscalls 315 | 718 | #define __NR_Linux_syscalls 316 |
| 717 | 719 | ||
| 718 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | 720 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ |
| 719 | 721 | ||
| 720 | #define __NR_64_Linux 5000 | 722 | #define __NR_64_Linux 5000 |
| 721 | #define __NR_64_Linux_syscalls 315 | 723 | #define __NR_64_Linux_syscalls 316 |
| 722 | 724 | ||
| 723 | #if _MIPS_SIM == _MIPS_SIM_NABI32 | 725 | #if _MIPS_SIM == _MIPS_SIM_NABI32 |
| 724 | 726 | ||
| @@ -1046,15 +1048,16 @@ | |||
| 1046 | #define __NR_getrandom (__NR_Linux + 317) | 1048 | #define __NR_getrandom (__NR_Linux + 317) |
| 1047 | #define __NR_memfd_create (__NR_Linux + 318) | 1049 | #define __NR_memfd_create (__NR_Linux + 318) |
| 1048 | #define __NR_bpf (__NR_Linux + 319) | 1050 | #define __NR_bpf (__NR_Linux + 319) |
| 1051 | #define __NR_execveat (__NR_Linux + 320) | ||
| 1049 | 1052 | ||
| 1050 | /* | 1053 | /* |
| 1051 | * Offset of the last N32 flavoured syscall | 1054 | * Offset of the last N32 flavoured syscall |
| 1052 | */ | 1055 | */ |
| 1053 | #define __NR_Linux_syscalls 319 | 1056 | #define __NR_Linux_syscalls 320 |
| 1054 | 1057 | ||
| 1055 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ | 1058 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ |
| 1056 | 1059 | ||
| 1057 | #define __NR_N32_Linux 6000 | 1060 | #define __NR_N32_Linux 6000 |
| 1058 | #define __NR_N32_Linux_syscalls 319 | 1061 | #define __NR_N32_Linux_syscalls 320 |
| 1059 | 1062 | ||
| 1060 | #endif /* _UAPI_ASM_UNISTD_H */ | 1063 | #endif /* _UAPI_ASM_UNISTD_H */ |
diff --git a/arch/mips/jz4740/irq.c b/arch/mips/jz4740/irq.c index 2531da1d3add..97206b3deb97 100644 --- a/arch/mips/jz4740/irq.c +++ b/arch/mips/jz4740/irq.c | |||
| @@ -30,6 +30,9 @@ | |||
| 30 | #include <asm/irq_cpu.h> | 30 | #include <asm/irq_cpu.h> |
| 31 | 31 | ||
| 32 | #include <asm/mach-jz4740/base.h> | 32 | #include <asm/mach-jz4740/base.h> |
| 33 | #include <asm/mach-jz4740/irq.h> | ||
| 34 | |||
| 35 | #include "irq.h" | ||
| 33 | 36 | ||
| 34 | static void __iomem *jz_intc_base; | 37 | static void __iomem *jz_intc_base; |
| 35 | 38 | ||
diff --git a/arch/mips/kernel/elf.c b/arch/mips/kernel/elf.c index c92b15df6893..a5b5b56485c1 100644 --- a/arch/mips/kernel/elf.c +++ b/arch/mips/kernel/elf.c | |||
| @@ -19,8 +19,8 @@ enum { | |||
| 19 | int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, | 19 | int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, |
| 20 | bool is_interp, struct arch_elf_state *state) | 20 | bool is_interp, struct arch_elf_state *state) |
| 21 | { | 21 | { |
| 22 | struct elfhdr *ehdr = _ehdr; | 22 | struct elf32_hdr *ehdr = _ehdr; |
| 23 | struct elf_phdr *phdr = _phdr; | 23 | struct elf32_phdr *phdr = _phdr; |
| 24 | struct mips_elf_abiflags_v0 abiflags; | 24 | struct mips_elf_abiflags_v0 abiflags; |
| 25 | int ret; | 25 | int ret; |
| 26 | 26 | ||
| @@ -48,7 +48,7 @@ int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, | |||
| 48 | return 0; | 48 | return 0; |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | static inline unsigned get_fp_abi(struct elfhdr *ehdr, int in_abi) | 51 | static inline unsigned get_fp_abi(struct elf32_hdr *ehdr, int in_abi) |
| 52 | { | 52 | { |
| 53 | /* If the ABI requirement is provided, simply return that */ | 53 | /* If the ABI requirement is provided, simply return that */ |
| 54 | if (in_abi != -1) | 54 | if (in_abi != -1) |
| @@ -65,7 +65,7 @@ static inline unsigned get_fp_abi(struct elfhdr *ehdr, int in_abi) | |||
| 65 | int arch_check_elf(void *_ehdr, bool has_interpreter, | 65 | int arch_check_elf(void *_ehdr, bool has_interpreter, |
| 66 | struct arch_elf_state *state) | 66 | struct arch_elf_state *state) |
| 67 | { | 67 | { |
| 68 | struct elfhdr *ehdr = _ehdr; | 68 | struct elf32_hdr *ehdr = _ehdr; |
| 69 | unsigned fp_abi, interp_fp_abi, abi0, abi1; | 69 | unsigned fp_abi, interp_fp_abi, abi0, abi1; |
| 70 | 70 | ||
| 71 | /* Ignore non-O32 binaries */ | 71 | /* Ignore non-O32 binaries */ |
diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c index 590c2c980fd3..6eb7a3f515fc 100644 --- a/arch/mips/kernel/irq_cpu.c +++ b/arch/mips/kernel/irq_cpu.c | |||
| @@ -57,6 +57,8 @@ static struct irq_chip mips_cpu_irq_controller = { | |||
| 57 | .irq_mask_ack = mask_mips_irq, | 57 | .irq_mask_ack = mask_mips_irq, |
| 58 | .irq_unmask = unmask_mips_irq, | 58 | .irq_unmask = unmask_mips_irq, |
| 59 | .irq_eoi = unmask_mips_irq, | 59 | .irq_eoi = unmask_mips_irq, |
| 60 | .irq_disable = mask_mips_irq, | ||
| 61 | .irq_enable = unmask_mips_irq, | ||
| 60 | }; | 62 | }; |
| 61 | 63 | ||
| 62 | /* | 64 | /* |
| @@ -93,6 +95,8 @@ static struct irq_chip mips_mt_cpu_irq_controller = { | |||
| 93 | .irq_mask_ack = mips_mt_cpu_irq_ack, | 95 | .irq_mask_ack = mips_mt_cpu_irq_ack, |
| 94 | .irq_unmask = unmask_mips_irq, | 96 | .irq_unmask = unmask_mips_irq, |
| 95 | .irq_eoi = unmask_mips_irq, | 97 | .irq_eoi = unmask_mips_irq, |
| 98 | .irq_disable = mask_mips_irq, | ||
| 99 | .irq_enable = unmask_mips_irq, | ||
| 96 | }; | 100 | }; |
| 97 | 101 | ||
| 98 | asmlinkage void __weak plat_irq_dispatch(void) | 102 | asmlinkage void __weak plat_irq_dispatch(void) |
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index eb76434828e8..85bff5d513e5 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
| @@ -82,6 +82,30 @@ void flush_thread(void) | |||
| 82 | { | 82 | { |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) | ||
| 86 | { | ||
| 87 | /* | ||
| 88 | * Save any process state which is live in hardware registers to the | ||
| 89 | * parent context prior to duplication. This prevents the new child | ||
| 90 | * state becoming stale if the parent is preempted before copy_thread() | ||
| 91 | * gets a chance to save the parent's live hardware registers to the | ||
| 92 | * child context. | ||
| 93 | */ | ||
| 94 | preempt_disable(); | ||
| 95 | |||
| 96 | if (is_msa_enabled()) | ||
| 97 | save_msa(current); | ||
| 98 | else if (is_fpu_owner()) | ||
| 99 | _save_fp(current); | ||
| 100 | |||
| 101 | save_dsp(current); | ||
| 102 | |||
| 103 | preempt_enable(); | ||
| 104 | |||
| 105 | *dst = *src; | ||
| 106 | return 0; | ||
| 107 | } | ||
| 108 | |||
| 85 | int copy_thread(unsigned long clone_flags, unsigned long usp, | 109 | int copy_thread(unsigned long clone_flags, unsigned long usp, |
| 86 | unsigned long arg, struct task_struct *p) | 110 | unsigned long arg, struct task_struct *p) |
| 87 | { | 111 | { |
| @@ -92,18 +116,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
| 92 | 116 | ||
| 93 | childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32; | 117 | childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32; |
| 94 | 118 | ||
| 95 | preempt_disable(); | ||
| 96 | |||
| 97 | if (is_msa_enabled()) | ||
| 98 | save_msa(p); | ||
| 99 | else if (is_fpu_owner()) | ||
| 100 | save_fp(p); | ||
| 101 | |||
| 102 | if (cpu_has_dsp) | ||
| 103 | save_dsp(p); | ||
| 104 | |||
| 105 | preempt_enable(); | ||
| 106 | |||
| 107 | /* set up new TSS. */ | 119 | /* set up new TSS. */ |
| 108 | childregs = (struct pt_regs *) childksp - 1; | 120 | childregs = (struct pt_regs *) childksp - 1; |
| 109 | /* Put the stack after the struct pt_regs. */ | 121 | /* Put the stack after the struct pt_regs. */ |
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index 9d1487d83293..510452812594 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c | |||
| @@ -770,6 +770,8 @@ asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall) | |||
| 770 | long ret = 0; | 770 | long ret = 0; |
| 771 | user_exit(); | 771 | user_exit(); |
| 772 | 772 | ||
| 773 | current_thread_info()->syscall = syscall; | ||
| 774 | |||
| 773 | if (secure_computing() == -1) | 775 | if (secure_computing() == -1) |
| 774 | return -1; | 776 | return -1; |
| 775 | 777 | ||
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 00cad1005a16..6e8de80bb446 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
| @@ -181,6 +181,7 @@ illegal_syscall: | |||
| 181 | sll t1, t0, 2 | 181 | sll t1, t0, 2 |
| 182 | beqz v0, einval | 182 | beqz v0, einval |
| 183 | lw t2, sys_call_table(t1) # syscall routine | 183 | lw t2, sys_call_table(t1) # syscall routine |
| 184 | sw a0, PT_R2(sp) # call routine directly on restart | ||
| 184 | 185 | ||
| 185 | /* Some syscalls like execve get their arguments from struct pt_regs | 186 | /* Some syscalls like execve get their arguments from struct pt_regs |
| 186 | and claim zero arguments in the syscall table. Thus we have to | 187 | and claim zero arguments in the syscall table. Thus we have to |
| @@ -580,3 +581,4 @@ EXPORT(sys_call_table) | |||
| 580 | PTR sys_getrandom | 581 | PTR sys_getrandom |
| 581 | PTR sys_memfd_create | 582 | PTR sys_memfd_create |
| 582 | PTR sys_bpf /* 4355 */ | 583 | PTR sys_bpf /* 4355 */ |
| 584 | PTR sys_execveat | ||
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 5251565e344b..ad4d44635c76 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
| @@ -435,4 +435,5 @@ EXPORT(sys_call_table) | |||
| 435 | PTR sys_getrandom | 435 | PTR sys_getrandom |
| 436 | PTR sys_memfd_create | 436 | PTR sys_memfd_create |
| 437 | PTR sys_bpf /* 5315 */ | 437 | PTR sys_bpf /* 5315 */ |
| 438 | PTR sys_execveat | ||
| 438 | .size sys_call_table,.-sys_call_table | 439 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 77e74398b828..446cc654da56 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -428,4 +428,5 @@ EXPORT(sysn32_call_table) | |||
| 428 | PTR sys_getrandom | 428 | PTR sys_getrandom |
| 429 | PTR sys_memfd_create | 429 | PTR sys_memfd_create |
| 430 | PTR sys_bpf | 430 | PTR sys_bpf |
| 431 | PTR compat_sys_execveat /* 6320 */ | ||
| 431 | .size sysn32_call_table,.-sysn32_call_table | 432 | .size sysn32_call_table,.-sysn32_call_table |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 6f8db9f728e8..d07b210fbeff 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
| @@ -186,6 +186,7 @@ LEAF(sys32_syscall) | |||
| 186 | dsll t1, t0, 3 | 186 | dsll t1, t0, 3 |
| 187 | beqz v0, einval | 187 | beqz v0, einval |
| 188 | ld t2, sys32_call_table(t1) # syscall routine | 188 | ld t2, sys32_call_table(t1) # syscall routine |
| 189 | sd a0, PT_R2(sp) # call routine directly on restart | ||
| 189 | 190 | ||
| 190 | move a0, a1 # shift argument registers | 191 | move a0, a1 # shift argument registers |
| 191 | move a1, a2 | 192 | move a1, a2 |
| @@ -565,4 +566,5 @@ EXPORT(sys32_call_table) | |||
| 565 | PTR sys_getrandom | 566 | PTR sys_getrandom |
| 566 | PTR sys_memfd_create | 567 | PTR sys_memfd_create |
| 567 | PTR sys_bpf /* 4355 */ | 568 | PTR sys_bpf /* 4355 */ |
| 569 | PTR compat_sys_execveat | ||
| 568 | .size sys32_call_table,.-sys32_call_table | 570 | .size sys32_call_table,.-sys32_call_table |
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c index 1e0a93c5a3e7..e36a859af666 100644 --- a/arch/mips/kernel/smp-cmp.c +++ b/arch/mips/kernel/smp-cmp.c | |||
| @@ -44,8 +44,8 @@ static void cmp_init_secondary(void) | |||
| 44 | struct cpuinfo_mips *c __maybe_unused = ¤t_cpu_data; | 44 | struct cpuinfo_mips *c __maybe_unused = ¤t_cpu_data; |
| 45 | 45 | ||
| 46 | /* Assume GIC is present */ | 46 | /* Assume GIC is present */ |
| 47 | change_c0_status(ST0_IM, STATUSF_IP3 | STATUSF_IP4 | STATUSF_IP6 | | 47 | change_c0_status(ST0_IM, STATUSF_IP2 | STATUSF_IP3 | STATUSF_IP4 | |
| 48 | STATUSF_IP7); | 48 | STATUSF_IP5 | STATUSF_IP6 | STATUSF_IP7); |
| 49 | 49 | ||
| 50 | /* Enable per-cpu interrupts: platform specific */ | 50 | /* Enable per-cpu interrupts: platform specific */ |
| 51 | 51 | ||
diff --git a/arch/mips/kernel/smp-mt.c b/arch/mips/kernel/smp-mt.c index ad86951b73bd..17ea705f6c40 100644 --- a/arch/mips/kernel/smp-mt.c +++ b/arch/mips/kernel/smp-mt.c | |||
| @@ -161,7 +161,8 @@ static void vsmp_init_secondary(void) | |||
| 161 | #ifdef CONFIG_MIPS_GIC | 161 | #ifdef CONFIG_MIPS_GIC |
| 162 | /* This is Malta specific: IPI,performance and timer interrupts */ | 162 | /* This is Malta specific: IPI,performance and timer interrupts */ |
| 163 | if (gic_present) | 163 | if (gic_present) |
| 164 | change_c0_status(ST0_IM, STATUSF_IP3 | STATUSF_IP4 | | 164 | change_c0_status(ST0_IM, STATUSF_IP2 | STATUSF_IP3 | |
| 165 | STATUSF_IP4 | STATUSF_IP5 | | ||
| 165 | STATUSF_IP6 | STATUSF_IP7); | 166 | STATUSF_IP6 | STATUSF_IP7); |
| 166 | else | 167 | else |
| 167 | #endif | 168 | #endif |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index c94c4e92e17d..1c0d8c50b7e1 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
| @@ -123,10 +123,10 @@ asmlinkage void start_secondary(void) | |||
| 123 | unsigned int cpu; | 123 | unsigned int cpu; |
| 124 | 124 | ||
| 125 | cpu_probe(); | 125 | cpu_probe(); |
| 126 | cpu_report(); | ||
| 127 | per_cpu_trap_init(false); | 126 | per_cpu_trap_init(false); |
| 128 | mips_clockevent_init(); | 127 | mips_clockevent_init(); |
| 129 | mp_ops->init_secondary(); | 128 | mp_ops->init_secondary(); |
| 129 | cpu_report(); | ||
| 130 | 130 | ||
| 131 | /* | 131 | /* |
| 132 | * XXX parity protection should be folded in here when it's converted | 132 | * XXX parity protection should be folded in here when it's converted |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index ad3d2031c327..c3b41e24c05a 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -1231,7 +1231,8 @@ static int enable_restore_fp_context(int msa) | |||
| 1231 | 1231 | ||
| 1232 | /* Restore the scalar FP control & status register */ | 1232 | /* Restore the scalar FP control & status register */ |
| 1233 | if (!was_fpu_owner) | 1233 | if (!was_fpu_owner) |
| 1234 | asm volatile("ctc1 %0, $31" : : "r"(current->thread.fpu.fcr31)); | 1234 | write_32bit_cp1_register(CP1_STATUS, |
| 1235 | current->thread.fpu.fcr31); | ||
| 1235 | } | 1236 | } |
| 1236 | 1237 | ||
| 1237 | out: | 1238 | out: |
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c index e90b2e899291..30639a6e9b8c 100644 --- a/arch/mips/mm/tlb-r4k.c +++ b/arch/mips/mm/tlb-r4k.c | |||
| @@ -489,6 +489,8 @@ static void r4k_tlb_configure(void) | |||
| 489 | #ifdef CONFIG_64BIT | 489 | #ifdef CONFIG_64BIT |
| 490 | pg |= PG_ELPA; | 490 | pg |= PG_ELPA; |
| 491 | #endif | 491 | #endif |
| 492 | if (cpu_has_rixiex) | ||
| 493 | pg |= PG_IEC; | ||
| 492 | write_c0_pagegrain(pg); | 494 | write_c0_pagegrain(pg); |
| 493 | } | 495 | } |
| 494 | 496 | ||
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c index 2b0468e3df6a..56b96c63dc4b 100644 --- a/drivers/irqchip/irq-mips-gic.c +++ b/drivers/irqchip/irq-mips-gic.c | |||
| @@ -37,6 +37,7 @@ static struct irq_domain *gic_irq_domain; | |||
| 37 | static int gic_shared_intrs; | 37 | static int gic_shared_intrs; |
| 38 | static int gic_vpes; | 38 | static int gic_vpes; |
| 39 | static unsigned int gic_cpu_pin; | 39 | static unsigned int gic_cpu_pin; |
| 40 | static unsigned int timer_cpu_pin; | ||
| 40 | static struct irq_chip gic_level_irq_controller, gic_edge_irq_controller; | 41 | static struct irq_chip gic_level_irq_controller, gic_edge_irq_controller; |
| 41 | 42 | ||
| 42 | static void __gic_irq_dispatch(void); | 43 | static void __gic_irq_dispatch(void); |
| @@ -616,6 +617,8 @@ static int gic_local_irq_domain_map(struct irq_domain *d, unsigned int virq, | |||
| 616 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_MAP), val); | 617 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_MAP), val); |
| 617 | break; | 618 | break; |
| 618 | case GIC_LOCAL_INT_TIMER: | 619 | case GIC_LOCAL_INT_TIMER: |
| 620 | /* CONFIG_MIPS_CMP workaround (see __gic_init) */ | ||
| 621 | val = GIC_MAP_TO_PIN_MSK | timer_cpu_pin; | ||
| 619 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_TIMER_MAP), val); | 622 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_TIMER_MAP), val); |
| 620 | break; | 623 | break; |
| 621 | case GIC_LOCAL_INT_PERFCTR: | 624 | case GIC_LOCAL_INT_PERFCTR: |
| @@ -713,12 +716,36 @@ static void __init __gic_init(unsigned long gic_base_addr, | |||
| 713 | if (cpu_has_veic) { | 716 | if (cpu_has_veic) { |
| 714 | /* Always use vector 1 in EIC mode */ | 717 | /* Always use vector 1 in EIC mode */ |
| 715 | gic_cpu_pin = 0; | 718 | gic_cpu_pin = 0; |
| 719 | timer_cpu_pin = gic_cpu_pin; | ||
| 716 | set_vi_handler(gic_cpu_pin + GIC_PIN_TO_VEC_OFFSET, | 720 | set_vi_handler(gic_cpu_pin + GIC_PIN_TO_VEC_OFFSET, |
| 717 | __gic_irq_dispatch); | 721 | __gic_irq_dispatch); |
| 718 | } else { | 722 | } else { |
| 719 | gic_cpu_pin = cpu_vec - GIC_CPU_PIN_OFFSET; | 723 | gic_cpu_pin = cpu_vec - GIC_CPU_PIN_OFFSET; |
| 720 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + cpu_vec, | 724 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + cpu_vec, |
| 721 | gic_irq_dispatch); | 725 | gic_irq_dispatch); |
| 726 | /* | ||
| 727 | * With the CMP implementation of SMP (deprecated), other CPUs | ||
| 728 | * are started by the bootloader and put into a timer based | ||
| 729 | * waiting poll loop. We must not re-route those CPU's local | ||
| 730 | * timer interrupts as the wait instruction will never finish, | ||
| 731 | * so just handle whatever CPU interrupt it is routed to by | ||
| 732 | * default. | ||
| 733 | * | ||
| 734 | * This workaround should be removed when CMP support is | ||
| 735 | * dropped. | ||
| 736 | */ | ||
| 737 | if (IS_ENABLED(CONFIG_MIPS_CMP) && | ||
| 738 | gic_local_irq_is_routable(GIC_LOCAL_INT_TIMER)) { | ||
| 739 | timer_cpu_pin = gic_read(GIC_REG(VPE_LOCAL, | ||
| 740 | GIC_VPE_TIMER_MAP)) & | ||
| 741 | GIC_MAP_MSK; | ||
| 742 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + | ||
| 743 | GIC_CPU_PIN_OFFSET + | ||
| 744 | timer_cpu_pin, | ||
| 745 | gic_irq_dispatch); | ||
| 746 | } else { | ||
| 747 | timer_cpu_pin = gic_cpu_pin; | ||
| 748 | } | ||
| 722 | } | 749 | } |
| 723 | 750 | ||
| 724 | gic_irq_domain = irq_domain_add_simple(node, GIC_NUM_LOCAL_INTRS + | 751 | gic_irq_domain = irq_domain_add_simple(node, GIC_NUM_LOCAL_INTRS + |
