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