mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
Merge branch 'for-linus' of git://gitserver.sunplusct.com/linux-2.6-score
* 'for-linus' of git://gitserver.sunplusct.com/linux-2.6-score: (22 commits) score: add TIF_NOTIFY_RESUME define in asm/thread_info.h score: make init_thread_union align to THREAD_SIZE score: update files according to review comments. score: add old syscall support score: add MEMORY_START and MEMORY_SIZE define, to make the code clear score: update inconsistent declare after .c was changed score: remove unused code, add include files in .c score: clean up mm/init.c score: make irq.h definitions local score: cleanups: dead code, 0 as pointer, shadowed variables score: fix function prototypes score: add address space annotations score: add missing #includes score: move save arg5 and arg6 instruction in front of enable_irq score: add prototypes for wrapped syscalls score: remove init_mm score: add generic sys_call_table score: remove __{put,get}_user_unknown score: unset __ARCH_WANT_IPC_PARSE_VERSION score: update files according to review comments ...
This commit is contained in:
commit
81ce31b773
@ -4454,6 +4454,14 @@ S: Maintained
|
||||
F: kernel/sched*
|
||||
F: include/linux/sched.h
|
||||
|
||||
SCORE ARCHITECTURE
|
||||
P: Chen Liqin
|
||||
M: liqin.chen@sunplusct.com
|
||||
P: Lennox Wu
|
||||
M: lennox.wu@sunplusct.com
|
||||
W: http://www.sunplusct.com
|
||||
S: Supported
|
||||
|
||||
SCSI CDROM DRIVER
|
||||
M: Jens Axboe <axboe@kernel.dk>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
|
141
arch/score/Kconfig
Normal file
141
arch/score/Kconfig
Normal file
@ -0,0 +1,141 @@
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see Documentation/kbuild/kconfig-language.txt.
|
||||
|
||||
mainmenu "Linux/SCORE Kernel Configuration"
|
||||
|
||||
menu "Machine selection"
|
||||
|
||||
choice
|
||||
prompt "System type"
|
||||
default MACH_SPCT6600
|
||||
|
||||
config ARCH_SCORE7
|
||||
bool "SCORE7 processor"
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SCORE7
|
||||
select GENERIC_HAS_IOMAP
|
||||
|
||||
config MACH_SPCT6600
|
||||
bool "SPCT6600 series based machines"
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SCORE7
|
||||
select GENERIC_HAS_IOMAP
|
||||
|
||||
config SCORE_SIM
|
||||
bool "Score simulator"
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SCORE7
|
||||
select GENERIC_HAS_IOMAP
|
||||
endchoice
|
||||
|
||||
endmenu
|
||||
|
||||
config CPU_SCORE7
|
||||
bool
|
||||
|
||||
config GENERIC_IOMAP
|
||||
def_bool y
|
||||
|
||||
config NO_DMA
|
||||
bool
|
||||
default y
|
||||
|
||||
config RWSEM_GENERIC_SPINLOCK
|
||||
def_bool y
|
||||
|
||||
config GENERIC_FIND_NEXT_BIT
|
||||
def_bool y
|
||||
|
||||
config GENERIC_HWEIGHT
|
||||
def_bool y
|
||||
|
||||
config GENERIC_CALIBRATE_DELAY
|
||||
def_bool y
|
||||
|
||||
config GENERIC_CLOCKEVENTS
|
||||
def_bool y
|
||||
|
||||
config GENERIC_TIME
|
||||
def_bool y
|
||||
|
||||
config SCHED_NO_NO_OMIT_FRAME_POINTER
|
||||
def_bool y
|
||||
|
||||
config GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
def_bool y
|
||||
|
||||
config GENERIC_SYSCALL_TABLE
|
||||
def_bool y
|
||||
|
||||
config SCORE_L1_CACHE_SHIFT
|
||||
int
|
||||
default "4"
|
||||
|
||||
menu "Kernel type"
|
||||
|
||||
config 32BIT
|
||||
def_bool y
|
||||
|
||||
config GENERIC_HARDIRQS
|
||||
def_bool y
|
||||
|
||||
config ARCH_FLATMEM_ENABLE
|
||||
def_bool y
|
||||
|
||||
config ARCH_POPULATES_NODE_MAP
|
||||
def_bool y
|
||||
|
||||
source "mm/Kconfig"
|
||||
|
||||
config MEMORY_START
|
||||
hex
|
||||
default 0xa0000000
|
||||
|
||||
source "kernel/time/Kconfig"
|
||||
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"
|
||||
|
||||
config PROBE_INITRD_HEADER
|
||||
bool "Probe initrd header created by addinitrd"
|
||||
depends on BLK_DEV_INITRD
|
||||
help
|
||||
Probe initrd header at the last page of kernel image.
|
||||
Say Y here if you are using arch/score/boot/addinitrd.c to
|
||||
add initrd or initramfs image to the kernel image.
|
||||
Otherwise, say N.
|
||||
|
||||
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"
|
37
arch/score/Kconfig.debug
Normal file
37
arch/score/Kconfig.debug
Normal file
@ -0,0 +1,37 @@
|
||||
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 DEBUG_STACK_USAGE
|
||||
bool "Enable stack utilization instrumentation"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Enables the display of the minimum amount of free stack which each
|
||||
task has ever had available in the sysrq-T and sysrq-P debug output.
|
||||
|
||||
This option will slow down process creation somewhat.
|
||||
|
||||
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 debuging macros.
|
||||
If unsure, say N.
|
||||
|
||||
endmenu
|
43
arch/score/Makefile
Normal file
43
arch/score/Makefile
Normal file
@ -0,0 +1,43 @@
|
||||
#
|
||||
# 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)
|
||||
MODFLAGS += -mlong-calls
|
||||
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 apropriate for a configured platform.'
|
||||
endef
|
15
arch/score/boot/Makefile
Normal file
15
arch/score/boot/Makefile
Normal file
@ -0,0 +1,15 @@
|
||||
#
|
||||
# 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
|
717
arch/score/configs/spct6600_defconfig
Normal file
717
arch/score/configs/spct6600_defconfig
Normal file
@ -0,0 +1,717 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.30-rc5
|
||||
# Fri Jun 12 18:57:07 2009
|
||||
#
|
||||
|
||||
#
|
||||
# Machine selection
|
||||
#
|
||||
# CONFIG_ARCH_SCORE7 is not set
|
||||
CONFIG_MACH_SPCT6600=y
|
||||
# CONFIG_SCORE_SIM is not set
|
||||
CONFIG_CPU_SCORE7=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_NO_DMA=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_GENERIC_SYSCALL_TABLE=y
|
||||
CONFIG_SCORE_L1_CACHE_SHIFT=4
|
||||
|
||||
#
|
||||
# Kernel type
|
||||
#
|
||||
CONFIG_32BIT=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
CONFIG_UNEVICTABLE_LRU=y
|
||||
CONFIG_HAVE_MLOCK=y
|
||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
||||
CONFIG_MEMORY_START=0xa0000000
|
||||
# CONFIG_NO_HZ is not set
|
||||
# CONFIG_HIGH_RES_TIMERS is not set
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_HZ_100=y
|
||||
# CONFIG_HZ_250 is not set
|
||||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=100
|
||||
# CONFIG_SCHED_HRTICK is not set
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
CONFIG_LOCALVERSION=""
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_SYSVIPC_SYSCTL=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_POSIX_MQUEUE_SYSCTL=y
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
|
||||
#
|
||||
# RCU Subsystem
|
||||
#
|
||||
CONFIG_CLASSIC_RCU=y
|
||||
# CONFIG_TREE_RCU is not set
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
# CONFIG_TREE_RCU_TRACE is not set
|
||||
# CONFIG_PREEMPT_RCU_TRACE is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_LOG_BUF_SHIFT=12
|
||||
# CONFIG_GROUP_SCHED is not set
|
||||
# CONFIG_CGROUPS is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
CONFIG_SYSFS_DEPRECATED_V2=y
|
||||
# CONFIG_RELAY is not set
|
||||
# CONFIG_NAMESPACES is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_RD_GZIP=y
|
||||
# CONFIG_RD_BZIP2 is not set
|
||||
# CONFIG_RD_LZMA is not set
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
# CONFIG_KALLSYMS is not set
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SIGNALFD=y
|
||||
CONFIG_TIMERFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_AIO=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_COMPAT_BRK=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
# CONFIG_SLOW_WORK is not set
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
CONFIG_BASE_SMALL=0
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_FORCE_LOAD=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_BLOCK=y
|
||||
CONFIG_LBD=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_DEFAULT_AS is not set
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
# CONFIG_PROBE_INITRD_HEADER is not set
|
||||
CONFIG_MMU=y
|
||||
|
||||
#
|
||||
# Executable file formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
# CONFIG_HAVE_AOUT is not set
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_PACKET is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
# CONFIG_XFRM_USER is not set
|
||||
# CONFIG_XFRM_SUB_POLICY is not set
|
||||
# CONFIG_XFRM_MIGRATE is not set
|
||||
# CONFIG_XFRM_STATISTICS is not set
|
||||
CONFIG_NET_KEY=y
|
||||
# CONFIG_NET_KEY_MIGRATE is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
CONFIG_ARPD=y
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_XFRM_MODE_BEET=y
|
||||
# CONFIG_INET_LRO is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETLABEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
# CONFIG_IP_DCCP is not set
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_NET_DSA is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_PHONET is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_DCB is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_CAN is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
# CONFIG_WIRELESS is not set
|
||||
# CONFIG_WIMAX is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
# CONFIG_STANDALONE is not set
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
# CONFIG_CONNECTOR is not set
|
||||
# CONFIG_MTD is not set
|
||||
# CONFIG_PARPORT is not set
|
||||
CONFIG_BLK_DEV=y
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=1
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
# CONFIG_BLK_DEV_XIP is not set
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
# CONFIG_MD is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_COMPAT_NET_DEV_OPS=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_MACVLAN is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
# CONFIG_VETH is not set
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
|
||||
#
|
||||
# Wireless LAN
|
||||
#
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
|
||||
#
|
||||
# Enable WiMAX (Networking options) to see the WiMAX drivers
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_ISDN is not set
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
# CONFIG_INPUT_FF_MEMLESS is not set
|
||||
# CONFIG_INPUT_POLLDEV is not set
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TABLET is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_CONSOLE_TRANSLATIONS=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
CONFIG_DEVKMEM=y
|
||||
CONFIG_SERIAL_NONSTANDARD=y
|
||||
# CONFIG_N_HDLC is not set
|
||||
# CONFIG_RISCOM8 is not set
|
||||
# CONFIG_SPECIALIX is not set
|
||||
# CONFIG_RIO is not set
|
||||
CONFIG_STALDRV=y
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_R3964 is not set
|
||||
CONFIG_RAW_DRIVER=y
|
||||
CONFIG_MAX_RAW_DEVS=8192
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
|
||||
#
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_CORE is not set
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
# CONFIG_HTC_PASIC3 is not set
|
||||
# CONFIG_MFD_TMIO is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia core support
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
# CONFIG_VIDEO_MEDIA is not set
|
||||
|
||||
#
|
||||
# Multimedia drivers
|
||||
#
|
||||
# CONFIG_DAB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Display device support
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_SOUND is not set
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
# CONFIG_MMC is not set
|
||||
# CONFIG_MEMSTICK is not set
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
# CONFIG_ACCESSIBILITY is not set
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
# CONFIG_UIO is not set
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
# CONFIG_EXT2_FS_SECURITY is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
# CONFIG_EXT3_FS_SECURITY is not set
|
||||
# CONFIG_EXT4_FS is not set
|
||||
CONFIG_JBD=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_FILE_LOCKING=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_AUTOFS_FS=y
|
||||
CONFIG_AUTOFS4_FS=y
|
||||
# CONFIG_FUSE_FS is not set
|
||||
CONFIG_GENERIC_ACL=y
|
||||
|
||||
#
|
||||
# Caches
|
||||
#
|
||||
# CONFIG_FSCACHE is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
# CONFIG_PROC_PAGE_MONITOR is not set
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
CONFIG_MISC_FILESYSTEMS=y
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_ECRYPT_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_SQUASHFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_OMFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
# CONFIG_NILFS2_FS is not set
|
||||
CONFIG_NETWORK_FILESYSTEMS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V2_ACL=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=y
|
||||
CONFIG_NFS_ACL_SUPPORT=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
CONFIG_SUNRPC_GSS=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=y
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
# CONFIG_NLS is not set
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_FRAME_WARN=1024
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
# CONFIG_DEBUG_MEMORY_INIT is not set
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
|
||||
#
|
||||
# Tracers
|
||||
#
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||
# CONFIG_EVENT_TRACER is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
# CONFIG_TRACE_BRANCH_PROFILING is not set
|
||||
# CONFIG_KMEMTRACE is not set
|
||||
# CONFIG_WORKQUEUE_TRACER is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_CMDLINE=""
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
CONFIG_KEYS=y
|
||||
CONFIG_KEYS_DEBUG_PROC_KEYS=y
|
||||
CONFIG_SECURITY=y
|
||||
# CONFIG_SECURITYFS is not set
|
||||
CONFIG_SECURITY_NETWORK=y
|
||||
# CONFIG_SECURITY_NETWORK_XFRM is not set
|
||||
# CONFIG_SECURITY_PATH is not set
|
||||
CONFIG_SECURITY_FILE_CAPABILITIES=y
|
||||
CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
|
||||
# CONFIG_SECURITY_TOMOYO is not set
|
||||
CONFIG_CRYPTO=y
|
||||
|
||||
#
|
||||
# Crypto core or helper
|
||||
#
|
||||
# CONFIG_CRYPTO_FIPS is not set
|
||||
CONFIG_CRYPTO_ALGAPI=y
|
||||
CONFIG_CRYPTO_ALGAPI2=y
|
||||
CONFIG_CRYPTO_AEAD=y
|
||||
CONFIG_CRYPTO_AEAD2=y
|
||||
CONFIG_CRYPTO_BLKCIPHER=y
|
||||
CONFIG_CRYPTO_BLKCIPHER2=y
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_RNG=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_PCOMP=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_MANAGER2=y
|
||||
# CONFIG_CRYPTO_GF128MUL is not set
|
||||
CONFIG_CRYPTO_NULL=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_CRYPTO_CRYPTD=y
|
||||
# CONFIG_CRYPTO_AUTHENC is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
|
||||
#
|
||||
# Authenticated Encryption with Associated Data
|
||||
#
|
||||
# CONFIG_CRYPTO_CCM is not set
|
||||
# CONFIG_CRYPTO_GCM is not set
|
||||
CONFIG_CRYPTO_SEQIV=y
|
||||
|
||||
#
|
||||
# Block modes
|
||||
#
|
||||
CONFIG_CRYPTO_CBC=y
|
||||
# CONFIG_CRYPTO_CTR is not set
|
||||
# CONFIG_CRYPTO_CTS is not set
|
||||
# CONFIG_CRYPTO_ECB is not set
|
||||
# CONFIG_CRYPTO_LRW is not set
|
||||
# CONFIG_CRYPTO_PCBC is not set
|
||||
# CONFIG_CRYPTO_XTS is not set
|
||||
|
||||
#
|
||||
# Hash modes
|
||||
#
|
||||
# CONFIG_CRYPTO_HMAC is not set
|
||||
# CONFIG_CRYPTO_XCBC is not set
|
||||
|
||||
#
|
||||
# Digest
|
||||
#
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
CONFIG_CRYPTO_MD4=y
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=y
|
||||
# CONFIG_CRYPTO_RMD128 is not set
|
||||
# CONFIG_CRYPTO_RMD160 is not set
|
||||
# CONFIG_CRYPTO_RMD256 is not set
|
||||
# CONFIG_CRYPTO_RMD320 is not set
|
||||
# CONFIG_CRYPTO_SHA1 is not set
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
|
||||
#
|
||||
# Ciphers
|
||||
#
|
||||
# CONFIG_CRYPTO_AES is not set
|
||||
# CONFIG_CRYPTO_ANUBIS is not set
|
||||
# CONFIG_CRYPTO_ARC4 is not set
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_CAMELLIA is not set
|
||||
# CONFIG_CRYPTO_CAST5 is not set
|
||||
# CONFIG_CRYPTO_CAST6 is not set
|
||||
CONFIG_CRYPTO_DES=y
|
||||
# CONFIG_CRYPTO_FCRYPT is not set
|
||||
# CONFIG_CRYPTO_KHAZAD is not set
|
||||
# CONFIG_CRYPTO_SALSA20 is not set
|
||||
# CONFIG_CRYPTO_SEED is not set
|
||||
# CONFIG_CRYPTO_SERPENT is not set
|
||||
# CONFIG_CRYPTO_TEA is not set
|
||||
# CONFIG_CRYPTO_TWOFISH is not set
|
||||
|
||||
#
|
||||
# Compression
|
||||
#
|
||||
# CONFIG_CRYPTO_DEFLATE is not set
|
||||
# CONFIG_CRYPTO_ZLIB is not set
|
||||
# CONFIG_CRYPTO_LZO is not set
|
||||
|
||||
#
|
||||
# Random Number Generation
|
||||
#
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
# CONFIG_BINARY_PRINTF is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_BITREVERSE=y
|
||||
CONFIG_GENERIC_FIND_LAST_BIT=y
|
||||
CONFIG_CRC_CCITT=y
|
||||
CONFIG_CRC16=y
|
||||
# CONFIG_CRC_T10DIF is not set
|
||||
# CONFIG_CRC_ITU_T is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_CRC7 is not set
|
||||
CONFIG_LIBCRC32C=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_DECOMPRESS_GZIP=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_NLATTR=y
|
3
arch/score/include/asm/Kbuild
Normal file
3
arch/score/include/asm/Kbuild
Normal file
@ -0,0 +1,3 @@
|
||||
include include/asm-generic/Kbuild.asm
|
||||
|
||||
header-y +=
|
161
arch/score/include/asm/asmmacro.h
Normal file
161
arch/score/include/asm/asmmacro.h
Normal file
@ -0,0 +1,161 @@
|
||||
#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 */
|
6
arch/score/include/asm/atomic.h
Normal file
6
arch/score/include/asm/atomic.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_ATOMIC_H
|
||||
#define _ASM_SCORE_ATOMIC_H
|
||||
|
||||
#include <asm-generic/atomic.h>
|
||||
|
||||
#endif /* _ASM_SCORE_ATOMIC_H */
|
4
arch/score/include/asm/auxvec.h
Normal file
4
arch/score/include/asm/auxvec.h
Normal file
@ -0,0 +1,4 @@
|
||||
#ifndef _ASM_SCORE_AUXVEC_H
|
||||
#define _ASM_SCORE_AUXVEC_H
|
||||
|
||||
#endif /* _ASM_SCORE_AUXVEC_H */
|
16
arch/score/include/asm/bitops.h
Normal file
16
arch/score/include/asm/bitops.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef _ASM_SCORE_BITOPS_H
|
||||
#define _ASM_SCORE_BITOPS_H
|
||||
|
||||
#include <asm/byteorder.h> /* swab32 */
|
||||
#include <asm/system.h> /* save_flags */
|
||||
|
||||
/*
|
||||
* clear_bit() doesn't provide any barrier for the compiler.
|
||||
*/
|
||||
#define smp_mb__before_clear_bit() barrier()
|
||||
#define smp_mb__after_clear_bit() barrier()
|
||||
|
||||
#include <asm-generic/bitops.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
|
||||
#endif /* _ASM_SCORE_BITOPS_H */
|
6
arch/score/include/asm/bitsperlong.h
Normal file
6
arch/score/include/asm/bitsperlong.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_BITSPERLONG_H
|
||||
#define _ASM_SCORE_BITSPERLONG_H
|
||||
|
||||
#include <asm-generic/bitsperlong.h>
|
||||
|
||||
#endif /* _ASM_SCORE_BITSPERLONG_H */
|
6
arch/score/include/asm/bug.h
Normal file
6
arch/score/include/asm/bug.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_BUG_H
|
||||
#define _ASM_SCORE_BUG_H
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
#endif /* _ASM_SCORE_BUG_H */
|
6
arch/score/include/asm/bugs.h
Normal file
6
arch/score/include/asm/bugs.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_BUGS_H
|
||||
#define _ASM_SCORE_BUGS_H
|
||||
|
||||
#include <asm-generic/bugs.h>
|
||||
|
||||
#endif /* _ASM_SCORE_BUGS_H */
|
6
arch/score/include/asm/byteorder.h
Normal file
6
arch/score/include/asm/byteorder.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_BYTEORDER_H
|
||||
#define _ASM_SCORE_BYTEORDER_H
|
||||
|
||||
#include <linux/byteorder/little_endian.h>
|
||||
|
||||
#endif /* _ASM_SCORE_BYTEORDER_H */
|
7
arch/score/include/asm/cache.h
Normal file
7
arch/score/include/asm/cache.h
Normal file
@ -0,0 +1,7 @@
|
||||
#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 */
|
45
arch/score/include/asm/cacheflush.h
Normal file
45
arch/score/include/asm/cacheflush.h
Normal file
@ -0,0 +1,45 @@
|
||||
#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);
|
||||
|
||||
#define flush_cache_dup_mm(mm) do {} while (0)
|
||||
#define flush_dcache_page(page) do {} while (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 */
|
235
arch/score/include/asm/checksum.h
Normal file
235
arch/score/include/asm/checksum.h
Normal file
@ -0,0 +1,235 @@
|
||||
#ifndef _ASM_SCORE_CHECKSUM_H
|
||||
#define _ASM_SCORE_CHECKSUM_H
|
||||
|
||||
#include <linux/in6.h>
|
||||
#include <asm/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, unsigned short len,
|
||||
unsigned short proto, __wsum sum)
|
||||
{
|
||||
unsigned long tmp = (ntohs(len) << 16) + proto * 256;
|
||||
__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, unsigned short len,
|
||||
unsigned short 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, unsigned short proto,
|
||||
__wsum sum)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
".set\tnoreorder\t\t\t# csum_ipv6_magic\n\t"
|
||||
".set\tnoat\n\t"
|
||||
"addu\t%0, %5\t\t\t# proto (long in network byte order)\n\t"
|
||||
"sltu\t$1, %0, %5\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %6\t\t\t# csum\n\t"
|
||||
"sltu\t$1, %0, %6\n\t"
|
||||
"lw\t%1, 0(%2)\t\t\t# four words source address\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %1\n\t"
|
||||
"sltu\t$1, %0, %1\n\t"
|
||||
"lw\t%1, 4(%2)\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %1\n\t"
|
||||
"sltu\t$1, %0, %1\n\t"
|
||||
"lw\t%1, 8(%2)\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %1\n\t"
|
||||
"sltu\t$1, %0, %1\n\t"
|
||||
"lw\t%1, 12(%2)\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %1\n\t"
|
||||
"sltu\t$1, %0, %1\n\t"
|
||||
"lw\t%1, 0(%3)\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %1\n\t"
|
||||
"sltu\t$1, %0, %1\n\t"
|
||||
"lw\t%1, 4(%3)\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %1\n\t"
|
||||
"sltu\t$1, %0, %1\n\t"
|
||||
"lw\t%1, 8(%3)\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %1\n\t"
|
||||
"sltu\t$1, %0, %1\n\t"
|
||||
"lw\t%1, 12(%3)\n\t"
|
||||
"addu\t%0, $1\n\t"
|
||||
"addu\t%0, %1\n\t"
|
||||
"sltu\t$1, %0, %1\n\t"
|
||||
"addu\t%0, $1\t\t\t# Add final carry\n\t"
|
||||
".set\tnoat\n\t"
|
||||
".set\tnoreorder"
|
||||
: "=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 */
|
6
arch/score/include/asm/cputime.h
Normal file
6
arch/score/include/asm/cputime.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_CPUTIME_H
|
||||
#define _ASM_SCORE_CPUTIME_H
|
||||
|
||||
#include <asm-generic/cputime.h>
|
||||
|
||||
#endif /* _ASM_SCORE_CPUTIME_H */
|
6
arch/score/include/asm/current.h
Normal file
6
arch/score/include/asm/current.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_CURRENT_H
|
||||
#define _ASM_SCORE_CURRENT_H
|
||||
|
||||
#include <asm-generic/current.h>
|
||||
|
||||
#endif /* _ASM_SCORE_CURRENT_H */
|
26
arch/score/include/asm/delay.h
Normal file
26
arch/score/include/asm/delay.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef _ASM_SCORE_DELAY_H
|
||||
#define _ASM_SCORE_DELAY_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 */
|
6
arch/score/include/asm/device.h
Normal file
6
arch/score/include/asm/device.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_DEVICE_H
|
||||
#define _ASM_SCORE_DEVICE_H
|
||||
|
||||
#include <asm-generic/device.h>
|
||||
|
||||
#endif /* _ASM_SCORE_DEVICE_H */
|
6
arch/score/include/asm/div64.h
Normal file
6
arch/score/include/asm/div64.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_DIV64_H
|
||||
#define _ASM_SCORE_DIV64_H
|
||||
|
||||
#include <asm-generic/div64.h>
|
||||
|
||||
#endif /* _ASM_SCORE_DIV64_H */
|
6
arch/score/include/asm/dma-mapping.h
Normal file
6
arch/score/include/asm/dma-mapping.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_DMA_MAPPING_H
|
||||
#define _ASM_SCORE_DMA_MAPPING_H
|
||||
|
||||
#include <asm-generic/dma-mapping-broken.h>
|
||||
|
||||
#endif /* _ASM_SCORE_DMA_MAPPING_H */
|
8
arch/score/include/asm/dma.h
Normal file
8
arch/score/include/asm/dma.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef _ASM_SCORE_DMA_H
|
||||
#define _ASM_SCORE_DMA_H
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#define MAX_DMA_ADDRESS (0)
|
||||
|
||||
#endif /* _ASM_SCORE_DMA_H */
|
103
arch/score/include/asm/elf.h
Normal file
103
arch/score/include/asm/elf.h
Normal file
@ -0,0 +1,103 @@
|
||||
#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
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
do { \
|
||||
set_personality(PER_LINUX); \
|
||||
} while (0)
|
||||
|
||||
struct task_struct;
|
||||
struct pt_regs;
|
||||
|
||||
#define CORE_DUMP_USE_REGSET
|
||||
#define USE_ELF_CORE_DUMP
|
||||
#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 */
|
6
arch/score/include/asm/emergency-restart.h
Normal file
6
arch/score/include/asm/emergency-restart.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_EMERGENCY_RESTART_H
|
||||
#define _ASM_SCORE_EMERGENCY_RESTART_H
|
||||
|
||||
#include <asm-generic/emergency-restart.h>
|
||||
|
||||
#endif /* _ASM_SCORE_EMERGENCY_RESTART_H */
|
6
arch/score/include/asm/errno.h
Normal file
6
arch/score/include/asm/errno.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_ERRNO_H
|
||||
#define _ASM_SCORE_ERRNO_H
|
||||
|
||||
#include <asm-generic/errno.h>
|
||||
|
||||
#endif /* _ASM_SCORE_ERRNO_H */
|
6
arch/score/include/asm/fcntl.h
Normal file
6
arch/score/include/asm/fcntl.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_FCNTL_H
|
||||
#define _ASM_SCORE_FCNTL_H
|
||||
|
||||
#include <asm-generic/fcntl.h>
|
||||
|
||||
#endif /* _ASM_SCORE_FCNTL_H */
|
82
arch/score/include/asm/fixmap.h
Normal file
82
arch/score/include/asm/fixmap.h
Normal file
@ -0,0 +1,82 @@
|
||||
#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 */
|
4
arch/score/include/asm/ftrace.h
Normal file
4
arch/score/include/asm/ftrace.h
Normal file
@ -0,0 +1,4 @@
|
||||
#ifndef _ASM_SCORE_FTRACE_H
|
||||
#define _ASM_SCORE_FTRACE_H
|
||||
|
||||
#endif /* _ASM_SCORE_FTRACE_H */
|
6
arch/score/include/asm/futex.h
Normal file
6
arch/score/include/asm/futex.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_FUTEX_H
|
||||
#define _ASM_SCORE_FUTEX_H
|
||||
|
||||
#include <asm-generic/futex.h>
|
||||
|
||||
#endif /* _ASM_SCORE_FUTEX_H */
|
6
arch/score/include/asm/hardirq.h
Normal file
6
arch/score/include/asm/hardirq.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_HARDIRQ_H
|
||||
#define _ASM_SCORE_HARDIRQ_H
|
||||
|
||||
#include <asm-generic/hardirq.h>
|
||||
|
||||
#endif /* _ASM_SCORE_HARDIRQ_H */
|
4
arch/score/include/asm/hw_irq.h
Normal file
4
arch/score/include/asm/hw_irq.h
Normal file
@ -0,0 +1,4 @@
|
||||
#ifndef _ASM_SCORE_HW_IRQ_H
|
||||
#define _ASM_SCORE_HW_IRQ_H
|
||||
|
||||
#endif /* _ASM_SCORE_HW_IRQ_H */
|
9
arch/score/include/asm/io.h
Normal file
9
arch/score/include/asm/io.h
Normal file
@ -0,0 +1,9 @@
|
||||
#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 */
|
6
arch/score/include/asm/ioctl.h
Normal file
6
arch/score/include/asm/ioctl.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_IOCTL_H
|
||||
#define _ASM_SCORE_IOCTL_H
|
||||
|
||||
#include <asm-generic/ioctl.h>
|
||||
|
||||
#endif /* _ASM_SCORE_IOCTL_H */
|
6
arch/score/include/asm/ioctls.h
Normal file
6
arch/score/include/asm/ioctls.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_IOCTLS_H
|
||||
#define _ASM_SCORE_IOCTLS_H
|
||||
|
||||
#include <asm-generic/ioctls.h>
|
||||
|
||||
#endif /* _ASM_SCORE_IOCTLS_H */
|
6
arch/score/include/asm/ipcbuf.h
Normal file
6
arch/score/include/asm/ipcbuf.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_IPCBUF_H
|
||||
#define _ASM_SCORE_IPCBUF_H
|
||||
|
||||
#include <asm-generic/ipcbuf.h>
|
||||
|
||||
#endif /* _ASM_SCORE_IPCBUF_H */
|
25
arch/score/include/asm/irq.h
Normal file
25
arch/score/include/asm/irq.h
Normal file
@ -0,0 +1,25 @@
|
||||
#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 */
|
11
arch/score/include/asm/irq_regs.h
Normal file
11
arch/score/include/asm/irq_regs.h
Normal file
@ -0,0 +1,11 @@
|
||||
#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 */
|
109
arch/score/include/asm/irqflags.h
Normal file
109
arch/score/include/asm/irqflags.h
Normal file
@ -0,0 +1,109 @@
|
||||
#ifndef _ASM_SCORE_IRQFLAGS_H
|
||||
#define _ASM_SCORE_IRQFLAGS_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define raw_local_irq_save(x) \
|
||||
{ \
|
||||
__asm__ __volatile__( \
|
||||
"mfcr r8, cr0;" \
|
||||
"li r9, 0xfffffffe;" \
|
||||
"nop;" \
|
||||
"mv %0, r8;" \
|
||||
"and r8, r8, r9;" \
|
||||
"mtcr r8, cr0;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
: "=r" (x) \
|
||||
: \
|
||||
: "r8", "r9" \
|
||||
); \
|
||||
}
|
||||
|
||||
#define raw_local_irq_restore(x) \
|
||||
{ \
|
||||
__asm__ __volatile__( \
|
||||
"mfcr r8, cr0;" \
|
||||
"ldi r9, 0x1;" \
|
||||
"and %0, %0, r9;" \
|
||||
"or r8, r8, %0;" \
|
||||
"mtcr r8, cr0;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
: \
|
||||
: "r"(x) \
|
||||
: "r8", "r9" \
|
||||
); \
|
||||
}
|
||||
|
||||
#define raw_local_irq_enable(void) \
|
||||
{ \
|
||||
__asm__ __volatile__( \
|
||||
"mfcr\tr8,cr0;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"ori\tr8,0x1;" \
|
||||
"mtcr\tr8,cr0;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
: \
|
||||
: \
|
||||
: "r8"); \
|
||||
}
|
||||
|
||||
#define raw_local_irq_disable(void) \
|
||||
{ \
|
||||
__asm__ __volatile__( \
|
||||
"mfcr\tr8,cr0;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"srli\tr8,r8,1;" \
|
||||
"slli\tr8,r8,1;" \
|
||||
"mtcr\tr8,cr0;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
: \
|
||||
: \
|
||||
: "r8"); \
|
||||
}
|
||||
|
||||
#define raw_local_save_flags(x) \
|
||||
{ \
|
||||
__asm__ __volatile__( \
|
||||
"mfcr r8, cr0;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"mv %0, r8;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"nop;" \
|
||||
"ldi r9, 0x1;" \
|
||||
"and %0, %0, r9;" \
|
||||
: "=r" (x) \
|
||||
: \
|
||||
: "r8", "r9" \
|
||||
); \
|
||||
}
|
||||
|
||||
static inline int raw_irqs_disabled_flags(unsigned long flags)
|
||||
{
|
||||
return !(flags & 1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_SCORE_IRQFLAGS_H */
|
6
arch/score/include/asm/kdebug.h
Normal file
6
arch/score/include/asm/kdebug.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_KDEBUG_H
|
||||
#define _ASM_SCORE_KDEBUG_H
|
||||
|
||||
#include <asm-generic/kdebug.h>
|
||||
|
||||
#endif /* _ASM_SCORE_KDEBUG_H */
|
6
arch/score/include/asm/kmap_types.h
Normal file
6
arch/score/include/asm/kmap_types.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_KMAP_TYPES_H
|
||||
#define _ASM_SCORE_KMAP_TYPES_H
|
||||
|
||||
#include <asm-generic/kmap_types.h>
|
||||
|
||||
#endif /* _ASM_SCORE_KMAP_TYPES_H */
|
7
arch/score/include/asm/linkage.h
Normal file
7
arch/score/include/asm/linkage.h
Normal file
@ -0,0 +1,7 @@
|
||||
#ifndef _ASM_SCORE_LINKAGE_H
|
||||
#define _ASM_SCORE_LINKAGE_H
|
||||
|
||||
#define __ALIGN .align 2
|
||||
#define __ALIGN_STR ".align 2"
|
||||
|
||||
#endif /* _ASM_SCORE_LINKAGE_H */
|
6
arch/score/include/asm/local.h
Normal file
6
arch/score/include/asm/local.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_LOCAL_H
|
||||
#define _ASM_SCORE_LOCAL_H
|
||||
|
||||
#include <asm-generic/local.h>
|
||||
|
||||
#endif /* _ASM_SCORE_LOCAL_H */
|
6
arch/score/include/asm/mman.h
Normal file
6
arch/score/include/asm/mman.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_MMAN_H
|
||||
#define _ASM_SCORE_MMAN_H
|
||||
|
||||
#include <asm-generic/mman.h>
|
||||
|
||||
#endif /* _ASM_SCORE_MMAN_H */
|
6
arch/score/include/asm/mmu.h
Normal file
6
arch/score/include/asm/mmu.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_MMU_H
|
||||
#define _ASM_SCORE_MMU_H
|
||||
|
||||
typedef unsigned long mm_context_t;
|
||||
|
||||
#endif /* _ASM_SCORE_MMU_H */
|
113
arch/score/include/asm/mmu_context.h
Normal file
113
arch/score/include/asm/mmu_context.h
Normal file
@ -0,0 +1,113 @@
|
||||
#ifndef _ASM_SCORE_MMU_CONTEXT_H
|
||||
#define _ASM_SCORE_MMU_CONTEXT_H
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.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 */
|
39
arch/score/include/asm/module.h
Normal file
39
arch/score/include/asm/module.h
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef _ASM_SCORE_MODULE_H
|
||||
#define _ASM_SCORE_MODULE_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <asm/uaccess.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. */
|
||||
|
||||
#define Elf_Shdr Elf32_Shdr
|
||||
#define Elf_Sym Elf32_Sym
|
||||
#define Elf_Ehdr Elf32_Ehdr
|
||||
#define Elf_Addr Elf32_Addr
|
||||
|
||||
/* 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 */
|
6
arch/score/include/asm/msgbuf.h
Normal file
6
arch/score/include/asm/msgbuf.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_MSGBUF_H
|
||||
#define _ASM_SCORE_MSGBUF_H
|
||||
|
||||
#include <asm-generic/msgbuf.h>
|
||||
|
||||
#endif /* _ASM_SCORE_MSGBUF_H */
|
6
arch/score/include/asm/mutex.h
Normal file
6
arch/score/include/asm/mutex.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_MUTEX_H
|
||||
#define _ASM_SCORE_MUTEX_H
|
||||
|
||||
#include <asm-generic/mutex-dec.h>
|
||||
|
||||
#endif /* _ASM_SCORE_MUTEX_H */
|
92
arch/score/include/asm/page.h
Normal file
92
arch/score/include/asm/page.h
Normal file
@ -0,0 +1,92 @@
|
||||
#ifndef _ASM_SCORE_PAGE_H
|
||||
#define _ASM_SCORE_PAGE_H
|
||||
|
||||
#include <linux/pfn.h>
|
||||
|
||||
/* PAGE_SHIFT determines the page size */
|
||||
#define PAGE_SHIFT (12)
|
||||
#define PAGE_SIZE (1UL << 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_mapnr)
|
||||
|
||||
#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 */
|
6
arch/score/include/asm/param.h
Normal file
6
arch/score/include/asm/param.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_PARAM_H
|
||||
#define _ASM_SCORE_PARAM_H
|
||||
|
||||
#include <asm-generic/param.h>
|
||||
|
||||
#endif /* _ASM_SCORE_PARAM_H */
|
4
arch/score/include/asm/pci.h
Normal file
4
arch/score/include/asm/pci.h
Normal file
@ -0,0 +1,4 @@
|
||||
#ifndef _ASM_SCORE_PCI_H
|
||||
#define _ASM_SCORE_PCI_H
|
||||
|
||||
#endif /* _ASM_SCORE_PCI_H */
|
6
arch/score/include/asm/percpu.h
Normal file
6
arch/score/include/asm/percpu.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_PERCPU_H
|
||||
#define _ASM_SCORE_PERCPU_H
|
||||
|
||||
#include <asm-generic/percpu.h>
|
||||
|
||||
#endif /* _ASM_SCORE_PERCPU_H */
|
83
arch/score/include/asm/pgalloc.h
Normal file
83
arch/score/include/asm/pgalloc.h
Normal file
@ -0,0 +1,83 @@
|
||||
#ifndef _ASM_SCORE_PGALLOC_H
|
||||
#define _ASM_SCORE_PGALLOC_H
|
||||
|
||||
#include <linux/mm.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_REPEAT|__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 | __GFP_REPEAT, PTE_ORDER);
|
||||
if (pte) {
|
||||
clear_highpage(pte);
|
||||
pgtable_page_ctor(pte);
|
||||
}
|
||||
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 */
|
25
arch/score/include/asm/pgtable-bits.h
Normal file
25
arch/score/include/asm/pgtable-bits.h
Normal file
@ -0,0 +1,25 @@
|
||||
#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_FILE (1<<10)
|
||||
|
||||
#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 */
|
287
arch/score/include/asm/pgtable.h
Normal file
287
arch/score/include/asm/pgtable.h
Normal file
@ -0,0 +1,287 @@
|
||||
#ifndef _ASM_SCORE_PGTABLE_H
|
||||
#define _ASM_SCORE_PGTABLE_H
|
||||
|
||||
#include <linux/const.h>
|
||||
#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 0
|
||||
|
||||
#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_offset_map_nested(dir, address) \
|
||||
((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
|
||||
#define pte_unmap(pte) ((void)(pte))
|
||||
#define pte_unmap_nested(pte) ((void)(pte))
|
||||
|
||||
/*
|
||||
* Bits 9(_PAGE_PRESENT) and 10(_PAGE_FILE)are taken,
|
||||
* split up 30 bits of offset into this range:
|
||||
*/
|
||||
#define PTE_FILE_MAX_BITS 30
|
||||
#define pte_to_pgoff(_pte) \
|
||||
(((_pte).pte & 0x1ff) | (((_pte).pte >> 11) << 9))
|
||||
#define pgoff_to_pte(off) \
|
||||
((pte_t) {((off) & 0x1ff) | (((off) >> 9) << 11) | _PAGE_FILE})
|
||||
#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)
|
||||
|
||||
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
||||
remap_pfn_range(vma, vaddr, pfn, size, prot)
|
||||
|
||||
/*
|
||||
* 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 >> 11)
|
||||
#define __swp_entry(type, offset) ((swp_entry_t){(type) | ((offset) << 11)})
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static inline int pte_file(pte_t pte)
|
||||
{
|
||||
return pte_val(pte) & _PAGE_FILE;
|
||||
}
|
||||
|
||||
#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 pte)
|
||||
{
|
||||
__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 */
|
6
arch/score/include/asm/poll.h
Normal file
6
arch/score/include/asm/poll.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_POLL_H
|
||||
#define _ASM_SCORE_POLL_H
|
||||
|
||||
#include <asm-generic/poll.h>
|
||||
|
||||
#endif /* _ASM_SCORE_POLL_H */
|
6
arch/score/include/asm/posix_types.h
Normal file
6
arch/score/include/asm/posix_types.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_POSIX_TYPES_H
|
||||
#define _ASM_SCORE_POSIX_TYPES_H
|
||||
|
||||
#include <asm-generic/posix_types.h>
|
||||
|
||||
#endif /* _ASM_SCORE_POSIX_TYPES_H */
|
106
arch/score/include/asm/processor.h
Normal file
106
arch/score/include/asm/processor.h
Normal file
@ -0,0 +1,106 @@
|
||||
#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 long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
|
||||
extern unsigned long thread_saved_pc(struct task_struct *tsk);
|
||||
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)
|
||||
#define prepare_to_copy(tsk) 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 */
|
97
arch/score/include/asm/ptrace.h
Normal file
97
arch/score/include/asm/ptrace.h
Normal file
@ -0,0 +1,97 @@
|
||||
#ifndef _ASM_SCORE_PTRACE_H
|
||||
#define _ASM_SCORE_PTRACE_H
|
||||
|
||||
#define PTRACE_GETREGS 12
|
||||
#define PTRACE_SETREGS 13
|
||||
|
||||
#define PC 32
|
||||
#define CONDITION 33
|
||||
#define ECR 34
|
||||
#define EMA 35
|
||||
#define CEH 36
|
||||
#define CEL 37
|
||||
#define COUNTER 38
|
||||
#define LDCR 39
|
||||
#define STCR 40
|
||||
#define PSR 41
|
||||
|
||||
#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;
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
extern void user_enable_single_step(struct task_struct *);
|
||||
extern void user_disable_single_step(struct task_struct *);
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_SCORE_PTRACE_H */
|
6
arch/score/include/asm/resource.h
Normal file
6
arch/score/include/asm/resource.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_RESOURCE_H
|
||||
#define _ASM_SCORE_RESOURCE_H
|
||||
|
||||
#include <asm-generic/resource.h>
|
||||
|
||||
#endif /* _ASM_SCORE_RESOURCE_H */
|
6
arch/score/include/asm/scatterlist.h
Normal file
6
arch/score/include/asm/scatterlist.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SCATTERLIST_H
|
||||
#define _ASM_SCORE_SCATTERLIST_H
|
||||
|
||||
#include <asm-generic/scatterlist.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SCATTERLIST_H */
|
51
arch/score/include/asm/scoreregs.h
Normal file
51
arch/score/include/asm/scoreregs.h
Normal file
@ -0,0 +1,51 @@
|
||||
#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 */
|
6
arch/score/include/asm/sections.h
Normal file
6
arch/score/include/asm/sections.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SECTIONS_H
|
||||
#define _ASM_SCORE_SECTIONS_H
|
||||
|
||||
#include <asm-generic/sections.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SECTIONS_H */
|
21
arch/score/include/asm/segment.h
Normal file
21
arch/score/include/asm/segment.h
Normal file
@ -0,0 +1,21 @@
|
||||
#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 */
|
6
arch/score/include/asm/sembuf.h
Normal file
6
arch/score/include/asm/sembuf.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SEMBUF_H
|
||||
#define _ASM_SCORE_SEMBUF_H
|
||||
|
||||
#include <asm-generic/sembuf.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SEMBUF_H */
|
41
arch/score/include/asm/setup.h
Normal file
41
arch/score/include/asm/setup.h
Normal file
@ -0,0 +1,41 @@
|
||||
#ifndef _ASM_SCORE_SETUP_H
|
||||
#define _ASM_SCORE_SETUP_H
|
||||
|
||||
#define COMMAND_LINE_SIZE 256
|
||||
#define MEMORY_START 0
|
||||
#define MEMORY_SIZE 0x2000000
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
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 /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_SCORE_SETUP_H */
|
6
arch/score/include/asm/shmbuf.h
Normal file
6
arch/score/include/asm/shmbuf.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SHMBUF_H
|
||||
#define _ASM_SCORE_SHMBUF_H
|
||||
|
||||
#include <asm-generic/shmbuf.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SHMBUF_H */
|
6
arch/score/include/asm/shmparam.h
Normal file
6
arch/score/include/asm/shmparam.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SHMPARAM_H
|
||||
#define _ASM_SCORE_SHMPARAM_H
|
||||
|
||||
#include <asm-generic/shmparam.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SHMPARAM_H */
|
22
arch/score/include/asm/sigcontext.h
Normal file
22
arch/score/include/asm/sigcontext.h
Normal file
@ -0,0 +1,22 @@
|
||||
#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 */
|
6
arch/score/include/asm/siginfo.h
Normal file
6
arch/score/include/asm/siginfo.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SIGINFO_H
|
||||
#define _ASM_SCORE_SIGINFO_H
|
||||
|
||||
#include <asm-generic/siginfo.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SIGINFO_H */
|
6
arch/score/include/asm/signal.h
Normal file
6
arch/score/include/asm/signal.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SIGNAL_H
|
||||
#define _ASM_SCORE_SIGNAL_H
|
||||
|
||||
#include <asm-generic/signal.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SIGNAL_H */
|
6
arch/score/include/asm/socket.h
Normal file
6
arch/score/include/asm/socket.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SOCKET_H
|
||||
#define _ASM_SCORE_SOCKET_H
|
||||
|
||||
#include <asm-generic/socket.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SOCKET_H */
|
6
arch/score/include/asm/sockios.h
Normal file
6
arch/score/include/asm/sockios.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SOCKIOS_H
|
||||
#define _ASM_SCORE_SOCKIOS_H
|
||||
|
||||
#include <asm-generic/sockios.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SOCKIOS_H */
|
6
arch/score/include/asm/stat.h
Normal file
6
arch/score/include/asm/stat.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_STAT_H
|
||||
#define _ASM_SCORE_STAT_H
|
||||
|
||||
#include <asm-generic/stat.h>
|
||||
|
||||
#endif /* _ASM_SCORE_STAT_H */
|
6
arch/score/include/asm/statfs.h
Normal file
6
arch/score/include/asm/statfs.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_STATFS_H
|
||||
#define _ASM_SCORE_STATFS_H
|
||||
|
||||
#include <asm-generic/statfs.h>
|
||||
|
||||
#endif /* _ASM_SCORE_STATFS_H */
|
8
arch/score/include/asm/string.h
Normal file
8
arch/score/include/asm/string.h
Normal file
@ -0,0 +1,8 @@
|
||||
#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 */
|
6
arch/score/include/asm/swab.h
Normal file
6
arch/score/include/asm/swab.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_SWAB_H
|
||||
#define _ASM_SCORE_SWAB_H
|
||||
|
||||
#include <asm-generic/swab.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SWAB_H */
|
11
arch/score/include/asm/syscalls.h
Normal file
11
arch/score/include/asm/syscalls.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef _ASM_SCORE_SYSCALLS_H
|
||||
#define _ASM_SCORE_SYSCALLS_H
|
||||
|
||||
asmlinkage long score_clone(struct pt_regs *regs);
|
||||
asmlinkage long score_execve(struct pt_regs *regs);
|
||||
asmlinkage long score_sigaltstack(struct pt_regs *regs);
|
||||
asmlinkage long score_rt_sigreturn(struct pt_regs *regs);
|
||||
|
||||
#include <asm-generic/syscalls.h>
|
||||
|
||||
#endif /* _ASM_SCORE_SYSCALLS_H */
|
90
arch/score/include/asm/system.h
Normal file
90
arch/score/include/asm/system.h
Normal file
@ -0,0 +1,90 @@
|
||||
#ifndef _ASM_SCORE_SYSTEM_H
|
||||
#define _ASM_SCORE_SYSTEM_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/irqflags.h>
|
||||
|
||||
struct pt_regs;
|
||||
struct task_struct;
|
||||
|
||||
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)
|
||||
|
||||
#define finish_arch_switch(prev) do {} while (0)
|
||||
|
||||
typedef void (*vi_handler_t)(void);
|
||||
extern unsigned long arch_align_stack(unsigned long sp);
|
||||
|
||||
#define mb() barrier()
|
||||
#define rmb() barrier()
|
||||
#define wmb() barrier()
|
||||
#define smp_mb() barrier()
|
||||
#define smp_rmb() barrier()
|
||||
#define smp_wmb() barrier()
|
||||
|
||||
#define read_barrier_depends() do {} while (0)
|
||||
#define smp_read_barrier_depends() do {} while (0)
|
||||
|
||||
#define set_mb(var, value) do {var = value; wmb(); } while (0)
|
||||
|
||||
#define __HAVE_ARCH_CMPXCHG 1
|
||||
|
||||
#include <asm-generic/cmpxchg-local.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
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)))
|
||||
|
||||
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 /* !__ASSEMBLY__ */
|
||||
#endif /* _ASM_SCORE_SYSTEM_H */
|
6
arch/score/include/asm/termbits.h
Normal file
6
arch/score/include/asm/termbits.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_TERMBITS_H
|
||||
#define _ASM_SCORE_TERMBITS_H
|
||||
|
||||
#include <asm-generic/termbits.h>
|
||||
|
||||
#endif /* _ASM_SCORE_TERMBITS_H */
|
6
arch/score/include/asm/termios.h
Normal file
6
arch/score/include/asm/termios.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_TERMIOS_H
|
||||
#define _ASM_SCORE_TERMIOS_H
|
||||
|
||||
#include <asm-generic/termios.h>
|
||||
|
||||
#endif /* _ASM_SCORE_TERMIOS_H */
|
105
arch/score/include/asm/thread_info.h
Normal file
105
arch/score/include/asm/thread_info.h
Normal file
@ -0,0 +1,105 @@
|
||||
#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
|
||||
|
||||
#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 */
|
||||
struct exec_domain *exec_domain; /* execution domain */
|
||||
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 restart_block restart_block;
|
||||
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, \
|
||||
.exec_domain = &default_exec_domain, \
|
||||
.cpu = 0, \
|
||||
.preempt_count = 1, \
|
||||
.addr_limit = KERNEL_DS, \
|
||||
.restart_block = { \
|
||||
.fn = do_no_restart_syscall, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define init_thread_info (init_thread_union.thread_info)
|
||||
#define init_stack (init_thread_union.stack)
|
||||
|
||||
/* 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
|
||||
|
||||
/* thread information allocation */
|
||||
#define THREAD_SIZE_ORDER (1)
|
||||
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
|
||||
#define THREAD_MASK (THREAD_SIZE - 1UL)
|
||||
#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
|
||||
|
||||
#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)
|
||||
#define free_thread_info(info) kfree(info)
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#define PREEMPT_ACTIVE 0x10000000
|
||||
|
||||
/*
|
||||
* 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_POLLING_NRFLAG 17 /* true if poll_idle() is polling
|
||||
TIF_NEED_RESCHED */
|
||||
#define TIF_MEMDIE 18
|
||||
|
||||
#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_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
||||
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
||||
|
||||
#define _TIF_WORK_MASK (0x0000ffff)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_SCORE_THREAD_INFO_H */
|
8
arch/score/include/asm/timex.h
Normal file
8
arch/score/include/asm/timex.h
Normal file
@ -0,0 +1,8 @@
|
||||
#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 */
|
17
arch/score/include/asm/tlb.h
Normal file
17
arch/score/include/asm/tlb.h
Normal file
@ -0,0 +1,17 @@
|
||||
#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 */
|
142
arch/score/include/asm/tlbflush.h
Normal file
142
arch/score/include/asm/tlbflush.h
Normal file
@ -0,0 +1,142 @@
|
||||
#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 */
|
6
arch/score/include/asm/topology.h
Normal file
6
arch/score/include/asm/topology.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_TOPOLOGY_H
|
||||
#define _ASM_SCORE_TOPOLOGY_H
|
||||
|
||||
#include <asm-generic/topology.h>
|
||||
|
||||
#endif /* _ASM_SCORE_TOPOLOGY_H */
|
6
arch/score/include/asm/types.h
Normal file
6
arch/score/include/asm/types.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_TYPES_H
|
||||
#define _ASM_SCORE_TYPES_H
|
||||
|
||||
#include <asm-generic/types.h>
|
||||
|
||||
#endif /* _ASM_SCORE_TYPES_H */
|
424
arch/score/include/asm/uaccess.h
Normal file
424
arch/score/include/asm/uaccess.h
Normal file
@ -0,0 +1,424 @@
|
||||
#ifndef __SCORE_UACCESS_H
|
||||
#define __SCORE_UACCESS_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/thread_info.h>
|
||||
|
||||
#define VERIFY_READ 0
|
||||
#define VERIFY_WRITE 1
|
||||
|
||||
#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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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); \
|
||||
\
|
||||
__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" \
|
||||
"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
|
||||
copy_from_user(void *to, const void *from, unsigned long len)
|
||||
{
|
||||
unsigned long over;
|
||||
|
||||
if (access_ok(VERIFY_READ, from, len))
|
||||
return __copy_tofrom_user(to, from, len);
|
||||
|
||||
if ((unsigned long)from < TASK_SIZE) {
|
||||
over = (unsigned long)from + len - TASK_SIZE;
|
||||
return __copy_tofrom_user(to, from, len - over) + over;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
copy_to_user(void *to, const void *from, unsigned long len)
|
||||
{
|
||||
unsigned long over;
|
||||
|
||||
if (access_ok(VERIFY_WRITE, to, len))
|
||||
return __copy_tofrom_user(to, from, len);
|
||||
|
||||
if ((unsigned long)to < TASK_SIZE) {
|
||||
over = (unsigned long)to + len - TASK_SIZE;
|
||||
return __copy_tofrom_user(to, from, len - over) + over;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
#define __copy_from_user(to, from, len) \
|
||||
__copy_tofrom_user((to), (from), (len))
|
||||
|
||||
#define __copy_to_user(to, from, len) \
|
||||
__copy_tofrom_user((to), (from), (len))
|
||||
|
||||
static inline unsigned long
|
||||
__copy_to_user_inatomic(void *to, const void *from, unsigned long len)
|
||||
{
|
||||
return __copy_to_user(to, from, len);
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
__copy_from_user_inatomic(void *to, const void *from, unsigned long len)
|
||||
{
|
||||
return __copy_from_user(to, from, len);
|
||||
}
|
||||
|
||||
#define __copy_in_user(to, from, len) __copy_from_user(to, from, len)
|
||||
|
||||
static inline unsigned long
|
||||
copy_in_user(void *to, const void *from, unsigned long len)
|
||||
{
|
||||
if (access_ok(VERIFY_READ, from, len) &&
|
||||
access_ok(VERFITY_WRITE, to, len))
|
||||
return copy_from_user(to, from, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* __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 __strlen_user(const char *src);
|
||||
static inline long strlen_user(const char __user *src)
|
||||
{
|
||||
return __strlen_user(src);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
struct exception_table_entry {
|
||||
unsigned long insn;
|
||||
unsigned long fixup;
|
||||
};
|
||||
|
||||
extern int fixup_exception(struct pt_regs *regs);
|
||||
|
||||
#endif /* __SCORE_UACCESS_H */
|
||||
|
1
arch/score/include/asm/ucontext.h
Normal file
1
arch/score/include/asm/ucontext.h
Normal file
@ -0,0 +1 @@
|
||||
#include <asm-generic/ucontext.h>
|
6
arch/score/include/asm/unaligned.h
Normal file
6
arch/score/include/asm/unaligned.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef _ASM_SCORE_UNALIGNED_H
|
||||
#define _ASM_SCORE_UNALIGNED_H
|
||||
|
||||
#include <asm-generic/unaligned.h>
|
||||
|
||||
#endif /* _ASM_SCORE_UNALIGNED_H */
|
13
arch/score/include/asm/unistd.h
Normal file
13
arch/score/include/asm/unistd.h
Normal file
@ -0,0 +1,13 @@
|
||||
#if !defined(_ASM_SCORE_UNISTD_H) || defined(__SYSCALL)
|
||||
#define _ASM_SCORE_UNISTD_H
|
||||
|
||||
#define __ARCH_HAVE_MMU
|
||||
|
||||
#define __ARCH_WANT_SYSCALL_NO_AT
|
||||
#define __ARCH_WANT_SYSCALL_NO_FLAGS
|
||||
#define __ARCH_WANT_SYSCALL_OFF_T
|
||||
#define __ARCH_WANT_SYSCALL_DEPRECATED
|
||||
|
||||
#include <asm-generic/unistd.h>
|
||||
|
||||
#endif /* _ASM_SCORE_UNISTD_H */
|
21
arch/score/include/asm/user.h
Normal file
21
arch/score/include/asm/user.h
Normal file
@ -0,0 +1,21 @@
|
||||
#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 */
|
11
arch/score/kernel/Makefile
Normal file
11
arch/score/kernel/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
#
|
||||
# Makefile for the Linux/SCORE kernel.
|
||||
#
|
||||
|
||||
extra-y := head.o vmlinux.lds
|
||||
|
||||
obj-y += entry.o init_task.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
|
216
arch/score/kernel/asm-offsets.c
Normal file
216
arch/score/kernel/asm-offsets.c
Normal file
@ -0,0 +1,216 @@
|
||||
/*
|
||||
* 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_EXEC_DOMAIN, thread_info, exec_domain);
|
||||
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_RESTART_BLOCK, thread_info, restart_block);
|
||||
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();
|
||||
}
|
514
arch/score/kernel/entry.S
Normal file
514
arch/score/kernel/entry.S
Normal file
@ -0,0 +1,514 @@
|
||||
/*
|
||||
* 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 r8, 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_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
|
||||
bgtu 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_execve)
|
||||
mv r4, r0
|
||||
la r8, score_execve
|
||||
br r8
|
||||
|
||||
ENTRY(sys_clone)
|
||||
mv r4, r0
|
||||
la r8, score_clone
|
||||
br r8
|
||||
|
||||
ENTRY(sys_rt_sigreturn)
|
||||
mv r4, r0
|
||||
la r8, score_rt_sigreturn
|
||||
br r8
|
||||
|
||||
ENTRY(sys_sigaltstack)
|
||||
mv r4, r0
|
||||
la r8, score_sigaltstack
|
||||
br r8
|
||||
|
||||
#ifdef __ARCH_WANT_SYSCALL_DEPRECATED
|
||||
ENTRY(sys_fork)
|
||||
mv r4, r0
|
||||
la r8, score_fork
|
||||
br r8
|
||||
|
||||
ENTRY(sys_vfork)
|
||||
mv r4, r0
|
||||
la r8, score_vfork
|
||||
br r8
|
||||
#endif /* __ARCH_WANT_SYSCALL_DEPRECATED */
|
||||
|
70
arch/score/kernel/head.S
Normal file
70
arch/score/kernel/head.S
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* 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
|
47
arch/score/kernel/init_task.c
Normal file
47
arch/score/kernel/init_task.c
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* arch/score/kernel/init_task.c
|
||||
*
|
||||
* Score Processor version.
|
||||
*
|
||||
* Copyright (C) 2009 Sunplus Core Technology Co., Ltd.
|
||||
*
|
||||
* 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_task.h>
|
||||
#include <linux/mqueue.h>
|
||||
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
|
||||
/*
|
||||
* Initial thread structure.
|
||||
*
|
||||
* We need to make sure that this is THREAD_SIZE aligned due to the
|
||||
* way process stacks are handled. This is done by having a special
|
||||
* "init_task" linker map entry..
|
||||
*/
|
||||
union thread_union init_thread_union
|
||||
__attribute__((__section__(".data.init_task"), __aligned__(THREAD_SIZE))) =
|
||||
{ INIT_THREAD_INFO(init_task) };
|
||||
|
||||
/*
|
||||
* Initial task structure.
|
||||
*
|
||||
* All other task structs will be allocated on slabs in fork.c
|
||||
*/
|
||||
struct task_struct init_task = INIT_TASK(init_task);
|
||||
EXPORT_SYMBOL(init_task);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user