mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge tag 'loongarch-6.1' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
Pull LoongArch updates from Huacai Chen:
- Use EXPLICIT_RELOCS (ABIv2.0)
- Use generic BUG() handler
- Refactor TLB/Cache operations
- Add qspinlock support
- Add perf events support
- Add kexec/kdump support
- Add BPF JIT support
- Add ACPI-based laptop driver
- Update the default config file
* tag 'loongarch-6.1' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson: (25 commits)
LoongArch: Update Loongson-3 default config file
LoongArch: Add ACPI-based generic laptop driver
LoongArch: Add BPF JIT support
LoongArch: Add some instruction opcodes and formats
LoongArch: Move {signed,unsigned}_imm_check() to inst.h
LoongArch: Add kdump support
LoongArch: Add kexec support
LoongArch: Use generic BUG() handler
LoongArch: Add SysRq-x (TLB Dump) support
LoongArch: Add perf events support
LoongArch: Add qspinlock support
LoongArch: Use TLB for ioremap()
LoongArch: Support access filter to /dev/mem interface
LoongArch: Refactor cache probe and flush methods
LoongArch: mm: Refactor TLB exception handlers
LoongArch: Support R_LARCH_GOT_PC_{LO12,HI20} in modules
LoongArch: Support PC-relative relocations in modules
LoongArch: Define ELF relocation types added in ABIv2.0
LoongArch: Adjust symbol addressing for AS_HAS_EXPLICIT_RELOCS
LoongArch: Add Kconfig option AS_HAS_EXPLICIT_RELOCS
...
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
obj-y += kernel/
|
||||
obj-y += mm/
|
||||
obj-y += net/
|
||||
obj-y += vdso/
|
||||
|
||||
# for cleaning
|
||||
|
||||
@@ -50,6 +50,7 @@ config LOONGARCH
|
||||
select ARCH_USE_BUILTIN_BSWAP
|
||||
select ARCH_USE_CMPXCHG_LOCKREF
|
||||
select ARCH_USE_QUEUED_RWLOCKS
|
||||
select ARCH_USE_QUEUED_SPINLOCKS
|
||||
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
|
||||
select ARCH_WANT_LD_ORPHAN_WARN
|
||||
select ARCH_WANTS_NO_INSTR
|
||||
@@ -61,6 +62,7 @@ config LOONGARCH
|
||||
select GENERIC_CPU_AUTOPROBE
|
||||
select GENERIC_ENTRY
|
||||
select GENERIC_GETTIMEOFDAY
|
||||
select GENERIC_IOREMAP if !ARCH_IOREMAP
|
||||
select GENERIC_IRQ_MULTI_HANDLER
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
@@ -69,6 +71,7 @@ config LOONGARCH
|
||||
select GENERIC_LIB_CMPDI2
|
||||
select GENERIC_LIB_LSHRDI3
|
||||
select GENERIC_LIB_UCMPDI2
|
||||
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||
select GENERIC_PCI_IOMAP
|
||||
select GENERIC_SCHED_CLOCK
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
@@ -83,6 +86,7 @@ config LOONGARCH
|
||||
select HAVE_CONTEXT_TRACKING_USER
|
||||
select HAVE_DEBUG_STACKOVERFLOW
|
||||
select HAVE_DMA_CONTIGUOUS
|
||||
select HAVE_EBPF_JIT
|
||||
select HAVE_EXIT_THREAD
|
||||
select HAVE_FAST_GUP
|
||||
select HAVE_GENERIC_VDSO
|
||||
@@ -93,6 +97,8 @@ config LOONGARCH
|
||||
select HAVE_NMI
|
||||
select HAVE_PCI
|
||||
select HAVE_PERF_EVENTS
|
||||
select HAVE_PERF_REGS
|
||||
select HAVE_PERF_USER_STACK_DUMP
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select HAVE_RSEQ
|
||||
select HAVE_SETUP_PER_CPU_AREA if NUMA
|
||||
@@ -136,6 +142,14 @@ config CPU_HAS_PREFETCH
|
||||
bool
|
||||
default y
|
||||
|
||||
config GENERIC_BUG
|
||||
def_bool y
|
||||
depends on BUG
|
||||
|
||||
config GENERIC_BUG_RELATIVE_POINTERS
|
||||
def_bool y
|
||||
depends on GENERIC_BUG
|
||||
|
||||
config GENERIC_CALIBRATE_DELAY
|
||||
def_bool y
|
||||
|
||||
@@ -157,7 +171,7 @@ config STACKTRACE_SUPPORT
|
||||
bool
|
||||
default y
|
||||
|
||||
# MACH_LOONGSON32 and MACH_LOONGSON64 are delibrately carried over from the
|
||||
# MACH_LOONGSON32 and MACH_LOONGSON64 are deliberately carried over from the
|
||||
# MIPS Loongson code, to preserve Loongson-specific code paths in drivers that
|
||||
# are shared between architectures, and specifically expecting the symbols.
|
||||
config MACH_LOONGSON32
|
||||
@@ -166,6 +180,9 @@ config MACH_LOONGSON32
|
||||
config MACH_LOONGSON64
|
||||
def_bool 64BIT
|
||||
|
||||
config FIX_EARLYCON_MEM
|
||||
def_bool y
|
||||
|
||||
config PAGE_SIZE_4KB
|
||||
bool
|
||||
|
||||
@@ -194,6 +211,9 @@ config SCHED_OMIT_FRAME_POINTER
|
||||
bool
|
||||
default y
|
||||
|
||||
config AS_HAS_EXPLICIT_RELOCS
|
||||
def_bool $(as-instr,x:pcalau12i \$t0$(comma)%pc_hi20(x))
|
||||
|
||||
menu "Kernel type and options"
|
||||
|
||||
source "kernel/Kconfig.hz"
|
||||
@@ -399,6 +419,46 @@ config ARCH_FORCE_MAX_ORDER
|
||||
The page size is not necessarily 4KB. Keep this in mind
|
||||
when choosing a value for this option.
|
||||
|
||||
config ARCH_IOREMAP
|
||||
bool "Enable LoongArch DMW-based ioremap()"
|
||||
help
|
||||
We use generic TLB-based ioremap() by default since it has page
|
||||
protection support. However, you can enable LoongArch DMW-based
|
||||
ioremap() for better performance.
|
||||
|
||||
config KEXEC
|
||||
bool "Kexec system call"
|
||||
select KEXEC_CORE
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
current kernel, and to start another kernel. It is like a reboot
|
||||
but it is independent of the system firmware. And like a reboot
|
||||
you can start any kernel with it, not just Linux.
|
||||
|
||||
The name comes from the similarity to the exec system call.
|
||||
|
||||
config CRASH_DUMP
|
||||
bool "Build kdump crash kernel"
|
||||
help
|
||||
Generate crash dump after being started by kexec. This should
|
||||
be normally only set in special crash dump kernels which are
|
||||
loaded in the main kernel with kexec-tools into a specially
|
||||
reserved region and then later executed after a crash by
|
||||
kdump/kexec.
|
||||
|
||||
For more details see Documentation/admin-guide/kdump/kdump.rst
|
||||
|
||||
config PHYSICAL_START
|
||||
hex "Physical address where the kernel is loaded"
|
||||
default "0x90000000a0000000"
|
||||
depends on CRASH_DUMP
|
||||
help
|
||||
This gives the XKPRANGE address where the kernel is loaded.
|
||||
If you plan to use kernel for capturing the crash dump change
|
||||
this value to start of the reserved region (the "X" value as
|
||||
specified in the "crashkernel=YM@XM" command line boot parameter
|
||||
passed to the panic-ed kernel).
|
||||
|
||||
config SECCOMP
|
||||
bool "Enable seccomp to safely compute untrusted bytecode"
|
||||
depends on PROC_FS
|
||||
|
||||
@@ -43,15 +43,37 @@ endif
|
||||
|
||||
cflags-y += -G0 -pipe -msoft-float
|
||||
LDFLAGS_vmlinux += -G0 -static -n -nostdlib
|
||||
|
||||
# When the assembler supports explicit relocation hint, we must use it.
|
||||
# GCC may have -mexplicit-relocs off by default if it was built with an old
|
||||
# assembler, so we force it via an option.
|
||||
#
|
||||
# When the assembler does not supports explicit relocation hint, we can't use
|
||||
# it. Disable it if the compiler supports it.
|
||||
#
|
||||
# If you've seen "unknown reloc hint" message building the kernel and you are
|
||||
# now wondering why "-mexplicit-relocs" is not wrapped with cc-option: the
|
||||
# combination of a "new" assembler and "old" compiler is not supported. Either
|
||||
# upgrade the compiler or downgrade the assembler.
|
||||
ifdef CONFIG_AS_HAS_EXPLICIT_RELOCS
|
||||
cflags-y += -mexplicit-relocs
|
||||
KBUILD_CFLAGS_KERNEL += -mdirect-extern-access
|
||||
else
|
||||
cflags-y += $(call cc-option,-mno-explicit-relocs)
|
||||
KBUILD_AFLAGS_KERNEL += -Wa,-mla-global-with-pcrel
|
||||
KBUILD_CFLAGS_KERNEL += -Wa,-mla-global-with-pcrel
|
||||
KBUILD_AFLAGS_MODULE += -Wa,-mla-global-with-abs
|
||||
KBUILD_CFLAGS_MODULE += -fplt -Wa,-mla-global-with-abs,-mla-local-with-abs
|
||||
endif
|
||||
|
||||
cflags-y += -ffreestanding
|
||||
cflags-y += $(call cc-option, -mno-check-zero-division)
|
||||
|
||||
ifndef CONFIG_PHYSICAL_START
|
||||
load-y = 0x9000000000200000
|
||||
else
|
||||
load-y = $(CONFIG_PHYSICAL_START)
|
||||
endif
|
||||
bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y)
|
||||
|
||||
drivers-$(CONFIG_PCI) += arch/loongarch/pci/
|
||||
|
||||
@@ -4,6 +4,7 @@ CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_BPF_JIT=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
CONFIG_BSD_PROCESS_ACCT_V3=y
|
||||
@@ -45,6 +46,7 @@ CONFIG_SMP=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_NR_CPUS=64
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_PAGE_SIZE_16KB=y
|
||||
CONFIG_HZ_250=y
|
||||
CONFIG_ACPI=y
|
||||
@@ -55,6 +57,7 @@ CONFIG_ACPI_DOCK=y
|
||||
CONFIG_ACPI_IPMI=m
|
||||
CONFIG_ACPI_PCI_SLOT=y
|
||||
CONFIG_ACPI_HOTPLUG_MEMORY=y
|
||||
CONFIG_EFI_ZBOOT=y
|
||||
CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y
|
||||
CONFIG_EFI_CAPSULE_LOADER=m
|
||||
CONFIG_EFI_TEST=m
|
||||
@@ -65,6 +68,8 @@ CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_BLK_DEV_THROTTLING=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_BSD_DISKLABEL=y
|
||||
CONFIG_UNIXWARE_DISKLABEL=y
|
||||
CONFIG_IOSCHED_BFQ=y
|
||||
CONFIG_BFQ_GROUP_IOSCHED=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
@@ -82,8 +87,11 @@ CONFIG_ZSMALLOC=m
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_TLS=m
|
||||
CONFIG_TLS_DEVICE=y
|
||||
CONFIG_XFRM_USER=y
|
||||
CONFIG_NET_KEY=y
|
||||
CONFIG_XDP_SOCKETS=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
@@ -95,6 +103,7 @@ CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_IP_PNP_RARP=y
|
||||
CONFIG_NET_IPIP=m
|
||||
CONFIG_NET_IPGRE_DEMUX=m
|
||||
CONFIG_IP_MROUTE=y
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_UDP_DIAG=y
|
||||
@@ -102,6 +111,7 @@ CONFIG_TCP_CONG_ADVANCED=y
|
||||
CONFIG_TCP_CONG_BBR=m
|
||||
CONFIG_IPV6_ROUTER_PREF=y
|
||||
CONFIG_IPV6_ROUTE_INFO=y
|
||||
CONFIG_INET6_ESP=m
|
||||
CONFIG_IPV6_MROUTE=y
|
||||
CONFIG_NETWORK_PHY_TIMESTAMPING=y
|
||||
CONFIG_NETFILTER=y
|
||||
@@ -112,10 +122,11 @@ CONFIG_NF_LOG_NETDEV=m
|
||||
CONFIG_NF_CONNTRACK_AMANDA=m
|
||||
CONFIG_NF_CONNTRACK_FTP=m
|
||||
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
|
||||
CONFIG_NF_CONNTRACK_SNMP=m
|
||||
CONFIG_NF_CONNTRACK_PPTP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_CT_NETLINK=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_CONNLIMIT=m
|
||||
CONFIG_NFT_LOG=m
|
||||
CONFIG_NFT_LIMIT=m
|
||||
@@ -200,7 +211,6 @@ CONFIG_NF_TABLES_IPV4=y
|
||||
CONFIG_NFT_DUP_IPV4=m
|
||||
CONFIG_NFT_FIB_IPV4=m
|
||||
CONFIG_NF_TABLES_ARP=y
|
||||
CONFIG_NF_LOG_ARP=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_MATCH_AH=m
|
||||
CONFIG_IP_NF_MATCH_ECN=m
|
||||
@@ -254,10 +264,14 @@ CONFIG_BPFILTER=y
|
||||
CONFIG_IP_SCTP=m
|
||||
CONFIG_RDS=y
|
||||
CONFIG_L2TP=m
|
||||
CONFIG_L2TP_V3=y
|
||||
CONFIG_L2TP_IP=m
|
||||
CONFIG_L2TP_ETH=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_VLAN_8021Q=m
|
||||
CONFIG_VLAN_8021Q_GVRP=y
|
||||
CONFIG_VLAN_8021Q_MVRP=y
|
||||
CONFIG_LLC2=m
|
||||
CONFIG_NET_SCHED=y
|
||||
CONFIG_NET_SCH_HTB=m
|
||||
CONFIG_NET_SCH_PRIO=m
|
||||
@@ -282,9 +296,33 @@ CONFIG_VSOCKETS=m
|
||||
CONFIG_VIRTIO_VSOCKETS=m
|
||||
CONFIG_NETLINK_DIAG=y
|
||||
CONFIG_CGROUP_NET_PRIO=y
|
||||
CONFIG_BPF_STREAM_PARSER=y
|
||||
CONFIG_BT=m
|
||||
CONFIG_BT_RFCOMM=m
|
||||
CONFIG_BT_RFCOMM_TTY=y
|
||||
CONFIG_BT_BNEP=m
|
||||
CONFIG_BT_BNEP_MC_FILTER=y
|
||||
CONFIG_BT_BNEP_PROTO_FILTER=y
|
||||
CONFIG_BT_HIDP=m
|
||||
CONFIG_BT_HS=y
|
||||
CONFIG_BT_HCIBTUSB=m
|
||||
# CONFIG_BT_HCIBTUSB_BCM is not set
|
||||
CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y
|
||||
CONFIG_BT_HCIBTUSB_MTK=y
|
||||
CONFIG_BT_HCIUART=m
|
||||
CONFIG_BT_HCIUART_BCSP=y
|
||||
CONFIG_BT_HCIUART_ATH3K=y
|
||||
CONFIG_BT_HCIUART_INTEL=y
|
||||
CONFIG_BT_HCIUART_AG6XX=y
|
||||
CONFIG_BT_HCIBCM203X=m
|
||||
CONFIG_BT_HCIBPA10X=m
|
||||
CONFIG_BT_HCIBFUSB=m
|
||||
CONFIG_BT_HCIDTL1=m
|
||||
CONFIG_BT_HCIBT3C=m
|
||||
CONFIG_BT_HCIBLUECARD=m
|
||||
CONFIG_BT_HCIVHCI=m
|
||||
CONFIG_BT_MRVL=m
|
||||
CONFIG_BT_ATH3K=m
|
||||
CONFIG_BT_VIRTIO=m
|
||||
CONFIG_CFG80211=m
|
||||
CONFIG_CFG80211_WEXT=y
|
||||
CONFIG_MAC80211=m
|
||||
@@ -329,7 +367,6 @@ CONFIG_PARPORT_PC_FIFO=y
|
||||
CONFIG_ZRAM=m
|
||||
CONFIG_ZRAM_DEF_COMP_ZSTD=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
@@ -486,6 +523,7 @@ CONFIG_PPP_FILTER=y
|
||||
CONFIG_PPP_MPPE=m
|
||||
CONFIG_PPP_MULTILINK=y
|
||||
CONFIG_PPPOE=m
|
||||
CONFIG_PPTP=m
|
||||
CONFIG_PPPOL2TP=m
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_SYNC_TTY=m
|
||||
@@ -505,7 +543,6 @@ CONFIG_ATH9K_HTC=m
|
||||
CONFIG_IWLWIFI=m
|
||||
CONFIG_IWLDVM=m
|
||||
CONFIG_IWLMVM=m
|
||||
CONFIG_IWLWIFI_BCAST_FILTERING=y
|
||||
CONFIG_HOSTAP=m
|
||||
CONFIG_MT7601U=m
|
||||
CONFIG_RT2X00=m
|
||||
@@ -521,6 +558,14 @@ CONFIG_RTL8821AE=m
|
||||
CONFIG_RTL8192CU=m
|
||||
# CONFIG_RTLWIFI_DEBUG is not set
|
||||
CONFIG_RTL8XXXU=m
|
||||
CONFIG_RTW88=m
|
||||
CONFIG_RTW88_8822BE=m
|
||||
CONFIG_RTW88_8822CE=m
|
||||
CONFIG_RTW88_8723DE=m
|
||||
CONFIG_RTW88_8821CE=m
|
||||
CONFIG_RTW89=m
|
||||
CONFIG_RTW89_8852AE=m
|
||||
CONFIG_RTW89_8852CE=m
|
||||
CONFIG_ZD1211RW=m
|
||||
CONFIG_USB_NET_RNDIS_WLAN=m
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
@@ -651,6 +696,11 @@ CONFIG_USB_SERIAL_FTDI_SIO=m
|
||||
CONFIG_USB_SERIAL_PL2303=m
|
||||
CONFIG_USB_SERIAL_OPTION=m
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_TYPEC=m
|
||||
CONFIG_TYPEC_TCPM=m
|
||||
CONFIG_TYPEC_TCPCI=m
|
||||
CONFIG_TYPEC_UCSI=m
|
||||
CONFIG_UCSI_ACPI=m
|
||||
CONFIG_INFINIBAND=m
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_EFI=y
|
||||
@@ -688,7 +738,6 @@ CONFIG_COMEDI_NI_PCIDIO=m
|
||||
CONFIG_COMEDI_NI_PCIMIO=m
|
||||
CONFIG_STAGING=y
|
||||
CONFIG_R8188EU=m
|
||||
# CONFIG_88EU_AP_MODE is not set
|
||||
CONFIG_PM_DEVFREQ=y
|
||||
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
|
||||
CONFIG_DEVFREQ_GOV_PERFORMANCE=y
|
||||
@@ -772,14 +821,12 @@ CONFIG_CRYPTO_CRYPTD=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
CONFIG_CRYPTO_CAST6=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SALSA20=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
generic-y += dma-contiguous.h
|
||||
generic-y += export.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += parport.h
|
||||
generic-y += early_ioremap.h
|
||||
generic-y += qrwlock.h
|
||||
generic-y += qrwlock_types.h
|
||||
generic-y += spinlock.h
|
||||
generic-y += spinlock_types.h
|
||||
generic-y += qspinlock.h
|
||||
generic-y += rwsem.h
|
||||
generic-y += segment.h
|
||||
generic-y += user.h
|
||||
|
||||
@@ -40,4 +40,9 @@ extern unsigned long fw_arg0, fw_arg1, fw_arg2;
|
||||
extern struct loongson_board_info b_info;
|
||||
extern struct loongson_system_configuration loongson_sysconf;
|
||||
|
||||
static inline bool io_master(int cpu)
|
||||
{
|
||||
return test_bit(cpu, &loongson_sysconf.cores_io_master);
|
||||
}
|
||||
|
||||
#endif /* _ASM_BOOTINFO_H */
|
||||
|
||||
@@ -2,22 +2,60 @@
|
||||
#ifndef __ASM_BUG_H
|
||||
#define __ASM_BUG_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
|
||||
#include <asm/break.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
static inline void __noreturn BUG(void)
|
||||
{
|
||||
__asm__ __volatile__("break %0" : : "i" (BRK_BUG));
|
||||
unreachable();
|
||||
}
|
||||
#ifndef CONFIG_DEBUG_BUGVERBOSE
|
||||
#define _BUGVERBOSE_LOCATION(file, line)
|
||||
#else
|
||||
#define __BUGVERBOSE_LOCATION(file, line) \
|
||||
.pushsection .rodata.str, "aMS", @progbits, 1; \
|
||||
10002: .string file; \
|
||||
.popsection; \
|
||||
\
|
||||
.long 10002b - .; \
|
||||
.short line;
|
||||
#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_GENERIC_BUG
|
||||
#define __BUG_ENTRY(flags)
|
||||
#else
|
||||
#define __BUG_ENTRY(flags) \
|
||||
.pushsection __bug_table, "aw"; \
|
||||
.align 2; \
|
||||
10000: .long 10001f - .; \
|
||||
_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \
|
||||
.short flags; \
|
||||
.popsection; \
|
||||
10001:
|
||||
#endif
|
||||
|
||||
#define ASM_BUG_FLAGS(flags) \
|
||||
__BUG_ENTRY(flags) \
|
||||
break BRK_BUG
|
||||
|
||||
#define ASM_BUG() ASM_BUG_FLAGS(0)
|
||||
|
||||
#define __BUG_FLAGS(flags) \
|
||||
asm_inline volatile (__stringify(ASM_BUG_FLAGS(flags)));
|
||||
|
||||
#define __WARN_FLAGS(flags) \
|
||||
do { \
|
||||
instrumentation_begin(); \
|
||||
__BUG_FLAGS(BUGFLAG_WARNING|(flags)); \
|
||||
instrumentation_end(); \
|
||||
} while (0)
|
||||
|
||||
#define BUG() \
|
||||
do { \
|
||||
instrumentation_begin(); \
|
||||
__BUG_FLAGS(0); \
|
||||
unreachable(); \
|
||||
} while (0)
|
||||
|
||||
#define HAVE_ARCH_BUG
|
||||
|
||||
#endif
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
#endif /* __ASM_BUG_H */
|
||||
|
||||
@@ -6,10 +6,33 @@
|
||||
#define _ASM_CACHEFLUSH_H
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <asm/cpu-features.h>
|
||||
#include <asm/cpu-info.h>
|
||||
#include <asm/cacheops.h>
|
||||
|
||||
extern void local_flush_icache_range(unsigned long start, unsigned long end);
|
||||
static inline bool cache_present(struct cache_desc *cdesc)
|
||||
{
|
||||
return cdesc->flags & CACHE_PRESENT;
|
||||
}
|
||||
|
||||
static inline bool cache_private(struct cache_desc *cdesc)
|
||||
{
|
||||
return cdesc->flags & CACHE_PRIVATE;
|
||||
}
|
||||
|
||||
static inline bool cache_inclusive(struct cache_desc *cdesc)
|
||||
{
|
||||
return cdesc->flags & CACHE_INCLUSIVE;
|
||||
}
|
||||
|
||||
static inline unsigned int cpu_last_level_cache_line_size(void)
|
||||
{
|
||||
int cache_present = boot_cpu_data.cache_leaves_present;
|
||||
|
||||
return boot_cpu_data.cache_leaves[cache_present - 1].linesz;
|
||||
}
|
||||
|
||||
asmlinkage void __flush_cache_all(void);
|
||||
void local_flush_icache_range(unsigned long start, unsigned long end);
|
||||
|
||||
#define flush_icache_range local_flush_icache_range
|
||||
#define flush_icache_user_range local_flush_icache_range
|
||||
@@ -35,44 +58,30 @@ extern void local_flush_icache_range(unsigned long start, unsigned long end);
|
||||
: \
|
||||
: "i" (op), "ZC" (*(unsigned char *)(addr)))
|
||||
|
||||
static inline void flush_icache_line_indexed(unsigned long addr)
|
||||
static inline void flush_cache_line(int leaf, unsigned long addr)
|
||||
{
|
||||
cache_op(Index_Invalidate_I, addr);
|
||||
}
|
||||
|
||||
static inline void flush_dcache_line_indexed(unsigned long addr)
|
||||
{
|
||||
cache_op(Index_Writeback_Inv_D, addr);
|
||||
}
|
||||
|
||||
static inline void flush_vcache_line_indexed(unsigned long addr)
|
||||
{
|
||||
cache_op(Index_Writeback_Inv_V, addr);
|
||||
}
|
||||
|
||||
static inline void flush_scache_line_indexed(unsigned long addr)
|
||||
{
|
||||
cache_op(Index_Writeback_Inv_S, addr);
|
||||
}
|
||||
|
||||
static inline void flush_icache_line(unsigned long addr)
|
||||
{
|
||||
cache_op(Hit_Invalidate_I, addr);
|
||||
}
|
||||
|
||||
static inline void flush_dcache_line(unsigned long addr)
|
||||
{
|
||||
cache_op(Hit_Writeback_Inv_D, addr);
|
||||
}
|
||||
|
||||
static inline void flush_vcache_line(unsigned long addr)
|
||||
{
|
||||
cache_op(Hit_Writeback_Inv_V, addr);
|
||||
}
|
||||
|
||||
static inline void flush_scache_line(unsigned long addr)
|
||||
{
|
||||
cache_op(Hit_Writeback_Inv_S, addr);
|
||||
switch (leaf) {
|
||||
case Cache_LEAF0:
|
||||
cache_op(Index_Writeback_Inv_LEAF0, addr);
|
||||
break;
|
||||
case Cache_LEAF1:
|
||||
cache_op(Index_Writeback_Inv_LEAF1, addr);
|
||||
break;
|
||||
case Cache_LEAF2:
|
||||
cache_op(Index_Writeback_Inv_LEAF2, addr);
|
||||
break;
|
||||
case Cache_LEAF3:
|
||||
cache_op(Index_Writeback_Inv_LEAF3, addr);
|
||||
break;
|
||||
case Cache_LEAF4:
|
||||
cache_op(Index_Writeback_Inv_LEAF4, addr);
|
||||
break;
|
||||
case Cache_LEAF5:
|
||||
cache_op(Index_Writeback_Inv_LEAF5, addr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#include <asm-generic/cacheflush.h>
|
||||
|
||||
@@ -8,16 +8,18 @@
|
||||
#define __ASM_CACHEOPS_H
|
||||
|
||||
/*
|
||||
* Most cache ops are split into a 2 bit field identifying the cache, and a 3
|
||||
* Most cache ops are split into a 3 bit field identifying the cache, and a 2
|
||||
* bit field identifying the cache operation.
|
||||
*/
|
||||
#define CacheOp_Cache 0x03
|
||||
#define CacheOp_Op 0x1c
|
||||
#define CacheOp_Cache 0x07
|
||||
#define CacheOp_Op 0x18
|
||||
|
||||
#define Cache_I 0x00
|
||||
#define Cache_D 0x01
|
||||
#define Cache_V 0x02
|
||||
#define Cache_S 0x03
|
||||
#define Cache_LEAF0 0x00
|
||||
#define Cache_LEAF1 0x01
|
||||
#define Cache_LEAF2 0x02
|
||||
#define Cache_LEAF3 0x03
|
||||
#define Cache_LEAF4 0x04
|
||||
#define Cache_LEAF5 0x05
|
||||
|
||||
#define Index_Invalidate 0x08
|
||||
#define Index_Writeback_Inv 0x08
|
||||
@@ -25,13 +27,17 @@
|
||||
#define Hit_Writeback_Inv 0x10
|
||||
#define CacheOp_User_Defined 0x18
|
||||
|
||||
#define Index_Invalidate_I (Cache_I | Index_Invalidate)
|
||||
#define Index_Writeback_Inv_D (Cache_D | Index_Writeback_Inv)
|
||||
#define Index_Writeback_Inv_V (Cache_V | Index_Writeback_Inv)
|
||||
#define Index_Writeback_Inv_S (Cache_S | Index_Writeback_Inv)
|
||||
#define Hit_Invalidate_I (Cache_I | Hit_Invalidate)
|
||||
#define Hit_Writeback_Inv_D (Cache_D | Hit_Writeback_Inv)
|
||||
#define Hit_Writeback_Inv_V (Cache_V | Hit_Writeback_Inv)
|
||||
#define Hit_Writeback_Inv_S (Cache_S | Hit_Writeback_Inv)
|
||||
#define Index_Writeback_Inv_LEAF0 (Cache_LEAF0 | Index_Writeback_Inv)
|
||||
#define Index_Writeback_Inv_LEAF1 (Cache_LEAF1 | Index_Writeback_Inv)
|
||||
#define Index_Writeback_Inv_LEAF2 (Cache_LEAF2 | Index_Writeback_Inv)
|
||||
#define Index_Writeback_Inv_LEAF3 (Cache_LEAF3 | Index_Writeback_Inv)
|
||||
#define Index_Writeback_Inv_LEAF4 (Cache_LEAF4 | Index_Writeback_Inv)
|
||||
#define Index_Writeback_Inv_LEAF5 (Cache_LEAF5 | Index_Writeback_Inv)
|
||||
#define Hit_Writeback_Inv_LEAF0 (Cache_LEAF0 | Hit_Writeback_Inv)
|
||||
#define Hit_Writeback_Inv_LEAF1 (Cache_LEAF1 | Hit_Writeback_Inv)
|
||||
#define Hit_Writeback_Inv_LEAF2 (Cache_LEAF2 | Hit_Writeback_Inv)
|
||||
#define Hit_Writeback_Inv_LEAF3 (Cache_LEAF3 | Hit_Writeback_Inv)
|
||||
#define Hit_Writeback_Inv_LEAF4 (Cache_LEAF4 | Hit_Writeback_Inv)
|
||||
#define Hit_Writeback_Inv_LEAF5 (Cache_LEAF5 | Hit_Writeback_Inv)
|
||||
|
||||
#endif /* __ASM_CACHEOPS_H */
|
||||
|
||||
@@ -61,8 +61,8 @@ static inline unsigned int __xchg_small(volatile void *ptr, unsigned int val,
|
||||
return (old32 & mask) >> shift;
|
||||
}
|
||||
|
||||
static inline unsigned long __xchg(volatile void *ptr, unsigned long x,
|
||||
int size)
|
||||
static __always_inline unsigned long
|
||||
__xchg(volatile void *ptr, unsigned long x, int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1:
|
||||
@@ -159,8 +159,8 @@ static inline unsigned int __cmpxchg_small(volatile void *ptr, unsigned int old,
|
||||
return (old32 & mask) >> shift;
|
||||
}
|
||||
|
||||
static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
||||
unsigned long new, unsigned int size)
|
||||
static __always_inline unsigned long
|
||||
__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, unsigned int size)
|
||||
{
|
||||
switch (size) {
|
||||
case 1:
|
||||
|
||||
@@ -19,11 +19,6 @@
|
||||
#define cpu_has_loongarch32 (cpu_data[0].isa_level & LOONGARCH_CPU_ISA_32BIT)
|
||||
#define cpu_has_loongarch64 (cpu_data[0].isa_level & LOONGARCH_CPU_ISA_64BIT)
|
||||
|
||||
#define cpu_icache_line_size() cpu_data[0].icache.linesz
|
||||
#define cpu_dcache_line_size() cpu_data[0].dcache.linesz
|
||||
#define cpu_vcache_line_size() cpu_data[0].vcache.linesz
|
||||
#define cpu_scache_line_size() cpu_data[0].scache.linesz
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
# define cpu_has_64bits (cpu_data[0].isa_level & LOONGARCH_CPU_ISA_64BIT)
|
||||
# define cpu_vabits 31
|
||||
|
||||
@@ -10,18 +10,28 @@
|
||||
|
||||
#include <asm/loongarch.h>
|
||||
|
||||
/* cache_desc->flags */
|
||||
enum {
|
||||
CACHE_PRESENT = (1 << 0),
|
||||
CACHE_PRIVATE = (1 << 1), /* core private cache */
|
||||
CACHE_INCLUSIVE = (1 << 2), /* include the inner level caches */
|
||||
};
|
||||
|
||||
/*
|
||||
* Descriptor for a cache
|
||||
*/
|
||||
struct cache_desc {
|
||||
unsigned int waysize; /* Bytes per way */
|
||||
unsigned char type;
|
||||
unsigned char level;
|
||||
unsigned short sets; /* Number of lines per set */
|
||||
unsigned char ways; /* Number of ways */
|
||||
unsigned char linesz; /* Size of line in bytes */
|
||||
unsigned char waybit; /* Bits to select in a cache set */
|
||||
unsigned char flags; /* Flags describing cache properties */
|
||||
};
|
||||
|
||||
#define CACHE_LEVEL_MAX 3
|
||||
#define CACHE_LEAVES_MAX 6
|
||||
|
||||
struct cpuinfo_loongarch {
|
||||
u64 asid_cache;
|
||||
unsigned long asid_mask;
|
||||
@@ -40,11 +50,8 @@ struct cpuinfo_loongarch {
|
||||
int tlbsizemtlb;
|
||||
int tlbsizestlbsets;
|
||||
int tlbsizestlbways;
|
||||
struct cache_desc icache; /* Primary I-cache */
|
||||
struct cache_desc dcache; /* Primary D or combined I/D cache */
|
||||
struct cache_desc vcache; /* Victim cache, between pcache and scache */
|
||||
struct cache_desc scache; /* Secondary cache */
|
||||
struct cache_desc tcache; /* Tertiary/split secondary cache */
|
||||
int cache_leaves_present; /* number of cache_leaves[] elements */
|
||||
struct cache_desc cache_leaves[CACHE_LEAVES_MAX];
|
||||
int core; /* physical core number in package */
|
||||
int package;/* physical package number */
|
||||
int vabits; /* Virtual Address size in bits */
|
||||
|
||||
@@ -74,6 +74,43 @@
|
||||
#define R_LARCH_SUB64 56
|
||||
#define R_LARCH_GNU_VTINHERIT 57
|
||||
#define R_LARCH_GNU_VTENTRY 58
|
||||
#define R_LARCH_B16 64
|
||||
#define R_LARCH_B21 65
|
||||
#define R_LARCH_B26 66
|
||||
#define R_LARCH_ABS_HI20 67
|
||||
#define R_LARCH_ABS_LO12 68
|
||||
#define R_LARCH_ABS64_LO20 69
|
||||
#define R_LARCH_ABS64_HI12 70
|
||||
#define R_LARCH_PCALA_HI20 71
|
||||
#define R_LARCH_PCALA_LO12 72
|
||||
#define R_LARCH_PCALA64_LO20 73
|
||||
#define R_LARCH_PCALA64_HI12 74
|
||||
#define R_LARCH_GOT_PC_HI20 75
|
||||
#define R_LARCH_GOT_PC_LO12 76
|
||||
#define R_LARCH_GOT64_PC_LO20 77
|
||||
#define R_LARCH_GOT64_PC_HI12 78
|
||||
#define R_LARCH_GOT_HI20 79
|
||||
#define R_LARCH_GOT_LO12 80
|
||||
#define R_LARCH_GOT64_LO20 81
|
||||
#define R_LARCH_GOT64_HI12 82
|
||||
#define R_LARCH_TLS_LE_HI20 83
|
||||
#define R_LARCH_TLS_LE_LO12 84
|
||||
#define R_LARCH_TLS_LE64_LO20 85
|
||||
#define R_LARCH_TLS_LE64_HI12 86
|
||||
#define R_LARCH_TLS_IE_PC_HI20 87
|
||||
#define R_LARCH_TLS_IE_PC_LO12 88
|
||||
#define R_LARCH_TLS_IE64_PC_LO20 89
|
||||
#define R_LARCH_TLS_IE64_PC_HI12 90
|
||||
#define R_LARCH_TLS_IE_HI20 91
|
||||
#define R_LARCH_TLS_IE_LO12 92
|
||||
#define R_LARCH_TLS_IE64_LO20 93
|
||||
#define R_LARCH_TLS_IE64_HI12 94
|
||||
#define R_LARCH_TLS_LD_PC_HI20 95
|
||||
#define R_LARCH_TLS_LD_HI20 96
|
||||
#define R_LARCH_TLS_GD_PC_HI20 97
|
||||
#define R_LARCH_TLS_GD_HI20 98
|
||||
#define R_LARCH_32_PCREL 99
|
||||
#define R_LARCH_RELAX 100
|
||||
|
||||
#ifndef ELF_ARCH
|
||||
|
||||
|
||||
@@ -10,4 +10,19 @@
|
||||
|
||||
#define NR_FIX_BTMAPS 64
|
||||
|
||||
enum fixed_addresses {
|
||||
FIX_HOLE,
|
||||
FIX_EARLYCON_MEM_BASE,
|
||||
__end_of_fixed_addresses
|
||||
};
|
||||
|
||||
#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
||||
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
|
||||
#define FIXMAP_PAGE_IO PAGE_KERNEL_SUC
|
||||
|
||||
extern void __set_fixmap(enum fixed_addresses idx,
|
||||
phys_addr_t phys, pgprot_t flags);
|
||||
|
||||
#include <asm-generic/fixmap.h>
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include <linux/types.h>
|
||||
#include <asm/asm.h>
|
||||
|
||||
#define INSN_BREAK 0x002a0000
|
||||
|
||||
#define ADDR_IMMMASK_LU52ID 0xFFF0000000000000
|
||||
#define ADDR_IMMMASK_LU32ID 0x000FFFFF00000000
|
||||
#define ADDR_IMMMASK_ADDU16ID 0x00000000FFFF0000
|
||||
@@ -18,9 +20,16 @@
|
||||
|
||||
#define ADDR_IMM(addr, INSN) ((addr & ADDR_IMMMASK_##INSN) >> ADDR_IMMSHIFT_##INSN)
|
||||
|
||||
enum reg0i26_op {
|
||||
b_op = 0x14,
|
||||
bl_op = 0x15,
|
||||
};
|
||||
|
||||
enum reg1i20_op {
|
||||
lu12iw_op = 0x0a,
|
||||
lu32id_op = 0x0b,
|
||||
pcaddu12i_op = 0x0e,
|
||||
pcaddu18i_op = 0x0f,
|
||||
};
|
||||
|
||||
enum reg1i21_op {
|
||||
@@ -28,10 +37,34 @@ enum reg1i21_op {
|
||||
bnez_op = 0x11,
|
||||
};
|
||||
|
||||
enum reg2_op {
|
||||
revb2h_op = 0x0c,
|
||||
revb4h_op = 0x0d,
|
||||
revb2w_op = 0x0e,
|
||||
revbd_op = 0x0f,
|
||||
revh2w_op = 0x10,
|
||||
revhd_op = 0x11,
|
||||
};
|
||||
|
||||
enum reg2i5_op {
|
||||
slliw_op = 0x81,
|
||||
srliw_op = 0x89,
|
||||
sraiw_op = 0x91,
|
||||
};
|
||||
|
||||
enum reg2i6_op {
|
||||
sllid_op = 0x41,
|
||||
srlid_op = 0x45,
|
||||
sraid_op = 0x49,
|
||||
};
|
||||
|
||||
enum reg2i12_op {
|
||||
addiw_op = 0x0a,
|
||||
addid_op = 0x0b,
|
||||
lu52id_op = 0x0c,
|
||||
andi_op = 0x0d,
|
||||
ori_op = 0x0e,
|
||||
xori_op = 0x0f,
|
||||
ldb_op = 0xa0,
|
||||
ldh_op = 0xa1,
|
||||
ldw_op = 0xa2,
|
||||
@@ -40,6 +73,20 @@ enum reg2i12_op {
|
||||
sth_op = 0xa5,
|
||||
stw_op = 0xa6,
|
||||
std_op = 0xa7,
|
||||
ldbu_op = 0xa8,
|
||||
ldhu_op = 0xa9,
|
||||
ldwu_op = 0xaa,
|
||||
};
|
||||
|
||||
enum reg2i14_op {
|
||||
llw_op = 0x20,
|
||||
scw_op = 0x21,
|
||||
lld_op = 0x22,
|
||||
scd_op = 0x23,
|
||||
ldptrw_op = 0x24,
|
||||
stptrw_op = 0x25,
|
||||
ldptrd_op = 0x26,
|
||||
stptrd_op = 0x27,
|
||||
};
|
||||
|
||||
enum reg2i16_op {
|
||||
@@ -52,6 +99,71 @@ enum reg2i16_op {
|
||||
bgeu_op = 0x1b,
|
||||
};
|
||||
|
||||
enum reg2bstrd_op {
|
||||
bstrinsd_op = 0x2,
|
||||
bstrpickd_op = 0x3,
|
||||
};
|
||||
|
||||
enum reg3_op {
|
||||
addw_op = 0x20,
|
||||
addd_op = 0x21,
|
||||
subw_op = 0x22,
|
||||
subd_op = 0x23,
|
||||
nor_op = 0x28,
|
||||
and_op = 0x29,
|
||||
or_op = 0x2a,
|
||||
xor_op = 0x2b,
|
||||
orn_op = 0x2c,
|
||||
andn_op = 0x2d,
|
||||
sllw_op = 0x2e,
|
||||
srlw_op = 0x2f,
|
||||
sraw_op = 0x30,
|
||||
slld_op = 0x31,
|
||||
srld_op = 0x32,
|
||||
srad_op = 0x33,
|
||||
mulw_op = 0x38,
|
||||
mulhw_op = 0x39,
|
||||
mulhwu_op = 0x3a,
|
||||
muld_op = 0x3b,
|
||||
mulhd_op = 0x3c,
|
||||
mulhdu_op = 0x3d,
|
||||
divw_op = 0x40,
|
||||
modw_op = 0x41,
|
||||
divwu_op = 0x42,
|
||||
modwu_op = 0x43,
|
||||
divd_op = 0x44,
|
||||
modd_op = 0x45,
|
||||
divdu_op = 0x46,
|
||||
moddu_op = 0x47,
|
||||
ldxb_op = 0x7000,
|
||||
ldxh_op = 0x7008,
|
||||
ldxw_op = 0x7010,
|
||||
ldxd_op = 0x7018,
|
||||
stxb_op = 0x7020,
|
||||
stxh_op = 0x7028,
|
||||
stxw_op = 0x7030,
|
||||
stxd_op = 0x7038,
|
||||
ldxbu_op = 0x7040,
|
||||
ldxhu_op = 0x7048,
|
||||
ldxwu_op = 0x7050,
|
||||
amswapw_op = 0x70c0,
|
||||
amswapd_op = 0x70c1,
|
||||
amaddw_op = 0x70c2,
|
||||
amaddd_op = 0x70c3,
|
||||
amandw_op = 0x70c4,
|
||||
amandd_op = 0x70c5,
|
||||
amorw_op = 0x70c6,
|
||||
amord_op = 0x70c7,
|
||||
amxorw_op = 0x70c8,
|
||||
amxord_op = 0x70c9,
|
||||
};
|
||||
|
||||
enum reg3sa2_op {
|
||||
alslw_op = 0x02,
|
||||
alslwu_op = 0x03,
|
||||
alsld_op = 0x16,
|
||||
};
|
||||
|
||||
struct reg0i26_format {
|
||||
unsigned int immediate_h : 10;
|
||||
unsigned int immediate_l : 16;
|
||||
@@ -71,6 +183,26 @@ struct reg1i21_format {
|
||||
unsigned int opcode : 6;
|
||||
};
|
||||
|
||||
struct reg2_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
unsigned int opcode : 22;
|
||||
};
|
||||
|
||||
struct reg2i5_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
unsigned int immediate : 5;
|
||||
unsigned int opcode : 17;
|
||||
};
|
||||
|
||||
struct reg2i6_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
unsigned int immediate : 6;
|
||||
unsigned int opcode : 16;
|
||||
};
|
||||
|
||||
struct reg2i12_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
@@ -78,6 +210,13 @@ struct reg2i12_format {
|
||||
unsigned int opcode : 10;
|
||||
};
|
||||
|
||||
struct reg2i14_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
unsigned int immediate : 14;
|
||||
unsigned int opcode : 8;
|
||||
};
|
||||
|
||||
struct reg2i16_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
@@ -85,13 +224,43 @@ struct reg2i16_format {
|
||||
unsigned int opcode : 6;
|
||||
};
|
||||
|
||||
struct reg2bstrd_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
unsigned int lsbd : 6;
|
||||
unsigned int msbd : 6;
|
||||
unsigned int opcode : 10;
|
||||
};
|
||||
|
||||
struct reg3_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
unsigned int rk : 5;
|
||||
unsigned int opcode : 17;
|
||||
};
|
||||
|
||||
struct reg3sa2_format {
|
||||
unsigned int rd : 5;
|
||||
unsigned int rj : 5;
|
||||
unsigned int rk : 5;
|
||||
unsigned int immediate : 2;
|
||||
unsigned int opcode : 15;
|
||||
};
|
||||
|
||||
union loongarch_instruction {
|
||||
unsigned int word;
|
||||
struct reg0i26_format reg0i26_format;
|
||||
struct reg1i20_format reg1i20_format;
|
||||
struct reg1i21_format reg1i21_format;
|
||||
struct reg2i12_format reg2i12_format;
|
||||
struct reg2i16_format reg2i16_format;
|
||||
struct reg0i26_format reg0i26_format;
|
||||
struct reg1i20_format reg1i20_format;
|
||||
struct reg1i21_format reg1i21_format;
|
||||
struct reg2_format reg2_format;
|
||||
struct reg2i5_format reg2i5_format;
|
||||
struct reg2i6_format reg2i6_format;
|
||||
struct reg2i12_format reg2i12_format;
|
||||
struct reg2i14_format reg2i14_format;
|
||||
struct reg2i16_format reg2i16_format;
|
||||
struct reg2bstrd_format reg2bstrd_format;
|
||||
struct reg3_format reg3_format;
|
||||
struct reg3sa2_format reg3sa2_format;
|
||||
};
|
||||
|
||||
#define LOONGARCH_INSN_SIZE sizeof(union loongarch_instruction)
|
||||
@@ -166,4 +335,235 @@ u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm);
|
||||
u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
|
||||
u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, unsigned long pc, unsigned long dest);
|
||||
|
||||
static inline bool signed_imm_check(long val, unsigned int bit)
|
||||
{
|
||||
return -(1L << (bit - 1)) <= val && val < (1L << (bit - 1));
|
||||
}
|
||||
|
||||
static inline bool unsigned_imm_check(unsigned long val, unsigned int bit)
|
||||
{
|
||||
return val < (1UL << bit);
|
||||
}
|
||||
|
||||
#define DEF_EMIT_REG0I26_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
int offset) \
|
||||
{ \
|
||||
unsigned int immediate_l, immediate_h; \
|
||||
\
|
||||
immediate_l = offset & 0xffff; \
|
||||
offset >>= 16; \
|
||||
immediate_h = offset & 0x3ff; \
|
||||
\
|
||||
insn->reg0i26_format.opcode = OP; \
|
||||
insn->reg0i26_format.immediate_l = immediate_l; \
|
||||
insn->reg0i26_format.immediate_h = immediate_h; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG0I26_FORMAT(b, b_op)
|
||||
|
||||
#define DEF_EMIT_REG1I20_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, int imm) \
|
||||
{ \
|
||||
insn->reg1i20_format.opcode = OP; \
|
||||
insn->reg1i20_format.immediate = imm; \
|
||||
insn->reg1i20_format.rd = rd; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG1I20_FORMAT(lu12iw, lu12iw_op)
|
||||
DEF_EMIT_REG1I20_FORMAT(lu32id, lu32id_op)
|
||||
DEF_EMIT_REG1I20_FORMAT(pcaddu18i, pcaddu18i_op)
|
||||
|
||||
#define DEF_EMIT_REG2_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, \
|
||||
enum loongarch_gpr rj) \
|
||||
{ \
|
||||
insn->reg2_format.opcode = OP; \
|
||||
insn->reg2_format.rd = rd; \
|
||||
insn->reg2_format.rj = rj; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG2_FORMAT(revb2h, revb2h_op)
|
||||
DEF_EMIT_REG2_FORMAT(revb2w, revb2w_op)
|
||||
DEF_EMIT_REG2_FORMAT(revbd, revbd_op)
|
||||
|
||||
#define DEF_EMIT_REG2I5_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, \
|
||||
enum loongarch_gpr rj, \
|
||||
int imm) \
|
||||
{ \
|
||||
insn->reg2i5_format.opcode = OP; \
|
||||
insn->reg2i5_format.immediate = imm; \
|
||||
insn->reg2i5_format.rd = rd; \
|
||||
insn->reg2i5_format.rj = rj; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG2I5_FORMAT(slliw, slliw_op)
|
||||
DEF_EMIT_REG2I5_FORMAT(srliw, srliw_op)
|
||||
DEF_EMIT_REG2I5_FORMAT(sraiw, sraiw_op)
|
||||
|
||||
#define DEF_EMIT_REG2I6_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, \
|
||||
enum loongarch_gpr rj, \
|
||||
int imm) \
|
||||
{ \
|
||||
insn->reg2i6_format.opcode = OP; \
|
||||
insn->reg2i6_format.immediate = imm; \
|
||||
insn->reg2i6_format.rd = rd; \
|
||||
insn->reg2i6_format.rj = rj; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG2I6_FORMAT(sllid, sllid_op)
|
||||
DEF_EMIT_REG2I6_FORMAT(srlid, srlid_op)
|
||||
DEF_EMIT_REG2I6_FORMAT(sraid, sraid_op)
|
||||
|
||||
#define DEF_EMIT_REG2I12_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, \
|
||||
enum loongarch_gpr rj, \
|
||||
int imm) \
|
||||
{ \
|
||||
insn->reg2i12_format.opcode = OP; \
|
||||
insn->reg2i12_format.immediate = imm; \
|
||||
insn->reg2i12_format.rd = rd; \
|
||||
insn->reg2i12_format.rj = rj; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG2I12_FORMAT(addiw, addiw_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(addid, addid_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(lu52id, lu52id_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(andi, andi_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(ori, ori_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(xori, xori_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(ldbu, ldbu_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(ldhu, ldhu_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(ldwu, ldwu_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(ldd, ldd_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(stb, stb_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(sth, sth_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(stw, stw_op)
|
||||
DEF_EMIT_REG2I12_FORMAT(std, std_op)
|
||||
|
||||
#define DEF_EMIT_REG2I14_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, \
|
||||
enum loongarch_gpr rj, \
|
||||
int imm) \
|
||||
{ \
|
||||
insn->reg2i14_format.opcode = OP; \
|
||||
insn->reg2i14_format.immediate = imm; \
|
||||
insn->reg2i14_format.rd = rd; \
|
||||
insn->reg2i14_format.rj = rj; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG2I14_FORMAT(llw, llw_op)
|
||||
DEF_EMIT_REG2I14_FORMAT(scw, scw_op)
|
||||
DEF_EMIT_REG2I14_FORMAT(lld, lld_op)
|
||||
DEF_EMIT_REG2I14_FORMAT(scd, scd_op)
|
||||
DEF_EMIT_REG2I14_FORMAT(ldptrw, ldptrw_op)
|
||||
DEF_EMIT_REG2I14_FORMAT(stptrw, stptrw_op)
|
||||
DEF_EMIT_REG2I14_FORMAT(ldptrd, ldptrd_op)
|
||||
DEF_EMIT_REG2I14_FORMAT(stptrd, stptrd_op)
|
||||
|
||||
#define DEF_EMIT_REG2I16_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rj, \
|
||||
enum loongarch_gpr rd, \
|
||||
int offset) \
|
||||
{ \
|
||||
insn->reg2i16_format.opcode = OP; \
|
||||
insn->reg2i16_format.immediate = offset; \
|
||||
insn->reg2i16_format.rj = rj; \
|
||||
insn->reg2i16_format.rd = rd; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG2I16_FORMAT(beq, beq_op)
|
||||
DEF_EMIT_REG2I16_FORMAT(bne, bne_op)
|
||||
DEF_EMIT_REG2I16_FORMAT(blt, blt_op)
|
||||
DEF_EMIT_REG2I16_FORMAT(bge, bge_op)
|
||||
DEF_EMIT_REG2I16_FORMAT(bltu, bltu_op)
|
||||
DEF_EMIT_REG2I16_FORMAT(bgeu, bgeu_op)
|
||||
DEF_EMIT_REG2I16_FORMAT(jirl, jirl_op)
|
||||
|
||||
#define DEF_EMIT_REG2BSTRD_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, \
|
||||
enum loongarch_gpr rj, \
|
||||
int msbd, \
|
||||
int lsbd) \
|
||||
{ \
|
||||
insn->reg2bstrd_format.opcode = OP; \
|
||||
insn->reg2bstrd_format.msbd = msbd; \
|
||||
insn->reg2bstrd_format.lsbd = lsbd; \
|
||||
insn->reg2bstrd_format.rj = rj; \
|
||||
insn->reg2bstrd_format.rd = rd; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG2BSTRD_FORMAT(bstrpickd, bstrpickd_op)
|
||||
|
||||
#define DEF_EMIT_REG3_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, \
|
||||
enum loongarch_gpr rj, \
|
||||
enum loongarch_gpr rk) \
|
||||
{ \
|
||||
insn->reg3_format.opcode = OP; \
|
||||
insn->reg3_format.rd = rd; \
|
||||
insn->reg3_format.rj = rj; \
|
||||
insn->reg3_format.rk = rk; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG3_FORMAT(addd, addd_op)
|
||||
DEF_EMIT_REG3_FORMAT(subd, subd_op)
|
||||
DEF_EMIT_REG3_FORMAT(muld, muld_op)
|
||||
DEF_EMIT_REG3_FORMAT(divdu, divdu_op)
|
||||
DEF_EMIT_REG3_FORMAT(moddu, moddu_op)
|
||||
DEF_EMIT_REG3_FORMAT(and, and_op)
|
||||
DEF_EMIT_REG3_FORMAT(or, or_op)
|
||||
DEF_EMIT_REG3_FORMAT(xor, xor_op)
|
||||
DEF_EMIT_REG3_FORMAT(sllw, sllw_op)
|
||||
DEF_EMIT_REG3_FORMAT(slld, slld_op)
|
||||
DEF_EMIT_REG3_FORMAT(srlw, srlw_op)
|
||||
DEF_EMIT_REG3_FORMAT(srld, srld_op)
|
||||
DEF_EMIT_REG3_FORMAT(sraw, sraw_op)
|
||||
DEF_EMIT_REG3_FORMAT(srad, srad_op)
|
||||
DEF_EMIT_REG3_FORMAT(ldxbu, ldxbu_op)
|
||||
DEF_EMIT_REG3_FORMAT(ldxhu, ldxhu_op)
|
||||
DEF_EMIT_REG3_FORMAT(ldxwu, ldxwu_op)
|
||||
DEF_EMIT_REG3_FORMAT(ldxd, ldxd_op)
|
||||
DEF_EMIT_REG3_FORMAT(stxb, stxb_op)
|
||||
DEF_EMIT_REG3_FORMAT(stxh, stxh_op)
|
||||
DEF_EMIT_REG3_FORMAT(stxw, stxw_op)
|
||||
DEF_EMIT_REG3_FORMAT(stxd, stxd_op)
|
||||
DEF_EMIT_REG3_FORMAT(amaddw, amaddw_op)
|
||||
DEF_EMIT_REG3_FORMAT(amaddd, amaddd_op)
|
||||
DEF_EMIT_REG3_FORMAT(amandw, amandw_op)
|
||||
DEF_EMIT_REG3_FORMAT(amandd, amandd_op)
|
||||
DEF_EMIT_REG3_FORMAT(amorw, amorw_op)
|
||||
DEF_EMIT_REG3_FORMAT(amord, amord_op)
|
||||
DEF_EMIT_REG3_FORMAT(amxorw, amxorw_op)
|
||||
DEF_EMIT_REG3_FORMAT(amxord, amxord_op)
|
||||
DEF_EMIT_REG3_FORMAT(amswapw, amswapw_op)
|
||||
DEF_EMIT_REG3_FORMAT(amswapd, amswapd_op)
|
||||
|
||||
#define DEF_EMIT_REG3SA2_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
enum loongarch_gpr rd, \
|
||||
enum loongarch_gpr rj, \
|
||||
enum loongarch_gpr rk, \
|
||||
int imm) \
|
||||
{ \
|
||||
insn->reg3sa2_format.opcode = OP; \
|
||||
insn->reg3sa2_format.immediate = imm; \
|
||||
insn->reg3sa2_format.rd = rd; \
|
||||
insn->reg3sa2_format.rj = rj; \
|
||||
insn->reg3sa2_format.rk = rk; \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG3SA2_FORMAT(alsld, alsld_op)
|
||||
|
||||
#endif /* _ASM_INST_H */
|
||||
|
||||
@@ -27,71 +27,38 @@ extern void __init early_iounmap(void __iomem *addr, unsigned long size);
|
||||
#define early_memremap early_ioremap
|
||||
#define early_memunmap early_iounmap
|
||||
|
||||
#ifdef CONFIG_ARCH_IOREMAP
|
||||
|
||||
static inline void __iomem *ioremap_prot(phys_addr_t offset, unsigned long size,
|
||||
unsigned long prot_val)
|
||||
{
|
||||
if (prot_val == _CACHE_CC)
|
||||
if (prot_val & _CACHE_CC)
|
||||
return (void __iomem *)(unsigned long)(CACHE_BASE + offset);
|
||||
else
|
||||
return (void __iomem *)(unsigned long)(UNCACHE_BASE + offset);
|
||||
}
|
||||
|
||||
#define ioremap(offset, size) \
|
||||
ioremap_prot((offset), (size), pgprot_val(PAGE_KERNEL_SUC))
|
||||
|
||||
#define iounmap(addr) ((void)(addr))
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ioremap - map bus memory into CPU space
|
||||
* On LoongArch, ioremap() has two variants, ioremap_wc() and ioremap_cache().
|
||||
* They map bus memory into CPU space, the mapped memory is marked uncachable
|
||||
* (_CACHE_SUC), uncachable but accelerated by write-combine (_CACHE_WUC) and
|
||||
* cachable (_CACHE_CC) respectively for CPU access.
|
||||
*
|
||||
* @offset: bus address of the memory
|
||||
* @size: size of the resource to map
|
||||
*
|
||||
* ioremap performs a platform specific sequence of operations to
|
||||
* make bus memory CPU accessible via the readb/readw/readl/writeb/
|
||||
* writew/writel functions and the other mmio helpers. The returned
|
||||
* address is not guaranteed to be usable directly as a virtual
|
||||
* address.
|
||||
*/
|
||||
#define ioremap(offset, size) \
|
||||
ioremap_prot((offset), (size), _CACHE_SUC)
|
||||
#define ioremap_wc(offset, size) \
|
||||
ioremap_prot((offset), (size), pgprot_val(PAGE_KERNEL_WUC))
|
||||
|
||||
/*
|
||||
* ioremap_wc - map bus memory into CPU space
|
||||
* @offset: bus address of the memory
|
||||
* @size: size of the resource to map
|
||||
*
|
||||
* ioremap_wc performs a platform specific sequence of operations to
|
||||
* make bus memory CPU accessible via the readb/readw/readl/writeb/
|
||||
* writew/writel functions and the other mmio helpers. The returned
|
||||
* address is not guaranteed to be usable directly as a virtual
|
||||
* address.
|
||||
*
|
||||
* This version of ioremap ensures that the memory is marked uncachable
|
||||
* but accelerated by means of write-combining feature. It is specifically
|
||||
* useful for PCIe prefetchable windows, which may vastly improve a
|
||||
* communications performance. If it was determined on boot stage, what
|
||||
* CPU CCA doesn't support WUC, the method shall fall-back to the
|
||||
* _CACHE_SUC option (see cpu_probe() method).
|
||||
*/
|
||||
#define ioremap_wc(offset, size) \
|
||||
ioremap_prot((offset), (size), _CACHE_WUC)
|
||||
|
||||
/*
|
||||
* ioremap_cache - map bus memory into CPU space
|
||||
* @offset: bus address of the memory
|
||||
* @size: size of the resource to map
|
||||
*
|
||||
* ioremap_cache performs a platform specific sequence of operations to
|
||||
* make bus memory CPU accessible via the readb/readw/readl/writeb/
|
||||
* writew/writel functions and the other mmio helpers. The returned
|
||||
* address is not guaranteed to be usable directly as a virtual
|
||||
* address.
|
||||
*
|
||||
* This version of ioremap ensures that the memory is marked cachable by
|
||||
* the CPU. Also enables full write-combining. Useful for some
|
||||
* memory-like regions on I/O busses.
|
||||
*/
|
||||
#define ioremap_cache(offset, size) \
|
||||
ioremap_prot((offset), (size), _CACHE_CC)
|
||||
|
||||
static inline void iounmap(const volatile void __iomem *addr)
|
||||
{
|
||||
}
|
||||
#define ioremap_cache(offset, size) \
|
||||
ioremap_prot((offset), (size), pgprot_val(PAGE_KERNEL))
|
||||
|
||||
#define mmiowb() asm volatile ("dbar 0" ::: "memory")
|
||||
|
||||
@@ -107,4 +74,8 @@ extern void __memcpy_fromio(void *to, const volatile void __iomem *from, size_t
|
||||
|
||||
#include <asm-generic/io.h>
|
||||
|
||||
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
|
||||
extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
||||
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
||||
|
||||
#endif /* _ASM_IO_H */
|
||||
|
||||
60
arch/loongarch/include/asm/kexec.h
Normal file
60
arch/loongarch/include/asm/kexec.h
Normal file
@@ -0,0 +1,60 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* kexec.h for kexec
|
||||
*
|
||||
* Copyright (C) 2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#ifndef _ASM_KEXEC_H
|
||||
#define _ASM_KEXEC_H
|
||||
|
||||
#include <asm/stacktrace.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/* Maximum physical address we can use pages from */
|
||||
#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
|
||||
/* Maximum address we can reach in physical address mode */
|
||||
#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
|
||||
/* Maximum address we can use for the control code buffer */
|
||||
#define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
|
||||
|
||||
/* Reserve a page for the control code buffer */
|
||||
#define KEXEC_CONTROL_PAGE_SIZE PAGE_SIZE
|
||||
|
||||
/* The native architecture */
|
||||
#define KEXEC_ARCH KEXEC_ARCH_LOONGARCH
|
||||
|
||||
static inline void crash_setup_regs(struct pt_regs *newregs,
|
||||
struct pt_regs *oldregs)
|
||||
{
|
||||
if (oldregs)
|
||||
memcpy(newregs, oldregs, sizeof(*newregs));
|
||||
else
|
||||
prepare_frametrace(newregs);
|
||||
}
|
||||
|
||||
#define ARCH_HAS_KIMAGE_ARCH
|
||||
|
||||
struct kimage_arch {
|
||||
unsigned long efi_boot;
|
||||
unsigned long cmdline_ptr;
|
||||
unsigned long systable_ptr;
|
||||
};
|
||||
|
||||
typedef void (*do_kexec_t)(unsigned long efi_boot,
|
||||
unsigned long cmdline_ptr,
|
||||
unsigned long systable_ptr,
|
||||
unsigned long start_addr,
|
||||
unsigned long first_ind_entry);
|
||||
|
||||
struct kimage;
|
||||
extern const unsigned char relocate_new_kernel[];
|
||||
extern const size_t relocate_new_kernel_size;
|
||||
extern void kexec_reboot(void);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
extern atomic_t kexec_ready_to_reboot;
|
||||
extern const unsigned char kexec_smp_wait[];
|
||||
#endif
|
||||
|
||||
#endif /* !_ASM_KEXEC_H */
|
||||
@@ -187,36 +187,15 @@ static inline u32 read_cpucfg(u32 reg)
|
||||
#define CPUCFG16_L3_DINCL BIT(16)
|
||||
|
||||
#define LOONGARCH_CPUCFG17 0x11
|
||||
#define CPUCFG17_L1I_WAYS_M GENMASK(15, 0)
|
||||
#define CPUCFG17_L1I_SETS_M GENMASK(23, 16)
|
||||
#define CPUCFG17_L1I_SIZE_M GENMASK(30, 24)
|
||||
#define CPUCFG17_L1I_WAYS 0
|
||||
#define CPUCFG17_L1I_SETS 16
|
||||
#define CPUCFG17_L1I_SIZE 24
|
||||
|
||||
#define LOONGARCH_CPUCFG18 0x12
|
||||
#define CPUCFG18_L1D_WAYS_M GENMASK(15, 0)
|
||||
#define CPUCFG18_L1D_SETS_M GENMASK(23, 16)
|
||||
#define CPUCFG18_L1D_SIZE_M GENMASK(30, 24)
|
||||
#define CPUCFG18_L1D_WAYS 0
|
||||
#define CPUCFG18_L1D_SETS 16
|
||||
#define CPUCFG18_L1D_SIZE 24
|
||||
|
||||
#define LOONGARCH_CPUCFG19 0x13
|
||||
#define CPUCFG19_L2_WAYS_M GENMASK(15, 0)
|
||||
#define CPUCFG19_L2_SETS_M GENMASK(23, 16)
|
||||
#define CPUCFG19_L2_SIZE_M GENMASK(30, 24)
|
||||
#define CPUCFG19_L2_WAYS 0
|
||||
#define CPUCFG19_L2_SETS 16
|
||||
#define CPUCFG19_L2_SIZE 24
|
||||
|
||||
#define LOONGARCH_CPUCFG20 0x14
|
||||
#define CPUCFG20_L3_WAYS_M GENMASK(15, 0)
|
||||
#define CPUCFG20_L3_SETS_M GENMASK(23, 16)
|
||||
#define CPUCFG20_L3_SIZE_M GENMASK(30, 24)
|
||||
#define CPUCFG20_L3_WAYS 0
|
||||
#define CPUCFG20_L3_SETS 16
|
||||
#define CPUCFG20_L3_SIZE 24
|
||||
#define CPUCFG_CACHE_WAYS_M GENMASK(15, 0)
|
||||
#define CPUCFG_CACHE_SETS_M GENMASK(23, 16)
|
||||
#define CPUCFG_CACHE_LSIZE_M GENMASK(30, 24)
|
||||
#define CPUCFG_CACHE_WAYS 0
|
||||
#define CPUCFG_CACHE_SETS 16
|
||||
#define CPUCFG_CACHE_LSIZE 24
|
||||
|
||||
#define LOONGARCH_CPUCFG48 0x30
|
||||
#define CPUCFG48_MCSR_LCK BIT(0)
|
||||
|
||||
@@ -17,10 +17,15 @@ struct mod_section {
|
||||
};
|
||||
|
||||
struct mod_arch_specific {
|
||||
struct mod_section got;
|
||||
struct mod_section plt;
|
||||
struct mod_section plt_idx;
|
||||
};
|
||||
|
||||
struct got_entry {
|
||||
Elf_Addr symbol_addr;
|
||||
};
|
||||
|
||||
struct plt_entry {
|
||||
u32 inst_lu12iw;
|
||||
u32 inst_lu32id;
|
||||
@@ -29,10 +34,16 @@ struct plt_entry {
|
||||
};
|
||||
|
||||
struct plt_idx_entry {
|
||||
unsigned long symbol_addr;
|
||||
Elf_Addr symbol_addr;
|
||||
};
|
||||
|
||||
Elf_Addr module_emit_plt_entry(struct module *mod, unsigned long val);
|
||||
Elf_Addr module_emit_got_entry(struct module *mod, Elf_Addr val);
|
||||
Elf_Addr module_emit_plt_entry(struct module *mod, Elf_Addr val);
|
||||
|
||||
static inline struct got_entry emit_got_entry(Elf_Addr val)
|
||||
{
|
||||
return (struct got_entry) { val };
|
||||
}
|
||||
|
||||
static inline struct plt_entry emit_plt_entry(unsigned long val)
|
||||
{
|
||||
@@ -77,4 +88,16 @@ static inline struct plt_entry *get_plt_entry(unsigned long val,
|
||||
return plt + plt_idx;
|
||||
}
|
||||
|
||||
static inline struct got_entry *get_got_entry(Elf_Addr val,
|
||||
const struct mod_section *sec)
|
||||
{
|
||||
struct got_entry *got = (struct got_entry *)sec->shdr->sh_addr;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < sec->num_entries; i++)
|
||||
if (got[i].symbol_addr == val)
|
||||
return &got[i];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* _ASM_MODULE_H */
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/* Copyright (C) 2020-2022 Loongson Technology Corporation Limited */
|
||||
SECTIONS {
|
||||
. = ALIGN(4);
|
||||
.got : { BYTE(0) }
|
||||
.plt : { BYTE(0) }
|
||||
.plt.idx : { BYTE(0) }
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user