Skip to content

Commit 5d29781

Browse files
committed
mem: extend vmap and kmap apis
Update vmap and kmap to allow mapping pages and frames with no default flag. Add vmap_1g, vmap_2m, vmap_4k with default flags and similarly with kmap. Signed-off-by: Daniele Ahmed <ahmeddan amazon c;0m >
1 parent ffef790 commit 5d29781

File tree

8 files changed

+89
-32
lines changed

8 files changed

+89
-32
lines changed

arch/x86/apic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ void init_apic(unsigned int cpu, apic_mode_t mode) {
153153
* X2APIC uses MSRs for accesses, so no mapping needed.
154154
*/
155155
if (apic_mode == APIC_MODE_XAPIC)
156-
vmap(apic_get_base(apic_base), apic_base.base, PAGE_ORDER_4K, L1_PROT);
156+
vmap_4k(apic_get_base(apic_base), apic_base.base, L1_PROT);
157157

158158
spiv.reg = apic_read(APIC_SPIV);
159159
spiv.vector = 0xFF;

arch/x86/ioapic.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,8 @@ ioapic_t *add_ioapic(uint8_t id, uint8_t version, bool enabled, uint64_t base_ad
217217
ioapic->base_address = base_address;
218218
ioapic->gsi_base = gsi_base;
219219

220-
ioapic->virt_address =
221-
vmap(paddr_to_virt(ioapic->base_address), paddr_to_mfn(ioapic->base_address),
222-
PAGE_ORDER_4K, L1_PROT);
220+
ioapic->virt_address = vmap_4k(paddr_to_virt(ioapic->base_address),
221+
paddr_to_mfn(ioapic->base_address), L1_PROT);
223222
BUG_ON(!ioapic->virt_address);
224223

225224
return ioapic;

arch/x86/pagetables.c

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,11 @@ static mfn_t get_pgentry_mfn(mfn_t tab_mfn, pt_index_t index, unsigned long flag
146146
return mfn;
147147
}
148148

149-
void *vmap(void *va, mfn_t mfn, unsigned int order, unsigned long flags) {
149+
void *vmap(void *va, mfn_t mfn, unsigned int order,
150+
#if defined(__x86_64__)
151+
unsigned long l4_flags,
152+
#endif
153+
unsigned long l3_flags, unsigned long l2_flags, unsigned long l1_flags) {
150154
static spinlock_t lock = SPINLOCK_INIT;
151155
mfn_t l1t_mfn, l2t_mfn, l3t_mfn;
152156
pgentry_t *tab, *entry;
@@ -159,60 +163,74 @@ void *vmap(void *va, mfn_t mfn, unsigned int order, unsigned long flags) {
159163
spin_lock(&lock);
160164

161165
#if defined(__x86_64__)
162-
l3t_mfn = get_pgentry_mfn(get_cr3_mfn(&cr3), l4_table_index(va), L4_PROT_USER);
166+
l3t_mfn = get_pgentry_mfn(get_cr3_mfn(&cr3), l4_table_index(va), l4_flags);
163167
#else
164168
l3t_mfn = get_cr3_mfn(&cr3);
165169
#endif
166170

167171
if (order == PAGE_ORDER_1G) {
168172
tab = init_map_mfn(l3t_mfn);
169173
entry = &tab[l3_table_index(va)];
170-
set_pgentry(entry, mfn, flags | _PAGE_PSE);
174+
set_pgentry(entry, mfn, l3_flags | _PAGE_PSE);
171175
goto done;
172176
}
173177

174-
l2t_mfn = get_pgentry_mfn(l3t_mfn, l3_table_index(va), L3_PROT_USER);
178+
l2t_mfn = get_pgentry_mfn(l3t_mfn, l3_table_index(va), l3_flags);
175179

176180
if (order == PAGE_ORDER_2M) {
177181
tab = init_map_mfn(l2t_mfn);
178182
entry = &tab[l2_table_index(va)];
179-
set_pgentry(entry, mfn, flags | _PAGE_PSE);
183+
set_pgentry(entry, mfn, l2_flags | _PAGE_PSE);
180184
goto done;
181185
}
182186

183-
l1t_mfn = get_pgentry_mfn(l2t_mfn, l2_table_index(va), L2_PROT_USER);
187+
l1t_mfn = get_pgentry_mfn(l2t_mfn, l2_table_index(va), l2_flags);
184188

185189
tab = init_map_mfn(l1t_mfn);
186190
entry = &tab[l1_table_index(va)];
187-
set_pgentry(entry, mfn, flags);
191+
set_pgentry(entry, mfn, l1_flags);
188192

189193
done:
190194
spin_unlock(&lock);
191195
return va;
192196
}
193197

194-
void *vunmap(void *va, unsigned int order) { return vmap(va, MFN_INVALID, order, 0x0); }
198+
void *vunmap(void *va, unsigned int order) {
199+
return vmap(va, MFN_INVALID, order, PT_NO_FLAGS, PT_NO_FLAGS, PT_NO_FLAGS,
200+
PT_NO_FLAGS);
201+
}
195202

196-
void *kmap(mfn_t mfn, unsigned int order, unsigned long flags) {
197-
return vmap(mfn_to_virt_kern(mfn), mfn, order, flags);
203+
void *kmap(mfn_t mfn, unsigned int order,
204+
#if defined(__x86_64__)
205+
unsigned long l4_flags,
206+
#endif
207+
unsigned long l3_flags, unsigned long l2_flags, unsigned long l1_flags) {
208+
return vmap(mfn_to_virt_kern(mfn), mfn, order,
209+
#if defined(__x86_64__)
210+
l4_flags,
211+
#endif
212+
l3_flags, l2_flags, l1_flags);
198213
}
199214

200-
void *kunmap(void *va, unsigned int order) { return vmap(va, MFN_INVALID, order, 0x0); }
215+
void *kunmap(void *va, unsigned int order) {
216+
return vmap(va, MFN_INVALID, order, PT_NO_FLAGS, PT_NO_FLAGS, PT_NO_FLAGS,
217+
PT_NO_FLAGS);
218+
}
201219

202220
void init_pagetables(void) {
203221
for_each_memory_range (r) {
204222
switch (r->base) {
205223
case VIRT_IDENT_BASE:
206224
for (mfn_t mfn = virt_to_mfn(r->start); mfn < virt_to_mfn(r->end); mfn++)
207-
vmap(mfn_to_virt(mfn), mfn, PAGE_ORDER_4K, r->flags);
225+
vmap_4k(mfn_to_virt(mfn), mfn, r->flags);
208226
break;
209227
case VIRT_KERNEL_BASE:
210228
for (mfn_t mfn = virt_to_mfn(r->start); mfn < virt_to_mfn(r->end); mfn++)
211-
kmap(mfn, PAGE_ORDER_4K, r->flags);
229+
kmap_4k(mfn, r->flags);
212230
break;
213231
case VIRT_USER_BASE:
214232
for (mfn_t mfn = virt_to_mfn(r->start); mfn < virt_to_mfn(r->end); mfn++)
215-
vmap(mfn_to_virt_user(mfn), mfn, PAGE_ORDER_4K, r->flags);
233+
vmap_4k(mfn_to_virt_user(mfn), mfn, r->flags);
216234
break;
217235
default:
218236
break;

common/acpi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ static unsigned acpi_table_map_pages(paddr_t pa, size_t len) {
128128
mfn);
129129
}
130130

131-
BUG_ON(!kmap(mfn, PAGE_ORDER_4K, L1_PROT));
131+
BUG_ON(!kmap_4k(mfn, L1_PROT));
132132
}
133133

134134
return num_pages;

drivers/hpet.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ bool init_hpet(uint8_t dst_cpus) {
4343
}
4444

4545
hpet_base_mfn = paddr_to_mfn(hpet->address.address);
46-
vmap((uint64_t *) hpet->address.address, hpet_base_mfn, PAGE_ORDER_4K, L1_PROT);
46+
vmap_4k((uint64_t *) hpet->address.address, hpet_base_mfn, L1_PROT);
4747
config = (acpi_hpet_timer_t *) (hpet->address.address +
4848
HPET_OFFSET_TIMER_0_CONFIG_CAP_REG);
4949
general =
@@ -89,4 +89,4 @@ bool init_hpet(uint8_t dst_cpus) {
8989
configure_isa_irq(HPET_IRQ, HPET_IRQ_OFFSET, IOAPIC_DEST_MODE_PHYSICAL, dst_cpus);
9090
dprintk("Initialized HPET\n");
9191
return true;
92-
}
92+
}

include/arch/x86/page.h

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@
6565

6666
#define PTE_FLAGS(...) (TOKEN_OR(_PAGE_, ##__VA_ARGS__))
6767

68+
#define PT_NO_FLAGS 0
69+
6870
#define L1_PROT (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
6971
#define L1_PROT_RO (_PAGE_PRESENT | _PAGE_ACCESSED)
7072
#define L1_PROT_NOCACHE (L1_PROT | _PAGE_PCD)
@@ -127,6 +129,26 @@ typedef unsigned long mfn_t;
127129
#define PADDR_INVALID (0UL)
128130
#define MFN_INVALID (0UL)
129131

132+
#define IS_ADDR_SPACE_VA(va, as) ((_ul(va) & (as)) == (as))
133+
134+
/* External declarations */
135+
136+
extern void *vmap(void *va, mfn_t mfn, unsigned int order,
137+
#if defined(__x86_64__)
138+
unsigned long l4_flags,
139+
#endif
140+
unsigned long l3_flags, unsigned long l2_flags, unsigned long l1_flags);
141+
extern void *vunmap(void *va, unsigned int order);
142+
143+
extern void *kmap(mfn_t mfn, unsigned int order,
144+
#if defined(__x86_64__)
145+
unsigned long l4_flags,
146+
#endif
147+
unsigned long l3_flags, unsigned long l2_flags, unsigned long l1_flags);
148+
extern void *kunmap(void *va, unsigned int order);
149+
150+
/* Static declarations */
151+
130152
static inline mfn_t paddr_to_mfn(paddr_t pa) { return (mfn_t)(pa >> PAGE_SHIFT); }
131153
static inline paddr_t mfn_to_paddr(mfn_t mfn) { return (paddr_t)(mfn << PAGE_SHIFT); }
132154

@@ -151,8 +173,6 @@ static inline void *mfn_to_virt_user(mfn_t mfn) {
151173
}
152174
static inline void *mfn_to_virt(mfn_t mfn) { return paddr_to_virt(mfn << PAGE_SHIFT); }
153175

154-
#define IS_ADDR_SPACE_VA(va, as) ((_ul(va) & (as)) == (as))
155-
156176
static inline paddr_t virt_to_paddr(const void *va) {
157177
paddr_t pa = (paddr_t) va;
158178

@@ -168,12 +188,31 @@ static inline mfn_t virt_to_mfn(const void *va) {
168188
return paddr_to_mfn(virt_to_paddr(va));
169189
}
170190

171-
/* External declarations */
191+
static inline void *vmap_1g(void *va, mfn_t mfn, unsigned long l3_flags) {
192+
return vmap(va, mfn, PAGE_ORDER_1G, L4_PROT_USER, l3_flags, PT_NO_FLAGS, PT_NO_FLAGS);
193+
}
172194

173-
extern void *vmap(void *va, mfn_t mfn, unsigned int order, unsigned long flags);
174-
extern void *vunmap(void *va, unsigned int order);
175-
extern void *kmap(mfn_t mfn, unsigned int order, unsigned long flags);
176-
extern void *kunmap(void *va, unsigned int order);
195+
static inline void *vmap_2m(void *va, mfn_t mfn, unsigned long l2_flags) {
196+
return vmap(va, mfn, PAGE_ORDER_2M, L4_PROT_USER, L3_PROT_USER, PT_NO_FLAGS,
197+
PT_NO_FLAGS);
198+
}
199+
200+
static inline void *vmap_4k(void *va, mfn_t mfn, unsigned long l1_flags) {
201+
return vmap(va, mfn, PAGE_ORDER_4K, L4_PROT_USER, L3_PROT_USER, L2_PROT_USER,
202+
l1_flags);
203+
}
204+
205+
static inline void *kmap_1g(mfn_t mfn, unsigned long l3_flags) {
206+
return kmap(mfn, PAGE_ORDER_1G, L4_PROT_USER, l3_flags, PT_NO_FLAGS, PT_NO_FLAGS);
207+
}
208+
209+
static inline void *kmap_2m(mfn_t mfn, unsigned long l2_flags) {
210+
return kmap(mfn, PAGE_ORDER_2M, L4_PROT_USER, L3_PROT_USER, l2_flags, PT_NO_FLAGS);
211+
}
212+
213+
static inline void *kmap_4k(mfn_t mfn, unsigned long l1_flags) {
214+
return kmap(mfn, PAGE_ORDER_4K, L4_PROT_USER, L3_PROT_USER, L2_PROT_USER, l1_flags);
215+
}
177216

178217
#endif /* __ASSEMBLY__ */
179218

mm/pmm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ void map_used_memory(void) {
306306
for_each_order (order) {
307307
list_for_each_entry (frame, &busy_frames[order], list) {
308308
if (!frame->mapped) {
309-
kmap(frame->mfn, order, L1_PROT);
309+
kmap(frame->mfn, order, L4_PROT, L3_PROT, L2_PROT, L1_PROT);
310310
frame->mapped = true;
311311
}
312312
}

mm/vmm.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ void *get_free_pages(unsigned int order, uint32_t flags) {
3737
return NULL;
3838

3939
if (flags & GFP_IDENT)
40-
va = vmap(mfn_to_virt(mfn), mfn, order, L1_PROT);
40+
va = vmap(mfn_to_virt(mfn), mfn, order, L4_PROT, L3_PROT, L2_PROT, L1_PROT);
4141
if (flags & GFP_USER)
42-
va = vmap(mfn_to_virt_user(mfn), mfn, order, L1_PROT_USER);
42+
va = vmap(mfn_to_virt_user(mfn), mfn, order, L4_PROT_USER, L3_PROT_USER,
43+
L2_PROT_USER, L1_PROT_USER);
4344
if (flags & GFP_KERNEL)
44-
va = kmap(mfn, order, L1_PROT);
45+
va = kmap(mfn, order, L4_PROT, L3_PROT, L2_PROT, L1_PROT);
4546

4647
return va;
4748
}

0 commit comments

Comments
 (0)