Skip to content
Navigation Menu
Toggle navigation
Sign in
In this repository
All GitHub Enterprise
↵
Jump to
↵
No suggested jump to results
In this repository
All GitHub Enterprise
↵
Jump to
↵
In this organization
All GitHub Enterprise
↵
Jump to
↵
In this repository
All GitHub Enterprise
↵
Jump to
↵
Sign in
Reseting focus
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
mariux64
/
linux
Public
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Issues
2
Pull requests
0
Actions
Projects
0
Wiki
Security
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Wiki
Security
Insights
Files
57427df
Documentation
LICENSES
arch
alpha
arc
arm
arm64
csky
abiv1
abiv2
boot
configs
include
kernel
probes
vdso
Makefile
asm-offsets.c
atomic.S
cpu-probe.c
entry.S
ftrace.c
head.S
io.c
irq.c
jump_label.c
module.c
perf_callchain.c
perf_event.c
perf_regs.c
power.c
process.c
ptrace.c
setup.c
signal.c
smp.c
stacktrace.c
syscall.c
syscall_table.c
time.c
traps.c
vdso.c
vmlinux.lds.S
lib
mm
Kbuild
Kconfig
Kconfig.debug
Kconfig.platforms
Makefile
hexagon
ia64
loongarch
m68k
microblaze
mips
nios2
openrisc
parisc
powerpc
riscv
s390
sh
sparc
um
x86
xtensa
.gitignore
Kconfig
block
certs
crypto
drivers
fs
include
init
io_uring
ipc
kernel
lib
mm
net
rust
samples
scripts
security
sound
tools
usr
virt
.clang-format
.cocciconfig
.get_maintainer.ignore
.gitattributes
.gitignore
.mailmap
.rustfmt.toml
COPYING
CREDITS
Kbuild
Kconfig
MAINTAINERS
Makefile
README
Breadcrumbs
linux
/
arch
/
csky
/
kernel
/
module.c
Copy path
Blame
Blame
Latest commit
History
History
97 lines (87 loc) · 2.53 KB
Breadcrumbs
linux
/
arch
/
csky
/
kernel
/
module.c
Top
File metadata and controls
Code
Blame
97 lines (87 loc) · 2.53 KB
Raw
// SPDX-License-Identifier: GPL-2.0 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. #include <linux/moduleloader.h> #include <linux/elf.h> #include <linux/mm.h> #include <linux/vmalloc.h> #include <linux/slab.h> #include <linux/fs.h> #include <linux/string.h> #include <linux/kernel.h> #include <linux/spinlock.h> #ifdef CONFIG_CPU_CK810 #define IS_BSR32(hi16, lo16) (((hi16) & 0xFC00) == 0xE000) #define IS_JSRI32(hi16, lo16) ((hi16) == 0xEAE0) #define CHANGE_JSRI_TO_LRW(addr) do { \ *(uint16_t *)(addr) = (*(uint16_t *)(addr) & 0xFF9F) | 0x001a; \ *((uint16_t *)(addr) + 1) = *((uint16_t *)(addr) + 1) & 0xFFFF; \ } while (0) #define SET_JSR32_R26(addr) do { \ *(uint16_t *)(addr) = 0xE8Fa; \ *((uint16_t *)(addr) + 1) = 0x0000; \ } while (0) static void jsri_2_lrw_jsr(uint32_t *location) { uint16_t *location_tmp = (uint16_t *)location; if (IS_BSR32(*location_tmp, *(location_tmp + 1))) return; if (IS_JSRI32(*location_tmp, *(location_tmp + 1))) { /* jsri 0x... --> lrw r26, 0x... */ CHANGE_JSRI_TO_LRW(location); /* lsli r0, r0 --> jsr r26 */ SET_JSR32_R26(location + 1); } } #else static inline void jsri_2_lrw_jsr(uint32_t *location) { return; } #endif int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, unsigned int relsec, struct module *me) { unsigned int i; Elf32_Rela *rel = (void *) sechdrs[relsec].sh_addr; Elf32_Sym *sym; uint32_t *location; short *temp; for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { /* This is where to make the change */ location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr + rel[i].r_offset; sym = (Elf32_Sym *)sechdrs[symindex].sh_addr + ELF32_R_SYM(rel[i].r_info); switch (ELF32_R_TYPE(rel[i].r_info)) { case R_CSKY_32: /* We add the value into the location given */ *location = rel[i].r_addend + sym->st_value; break; case R_CSKY_PC32: /* Add the value, subtract its position */ *location = rel[i].r_addend + sym->st_value - (uint32_t)location; break; case R_CSKY_PCRELJSR_IMM11BY2: break; case R_CSKY_PCRELJSR_IMM26BY2: jsri_2_lrw_jsr(location); break; case R_CSKY_ADDR_HI16: temp = ((short *)location) + 1; *temp = (short) ((rel[i].r_addend + sym->st_value) >> 16); break; case R_CSKY_ADDR_LO16: temp = ((short *)location) + 1; *temp = (short) ((rel[i].r_addend + sym->st_value) & 0xffff); break; default: pr_err("module %s: Unknown relocation: %u\n", me->name, ELF32_R_TYPE(rel[i].r_info)); return -ENOEXEC; } } return 0; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
You can’t perform that action at this time.