xref: /minix3/minix/lib/libsys/vm_cache.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1 
2 #include "syslib.h"
3 
4 #include <string.h>
5 #include <assert.h>
6 
7 #include <sys/mman.h>
8 
9 #include <minix/vm.h>
10 #include <minix/sysutil.h>
11 
12 #include <machine/param.h>
13 #include <machine/vmparam.h>
14 
15 int vm_cachecall(message *m, int call, void *addr, dev_t dev, off_t dev_offset,
16 	ino_t ino, off_t ino_offset, u32_t *flags, int blocksize)
17 {
18     if(blocksize % PAGE_SIZE)
19     	panic("blocksize %d should be a multiple of pagesize %d\n",
20 		blocksize, PAGE_SIZE);
21 
22     if(ino_offset % PAGE_SIZE)
23     	panic("inode offset %lld should be a multiple of pagesize %d\n",
24 		ino_offset, PAGE_SIZE);
25 
26     if(dev_offset % PAGE_SIZE)
27     	panic("dev offset offset %lld should be a multiple of pagesize %d\n",
28 		dev_offset, PAGE_SIZE);
29 
30     memset(m, 0, sizeof(*m));
31 
32     assert(dev != NO_DEV);
33 
34     m->m_vmmcp.dev_offset = dev_offset;
35     m->m_vmmcp.ino_offset = ino_offset;
36     m->m_vmmcp.ino = ino;
37     m->m_vmmcp.block = addr;
38     m->m_vmmcp.flags_ptr = flags;
39     m->m_vmmcp.dev = dev;
40     m->m_vmmcp.pages = blocksize / PAGE_SIZE;
41     m->m_vmmcp.flags = 0;
42 
43     return _taskcall(VM_PROC_NR, call, m);
44 }
45 
46 void *vm_map_cacheblock(dev_t dev, off_t dev_offset,
47 	ino_t ino, off_t ino_offset, u32_t *flags, int blocksize)
48 {
49 	message m;
50 
51 	if(vm_cachecall(&m, VM_MAPCACHEPAGE, NULL, dev, dev_offset,
52 		ino, ino_offset, flags, blocksize) != OK)
53 		return MAP_FAILED;
54 
55 	return m.m_vmmcp_reply.addr;
56 }
57 
58 int vm_set_cacheblock(void *block, dev_t dev, off_t dev_offset,
59 	ino_t ino, off_t ino_offset, u32_t *flags, int blocksize)
60 {
61 	message m;
62 
63 	return vm_cachecall(&m, VM_SETCACHEPAGE, block, dev, dev_offset,
64 		ino, ino_offset, flags, blocksize);
65 }
66 
67 int
68 vm_clear_cache(dev_t dev)
69 {
70 	message m;
71 
72 	assert(dev != NO_DEV);
73 
74 	memset(&m, 0, sizeof(m));
75 
76 	m.m_vmmcp.dev = dev;
77 
78 	return _taskcall(VM_PROC_NR, VM_CLEARCACHE, &m);
79 }
80