diff options
Diffstat (limited to 'arch/score')
127 files changed, 0 insertions, 7695 deletions
diff --git a/arch/score/Kconfig b/arch/score/Kconfig deleted file mode 100644 index d881f99c9ddd..000000000000 --- a/arch/score/Kconfig +++ /dev/null @@ -1,108 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -menu "Machine selection" - -config SCORE - def_bool y - select GENERIC_IRQ_SHOW - select GENERIC_IOMAP - select GENERIC_ATOMIC64 - select HAVE_MEMBLOCK - select HAVE_MEMBLOCK_NODE_MAP - select ARCH_DISCARD_MEMBLOCK - select GENERIC_CPU_DEVICES - select GENERIC_CLOCKEVENTS - select HAVE_MOD_ARCH_SPECIFIC - select VIRT_TO_BUS - select MODULES_USE_ELF_REL - select CLONE_BACKWARDS - select CPU_NO_EFFICIENT_FFS - -choice - prompt "System type" - default MACH_SPCT6600 - -config ARCH_SCORE7 - bool "SCORE7 processor" - select SYS_SUPPORTS_32BIT_KERNEL - -config MACH_SPCT6600 - bool "SPCT6600 series based machines" - select SYS_SUPPORTS_32BIT_KERNEL - -config SCORE_SIM - bool "Score simulator" - select SYS_SUPPORTS_32BIT_KERNEL -endchoice - -endmenu - -config NO_DMA - bool - default y - -config RWSEM_GENERIC_SPINLOCK - def_bool y - -config GENERIC_HWEIGHT - def_bool y - -config GENERIC_CALIBRATE_DELAY - def_bool y - -menu "Kernel type" - -config 32BIT - def_bool y - -config ARCH_FLATMEM_ENABLE - def_bool y - -source "mm/Kconfig" - -config MEMORY_START - hex - default 0xa0000000 - -source "kernel/Kconfig.hz" -source "kernel/Kconfig.preempt" - -endmenu - -config RWSEM_GENERIC_SPINLOCK - def_bool y - -config LOCKDEP_SUPPORT - def_bool y - -config STACKTRACE_SUPPORT - def_bool y - -source "init/Kconfig" - -source "kernel/Kconfig.freezer" - -config MMU - def_bool y - -menu "Executable file formats" - -source "fs/Kconfig.binfmt" - -endmenu - -source "net/Kconfig" - -source "drivers/Kconfig" - -source "fs/Kconfig" - -source "arch/score/Kconfig.debug" - -source "security/Kconfig" - -source "crypto/Kconfig" - -source "lib/Kconfig" - -config NO_IOMEM - def_bool y diff --git a/arch/score/Kconfig.debug b/arch/score/Kconfig.debug deleted file mode 100644 index 041e51dcdafb..000000000000 --- a/arch/score/Kconfig.debug +++ /dev/null @@ -1,29 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -menu "Kernel hacking" - -config TRACE_IRQFLAGS_SUPPORT - bool - default y - -source "lib/Kconfig.debug" - -config CMDLINE - string "Default kernel command string" - default "" - help - On some platforms, there is currently no way for the boot loader to - pass arguments to the kernel. For these platforms, you can supply - some command-line options at build time by entering them here. In - other cases you can specify kernel args so that you don't have - to set them up in board prom initialization routines. - -config RUNTIME_DEBUG - bool "Enable run-time debugging" - depends on DEBUG_KERNEL - help - If you say Y here, some debugging macros will do run-time checking. - If you say N here, those macros will mostly turn to no-ops. See - include/asm-score/debug.h for debugging macros. - If unsure, say N. - -endmenu diff --git a/arch/score/Makefile b/arch/score/Makefile deleted file mode 100644 index 9e3e060290e0..000000000000 --- a/arch/score/Makefile +++ /dev/null @@ -1,44 +0,0 @@ -# -# arch/score/Makefile -# -# This file is subject to the terms and conditions of the GNU General Public -# License. See the file "COPYING" in the main directory of this archive -# for more details. -# - -KBUILD_DEFCONFIG := spct6600_defconfig -CROSS_COMPILE := score-linux- - -# -# CPU-dependent compiler/assembler options for optimization. -# -cflags-y += -G0 -pipe -mel -mnhwloop -D__SCOREEL__ \ - -D__linux__ -ffunction-sections -ffreestanding - -# -# Board-dependent options and extra files -# -KBUILD_AFLAGS += $(cflags-y) -KBUILD_CFLAGS += $(cflags-y) -KBUILD_AFLAGS_MODULE += -KBUILD_CFLAGS_MODULE += -LDFLAGS += --oformat elf32-littlescore -LDFLAGS_vmlinux += -G0 -static -nostdlib - -head-y := arch/score/kernel/head.o -libs-y += arch/score/lib/ -core-y += arch/score/kernel/ arch/score/mm/ - -boot := arch/score/boot - -vmlinux.bin: vmlinux - $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ - -archclean: - @$(MAKE) $(clean)=$(boot) - -define archhelp - echo ' vmlinux.bin - Raw binary boot image' - echo - echo ' These will be default as appropriate for a configured platform.' -endef diff --git a/arch/score/boot/Makefile b/arch/score/boot/Makefile deleted file mode 100644 index 0c5fbd0fb696..000000000000 --- a/arch/score/boot/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# -# arch/score/boot/Makefile -# -# This file is subject to the terms and conditions of the GNU General Public -# License. See the file "COPYING" in the main directory of this archive -# for more details. -# - -targets := vmlinux.bin - -$(obj)/vmlinux.bin: vmlinux FORCE - $(call if_changed,objcopy) - @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' - -clean-files += vmlinux.bin diff --git a/arch/score/configs/spct6600_defconfig b/arch/score/configs/spct6600_defconfig deleted file mode 100644 index b2d8802f43b4..000000000000 --- a/arch/score/configs/spct6600_defconfig +++ /dev/null @@ -1,84 +0,0 @@ -CONFIG_HZ_100=y -CONFIG_PREEMPT_VOLUNTARY=y -CONFIG_EXPERIMENTAL=y -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_SYSVIPC=y -CONFIG_POSIX_MQUEUE=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=12 -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_EXPERT=y -# CONFIG_KALLSYMS is not set -# CONFIG_HOTPLUG is not set -CONFIG_SLAB=y -CONFIG_MODULES=y -CONFIG_MODULE_FORCE_LOAD=y -CONFIG_MODULE_UNLOAD=y -CONFIG_MODULE_FORCE_UNLOAD=y -# CONFIG_BLK_DEV_BSG is not set -CONFIG_BINFMT_MISC=y -CONFIG_NET=y -CONFIG_UNIX=y -CONFIG_NET_KEY=y -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_ARPD=y -# CONFIG_INET_LRO is not set -# CONFIG_IPV6 is not set -# CONFIG_STANDALONE is not set -# CONFIG_PREVENT_FIRMWARE_BUILD is not set -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_CRYPTOLOOP=y -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_COUNT=1 -# CONFIG_MISC_DEVICES is not set -CONFIG_NETDEVICES=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set -# CONFIG_INPUT_MOUSEDEV is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_SERIO is not set -CONFIG_SERIAL_NONSTANDARD=y -CONFIG_STALDRV=y -# CONFIG_HW_RANDOM is not set -CONFIG_RAW_DRIVER=y -CONFIG_MAX_RAW_DEVS=8192 -# CONFIG_HWMON is not set -# CONFIG_VGA_CONSOLE is not set -# CONFIG_HID_SUPPORT is not set -# CONFIG_USB_SUPPORT is not set -CONFIG_EXT2_FS=y -CONFIG_EXT2_FS_XATTR=y -CONFIG_EXT2_FS_POSIX_ACL=y -CONFIG_EXT3_FS=y -# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set -CONFIG_EXT3_FS_POSIX_ACL=y -CONFIG_AUTOFS_FS=y -CONFIG_AUTOFS4_FS=y -CONFIG_PROC_KCORE=y -# CONFIG_PROC_PAGE_MONITOR is not set -CONFIG_TMPFS=y -CONFIG_TMPFS_POSIX_ACL=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_NFS_V3_ACL=y -CONFIG_NFS_V4=y -CONFIG_NFSD=y -CONFIG_NFSD_V3_ACL=y -CONFIG_NFSD_V4=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SECURITY=y -CONFIG_SECURITY_NETWORK=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_CRYPTD=y -CONFIG_CRYPTO_SEQIV=y -CONFIG_CRYPTO_MD4=y -CONFIG_CRYPTO_MICHAEL_MIC=y -# CONFIG_CRYPTO_ANSI_CPRNG is not set -# CONFIG_CRYPTO_HW is not set -CONFIG_CRC_CCITT=y -CONFIG_CRC16=y -CONFIG_LIBCRC32C=y diff --git a/arch/score/include/asm/Kbuild b/arch/score/include/asm/Kbuild deleted file mode 100644 index 1a0ee72f6a7c..000000000000 --- a/arch/score/include/asm/Kbuild +++ /dev/null @@ -1,13 +0,0 @@ -generic-y += barrier.h -generic-y += current.h -generic-y += extable.h -generic-y += irq_work.h -generic-y += mcs_spinlock.h -generic-y += mm-arch-hooks.h -generic-y += preempt.h -generic-y += sections.h -generic-y += trace_clock.h -generic-y += xor.h -generic-y += serial.h -generic-y += word-at-a-time.h -generic-y += kprobes.h diff --git a/arch/score/include/asm/asm-offsets.h b/arch/score/include/asm/asm-offsets.h deleted file mode 100644 index d370ee36a182..000000000000 --- a/arch/score/include/asm/asm-offsets.h +++ /dev/null @@ -1 +0,0 @@ -#include <generated/asm-offsets.h> diff --git a/arch/score/include/asm/asmmacro.h b/arch/score/include/asm/asmmacro.h deleted file mode 100644 index 7370a35d17d1..000000000000 --- a/arch/score/include/asm/asmmacro.h +++ /dev/null @@ -1,162 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_ASMMACRO_H -#define _ASM_SCORE_ASMMACRO_H - -#include <asm/asm-offsets.h> - -#ifdef __ASSEMBLY__ - -.macro SAVE_ALL - mfcr r30, cr0 - mv r31, r0 - nop - /* if UMs == 1, change stack. */ - slli.c r30, r30, 28 - bpl 1f - la r31, kernelsp - lw r31, [r31] -1: - mv r30, r0 - addri r0, r31, -PT_SIZE - - sw r30, [r0, PT_R0] - .set r1 - sw r1, [r0, PT_R1] - .set nor1 - sw r2, [r0, PT_R2] - sw r3, [r0, PT_R3] - sw r4, [r0, PT_R4] - sw r5, [r0, PT_R5] - sw r6, [r0, PT_R6] - sw r7, [r0, PT_R7] - - sw r8, [r0, PT_R8] - sw r9, [r0, PT_R9] - sw r10, [r0, PT_R10] - sw r11, [r0, PT_R11] - sw r12, [r0, PT_R12] - sw r13, [r0, PT_R13] - sw r14, [r0, PT_R14] - sw r15, [r0, PT_R15] - - sw r16, [r0, PT_R16] - sw r17, [r0, PT_R17] - sw r18, [r0, PT_R18] - sw r19, [r0, PT_R19] - sw r20, [r0, PT_R20] - sw r21, [r0, PT_R21] - sw r22, [r0, PT_R22] - sw r23, [r0, PT_R23] - - sw r24, [r0, PT_R24] - sw r25, [r0, PT_R25] - sw r25, [r0, PT_R25] - sw r26, [r0, PT_R26] - sw r27, [r0, PT_R27] - - sw r28, [r0, PT_R28] - sw r29, [r0, PT_R29] - orri r28, r0, 0x1fff - li r31, 0x00001fff - xor r28, r28, r31 - - mfcehl r30, r31 - sw r30, [r0, PT_CEH] - sw r31, [r0, PT_CEL] - - mfcr r31, cr0 - sw r31, [r0, PT_PSR] - - mfcr r31, cr1 - sw r31, [r0, PT_CONDITION] - - mfcr r31, cr2 - sw r31, [r0, PT_ECR] - - mfcr r31, cr5 - srli r31, r31, 1 - slli r31, r31, 1 - sw r31, [r0, PT_EPC] -.endm - -.macro RESTORE_ALL_AND_RET - mfcr r30, cr0 - srli r30, r30, 1 - slli r30, r30, 1 - mtcr r30, cr0 - nop - nop - nop - nop - nop - - .set r1 - ldis r1, 0x00ff - and r30, r30, r1 - not r1, r1 - lw r31, [r0, PT_PSR] - and r31, r31, r1 - .set nor1 - or r31, r31, r30 - mtcr r31, cr0 - nop - nop - nop - nop - nop - - lw r30, [r0, PT_CONDITION] - mtcr r30, cr1 - nop - nop - nop - nop - nop - - lw r30, [r0, PT_CEH] - lw r31, [r0, PT_CEL] - mtcehl r30, r31 - - .set r1 - lw r1, [r0, PT_R1] - .set nor1 - lw r2, [r0, PT_R2] - lw r3, [r0, PT_R3] - lw r4, [r0, PT_R4] - lw r5, [r0, PT_R5] - lw r6, [r0, PT_R6] - lw r7, [r0, PT_R7] - - lw r8, [r0, PT_R8] - lw r9, [r0, PT_R9] - lw r10, [r0, PT_R10] - lw r11, [r0, PT_R11] - lw r12, [r0, PT_R12] - lw r13, [r0, PT_R13] - lw r14, [r0, PT_R14] - lw r15, [r0, PT_R15] - - lw r16, [r0, PT_R16] - lw r17, [r0, PT_R17] - lw r18, [r0, PT_R18] - lw r19, [r0, PT_R19] - lw r20, [r0, PT_R20] - lw r21, [r0, PT_R21] - lw r22, [r0, PT_R22] - lw r23, [r0, PT_R23] - - lw r24, [r0, PT_R24] - lw r25, [r0, PT_R25] - lw r26, [r0, PT_R26] - lw r27, [r0, PT_R27] - lw r28, [r0, PT_R28] - lw r29, [r0, PT_R29] - - lw r30, [r0, PT_EPC] - lw r0, [r0, PT_R0] - mtcr r30, cr5 - rte -.endm - -#endif /* __ASSEMBLY__ */ -#endif /* _ASM_SCORE_ASMMACRO_H */ diff --git a/arch/score/include/asm/atomic.h b/arch/score/include/asm/atomic.h deleted file mode 100644 index 56700980b9be..000000000000 --- a/arch/score/include/asm/atomic.h +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_ATOMIC_H -#define _ASM_SCORE_ATOMIC_H - -#include <asm/cmpxchg.h> -#include <asm-generic/atomic.h> - -#endif /* _ASM_SCORE_ATOMIC_H */ diff --git a/arch/score/include/asm/bitops.h b/arch/score/include/asm/bitops.h deleted file mode 100644 index 6342b0123725..000000000000 --- a/arch/score/include/asm/bitops.h +++ /dev/null @@ -1,11 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_BITOPS_H -#define _ASM_SCORE_BITOPS_H - -#include <asm/byteorder.h> /* swab32 */ -#include <asm/barrier.h> - -#include <asm-generic/bitops.h> -#include <asm-generic/bitops/__fls.h> - -#endif /* _ASM_SCORE_BITOPS_H */ diff --git a/arch/score/include/asm/bug.h b/arch/score/include/asm/bug.h deleted file mode 100644 index 966b2e9e8d74..000000000000 --- a/arch/score/include/asm/bug.h +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_BUG_H -#define _ASM_SCORE_BUG_H - -#include <asm-generic/bug.h> - -struct pt_regs; -extern void __die(const char *, struct pt_regs *, const char *, - const char *, unsigned long) __attribute__((noreturn)); -extern void __die_if_kernel(const char *, struct pt_regs *, const char *, - const char *, unsigned long); - -#define die(msg, regs) \ - __die(msg, regs, __FILE__ ":", __func__, __LINE__) -#define die_if_kernel(msg, regs) \ - __die_if_kernel(msg, regs, __FILE__ ":", __func__, __LINE__) - -#endif /* _ASM_SCORE_BUG_H */ diff --git a/arch/score/include/asm/bugs.h b/arch/score/include/asm/bugs.h deleted file mode 100644 index 81185dced763..000000000000 --- a/arch/score/include/asm/bugs.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_BUGS_H -#define _ASM_SCORE_BUGS_H - -#include <asm-generic/bugs.h> - -#endif /* _ASM_SCORE_BUGS_H */ diff --git a/arch/score/include/asm/cache.h b/arch/score/include/asm/cache.h deleted file mode 100644 index d55de3cbbb9f..000000000000 --- a/arch/score/include/asm/cache.h +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_CACHE_H -#define _ASM_SCORE_CACHE_H - -#define L1_CACHE_SHIFT 4 -#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) - -#endif /* _ASM_SCORE_CACHE_H */ diff --git a/arch/score/include/asm/cacheflush.h b/arch/score/include/asm/cacheflush.h deleted file mode 100644 index cf1e609634fd..000000000000 --- a/arch/score/include/asm/cacheflush.h +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_CACHEFLUSH_H -#define _ASM_SCORE_CACHEFLUSH_H - -/* Keep includes the same across arches. */ -#include <linux/mm.h> - -extern void flush_cache_all(void); -extern void flush_cache_mm(struct mm_struct *mm); -extern void flush_cache_range(struct vm_area_struct *vma, - unsigned long start, unsigned long end); -extern void flush_cache_page(struct vm_area_struct *vma, - unsigned long page, unsigned long pfn); -extern void flush_cache_sigtramp(unsigned long addr); -extern void flush_icache_all(void); -extern void flush_icache_range(unsigned long start, unsigned long end); -extern void flush_dcache_range(unsigned long start, unsigned long end); -extern void flush_dcache_page(struct page *page); - -#define PG_dcache_dirty PG_arch_1 - -#define flush_cache_dup_mm(mm) do {} while (0) -#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0 -#define flush_dcache_mmap_lock(mapping) do {} while (0) -#define flush_dcache_mmap_unlock(mapping) do {} while (0) -#define flush_cache_vmap(start, end) do {} while (0) -#define flush_cache_vunmap(start, end) do {} while (0) - -static inline void flush_icache_page(struct vm_area_struct *vma, - struct page *page) -{ - if (vma->vm_flags & VM_EXEC) { - void *v = page_address(page); - flush_icache_range((unsigned long) v, - (unsigned long) v + PAGE_SIZE); - } -} - -#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ - memcpy(dst, src, len) - -#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ - do { \ - memcpy(dst, src, len); \ - if ((vma->vm_flags & VM_EXEC)) \ - flush_cache_page(vma, vaddr, page_to_pfn(page));\ - } while (0) - -#endif /* _ASM_SCORE_CACHEFLUSH_H */ diff --git a/arch/score/include/asm/checksum.h b/arch/score/include/asm/checksum.h deleted file mode 100644 index 9f00ca5fd49d..000000000000 --- a/arch/score/include/asm/checksum.h +++ /dev/null @@ -1,244 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_CHECKSUM_H -#define _ASM_SCORE_CHECKSUM_H - -#include <linux/in6.h> -#include <linux/uaccess.h> - -/* - * computes the checksum of a memory block at buff, length len, - * and adds in "sum" (32-bit) - * - * returns a 32-bit number suitable for feeding into itself - * or csum_tcpudp_magic - * - * this function must be called with even lengths, except - * for the last fragment, which may be odd - * - * it's best to have buff aligned on a 32-bit boundary - */ -unsigned int csum_partial(const void *buff, int len, __wsum sum); -unsigned int csum_partial_copy_from_user(const char *src, char *dst, int len, - unsigned int sum, int *csum_err); -unsigned int csum_partial_copy(const char *src, char *dst, - int len, unsigned int sum); - -/* - * this is a new version of the above that records errors it finds in *errp, - * but continues and zeros the rest of the buffer. - */ - -/* - * Copy and checksum to user - */ -#define HAVE_CSUM_COPY_USER -static inline -__wsum csum_and_copy_to_user(const void *src, void __user *dst, int len, - __wsum sum, int *err_ptr) -{ - sum = csum_partial(src, len, sum); - if (copy_to_user(dst, src, len)) { - *err_ptr = -EFAULT; - return (__force __wsum) -1; /* invalid checksum */ - } - return sum; -} - - -#define csum_partial_copy_nocheck csum_partial_copy -/* - * Fold a partial checksum without adding pseudo headers - */ - -static inline __sum16 csum_fold(__wsum sum) -{ - /* the while loop is unnecessary really, it's always enough with two - iterations */ - __asm__ __volatile__( - ".set volatile\n\t" - ".set\tr1\n\t" - "slli\tr1,%0, 16\n\t" - "add\t%0,%0, r1\n\t" - "cmp.c\tr1, %0\n\t" - "srli\t%0, %0, 16\n\t" - "bleu\t1f\n\t" - "addi\t%0, 0x1\n\t" - "1:ldi\tr30, 0xffff\n\t" - "xor\t%0, %0, r30\n\t" - "slli\t%0, %0, 16\n\t" - "srli\t%0, %0, 16\n\t" - ".set\tnor1\n\t" - ".set optimize\n\t" - : "=r" (sum) - : "0" (sum)); - return sum; -} - -/* - * This is a version of ip_compute_csum() optimized for IP headers, - * which always checksum on 4 octet boundaries. - * - * By Jorge Cwik <jorge@laser.satlink.net>, adapted for linux by - * Arnt Gulbrandsen. - */ -static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl) -{ - unsigned int sum; - unsigned long dummy; - - __asm__ __volatile__( - ".set volatile\n\t" - ".set\tnor1\n\t" - "lw\t%0, [%1]\n\t" - "subri\t%2, %2, 4\n\t" - "slli\t%2, %2, 2\n\t" - "lw\t%3, [%1, 4]\n\t" - "add\t%2, %2, %1\n\t" - "add\t%0, %0, %3\n\t" - "cmp.c\t%3, %0\n\t" - "lw\t%3, [%1, 8]\n\t" - "bleu\t1f\n\t" - "addi\t%0, 0x1\n\t" - "1:\n\t" - "add\t%0, %0, %3\n\t" - "cmp.c\t%3, %0\n\t" - "lw\t%3, [%1, 12]\n\t" - "bleu\t1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %3\n\t" - "cmp.c\t%3, %0\n\t" - "bleu\t1f\n\t" - "addi\t%0, 0x1\n" - - "1:\tlw\t%3, [%1, 16]\n\t" - "addi\t%1, 4\n\t" - "add\t%0, %0, %3\n\t" - "cmp.c\t%3, %0\n\t" - "bleu\t2f\n\t" - "addi\t%0, 0x1\n" - "2:cmp.c\t%2, %1\n\t" - "bne\t1b\n\t" - - ".set\tr1\n\t" - ".set optimize\n\t" - : "=&r" (sum), "=&r" (iph), "=&r" (ihl), "=&r" (dummy) - : "1" (iph), "2" (ihl)); - - return csum_fold(sum); -} - -static inline __wsum -csum_tcpudp_nofold(__be32 saddr, __be32 daddr, __u32 len, - __u8 proto, __wsum sum) -{ - unsigned long tmp = (len + proto) << 8; - __asm__ __volatile__( - ".set volatile\n\t" - "add\t%0, %0, %2\n\t" - "cmp.c\t%2, %0\n\t" - "bleu\t1f\n\t" - "addi\t%0, 0x1\n\t" - "1:\n\t" - "add\t%0, %0, %3\n\t" - "cmp.c\t%3, %0\n\t" - "bleu\t1f\n\t" - "addi\t%0, 0x1\n\t" - "1:\n\t" - "add\t%0, %0, %4\n\t" - "cmp.c\t%4, %0\n\t" - "bleu\t1f\n\t" - "addi\t%0, 0x1\n\t" - "1:\n\t" - ".set optimize\n\t" - : "=r" (sum) - : "0" (daddr), "r"(saddr), - "r" (tmp), - "r" (sum)); - return sum; -} - -/* - * computes the checksum of the TCP/UDP pseudo-header - * returns a 16-bit checksum, already complemented - */ -static inline __sum16 -csum_tcpudp_magic(__be32 saddr, __be32 daddr, __u32 len, - __u8 proto, __wsum sum) -{ - return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum)); -} - -/* - * this routine is used for miscellaneous IP-like checksums, mainly - * in icmp.c - */ - -static inline unsigned short ip_compute_csum(const void *buff, int len) -{ - return csum_fold(csum_partial(buff, len, 0)); -} - -#define _HAVE_ARCH_IPV6_CSUM -static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr, - const struct in6_addr *daddr, - __u32 len, __u8 proto, __wsum sum) -{ - __asm__ __volatile__( - ".set\tvolatile\t\t\t# csum_ipv6_magic\n\t" - "add\t%0, %0, %5\t\t\t# proto (long in network byte order)\n\t" - "cmp.c\t%5, %0\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %6\t\t\t# csum\n\t" - "cmp.c\t%6, %0\n\t" - "lw\t%1, [%2, 0]\t\t\t# four words source address\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %1\n\t" - "cmp.c\t%1, %0\n\t" - "1:lw\t%1, [%2, 4]\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %1\n\t" - "cmp.c\t%1, %0\n\t" - "lw\t%1, [%2,8]\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %1\n\t" - "cmp.c\t%1, %0\n\t" - "lw\t%1, [%2, 12]\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0,%1\n\t" - "cmp.c\t%1, %0\n\t" - "lw\t%1, [%3, 0]\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %1\n\t" - "cmp.c\t%1, %0\n\t" - "lw\t%1, [%3, 4]\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %1\n\t" - "cmp.c\t%1, %0\n\t" - "lw\t%1, [%3, 8]\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %1\n\t" - "cmp.c\t%1, %0\n\t" - "lw\t%1, [%3, 12]\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:add\t%0, %0, %1\n\t" - "cmp.c\t%1, %0\n\t" - "bleu 1f\n\t" - "addi\t%0, 0x1\n\t" - "1:\n\t" - ".set\toptimize" - : "=r" (sum), "=r" (proto) - : "r" (saddr), "r" (daddr), - "0" (htonl(len)), "1" (htonl(proto)), "r" (sum)); - - return csum_fold(sum); -} -#endif /* _ASM_SCORE_CHECKSUM_H */ diff --git a/arch/score/include/asm/cmpxchg.h b/arch/score/include/asm/cmpxchg.h deleted file mode 100644 index e503073c8978..000000000000 --- a/arch/score/include/asm/cmpxchg.h +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_CMPXCHG_H -#define _ASM_SCORE_CMPXCHG_H - -#include <linux/irqflags.h> - -struct __xchg_dummy { unsigned long a[100]; }; -#define __xg(x) ((struct __xchg_dummy *)(x)) - -static inline -unsigned long __xchg(volatile unsigned long *m, unsigned long val) -{ - unsigned long retval; - unsigned long flags; - - local_irq_save(flags); - retval = *m; - *m = val; - local_irq_restore(flags); - return retval; -} - -#define xchg(ptr, v) \ - ((__typeof__(*(ptr))) __xchg((unsigned long *)(ptr), \ - (unsigned long)(v))) - -static inline unsigned long __cmpxchg(volatile unsigned long *m, - unsigned long old, unsigned long new) -{ - unsigned long retval; - unsigned long flags; - - local_irq_save(flags); - retval = *m; - if (retval == old) - *m = new; - local_irq_restore(flags); - return retval; -} - -#define cmpxchg(ptr, o, n) \ - ((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \ - (unsigned long)(o), \ - (unsigned long)(n))) - -#include <asm-generic/cmpxchg-local.h> - -#endif /* _ASM_SCORE_CMPXCHG_H */ diff --git a/arch/score/include/asm/delay.h b/arch/score/include/asm/delay.h deleted file mode 100644 index a4bd2c748ab4..000000000000 --- a/arch/score/include/asm/delay.h +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_DELAY_H -#define _ASM_SCORE_DELAY_H - -#include <asm-generic/param.h> - -static inline void __delay(unsigned long loops) -{ - /* 3 cycles per loop. */ - __asm__ __volatile__ ( - "1:\tsubi\t%0, 3\n\t" - "cmpz.c\t%0\n\t" - "ble\t1b\n\t" - : "=r" (loops) - : "0" (loops)); -} - -static inline void __udelay(unsigned long usecs) -{ - unsigned long loops_per_usec; - - loops_per_usec = (loops_per_jiffy * HZ) / 1000000; - - __delay(usecs * loops_per_usec); -} - -#define udelay(usecs) __udelay(usecs) - -#endif /* _ASM_SCORE_DELAY_H */ diff --git a/arch/score/include/asm/device.h b/arch/score/include/asm/device.h deleted file mode 100644 index 818ad4d01197..000000000000 --- a/arch/score/include/asm/device.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_DEVICE_H -#define _ASM_SCORE_DEVICE_H - -#include <asm-generic/device.h> - -#endif /* _ASM_SCORE_DEVICE_H */ diff --git a/arch/score/include/asm/div64.h b/arch/score/include/asm/div64.h deleted file mode 100644 index cf73dc218bec..000000000000 --- a/arch/score/include/asm/div64.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_DIV64_H -#define _ASM_SCORE_DIV64_H - -#include <asm-generic/div64.h> - -#endif /* _ASM_SCORE_DIV64_H */ diff --git a/arch/score/include/asm/dma.h b/arch/score/include/asm/dma.h deleted file mode 100644 index fd44a9cbee4f..000000000000 --- a/arch/score/include/asm/dma.h +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_DMA_H -#define _ASM_SCORE_DMA_H - -#include <asm/io.h> - -#define MAX_DMA_ADDRESS (0) - -#endif /* _ASM_SCORE_DMA_H */ diff --git a/arch/score/include/asm/elf.h b/arch/score/include/asm/elf.h deleted file mode 100644 index c970ac160f3c..000000000000 --- a/arch/score/include/asm/elf.h +++ /dev/null @@ -1,98 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_ELF_H -#define _ASM_SCORE_ELF_H - -#include <linux/ptrace.h> - -#define EM_SCORE7 135 - -/* Relocation types. */ -#define R_SCORE_NONE 0 -#define R_SCORE_HI16 1 -#define R_SCORE_LO16 2 -#define R_SCORE_BCMP 3 -#define R_SCORE_24 4 -#define R_SCORE_PC19 5 -#define R_SCORE16_11 6 -#define R_SCORE16_PC8 7 -#define R_SCORE_ABS32 8 -#define R_SCORE_ABS16 9 -#define R_SCORE_DUMMY2 10 -#define R_SCORE_GP15 11 -#define R_SCORE_GNU_VTINHERIT 12 -#define R_SCORE_GNU_VTENTRY 13 -#define R_SCORE_GOT15 14 -#define R_SCORE_GOT_LO16 15 -#define R_SCORE_CALL15 16 -#define R_SCORE_GPREL32 17 -#define R_SCORE_REL32 18 -#define R_SCORE_DUMMY_HI16 19 -#define R_SCORE_IMM30 20 -#define R_SCORE_IMM32 21 - -/* ELF register definitions */ -typedef unsigned long elf_greg_t; - -#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) -typedef elf_greg_t elf_gregset_t[ELF_NGREG]; - -/* Score does not have fp regs. */ -typedef double elf_fpreg_t; -typedef elf_fpreg_t elf_fpregset_t; - -#define elf_check_arch(x) ((x)->e_machine == EM_SCORE7) - -/* - * These are used to set parameters in the core dumps. - */ -#define ELF_CLASS ELFCLASS32 - -/* - * These are used to set parameters in the core dumps. - */ -#define ELF_DATA ELFDATA2LSB -#define ELF_ARCH EM_SCORE7 - -struct task_struct; -struct pt_regs; - -#define CORE_DUMP_USE_REGSET -#define ELF_EXEC_PAGESIZE PAGE_SIZE - -/* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. This could be done in userspace, - but it's not easy, and we've already done it here. */ - -#define ELF_HWCAP (0) - -/* This yields a string that ld.so will use to load implementation - specific libraries for optimization. This is more specific in - intent than poking at uname or /proc/cpuinfo. - - For the moment, we have only optimizations for the Intel generations, - but that could change... */ - -#define ELF_PLATFORM (NULL) - -#define ELF_PLAT_INIT(_r, load_addr) \ -do { \ - _r->regs[1] = _r->regs[2] = _r->regs[3] = _r->regs[4] = 0; \ - _r->regs[5] = _r->regs[6] = _r->regs[7] = _r->regs[8] = 0; \ - _r->regs[9] = _r->regs[10] = _r->regs[11] = _r->regs[12] = 0; \ - _r->regs[13] = _r->regs[14] = _r->regs[15] = _r->regs[16] = 0; \ - _r->regs[17] = _r->regs[18] = _r->regs[19] = _r->regs[20] = 0; \ - _r->regs[21] = _r->regs[22] = _r->regs[23] = _r->regs[24] = 0; \ - _r->regs[25] = _r->regs[26] = _r->regs[27] = _r->regs[28] = 0; \ - _r->regs[30] = _r->regs[31] = 0; \ -} while (0) - -/* This is the location that an ET_DYN program is loaded if exec'ed. Typical - use of this is to invoke "./ld.so someprog" to test out a new version of - the loader. We need to make sure that it is out of the way of the program - that it will "exec", and that there is sufficient room for the brk. */ - -#ifndef ELF_ET_DYN_BASE -#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) -#endif - -#endif /* _ASM_SCORE_ELF_H */ diff --git a/arch/score/include/asm/emergency-restart.h b/arch/score/include/asm/emergency-restart.h deleted file mode 100644 index b0612c677764..000000000000 --- a/arch/score/include/asm/emergency-restart.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_EMERGENCY_RESTART_H -#define _ASM_SCORE_EMERGENCY_RESTART_H - -#include <asm-generic/emergency-restart.h> - -#endif /* _ASM_SCORE_EMERGENCY_RESTART_H */ diff --git a/arch/score/include/asm/exec.h b/arch/score/include/asm/exec.h deleted file mode 100644 index a1f95e1d8a31..000000000000 --- a/arch/score/include/asm/exec.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_EXEC_H -#define _ASM_SCORE_EXEC_H - -extern unsigned long arch_align_stack(unsigned long sp); - -#endif /* _ASM_SCORE_EXEC_H */ diff --git a/arch/score/include/asm/fixmap.h b/arch/score/include/asm/fixmap.h deleted file mode 100644 index 68ca314830c9..000000000000 --- a/arch/score/include/asm/fixmap.h +++ /dev/null @@ -1,83 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_FIXMAP_H -#define _ASM_SCORE_FIXMAP_H - -#include <asm/page.h> - -#define PHY_RAM_BASE 0x00000000 -#define PHY_IO_BASE 0x10000000 - -#define VIRTUAL_RAM_BASE 0xa0000000 -#define VIRTUAL_IO_BASE 0xb0000000 - -#define RAM_SPACE_SIZE 0x10000000 -#define IO_SPACE_SIZE 0x10000000 - -/* Kernel unmapped, cached 512MB */ -#define KSEG1 0xa0000000 - -/* - * Here we define all the compile-time 'special' virtual - * addresses. The point is to have a constant address at - * compile time, but to set the physical address only - * in the boot process. We allocate these special addresses - * from the end of virtual memory (0xfffff000) backwards. - * Also this lets us do fail-safe vmalloc(), we - * can guarantee that these special addresses and - * vmalloc()-ed addresses never overlap. - * - * these 'compile-time allocated' memory buffers are - * fixed-size 4k pages. (or larger if used with an increment - * highger than 1) use fixmap_set(idx,phys) to associate - * physical memory with fixmap indices. - * - * TLB entries of such buffers will not be flushed across - * task switches. - */ - -/* - * on UP currently we will have no trace of the fixmap mechanizm, - * no page table allocations, etc. This might change in the - * future, say framebuffers for the console driver(s) could be - * fix-mapped? - */ -enum fixed_addresses { -#define FIX_N_COLOURS 8 - FIX_CMAP_BEGIN, - FIX_CMAP_END = FIX_CMAP_BEGIN + FIX_N_COLOURS, - __end_of_fixed_addresses -}; - -/* - * used by vmalloc.c. - * - * Leave one empty page between vmalloc'ed areas and - * the start of the fixmap, and leave one page empty - * at the top of mem.. - */ -#define FIXADDR_TOP ((unsigned long)(long)(int)0xfefe0000) -#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) -#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) - -#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) -#define __virt_to_fix(x) \ - ((FIXADDR_TOP - ((x) & PAGE_MASK)) >> PAGE_SHIFT) - -extern void __this_fixmap_does_not_exist(void); - -/* - * 'index to address' translation. If anyone tries to use the idx - * directly without tranlation, we catch the bug with a NULL-deference - * kernel oops. Illegal ranges of incoming indices are caught too. - */ -static inline unsigned long fix_to_virt(const unsigned int idx) -{ - return __fix_to_virt(idx); -} - -static inline unsigned long virt_to_fix(const unsigned long vaddr) -{ - return __virt_to_fix(vaddr); -} - -#endif /* _ASM_SCORE_FIXMAP_H */ diff --git a/arch/score/include/asm/ftrace.h b/arch/score/include/asm/ftrace.h deleted file mode 100644 index 79d6f10e1f5b..000000000000 --- a/arch/score/include/asm/ftrace.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ASM_SCORE_FTRACE_H -#define _ASM_SCORE_FTRACE_H - -#endif /* _ASM_SCORE_FTRACE_H */ diff --git a/arch/score/include/asm/futex.h b/arch/score/include/asm/futex.h deleted file mode 100644 index ec247fb364c9..000000000000 --- a/arch/score/include/asm/futex.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_FUTEX_H -#define _ASM_SCORE_FUTEX_H - -#include <asm-generic/futex.h> - -#endif /* _ASM_SCORE_FUTEX_H */ diff --git a/arch/score/include/asm/hardirq.h b/arch/score/include/asm/hardirq.h deleted file mode 100644 index d8dd8909cb18..000000000000 --- a/arch/score/include/asm/hardirq.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_HARDIRQ_H -#define _ASM_SCORE_HARDIRQ_H - -#include <asm-generic/hardirq.h> - -#endif /* _ASM_SCORE_HARDIRQ_H */ diff --git a/arch/score/include/asm/hw_irq.h b/arch/score/include/asm/hw_irq.h deleted file mode 100644 index 4caafb2b509a..000000000000 --- a/arch/score/include/asm/hw_irq.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ASM_SCORE_HW_IRQ_H -#define _ASM_SCORE_HW_IRQ_H - -#endif /* _ASM_SCORE_HW_IRQ_H */ diff --git a/arch/score/include/asm/io.h b/arch/score/include/asm/io.h deleted file mode 100644 index 37ce8723b06b..000000000000 --- a/arch/score/include/asm/io.h +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_IO_H -#define _ASM_SCORE_IO_H - -#include <asm-generic/io.h> - -#define virt_to_bus virt_to_phys -#define bus_to_virt phys_to_virt -#endif /* _ASM_SCORE_IO_H */ diff --git a/arch/score/include/asm/irq.h b/arch/score/include/asm/irq.h deleted file mode 100644 index c1434c889de2..000000000000 --- a/arch/score/include/asm/irq.h +++ /dev/null @@ -1,26 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_IRQ_H -#define _ASM_SCORE_IRQ_H - -#define EXCEPTION_VECTOR_BASE_ADDR 0xa0000000 -#define VECTOR_ADDRESS_OFFSET_MODE4 0 -#define VECTOR_ADDRESS_OFFSET_MODE16 1 - -#define DEBUG_VECTOR_SIZE (0x4) -#define DEBUG_VECTOR_BASE_ADDR ((EXCEPTION_VECTOR_BASE_ADDR) + 0x1fc) - -#define GENERAL_VECTOR_SIZE (0x10) -#define GENERAL_VECTOR_BASE_ADDR ((EXCEPTION_VECTOR_BASE_ADDR) + 0x200) - -#define NR_IRQS 64 -#define IRQ_VECTOR_SIZE (0x10) -#define IRQ_VECTOR_BASE_ADDR ((EXCEPTION_VECTOR_BASE_ADDR) + 0x210) -#define IRQ_VECTOR_END_ADDR ((EXCEPTION_VECTOR_BASE_ADDR) + 0x5f0) - -#define irq_canonicalize(irq) (irq) - -#define IRQ_TIMER (7) /* Timer IRQ number of SPCT6600 */ - -extern void interrupt_exception_vector(void); - -#endif /* _ASM_SCORE_IRQ_H */ diff --git a/arch/score/include/asm/irq_regs.h b/arch/score/include/asm/irq_regs.h deleted file mode 100644 index 740b2315d848..000000000000 --- a/arch/score/include/asm/irq_regs.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_IRQ_REGS_H -#define _ASM_SCORE_IRQ_REGS_H - -#include <linux/thread_info.h> - -static inline struct pt_regs *get_irq_regs(void) -{ - return current_thread_info()->regs; -} - -#endif /* _ASM_SCORE_IRQ_REGS_H */ diff --git a/arch/score/include/asm/irqflags.h b/arch/score/include/asm/irqflags.h deleted file mode 100644 index 354c1979ea8d..000000000000 --- a/arch/score/include/asm/irqflags.h +++ /dev/null @@ -1,121 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_IRQFLAGS_H -#define _ASM_SCORE_IRQFLAGS_H - -#ifndef __ASSEMBLY__ - -#include <linux/types.h> - -static inline unsigned long arch_local_save_flags(void) -{ - unsigned long flags; - - asm volatile( - " mfcr r8, cr0 \n" - " nop \n" - " nop \n" - " mv %0, r8 \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - " ldi r9, 0x1 \n" - " and %0, %0, r9 \n" - : "=r" (flags) - : - : "r8", "r9"); - return flags; -} - -static inline unsigned long arch_local_irq_save(void) -{ - unsigned long flags; - - asm volatile( - " mfcr r8, cr0 \n" - " li r9, 0xfffffffe \n" - " nop \n" - " mv %0, r8 \n" - " and r8, r8, r9 \n" - " mtcr r8, cr0 \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - : "=r" (flags) - : - : "r8", "r9", "memory"); - - return flags; -} - -static inline void arch_local_irq_restore(unsigned long flags) -{ - asm volatile( - " mfcr r8, cr0 \n" - " ldi r9, 0x1 \n" - " and %0, %0, r9 \n" - " or r8, r8, %0 \n" - " mtcr r8, cr0 \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - : - : "r"(flags) - : "r8", "r9", "memory"); -} - -static inline void arch_local_irq_enable(void) -{ - asm volatile( - " mfcr r8,cr0 \n" - " nop \n" - " nop \n" - " ori r8,0x1 \n" - " mtcr r8,cr0 \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - : - : - : "r8", "memory"); -} - -static inline void arch_local_irq_disable(void) -{ - asm volatile( - " mfcr r8,cr0 \n" - " nop \n" - " nop \n" - " srli r8,r8,1 \n" - " slli r8,r8,1 \n" - " mtcr r8,cr0 \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - " nop \n" - : - : - : "r8", "memory"); -} - -static inline bool arch_irqs_disabled_flags(unsigned long flags) -{ - return !(flags & 1); -} - -static inline bool arch_irqs_disabled(void) -{ - return arch_irqs_disabled_flags(arch_local_save_flags()); -} - -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_SCORE_IRQFLAGS_H */ diff --git a/arch/score/include/asm/kdebug.h b/arch/score/include/asm/kdebug.h deleted file mode 100644 index 481ba1fb5372..000000000000 --- a/arch/score/include/asm/kdebug.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_KDEBUG_H -#define _ASM_SCORE_KDEBUG_H - -#include <asm-generic/kdebug.h> - -#endif /* _ASM_SCORE_KDEBUG_H */ diff --git a/arch/score/include/asm/kmap_types.h b/arch/score/include/asm/kmap_types.h deleted file mode 100644 index 14261872c9c7..000000000000 --- a/arch/score/include/asm/kmap_types.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_KMAP_TYPES_H -#define _ASM_SCORE_KMAP_TYPES_H - -#include <asm-generic/kmap_types.h> - -#endif /* _ASM_SCORE_KMAP_TYPES_H */ diff --git a/arch/score/include/asm/linkage.h b/arch/score/include/asm/linkage.h deleted file mode 100644 index 0c11c009969a..000000000000 --- a/arch/score/include/asm/linkage.h +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_LINKAGE_H -#define _ASM_SCORE_LINKAGE_H - -#define __ALIGN .align 2 -#define __ALIGN_STR ".align 2" - -#endif /* _ASM_SCORE_LINKAGE_H */ diff --git a/arch/score/include/asm/local.h b/arch/score/include/asm/local.h deleted file mode 100644 index 00bdebdf75f2..000000000000 --- a/arch/score/include/asm/local.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_LOCAL_H -#define _ASM_SCORE_LOCAL_H - -#include <asm-generic/local.h> - -#endif /* _ASM_SCORE_LOCAL_H */ diff --git a/arch/score/include/asm/local64.h b/arch/score/include/asm/local64.h deleted file mode 100644 index 36c93b5cc239..000000000000 --- a/arch/score/include/asm/local64.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/local64.h> diff --git a/arch/score/include/asm/mmu.h b/arch/score/include/asm/mmu.h deleted file mode 100644 index d913369adda3..000000000000 --- a/arch/score/include/asm/mmu.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_MMU_H -#define _ASM_SCORE_MMU_H - -typedef unsigned long mm_context_t; - -#endif /* _ASM_SCORE_MMU_H */ diff --git a/arch/score/include/asm/mmu_context.h b/arch/score/include/asm/mmu_context.h deleted file mode 100644 index d0aa2a5aebca..000000000000 --- a/arch/score/include/asm/mmu_context.h +++ /dev/null @@ -1,116 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_MMU_CONTEXT_H -#define _ASM_SCORE_MMU_CONTEXT_H - -#include <linux/errno.h> -#include <linux/sched.h> -#include <linux/mm_types.h> -#include <linux/slab.h> - -#include <asm-generic/mm_hooks.h> - -#include <asm/cacheflush.h> -#include <asm/tlbflush.h> -#include <asm/scoreregs.h> - -/* - * For the fast tlb miss handlers, we keep a per cpu array of pointers - * to the current pgd for each processor. Also, the proc. id is stuffed - * into the context register. - */ -extern unsigned long asid_cache; -extern unsigned long pgd_current; - -#define TLBMISS_HANDLER_SETUP_PGD(pgd) (pgd_current = (unsigned long)(pgd)) - -#define TLBMISS_HANDLER_SETUP() \ -do { \ - write_c0_context(0); \ - TLBMISS_HANDLER_SETUP_PGD(swapper_pg_dir) \ -} while (0) - -/* - * All unused by hardware upper bits will be considered - * as a software asid extension. - */ -#define ASID_VERSION_MASK 0xfffff000 -#define ASID_FIRST_VERSION 0x1000 - -/* PEVN --------- VPN ---------- --ASID--- -NA- */ -/* binary: 0000 0000 0000 0000 0000 0000 0001 0000 */ -/* binary: 0000 0000 0000 0000 0000 1111 1111 0000 */ -#define ASID_INC 0x10 -#define ASID_MASK 0xff0 - -static inline void enter_lazy_tlb(struct mm_struct *mm, - struct task_struct *tsk) -{} - -static inline void -get_new_mmu_context(struct mm_struct *mm) -{ - unsigned long asid = asid_cache + ASID_INC; - - if (!(asid & ASID_MASK)) { - local_flush_tlb_all(); /* start new asid cycle */ - if (!asid) /* fix version if needed */ - asid = ASID_FIRST_VERSION; - } - - mm->context = asid; - asid_cache = asid; -} - -/* - * Initialize the context related info for a new mm_struct - * instance. - */ -static inline int -init_new_context(struct task_struct *tsk, struct mm_struct *mm) -{ - mm->context = 0; - return 0; -} - -static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, - struct task_struct *tsk) -{ - unsigned long flags; - - local_irq_save(flags); - if ((next->context ^ asid_cache) & ASID_VERSION_MASK) - get_new_mmu_context(next); - - pevn_set(next->context); - TLBMISS_HANDLER_SETUP_PGD(next->pgd); - local_irq_restore(flags); -} - -/* - * Destroy context related info for an mm_struct that is about - * to be put to rest. - */ -static inline void destroy_context(struct mm_struct *mm) -{} - -static inline void -deactivate_mm(struct task_struct *task, struct mm_struct *mm) -{} - -/* - * After we have set current->mm to a new value, this activates - * the context for the new mm so we see the new mappings. - */ -static inline void -activate_mm(struct mm_struct *prev, struct mm_struct *next) -{ - unsigned long flags; - - local_irq_save(flags); - get_new_mmu_context(next); - pevn_set(next->context); - TLBMISS_HANDLER_SETUP_PGD(next->pgd); - local_irq_restore(flags); -} - -#endif /* _ASM_SCORE_MMU_CONTEXT_H */ diff --git a/arch/score/include/asm/module.h b/arch/score/include/asm/module.h deleted file mode 100644 index 33777ed32e9e..000000000000 --- a/arch/score/include/asm/module.h +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_MODULE_H -#define _ASM_SCORE_MODULE_H - -#include <linux/list.h> -#include <asm/extable.h> -#include <asm-generic/module.h> - -struct mod_arch_specific { - /* Data Bus Error exception tables */ - struct list_head dbe_list; - const struct exception_table_entry *dbe_start; - const struct exception_table_entry *dbe_end; -}; - -typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ - -/* Given an address, look for it in the exception tables. */ -#ifdef CONFIG_MODULES -const struct exception_table_entry *search_module_dbetables(unsigned long addr); -#else -static inline const struct exception_table_entry -*search_module_dbetables(unsigned long addr) -{ - return NULL; -} -#endif - -#define MODULE_PROC_FAMILY "SCORE7" -#define MODULE_KERNEL_TYPE "32BIT " -#define MODULE_KERNEL_SMTC "" - -#define MODULE_ARCH_VERMAGIC \ - MODULE_PROC_FAMILY MODULE_KERNEL_TYPE MODULE_KERNEL_SMTC - -#endif /* _ASM_SCORE_MODULE_H */ diff --git a/arch/score/include/asm/page.h b/arch/score/include/asm/page.h deleted file mode 100644 index 17d9c68b6bd5..000000000000 --- a/arch/score/include/asm/page.h +++ /dev/null @@ -1,94 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_PAGE_H -#define _ASM_SCORE_PAGE_H - -#include <linux/pfn.h> -#include <linux/const.h> - -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT (12) -#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) - -#ifdef __KERNEL__ - -#ifndef __ASSEMBLY__ - -#define PAGE_UP(addr) (((addr)+((PAGE_SIZE)-1))&(~((PAGE_SIZE)-1))) -#define PAGE_DOWN(addr) ((addr)&(~((PAGE_SIZE)-1))) - -/* align addr on a size boundary - adjust address up/down if needed */ -#define _ALIGN_UP(addr, size) (((addr)+((size)-1))&(~((size)-1))) -#define _ALIGN_DOWN(addr, size) ((addr)&(~((size)-1))) - -/* align addr on a size boundary - adjust address up if needed */ -#define _ALIGN(addr, size) _ALIGN_UP(addr, size) - -/* - * PAGE_OFFSET -- the first address of the first page of memory. When not - * using MMU this corresponds to the first free page in physical memory (aligned - * on a page boundary). - */ -#define PAGE_OFFSET (0xA0000000UL) - -#define clear_page(pgaddr) memset((pgaddr), 0, PAGE_SIZE) -#define copy_page(to, from) memcpy((to), (from), PAGE_SIZE) - -#define clear_user_page(pgaddr, vaddr, page) memset((pgaddr), 0, PAGE_SIZE) -#define copy_user_page(vto, vfrom, vaddr, topg) \ - memcpy((vto), (vfrom), PAGE_SIZE) - -/* - * These are used to make use of C type-checking.. - */ - -typedef struct { unsigned long pte; } pte_t; /* page table entry */ -typedef struct { unsigned long pgd; } pgd_t; /* PGD table entry */ -typedef struct { unsigned long pgprot; } pgprot_t; -typedef struct page *pgtable_t; - -#define pte_val(x) ((x).pte) -#define pgd_val(x) ((x).pgd) -#define pgprot_val(x) ((x).pgprot) - -#define __pte(x) ((pte_t) { (x) }) -#define __pgd(x) ((pgd_t) { (x) }) -#define __pgprot(x) ((pgprot_t) { (x) }) - -extern unsigned long max_low_pfn; -extern unsigned long min_low_pfn; -extern unsigned long max_pfn; - -#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET) -#define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) - -#define phys_to_pfn(phys) (PFN_DOWN(phys)) -#define pfn_to_phys(pfn) (PFN_PHYS(pfn)) - -#define virt_to_pfn(vaddr) (phys_to_pfn((__pa(vaddr)))) -#define pfn_to_virt(pfn) __va(pfn_to_phys((pfn))) - -#define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr))) -#define page_to_virt(page) (pfn_to_virt(page_to_pfn(page))) - -#define page_to_phys(page) (pfn_to_phys(page_to_pfn(page))) -#define page_to_bus(page) (page_to_phys(page)) -#define phys_to_page(paddr) (pfn_to_page(phys_to_pfn(paddr))) - -#define pfn_valid(pfn) (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn)) - -#define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) - -#endif /* __ASSEMBLY__ */ - -#define virt_addr_valid(vaddr) (pfn_valid(virt_to_pfn(vaddr))) - -#endif /* __KERNEL__ */ - -#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ - VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) - -#include <asm-generic/memory_model.h> -#include <asm-generic/getorder.h> - -#endif /* _ASM_SCORE_PAGE_H */ diff --git a/arch/score/include/asm/pci.h b/arch/score/include/asm/pci.h deleted file mode 100644 index 3f3cfd82549c..000000000000 --- a/arch/score/include/asm/pci.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ASM_SCORE_PCI_H -#define _ASM_SCORE_PCI_H - -#endif /* _ASM_SCORE_PCI_H */ diff --git a/arch/score/include/asm/percpu.h b/arch/score/include/asm/percpu.h deleted file mode 100644 index 5a6a2f7e5d62..000000000000 --- a/arch/score/include/asm/percpu.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_PERCPU_H -#define _ASM_SCORE_PERCPU_H - -#include <asm-generic/percpu.h> - -#endif /* _ASM_SCORE_PERCPU_H */ diff --git a/arch/score/include/asm/pgalloc.h b/arch/score/include/asm/pgalloc.h deleted file mode 100644 index 7dfc5c163093..000000000000 --- a/arch/score/include/asm/pgalloc.h +++ /dev/null @@ -1,86 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_PGALLOC_H -#define _ASM_SCORE_PGALLOC_H - -#include <linux/mm.h> -#include <linux/highmem.h> -static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, - pte_t *pte) -{ - set_pmd(pmd, __pmd((unsigned long)pte)); -} - -static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, - pgtable_t pte) -{ - set_pmd(pmd, __pmd((unsigned long)page_address(pte))); -} - -#define pmd_pgtable(pmd) pmd_page(pmd) - -static inline pgd_t *pgd_alloc(struct mm_struct *mm) -{ - pgd_t *ret, *init; - - ret = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER); - if (ret) { - init = pgd_offset(&init_mm, 0UL); - pgd_init((unsigned long)ret); - memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, - (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); - } - - return ret; -} - -static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) -{ - free_pages((unsigned long)pgd, PGD_ORDER); -} - -static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, - unsigned long address) -{ - pte_t *pte; - - pte = (pte_t *) __get_free_pages(GFP_KERNEL|__GFP_ZERO, PTE_ORDER); - - return pte; -} - -static inline struct page *pte_alloc_one(struct mm_struct *mm, - unsigned long address) -{ - struct page *pte; - - pte = alloc_pages(GFP_KERNEL, PTE_ORDER); - if (!pte) - return NULL; - clear_highpage(pte); - if (!pgtable_page_ctor(pte)) { - __free_page(pte); - return NULL; - } - return pte; -} - -static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) -{ - free_pages((unsigned long)pte, PTE_ORDER); -} - -static inline void pte_free(struct mm_struct *mm, pgtable_t pte) -{ - pgtable_page_dtor(pte); - __free_pages(pte, PTE_ORDER); -} - -#define __pte_free_tlb(tlb, pte, buf) \ -do { \ - pgtable_page_dtor(pte); \ - tlb_remove_page((tlb), pte); \ -} while (0) - -#define check_pgt_cache() do {} while (0) - -#endif /* _ASM_SCORE_PGALLOC_H */ diff --git a/arch/score/include/asm/pgtable-bits.h b/arch/score/include/asm/pgtable-bits.h deleted file mode 100644 index fb8f306f4d11..000000000000 --- a/arch/score/include/asm/pgtable-bits.h +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_PGTABLE_BITS_H -#define _ASM_SCORE_PGTABLE_BITS_H - -#define _PAGE_ACCESSED (1<<5) /* implemented in software */ -#define _PAGE_READ (1<<6) /* implemented in software */ -#define _PAGE_WRITE (1<<7) /* implemented in software */ -#define _PAGE_PRESENT (1<<9) /* implemented in software */ -#define _PAGE_MODIFIED (1<<10) /* implemented in software */ - -#define _PAGE_GLOBAL (1<<0) -#define _PAGE_VALID (1<<1) -#define _PAGE_SILENT_READ (1<<1) /* synonym */ -#define _PAGE_DIRTY (1<<2) /* Write bit */ -#define _PAGE_SILENT_WRITE (1<<2) -#define _PAGE_CACHE (1<<3) /* cache */ -#define _CACHE_MASK (1<<3) -#define _PAGE_BUFFERABLE (1<<4) /*Fallow Spec. */ - -#define __READABLE (_PAGE_READ | _PAGE_SILENT_READ | _PAGE_ACCESSED) -#define __WRITEABLE (_PAGE_WRITE | _PAGE_SILENT_WRITE | _PAGE_MODIFIED) -#define _PAGE_CHG_MASK \ - (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED | _PAGE_CACHE) - -#endif /* _ASM_SCORE_PGTABLE_BITS_H */ diff --git a/arch/score/include/asm/pgtable.h b/arch/score/include/asm/pgtable.h deleted file mode 100644 index c14226be0559..000000000000 --- a/arch/score/include/asm/pgtable.h +++ /dev/null @@ -1,270 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_PGTABLE_H -#define _ASM_SCORE_PGTABLE_H - -#include <linux/const.h> -#define __ARCH_USE_5LEVEL_HACK -#include <asm-generic/pgtable-nopmd.h> - -#include <asm/fixmap.h> -#include <asm/setup.h> -#include <asm/pgtable-bits.h> - -extern void load_pgd(unsigned long pg_dir); -extern pte_t invalid_pte_table[PAGE_SIZE/sizeof(pte_t)]; - -/* PGDIR_SHIFT determines what a third-level page table entry can map */ -#define PGDIR_SHIFT 22 -#define PGDIR_SIZE (_AC(1, UL) << PGDIR_SHIFT) -#define PGDIR_MASK (~(PGDIR_SIZE - 1)) - -/* - * Entries per page directory level: we use two-level, so - * we don't really have any PUD/PMD directory physically. - */ -#define PGD_ORDER 0 -#define PTE_ORDER 0 - -#define PTRS_PER_PGD 1024 -#define PTRS_PER_PTE 1024 - -#define USER_PTRS_PER_PGD (0x80000000UL/PGDIR_SIZE) -#define FIRST_USER_ADDRESS 0UL - -#define VMALLOC_START (0xc0000000UL) - -#define PKMAP_BASE (0xfd000000UL) - -#define VMALLOC_END (FIXADDR_START - 2*PAGE_SIZE) - -#define pte_ERROR(e) \ - printk(KERN_ERR "%s:%d: bad pte %08lx.\n", \ - __FILE__, __LINE__, pte_val(e)) -#define pgd_ERROR(e) \ - printk(KERN_ERR "%s:%d: bad pgd %08lx.\n", \ - __FILE__, __LINE__, pgd_val(e)) - -/* - * Empty pgd/pmd entries point to the invalid_pte_table. - */ -static inline int pmd_none(pmd_t pmd) -{ - return pmd_val(pmd) == (unsigned long) invalid_pte_table; -} - -#define pmd_bad(pmd) (pmd_val(pmd) & ~PAGE_MASK) - -static inline int pmd_present(pmd_t pmd) -{ - return pmd_val(pmd) != (unsigned long) invalid_pte_table; -} - -static inline void pmd_clear(pmd_t *pmdp) -{ - pmd_val(*pmdp) = ((unsigned long) invalid_pte_table); -} - -#define pte_page(x) pfn_to_page(pte_pfn(x)) -#define pte_pfn(x) ((unsigned long)((x).pte >> PAGE_SHIFT)) -#define pfn_pte(pfn, prot) \ - __pte(((unsigned long long)(pfn) << PAGE_SHIFT) | pgprot_val(prot)) - -#define __pgd_offset(address) pgd_index(address) -#define __pud_offset(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) -#define __pmd_offset(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) - -/* to find an entry in a kernel page-table-directory */ -#define pgd_offset_k(address) pgd_offset(&init_mm, address) -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) - -/* to find an entry in a page-table-directory */ -#define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr)) - -/* Find an entry in the third-level page table.. */ -#define __pte_offset(address) \ - (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) -#define pte_offset(dir, address) \ - ((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address)) -#define pte_offset_kernel(dir, address) \ - ((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address)) - -#define pte_offset_map(dir, address) \ - ((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address)) -#define pte_unmap(pte) ((void)(pte)) - -#define __pte_to_swp_entry(pte) \ - ((swp_entry_t) { pte_val(pte)}) -#define __swp_entry_to_pte(x) ((pte_t) {(x).val}) - -#define pmd_phys(pmd) __pa((void *)pmd_val(pmd)) -#define pmd_page(pmd) (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT)) -#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot) -static inline pte_t pte_mkspecial(pte_t pte) { return pte; } - -#define set_pte(pteptr, pteval) (*(pteptr) = pteval) -#define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval) -#define pte_clear(mm, addr, xp) \ - do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) - -/* - * The "pgd_xxx()" functions here are trivial for a folded two-level - * setup: the pgd is never bad, and a pmd always exists (as it's folded - * into the pgd entry) - */ -#define pgd_present(pgd) (1) -#define pgd_none(pgd) (0) -#define pgd_bad(pgd) (0) -#define pgd_clear(pgdp) do { } while (0) - -#define kern_addr_valid(addr) (1) -#define pmd_page_vaddr(pmd) pmd_val(pmd) - -#define pte_none(pte) (!(pte_val(pte) & ~_PAGE_GLOBAL)) -#define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT) - -#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_CACHE) -#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \ - _PAGE_CACHE) -#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_CACHE) -#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_CACHE) -#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \ - _PAGE_GLOBAL | _PAGE_CACHE) -#define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | \ - __WRITEABLE | _PAGE_GLOBAL & ~_PAGE_CACHE) - -#define __P000 PAGE_NONE -#define __P001 PAGE_READONLY -#define __P010 PAGE_COPY -#define __P011 PAGE_COPY -#define __P100 PAGE_READONLY -#define __P101 PAGE_READONLY -#define __P110 PAGE_COPY -#define __P111 PAGE_COPY - -#define __S000 PAGE_NONE -#define __S001 PAGE_READONLY -#define __S010 PAGE_SHARED -#define __S011 PAGE_SHARED -#define __S100 PAGE_READONLY -#define __S101 PAGE_READONLY -#define __S110 PAGE_SHARED -#define __S111 PAGE_SHARED - -#define pgprot_noncached pgprot_noncached - -static inline pgprot_t pgprot_noncached(pgprot_t _prot) -{ - unsigned long prot = pgprot_val(_prot); - - prot = (prot & ~_CACHE_MASK); - - return __pgprot(prot); -} - -#define __swp_type(x) ((x).val & 0x1f) -#define __swp_offset(x) ((x).val >> 10) -#define __swp_entry(type, offset) ((swp_entry_t){(type) | ((offset) << 10)}) - -extern unsigned long empty_zero_page; -extern unsigned long zero_page_mask; - -#define ZERO_PAGE(vaddr) \ - (virt_to_page((void *)(empty_zero_page + \ - (((unsigned long)(vaddr)) & zero_page_mask)))) - -#define pgtable_cache_init() do {} while (0) - -#define arch_enter_lazy_cpu_mode() do {} while (0) - -static inline int pte_write(pte_t pte) -{ - return pte_val(pte) & _PAGE_WRITE; -} - -static inline int pte_dirty(pte_t pte) -{ - return pte_val(pte) & _PAGE_MODIFIED; -} - -static inline int pte_young(pte_t pte) -{ - return pte_val(pte) & _PAGE_ACCESSED; -} - -#define pte_special(pte) (0) - -static inline pte_t pte_wrprotect(pte_t pte) -{ - pte_val(pte) &= ~(_PAGE_WRITE | _PAGE_SILENT_WRITE); - return pte; -} - -static inline pte_t pte_mkclean(pte_t pte) -{ - pte_val(pte) &= ~(_PAGE_MODIFIED|_PAGE_SILENT_WRITE); - return pte; -} - -static inline pte_t pte_mkold(pte_t pte) -{ - pte_val(pte) &= ~(_PAGE_ACCESSED|_PAGE_SILENT_READ); - return pte; -} - -static inline pte_t pte_mkwrite(pte_t pte) -{ - pte_val(pte) |= _PAGE_WRITE; - if (pte_val(pte) & _PAGE_MODIFIED) - pte_val(pte) |= _PAGE_SILENT_WRITE; - return pte; -} - -static inline pte_t pte_mkdirty(pte_t pte) -{ - pte_val(pte) |= _PAGE_MODIFIED; - if (pte_val(pte) & _PAGE_WRITE) - pte_val(pte) |= _PAGE_SILENT_WRITE; - return pte; -} - -static inline pte_t pte_mkyoung(pte_t pte) -{ - pte_val(pte) |= _PAGE_ACCESSED; - if (pte_val(pte) & _PAGE_READ) - pte_val(pte) |= _PAGE_SILENT_READ; - return pte; -} - -#define set_pmd(pmdptr, pmdval) \ - do { *(pmdptr) = (pmdval); } while (0) -#define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT) - -extern unsigned long pgd_current; -extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; -extern void paging_init(void); - -static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) -{ - return __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot)); -} - -extern void __update_tlb(struct vm_area_struct *vma, - unsigned long address, pte_t pte); -extern void __update_cache(struct vm_area_struct *vma, - unsigned long address, pte_t pte); - -static inline void update_mmu_cache(struct vm_area_struct *vma, - unsigned long address, pte_t *ptep) -{ - pte_t pte = *ptep; - __update_tlb(vma, address, pte); - __update_cache(vma, address, pte); -} - -#ifndef __ASSEMBLY__ -#include <asm-generic/pgtable.h> - -void setup_memory(void); -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_SCORE_PGTABLE_H */ diff --git a/arch/score/include/asm/processor.h b/arch/score/include/asm/processor.h deleted file mode 100644 index 1412c774c6b1..000000000000 --- a/arch/score/include/asm/processor.h +++ /dev/null @@ -1,104 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_PROCESSOR_H -#define _ASM_SCORE_PROCESSOR_H - -#include <linux/cpumask.h> -#include <linux/threads.h> - -#include <asm/segment.h> - -struct task_struct; - -/* - * System setup and hardware flags.. - */ -extern void (*cpu_wait)(void); - -extern void start_thread(struct pt_regs *regs, - unsigned long pc, unsigned long sp); -extern unsigned long get_wchan(struct task_struct *p); - -/* - * Return current * instruction pointer ("program counter"). - */ -#define current_text_addr() ({ __label__ _l; _l: &&_l; }) - -#define cpu_relax() barrier() -#define release_thread(thread) do {} while (0) - -/* - * User space process size: 2GB. This is hardcoded into a few places, - * so don't change it unless you know what you are doing. - */ -#define TASK_SIZE 0x7fff8000UL - -/* - * This decides where the kernel will search for a free chunk of vm - * space during mmap's. - */ -#define TASK_UNMAPPED_BASE ((TASK_SIZE / 3) & ~(PAGE_SIZE)) - -#ifdef __KERNEL__ -#define STACK_TOP TASK_SIZE -#define STACK_TOP_MAX TASK_SIZE -#endif - -/* - * If you change thread_struct remember to change the #defines below too! - */ -struct thread_struct { - unsigned long reg0, reg2, reg3; - unsigned long reg12, reg13, reg14, reg15, reg16; - unsigned long reg17, reg18, reg19, reg20, reg21; - - unsigned long cp0_psr; - unsigned long cp0_ema; /* Last user fault */ - unsigned long cp0_badvaddr; /* Last user fault */ - unsigned long cp0_baduaddr; /* Last kernel fault accessing USEG */ - unsigned long error_code; - unsigned long trap_no; - - unsigned long mflags; - unsigned long reg29; - - unsigned long single_step; - unsigned long ss_nextcnt; - - unsigned long insn1_type; - unsigned long addr1; - unsigned long insn1; - - unsigned long insn2_type; - unsigned long addr2; - unsigned long insn2; - - mm_segment_t current_ds; -}; - -#define INIT_THREAD { \ - .reg0 = 0, \ - .reg2 = 0, \ - .reg3 = 0, \ - .reg12 = 0, \ - .reg13 = 0, \ - .reg14 = 0, \ - .reg15 = 0, \ - .reg16 = 0, \ - .reg17 = 0, \ - .reg18 = 0, \ - .reg19 = 0, \ - .reg20 = 0, \ - .reg21 = 0, \ - .cp0_psr = 0, \ - .error_code = 0, \ - .trap_no = 0, \ -} - -#define kstk_tos(tsk) \ - ((unsigned long)task_stack_page(tsk) + THREAD_SIZE - 32) -#define task_pt_regs(tsk) ((struct pt_regs *)kstk_tos(tsk) - 1) - -#define KSTK_EIP(tsk) (task_pt_regs(tsk)->cp0_epc) -#define KSTK_ESP(tsk) (task_pt_regs(tsk)->regs[29]) - -#endif /* _ASM_SCORE_PROCESSOR_H */ diff --git a/arch/score/include/asm/ptrace.h b/arch/score/include/asm/ptrace.h deleted file mode 100644 index 026b9c51bee8..000000000000 --- a/arch/score/include/asm/ptrace.h +++ /dev/null @@ -1,26 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_PTRACE_H -#define _ASM_SCORE_PTRACE_H - -#include <uapi/asm/ptrace.h> - - -struct task_struct; - -/* - * Does the process account for user or for system time? - */ -#define user_mode(regs) ((regs->cp0_psr & 8) == 8) - -#define instruction_pointer(regs) ((unsigned long)(regs)->cp0_epc) -#define profile_pc(regs) instruction_pointer(regs) -#define user_stack_pointer(r) ((unsigned long)(r)->regs[0]) - -extern void do_syscall_trace(struct pt_regs *regs, int entryexit); -extern int read_tsk_long(struct task_struct *, unsigned long, unsigned long *); -extern int read_tsk_short(struct task_struct *, unsigned long, - unsigned short *); - -#define arch_has_single_step() (1) - -#endif /* _ASM_SCORE_PTRACE_H */ diff --git a/arch/score/include/asm/scoreregs.h b/arch/score/include/asm/scoreregs.h deleted file mode 100644 index ff8d20a49aa7..000000000000 --- a/arch/score/include/asm/scoreregs.h +++ /dev/null @@ -1,52 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_SCOREREGS_H -#define _ASM_SCORE_SCOREREGS_H - -#include <linux/linkage.h> - -/* TIMER register */ -#define TIME0BASE 0x96080000 -#define P_TIMER0_CTRL (TIME0BASE + 0x00) -#define P_TIMER0_CPP_CTRL (TIME0BASE + 0x04) -#define P_TIMER0_PRELOAD (TIME0BASE + 0x08) -#define P_TIMER0_CPP_REG (TIME0BASE + 0x0C) -#define P_TIMER0_UPCNT (TIME0BASE + 0x10) - -/* Timer Controller Register */ -/* bit 0 Timer enable */ -#define TMR_DISABLE 0x0000 -#define TMR_ENABLE 0x0001 - -/* bit 1 Interrupt enable */ -#define TMR_IE_DISABLE 0x0000 -#define TMR_IE_ENABLE 0x0002 - -/* bit 2 Output enable */ -#define TMR_OE_DISABLE 0x0004 -#define TMR_OE_ENABLE 0x0000 - -/* bit4 Up/Down counting selection */ -#define TMR_UD_DOWN 0x0000 -#define TMR_UD_UP 0x0010 - -/* bit5 Up/Down counting control selection */ -#define TMR_UDS_UD 0x0000 -#define TMR_UDS_EXTUD 0x0020 - -/* bit6 Time output mode */ -#define TMR_OM_TOGGLE 0x0000 -#define TMR_OM_PILSE 0x0040 - -/* bit 8..9 External input active edge selection */ -#define TMR_ES_PE 0x0000 -#define TMR_ES_NE 0x0100 -#define TMR_ES_BOTH 0x0200 - -/* bit 10..11 Operating mode */ -#define TMR_M_FREE 0x0000 /* free running timer mode */ -#define TMR_M_PERIODIC 0x0400 /* periodic timer mode */ -#define TMR_M_FC 0x0800 /* free running counter mode */ -#define TMR_M_PC 0x0c00 /* periodic counter mode */ - -#define SYSTEM_CLOCK (27*1000000/4) /* 27 MHz */ -#endif /* _ASM_SCORE_SCOREREGS_H */ diff --git a/arch/score/include/asm/segment.h b/arch/score/include/asm/segment.h deleted file mode 100644 index b00c277e17ff..000000000000 --- a/arch/score/include/asm/segment.h +++ /dev/null @@ -1,22 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_SEGMENT_H -#define _ASM_SCORE_SEGMENT_H - -#ifndef __ASSEMBLY__ - -typedef struct { - unsigned long seg; -} mm_segment_t; - -#define KERNEL_DS ((mm_segment_t){0}) -#define USER_DS KERNEL_DS - -# define get_ds() (KERNEL_DS) -# define get_fs() (current_thread_info()->addr_limit) -# define set_fs(x) \ - do { current_thread_info()->addr_limit = (x); } while (0) - -# define segment_eq(a, b) ((a).seg == (b).seg) - -# endif /* __ASSEMBLY__ */ -#endif /* _ASM_SCORE_SEGMENT_H */ diff --git a/arch/score/include/asm/setup.h b/arch/score/include/asm/setup.h deleted file mode 100644 index a596d0bd0632..000000000000 --- a/arch/score/include/asm/setup.h +++ /dev/null @@ -1,37 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_SETUP_H -#define _ASM_SCORE_SETUP_H - -#include <uapi/asm/setup.h> - - -extern void pagetable_init(void); -extern void pgd_init(unsigned long page); - -extern void setup_early_printk(void); -extern void cpu_cache_init(void); -extern void tlb_init(void); - -extern void handle_nmi(void); -extern void handle_adelinsn(void); -extern void handle_adedata(void); -extern void handle_ibe(void); -extern void handle_pel(void); -extern void handle_sys(void); -extern void handle_ccu(void); -extern void handle_ri(void); -extern void handle_tr(void); -extern void handle_ades(void); -extern void handle_cee(void); -extern void handle_cpe(void); -extern void handle_dve(void); -extern void handle_dbe(void); -extern void handle_reserved(void); -extern void handle_tlb_refill(void); -extern void handle_tlb_invaild(void); -extern void handle_mod(void); -extern void debug_exception_vector(void); -extern void general_exception_vector(void); -extern void interrupt_exception_vector(void); - -#endif /* _ASM_SCORE_SETUP_H */ diff --git a/arch/score/include/asm/shmparam.h b/arch/score/include/asm/shmparam.h deleted file mode 100644 index 01a3d0eaed80..000000000000 --- a/arch/score/include/asm/shmparam.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_SHMPARAM_H -#define _ASM_SCORE_SHMPARAM_H - -#include <asm-generic/shmparam.h> - -#endif /* _ASM_SCORE_SHMPARAM_H */ diff --git a/arch/score/include/asm/string.h b/arch/score/include/asm/string.h deleted file mode 100644 index 3debf3b234b7..000000000000 --- a/arch/score/include/asm/string.h +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_STRING_H -#define _ASM_SCORE_STRING_H - -extern void *memset(void *__s, int __c, size_t __count); -extern void *memcpy(void *__to, __const__ void *__from, size_t __n); -extern void *memmove(void *__dest, __const__ void *__src, size_t __n); - -#endif /* _ASM_SCORE_STRING_H */ diff --git a/arch/score/include/asm/switch_to.h b/arch/score/include/asm/switch_to.h deleted file mode 100644 index ce730e60cd43..000000000000 --- a/arch/score/include/asm/switch_to.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_SWITCH_TO_H -#define _ASM_SCORE_SWITCH_TO_H - -extern void *resume(void *last, void *next, void *next_ti); - -#define switch_to(prev, next, last) \ -do { \ - (last) = resume(prev, next, task_thread_info(next)); \ -} while (0) - -#endif /* _ASM_SCORE_SWITCH_TO_H */ diff --git a/arch/score/include/asm/syscalls.h b/arch/score/include/asm/syscalls.h deleted file mode 100644 index caa099fd9a8e..000000000000 --- a/arch/score/include/asm/syscalls.h +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_SYSCALLS_H -#define _ASM_SCORE_SYSCALLS_H - -asmlinkage long score_rt_sigreturn(struct pt_regs *regs); - -#include <asm-generic/syscalls.h> - -#endif /* _ASM_SCORE_SYSCALLS_H */ diff --git a/arch/score/include/asm/thread_info.h b/arch/score/include/asm/thread_info.h deleted file mode 100644 index bc4c7c90550f..000000000000 --- a/arch/score/include/asm/thread_info.h +++ /dev/null @@ -1,90 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_THREAD_INFO_H -#define _ASM_SCORE_THREAD_INFO_H - -#ifdef __KERNEL__ - -#define KU_MASK 0x08 -#define KU_USER 0x08 -#define KU_KERN 0x00 - -#include <asm/page.h> -#include <linux/const.h> - -/* thread information allocation */ -#define THREAD_SIZE_ORDER (1) -#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) -#define THREAD_MASK (THREAD_SIZE - _AC(1,UL)) - -#ifndef __ASSEMBLY__ - -#include <asm/processor.h> - -/* - * low level task data that entry.S needs immediate access to - * - this struct should fit entirely inside of one cache line - * - this struct shares the supervisor stack pages - * - if the contents of this structure are changed, the assembly constants - * must also be changed - */ -struct thread_info { - struct task_struct *task; /* main task structure */ - unsigned long flags; /* low level flags */ - unsigned long tp_value; /* thread pointer */ - __u32 cpu; /* current CPU */ - - /* 0 => preemptable, < 0 => BUG */ - int preempt_count; - - /* - * thread address space: - * 0-0xBFFFFFFF for user-thead - * 0-0xFFFFFFFF for kernel-thread - */ - mm_segment_t addr_limit; - struct pt_regs *regs; -}; - -/* - * macros/functions for gaining access to the thread information structure - * - * preempt_count needs to be 1 initially, until the scheduler is functional. - */ -#define INIT_THREAD_INFO(tsk) \ -{ \ - .task = &tsk, \ - .cpu = 0, \ - .preempt_count = 1, \ - .addr_limit = KERNEL_DS, \ -} - -/* How to get the thread information struct from C. */ -register struct thread_info *__current_thread_info __asm__("r28"); -#define current_thread_info() __current_thread_info - -#endif /* !__ASSEMBLY__ */ - -/* - * thread information flags - * - these are process state flags that various assembly files may need to - * access - * - pending work-to-be-done flags are in LSW - * - other flags in MSW - */ -#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ -#define TIF_SIGPENDING 1 /* signal pending */ -#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ -#define TIF_NOTIFY_RESUME 5 /* callback before returning to user */ -#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ -#define TIF_MEMDIE 18 /* is terminating due to OOM killer */ - -#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) -#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) -#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) -#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) - -#define _TIF_WORK_MASK (0x0000ffff) - -#endif /* __KERNEL__ */ - -#endif /* _ASM_SCORE_THREAD_INFO_H */ diff --git a/arch/score/include/asm/timex.h b/arch/score/include/asm/timex.h deleted file mode 100644 index ea8e7ff49e57..000000000000 --- a/arch/score/include/asm/timex.h +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_TIMEX_H -#define _ASM_SCORE_TIMEX_H - -#define CLOCK_TICK_RATE 27000000 /* Timer input freq. */ - -#include <asm-generic/timex.h> - -#endif /* _ASM_SCORE_TIMEX_H */ diff --git a/arch/score/include/asm/tlb.h b/arch/score/include/asm/tlb.h deleted file mode 100644 index 6e7206428877..000000000000 --- a/arch/score/include/asm/tlb.h +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_TLB_H -#define _ASM_SCORE_TLB_H - -/* - * SCORE doesn't need any special per-pte or per-vma handling, except - * we need to flush cache for area to be unmapped. - */ -#define tlb_start_vma(tlb, vma) do {} while (0) -#define tlb_end_vma(tlb, vma) do {} while (0) -#define __tlb_remove_tlb_entry(tlb, ptep, address) do {} while (0) -#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) - -extern void score7_FTLB_refill_Handler(void); - -#include <asm-generic/tlb.h> - -#endif /* _ASM_SCORE_TLB_H */ diff --git a/arch/score/include/asm/tlbflush.h b/arch/score/include/asm/tlbflush.h deleted file mode 100644 index f48722f4b00e..000000000000 --- a/arch/score/include/asm/tlbflush.h +++ /dev/null @@ -1,143 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_TLBFLUSH_H -#define _ASM_SCORE_TLBFLUSH_H - -#include <linux/mm.h> - -/* - * TLB flushing: - * - * - flush_tlb_all() flushes all processes TLB entries - * - flush_tlb_mm(mm) flushes the specified mm context TLB entries - * - flush_tlb_page(vma, vmaddr) flushes one page - * - flush_tlb_range(vma, start, end) flushes a range of pages - * - flush_tlb_kernel_range(start, end) flushes a range of kernel pages - */ -extern void local_flush_tlb_all(void); -extern void local_flush_tlb_mm(struct mm_struct *mm); -extern void local_flush_tlb_range(struct vm_area_struct *vma, - unsigned long start, unsigned long end); -extern void local_flush_tlb_kernel_range(unsigned long start, - unsigned long end); -extern void local_flush_tlb_page(struct vm_area_struct *vma, - unsigned long page); -extern void local_flush_tlb_one(unsigned long vaddr); - -#define flush_tlb_all() local_flush_tlb_all() -#define flush_tlb_mm(mm) local_flush_tlb_mm(mm) -#define flush_tlb_range(vma, vmaddr, end) \ - local_flush_tlb_range(vma, vmaddr, end) -#define flush_tlb_kernel_range(vmaddr, end) \ - local_flush_tlb_kernel_range(vmaddr, end) -#define flush_tlb_page(vma, page) local_flush_tlb_page(vma, page) -#define flush_tlb_one(vaddr) local_flush_tlb_one(vaddr) - -#ifndef __ASSEMBLY__ - -static inline unsigned long pevn_get(void) -{ - unsigned long val; - - __asm__ __volatile__( - "mfcr %0, cr11\n" - "nop\nnop\n" - : "=r" (val)); - - return val; -} - -static inline void pevn_set(unsigned long val) -{ - __asm__ __volatile__( - "mtcr %0, cr11\n" - "nop\nnop\nnop\nnop\nnop\n" - : : "r" (val)); -} - -static inline void pectx_set(unsigned long val) -{ - __asm__ __volatile__( - "mtcr %0, cr12\n" - "nop\nnop\nnop\nnop\nnop\n" - : : "r" (val)); -} - -static inline unsigned long pectx_get(void) -{ - unsigned long val; - __asm__ __volatile__( - "mfcr %0, cr12\n" - "nop\nnop\n" - : "=r" (val)); - return val; -} -static inline unsigned long tlblock_get(void) -{ - unsigned long val; - - __asm__ __volatile__( - "mfcr %0, cr7\n" - "nop\nnop\n" - : "=r" (val)); - return val; -} -static inline void tlblock_set(unsigned long val) -{ - __asm__ __volatile__( - "mtcr %0, cr7\n" - "nop\nnop\nnop\nnop\nnop\n" - : : "r" (val)); -} - -static inline void tlbpt_set(unsigned long val) -{ - __asm__ __volatile__( - "mtcr %0, cr8\n" - "nop\nnop\nnop\nnop\nnop\n" - : : "r" (val)); -} - -static inline long tlbpt_get(void) -{ - long val; - - __asm__ __volatile__( - "mfcr %0, cr8\n" - "nop\nnop\n" - : "=r" (val)); - - return val; -} - -static inline void peaddr_set(unsigned long val) -{ - __asm__ __volatile__( - "mtcr %0, cr9\n" - "nop\nnop\nnop\nnop\nnop\n" - : : "r" (val)); -} - -/* TLB operations. */ -static inline void tlb_probe(void) -{ - __asm__ __volatile__("stlb;nop;nop;nop;nop;nop"); -} - -static inline void tlb_read(void) -{ - __asm__ __volatile__("mftlb;nop;nop;nop;nop;nop"); -} - -static inline void tlb_write_indexed(void) -{ - __asm__ __volatile__("mtptlb;nop;nop;nop;nop;nop"); -} - -static inline void tlb_write_random(void) -{ - __asm__ __volatile__("mtrtlb;nop;nop;nop;nop;nop"); -} - -#endif /* Not __ASSEMBLY__ */ - -#endif /* _ASM_SCORE_TLBFLUSH_H */ diff --git a/arch/score/include/asm/topology.h b/arch/score/include/asm/topology.h deleted file mode 100644 index 06577d2a1808..000000000000 --- a/arch/score/include/asm/topology.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_TOPOLOGY_H -#define _ASM_SCORE_TOPOLOGY_H - -#include <asm-generic/topology.h> - -#endif /* _ASM_SCORE_TOPOLOGY_H */ diff --git a/arch/score/include/asm/uaccess.h b/arch/score/include/asm/uaccess.h deleted file mode 100644 index a233f3236846..000000000000 --- a/arch/score/include/asm/uaccess.h +++ /dev/null @@ -1,373 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __SCORE_UACCESS_H -#define __SCORE_UACCESS_H - -#include <linux/kernel.h> -#include <asm/extable.h> - -#define get_ds() (KERNEL_DS) -#define get_fs() (current_thread_info()->addr_limit) -#define segment_eq(a, b) ((a).seg == (b).seg) - -/* - * Is a address valid? This does a straighforward calculation rather - * than tests. - * - * Address valid if: - * - "addr" doesn't have any high-bits set - * - AND "size" doesn't have any high-bits set - * - AND "addr+size" doesn't have any high-bits set - * - OR we are in kernel mode. - * - * __ua_size() is a trick to avoid runtime checking of positive constant - * sizes; for those we already know at compile time that the size is ok. - */ -#define __ua_size(size) \ - ((__builtin_constant_p(size) && (signed long) (size) > 0) ? 0 : (size)) - -/* - * access_ok: - Checks if a user space pointer is valid - * @type: Type of access: %VERIFY_READ or %VERIFY_WRITE. Note that - * %VERIFY_WRITE is a superset of %VERIFY_READ - if it is safe - * to write to a block, it is always safe to read from it. - * @addr: User space pointer to start of block to check - * @size: Size of block to check - * - * Context: User context only. This function may sleep if pagefaults are - * enabled. - * - * Checks if a pointer to a block of memory in user space is valid. - * - * Returns true (nonzero) if the memory block may be valid, false (zero) - * if it is definitely invalid. - * - * Note that, depending on architecture, this function probably just - * checks that the pointer is in the user space range - after calling - * this function, memory access functions may still return -EFAULT. - */ - -#define __access_ok(addr, size) \ - (((long)((get_fs().seg) & \ - ((addr) | ((addr) + (size)) | \ - __ua_size(size)))) == 0) - -#define access_ok(type, addr, size) \ - likely(__access_ok((unsigned long)(addr), (size))) - -/* - * put_user: - Write a simple value into user space. - * @x: Value to copy to user space. - * @ptr: Destination address, in user space. - * - * Context: User context only. This function may sleep if pagefaults are - * enabled. - * - * This macro copies a single simple value from kernel space to user - * space. It supports simple types like char and int, but not larger - * data types like structures or arrays. - * - * @ptr must have pointer-to-simple-variable type, and @x must be assignable - * to the result of dereferencing @ptr. - * - * Returns zero on success, or -EFAULT on error. - */ -#define put_user(x, ptr) __put_user_check((x), (ptr), sizeof(*(ptr))) - -/* - * get_user: - Get a simple variable from user space. - * @x: Variable to store result. - * @ptr: Source address, in user space. - * - * Context: User context only. This function may sleep if pagefaults are - * enabled. - * - * This macro copies a single simple variable from user space to kernel - * space. It supports simple types like char and int, but not larger - * data types like structures or arrays. - * - * @ptr must have pointer-to-simple-variable type, and the result of - * dereferencing @ptr must be assignable to @x without a cast. - * - * Returns zero on success, or -EFAULT on error. - * On error, the variable @x is set to zero. - */ -#define get_user(x, ptr) __get_user_check((x), (ptr), sizeof(*(ptr))) - -/* - * __put_user: - Write a simple value into user space, with less checking. - * @x: Value to copy to user space. - * @ptr: Destination address, in user space. - * - * Context: User context only. This function may sleep if pagefaults are - * enabled. - * - * This macro copies a single simple value from kernel space to user - * space. It supports simple types like char and int, but not larger - * data types like structures or arrays. - * - * @ptr must have pointer-to-simple-variable type, and @x must be assignable - * to the result of dereferencing @ptr. - * - * Caller must check the pointer with access_ok() before calling this - * function. - * - * Returns zero on success, or -EFAULT on error. - */ -#define __put_user(x, ptr) __put_user_nocheck((x), (ptr), sizeof(*(ptr))) - -/* - * __get_user: - Get a simple variable from user space, with less checking. - * @x: Variable to store result. - * @ptr: Source address, in user space. - * - * Context: User context only. This function may sleep if pagefaults are - * enabled. - * - * This macro copies a single simple variable from user space to kernel - * space. It supports simple types like char and int, but not larger - * data types like structures or arrays. - * - * @ptr must have pointer-to-simple-variable type, and the result of - * dereferencing @ptr must be assignable to @x without a cast. - * - * Caller must check the pointer with access_ok() before calling this - * function. - * - * Returns zero on success, or -EFAULT on error. - * On error, the variable @x is set to zero. - */ -#define __get_user(x, ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr))) - -struct __large_struct { unsigned long buf[100]; }; -#define __m(x) (*(struct __large_struct __user *)(x)) - -/* - * Yuck. We need two variants, one for 64bit operation and one - * for 32 bit mode and old iron. - */ -extern void __get_user_unknown(void); - -#define __get_user_common(val, size, ptr) \ -do { \ - switch (size) { \ - case 1: \ - __get_user_asm(val, "lb", ptr); \ - break; \ - case 2: \ - __get_user_asm(val, "lh", ptr); \ - break; \ - case 4: \ - __get_user_asm(val, "lw", ptr); \ - break; \ - case 8: \ - if (__copy_from_user((void *)&val, ptr, 8) == 0) \ - __gu_err = 0; \ - else \ - __gu_err = -EFAULT; \ - break; \ - default: \ - __get_user_unknown(); \ - break; \ - } \ -} while (0) - -#define __get_user_nocheck(x, ptr, size) \ -({ \ - long __gu_err = 0; \ - __get_user_common((x), size, ptr); \ - __gu_err; \ -}) - -#define __get_user_check(x, ptr, size) \ -({ \ - long __gu_err = -EFAULT; \ - const __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \ - \ - if (likely(access_ok(VERIFY_READ, __gu_ptr, size))) \ - __get_user_common((x), size, __gu_ptr); \ - else \ - (x) = 0; \ - \ - __gu_err; \ -}) - -#define __get_user_asm(val, insn, addr) \ -{ \ - long __gu_tmp; \ - \ - __asm__ __volatile__( \ - "1:" insn " %1, %3\n" \ - "2:\n" \ - ".section .fixup,\"ax\"\n" \ - "3:li %0, %4\n" \ - "li %1, 0\n" \ - "j 2b\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - ".word 1b, 3b\n" \ - ".previous\n" \ - : "=r" (__gu_err), "=r" (__gu_tmp) \ - : "0" (0), "o" (__m(addr)), "i" (-EFAULT)); \ - \ - (val) = (__typeof__(*(addr))) __gu_tmp; \ -} - -/* - * Yuck. We need two variants, one for 64bit operation and one - * for 32 bit mode and old iron. - */ -#define __put_user_nocheck(val, ptr, size) \ -({ \ - __typeof__(*(ptr)) __pu_val; \ - long __pu_err = 0; \ - \ - __pu_val = (val); \ - switch (size) { \ - case 1: \ - __put_user_asm("sb", ptr); \ - break; \ - case 2: \ - __put_user_asm("sh", ptr); \ - break; \ - case 4: \ - __put_user_asm("sw", ptr); \ - break; \ - case 8: \ - if ((__copy_to_user((void *)ptr, &__pu_val, 8)) == 0) \ - __pu_err = 0; \ - else \ - __pu_err = -EFAULT; \ - break; \ - default: \ - __put_user_unknown(); \ - break; \ - } \ - __pu_err; \ -}) - - -#define __put_user_check(val, ptr, size) \ -({ \ - __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ - __typeof__(*(ptr)) __pu_val = (val); \ - long __pu_err = -EFAULT; \ - \ - if (likely(access_ok(VERIFY_WRITE, __pu_addr, size))) { \ - switch (size) { \ - case 1: \ - __put_user_asm("sb", __pu_addr); \ - break; \ - case 2: \ - __put_user_asm("sh", __pu_addr); \ - break; \ - case 4: \ - __put_user_asm("sw", __pu_addr); \ - break; \ - case 8: \ - if ((__copy_to_user((void *)__pu_addr, &__pu_val, 8)) == 0)\ - __pu_err = 0; \ - else \ - __pu_err = -EFAULT; \ - break; \ - default: \ - __put_user_unknown(); \ - break; \ - } \ - } \ - __pu_err; \ -}) - -#define __put_user_asm(insn, ptr) \ - __asm__ __volatile__( \ - "1:" insn " %2, %3\n" \ - "2:\n" \ - ".section .fixup,\"ax\"\n" \ - "3:li %0, %4\n" \ - "j 2b\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - ".word 1b, 3b\n" \ - ".previous\n" \ - : "=r" (__pu_err) \ - : "0" (0), "r" (__pu_val), "o" (__m(ptr)), \ - "i" (-EFAULT)); - -extern void __put_user_unknown(void); -extern int __copy_tofrom_user(void *to, const void *from, unsigned long len); - -static inline unsigned long -raw_copy_from_user(void *to, const void __user *from, unsigned long len) -{ - return __copy_tofrom_user(to, (__force const void *)from, len); -} - -static inline unsigned long -raw_copy_to_user(void __user *to, const void *from, unsigned long len) -{ - return __copy_tofrom_user((__force void *)to, from, len); -} - -#define INLINE_COPY_FROM_USER -#define INLINE_COPY_TO_USER - -/* - * __clear_user: - Zero a block of memory in user space, with less checking. - * @to: Destination address, in user space. - * @n: Number of bytes to zero. - * - * Zero a block of memory in user space. Caller must check - * the specified block with access_ok() before calling this function. - * - * Returns number of bytes that could not be cleared. - * On success, this will be zero. - */ -extern unsigned long __clear_user(void __user *src, unsigned long size); - -static inline unsigned long clear_user(char *src, unsigned long size) -{ - if (access_ok(VERIFY_WRITE, src, size)) - return __clear_user(src, size); - - return -EFAULT; -} -/* - * __strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking. - * @dst: Destination address, in kernel space. This buffer must be at - * least @count bytes long. - * @src: Source address, in user space. - * @count: Maximum number of bytes to copy, including the trailing NUL. - * - * Copies a NUL-terminated string from userspace to kernel space. - * Caller must check the specified block with access_ok() before calling - * this function. - * - * On success, returns the length of the string (not including the trailing - * NUL). - * - * If access to userspace fails, returns -EFAULT (some data may have been - * copied). - * - * If @count is smaller than the length of the string, copies @count bytes - * and returns @count. - */ -extern int __strncpy_from_user(char *dst, const char *src, long len); - -static inline int strncpy_from_user(char *dst, const char *src, long len) -{ - if (access_ok(VERIFY_READ, src, 1)) - return __strncpy_from_user(dst, src, len); - - return -EFAULT; -} - -extern int __strnlen_user(const char *str, long len); -static inline long strnlen_user(const char __user *str, long len) -{ - if (!access_ok(VERIFY_READ, str, 0)) - return 0; - else - return __strnlen_user(str, len); -} - -#endif /* __SCORE_UACCESS_H */ - diff --git a/arch/score/include/asm/ucontext.h b/arch/score/include/asm/ucontext.h deleted file mode 100644 index 9bc07b9f30fb..000000000000 --- a/arch/score/include/asm/ucontext.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/ucontext.h> diff --git a/arch/score/include/asm/unaligned.h b/arch/score/include/asm/unaligned.h deleted file mode 100644 index 5db6c805ce7e..000000000000 --- a/arch/score/include/asm/unaligned.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_UNALIGNED_H -#define _ASM_SCORE_UNALIGNED_H - -#include <asm-generic/unaligned.h> - -#endif /* _ASM_SCORE_UNALIGNED_H */ diff --git a/arch/score/include/asm/user.h b/arch/score/include/asm/user.h deleted file mode 100644 index f7b0f3434e72..000000000000 --- a/arch/score/include/asm/user.h +++ /dev/null @@ -1,22 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef _ASM_SCORE_USER_H -#define _ASM_SCORE_USER_H - -struct user_regs_struct { - unsigned long regs[32]; - - unsigned long cel; - unsigned long ceh; - - unsigned long sr0; /* cnt */ - unsigned long sr1; /* lcr */ - unsigned long sr2; /* scr */ - - unsigned long cp0_epc; - unsigned long cp0_ema; - unsigned long cp0_psr; - unsigned long cp0_ecr; - unsigned long cp0_condition; -}; - -#endif /* _ASM_SCORE_USER_H */ diff --git a/arch/score/include/uapi/asm/Kbuild b/arch/score/include/uapi/asm/Kbuild deleted file mode 100644 index b04fd1632051..000000000000 --- a/arch/score/include/uapi/asm/Kbuild +++ /dev/null @@ -1,6 +0,0 @@ -# UAPI Header export list -include include/uapi/asm-generic/Kbuild.asm - -generic-y += bpf_perf_event.h -generic-y += poll.h -generic-y += siginfo.h diff --git a/arch/score/include/uapi/asm/auxvec.h b/arch/score/include/uapi/asm/auxvec.h deleted file mode 100644 index f69151565aee..000000000000 --- a/arch/score/include/uapi/asm/auxvec.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ASM_SCORE_AUXVEC_H -#define _ASM_SCORE_AUXVEC_H - -#endif /* _ASM_SCORE_AUXVEC_H */ diff --git a/arch/score/include/uapi/asm/bitsperlong.h b/arch/score/include/uapi/asm/bitsperlong.h deleted file mode 100644 index df48f2717da2..000000000000 --- a/arch/score/include/uapi/asm/bitsperlong.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_BITSPERLONG_H -#define _ASM_SCORE_BITSPERLONG_H - -#include <asm-generic/bitsperlong.h> - -#endif /* _ASM_SCORE_BITSPERLONG_H */ diff --git a/arch/score/include/uapi/asm/byteorder.h b/arch/score/include/uapi/asm/byteorder.h deleted file mode 100644 index a5247ea66c03..000000000000 --- a/arch/score/include/uapi/asm/byteorder.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_BYTEORDER_H -#define _ASM_SCORE_BYTEORDER_H - -#include <linux/byteorder/little_endian.h> - -#endif /* _ASM_SCORE_BYTEORDER_H */ diff --git a/arch/score/include/uapi/asm/errno.h b/arch/score/include/uapi/asm/errno.h deleted file mode 100644 index 1b914865714f..000000000000 --- a/arch/score/include/uapi/asm/errno.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_ERRNO_H -#define _ASM_SCORE_ERRNO_H - -#include <asm-generic/errno.h> - -#endif /* _ASM_SCORE_ERRNO_H */ diff --git a/arch/score/include/uapi/asm/fcntl.h b/arch/score/include/uapi/asm/fcntl.h deleted file mode 100644 index 9c5053b87c66..000000000000 --- a/arch/score/include/uapi/asm/fcntl.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_FCNTL_H -#define _ASM_SCORE_FCNTL_H - -#include <asm-generic/fcntl.h> - -#endif /* _ASM_SCORE_FCNTL_H */ diff --git a/arch/score/include/uapi/asm/ioctl.h b/arch/score/include/uapi/asm/ioctl.h deleted file mode 100644 index d6cb6dc33d5f..000000000000 --- a/arch/score/include/uapi/asm/ioctl.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_IOCTL_H -#define _ASM_SCORE_IOCTL_H - -#include <asm-generic/ioctl.h> - -#endif /* _ASM_SCORE_IOCTL_H */ diff --git a/arch/score/include/uapi/asm/ioctls.h b/arch/score/include/uapi/asm/ioctls.h deleted file mode 100644 index b93b011f02aa..000000000000 --- a/arch/score/include/uapi/asm/ioctls.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_IOCTLS_H -#define _ASM_SCORE_IOCTLS_H - -#include <asm-generic/ioctls.h> - -#endif /* _ASM_SCORE_IOCTLS_H */ diff --git a/arch/score/include/uapi/asm/ipcbuf.h b/arch/score/include/uapi/asm/ipcbuf.h deleted file mode 100644 index 195ee525308d..000000000000 --- a/arch/score/include/uapi/asm/ipcbuf.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_IPCBUF_H -#define _ASM_SCORE_IPCBUF_H - -#include <asm-generic/ipcbuf.h> - -#endif /* _ASM_SCORE_IPCBUF_H */ diff --git a/arch/score/include/uapi/asm/kvm_para.h b/arch/score/include/uapi/asm/kvm_para.h deleted file mode 100644 index baacc4996d18..000000000000 --- a/arch/score/include/uapi/asm/kvm_para.h +++ /dev/null @@ -1,2 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#include <asm-generic/kvm_para.h> diff --git a/arch/score/include/uapi/asm/mman.h b/arch/score/include/uapi/asm/mman.h deleted file mode 100644 index b22b83809432..000000000000 --- a/arch/score/include/uapi/asm/mman.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_MMAN_H -#define _ASM_SCORE_MMAN_H - -#include <asm-generic/mman.h> - -#endif /* _ASM_SCORE_MMAN_H */ diff --git a/arch/score/include/uapi/asm/msgbuf.h b/arch/score/include/uapi/asm/msgbuf.h deleted file mode 100644 index b05a238756ab..000000000000 --- a/arch/score/include/uapi/asm/msgbuf.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_MSGBUF_H -#define _ASM_SCORE_MSGBUF_H - -#include <asm-generic/msgbuf.h> - -#endif /* _ASM_SCORE_MSGBUF_H */ diff --git a/arch/score/include/uapi/asm/param.h b/arch/score/include/uapi/asm/param.h deleted file mode 100644 index ce09e2632681..000000000000 --- a/arch/score/include/uapi/asm/param.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_PARAM_H -#define _ASM_SCORE_PARAM_H - -#include <asm-generic/param.h> - -#endif /* _ASM_SCORE_PARAM_H */ diff --git a/arch/score/include/uapi/asm/posix_types.h b/arch/score/include/uapi/asm/posix_types.h deleted file mode 100644 index 63200d56a4a9..000000000000 --- a/arch/score/include/uapi/asm/posix_types.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_POSIX_TYPES_H -#define _ASM_SCORE_POSIX_TYPES_H - -#include <asm-generic/posix_types.h> - -#endif /* _ASM_SCORE_POSIX_TYPES_H */ diff --git a/arch/score/include/uapi/asm/ptrace.h b/arch/score/include/uapi/asm/ptrace.h deleted file mode 100644 index e8bd4923f96e..000000000000 --- a/arch/score/include/uapi/asm/ptrace.h +++ /dev/null @@ -1,66 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _UAPI_ASM_SCORE_PTRACE_H -#define _UAPI_ASM_SCORE_PTRACE_H - -#define PTRACE_GETREGS 12 -#define PTRACE_SETREGS 13 - -#define SINGLESTEP16_INSN 0x7006 -#define SINGLESTEP32_INSN 0x840C8000 -#define BREAKPOINT16_INSN 0x7002 /* work on SPG300 */ -#define BREAKPOINT32_INSN 0x84048000 /* work on SPG300 */ - -/* Define instruction mask */ -#define INSN32_MASK 0x80008000 - -#define J32 0x88008000 /* 1_00010_0000000000_1_000000000000000 */ -#define J32M 0xFC008000 /* 1_11111_0000000000_1_000000000000000 */ - -#define B32 0x90008000 /* 1_00100_0000000000_1_000000000000000 */ -#define B32M 0xFC008000 -#define BL32 0x90008001 /* 1_00100_0000000000_1_000000000000001 */ -#define BL32M B32 -#define BR32 0x80008008 /* 1_00000_0000000000_1_00000000_000100_0 */ -#define BR32M 0xFFE0807E -#define BRL32 0x80008009 /* 1_00000_0000000000_1_00000000_000100_1 */ -#define BRL32M BR32M - -#define B32_SET (J32 | B32 | BL32 | BR32 | BRL32) - -#define J16 0x3000 /* 0_011_....... */ -#define J16M 0xF000 -#define B16 0x4000 /* 0_100_....... */ -#define B16M 0xF000 -#define BR16 0x0004 /* 0_000.......0100 */ -#define BR16M 0xF00F -#define B16_SET (J16 | B16 | BR16) - - -/* - * This struct defines the way the registers are stored on the stack during a - * system call/exception. As usual the registers k0/k1 aren't being saved. - */ -struct pt_regs { - unsigned long pad0[6]; /* stack arguments */ - unsigned long orig_r4; - unsigned long orig_r7; - long is_syscall; - - unsigned long regs[32]; - - unsigned long cel; - unsigned long ceh; - - unsigned long sr0; /* cnt */ - unsigned long sr1; /* lcr */ - unsigned long sr2; /* scr */ - - unsigned long cp0_epc; - unsigned long cp0_ema; - unsigned long cp0_psr; - unsigned long cp0_ecr; - unsigned long cp0_condition; -}; - - -#endif /* _UAPI_ASM_SCORE_PTRACE_H */ diff --git a/arch/score/include/uapi/asm/resource.h b/arch/score/include/uapi/asm/resource.h deleted file mode 100644 index df3fb9c942c4..000000000000 --- a/arch/score/include/uapi/asm/resource.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_RESOURCE_H -#define _ASM_SCORE_RESOURCE_H - -#include <asm-generic/resource.h> - -#endif /* _ASM_SCORE_RESOURCE_H */ diff --git a/arch/score/include/uapi/asm/sembuf.h b/arch/score/include/uapi/asm/sembuf.h deleted file mode 100644 index c16e7a94725d..000000000000 --- a/arch/score/include/uapi/asm/sembuf.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_SEMBUF_H -#define _ASM_SCORE_SEMBUF_H - -#include <asm-generic/sembuf.h> - -#endif /* _ASM_SCORE_SEMBUF_H */ diff --git a/arch/score/include/uapi/asm/setup.h b/arch/score/include/uapi/asm/setup.h deleted file mode 100644 index dee58323847e..000000000000 --- a/arch/score/include/uapi/asm/setup.h +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _UAPI_ASM_SCORE_SETUP_H -#define _UAPI_ASM_SCORE_SETUP_H - -#define COMMAND_LINE_SIZE 256 -#define MEMORY_START 0 -#define MEMORY_SIZE 0x2000000 - - -#endif /* _UAPI_ASM_SCORE_SETUP_H */ diff --git a/arch/score/include/uapi/asm/shmbuf.h b/arch/score/include/uapi/asm/shmbuf.h deleted file mode 100644 index f38acfe733cd..000000000000 --- a/arch/score/include/uapi/asm/shmbuf.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_SHMBUF_H -#define _ASM_SCORE_SHMBUF_H - -#include <asm-generic/shmbuf.h> - -#endif /* _ASM_SCORE_SHMBUF_H */ diff --git a/arch/score/include/uapi/asm/sigcontext.h b/arch/score/include/uapi/asm/sigcontext.h deleted file mode 100644 index 2b0cd93a71f6..000000000000 --- a/arch/score/include/uapi/asm/sigcontext.h +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_SIGCONTEXT_H -#define _ASM_SCORE_SIGCONTEXT_H - -/* - * Keep this struct definition in sync with the sigcontext fragment - * in arch/score/tools/offset.c - */ -struct sigcontext { - unsigned int sc_regmask; - unsigned int sc_psr; - unsigned int sc_condition; - unsigned long sc_pc; - unsigned long sc_regs[32]; - unsigned int sc_ssflags; - unsigned int sc_mdceh; - unsigned int sc_mdcel; - unsigned int sc_ecr; - unsigned long sc_ema; - unsigned long sc_sigset[4]; -}; - -#endif /* _ASM_SCORE_SIGCONTEXT_H */ diff --git a/arch/score/include/uapi/asm/signal.h b/arch/score/include/uapi/asm/signal.h deleted file mode 100644 index 7fb694972302..000000000000 --- a/arch/score/include/uapi/asm/signal.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_SIGNAL_H -#define _ASM_SCORE_SIGNAL_H - -#include <asm-generic/signal.h> - -#endif /* _ASM_SCORE_SIGNAL_H */ diff --git a/arch/score/include/uapi/asm/socket.h b/arch/score/include/uapi/asm/socket.h deleted file mode 100644 index f76ba1f72354..000000000000 --- a/arch/score/include/uapi/asm/socket.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_SOCKET_H -#define _ASM_SCORE_SOCKET_H - -#include <asm-generic/socket.h> - -#endif /* _ASM_SCORE_SOCKET_H */ diff --git a/arch/score/include/uapi/asm/sockios.h b/arch/score/include/uapi/asm/sockios.h deleted file mode 100644 index d0af8ce4373b..000000000000 --- a/arch/score/include/uapi/asm/sockios.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_SOCKIOS_H -#define _ASM_SCORE_SOCKIOS_H - -#include <asm-generic/sockios.h> - -#endif /* _ASM_SCORE_SOCKIOS_H */ diff --git a/arch/score/include/uapi/asm/stat.h b/arch/score/include/uapi/asm/stat.h deleted file mode 100644 index 669b69f764df..000000000000 --- a/arch/score/include/uapi/asm/stat.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_STAT_H -#define _ASM_SCORE_STAT_H - -#include <asm-generic/stat.h> - -#endif /* _ASM_SCORE_STAT_H */ diff --git a/arch/score/include/uapi/asm/statfs.h b/arch/score/include/uapi/asm/statfs.h deleted file mode 100644 index bb92b3e5525d..000000000000 --- a/arch/score/include/uapi/asm/statfs.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_STATFS_H -#define _ASM_SCORE_STATFS_H - -#include <asm-generic/statfs.h> - -#endif /* _ASM_SCORE_STATFS_H */ diff --git a/arch/score/include/uapi/asm/swab.h b/arch/score/include/uapi/asm/swab.h deleted file mode 100644 index 52b0927282b1..000000000000 --- a/arch/score/include/uapi/asm/swab.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_SWAB_H -#define _ASM_SCORE_SWAB_H - -#include <asm-generic/swab.h> - -#endif /* _ASM_SCORE_SWAB_H */ diff --git a/arch/score/include/uapi/asm/termbits.h b/arch/score/include/uapi/asm/termbits.h deleted file mode 100644 index 4a6f5511cd56..000000000000 --- a/arch/score/include/uapi/asm/termbits.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_TERMBITS_H -#define _ASM_SCORE_TERMBITS_H - -#include <asm-generic/termbits.h> - -#endif /* _ASM_SCORE_TERMBITS_H */ diff --git a/arch/score/include/uapi/asm/termios.h b/arch/score/include/uapi/asm/termios.h deleted file mode 100644 index fabb598ecfa3..000000000000 --- a/arch/score/include/uapi/asm/termios.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_TERMIOS_H -#define _ASM_SCORE_TERMIOS_H - -#include <asm-generic/termios.h> - -#endif /* _ASM_SCORE_TERMIOS_H */ diff --git a/arch/score/include/uapi/asm/types.h b/arch/score/include/uapi/asm/types.h deleted file mode 100644 index 8515287f412a..000000000000 --- a/arch/score/include/uapi/asm/types.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _ASM_SCORE_TYPES_H -#define _ASM_SCORE_TYPES_H - -#include <asm-generic/types.h> - -#endif /* _ASM_SCORE_TYPES_H */ diff --git a/arch/score/include/uapi/asm/unistd.h b/arch/score/include/uapi/asm/unistd.h deleted file mode 100644 index 04da47bd3d46..000000000000 --- a/arch/score/include/uapi/asm/unistd.h +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#define __ARCH_HAVE_MMU - -#define __ARCH_WANT_RENAMEAT -#define __ARCH_WANT_SYSCALL_NO_AT -#define __ARCH_WANT_SYSCALL_NO_FLAGS -#define __ARCH_WANT_SYSCALL_OFF_T -#define __ARCH_WANT_SYSCALL_DEPRECATED -#define __ARCH_WANT_SYS_CLONE -#define __ARCH_WANT_SYS_FORK -#define __ARCH_WANT_SYS_VFORK - -#include <asm-generic/unistd.h> diff --git a/arch/score/kernel/Makefile b/arch/score/kernel/Makefile deleted file mode 100644 index 42def8cff873..000000000000 --- a/arch/score/kernel/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for the Linux/SCORE kernel. -# - -extra-y := head.o vmlinux.lds - -obj-y += entry.o irq.o process.o ptrace.o \ - setup.o signal.o sys_score.o time.o traps.o \ - sys_call_table.o - -obj-$(CONFIG_MODULES) += module.o diff --git a/arch/score/kernel/asm-offsets.c b/arch/score/kernel/asm-offsets.c deleted file mode 100644 index 52794f9421e2..000000000000 --- a/arch/score/kernel/asm-offsets.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * arch/score/kernel/asm-offsets.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/kbuild.h> -#include <linux/interrupt.h> -#include <linux/mm.h> -#include <linux/sched.h> - -#include <asm-generic/cmpxchg-local.h> - -void output_ptreg_defines(void) -{ - COMMENT("SCORE pt_regs offsets."); - OFFSET(PT_R0, pt_regs, regs[0]); - OFFSET(PT_R1, pt_regs, regs[1]); - OFFSET(PT_R2, pt_regs, regs[2]); - OFFSET(PT_R3, pt_regs, regs[3]); - OFFSET(PT_R4, pt_regs, regs[4]); - OFFSET(PT_R5, pt_regs, regs[5]); - OFFSET(PT_R6, pt_regs, regs[6]); - OFFSET(PT_R7, pt_regs, regs[7]); - OFFSET(PT_R8, pt_regs, regs[8]); - OFFSET(PT_R9, pt_regs, regs[9]); - OFFSET(PT_R10, pt_regs, regs[10]); - OFFSET(PT_R11, pt_regs, regs[11]); - OFFSET(PT_R12, pt_regs, regs[12]); - OFFSET(PT_R13, pt_regs, regs[13]); - OFFSET(PT_R14, pt_regs, regs[14]); - OFFSET(PT_R15, pt_regs, regs[15]); - OFFSET(PT_R16, pt_regs, regs[16]); - OFFSET(PT_R17, pt_regs, regs[17]); - OFFSET(PT_R18, pt_regs, regs[18]); - OFFSET(PT_R19, pt_regs, regs[19]); - OFFSET(PT_R20, pt_regs, regs[20]); - OFFSET(PT_R21, pt_regs, regs[21]); - OFFSET(PT_R22, pt_regs, regs[22]); - OFFSET(PT_R23, pt_regs, regs[23]); - OFFSET(PT_R24, pt_regs, regs[24]); - OFFSET(PT_R25, pt_regs, regs[25]); - OFFSET(PT_R26, pt_regs, regs[26]); - OFFSET(PT_R27, pt_regs, regs[27]); - OFFSET(PT_R28, pt_regs, regs[28]); - OFFSET(PT_R29, pt_regs, regs[29]); - OFFSET(PT_R30, pt_regs, regs[30]); - OFFSET(PT_R31, pt_regs, regs[31]); - - OFFSET(PT_ORIG_R4, pt_regs, orig_r4); - OFFSET(PT_ORIG_R7, pt_regs, orig_r7); - OFFSET(PT_CEL, pt_regs, cel); - OFFSET(PT_CEH, pt_regs, ceh); - OFFSET(PT_SR0, pt_regs, sr0); - OFFSET(PT_SR1, pt_regs, sr1); - OFFSET(PT_SR2, pt_regs, sr2); - OFFSET(PT_EPC, pt_regs, cp0_epc); - OFFSET(PT_EMA, pt_regs, cp0_ema); - OFFSET(PT_PSR, pt_regs, cp0_psr); - OFFSET(PT_ECR, pt_regs, cp0_ecr); - OFFSET(PT_CONDITION, pt_regs, cp0_condition); - OFFSET(PT_IS_SYSCALL, pt_regs, is_syscall); - - DEFINE(PT_SIZE, sizeof(struct pt_regs)); - BLANK(); -} - -void output_task_defines(void) -{ - COMMENT("SCORE task_struct offsets."); - OFFSET(TASK_STATE, task_struct, state); - OFFSET(TASK_THREAD_INFO, task_struct, stack); - OFFSET(TASK_FLAGS, task_struct, flags); - OFFSET(TASK_MM, task_struct, mm); - OFFSET(TASK_PID, task_struct, pid); - DEFINE(TASK_STRUCT_SIZE, sizeof(struct task_struct)); - BLANK(); -} - -void output_thread_info_defines(void) -{ - COMMENT("SCORE thread_info offsets."); - OFFSET(TI_TASK, thread_info, task); - OFFSET(TI_FLAGS, thread_info, flags); - OFFSET(TI_TP_VALUE, thread_info, tp_value); - OFFSET(TI_CPU, thread_info, cpu); - OFFSET(TI_PRE_COUNT, thread_info, preempt_count); - OFFSET(TI_ADDR_LIMIT, thread_info, addr_limit); - OFFSET(TI_REGS, thread_info, regs); - DEFINE(KERNEL_STACK_SIZE, THREAD_SIZE); - DEFINE(KERNEL_STACK_MASK, THREAD_MASK); - BLANK(); -} - -void output_thread_defines(void) -{ - COMMENT("SCORE specific thread_struct offsets."); - OFFSET(THREAD_REG0, task_struct, thread.reg0); - OFFSET(THREAD_REG2, task_struct, thread.reg2); - OFFSET(THREAD_REG3, task_struct, thread.reg3); - OFFSET(THREAD_REG12, task_struct, thread.reg12); - OFFSET(THREAD_REG13, task_struct, thread.reg13); - OFFSET(THREAD_REG14, task_struct, thread.reg14); - OFFSET(THREAD_REG15, task_struct, thread.reg15); - OFFSET(THREAD_REG16, task_struct, thread.reg16); - OFFSET(THREAD_REG17, task_struct, thread.reg17); - OFFSET(THREAD_REG18, task_struct, thread.reg18); - OFFSET(THREAD_REG19, task_struct, thread.reg19); - OFFSET(THREAD_REG20, task_struct, thread.reg20); - OFFSET(THREAD_REG21, task_struct, thread.reg21); - OFFSET(THREAD_REG29, task_struct, thread.reg29); - - OFFSET(THREAD_PSR, task_struct, thread.cp0_psr); - OFFSET(THREAD_EMA, task_struct, thread.cp0_ema); - OFFSET(THREAD_BADUADDR, task_struct, thread.cp0_baduaddr); - OFFSET(THREAD_ECODE, task_struct, thread.error_code); - OFFSET(THREAD_TRAPNO, task_struct, thread.trap_no); - BLANK(); -} - -void output_mm_defines(void) -{ - COMMENT("Size of struct page"); - DEFINE(STRUCT_PAGE_SIZE, sizeof(struct page)); - BLANK(); - COMMENT("Linux mm_struct offsets."); - OFFSET(MM_USERS, mm_struct, mm_users); - OFFSET(MM_PGD, mm_struct, pgd); - OFFSET(MM_CONTEXT, mm_struct, context); - BLANK(); - DEFINE(_PAGE_SIZE, PAGE_SIZE); - DEFINE(_PAGE_SHIFT, PAGE_SHIFT); - BLANK(); - DEFINE(_PGD_T_SIZE, sizeof(pgd_t)); - DEFINE(_PTE_T_SIZE, sizeof(pte_t)); - BLANK(); - DEFINE(_PGD_ORDER, PGD_ORDER); - DEFINE(_PTE_ORDER, PTE_ORDER); - BLANK(); - DEFINE(_PGDIR_SHIFT, PGDIR_SHIFT); - BLANK(); - DEFINE(_PTRS_PER_PGD, PTRS_PER_PGD); - DEFINE(_PTRS_PER_PTE, PTRS_PER_PTE); - BLANK(); -} - -void output_sc_defines(void) -{ - COMMENT("Linux sigcontext offsets."); - OFFSET(SC_REGS, sigcontext, sc_regs); - OFFSET(SC_MDCEH, sigcontext, sc_mdceh); - OFFSET(SC_MDCEL, sigcontext, sc_mdcel); - OFFSET(SC_PC, sigcontext, sc_pc); - OFFSET(SC_PSR, sigcontext, sc_psr); - OFFSET(SC_ECR, sigcontext, sc_ecr); - OFFSET(SC_EMA, sigcontext, sc_ema); - BLANK(); -} - -void output_signal_defined(void) -{ - COMMENT("Linux signal numbers."); - DEFINE(_SIGHUP, SIGHUP); - DEFINE(_SIGINT, SIGINT); - DEFINE(_SIGQUIT, SIGQUIT); - DEFINE(_SIGILL, SIGILL); - DEFINE(_SIGTRAP, SIGTRAP); - DEFINE(_SIGIOT, SIGIOT); - DEFINE(_SIGABRT, SIGABRT); - DEFINE(_SIGFPE, SIGFPE); - DEFINE(_SIGKILL, SIGKILL); - DEFINE(_SIGBUS, SIGBUS); - DEFINE(_SIGSEGV, SIGSEGV); - DEFINE(_SIGSYS, SIGSYS); - DEFINE(_SIGPIPE, SIGPIPE); - DEFINE(_SIGALRM, SIGALRM); - DEFINE(_SIGTERM, SIGTERM); - DEFINE(_SIGUSR1, SIGUSR1); - DEFINE(_SIGUSR2, SIGUSR2); - DEFINE(_SIGCHLD, SIGCHLD); - DEFINE(_SIGPWR, SIGPWR); - DEFINE(_SIGWINCH, SIGWINCH); - DEFINE(_SIGURG, SIGURG); - DEFINE(_SIGIO, SIGIO); - DEFINE(_SIGSTOP, SIGSTOP); - DEFINE(_SIGTSTP, SIGTSTP); - DEFINE(_SIGCONT, SIGCONT); - DEFINE(_SIGTTIN, SIGTTIN); - DEFINE(_SIGTTOU, SIGTTOU); - DEFINE(_SIGVTALRM, SIGVTALRM); - DEFINE(_SIGPROF, SIGPROF); - DEFINE(_SIGXCPU, SIGXCPU); - DEFINE(_SIGXFSZ, SIGXFSZ); - BLANK(); -} diff --git a/arch/score/kernel/entry.S b/arch/score/kernel/entry.S deleted file mode 100644 index befb87d30a89..000000000000 --- a/arch/score/kernel/entry.S +++ /dev/null @@ -1,493 +0,0 @@ -/* - * arch/score/kernel/entry.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/err.h> -#include <linux/init.h> -#include <linux/linkage.h> - -#include <asm/asmmacro.h> -#include <asm/thread_info.h> -#include <asm/unistd.h> - -/* - * disable interrupts. - */ -.macro disable_irq - mfcr r8, cr0 - srli r8, r8, 1 - slli r8, r8, 1 - mtcr r8, cr0 - nop - nop - nop - nop - nop -.endm - -/* - * enable interrupts. - */ -.macro enable_irq - mfcr r8, cr0 - ori r8, 1 - mtcr r8, cr0 - nop - nop - nop - nop - nop -.endm - -__INIT -ENTRY(debug_exception_vector) - nop! - nop! - nop! - nop! - nop! - nop! - nop! - nop! - -ENTRY(general_exception_vector) # should move to addr 0x200 - j general_exception - nop! - nop! - nop! - nop! - nop! - nop! - -ENTRY(interrupt_exception_vector) # should move to addr 0x210 - j interrupt_exception - nop! - nop! - nop! - nop! - nop! - nop! - - .section ".text", "ax" - .align 2; -general_exception: - mfcr r31, cr2 - nop - la r30, exception_handlers - andi r31, 0x1f # get ecr.exc_code - slli r31, r31, 2 - add r30, r30, r31 - lw r30, [r30] - br r30 - -interrupt_exception: - SAVE_ALL - mfcr r4, cr2 - nop - lw r16, [r28, TI_REGS] - sw r0, [r28, TI_REGS] - la r3, ret_from_irq - srli r4, r4, 18 # get ecr.ip[7:2], interrupt No. - mv r5, r0 - j do_IRQ - -ENTRY(handle_nmi) # NMI #1 - SAVE_ALL - mv r4, r0 - la r8, nmi_exception_handler - brl r8 - j restore_all - -ENTRY(handle_adelinsn) # AdEL-instruction #2 - SAVE_ALL - mfcr r8, cr6 - nop - nop - sw r8, [r0, PT_EMA] - mv r4, r0 - la r8, do_adelinsn - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_ibe) # BusEL-instruction #5 - SAVE_ALL - mv r4, r0 - la r8, do_be - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_pel) # P-EL #6 - SAVE_ALL - mv r4, r0 - la r8, do_pel - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_ccu) # CCU #8 - SAVE_ALL - mv r4, r0 - la r8, do_ccu - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_ri) # RI #9 - SAVE_ALL - mv r4, r0 - la r8, do_ri - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_tr) # Trap #10 - SAVE_ALL - mv r4, r0 - la r8, do_tr - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_adedata) # AdES-instruction #12 - SAVE_ALL - mfcr r8, cr6 - nop - nop - sw r8, [r0, PT_EMA] - mv r4, r0 - la r8, do_adedata - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_cee) # CeE #16 - SAVE_ALL - mv r4, r0 - la r8, do_cee - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_cpe) # CpE #17 - SAVE_ALL - mv r4, r0 - la r8, do_cpe - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_dbe) # BusEL-data #18 - SAVE_ALL - mv r4, r0 - la r8, do_be - brl r8 - mv r4, r0 - j ret_from_exception - nop - -ENTRY(handle_reserved) # others - SAVE_ALL - mv r4, r0 - la r8, do_reserved - brl r8 - mv r4, r0 - j ret_from_exception - nop - -#ifndef CONFIG_PREEMPT -#define resume_kernel restore_all -#else -#define __ret_from_irq ret_from_exception -#endif - - .align 2 -#ifndef CONFIG_PREEMPT -ENTRY(ret_from_exception) - disable_irq # preempt stop - nop - j __ret_from_irq - nop -#endif - -ENTRY(ret_from_irq) - sw r16, [r28, TI_REGS] - -ENTRY(__ret_from_irq) - lw r8, [r0, PT_PSR] # returning to kernel mode? - andri.c r8, r8, KU_USER - beq resume_kernel - -resume_userspace: - disable_irq - lw r6, [r28, TI_FLAGS] # current->work - li r8, _TIF_WORK_MASK - and.c r8, r8, r6 # ignoring syscall_trace - bne work_pending - nop - j restore_all - nop - -#ifdef CONFIG_PREEMPT -resume_kernel: - disable_irq - lw r8, [r28, TI_PRE_COUNT] - cmpz.c r8 - bne restore_all -need_resched: - lw r8, [r28, TI_FLAGS] - andri.c r9, r8, _TIF_NEED_RESCHED - beq restore_all - lw r8, [r28, PT_PSR] # Interrupts off? - andri.c r8, r8, 1 - beq restore_all - bl preempt_schedule_irq - nop - j need_resched - nop -#endif - -ENTRY(ret_from_kernel_thread) - bl schedule_tail # r4=struct task_struct *prev - nop - mv r4, r13 - brl r12 - j syscall_exit - -ENTRY(ret_from_fork) - bl schedule_tail # r4=struct task_struct *prev - -ENTRY(syscall_exit) - nop - disable_irq - lw r6, [r28, TI_FLAGS] # current->work - li r8, _TIF_WORK_MASK - and.c r8, r6, r8 - bne syscall_exit_work - -ENTRY(restore_all) # restore full frame - RESTORE_ALL_AND_RET - -work_pending: - andri.c r8, r6, _TIF_NEED_RESCHED # r6 is preloaded with TI_FLAGS - beq work_notifysig -work_resched: - bl schedule - nop - disable_irq - lw r6, [r28, TI_FLAGS] - li r8, _TIF_WORK_MASK - and.c r8, r6, r8 # is there any work to be done - # other than syscall tracing? - beq restore_all - andri.c r8, r6, _TIF_NEED_RESCHED - bne work_resched - -work_notifysig: - mv r4, r0 - li r5, 0 - bl do_notify_resume # r6 already loaded - nop - j resume_userspace - nop - -ENTRY(syscall_exit_work) - li r8, _TIF_SYSCALL_TRACE - and.c r8, r8, r6 # r6 is preloaded with TI_FLAGS - beq work_pending # trace bit set? - nop - enable_irq - mv r4, r0 - li r5, 1 - bl do_syscall_trace - nop - b resume_userspace - nop - -.macro save_context reg - sw r12, [\reg, THREAD_REG12]; - sw r13, [\reg, THREAD_REG13]; - sw r14, [\reg, THREAD_REG14]; - sw r15, [\reg, THREAD_REG15]; - sw r16, [\reg, THREAD_REG16]; - sw r17, [\reg, THREAD_REG17]; - sw r18, [\reg, THREAD_REG18]; - sw r19, [\reg, THREAD_REG19]; - sw r20, [\reg, THREAD_REG20]; - sw r21, [\reg, THREAD_REG21]; - sw r29, [\reg, THREAD_REG29]; - sw r2, [\reg, THREAD_REG2]; - sw r0, [\reg, THREAD_REG0] -.endm - -.macro restore_context reg - lw r12, [\reg, THREAD_REG12]; - lw r13, [\reg, THREAD_REG13]; - lw r14, [\reg, THREAD_REG14]; - lw r15, [\reg, THREAD_REG15]; - lw r16, [\reg, THREAD_REG16]; - lw r17, [\reg, THREAD_REG17]; - lw r18, [\reg, THREAD_REG18]; - lw r19, [\reg, THREAD_REG19]; - lw r20, [\reg, THREAD_REG20]; - lw r21, [\reg, THREAD_REG21]; - lw r29, [\reg, THREAD_REG29]; - lw r0, [\reg, THREAD_REG0]; - lw r2, [\reg, THREAD_REG2]; - lw r3, [\reg, THREAD_REG3] -.endm - -/* - * task_struct *resume(task_struct *prev, task_struct *next, - * struct thread_info *next_ti) - */ -ENTRY(resume) - mfcr r9, cr0 - nop - nop - sw r9, [r4, THREAD_PSR] - save_context r4 - sw r3, [r4, THREAD_REG3] - - mv r28, r6 - restore_context r5 - mv r8, r6 - addi r8, KERNEL_STACK_SIZE - subi r8, 32 - la r9, kernelsp; - sw r8, [r9]; - - mfcr r9, cr0 - ldis r7, 0x00ff - nop - and r9, r9, r7 - lw r6, [r5, THREAD_PSR] - not r7, r7 - and r6, r6, r7 - or r6, r6, r9 - mtcr r6, cr0 - nop; nop; nop; nop; nop - br r3 - -ENTRY(handle_sys) - SAVE_ALL - sw r8, [r0, 16] # argument 5 from user r8 - sw r9, [r0, 20] # argument 6 from user r9 - enable_irq - - sw r4, [r0, PT_ORIG_R4] #for restart syscall - sw r7, [r0, PT_ORIG_R7] #for restart syscall - sw r27, [r0, PT_IS_SYSCALL] # it from syscall - - lw r9, [r0, PT_EPC] # skip syscall on return - addi r9, 4 - sw r9, [r0, PT_EPC] - - cmpi.c r27, __NR_syscalls # check syscall number - bcs illegal_syscall - - slli r8, r27, 2 # get syscall routine - la r11, sys_call_table - add r11, r11, r8 - lw r10, [r11] # get syscall entry - - cmpz.c r10 - beq illegal_syscall - - lw r8, [r28, TI_FLAGS] - li r9, _TIF_SYSCALL_TRACE - and.c r8, r8, r9 - bne syscall_trace_entry - - brl r10 # Do The Real system call - - cmpi.c r4, 0 - blt 1f - ldi r8, 0 - sw r8, [r0, PT_R7] - b 2f -1: - cmpi.c r4, -MAX_ERRNO - 1 - ble 2f - ldi r8, 0x1; - sw r8, [r0, PT_R7] - neg r4, r4 -2: - sw r4, [r0, PT_R4] # save result - -syscall_return: - disable_irq - lw r6, [r28, TI_FLAGS] # current->work - li r8, _TIF_WORK_MASK - and.c r8, r6, r8 - bne syscall_return_work - j restore_all - -syscall_return_work: - j syscall_exit_work - -syscall_trace_entry: - mv r16, r10 - mv r4, r0 - li r5, 0 - bl do_syscall_trace - - mv r8, r16 - lw r4, [r0, PT_R4] # Restore argument registers - lw r5, [r0, PT_R5] - lw r6, [r0, PT_R6] - lw r7, [r0, PT_R7] - brl r8 - - li r8, -MAX_ERRNO - 1 - sw r8, [r0, PT_R7] # set error flag - - neg r4, r4 # error - sw r4, [r0, PT_R0] # set flag for syscall - # restarting -1: sw r4, [r0, PT_R2] # result - j syscall_exit - -illegal_syscall: - ldi r4, -ENOSYS # error - sw r4, [r0, PT_ORIG_R4] - sw r4, [r0, PT_R4] - ldi r9, 1 # set error flag - sw r9, [r0, PT_R7] - j syscall_return - -ENTRY(sys_rt_sigreturn) - mv r4, r0 - la r8, score_rt_sigreturn - br r8 diff --git a/arch/score/kernel/head.S b/arch/score/kernel/head.S deleted file mode 100644 index 22a7e3c7292b..000000000000 --- a/arch/score/kernel/head.S +++ /dev/null @@ -1,70 +0,0 @@ -/* - * arch/score/kernel/head.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include <linux/init.h> -#include <linux/linkage.h> - -#include <asm/asm-offsets.h> - - .extern start_kernel - .global init_thread_union - .global kernelsp - -__INIT -ENTRY(_stext) - la r30, __bss_start /* initialize BSS segment. */ - la r31, _end - xor r8, r8, r8 - -1: cmp.c r31, r30 - beq 2f - - sw r8, [r30] /* clean memory. */ - addi r30, 4 - b 1b - -2: la r28, init_thread_union /* set kernel stack. */ - mv r0, r28 - addi r0, KERNEL_STACK_SIZE - 32 - la r30, kernelsp - sw r0, [r30] - subi r0, 4*4 - xor r30, r30, r30 - ori r30, 0x02 /* enable MMU. */ - mtcr r30, cr4 - nop - nop - nop - nop - nop - nop - nop - - /* there is no parameter */ - xor r4, r4, r4 - xor r5, r5, r5 - xor r6, r6, r6 - xor r7, r7, r7 - la r30, start_kernel /* jump to init_arch */ - br r30 diff --git a/arch/score/kernel/irq.c b/arch/score/kernel/irq.c deleted file mode 100644 index d4196732c65e..000000000000 --- a/arch/score/kernel/irq.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * arch/score/kernel/irq.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/interrupt.h> -#include <linux/kernel_stat.h> -#include <linux/seq_file.h> - -#include <asm/io.h> - -/* the interrupt controller is hardcoded at this address */ -#define SCORE_PIC ((u32 __iomem __force *)0x95F50000) - -#define INT_PNDL 0 -#define INT_PNDH 1 -#define INT_PRIORITY_M 2 -#define INT_PRIORITY_SG0 4 -#define INT_PRIORITY_SG1 5 -#define INT_PRIORITY_SG2 6 -#define INT_PRIORITY_SG3 7 -#define INT_MASKL 8 -#define INT_MASKH 9 - -/* - * handles all normal device IRQs - */ -asmlinkage void do_IRQ(int irq) -{ - irq_enter(); - generic_handle_irq(irq); - irq_exit(); -} - -static void score_mask(struct irq_data *d) -{ - unsigned int irq_source = 63 - d->irq; - - if (irq_source < 32) - __raw_writel((__raw_readl(SCORE_PIC + INT_MASKL) | \ - (1 << irq_source)), SCORE_PIC + INT_MASKL); - else - __raw_writel((__raw_readl(SCORE_PIC + INT_MASKH) | \ - (1 << (irq_source - 32))), SCORE_PIC + INT_MASKH); -} - -static void score_unmask(struct irq_data *d) -{ - unsigned int irq_source = 63 - d->irq; - - if (irq_source < 32) - __raw_writel((__raw_readl(SCORE_PIC + INT_MASKL) & \ - ~(1 << irq_source)), SCORE_PIC + INT_MASKL); - else - __raw_writel((__raw_readl(SCORE_PIC + INT_MASKH) & \ - ~(1 << (irq_source - 32))), SCORE_PIC + INT_MASKH); -} - -struct irq_chip score_irq_chip = { - .name = "Score7-level", - .irq_mask = score_mask, - .irq_mask_ack = score_mask, - .irq_unmask = score_unmask, -}; - -/* - * initialise the interrupt system - */ -void __init init_IRQ(void) -{ - int index; - unsigned long target_addr; - - for (index = 0; index < NR_IRQS; ++index) - irq_set_chip_and_handler(index, &score_irq_chip, - handle_level_irq); - - for (target_addr = IRQ_VECTOR_BASE_ADDR; - target_addr <= IRQ_VECTOR_END_ADDR; - target_addr += IRQ_VECTOR_SIZE) - memcpy((void *)target_addr, \ - interrupt_exception_vector, IRQ_VECTOR_SIZE); - - __raw_writel(0xffffffff, SCORE_PIC + INT_MASKL); - __raw_writel(0xffffffff, SCORE_PIC + INT_MASKH); - - __asm__ __volatile__( - "mtcr %0, cr3\n\t" - : : "r" (EXCEPTION_VECTOR_BASE_ADDR | \ - VECTOR_ADDRESS_OFFSET_MODE16)); -} diff --git a/arch/score/kernel/module.c b/arch/score/kernel/module.c deleted file mode 100644 index 1378d99baa3d..000000000000 --- a/arch/score/kernel/module.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * arch/score/kernel/module.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/moduleloader.h> -#include <linux/module.h> -#include <linux/vmalloc.h> - -int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, - unsigned int symindex, unsigned int relindex, - struct module *me) -{ - Elf32_Shdr *symsec = sechdrs + symindex; - Elf32_Shdr *relsec = sechdrs + relindex; - Elf32_Shdr *dstsec = sechdrs + relsec->sh_info; - Elf32_Rel *rel = (void *)relsec->sh_addr; - unsigned int i; - - for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) { - unsigned long loc; - Elf32_Sym *sym; - s32 r_offset; - - r_offset = ELF32_R_SYM(rel->r_info); - if ((r_offset < 0) || - (r_offset > (symsec->sh_size / sizeof(Elf32_Sym)))) { - printk(KERN_ERR "%s: bad relocation, section %d reloc %d\n", - me->name, relindex, i); - return -ENOEXEC; - } - - sym = ((Elf32_Sym *)symsec->sh_addr) + r_offset; - - if ((rel->r_offset < 0) || - (rel->r_offset > dstsec->sh_size - sizeof(u32))) { - printk(KERN_ERR "%s: out of bounds relocation, " - "section %d reloc %d offset %d size %d\n", - me->name, relindex, i, rel->r_offset, - dstsec->sh_size); - return -ENOEXEC; - } - - loc = dstsec->sh_addr + rel->r_offset; - switch (ELF32_R_TYPE(rel->r_info)) { - case R_SCORE_NONE: - break; - case R_SCORE_ABS32: - *(unsigned long *)loc += sym->st_value; - break; - case R_SCORE_HI16: - break; - case R_SCORE_LO16: { - unsigned long hi16_offset, offset; - unsigned long uvalue; - unsigned long temp, temp_hi; - temp_hi = *((unsigned long *)loc - 1); - temp = *(unsigned long *)loc; - - hi16_offset = (((((temp_hi) >> 16) & 0x3) << 15) | - ((temp_hi) & 0x7fff)) >> 1; - offset = ((temp >> 16 & 0x03) << 15) | - ((temp & 0x7fff) >> 1); - offset = (hi16_offset << 16) | (offset & 0xffff); - uvalue = sym->st_value + offset; - hi16_offset = (uvalue >> 16) << 1; - - temp_hi = ((temp_hi) & (~(0x37fff))) | - (hi16_offset & 0x7fff) | - ((hi16_offset << 1) & 0x30000); - *((unsigned long *)loc - 1) = temp_hi; - - offset = (uvalue & 0xffff) << 1; - temp = (temp & (~(0x37fff))) | (offset & 0x7fff) | - ((offset << 1) & 0x30000); - *(unsigned long *)loc = temp; - break; - } - case R_SCORE_24: { - unsigned long hi16_offset, offset; - unsigned long uvalue; - unsigned long temp; - - temp = *(unsigned long *)loc; - offset = (temp & 0x03FF7FFE); - hi16_offset = (offset & 0xFFFF0000); - offset = (hi16_offset | ((offset & 0xFFFF) << 1)) >> 2; - - uvalue = (sym->st_value + offset) >> 1; - uvalue = uvalue & 0x00ffffff; - - temp = (temp & 0xfc008001) | - ((uvalue << 2) & 0x3ff0000) | - ((uvalue & 0x3fff) << 1); - *(unsigned long *)loc = temp; - break; - } - default: - printk(KERN_ERR "%s: unknown relocation: %u\n", - me->name, ELF32_R_TYPE(rel->r_info)); - return -ENOEXEC; - } - } - - return 0; -} - -/* Given an address, look for it in the module exception tables. */ -const struct exception_table_entry *search_module_dbetables(unsigned long addr) -{ - return NULL; -} diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c deleted file mode 100644 index 6e20241a1ed4..000000000000 --- a/arch/score/kernel/process.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * arch/score/kernel/process.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/reboot.h> -#include <linux/elfcore.h> -#include <linux/pm.h> -#include <linux/rcupdate.h> -#include <linux/sched/task.h> -#include <linux/sched/task_stack.h> - -void (*pm_power_off)(void); -EXPORT_SYMBOL(pm_power_off); - -/* If or when software machine-restart is implemented, add code here. */ -void machine_restart(char *command) {} - -/* If or when software machine-halt is implemented, add code here. */ -void machine_halt(void) {} - -/* If or when software machine-power-off is implemented, add code here. */ -void machine_power_off(void) {} - -void ret_from_fork(void); -void ret_from_kernel_thread(void); - -void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp) -{ - unsigned long status; - - /* New thread loses kernel privileges. */ - status = regs->cp0_psr & ~(KU_MASK); - status |= KU_USER; - regs->cp0_psr = status; - regs->cp0_epc = pc; - regs->regs[0] = sp; -} - -/* - * When a process does an "exec", machine state like FPU and debug - * registers need to be reset. This is a hook function for that. - * Currently we don't have any such state to reset, so this is empty. - */ -void flush_thread(void) {} - -/* - * set up the kernel stack and exception frames for a new process - */ -int copy_thread(unsigned long clone_flags, unsigned long usp, - unsigned long arg, struct task_struct *p) -{ - struct thread_info *ti = task_thread_info(p); - struct pt_regs *childregs = task_pt_regs(p); - struct pt_regs *regs = current_pt_regs(); - - p->thread.reg0 = (unsigned long) childregs; - if (unlikely(p->flags & PF_KTHREAD)) { - memset(childregs, 0, sizeof(struct pt_regs)); - p->thread.reg12 = usp; - p->thread.reg13 = arg; - p->thread.reg3 = (unsigned long) ret_from_kernel_thread; - } else { - *childregs = *current_pt_regs(); - childregs->regs[7] = 0; /* Clear error flag */ - childregs->regs[4] = 0; /* Child gets zero as return value */ - if (usp) - childregs->regs[0] = usp; /* user fork */ - p->thread.reg3 = (unsigned long) ret_from_fork; - } - - p->thread.cp0_psr = 0; - - return 0; -} - -/* Fill in the fpu structure for a core dump. */ -int dump_fpu(struct pt_regs *regs, elf_fpregset_t *r) -{ - return 1; -} - -unsigned long get_wchan(struct task_struct *task) -{ - if (!task || task == current || task->state == TASK_RUNNING) - return 0; - - if (!task_stack_page(task)) - return 0; - - return task_pt_regs(task)->cp0_epc; -} - -unsigned long arch_align_stack(unsigned long sp) -{ - return sp; -} diff --git a/arch/score/kernel/ptrace.c b/arch/score/kernel/ptrace.c deleted file mode 100644 index d8455e60bce0..000000000000 --- a/arch/score/kernel/ptrace.c +++ /dev/null @@ -1,386 +0,0 @@ -/* - * arch/score/kernel/ptrace.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/elf.h> -#include <linux/kernel.h> -#include <linux/mm.h> -#include <linux/ptrace.h> -#include <linux/regset.h> -#include <linux/sched/task_stack.h> - -#include <linux/uaccess.h> - -/* - * retrieve the contents of SCORE userspace general registers - */ -static int genregs_get(struct task_struct *target, - const struct user_regset *regset, - unsigned int pos, unsigned int count, - void *kbuf, void __user *ubuf) -{ - const struct pt_regs *regs = task_pt_regs(target); - int ret; - - /* skip 9 * sizeof(unsigned long) not use for pt_regs */ - ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf, - 0, offsetof(struct pt_regs, regs)); - - /* r0 - r31, cel, ceh, sr0, sr1, sr2, epc, ema, psr, ecr, condition */ - ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, - regs->regs, - offsetof(struct pt_regs, regs), - offsetof(struct pt_regs, cp0_condition)); - - if (!ret) - ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf, - sizeof(struct pt_regs), -1); - - return ret; -} - -/* - * update the contents of the SCORE userspace general registers - */ -static int genregs_set(struct task_struct *target, - const struct user_regset *regset, - unsigned int pos, unsigned int count, - const void *kbuf, const void __user *ubuf) -{ - struct pt_regs *regs = task_pt_regs(target); - int ret; - - /* skip 9 * sizeof(unsigned long) */ - ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, - 0, offsetof(struct pt_regs, regs)); - - /* r0 - r31, cel, ceh, sr0, sr1, sr2, epc, ema, psr, ecr, condition */ - ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, - regs->regs, - offsetof(struct pt_regs, regs), - offsetof(struct pt_regs, cp0_condition)); - - if (!ret) - ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, - sizeof(struct pt_regs), -1); - - return ret; -} - -/* - * Define the register sets available on the score7 under Linux - */ -enum score7_regset { - REGSET_GENERAL, -}; - -static const struct user_regset score7_regsets[] = { - [REGSET_GENERAL] = { - .core_note_type = NT_PRSTATUS, - .n = ELF_NGREG, - .size = sizeof(long), - .align = sizeof(long), - .get = genregs_get, - .set = genregs_set, - }, -}; - -static const struct user_regset_view user_score_native_view = { - .name = "score7", - .e_machine = EM_SCORE7, - .regsets = score7_regsets, - .n = ARRAY_SIZE(score7_regsets), -}; - -const struct user_regset_view *task_user_regset_view(struct task_struct *task) -{ - return &user_score_native_view; -} - -static int is_16bitinsn(unsigned long insn) -{ - if ((insn & INSN32_MASK) == INSN32_MASK) - return 0; - else - return 1; -} - -int -read_tsk_long(struct task_struct *child, - unsigned long addr, unsigned long *res) -{ - int copied; - - copied = access_process_vm(child, addr, res, sizeof(*res), FOLL_FORCE); - - return copied != sizeof(*res) ? -EIO : 0; -} - -int -read_tsk_short(struct task_struct *child, - unsigned long addr, unsigned short *res) -{ - int copied; - - copied = access_process_vm(child, addr, res, sizeof(*res), FOLL_FORCE); - - return copied != sizeof(*res) ? -EIO : 0; -} - -static int -write_tsk_short(struct task_struct *child, - unsigned long addr, unsigned short val) -{ - int copied; - - copied = access_process_vm(child, addr, &val, sizeof(val), - FOLL_FORCE | FOLL_WRITE); - - return copied != sizeof(val) ? -EIO : 0; -} - -static int -write_tsk_long(struct task_struct *child, - unsigned long addr, unsigned long val) -{ - int copied; - - copied = access_process_vm(child, addr, &val, sizeof(val), - FOLL_FORCE | FOLL_WRITE); - - return copied != sizeof(val) ? -EIO : 0; -} - -void user_enable_single_step(struct task_struct *child) -{ - /* far_epc is the target of branch */ - unsigned int epc, far_epc = 0; - unsigned long epc_insn, far_epc_insn; - int ninsn_type; /* next insn type 0=16b, 1=32b */ - unsigned int tmp, tmp2; - struct pt_regs *regs = task_pt_regs(child); - child->thread.single_step = 1; - child->thread.ss_nextcnt = 1; - epc = regs->cp0_epc; - - read_tsk_long(child, epc, &epc_insn); - - if (is_16bitinsn(epc_insn)) { - if ((epc_insn & J16M) == J16) { - tmp = epc_insn & 0xFFE; - epc = (epc & 0xFFFFF000) | tmp; - } else if ((epc_insn & B16M) == B16) { - child->thread.ss_nextcnt = 2; - tmp = (epc_insn & 0xFF) << 1; - tmp = tmp << 23; - tmp = (unsigned int)((int) tmp >> 23); - far_epc = epc + tmp; - epc += 2; - } else if ((epc_insn & BR16M) == BR16) { - child->thread.ss_nextcnt = 2; - tmp = (epc_insn >> 4) & 0xF; - far_epc = regs->regs[tmp]; - epc += 2; - } else - epc += 2; - } else { - if ((epc_insn & J32M) == J32) { - tmp = epc_insn & 0x03FFFFFE; - tmp2 = tmp & 0x7FFF; - tmp = (((tmp >> 16) & 0x3FF) << 15) | tmp2; - epc = (epc & 0xFFC00000) | tmp; - } else if ((epc_insn & B32M) == B32) { - child->thread.ss_nextcnt = 2; - tmp = epc_insn & 0x03FFFFFE; /* discard LK bit */ - tmp2 = tmp & 0x3FF; - tmp = (((tmp >> 16) & 0x3FF) << 10) | tmp2; /* 20bit */ - tmp = tmp << 12; - tmp = (unsigned int)((int) tmp >> 12); - far_epc = epc + tmp; - epc += 4; - } else if ((epc_insn & BR32M) == BR32) { - child->thread.ss_nextcnt = 2; - tmp = (epc_insn >> 16) & 0x1F; - far_epc = regs->regs[tmp]; - epc += 4; - } else - epc += 4; - } - - if (child->thread.ss_nextcnt == 1) { - read_tsk_long(child, epc, &epc_insn); - - if (is_16bitinsn(epc_insn)) { - write_tsk_short(child, epc, SINGLESTEP16_INSN); - ninsn_type = 0; - } else { - write_tsk_long(child, epc, SINGLESTEP32_INSN); - ninsn_type = 1; - } - - if (ninsn_type == 0) { /* 16bits */ - child->thread.insn1_type = 0; - child->thread.addr1 = epc; - /* the insn may have 32bit data */ - child->thread.insn1 = (short)epc_insn; - } else { - child->thread.insn1_type = 1; - child->thread.addr1 = epc; - child->thread.insn1 = epc_insn; - } - } else { - /* branch! have two target child->thread.ss_nextcnt=2 */ - read_tsk_long(child, epc, &epc_insn); - read_tsk_long(child, far_epc, &far_epc_insn); - if (is_16bitinsn(epc_insn)) { - write_tsk_short(child, epc, SINGLESTEP16_INSN); - ninsn_type = 0; - } else { - write_tsk_long(child, epc, SINGLESTEP32_INSN); - ninsn_type = 1; - } - - if (ninsn_type == 0) { /* 16bits */ - child->thread.insn1_type = 0; - child->thread.addr1 = epc; - /* the insn may have 32bit data */ - child->thread.insn1 = (short)epc_insn; - } else { - child->thread.insn1_type = 1; - child->thread.addr1 = epc; - child->thread.insn1 = epc_insn; - } - - if (is_16bitinsn(far_epc_insn)) { - write_tsk_short(child, far_epc, SINGLESTEP16_INSN); - ninsn_type = 0; - } else { - write_tsk_long(child, far_epc, SINGLESTEP32_INSN); - ninsn_type = 1; - } - - if (ninsn_type == 0) { /* 16bits */ - child->thread.insn2_type = 0; - child->thread.addr2 = far_epc; - /* the insn may have 32bit data */ - child->thread.insn2 = (short)far_epc_insn; - } else { - child->thread.insn2_type = 1; - child->thread.addr2 = far_epc; - child->thread.insn2 = far_epc_insn; - } - } -} - -void user_disable_single_step(struct task_struct *child) -{ - if (child->thread.insn1_type == 0) - write_tsk_short(child, child->thread.addr1, - child->thread.insn1); - - if (child->thread.insn1_type == 1) - write_tsk_long(child, child->thread.addr1, - child->thread.insn1); - - if (child->thread.ss_nextcnt == 2) { /* branch */ - if (child->thread.insn1_type == 0) - write_tsk_short(child, child->thread.addr1, - child->thread.insn1); - if (child->thread.insn1_type == 1) - write_tsk_long(child, child->thread.addr1, - child->thread.insn1); - if (child->thread.insn2_type == 0) - write_tsk_short(child, child->thread.addr2, - child->thread.insn2); - if (child->thread.insn2_type == 1) - write_tsk_long(child, child->thread.addr2, - child->thread.insn2); - } - - child->thread.single_step = 0; - child->thread.ss_nextcnt = 0; -} - -void ptrace_disable(struct task_struct *child) -{ - user_disable_single_step(child); -} - -long -arch_ptrace(struct task_struct *child, long request, - unsigned long addr, unsigned long data) -{ - int ret; - unsigned long __user *datap = (void __user *)data; - - switch (request) { - case PTRACE_GETREGS: - ret = copy_regset_to_user(child, &user_score_native_view, - REGSET_GENERAL, - 0, sizeof(struct pt_regs), - datap); - break; - - case PTRACE_SETREGS: - ret = copy_regset_from_user(child, &user_score_native_view, - REGSET_GENERAL, - 0, sizeof(struct pt_regs), - datap); - break; - - default: - ret = ptrace_request(child, request, addr, data); - break; - } - - return ret; -} - -/* - * Notification of system call entry/exit - * - triggered by current->work.syscall_trace - */ -asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) -{ - if (!(current->ptrace & PT_PTRACED)) - return; - - if (!test_thread_flag(TIF_SYSCALL_TRACE)) - return; - - /* The 0x80 provides a way for the tracing parent to distinguish - between a syscall stop and SIGTRAP delivery. */ - ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) ? - 0x80 : 0)); - - /* - * this isn't the same as continuing with a signal, but it will do - * for normal use. strace only continues with a signal if the - * stopping signal is not SIGTRAP. -brl - */ - if (current->exit_code) { - send_sig(current->exit_code, current, 1); - current->exit_code = 0; - } -} diff --git a/arch/score/kernel/setup.c b/arch/score/kernel/setup.c deleted file mode 100644 index 627416bbd0b1..000000000000 --- a/arch/score/kernel/setup.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * arch/score/kernel/setup.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/bootmem.h> -#include <linux/initrd.h> -#include <linux/ioport.h> -#include <linux/memblock.h> -#include <linux/mm.h> -#include <linux/seq_file.h> -#include <linux/screen_info.h> - -#include <asm-generic/sections.h> -#include <asm/setup.h> - -struct screen_info screen_info; -unsigned long kernelsp; - -static char command_line[COMMAND_LINE_SIZE]; -static struct resource code_resource = { .name = "Kernel code",}; -static struct resource data_resource = { .name = "Kernel data",}; - -static void __init bootmem_init(void) -{ - unsigned long start_pfn, bootmap_size; - unsigned long size = initrd_end - initrd_start; - - start_pfn = PFN_UP(__pa(&_end)); - - min_low_pfn = PFN_UP(MEMORY_START); - max_low_pfn = PFN_UP(MEMORY_START + MEMORY_SIZE); - max_mapnr = max_low_pfn - min_low_pfn; - - /* Initialize the boot-time allocator with low memory only. */ - bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, - min_low_pfn, max_low_pfn); - memblock_add_node(PFN_PHYS(min_low_pfn), - PFN_PHYS(max_low_pfn - min_low_pfn), 0); - - free_bootmem(PFN_PHYS(start_pfn), - (max_low_pfn - start_pfn) << PAGE_SHIFT); - memory_present(0, start_pfn, max_low_pfn); - - /* Reserve space for the bootmem bitmap. */ - reserve_bootmem(PFN_PHYS(start_pfn), bootmap_size, BOOTMEM_DEFAULT); - - if (size == 0) { - printk(KERN_INFO "Initrd not found or empty"); - goto disable; - } - - if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { - printk(KERN_ERR "Initrd extends beyond end of memory"); - goto disable; - } - - /* Reserve space for the initrd bitmap. */ - reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT); - initrd_below_start_ok = 1; - - pr_info("Initial ramdisk at: 0x%lx (%lu bytes)\n", - initrd_start, size); - return; -disable: - printk(KERN_CONT " - disabling initrd\n"); - initrd_start = 0; - initrd_end = 0; -} - -static void __init resource_init(void) -{ - struct resource *res; - - code_resource.start = __pa(&_text); - code_resource.end = __pa(&_etext) - 1; - data_resource.start = __pa(&_etext); - data_resource.end = __pa(&_edata) - 1; - - res = alloc_bootmem(sizeof(struct resource)); - res->name = "System RAM"; - res->start = MEMORY_START; - res->end = MEMORY_START + MEMORY_SIZE - 1; - res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; - request_resource(&iomem_resource, res); - - request_resource(res, &code_resource); - request_resource(res, &data_resource); -} - -void __init setup_arch(char **cmdline_p) -{ - randomize_va_space = 0; - *cmdline_p = command_line; - - cpu_cache_init(); - tlb_init(); - bootmem_init(); - paging_init(); - resource_init(); -} - -static int show_cpuinfo(struct seq_file *m, void *v) -{ - unsigned long n = (unsigned long) v - 1; - - seq_printf(m, "processor\t\t: %ld\n\n", n); - return 0; -} - -static void *c_start(struct seq_file *m, loff_t *pos) -{ - unsigned long i = *pos; - - return i < 1 ? (void *) (i + 1) : NULL; -} - -static void *c_next(struct seq_file *m, void *v, loff_t *pos) -{ - ++*pos; - return c_start(m, pos); -} - -static void c_stop(struct seq_file *m, void *v) -{ -} - -const struct seq_operations cpuinfo_op = { - .start = c_start, - .next = c_next, - .stop = c_stop, - .show = show_cpuinfo, -}; - -static int __init topology_init(void) -{ - return 0; -} - -subsys_initcall(topology_init); diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c deleted file mode 100644 index e381c8c4ff65..000000000000 --- a/arch/score/kernel/signal.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * arch/score/kernel/signal.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/errno.h> -#include <linux/signal.h> -#include <linux/ptrace.h> -#include <linux/unistd.h> -#include <linux/uaccess.h> -#include <linux/tracehook.h> - -#include <asm/cacheflush.h> -#include <asm/syscalls.h> -#include <asm/ucontext.h> - -struct rt_sigframe { - u32 rs_ass[4]; /* argument save space */ - u32 rs_code[2]; /* signal trampoline */ - struct siginfo rs_info; - struct ucontext rs_uc; -}; - -static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) -{ - int err = 0; - unsigned long reg; - - reg = regs->cp0_epc; err |= __put_user(reg, &sc->sc_pc); - err |= __put_user(regs->cp0_psr, &sc->sc_psr); - err |= __put_user(regs->cp0_condition, &sc->sc_condition); - - -#define save_gp_reg(i) { \ - reg = regs->regs[i]; \ - err |= __put_user(reg, &sc->sc_regs[i]); \ -} while (0) - save_gp_reg(0); save_gp_reg(1); save_gp_reg(2); - save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); - save_gp_reg(6); save_gp_reg(7); save_gp_reg(8); - save_gp_reg(9); save_gp_reg(10); save_gp_reg(11); - save_gp_reg(12); save_gp_reg(13); save_gp_reg(14); - save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); - save_gp_reg(18); save_gp_reg(19); save_gp_reg(20); - save_gp_reg(21); save_gp_reg(22); save_gp_reg(23); - save_gp_reg(24); save_gp_reg(25); save_gp_reg(26); - save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); -#undef save_gp_reg - - reg = regs->ceh; err |= __put_user(reg, &sc->sc_mdceh); - reg = regs->cel; err |= __put_user(reg, &sc->sc_mdcel); - err |= __put_user(regs->cp0_ecr, &sc->sc_ecr); - err |= __put_user(regs->cp0_ema, &sc->sc_ema); - - return err; -} - -static int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) -{ - int err = 0; - u32 reg; - - err |= __get_user(regs->cp0_epc, &sc->sc_pc); - err |= __get_user(regs->cp0_condition, &sc->sc_condition); - - err |= __get_user(reg, &sc->sc_mdceh); - regs->ceh = (int) reg; - err |= __get_user(reg, &sc->sc_mdcel); - regs->cel = (int) reg; - - err |= __get_user(reg, &sc->sc_psr); - regs->cp0_psr = (int) reg; - err |= __get_user(reg, &sc->sc_ecr); - regs->cp0_ecr = (int) reg; - err |= __get_user(reg, &sc->sc_ema); - regs->cp0_ema = (int) reg; - -#define restore_gp_reg(i) do { \ - err |= __get_user(reg, &sc->sc_regs[i]); \ - regs->regs[i] = reg; \ -} while (0) - restore_gp_reg(0); restore_gp_reg(1); restore_gp_reg(2); - restore_gp_reg(3); restore_gp_reg(4); restore_gp_reg(5); - restore_gp_reg(6); restore_gp_reg(7); restore_gp_reg(8); - restore_gp_reg(9); restore_gp_reg(10); restore_gp_reg(11); - restore_gp_reg(12); restore_gp_reg(13); restore_gp_reg(14); - restore_gp_reg(15); restore_gp_reg(16); restore_gp_reg(17); - restore_gp_reg(18); restore_gp_reg(19); restore_gp_reg(20); - restore_gp_reg(21); restore_gp_reg(22); restore_gp_reg(23); - restore_gp_reg(24); restore_gp_reg(25); restore_gp_reg(26); - restore_gp_reg(27); restore_gp_reg(28); restore_gp_reg(29); -#undef restore_gp_reg - - return err; -} - -/* - * Determine which stack to use.. - */ -static void __user *get_sigframe(struct k_sigaction *ka, - struct pt_regs *regs, size_t frame_size) -{ - unsigned long sp; - - /* Default to using normal stack */ - sp = regs->regs[0]; - sp -= 32; - - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa.sa_flags & SA_ONSTACK) && (!on_sig_stack(sp))) - sp = current->sas_ss_sp + current->sas_ss_size; - - return (void __user*)((sp - frame_size) & ~7); -} - -asmlinkage long -score_rt_sigreturn(struct pt_regs *regs) -{ - struct rt_sigframe __user *frame; - sigset_t set; - int sig; - - /* Always make any pending restarted system calls return -EINTR */ - current->restart_block.fn = do_no_restart_syscall; - - frame = (struct rt_sigframe __user *) regs->regs[0]; - if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) - goto badframe; - if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) - goto badframe; - - set_current_blocked(&set); - - sig = restore_sigcontext(regs, &frame->rs_uc.uc_mcontext); - if (sig < 0) - goto badframe; - else if (sig) - force_sig(sig, current); - - if (restore_altstack(&frame->rs_uc.uc_stack)) - goto badframe; - regs->is_syscall = 0; - - __asm__ __volatile__( - "mv\tr0, %0\n\t" - "la\tr8, syscall_exit\n\t" - "br\tr8\n\t" - : : "r" (regs) : "r8"); - -badframe: - force_sig(SIGSEGV, current); - - return 0; -} - -static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs, - sigset_t *set) -{ - struct rt_sigframe __user *frame; - int err = 0; - - frame = get_sigframe(&ksig->ka, regs, sizeof(*frame)); - if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) - return -EFAULT; - - /* - * Set up the return code ... - * - * li v0, __NR_rt_sigreturn - * syscall - */ - err |= __put_user(0x87788000 + __NR_rt_sigreturn*2, - frame->rs_code + 0); - err |= __put_user(0x80008002, frame->rs_code + 1); - flush_cache_sigtramp((unsigned long) frame->rs_code); - - err |= copy_siginfo_to_user(&frame->rs_info, &ksig->info); - err |= __put_user(0, &frame->rs_uc.uc_flags); - err |= __put_user(NULL, &frame->rs_uc.uc_link); - err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[0]); - err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); - err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); - - if (err) - return -EFAULT; - - regs->regs[0] = (unsigned long) frame; - regs->regs[3] = (unsigned long) frame->rs_code; - regs->regs[4] = ksig->sig; - regs->regs[5] = (unsigned long) &frame->rs_info; - regs->regs[6] = (unsigned long) &frame->rs_uc; - regs->regs[29] = (unsigned long) ksig->ka.sa.sa_handler; - regs->cp0_epc = (unsigned long) ksig->ka.sa.sa_handler; - - return 0; -} - -static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) -{ - int ret; - - if (regs->is_syscall) { - switch (regs->regs[4]) { - case ERESTART_RESTARTBLOCK: - case ERESTARTNOHAND: - regs->regs[4] = EINTR; - break; - case ERESTARTSYS: - if (!(ksig->ka.sa.sa_flags & SA_RESTART)) { - regs->regs[4] = EINTR; - break; - } - case ERESTARTNOINTR: - regs->regs[4] = regs->orig_r4; - regs->regs[7] = regs->orig_r7; - regs->cp0_epc -= 8; - } - - regs->is_syscall = 0; - } - - /* - * Set up the stack frame - */ - ret = setup_rt_frame(ksig, regs, sigmask_to_save()); - - signal_setup_done(ret, ksig, 0); -} - -static void do_signal(struct pt_regs *regs) -{ - struct ksignal ksig; - - /* - * We want the common case to go fast, which is why we may in certain - * cases get here from kernel mode. Just return without doing anything - * if so. - */ - if (!user_mode(regs)) - return; - - if (get_signal(&ksig)) { - /* Actually deliver the signal. */ - handle_signal(&ksig, regs); - return; - } - - if (regs->is_syscall) { - if (regs->regs[4] == ERESTARTNOHAND || - regs->regs[4] == ERESTARTSYS || - regs->regs[4] == ERESTARTNOINTR) { - regs->regs[4] = regs->orig_r4; - regs->regs[7] = regs->orig_r7; - regs->cp0_epc -= 8; - } - - if (regs->regs[4] == ERESTART_RESTARTBLOCK) { - regs->regs[27] = __NR_restart_syscall; - regs->regs[4] = regs->orig_r4; - regs->regs[7] = regs->orig_r7; - regs->cp0_epc -= 8; - } - - regs->is_syscall = 0; /* Don't deal with this again. */ - } - - /* - * If there's no signal to deliver, we just put the saved sigmask - * back - */ - restore_saved_sigmask(); -} - -/* - * notification of userspace execution resumption - * - triggered by the TIF_WORK_MASK flags - */ -asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused, - __u32 thread_info_flags) -{ - /* deal with pending signal delivery */ - if (thread_info_flags & _TIF_SIGPENDING) - do_signal(regs); - if (thread_info_flags & _TIF_NOTIFY_RESUME) { - clear_thread_flag(TIF_NOTIFY_RESUME); - tracehook_notify_resume(regs); - } -} diff --git a/arch/score/kernel/sys_call_table.c b/arch/score/kernel/sys_call_table.c deleted file mode 100644 index 9e6ae793e690..000000000000 --- a/arch/score/kernel/sys_call_table.c +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include <linux/syscalls.h> -#include <linux/signal.h> -#include <linux/unistd.h> - -#include <asm/syscalls.h> - -#undef __SYSCALL -#define __SYSCALL(nr, call) [nr] = (call), - -void *sys_call_table[__NR_syscalls] = { -#include <asm/unistd.h> -}; diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c deleted file mode 100644 index 47c20ba46167..000000000000 --- a/arch/score/kernel/sys_score.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * arch/score/kernel/syscall.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/file.h> -#include <linux/fs.h> -#include <linux/mm.h> -#include <linux/mman.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/unistd.h> -#include <linux/syscalls.h> -#include <asm/syscalls.h> - -asmlinkage long -sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, - unsigned long flags, unsigned long fd, unsigned long pgoff) -{ - return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); -} - -asmlinkage long -sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, - unsigned long flags, unsigned long fd, off_t offset) -{ - if (unlikely(offset & ~PAGE_MASK)) - return -EINVAL; - return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); -} diff --git a/arch/score/kernel/time.c b/arch/score/kernel/time.c deleted file mode 100644 index 29aafc741f69..000000000000 --- a/arch/score/kernel/time.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * arch/score/kernel/time.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/clockchips.h> -#include <linux/interrupt.h> - -#include <asm/scoreregs.h> - -static irqreturn_t timer_interrupt(int irq, void *dev_id) -{ - struct clock_event_device *evdev = dev_id; - - /* clear timer interrupt flag */ - outl(1, P_TIMER0_CPP_REG); - evdev->event_handler(evdev); - - return IRQ_HANDLED; -} - -static struct irqaction timer_irq = { - .handler = timer_interrupt, - .flags = IRQF_TIMER, - .name = "timer", -}; - -static int score_timer_set_next_event(unsigned long delta, - struct clock_event_device *evdev) -{ - outl((TMR_M_PERIODIC | TMR_IE_ENABLE), P_TIMER0_CTRL); - outl(delta, P_TIMER0_PRELOAD); - outl(inl(P_TIMER0_CTRL) | TMR_ENABLE, P_TIMER0_CTRL); - - return 0; -} - -static int score_timer_set_periodic(struct clock_event_device *evt) -{ - outl((TMR_M_PERIODIC | TMR_IE_ENABLE), P_TIMER0_CTRL); - outl(SYSTEM_CLOCK / HZ, P_TIMER0_PRELOAD); - outl(inl(P_TIMER0_CTRL) | TMR_ENABLE, P_TIMER0_CTRL); - return 0; -} - -static struct clock_event_device score_clockevent = { - .name = "score_clockevent", - .features = CLOCK_EVT_FEAT_PERIODIC, - .shift = 16, - .set_next_event = score_timer_set_next_event, - .set_state_periodic = score_timer_set_periodic, -}; - -void __init time_init(void) -{ - timer_irq.dev_id = &score_clockevent; - setup_irq(IRQ_TIMER , &timer_irq); - - /* setup COMPARE clockevent */ - score_clockevent.mult = div_sc(SYSTEM_CLOCK, NSEC_PER_SEC, - score_clockevent.shift); - score_clockevent.max_delta_ns = clockevent_delta2ns((u32)~0, - &score_clockevent); - score_clockevent.max_delta_ticks = (u32)~0; - score_clockevent.min_delta_ns = clockevent_delta2ns(50, - &score_clockevent) + 1; - score_clockevent.min_delta_ticks = 50; - score_clockevent.cpumask = cpumask_of(0); - clockevents_register_device(&score_clockevent); -} diff --git a/arch/score/kernel/traps.c b/arch/score/kernel/traps.c deleted file mode 100644 index 12daf45369b4..000000000000 --- a/arch/score/kernel/traps.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * arch/score/kernel/traps.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/extable.h> -#include <linux/ptrace.h> -#include <linux/sched/mm.h> -#include <linux/sched/signal.h> -#include <linux/sched/debug.h> -#include <linux/mm_types.h> - -#include <asm/cacheflush.h> -#include <asm/irq.h> -#include <asm/irq_regs.h> -#include <linux/uaccess.h> - -unsigned long exception_handlers[32]; - -/* - * The architecture-independent show_stack generator - */ -void show_stack(struct task_struct *task, unsigned long *sp) -{ - int i; - long stackdata; - - sp = sp ? sp : (unsigned long *)&sp; - - printk(KERN_NOTICE "Stack: "); - i = 1; - while ((long) sp & (PAGE_SIZE - 1)) { - if (i && ((i % 8) == 0)) - printk(KERN_NOTICE "\n"); - if (i > 40) { - printk(KERN_NOTICE " ..."); - break; - } - - if (__get_user(stackdata, sp++)) { - printk(KERN_NOTICE " (Bad stack address)"); - break; - } - - printk(KERN_NOTICE " %08lx", stackdata); - i++; - } - printk(KERN_NOTICE "\n"); -} - -static void show_trace(long *sp) -{ - int i; - long addr; - - sp = sp ? sp : (long *) &sp; - - printk(KERN_NOTICE "Call Trace: "); - i = 1; - while ((long) sp & (PAGE_SIZE - 1)) { - if (__get_user(addr, sp++)) { - if (i && ((i % 6) == 0)) - printk(KERN_NOTICE "\n"); - printk(KERN_NOTICE " (Bad stack address)\n"); - break; - } - - if (kernel_text_address(addr)) { - if (i && ((i % 6) == 0)) - printk(KERN_NOTICE "\n"); - if (i > 40) { - printk(KERN_NOTICE " ..."); - break; - } - - printk(KERN_NOTICE " [<%08lx>]", addr); - i++; - } - } - printk(KERN_NOTICE "\n"); -} - -static void show_code(unsigned int *pc) -{ - long i; - - printk(KERN_NOTICE "\nCode:"); - - for (i = -3; i < 6; i++) { - unsigned long insn; - if (__get_user(insn, pc + i)) { - printk(KERN_NOTICE " (Bad address in epc)\n"); - break; - } - printk(KERN_NOTICE "%c%08lx%c", (i ? ' ' : '<'), - insn, (i ? ' ' : '>')); - } -} - -/* - * FIXME: really the generic show_regs should take a const pointer argument. - */ -void show_regs(struct pt_regs *regs) -{ - show_regs_print_info(KERN_DEFAULT); - - printk("r0 : %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - regs->regs[0], regs->regs[1], regs->regs[2], regs->regs[3], - regs->regs[4], regs->regs[5], regs->regs[6], regs->regs[7]); - printk("r8 : %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - regs->regs[8], regs->regs[9], regs->regs[10], regs->regs[11], - regs->regs[12], regs->regs[13], regs->regs[14], regs->regs[15]); - printk("r16: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - regs->regs[16], regs->regs[17], regs->regs[18], regs->regs[19], - regs->regs[20], regs->regs[21], regs->regs[22], regs->regs[23]); - printk("r24: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", - regs->regs[24], regs->regs[25], regs->regs[26], regs->regs[27], - regs->regs[28], regs->regs[29], regs->regs[30], regs->regs[31]); - - printk("CEH : %08lx\n", regs->ceh); - printk("CEL : %08lx\n", regs->cel); - - printk("EMA:%08lx, epc:%08lx %s\nPSR: %08lx\nECR:%08lx\nCondition : %08lx\n", - regs->cp0_ema, regs->cp0_epc, print_tainted(), regs->cp0_psr, - regs->cp0_ecr, regs->cp0_condition); -} - -static void show_registers(struct pt_regs *regs) -{ - show_regs(regs); - printk(KERN_NOTICE "Process %s (pid: %d, stackpage=%08lx)\n", - current->comm, current->pid, (unsigned long) current); - show_stack(current_thread_info()->task, (long *) regs->regs[0]); - show_trace((long *) regs->regs[0]); - show_code((unsigned int *) regs->cp0_epc); - printk(KERN_NOTICE "\n"); -} - -void __die(const char *str, struct pt_regs *regs, const char *file, - const char *func, unsigned long line) -{ - console_verbose(); - printk("%s", str); - if (file && func) - printk(" in %s:%s, line %ld", file, func, line); - printk(":\n"); - show_registers(regs); - do_exit(SIGSEGV); -} - -void __die_if_kernel(const char *str, struct pt_regs *regs, - const char *file, const char *func, unsigned long line) -{ - if (!user_mode(regs)) - __die(str, regs, file, func, line); -} - -asmlinkage void do_adelinsn(struct pt_regs *regs) -{ - printk("do_ADE-linsn:ema:0x%08lx:epc:0x%08lx\n", - regs->cp0_ema, regs->cp0_epc); - die_if_kernel("do_ade execution Exception\n", regs); - force_sig(SIGBUS, current); -} - -asmlinkage void do_adedata(struct pt_regs *regs) -{ - const struct exception_table_entry *fixup; - fixup = search_exception_tables(regs->cp0_epc); - if (fixup) { - regs->cp0_epc = fixup->fixup; - return; - } - printk("do_ADE-data:ema:0x%08lx:epc:0x%08lx\n", - regs->cp0_ema, regs->cp0_epc); - die_if_kernel("do_ade execution Exception\n", regs); - force_sig(SIGBUS, current); -} - -asmlinkage void do_pel(struct pt_regs *regs) -{ - die_if_kernel("do_pel execution Exception", regs); - force_sig(SIGFPE, current); -} - -asmlinkage void do_cee(struct pt_regs *regs) -{ - die_if_kernel("do_cee execution Exception", regs); - force_sig(SIGFPE, current); -} - -asmlinkage void do_cpe(struct pt_regs *regs) -{ - die_if_kernel("do_cpe execution Exception", regs); - force_sig(SIGFPE, current); -} - -asmlinkage void do_be(struct pt_regs *regs) -{ - die_if_kernel("do_be execution Exception", regs); - force_sig(SIGBUS, current); -} - -asmlinkage void do_ov(struct pt_regs *regs) -{ - siginfo_t info; - - die_if_kernel("do_ov execution Exception", regs); - - info.si_code = FPE_INTOVF; - info.si_signo = SIGFPE; - info.si_errno = 0; - info.si_addr = (void *)regs->cp0_epc; - force_sig_info(SIGFPE, &info, current); -} - -asmlinkage void do_tr(struct pt_regs *regs) -{ - die_if_kernel("do_tr execution Exception", regs); - force_sig(SIGTRAP, current); -} - -asmlinkage void do_ri(struct pt_regs *regs) -{ - unsigned long epc_insn; - unsigned long epc = regs->cp0_epc; - - read_tsk_long(current, epc, &epc_insn); - if (current->thread.single_step == 1) { - if ((epc == current->thread.addr1) || - (epc == current->thread.addr2)) { - user_disable_single_step(current); - force_sig(SIGTRAP, current); - return; - } else - BUG(); - } else if ((epc_insn == BREAKPOINT32_INSN) || - ((epc_insn & 0x0000FFFF) == 0x7002) || - ((epc_insn & 0xFFFF0000) == 0x70020000)) { - force_sig(SIGTRAP, current); - return; - } else { - die_if_kernel("do_ri execution Exception", regs); - force_sig(SIGILL, current); - } -} - -asmlinkage void do_ccu(struct pt_regs *regs) -{ - die_if_kernel("do_ccu execution Exception", regs); - force_sig(SIGILL, current); -} - -asmlinkage void do_reserved(struct pt_regs *regs) -{ - /* - * Game over - no way to handle this if it ever occurs. Most probably - * caused by a new unknown cpu type or after another deadly - * hard/software error. - */ - die_if_kernel("do_reserved execution Exception", regs); - show_regs(regs); - panic("Caught reserved exception - should not happen."); -} - -/* - * NMI exception handler. - */ -void nmi_exception_handler(struct pt_regs *regs) -{ - die_if_kernel("nmi_exception_handler execution Exception", regs); - die("NMI", regs); -} - -/* Install CPU exception handler */ -void *set_except_vector(int n, void *addr) -{ - unsigned long handler = (unsigned long) addr; - unsigned long old_handler = exception_handlers[n]; - - exception_handlers[n] = handler; - return (void *)old_handler; -} - -void __init trap_init(void) -{ - int i; - - pgd_current = (unsigned long)init_mm.pgd; - /* DEBUG EXCEPTION */ - memcpy((void *)DEBUG_VECTOR_BASE_ADDR, - &debug_exception_vector, DEBUG_VECTOR_SIZE); - /* NMI EXCEPTION */ - memcpy((void *)GENERAL_VECTOR_BASE_ADDR, - &general_exception_vector, GENERAL_VECTOR_SIZE); - - /* - * Initialise exception handlers - */ - for (i = 0; i <= 31; i++) - set_except_vector(i, handle_reserved); - - set_except_vector(1, handle_nmi); - set_except_vector(2, handle_adelinsn); - set_except_vector(3, handle_tlb_refill); - set_except_vector(4, handle_tlb_invaild); - set_except_vector(5, handle_ibe); - set_except_vector(6, handle_pel); - set_except_vector(7, handle_sys); - set_except_vector(8, handle_ccu); - set_except_vector(9, handle_ri); - set_except_vector(10, handle_tr); - set_except_vector(11, handle_adedata); - set_except_vector(12, handle_adedata); - set_except_vector(13, handle_tlb_refill); - set_except_vector(14, handle_tlb_invaild); - set_except_vector(15, handle_mod); - set_except_vector(16, handle_cee); - set_except_vector(17, handle_cpe); - set_except_vector(18, handle_dbe); - flush_icache_range(DEBUG_VECTOR_BASE_ADDR, IRQ_VECTOR_BASE_ADDR); - - mmgrab(&init_mm); - current->active_mm = &init_mm; - cpu_cache_init(); -} diff --git a/arch/score/kernel/vmlinux.lds.S b/arch/score/kernel/vmlinux.lds.S deleted file mode 100644 index 4117890b1db1..000000000000 --- a/arch/score/kernel/vmlinux.lds.S +++ /dev/null @@ -1,91 +0,0 @@ -/* - * arch/score/kernel/vmlinux.lds.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <asm-generic/vmlinux.lds.h> -#include <asm/thread_info.h> -#include <asm/page.h> - -OUTPUT_ARCH(score) -ENTRY(_stext) - -jiffies = jiffies_64; - -SECTIONS -{ - . = CONFIG_MEMORY_START + 0x2000; - /* read-only */ - .text : { - _text = .; /* Text and read-only data */ - TEXT_TEXT - SCHED_TEXT - CPUIDLE_TEXT - LOCK_TEXT - KPROBES_TEXT - *(.text.*) - *(.fixup) - . = ALIGN (4) ; - _etext = .; /* End of text section */ - } - - . = ALIGN(16); - _sdata = .; /* Start of data section */ - RODATA - - EXCEPTION_TABLE(16) - - RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE) - - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - . = ALIGN(8); - .sdata : { - *(.sdata) - } - _edata = .; /* End of data section */ - - /* will be freed after init */ - . = ALIGN(PAGE_SIZE); /* Init code and data */ - __init_begin = .; - - INIT_TEXT_SECTION(PAGE_SIZE) - INIT_DATA_SECTION(16) - - /* .exit.text is discarded at runtime, not link time, to deal with - * references from .rodata - */ - .exit.text : { - EXIT_TEXT - } - .exit.data : { - EXIT_DATA - } - . = ALIGN(PAGE_SIZE); - __init_end = .; - /* freed after init ends here */ - - BSS_SECTION(0, 0, 0) - _end = .; -} diff --git a/arch/score/lib/Makefile b/arch/score/lib/Makefile deleted file mode 100644 index 553e30e81faf..000000000000 --- a/arch/score/lib/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# -# Makefile for SCORE-specific library files.. -# - -lib-y += string.o checksum.o checksum_copy.o - -# libgcc-style stuff needed in the kernel -obj-y += ashldi3.o ashrdi3.o cmpdi2.o lshrdi3.o ucmpdi2.o diff --git a/arch/score/lib/ashldi3.c b/arch/score/lib/ashldi3.c deleted file mode 100644 index 15691a910431..000000000000 --- a/arch/score/lib/ashldi3.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * arch/score/lib/ashldi3.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include "libgcc.h" - -long long __ashldi3(long long u, word_type b) -{ - DWunion uu, w; - word_type bm; - - if (b == 0) - return u; - - uu.ll = u; - bm = 32 - b; - - if (bm <= 0) { - w.s.low = 0; - w.s.high = (unsigned int) uu.s.low << -bm; - } else { - const unsigned int carries = (unsigned int) uu.s.low >> bm; - - w.s.low = (unsigned int) uu.s.low << b; - w.s.high = ((unsigned int) uu.s.high << b) | carries; - } - - return w.ll; -} -EXPORT_SYMBOL(__ashldi3); diff --git a/arch/score/lib/ashrdi3.c b/arch/score/lib/ashrdi3.c deleted file mode 100644 index d9814a5d8d30..000000000000 --- a/arch/score/lib/ashrdi3.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * arch/score/lib/ashrdi3.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include "libgcc.h" - -long long __ashrdi3(long long u, word_type b) -{ - DWunion uu, w; - word_type bm; - - if (b == 0) - return u; - - uu.ll = u; - bm = 32 - b; - - if (bm <= 0) { - /* w.s.high = 1..1 or 0..0 */ - w.s.high = - uu.s.high >> 31; - w.s.low = uu.s.high >> -bm; - } else { - const unsigned int carries = (unsigned int) uu.s.high << bm; - - w.s.high = uu.s.high >> b; - w.s.low = ((unsigned int) uu.s.low >> b) | carries; - } - - return w.ll; -} -EXPORT_SYMBOL(__ashrdi3); diff --git a/arch/score/lib/checksum.S b/arch/score/lib/checksum.S deleted file mode 100644 index 1141f2b4a501..000000000000 --- a/arch/score/lib/checksum.S +++ /dev/null @@ -1,255 +0,0 @@ -/* - * arch/score/lib/csum_partial.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include <linux/linkage.h> - -#define ADDC(sum,reg) \ - add sum, sum, reg; \ - cmp.c reg, sum; \ - bleu 9f; \ - addi sum, 0x1; \ -9: - -#define CSUM_BIGCHUNK(src, offset, sum) \ - lw r8, [src, offset + 0x00]; \ - lw r9, [src, offset + 0x04]; \ - lw r10, [src, offset + 0x08]; \ - lw r11, [src, offset + 0x0c]; \ - ADDC(sum, r8); \ - ADDC(sum, r9); \ - ADDC(sum, r10); \ - ADDC(sum, r11); \ - lw r8, [src, offset + 0x10]; \ - lw r9, [src, offset + 0x14]; \ - lw r10, [src, offset + 0x18]; \ - lw r11, [src, offset + 0x1c]; \ - ADDC(sum, r8); \ - ADDC(sum, r9); \ - ADDC(sum, r10); \ - ADDC(sum, r11); \ - -#define src r4 -#define dest r5 -#define sum r27 - - .text -/* unknown src alignment and < 8 bytes to go */ -small_csumcpy: - mv r5, r10 - ldi r9, 0x0 - cmpi.c r25, 0x1 - beq pass_small_set_t7 /*already set, jump to pass_small_set_t7*/ - andri.c r25,r4 , 0x1 /*Is src 2 bytes aligned?*/ - -pass_small_set_t7: - beq aligned - cmpi.c r5, 0x0 - beq fold - lbu r9, [src] - slli r9,r9, 0x8 /*Little endian*/ - ADDC(sum, r9) - addi src, 0x1 - subi.c r5, 0x1 - - /*len still a full word */ -aligned: - andri.c r8, r5, 0x4 /*Len >= 4?*/ - beq len_less_4bytes - - /* Still a full word (4byte) to go,and the src is word aligned.*/ - andri.c r8, src, 0x3 /*src is 4bytes aligned, so use LW!!*/ - beq four_byte_aligned - lhu r9, [src] - addi src, 2 - ADDC(sum, r9) - lhu r9, [src] - addi src, 2 - ADDC(sum, r9) - b len_less_4bytes - -four_byte_aligned: /* Len >=4 and four byte aligned */ - lw r9, [src] - addi src, 4 - ADDC(sum, r9) - -len_less_4bytes: /* 2 byte aligned aligned and length<4B */ - andri.c r8, r5, 0x2 - beq len_less_2bytes - lhu r9, [src] - addi src, 0x2 /* src+=2 */ - ADDC(sum, r9) - -len_less_2bytes: /* len = 1 */ - andri.c r8, r5, 0x1 - beq fold /* less than 2 and not equal 1--> len=0 -> fold */ - lbu r9, [src] - -fold_ADDC: - ADDC(sum, r9) -fold: - /* fold checksum */ - slli r26, sum, 16 - add sum, sum, r26 - cmp.c r26, sum - srli sum, sum, 16 - bleu 1f /* if r26<=sum */ - addi sum, 0x1 /* r26>sum */ -1: - /* odd buffer alignment? r25 was set in csum_partial */ - cmpi.c r25, 0x0 - beq 1f - slli r26, sum, 8 - srli sum, sum, 8 - or sum, sum, r26 - andi sum, 0xffff -1: - .set optimize - /* Add the passed partial csum. */ - ADDC(sum, r6) - mv r4, sum - br r3 - .set volatile - - .align 5 -ENTRY(csum_partial) - ldi sum, 0 - ldi r25, 0 - mv r10, r5 - cmpi.c r5, 0x8 - blt small_csumcpy /* < 8(signed) bytes to copy */ - cmpi.c r5, 0x0 - beq out - andri.c r25, src, 0x1 /* odd buffer? */ - - beq word_align -hword_align: /* 1 byte */ - lbu r8, [src] - subi r5, 0x1 - slli r8, r8, 8 - ADDC(sum, r8) - addi src, 0x1 - -word_align: /* 2 bytes */ - andri.c r8, src, 0x2 /* 4bytes(dword)_aligned? */ - beq dword_align /* not, maybe dword_align */ - lhu r8, [src] - subi r5, 0x2 - ADDC(sum, r8) - addi src, 0x2 - -dword_align: /* 4bytes */ - mv r26, r5 /* maybe useless when len >=56 */ - ldi r8, 56 - cmp.c r8, r5 - bgtu do_end_words /* if a1(len)<t0(56) ,unsigned */ - andri.c r26, src, 0x4 - beq qword_align - lw r8, [src] - subi r5, 0x4 - ADDC(sum, r8) - addi src, 0x4 - -qword_align: /* 8 bytes */ - andri.c r26, src, 0x8 - beq oword_align - lw r8, [src, 0x0] - lw r9, [src, 0x4] - subi r5, 0x8 /* len-=0x8 */ - ADDC(sum, r8) - ADDC(sum, r9) - addi src, 0x8 - -oword_align: /* 16bytes */ - andri.c r26, src, 0x10 - beq begin_movement - lw r10, [src, 0x08] - lw r11, [src, 0x0c] - lw r8, [src, 0x00] - lw r9, [src, 0x04] - ADDC(sum, r10) - ADDC(sum, r11) - ADDC(sum, r8) - ADDC(sum, r9) - subi r5, 0x10 - addi src, 0x10 - -begin_movement: - srli.c r26, r5, 0x7 /* len>=128? */ - beq 1f /* len<128 */ - -/* r26 is the result that computed in oword_align */ -move_128bytes: - CSUM_BIGCHUNK(src, 0x00, sum) - CSUM_BIGCHUNK(src, 0x20, sum) - CSUM_BIGCHUNK(src, 0x40, sum) - CSUM_BIGCHUNK(src, 0x60, sum) - subi.c r26, 0x01 /* r26 equals len/128 */ - addi src, 0x80 - bne move_128bytes - -1: /* len<128,we process 64byte here */ - andri.c r10, r5, 0x40 - beq 1f - -move_64bytes: - CSUM_BIGCHUNK(src, 0x00, sum) - CSUM_BIGCHUNK(src, 0x20, sum) - addi src, 0x40 - -1: /* len<64 */ - andri r26, r5, 0x1c /* 0x1c=28 */ - andri.c r10, r5, 0x20 - beq do_end_words /* decided by andri */ - -move_32bytes: - CSUM_BIGCHUNK(src, 0x00, sum) - andri r26, r5, 0x1c - addri src, src, 0x20 - -do_end_words: /* len<32 */ - /* r26 was set already in dword_align */ - cmpi.c r26, 0x0 - beq maybe_end_cruft /* len<28 or len<56 */ - srli r26, r26, 0x2 - -end_words: - lw r8, [src] - subi.c r26, 0x1 /* unit is 4 byte */ - ADDC(sum, r8) - addi src, 0x4 - cmpi.c r26, 0x0 - bne end_words /* r26!=0 */ - -maybe_end_cruft: /* len<4 */ - andri r10, r5, 0x3 - -small_memcpy: - mv r5, r10 - j small_csumcpy - -out: - mv r4, sum - br r3 - -END(csum_partial) diff --git a/arch/score/lib/checksum_copy.c b/arch/score/lib/checksum_copy.c deleted file mode 100644 index 39b99ef61804..000000000000 --- a/arch/score/lib/checksum_copy.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * arch/score/lib/csum_partial_copy.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <net/checksum.h> - -#include <linux/uaccess.h> - -unsigned int csum_partial_copy(const char *src, char *dst, - int len, unsigned int sum) -{ - sum = csum_partial(src, len, sum); - memcpy(dst, src, len); - - return sum; -} - -unsigned int csum_partial_copy_from_user(const char *src, char *dst, - int len, unsigned int sum, - int *err_ptr) -{ - int missing; - - missing = copy_from_user(dst, src, len); - if (missing) { - memset(dst + len - missing, 0, missing); - *err_ptr = -EFAULT; - } - - return csum_partial(dst, len, sum); -} -EXPORT_SYMBOL(csum_partial_copy_from_user); diff --git a/arch/score/lib/cmpdi2.c b/arch/score/lib/cmpdi2.c deleted file mode 100644 index 1ed5290c66ed..000000000000 --- a/arch/score/lib/cmpdi2.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * arch/score/lib/cmpdi2.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include "libgcc.h" - -word_type __cmpdi2(long long a, long long b) -{ - const DWunion au = { - .ll = a - }; - const DWunion bu = { - .ll = b - }; - - if (au.s.high < bu.s.high) - return 0; - else if (au.s.high > bu.s.high) - return 2; - - if ((unsigned int) au.s.low < (unsigned int) bu.s.low) - return 0; - else if ((unsigned int) au.s.low > (unsigned int) bu.s.low) - return 2; - - return 1; -} -EXPORT_SYMBOL(__cmpdi2); diff --git a/arch/score/lib/libgcc.h b/arch/score/lib/libgcc.h deleted file mode 100644 index 0f12543d9f31..000000000000 --- a/arch/score/lib/libgcc.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * arch/score/lib/libgcc.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef __ASM_LIBGCC_H -#define __ASM_LIBGCC_H - -#include <asm/byteorder.h> - -typedef int word_type __attribute__((mode(__word__))); - -struct DWstruct { - int low, high; -}; - -typedef union { - struct DWstruct s; - long long ll; -} DWunion; - -#endif /* __ASM_LIBGCC_H */ diff --git a/arch/score/lib/lshrdi3.c b/arch/score/lib/lshrdi3.c deleted file mode 100644 index ce21175fd791..000000000000 --- a/arch/score/lib/lshrdi3.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * arch/score/lib/lshrdi3.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include <linux/module.h> -#include "libgcc.h" - -long long __lshrdi3(long long u, word_type b) -{ - DWunion uu, w; - word_type bm; - - if (b == 0) - return u; - - uu.ll = u; - bm = 32 - b; - - if (bm <= 0) { - w.s.high = 0; - w.s.low = (unsigned int) uu.s.high >> -bm; - } else { - const unsigned int carries = (unsigned int) uu.s.high << bm; - - w.s.high = (unsigned int) uu.s.high >> b; - w.s.low = ((unsigned int) uu.s.low >> b) | carries; - } - - return w.ll; -} -EXPORT_SYMBOL(__lshrdi3); diff --git a/arch/score/lib/string.S b/arch/score/lib/string.S deleted file mode 100644 index e0c0318c9010..000000000000 --- a/arch/score/lib/string.S +++ /dev/null @@ -1,156 +0,0 @@ -/* - * arch/score/lib/string.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Chen Liqin <liqin.chen@sunplusct.com> - * Lennox Wu <lennox.wu@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/linkage.h> -#include <asm-generic/errno.h> - - .text - .align 2 -ENTRY(__strncpy_from_user) - cmpi.c r6, 0 - mv r9, r6 - ble .L2 -0: lbu r7, [r5] - ldi r8, 0 -1: sb r7, [r4] -2: lb r6, [r5] - cmp.c r6, r8 - beq .L2 - -.L5: - addi r8, 1 - cmp.c r8, r9 - beq .L7 -3: lbu r6, [r5, 1]+ -4: sb r6, [r4, 1]+ -5: lb r7, [r5] - cmpi.c r7, 0 - bne .L5 -.L7: - mv r4, r8 - br r3 -.L2: - ldi r8, 0 - mv r4, r8 - br r3 - .section .fixup, "ax" -99: - ldi r4, -EFAULT - br r3 - .previous - .section __ex_table, "a" - .align 2 - .word 0b ,99b - .word 1b ,99b - .word 2b ,99b - .word 3b ,99b - .word 4b ,99b - .word 5b ,99b - .previous - - .align 2 -ENTRY(__strnlen_user) - cmpi.c r5, 0 - ble .L11 -0: lb r6, [r4] - ldi r7, 0 - cmp.c r6, r7 - beq .L11 -.L15: - addi r7, 1 - cmp.c r7, r5 - beq .L23 -1: lb r6, [r4,1]+ - cmpi.c r6, 0 - bne .L15 -.L23: - addri r4, r7, 1 - br r3 - -.L11: - ldi r4, 1 - br r3 - .section .fixup, "ax" -99: - ldi r4, 0 - br r3 - - .section __ex_table,"a" - .align 2 - .word 0b, 99b - .word 1b, 99b - .previous - - .align 2 -ENTRY(__copy_tofrom_user) - cmpi.c r6, 0 - mv r10,r6 - beq .L32 - ldi r9, 0 -.L34: - add r6, r5, r9 -0: lbu r8, [r6] - add r7, r4, r9 -1: sb r8, [r7] - addi r9, 1 - cmp.c r9, r10 - bne .L34 -.L32: - ldi r4, 0 - br r3 - .section .fixup, "ax" -99: - sub r4, r10, r9 - br r3 - .previous - .section __ex_table, "a" - .align 2 - .word 0b, 99b - .word 1b, 99b - .previous - - .align 2 -ENTRY(__clear_user) - cmpi.c r5, 0 - beq .L38 - ldi r6, 0 - mv r7, r6 -.L40: - addi r6, 1 -0: sb r7, [r4]+, 1 - cmp.c r6, r5 - bne .L40 -.L38: - ldi r4, 0 - br r3 - - .section .fixup, "ax" -99: - br r3 - .previous - .section __ex_table, "a" - .align 2 - .word 0b, 99b - .previous diff --git a/arch/score/lib/ucmpdi2.c b/arch/score/lib/ucmpdi2.c deleted file mode 100644 index b15241e0b079..000000000000 --- a/arch/score/lib/ucmpdi2.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * arch/score/lib/ucmpdi2.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include "libgcc.h" - -word_type __ucmpdi2(unsigned long long a, unsigned long long b) -{ - const DWunion au = {.ll = a}; - const DWunion bu = {.ll = b}; - - if ((unsigned int) au.s.high < (unsigned int) bu.s.high) - return 0; - else if ((unsigned int) au.s.high > (unsigned int) bu.s.high) - return 2; - if ((unsigned int) au.s.low < (unsigned int) bu.s.low) - return 0; - else if ((unsigned int) au.s.low > (unsigned int) bu.s.low) - return 2; - return 1; -} -EXPORT_SYMBOL(__ucmpdi2); diff --git a/arch/score/mm/Makefile b/arch/score/mm/Makefile deleted file mode 100644 index 7b1e29b1f8cd..000000000000 --- a/arch/score/mm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# -# Makefile for the Linux/SCORE-specific parts of the memory manager. -# - -obj-y += cache.o extable.o fault.o init.o \ - tlb-miss.o tlb-score.o pgtable.o diff --git a/arch/score/mm/cache.c b/arch/score/mm/cache.c deleted file mode 100644 index b4bcfd3e8393..000000000000 --- a/arch/score/mm/cache.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - * arch/score/mm/cache.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/init.h> -#include <linux/linkage.h> -#include <linux/kernel.h> -#include <linux/mm.h> -#include <linux/module.h> -#include <linux/sched.h> -#include <linux/fs.h> - -#include <asm/mmu_context.h> - -/* -Just flush entire Dcache!! -You must ensure the page doesn't include instructions, because -the function will not flush the Icache. -The addr must be cache aligned. -*/ -static void flush_data_cache_page(unsigned long addr) -{ - unsigned int i; - for (i = 0; i < (PAGE_SIZE / L1_CACHE_BYTES); i += L1_CACHE_BYTES) { - __asm__ __volatile__( - "cache 0x0e, [%0, 0]\n" - "cache 0x1a, [%0, 0]\n" - "nop\n" - : : "r" (addr)); - addr += L1_CACHE_BYTES; - } -} - -void flush_dcache_page(struct page *page) -{ - struct address_space *mapping = page_mapping(page); - unsigned long addr; - - if (PageHighMem(page)) - return; - if (mapping && !mapping_mapped(mapping)) { - set_bit(PG_dcache_dirty, &(page)->flags); - return; - } - - /* - * We could delay the flush for the !page_mapping case too. But that - * case is for exec env/arg pages and those are %99 certainly going to - * get faulted into the tlb (and thus flushed) anyways. - */ - addr = (unsigned long) page_address(page); - flush_data_cache_page(addr); -} -EXPORT_SYMBOL(flush_dcache_page); - -/* called by update_mmu_cache. */ -void __update_cache(struct vm_area_struct *vma, unsigned long address, - pte_t pte) -{ - struct page *page; - unsigned long pfn, addr; - int exec = (vma->vm_flags & VM_EXEC); - - pfn = pte_pfn(pte); - if (unlikely(!pfn_valid(pfn))) - return; - page = pfn_to_page(pfn); - if (page_mapping(page) && test_bit(PG_dcache_dirty, &(page)->flags)) { - addr = (unsigned long) page_address(page); - if (exec) - flush_data_cache_page(addr); - clear_bit(PG_dcache_dirty, &(page)->flags); - } -} - -static inline void setup_protection_map(void) -{ - protection_map[0] = PAGE_NONE; - protection_map[1] = PAGE_READONLY; - protection_map[2] = PAGE_COPY; - protection_map[3] = PAGE_COPY; - protection_map[4] = PAGE_READONLY; - protection_map[5] = PAGE_READONLY; - protection_map[6] = PAGE_COPY; - protection_map[7] = PAGE_COPY; - protection_map[8] = PAGE_NONE; - protection_map[9] = PAGE_READONLY; - protection_map[10] = PAGE_SHARED; - protection_map[11] = PAGE_SHARED; - protection_map[12] = PAGE_READONLY; - protection_map[13] = PAGE_READONLY; - protection_map[14] = PAGE_SHARED; - protection_map[15] = PAGE_SHARED; -} - -void cpu_cache_init(void) -{ - setup_protection_map(); -} - -void flush_icache_all(void) -{ - __asm__ __volatile__( - "la r8, flush_icache_all\n" - "cache 0x10, [r8, 0]\n" - "nop\nnop\nnop\nnop\nnop\nnop\n" - : : : "r8"); -} - -void flush_dcache_all(void) -{ - __asm__ __volatile__( - "la r8, flush_dcache_all\n" - "cache 0x1f, [r8, 0]\n" - "nop\nnop\nnop\nnop\nnop\nnop\n" - "cache 0x1a, [r8, 0]\n" - "nop\nnop\nnop\nnop\nnop\nnop\n" - : : : "r8"); -} - -void flush_cache_all(void) -{ - __asm__ __volatile__( - "la r8, flush_cache_all\n" - "cache 0x10, [r8, 0]\n" - "nop\nnop\nnop\nnop\nnop\nnop\n" - "cache 0x1f, [r8, 0]\n" - "nop\nnop\nnop\nnop\nnop\nnop\n" - "cache 0x1a, [r8, 0]\n" - "nop\nnop\nnop\nnop\nnop\nnop\n" - : : : "r8"); -} - -void flush_cache_mm(struct mm_struct *mm) -{ - if (!(mm->context)) - return; - flush_cache_all(); -} - -/*if we flush a range precisely , the processing may be very long. -We must check each page in the range whether present. If the page is present, -we can flush the range in the page. Be careful, the range may be cross two -page, a page is present and another is not present. -*/ -/* -The interface is provided in hopes that the port can find -a suitably efficient method for removing multiple page -sized regions from the cache. -*/ -void flush_cache_range(struct vm_area_struct *vma, - unsigned long start, unsigned long end) -{ - struct mm_struct *mm = vma->vm_mm; - int exec = vma->vm_flags & VM_EXEC; - pgd_t *pgdp; - pud_t *pudp; - pmd_t *pmdp; - pte_t *ptep; - - if (!(mm->context)) - return; - - pgdp = pgd_offset(mm, start); - pudp = pud_offset(pgdp, start); - pmdp = pmd_offset(pudp, start); - ptep = pte_offset(pmdp, start); - - while (start <= end) { - unsigned long tmpend; - pgdp = pgd_offset(mm, start); - pudp = pud_offset(pgdp, start); - pmdp = pmd_offset(pudp, start); - ptep = pte_offset(pmdp, start); - - if (!(pte_val(*ptep) & _PAGE_PRESENT)) { - start = (start + PAGE_SIZE) & ~(PAGE_SIZE - 1); - continue; - } - tmpend = (start | (PAGE_SIZE-1)) > end ? - end : (start | (PAGE_SIZE-1)); - - flush_dcache_range(start, tmpend); - if (exec) - flush_icache_range(start, tmpend); - start = (start + PAGE_SIZE) & ~(PAGE_SIZE - 1); - } -} - -void flush_cache_page(struct vm_area_struct *vma, - unsigned long addr, unsigned long pfn) -{ - int exec = vma->vm_flags & VM_EXEC; - unsigned long kaddr = 0xa0000000 | (pfn << PAGE_SHIFT); - - flush_dcache_range(kaddr, kaddr + PAGE_SIZE); - - if (exec) - flush_icache_range(kaddr, kaddr + PAGE_SIZE); -} - -void flush_cache_sigtramp(unsigned long addr) -{ - __asm__ __volatile__( - "cache 0x02, [%0, 0]\n" - "nop\nnop\nnop\nnop\nnop\n" - "cache 0x02, [%0, 0x4]\n" - "nop\nnop\nnop\nnop\nnop\n" - - "cache 0x0d, [%0, 0]\n" - "nop\nnop\nnop\nnop\nnop\n" - "cache 0x0d, [%0, 0x4]\n" - "nop\nnop\nnop\nnop\nnop\n" - - "cache 0x1a, [%0, 0]\n" - "nop\nnop\nnop\nnop\nnop\n" - : : "r" (addr)); -} - -/* -1. WB and invalid a cache line of Dcache -2. Drain Write Buffer -the range must be smaller than PAGE_SIZE -*/ -void flush_dcache_range(unsigned long start, unsigned long end) -{ - int size, i; - - start = start & ~(L1_CACHE_BYTES - 1); - end = end & ~(L1_CACHE_BYTES - 1); - size = end - start; - /* flush dcache to ram, and invalidate dcache lines. */ - for (i = 0; i < size; i += L1_CACHE_BYTES) { - __asm__ __volatile__( - "cache 0x0e, [%0, 0]\n" - "nop\nnop\nnop\nnop\nnop\n" - "cache 0x1a, [%0, 0]\n" - "nop\nnop\nnop\nnop\nnop\n" - : : "r" (start)); - start += L1_CACHE_BYTES; - } -} - -void flush_icache_range(unsigned long start, unsigned long end) -{ - int size, i; - start = start & ~(L1_CACHE_BYTES - 1); - end = end & ~(L1_CACHE_BYTES - 1); - - size = end - start; - /* invalidate icache lines. */ - for (i = 0; i < size; i += L1_CACHE_BYTES) { - __asm__ __volatile__( - "cache 0x02, [%0, 0]\n" - "nop\nnop\nnop\nnop\nnop\n" - : : "r" (start)); - start += L1_CACHE_BYTES; - } -} -EXPORT_SYMBOL(flush_icache_range); diff --git a/arch/score/mm/extable.c b/arch/score/mm/extable.c deleted file mode 100644 index 6736a3ad6286..000000000000 --- a/arch/score/mm/extable.c +++ /dev/null @@ -1,40 +0,0 @@ -/* - * arch/score/mm/extable.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/extable.h> -#include <linux/ptrace.h> -#include <asm/extable.h> - -int fixup_exception(struct pt_regs *regs) -{ - const struct exception_table_entry *fixup; - - fixup = search_exception_tables(regs->cp0_epc); - if (fixup) { - regs->cp0_epc = fixup->fixup; - return 1; - } - return 0; -} diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c deleted file mode 100644 index b85fad4f0874..000000000000 --- a/arch/score/mm/fault.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * arch/score/mm/fault.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/errno.h> -#include <linux/interrupt.h> -#include <linux/kernel.h> -#include <linux/mm.h> -#include <linux/mman.h> -#include <linux/extable.h> -#include <linux/signal.h> -#include <linux/sched.h> -#include <linux/string.h> -#include <linux/types.h> -#include <linux/ptrace.h> -#include <linux/uaccess.h> - -/* - * This routine handles page faults. It determines the address, - * and the problem, and then passes it off to one of the appropriate - * routines. - */ -asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write, - unsigned long address) -{ - struct vm_area_struct *vma = NULL; - struct task_struct *tsk = current; - struct mm_struct *mm = tsk->mm; - const int field = sizeof(unsigned long) * 2; - unsigned long flags = 0; - siginfo_t info; - int fault; - - info.si_code = SEGV_MAPERR; - - /* - * We fault-in kernel-space virtual memory on-demand. The - * 'reference' page table is init_mm.pgd. - * - * NOTE! We MUST NOT take any locks for this case. We may - * be in an interrupt or a critical region, and should - * only copy the information from the master page table, - * nothing more. - */ - if (unlikely(address >= VMALLOC_START && address <= VMALLOC_END)) - goto vmalloc_fault; -#ifdef MODULE_START - if (unlikely(address >= MODULE_START && address < MODULE_END)) - goto vmalloc_fault; -#endif - - /* - * If we're in an interrupt or have no user - * context, we must not take the fault.. - */ - if (pagefault_disabled() || !mm) - goto bad_area_nosemaphore; - - if (user_mode(regs)) - flags |= FAULT_FLAG_USER; - - down_read(&mm->mmap_sem); - vma = find_vma(mm, address); - if (!vma) - goto bad_area; - if (vma->vm_start <= address) - goto good_area; - if (!(vma->vm_flags & VM_GROWSDOWN)) - goto bad_area; - if (expand_stack(vma, address)) - goto bad_area; - /* - * Ok, we have a good vm_area for this memory access, so - * we can handle it.. - */ -good_area: - info.si_code = SEGV_ACCERR; - - if (write) { - if (!(vma->vm_flags & VM_WRITE)) - goto bad_area; - flags |= FAULT_FLAG_WRITE; - } else { - if (!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC))) - goto bad_area; - } - - /* - * If for any reason at all we couldn't handle the fault, - * make sure we exit gracefully rather than endlessly redo - * the fault. - */ - fault = handle_mm_fault(vma, address, flags); - if (unlikely(fault & VM_FAULT_ERROR)) { - if (fault & VM_FAULT_OOM) - goto out_of_memory; - else if (fault & VM_FAULT_SIGSEGV) - goto bad_area; - else if (fault & VM_FAULT_SIGBUS) - goto do_sigbus; - BUG(); - } - if (fault & VM_FAULT_MAJOR) - tsk->maj_flt++; - else - tsk->min_flt++; - - up_read(&mm->mmap_sem); - return; - - /* - * Something tried to access memory that isn't in our memory map.. - * Fix it, but check if it's kernel or user first.. - */ -bad_area: - up_read(&mm->mmap_sem); - -bad_area_nosemaphore: - /* User mode accesses just cause a SIGSEGV */ - if (user_mode(regs)) { - tsk->thread.cp0_badvaddr = address; - tsk->thread.error_code = write; - info.si_signo = SIGSEGV; - info.si_errno = 0; - /* info.si_code has been set above */ - info.si_addr = (void __user *) address; - force_sig_info(SIGSEGV, &info, tsk); - return; - } - -no_context: - /* Are we prepared to handle this kernel fault? */ - if (fixup_exception(regs)) { - current->thread.cp0_baduaddr = address; - return; - } - - /* - * Oops. The kernel tried to access some bad page. We'll have to - * terminate things with extreme prejudice. - */ - bust_spinlocks(1); - - printk(KERN_ALERT "CPU %d Unable to handle kernel paging request at " - "virtual address %0*lx, epc == %0*lx, ra == %0*lx\n", - 0, field, address, field, regs->cp0_epc, - field, regs->regs[3]); - die("Oops", regs); - - /* - * We ran out of memory, or some other thing happened to us that made - * us unable to handle the page fault gracefully. - */ -out_of_memory: - up_read(&mm->mmap_sem); - if (!user_mode(regs)) - goto no_context; - pagefault_out_of_memory(); - return; - -do_sigbus: - up_read(&mm->mmap_sem); - /* Kernel mode? Handle exceptions or die */ - if (!user_mode(regs)) - goto no_context; - else - /* - * Send a sigbus, regardless of whether we were in kernel - * or user mode. - */ - tsk->thread.cp0_badvaddr = address; - info.si_signo = SIGBUS; - info.si_errno = 0; - info.si_code = BUS_ADRERR; - info.si_addr = (void __user *) address; - force_sig_info(SIGBUS, &info, tsk); - return; -vmalloc_fault: - { - /* - * Synchronize this task's top level page-table - * with the 'reference' page table. - * - * Do _not_ use "tsk" here. We might be inside - * an interrupt in the middle of a task switch.. - */ - int offset = __pgd_offset(address); - pgd_t *pgd, *pgd_k; - pud_t *pud, *pud_k; - pmd_t *pmd, *pmd_k; - pte_t *pte_k; - - pgd = (pgd_t *) pgd_current + offset; - pgd_k = init_mm.pgd + offset; - - if (!pgd_present(*pgd_k)) - goto no_context; - set_pgd(pgd, *pgd_k); - - pud = pud_offset(pgd, address); - pud_k = pud_offset(pgd_k, address); - if (!pud_present(*pud_k)) - goto no_context; - - pmd = pmd_offset(pud, address); - pmd_k = pmd_offset(pud_k, address); - if (!pmd_present(*pmd_k)) - goto no_context; - set_pmd(pmd, *pmd_k); - - pte_k = pte_offset_kernel(pmd_k, address); - if (!pte_present(*pte_k)) - goto no_context; - return; - } -} diff --git a/arch/score/mm/init.c b/arch/score/mm/init.c deleted file mode 100644 index 444c26c0f750..000000000000 --- a/arch/score/mm/init.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * arch/score/mm/init.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/errno.h> -#include <linux/bootmem.h> -#include <linux/kernel.h> -#include <linux/gfp.h> -#include <linux/init.h> -#include <linux/mm.h> -#include <linux/mman.h> -#include <linux/pagemap.h> -#include <linux/kcore.h> -#include <linux/sched.h> -#include <linux/initrd.h> - -#include <asm/sections.h> -#include <asm/tlb.h> - -unsigned long empty_zero_page; -EXPORT_SYMBOL_GPL(empty_zero_page); - -static void setup_zero_page(void) -{ - struct page *page; - - empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, 0); - if (!empty_zero_page) - panic("Oh boy, that early out of memory?"); - - page = virt_to_page((void *) empty_zero_page); - mark_page_reserved(page); -} - -#ifndef CONFIG_NEED_MULTIPLE_NODES -int page_is_ram(unsigned long pagenr) -{ - if (pagenr >= min_low_pfn && pagenr < max_low_pfn) - return 1; - else - return 0; -} - -void __init paging_init(void) -{ - unsigned long max_zone_pfns[MAX_NR_ZONES]; - unsigned long lastpfn; - - pagetable_init(); - max_zone_pfns[ZONE_NORMAL] = max_low_pfn; - lastpfn = max_low_pfn; - free_area_init_nodes(max_zone_pfns); -} - -void __init mem_init(void) -{ - high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); - free_all_bootmem(); - setup_zero_page(); /* Setup zeroed pages. */ - - mem_init_print_info(NULL); -} -#endif /* !CONFIG_NEED_MULTIPLE_NODES */ - -#ifdef CONFIG_BLK_DEV_INITRD -void free_initrd_mem(unsigned long start, unsigned long end) -{ - free_reserved_area((void *)start, (void *)end, POISON_FREE_INITMEM, - "initrd"); -} -#endif - -void __ref free_initmem(void) -{ - free_initmem_default(POISON_FREE_INITMEM); -} - -unsigned long pgd_current; - -#define __page_aligned(order) __attribute__((__aligned__(PAGE_SIZE<<order))) - -/* - * gcc 3.3 and older have trouble determining that PTRS_PER_PGD and PGD_ORDER - * are constants. So we use the variants from asm-offset.h until that gcc - * will officially be retired. - */ -pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned(PTE_ORDER); -pte_t invalid_pte_table[PTRS_PER_PTE] __page_aligned(PTE_ORDER); diff --git a/arch/score/mm/pgtable.c b/arch/score/mm/pgtable.c deleted file mode 100644 index 6408bb73d3cc..000000000000 --- a/arch/score/mm/pgtable.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * arch/score/mm/pgtable-32.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/bootmem.h> -#include <linux/init.h> -#include <linux/pfn.h> -#include <linux/mm.h> - -void pgd_init(unsigned long page) -{ - unsigned long *p = (unsigned long *) page; - int i; - - for (i = 0; i < USER_PTRS_PER_PGD; i += 8) { - p[i + 0] = (unsigned long) invalid_pte_table; - p[i + 1] = (unsigned long) invalid_pte_table; - p[i + 2] = (unsigned long) invalid_pte_table; - p[i + 3] = (unsigned long) invalid_pte_table; - p[i + 4] = (unsigned long) invalid_pte_table; - p[i + 5] = (unsigned long) invalid_pte_table; - p[i + 6] = (unsigned long) invalid_pte_table; - p[i + 7] = (unsigned long) invalid_pte_table; - } -} - -void __init pagetable_init(void) -{ - /* Initialize the entire pgd. */ - pgd_init((unsigned long)swapper_pg_dir); -} diff --git a/arch/score/mm/tlb-miss.S b/arch/score/mm/tlb-miss.S deleted file mode 100644 index f27651914e8d..000000000000 --- a/arch/score/mm/tlb-miss.S +++ /dev/null @@ -1,199 +0,0 @@ -/* - * arch/score/mm/tlbex.S - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <asm/asmmacro.h> -#include <asm/pgtable-bits.h> -#include <asm/scoreregs.h> - -/* -* After this macro runs, the pte faulted on is -* in register PTE, a ptr into the table in which -* the pte belongs is in PTR. -*/ - .macro load_pte, pte, ptr - la \ptr, pgd_current - lw \ptr, [\ptr, 0] - mfcr \pte, cr6 - srli \pte, \pte, 22 - slli \pte, \pte, 2 - add \ptr, \ptr, \pte - lw \ptr, [\ptr, 0] - mfcr \pte, cr6 - srli \pte, \pte, 10 - andi \pte, 0xffc - add \ptr, \ptr, \pte - lw \pte, [\ptr, 0] - .endm - - .macro pte_reload, ptr - lw \ptr, [\ptr, 0] - mtcr \ptr, cr12 - nop - nop - nop - nop - nop - .endm - - .macro do_fault, write - SAVE_ALL - mfcr r6, cr6 - mv r4, r0 - ldi r5, \write - la r8, do_page_fault - brl r8 - j ret_from_exception - .endm - - .macro pte_writable, pte, ptr, label - andi \pte, 0x280 - cmpi.c \pte, 0x280 - bne \label - lw \pte, [\ptr, 0] /*reload PTE*/ - .endm - -/* - * Make PTE writable, update software status bits as well, - * then store at PTR. - */ - .macro pte_makewrite, pte, ptr - ori \pte, 0x426 - sw \pte, [\ptr, 0] - .endm - - .text -ENTRY(score7_FTLB_refill_Handler) - la r31, pgd_current /* get pgd pointer */ - lw r31, [r31, 0] /* get the address of PGD */ - mfcr r30, cr6 - srli r30, r30, 22 /* PGDIR_SHIFT = 22*/ - slli r30, r30, 2 - add r31, r31, r30 - lw r31, [r31, 0] /* get the address of the start address of PTE table */ - - mfcr r30, cr9 - andi r30, 0xfff /* equivalent to get PET index and right shift 2 bits */ - add r31, r31, r30 - lw r30, [r31, 0] /* load pte entry */ - mtcr r30, cr12 - nop - nop - nop - nop - nop - mtrtlb - nop - nop - nop - nop - nop - rte /* 6 cycles to make sure tlb entry works */ - -ENTRY(score7_KSEG_refill_Handler) - la r31, pgd_current /* get pgd pointer */ - lw r31, [r31, 0] /* get the address of PGD */ - mfcr r30, cr6 - srli r30, r30, 22 /* PGDIR_SHIFT = 22 */ - slli r30, r30, 2 - add r31, r31, r30 - lw r31, [r31, 0] /* get the address of the start address of PTE table */ - - mfcr r30, cr6 /* get Bad VPN */ - srli r30, r30, 10 - andi r30, 0xffc /* PTE VPN mask (bit 11~2) */ - - add r31, r31, r30 - lw r30, [r31, 0] /* load pte entry */ - mtcr r30, cr12 - nop - nop - nop - nop - nop - mtrtlb - nop - nop - nop - nop - nop - rte /* 6 cycles to make sure tlb entry works */ - -nopage_tlbl: - do_fault 0 /* Read */ - -ENTRY(handle_tlb_refill) - load_pte r30, r31 - pte_writable r30, r31, handle_tlb_refill_nopage - pte_makewrite r30, r31 /* Access|Modify|Dirty|Valid */ - pte_reload r31 - mtrtlb - nop - nop - nop - nop - nop - rte -handle_tlb_refill_nopage: - do_fault 0 /* Read */ - -ENTRY(handle_tlb_invaild) - load_pte r30, r31 - stlb /* find faulting entry */ - pte_writable r30, r31, handle_tlb_invaild_nopage - pte_makewrite r30, r31 /* Access|Modify|Dirty|Valid */ - pte_reload r31 - mtptlb - nop - nop - nop - nop - nop - rte -handle_tlb_invaild_nopage: - do_fault 0 /* Read */ - -ENTRY(handle_mod) - load_pte r30, r31 - stlb /* find faulting entry */ - andi r30, _PAGE_WRITE /* Writable? */ - cmpz.c r30 - beq nowrite_mod - lw r30, [r31, 0] /* reload into r30 */ - - /* Present and writable bits set, set accessed and dirty bits. */ - pte_makewrite r30, r31 - - /* Now reload the entry into the tlb. */ - pte_reload r31 - mtptlb - nop - nop - nop - nop - nop - rte - -nowrite_mod: - do_fault 1 /* Write */ diff --git a/arch/score/mm/tlb-score.c b/arch/score/mm/tlb-score.c deleted file mode 100644 index 004073717de0..000000000000 --- a/arch/score/mm/tlb-score.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * arch/score/mm/tlb-score.c - * - * Score Processor version. - * - * Copyright (C) 2009 Sunplus Core Technology Co., Ltd. - * Lennox Wu <lennox.wu@sunplusct.com> - * Chen Liqin <liqin.chen@sunplusct.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/highmem.h> -#include <linux/module.h> - -#include <asm/irq.h> -#include <asm/mmu_context.h> -#include <asm/tlb.h> - -#define TLBSIZE 32 - -unsigned long asid_cache = ASID_FIRST_VERSION; -EXPORT_SYMBOL(asid_cache); - -void local_flush_tlb_all(void) -{ - unsigned long flags; - unsigned long old_ASID; - int entry; - - local_irq_save(flags); - old_ASID = pevn_get() & ASID_MASK; - pectx_set(0); /* invalid */ - entry = tlblock_get(); /* skip locked entries*/ - - for (; entry < TLBSIZE; entry++) { - tlbpt_set(entry); - pevn_set(KSEG1); - barrier(); - tlb_write_indexed(); - } - pevn_set(old_ASID); - local_irq_restore(flags); -} - -/* - * If mm is currently active_mm, we can't really drop it. Instead, - * we will get a new one for it. - */ -static inline void -drop_mmu_context(struct mm_struct *mm) -{ - unsigned long flags; - - local_irq_save(flags); - get_new_mmu_context(mm); - pevn_set(mm->context & ASID_MASK); - local_irq_restore(flags); -} - -void local_flush_tlb_mm(struct mm_struct *mm) -{ - if (mm->context != 0) - drop_mmu_context(mm); -} - -void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, - unsigned long end) -{ - struct mm_struct *mm = vma->vm_mm; - unsigned long vma_mm_context = mm->context; - if (mm->context != 0) { - unsigned long flags; - int size; - - local_irq_save(flags); - size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; - if (size <= TLBSIZE) { - int oldpid = pevn_get() & ASID_MASK; - int newpid = vma_mm_context & ASID_MASK; - - start &= PAGE_MASK; - end += (PAGE_SIZE - 1); - end &= PAGE_MASK; - while (start < end) { - int idx; - - pevn_set(start | newpid); - start += PAGE_SIZE; - barrier(); - tlb_probe(); - idx = tlbpt_get(); - pectx_set(0); - pevn_set(KSEG1); - if (idx < 0) - continue; - tlb_write_indexed(); - } - pevn_set(oldpid); - } else { - /* Bigger than TLBSIZE, get new ASID directly */ - get_new_mmu_context(mm); - if (mm == current->active_mm) - pevn_set(vma_mm_context & ASID_MASK); - } - local_irq_restore(flags); - } -} - -void local_flush_tlb_kernel_range(unsigned long start, unsigned long end) -{ - unsigned long flags; - int size; - - local_irq_save(flags); - size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; - if (size <= TLBSIZE) { - int pid = pevn_get(); - - start &= PAGE_MASK; - end += PAGE_SIZE - 1; - end &= PAGE_MASK; - - while (start < end) { - long idx; - - pevn_set(start); - start += PAGE_SIZE; - tlb_probe(); - idx = tlbpt_get(); - if (idx < 0) - continue; - pectx_set(0); - pevn_set(KSEG1); - barrier(); - tlb_write_indexed(); - } - pevn_set(pid); - } else { - local_flush_tlb_all(); - } - - local_irq_restore(flags); -} - -void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) -{ - if (vma && vma->vm_mm->context != 0) { - unsigned long flags; - int oldpid, newpid, idx; - unsigned long vma_ASID = vma->vm_mm->context; - - newpid = vma_ASID & ASID_MASK; - page &= PAGE_MASK; - local_irq_save(flags); - oldpid = pevn_get() & ASID_MASK; - pevn_set(page | newpid); - barrier(); - tlb_probe(); - idx = tlbpt_get(); - pectx_set(0); - pevn_set(KSEG1); - if (idx < 0) /* p_bit(31) - 1: miss, 0: hit*/ - goto finish; - barrier(); - tlb_write_indexed(); -finish: - pevn_set(oldpid); - local_irq_restore(flags); - } -} - -/* - * This one is only used for pages with the global bit set so we don't care - * much about the ASID. - */ -void local_flush_tlb_one(unsigned long page) -{ - unsigned long flags; - int oldpid, idx; - - local_irq_save(flags); - oldpid = pevn_get(); - page &= (PAGE_MASK << 1); - pevn_set(page); - barrier(); - tlb_probe(); - idx = tlbpt_get(); - pectx_set(0); - if (idx >= 0) { - /* Make sure all entries differ. */ - pevn_set(KSEG1); - barrier(); - tlb_write_indexed(); - } - pevn_set(oldpid); - local_irq_restore(flags); -} - -void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) -{ - unsigned long flags; - int idx, pid; - - /* - * Handle debugger faulting in for debugee. - */ - if (current->active_mm != vma->vm_mm) - return; - - pid = pevn_get() & ASID_MASK; - - local_irq_save(flags); - address &= PAGE_MASK; - pevn_set(address | pid); - barrier(); - tlb_probe(); - idx = tlbpt_get(); - pectx_set(pte_val(pte)); - pevn_set(address | pid); - if (idx < 0) - tlb_write_random(); - else - tlb_write_indexed(); - - pevn_set(pid); - local_irq_restore(flags); -} - -void tlb_init(void) -{ - tlblock_set(0); - local_flush_tlb_all(); - memcpy((void *)(EXCEPTION_VECTOR_BASE_ADDR + 0x100), - &score7_FTLB_refill_Handler, 0xFC); - flush_icache_range(EXCEPTION_VECTOR_BASE_ADDR + 0x100, - EXCEPTION_VECTOR_BASE_ADDR + 0x1FC); -} |