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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
From 2392e958ec6fd2e48e011781344cf94dee6d6142 Mon Sep 17 00:00:00 2001
From: Andrew Cooper <andrew.cooper3@citrix.com>
Date: Tue, 2 Apr 2024 16:18:51 +0200
Subject: [PATCH 62/67] xen/virtual-region: Rename the start/end fields
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
... to text_{start,end}. We're about to introduce another start/end pair.
Despite it's name, struct virtual_region has always been a module-ish
description. Call this out specifically.
As minor cleanup, replace ROUNDUP(x, PAGE_SIZE) with the more concise
PAGE_ALIGN() ahead of duplicating the example.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Ross Lagerwall <ross.lagerwall@citrix.com>
master commit: 989556c6f8ca080f5f202417af97d1188b9ba52a
master date: 2024-03-07 14:24:42 +0000
---
xen/common/livepatch.c | 9 +++++----
xen/common/virtual_region.c | 19 ++++++++++---------
xen/include/xen/virtual_region.h | 11 +++++++++--
3 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
index a5068a2217..29395f286f 100644
--- a/xen/common/livepatch.c
+++ b/xen/common/livepatch.c
@@ -785,8 +785,8 @@ static int prepare_payload(struct payload *payload,
region = &payload->region;
region->symbols_lookup = livepatch_symbols_lookup;
- region->start = payload->text_addr;
- region->end = payload->text_addr + payload->text_size;
+ region->text_start = payload->text_addr;
+ region->text_end = payload->text_addr + payload->text_size;
/* Optional sections. */
for ( i = 0; i < BUGFRAME_NR; i++ )
@@ -823,8 +823,9 @@ static int prepare_payload(struct payload *payload,
const void *instr = ALT_ORIG_PTR(a);
const void *replacement = ALT_REPL_PTR(a);
- if ( (instr < region->start && instr >= region->end) ||
- (replacement < region->start && replacement >= region->end) )
+ if ( (instr < region->text_start && instr >= region->text_end) ||
+ (replacement < region->text_start &&
+ replacement >= region->text_end) )
{
printk(XENLOG_ERR LIVEPATCH "%s Alt patching outside payload: %p\n",
elf->name, instr);
diff --git a/xen/common/virtual_region.c b/xen/common/virtual_region.c
index 9f12c30efe..b22ffb75c4 100644
--- a/xen/common/virtual_region.c
+++ b/xen/common/virtual_region.c
@@ -11,15 +11,15 @@
static struct virtual_region core = {
.list = LIST_HEAD_INIT(core.list),
- .start = _stext,
- .end = _etext,
+ .text_start = _stext,
+ .text_end = _etext,
};
/* Becomes irrelevant when __init sections are cleared. */
static struct virtual_region core_init __initdata = {
.list = LIST_HEAD_INIT(core_init.list),
- .start = _sinittext,
- .end = _einittext,
+ .text_start = _sinittext,
+ .text_end = _einittext,
};
/*
@@ -39,7 +39,8 @@ const struct virtual_region *find_text_region(unsigned long addr)
rcu_read_lock(&rcu_virtual_region_lock);
list_for_each_entry_rcu( region, &virtual_region_list, list )
{
- if ( (void *)addr >= region->start && (void *)addr < region->end )
+ if ( (void *)addr >= region->text_start &&
+ (void *)addr < region->text_end )
{
rcu_read_unlock(&rcu_virtual_region_lock);
return region;
@@ -88,8 +89,8 @@ void relax_virtual_region_perms(void)
rcu_read_lock(&rcu_virtual_region_lock);
list_for_each_entry_rcu( region, &virtual_region_list, list )
- modify_xen_mappings_lite((unsigned long)region->start,
- ROUNDUP((unsigned long)region->end, PAGE_SIZE),
+ modify_xen_mappings_lite((unsigned long)region->text_start,
+ PAGE_ALIGN((unsigned long)region->text_end),
PAGE_HYPERVISOR_RWX);
rcu_read_unlock(&rcu_virtual_region_lock);
}
@@ -100,8 +101,8 @@ void tighten_virtual_region_perms(void)
rcu_read_lock(&rcu_virtual_region_lock);
list_for_each_entry_rcu( region, &virtual_region_list, list )
- modify_xen_mappings_lite((unsigned long)region->start,
- ROUNDUP((unsigned long)region->end, PAGE_SIZE),
+ modify_xen_mappings_lite((unsigned long)region->text_start,
+ PAGE_ALIGN((unsigned long)region->text_end),
PAGE_HYPERVISOR_RX);
rcu_read_unlock(&rcu_virtual_region_lock);
}
diff --git a/xen/include/xen/virtual_region.h b/xen/include/xen/virtual_region.h
index d053620711..442a45bf1f 100644
--- a/xen/include/xen/virtual_region.h
+++ b/xen/include/xen/virtual_region.h
@@ -9,11 +9,18 @@
#include <xen/list.h>
#include <xen/symbols.h>
+/*
+ * Despite it's name, this is a module(ish) description.
+ *
+ * There's one region for the runtime .text/etc, one region for .init during
+ * boot only, and one region per livepatch.
+ */
struct virtual_region
{
struct list_head list;
- const void *start; /* Virtual address start. */
- const void *end; /* Virtual address end. */
+
+ const void *text_start; /* .text virtual address start. */
+ const void *text_end; /* .text virtual address end. */
/* If this is NULL the default lookup mechanism is used. */
symbols_lookup_t *symbols_lookup;
--
2.44.0
|