Skip to content

Commit a2588be

Browse files
committed
Implement NVMM_GPA_MAP ioctl
1 parent fe8e5b8 commit a2588be

File tree

4 files changed

+49
-26
lines changed

4 files changed

+49
-26
lines changed

src/add-ons/kernel/drivers/nvmm/Jamfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ SEARCH_SOURCE += [ FDirName $(SUBDIR) x86 ] ;
99
SubDirCcFlags [ FDefines _KERNEL=1 ] ;
1010
SubDirC++Flags [ FDefines _KERNEL=1 ] ;
1111

12+
# Needed to include X86GPAtoHPATranslationMap
13+
UseHeaders [ FDirName $(HAIKU_TOP) src system kernel arch x86 ] : true ;
14+
1215
KernelAddon nvmm :
1316
nvmm.c
1417
nvmm_haiku.cpp

src/add-ons/kernel/drivers/nvmm/nvmm.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,6 @@ nvmm_hva_unmap(struct nvmm_owner *owner, struct nvmm_ioc_hva_unmap *args)
840840

841841
/* -------------------------------------------------------------------------- */
842842

843-
#if 0
844843
static int
845844
nvmm_gpa_map(struct nvmm_owner *owner, struct nvmm_ioc_gpa_map *args)
846845
{
@@ -896,16 +895,25 @@ nvmm_gpa_map(struct nvmm_owner *owner, struct nvmm_ioc_gpa_map *args)
896895
goto out;
897896
}
898897

898+
#if defined(__HAIKU__)
899+
os_vmmap_t *vm_map = os_vmspace_get_vmmap(mach->vm);
900+
/* Map the vmobj into the machine address space, as pageable. */
901+
error = os_vmobj_map(vm_map, &gpa, args->size, vmobj, off,
902+
false /* !wired */, true /* fixed */, false /* !shared */,
903+
args->prot, PROT_READ | PROT_WRITE | PROT_EXEC);
904+
#else
899905
/* Map the vmobj into the machine address space, as pageable. */
900906
error = os_vmobj_map(&mach->vm->vm_map, &gpa, args->size, vmobj, off,
901907
false /* !wired */, true /* fixed */, false /* !shared */,
902908
args->prot, PROT_READ | PROT_WRITE | PROT_EXEC);
909+
#endif
903910

904911
out:
905912
nvmm_machine_put(mach);
906913
return error;
907914
}
908915

916+
#if 0
909917
static int
910918
nvmm_gpa_unmap(struct nvmm_owner *owner, struct nvmm_ioc_gpa_unmap *args)
911919
{
@@ -1087,9 +1095,9 @@ nvmm_ioctl(struct nvmm_owner *owner, unsigned long cmd, void *data)
10871095
case NVMM_IOC_VCPU_INJECT:
10881096
return nvmm_vcpu_inject(owner, data);
10891097
case NVMM_IOC_VCPU_RUN:
1090-
return nvmm_vcpu_run(owner, data);
1098+
return nvmm_vcpu_run(owner, data);*/
10911099
case NVMM_IOC_GPA_MAP:
1092-
return nvmm_gpa_map(owner, data);
1100+
return nvmm_gpa_map(owner, data);/*
10931101
case NVMM_IOC_GPA_UNMAP:
10941102
return nvmm_gpa_unmap(owner, data);*/
10951103
case NVMM_IOC_HVA_MAP:

src/add-ons/kernel/drivers/nvmm/nvmm_haiku.cpp

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ extern "C" {
2828
#include <vm/VMCache.h>
2929
#include <vm/VMAddressSpace.h>
3030

31+
#include <paging/64bit/X86GPAtoHPATranslationMap.h>
32+
3133
#define __unused __attribute__ ((unused))
3234

3335

@@ -132,7 +134,10 @@ extern "C" struct haiku_vmobj {
132134

133135
// aka os_vmspace_t
134136
extern "C" struct haiku_vmspace {
135-
VMCache *cache;
137+
VMAddressSpace *address_space;
138+
// this holds exactly the same as address_space (duplicated)
139+
// but os_vmobj_map expects an os_vmmap_t*
140+
os_vmmap_t *vm_map;
136141
struct pmap pmap;
137142
};
138143

@@ -215,23 +220,22 @@ os_vmspace_create(vaddr_t vmin, vaddr_t vmax)
215220
if (ret == NULL)
216221
return NULL;
217222

218-
status_t status = VMCacheFactory::CreateAnonymousCache(ret->cache, false,
219-
0, 0, true, 0);
220-
if (status != B_OK) {
221-
os_mem_free(ret, sizeof(os_vmobj_t));
223+
ret->vm_map = (os_vmmap_t *)os_mem_alloc(sizeof(os_vmmap_t));
224+
if (ret->vm_map == NULL) {
225+
os_mem_free(ret, sizeof(os_vmspace_t));
222226
return NULL;
223227
}
224228

225-
ret->pmap.pm_invgen = 0;
226-
227-
// PML4 must be 512 entries of 8 bytes each
228-
STATIC_ASSERT(PAGE_SIZE == 4096);
229-
status = os_contigpa_zalloc(&ret->pmap.pm_pml4pa, (vaddr_t *)&ret->pmap.pm_pml4, 1);
229+
size_t size = vmax - vmin + 1;
230+
status_t status = VMAddressSpace::Create(0, vmin, size, false, true, &ret->address_space);
230231
if (status != B_OK) {
231-
ret->cache->Delete();
232-
os_mem_free(ret, sizeof(os_vmobj_t));
232+
os_mem_free(ret->vm_map, sizeof(os_vmmap_t));
233+
os_mem_free(ret, sizeof(os_vmspace_t));
233234
return NULL;
234235
}
236+
ret->vm_map->address_space = ret->address_space;
237+
238+
ret->pmap.pm_invgen = 0;
235239

236240
return ret;
237241
}
@@ -241,20 +245,18 @@ extern "C"
241245
void
242246
os_vmspace_destroy(os_vmspace_t *vm)
243247
{
244-
if (vm) {
245-
vm->cache->Delete();
246-
os_contigpa_free(vm->pmap.pm_pml4pa, (vaddr_t)vm->pmap.pm_pml4, 1);
247-
os_mem_free(vm, sizeof(os_vmspace_t));
248-
}
248+
vm->address_space->Put();
249+
os_mem_free(vm->vm_map, sizeof(os_vmmap_t));
250+
os_mem_free(vm, sizeof(os_vmspace_t));
249251
}
250252

251253

252254
extern "C"
253255
int
254256
os_vmspace_fault(os_vmspace_t *vm, vaddr_t va, vm_prot_t prot)
255257
{
256-
vm_page *page = vm->cache->LookupPage(va);
257-
if (page == NULL)
258+
VMArea *area = vm->address_space->LookupArea(va);
259+
if (area == NULL)
258260
return 1;
259261

260262
// TODO: Probably through page->cache_ref->cache
@@ -279,7 +281,18 @@ extern "C"
279281
paddr_t
280282
os_vmspace_pdirpa(os_vmspace_t *vm)
281283
{
282-
return vm->pmap.pm_pml4pa;
284+
X86GPAtoHPATranslationMap *map;
285+
map = (X86GPAtoHPATranslationMap *)vm->address_space->TranslationMap();
286+
287+
return map->PhysicalPML4();
288+
}
289+
290+
291+
extern "C"
292+
os_vmmap_t *
293+
os_vmspace_get_vmmap(os_vmspace_t *vm)
294+
{
295+
return vm->vm_map;
283296
}
284297

285298

src/add-ons/kernel/drivers/nvmm/nvmm_os.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,11 @@ extern bool pmap_ept_has_ad;
262262
// present at struct pmap from DragonFlyBSD
263263
// see sys/platform/pc64/include/pmap.h
264264
struct pmap {
265-
uint64_t* pm_pml4; // Kernel virtual address (KVA)
266-
// of level 4 page table
267-
paddr_t pm_pml4pa;
268265
uint64_t pm_invgen;
269266
};
270267
struct pmap *os_vmspace_pmap(os_vmspace_t *vm);
271268
paddr_t os_vmspace_pdirpa(os_vmspace_t *vm);
269+
os_vmmap_t *os_vmspace_get_vmmap(os_vmspace_t *vm);
272270
#endif
273271

274272
/* CPU. */
@@ -381,6 +379,7 @@ extern cpu_status *interrupt_status;
381379
#if defined(__HAIKU__)
382380
#define PROT_READ B_READ_AREA
383381
#define PROT_WRITE B_WRITE_AREA
382+
#define PROT_EXEC B_EXECUTE_AREA
384383
#endif
385384

386385
/* -------------------------------------------------------------------------- */

0 commit comments

Comments
 (0)