7 #include <minix/sysutil.h>
9 void *alloc_contig(size_t len
, int flags
, phys_bytes
*phys
)
12 int mmapflags
= MAP_PREALLOC
|MAP_CONTIG
|MAP_ANON
;
14 if(flags
& AC_LOWER16M
)
15 mmapflags
|= MAP_LOWER16M
;
16 if(flags
& AC_LOWER1M
)
17 mmapflags
|= MAP_LOWER1M
;
18 if(flags
& AC_ALIGN64K
)
19 mmapflags
|= MAP_ALIGNMENT_64KB
;
21 /* First try to get memory with mmap. This is guaranteed
22 * to be page-aligned, and we can tell VM it has to be
23 * pre-allocated and contiguous.
26 buf
= (vir_bytes
) mmap(0, len
, PROT_READ
|PROT_WRITE
, mmapflags
, -1, 0);
28 if(buf
== (vir_bytes
) MAP_FAILED
) {
32 /* Get physical address, if requested. */
33 if(phys
!= NULL
&& sys_umap(SELF
, VM_D
, buf
, len
, phys
) != OK
)
34 panic("sys_umap_data_fb failed");
39 int free_contig(void *addr
, size_t len
)
41 return munmap(addr
, len
);