Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/perf/arch/s390/util/machine.c
26292 views
1
// SPDX-License-Identifier: GPL-2.0
2
#include <inttypes.h>
3
#include <unistd.h>
4
#include <stdio.h>
5
#include <string.h>
6
#include <internal/lib.h> // page_size
7
#include "machine.h"
8
#include "api/fs/fs.h"
9
#include "debug.h"
10
#include "symbol.h"
11
12
int arch__fix_module_text_start(u64 *start, u64 *size, const char *name)
13
{
14
u64 m_start = *start;
15
char path[PATH_MAX];
16
17
snprintf(path, PATH_MAX, "module/%.*s/sections/.text",
18
(int)strlen(name) - 2, name + 1);
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;
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);
34
}
35
36
return 0;
37
}
38
39