Commit cf1fb158 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'riscv-for-linus-4.15-rc8_cleanups' of...

Merge tag 'riscv-for-linus-4.15-rc8_cleanups' of git://git.kernel.org/pub/scm/linux/kernel/git/palmer/linux

Pull RISC-V updates from Palmer Dabbelt:
 "This contains what I hope are the last RISC-V changes to go into 4.15.
  I know it's a bit last minute, but I think they're all fairly small
  changes:

   - SR_* constants have been renamed to match the latest ISA
     specification.

   - Some CONFIG_MMU #ifdef cruft has been removed. We've never
     supported !CONFIG_MMU.

   - __NR_riscv_flush_icache is now visible to userspace. We were hoping
     to avoid making this public in order to force userspace to call the
     vDSO entry, but it looks like QEMU's user-mode emulation doesn't
     want to emulate a vDSO. In order to allow glibc to fall back to a
     system call when the vDSO entry doesn't exist we're just

   - Our defconfig is no long empty. This is another one that just
     slipped through the cracks. The defconfig isn't perfect, but it's
     at least close to what users will want for the first RISC-V
     development board. Getting closer is kind of splitting hairs here:
     none of the RISC-V specific drivers are in yet, so it's not like
     things will boot out of the box.

  The only one that's strictly necessary is the __NR_riscv_flush_icache
  change, as I want that to be part of the public API starting from our
  first kernel so nobody has to worry about it. The others are nice to
  haves, but they seem sane for 4.15 to me"

* tag 'riscv-for-linus-4.15-rc8_cleanups' of git://git.kernel.org/pub/scm/linux/kernel/git/palmer/linux:
  riscv: rename SR_* constants to match the spec
  riscv: remove CONFIG_MMU ifdefs
  RISC-V: Make __NR_riscv_flush_icache visible to userspace
  RISC-V: Add a basic defconfig
parents 44cae9b2 1125203c
CONFIG_SMP=y
CONFIG_PCI=y
CONFIG_PCIE_XILINX=y
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_SCHED=y
CONFIG_CFS_BANDWIDTH=y
CONFIG_CGROUP_BPF=y
CONFIG_NAMESPACES=y
CONFIG_USER_NS=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_EXPERT=y
CONFIG_CHECKPOINT_RESTORE=y
CONFIG_BPF_SYSCALL=y
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
CONFIG_NETLINK_DIAG=y
CONFIG_DEVTMPFS=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_VIRTIO_BLK=y
CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SR=y
CONFIG_ATA=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
CONFIG_NETDEVICES=y
CONFIG_VIRTIO_NET=y
CONFIG_MACB=y
CONFIG_E1000E=y
CONFIG_R8169=y
CONFIG_MICROSEMI_PHY=y
CONFIG_INPUT_MOUSEDEV=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_OF_PLATFORM=y
# CONFIG_PTP_1588_CLOCK is not set
CONFIG_DRM=y
CONFIG_DRM_RADEON=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_PLATFORM=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_STORAGE=y
CONFIG_USB_UAS=y
CONFIG_VIRTIO_MMIO=y
CONFIG_RAS=y
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_AUTOFS4_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_NFS_FS=y
CONFIG_NFS_V4=y
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
CONFIG_ROOT_NFS=y
# CONFIG_RCU_TRACE is not set
CONFIG_CRYPTO_USER_API_HASH=y
...@@ -17,10 +17,10 @@ ...@@ -17,10 +17,10 @@
#include <linux/const.h> #include <linux/const.h>
/* Status register flags */ /* Status register flags */
#define SR_IE _AC(0x00000002, UL) /* Interrupt Enable */ #define SR_SIE _AC(0x00000002, UL) /* Supervisor Interrupt Enable */
#define SR_PIE _AC(0x00000020, UL) /* Previous IE */ #define SR_SPIE _AC(0x00000020, UL) /* Previous Supervisor IE */
#define SR_PS _AC(0x00000100, UL) /* Previously Supervisor */ #define SR_SPP _AC(0x00000100, UL) /* Previously Supervisor */
#define SR_SUM _AC(0x00040000, UL) /* Supervisor may access User Memory */ #define SR_SUM _AC(0x00040000, UL) /* Supervisor may access User Memory */
#define SR_FS _AC(0x00006000, UL) /* Floating-point Status */ #define SR_FS _AC(0x00006000, UL) /* Floating-point Status */
#define SR_FS_OFF _AC(0x00000000, UL) #define SR_FS_OFF _AC(0x00000000, UL)
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
#include <linux/types.h> #include <linux/types.h>
#ifdef CONFIG_MMU
extern void __iomem *ioremap(phys_addr_t offset, unsigned long size); extern void __iomem *ioremap(phys_addr_t offset, unsigned long size);
/* /*
...@@ -36,8 +34,6 @@ extern void __iomem *ioremap(phys_addr_t offset, unsigned long size); ...@@ -36,8 +34,6 @@ extern void __iomem *ioremap(phys_addr_t offset, unsigned long size);
extern void iounmap(volatile void __iomem *addr); extern void iounmap(volatile void __iomem *addr);
#endif /* CONFIG_MMU */
/* Generic IO read/write. These perform native-endian accesses. */ /* Generic IO read/write. These perform native-endian accesses. */
#define __raw_writeb __raw_writeb #define __raw_writeb __raw_writeb
static inline void __raw_writeb(u8 val, volatile void __iomem *addr) static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
......
...@@ -27,25 +27,25 @@ static inline unsigned long arch_local_save_flags(void) ...@@ -27,25 +27,25 @@ static inline unsigned long arch_local_save_flags(void)
/* unconditionally enable interrupts */ /* unconditionally enable interrupts */
static inline void arch_local_irq_enable(void) static inline void arch_local_irq_enable(void)
{ {
csr_set(sstatus, SR_IE); csr_set(sstatus, SR_SIE);
} }
/* unconditionally disable interrupts */ /* unconditionally disable interrupts */
static inline void arch_local_irq_disable(void) static inline void arch_local_irq_disable(void)
{ {
csr_clear(sstatus, SR_IE); csr_clear(sstatus, SR_SIE);
} }
/* get status and disable interrupts */ /* get status and disable interrupts */
static inline unsigned long arch_local_irq_save(void) static inline unsigned long arch_local_irq_save(void)
{ {
return csr_read_clear(sstatus, SR_IE); return csr_read_clear(sstatus, SR_SIE);
} }
/* test flags */ /* test flags */
static inline int arch_irqs_disabled_flags(unsigned long flags) static inline int arch_irqs_disabled_flags(unsigned long flags)
{ {
return !(flags & SR_IE); return !(flags & SR_SIE);
} }
/* test hardware interrupt enable bit */ /* test hardware interrupt enable bit */
...@@ -57,7 +57,7 @@ static inline int arch_irqs_disabled(void) ...@@ -57,7 +57,7 @@ static inline int arch_irqs_disabled(void)
/* set interrupt enabled status */ /* set interrupt enabled status */
static inline void arch_local_irq_restore(unsigned long flags) static inline void arch_local_irq_restore(unsigned long flags)
{ {
csr_set(sstatus, flags & SR_IE); csr_set(sstatus, flags & SR_SIE);
} }
#endif /* _ASM_RISCV_IRQFLAGS_H */ #endif /* _ASM_RISCV_IRQFLAGS_H */
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#ifdef CONFIG_MMU
/* Page Upper Directory not used in RISC-V */ /* Page Upper Directory not used in RISC-V */
#include <asm-generic/pgtable-nopud.h> #include <asm-generic/pgtable-nopud.h>
#include <asm/page.h> #include <asm/page.h>
...@@ -413,8 +411,6 @@ static inline void pgtable_cache_init(void) ...@@ -413,8 +411,6 @@ static inline void pgtable_cache_init(void)
/* No page table caches to initialize */ /* No page table caches to initialize */
} }
#endif /* CONFIG_MMU */
#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 - 1)
#define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE) #define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)
......
...@@ -66,7 +66,7 @@ struct pt_regs { ...@@ -66,7 +66,7 @@ struct pt_regs {
#define REG_FMT "%08lx" #define REG_FMT "%08lx"
#endif #endif
#define user_mode(regs) (((regs)->sstatus & SR_PS) == 0) #define user_mode(regs) (((regs)->sstatus & SR_SPP) == 0)
/* Helpers for working with the instruction pointer */ /* Helpers for working with the instruction pointer */
......
...@@ -15,8 +15,6 @@ ...@@ -15,8 +15,6 @@
#ifndef _ASM_RISCV_TLBFLUSH_H #ifndef _ASM_RISCV_TLBFLUSH_H
#define _ASM_RISCV_TLBFLUSH_H #define _ASM_RISCV_TLBFLUSH_H
#ifdef CONFIG_MMU
#include <linux/mm_types.h> #include <linux/mm_types.h>
/* /*
...@@ -64,6 +62,4 @@ static inline void flush_tlb_kernel_range(unsigned long start, ...@@ -64,6 +62,4 @@ static inline void flush_tlb_kernel_range(unsigned long start,
flush_tlb_all(); flush_tlb_all();
} }
#endif /* CONFIG_MMU */
#endif /* _ASM_RISCV_TLBFLUSH_H */ #endif /* _ASM_RISCV_TLBFLUSH_H */
...@@ -127,7 +127,6 @@ extern int fixup_exception(struct pt_regs *state); ...@@ -127,7 +127,6 @@ extern int fixup_exception(struct pt_regs *state);
* call. * call.
*/ */
#ifdef CONFIG_MMU
#define __get_user_asm(insn, x, ptr, err) \ #define __get_user_asm(insn, x, ptr, err) \
do { \ do { \
uintptr_t __tmp; \ uintptr_t __tmp; \
...@@ -153,13 +152,11 @@ do { \ ...@@ -153,13 +152,11 @@ do { \
__disable_user_access(); \ __disable_user_access(); \
(x) = __x; \ (x) = __x; \
} while (0) } while (0)
#endif /* CONFIG_MMU */
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
#define __get_user_8(x, ptr, err) \ #define __get_user_8(x, ptr, err) \
__get_user_asm("ld", x, ptr, err) __get_user_asm("ld", x, ptr, err)
#else /* !CONFIG_64BIT */ #else /* !CONFIG_64BIT */
#ifdef CONFIG_MMU
#define __get_user_8(x, ptr, err) \ #define __get_user_8(x, ptr, err) \
do { \ do { \
u32 __user *__ptr = (u32 __user *)(ptr); \ u32 __user *__ptr = (u32 __user *)(ptr); \
...@@ -193,7 +190,6 @@ do { \ ...@@ -193,7 +190,6 @@ do { \
(x) = (__typeof__(x))((__typeof__((x)-(x)))( \ (x) = (__typeof__(x))((__typeof__((x)-(x)))( \
(((u64)__hi << 32) | __lo))); \ (((u64)__hi << 32) | __lo))); \
} while (0) } while (0)
#endif /* CONFIG_MMU */
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
...@@ -267,8 +263,6 @@ do { \ ...@@ -267,8 +263,6 @@ do { \
((x) = 0, -EFAULT); \ ((x) = 0, -EFAULT); \
}) })
#ifdef CONFIG_MMU
#define __put_user_asm(insn, x, ptr, err) \ #define __put_user_asm(insn, x, ptr, err) \
do { \ do { \
uintptr_t __tmp; \ uintptr_t __tmp; \
...@@ -292,14 +286,11 @@ do { \ ...@@ -292,14 +286,11 @@ do { \
: "rJ" (__x), "i" (-EFAULT)); \ : "rJ" (__x), "i" (-EFAULT)); \
__disable_user_access(); \ __disable_user_access(); \
} while (0) } while (0)
#endif /* CONFIG_MMU */
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
#define __put_user_8(x, ptr, err) \ #define __put_user_8(x, ptr, err) \
__put_user_asm("sd", x, ptr, err) __put_user_asm("sd", x, ptr, err)
#else /* !CONFIG_64BIT */ #else /* !CONFIG_64BIT */
#ifdef CONFIG_MMU
#define __put_user_8(x, ptr, err) \ #define __put_user_8(x, ptr, err) \
do { \ do { \
u32 __user *__ptr = (u32 __user *)(ptr); \ u32 __user *__ptr = (u32 __user *)(ptr); \
...@@ -329,7 +320,6 @@ do { \ ...@@ -329,7 +320,6 @@ do { \
: "rJ" (__x), "rJ" (__x >> 32), "i" (-EFAULT)); \ : "rJ" (__x), "rJ" (__x >> 32), "i" (-EFAULT)); \
__disable_user_access(); \ __disable_user_access(); \
} while (0) } while (0)
#endif /* CONFIG_MMU */
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
...@@ -438,7 +428,6 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n) ...@@ -438,7 +428,6 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n)
* will set "err" to -EFAULT, while successful accesses return the previous * will set "err" to -EFAULT, while successful accesses return the previous
* value. * value.
*/ */
#ifdef CONFIG_MMU
#define __cmpxchg_user(ptr, old, new, err, size, lrb, scb) \ #define __cmpxchg_user(ptr, old, new, err, size, lrb, scb) \
({ \ ({ \
__typeof__(ptr) __ptr = (ptr); \ __typeof__(ptr) __ptr = (ptr); \
...@@ -508,6 +497,5 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n) ...@@ -508,6 +497,5 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n)
(err) = __err; \ (err) = __err; \
__ret; \ __ret; \
}) })
#endif /* CONFIG_MMU */
#endif /* _ASM_RISCV_UACCESS_H */ #endif /* _ASM_RISCV_UACCESS_H */
...@@ -14,3 +14,4 @@ ...@@ -14,3 +14,4 @@
#define __ARCH_HAVE_MMU #define __ARCH_HAVE_MMU
#define __ARCH_WANT_SYS_CLONE #define __ARCH_WANT_SYS_CLONE
#include <uapi/asm/unistd.h> #include <uapi/asm/unistd.h>
#include <uapi/asm/syscalls.h>
/*
* Copyright (C) 2017 SiFive
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _ASM_RISCV_VDSO_SYSCALLS_H
#define _ASM_RISCV_VDSO_SYSCALLS_H
#ifdef CONFIG_SMP
/* These syscalls are only used by the vDSO and are not in the uapi. */
#define __NR_riscv_flush_icache (__NR_arch_specific_syscall + 15)
__SYSCALL(__NR_riscv_flush_icache, sys_riscv_flush_icache)
#endif
#endif /* _ASM_RISCV_VDSO_H */
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2017 SiFive
*/
#ifndef _ASM__UAPI__SYSCALLS_H
#define _ASM__UAPI__SYSCALLS_H
/*
* Allows the instruction cache to be flushed from userspace. Despite RISC-V
* having a direct 'fence.i' instruction available to userspace (which we
* can't trap!), that's not actually viable when running on Linux because the
* kernel might schedule a process on another hart. There is no way for
* userspace to handle this without invoking the kernel (as it doesn't know the
* thread->hart mappings), so we've defined a RISC-V specific system call to
* flush the instruction cache.
*
* __NR_riscv_flush_icache is defined to flush the instruction cache over an
* address range, with the flush applying to either all threads or just the
* caller. We don't currently do anything with the address range, that's just
* in there for forwards compatibility.
*/
#define __NR_riscv_flush_icache (__NR_arch_specific_syscall + 15)
__SYSCALL(__NR_riscv_flush_icache, sys_riscv_flush_icache)
#endif
...@@ -196,7 +196,7 @@ handle_syscall: ...@@ -196,7 +196,7 @@ handle_syscall:
addi s2, s2, 0x4 addi s2, s2, 0x4
REG_S s2, PT_SEPC(sp) REG_S s2, PT_SEPC(sp)
/* System calls run with interrupts enabled */ /* System calls run with interrupts enabled */
csrs sstatus, SR_IE csrs sstatus, SR_SIE
/* Trace syscalls, but only if requested by the user. */ /* Trace syscalls, but only if requested by the user. */
REG_L t0, TASK_TI_FLAGS(tp) REG_L t0, TASK_TI_FLAGS(tp)
andi t0, t0, _TIF_SYSCALL_TRACE andi t0, t0, _TIF_SYSCALL_TRACE
...@@ -224,8 +224,8 @@ ret_from_syscall: ...@@ -224,8 +224,8 @@ ret_from_syscall:
ret_from_exception: ret_from_exception:
REG_L s0, PT_SSTATUS(sp) REG_L s0, PT_SSTATUS(sp)
csrc sstatus, SR_IE csrc sstatus, SR_SIE
andi s0, s0, SR_PS andi s0, s0, SR_SPP
bnez s0, restore_all bnez s0, restore_all
resume_userspace: resume_userspace:
...@@ -255,7 +255,7 @@ work_pending: ...@@ -255,7 +255,7 @@ work_pending:
bnez s1, work_resched bnez s1, work_resched
work_notifysig: work_notifysig:
/* Handle pending signals and notify-resume requests */ /* Handle pending signals and notify-resume requests */
csrs sstatus, SR_IE /* Enable interrupts for do_notify_resume() */ csrs sstatus, SR_SIE /* Enable interrupts for do_notify_resume() */
move a0, sp /* pt_regs */ move a0, sp /* pt_regs */
move a1, s0 /* current_thread_info->flags */ move a1, s0 /* current_thread_info->flags */
tail do_notify_resume tail do_notify_resume
......
...@@ -76,7 +76,7 @@ void show_regs(struct pt_regs *regs) ...@@ -76,7 +76,7 @@ void show_regs(struct pt_regs *regs)
void start_thread(struct pt_regs *regs, unsigned long pc, void start_thread(struct pt_regs *regs, unsigned long pc,
unsigned long sp) unsigned long sp)
{ {
regs->sstatus = SR_PIE /* User mode, irqs on */ | SR_FS_INITIAL; regs->sstatus = SR_SPIE /* User mode, irqs on */ | SR_FS_INITIAL;
regs->sepc = pc; regs->sepc = pc;
regs->sp = sp; regs->sp = sp;
set_fs(USER_DS); set_fs(USER_DS);
...@@ -110,7 +110,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, ...@@ -110,7 +110,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
const register unsigned long gp __asm__ ("gp"); const register unsigned long gp __asm__ ("gp");
memset(childregs, 0, sizeof(struct pt_regs)); memset(childregs, 0, sizeof(struct pt_regs));
childregs->gp = gp; childregs->gp = gp;
childregs->sstatus = SR_PS | SR_PIE; /* Supervisor, irqs on */ childregs->sstatus = SR_SPP | SR_SPIE; /* Supervisor, irqs on */
p->thread.ra = (unsigned long)ret_from_kernel_thread; p->thread.ra = (unsigned long)ret_from_kernel_thread;
p->thread.s[0] = usp; /* fn */ p->thread.s[0] = usp; /* fn */
......
...@@ -23,5 +23,4 @@ ...@@ -23,5 +23,4 @@
void *sys_call_table[__NR_syscalls] = { void *sys_call_table[__NR_syscalls] = {
[0 ... __NR_syscalls - 1] = sys_ni_syscall, [0 ... __NR_syscalls - 1] = sys_ni_syscall,
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/vdso-syscalls.h>
}; };
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/vdso-syscalls.h>
.text .text
/* int __vdso_flush_icache(void *start, void *end, unsigned long flags); */ /* int __vdso_flush_icache(void *start, void *end, unsigned long flags); */
......
...@@ -63,7 +63,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs) ...@@ -63,7 +63,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs)
goto vmalloc_fault; goto vmalloc_fault;
/* Enable interrupts if they were enabled in the parent context. */ /* Enable interrupts if they were enabled in the parent context. */
if (likely(regs->sstatus & SR_PIE)) if (likely(regs->sstatus & SR_SPIE))
local_irq_enable(); local_irq_enable();
/* /*
......
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