Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
6db59d35 | 2 | #include <inttypes.h> |
203d8a4a SSG |
3 | #include <unistd.h> |
4 | #include <stdio.h> | |
5 | #include <string.h> | |
20f2be1d | 6 | #include <internal/lib.h> // page_size |
203d8a4a SSG |
7 | #include "machine.h" |
8 | #include "api/fs/fs.h" | |
6738028d | 9 | #include "debug.h" |
b9c0a649 | 10 | #include "symbol.h" |
203d8a4a | 11 | |
12a6d294 | 12 | int arch__fix_module_text_start(u64 *start, u64 *size, const char *name) |
203d8a4a | 13 | { |
6738028d | 14 | u64 m_start = *start; |
203d8a4a SSG |
15 | char path[PATH_MAX]; |
16 | ||
17 | snprintf(path, PATH_MAX, "module/%.*s/sections/.text", | |
18 | (int)strlen(name) - 2, name + 1); | |
6738028d TR |
19 | if (sysfs__read_ull(path, (unsigned long long *)start) < 0) { |
20 | pr_debug2("Using module %s start:%#lx\n", path, m_start); | |
21 | *start = m_start; | |
12a6d294 TR |
22 | } else { |
23 | /* Successful read of the modules segment text start address. | |
24 | * Calculate difference between module start address | |
25 | * in memory and module text segment start address. | |
26 | * For example module load address is 0x3ff8011b000 | |
27 | * (from /proc/modules) and module text segment start | |
28 | * address is 0x3ff8011b870 (from file above). | |
29 | * | |
30 | * Adjust the module size and subtract the GOT table | |
31 | * size located at the beginning of the module. | |
32 | */ | |
33 | *size -= (*start - m_start); | |
6738028d | 34 | } |
203d8a4a SSG |
35 | |
36 | return 0; | |
37 | } |