FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
linux/kernel/module/livepatch.c at multikernel-riscv · multikernel/linux · GitHub
multikernel
/
linux
Public
forked from
torvalds/linux
Notifications
You must be signed in to change notification settings
Fork
15
Star
180
Code
Issues
27
Pull requests
5
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
linux
/
kernel
/
module
/
livepatch.c
Copy path
More file actions
More file actions
Latest commit
History
History
History
74 lines (63 loc) · 1.83 KB
Breadcrumbs
linux
/
kernel
/
module
/
livepatch.c
Copy path
File metadata and controls
74 lines (63 loc) · 1.83 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Module livepatch support
*
* Copyright (C) 2016 Jessica Yu <jeyu@redhat.com>
*/
#include
<linux/module.h>
#include
<linux/string.h>
#include
<linux/slab.h>
#include
"internal.h"
/*
* Persist ELF information about a module. Copy the ELF header,
* section header table, section string table, and symtab section
* index from info to mod->klp_info.
*/
int
copy_module_elf
(
struct
module
*
mod
,
struct
load_info
*
info
)
{
unsigned
int
size
,
symndx
;
int
ret
;
size
=
sizeof
(
*
mod
->
klp_info
);
mod
->
klp_info
=
kmalloc
(
size
,
GFP_KERNEL
);
if
(!
mod
->
klp_info
)
return
-
ENOMEM
;
/* ELF header */
size
=
sizeof
(
mod
->
klp_info
->
hdr
);
memcpy
(
&
mod
->
klp_info
->
hdr
,
info
->
hdr
,
size
);
/* ELF section header table */
size
=
sizeof
(
*
info
->
sechdrs
)
*
info
->
hdr
->
e_shnum
;
mod
->
klp_info
->
sechdrs
=
kmemdup
(
info
->
sechdrs
,
size
,
GFP_KERNEL
);
if
(!
mod
->
klp_info
->
sechdrs
) {
ret
=
-
ENOMEM
;
goto
free_info
;
}
/* ELF section name string table */
size
=
info
->
sechdrs
[
info
->
hdr
->
e_shstrndx
].
sh_size
;
mod
->
klp_info
->
secstrings
=
kmemdup
(
info
->
secstrings
,
size
,
GFP_KERNEL
);
if
(!
mod
->
klp_info
->
secstrings
) {
ret
=
-
ENOMEM
;
goto
free_sechdrs
;
}
/* ELF symbol section index */
symndx
=
info
->
index
.
sym
;
mod
->
klp_info
->
symndx
=
symndx
;
/*
* For livepatch modules, core_kallsyms.symtab is a complete
* copy of the original symbol table. Adjust sh_addr to point
* to core_kallsyms.symtab since the copy of the symtab in module
* init memory is freed at the end of do_init_module().
*/
mod
->
klp_info
->
sechdrs
[
symndx
].
sh_addr
=
(
unsigned long
)
mod
->
core_kallsyms
.
symtab
;
return
0
;
free_sechdrs
:
kfree
(
mod
->
klp_info
->
sechdrs
);
free_info
:
kfree
(
mod
->
klp_info
);
return
ret
;
}
void
free_module_elf
(
struct
module
*
mod
)
{
kfree
(
mod
->
klp_info
->
sechdrs
);
kfree
(
mod
->
klp_info
->
secstrings
);
kfree
(
mod
->
klp_info
);
}
Back
|
FazBrowse Home
|
New Git URL