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_ALIGN64K
;
21 /* First try to get memory with minix_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
) minix_mmap(0, len
, PROT_READ
|PROT_WRITE
, mmapflags
, -1, 0);
28 /* If that failed, maybe we're not running in paged mode.
29 * If that's the case, ENXIO will be returned.
30 * Memory returned with malloc() will be preallocated and
31 * contiguous, so fallback on that, and ask for a little extra
32 * so we can page align it ourselves.
34 if(buf
== (vir_bytes
) MAP_FAILED
) {
36 if(errno
!= (_SIGN ENXIO
)) {
39 if(flags
& AC_ALIGN4K
)
41 if(flags
& AC_ALIGN64K
)
46 if(!(buf
= (vir_bytes
) malloc(len
))) {
50 buf
+= align
- (buf
% align
);
53 /* Get physical address, if requested. */
54 if(phys
!= NULL
&& sys_umap(SELF
, VM_D
, buf
, len
, phys
) != OK
)
55 panic("sys_umap_data_fb failed");
60 int free_contig(void *addr
, size_t len
)
62 return minix_munmap(addr
, len
);