1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2017/11/30 Bernard The first version.
9*10465441SEvalZero */
10*10465441SEvalZero
11*10465441SEvalZero #include <stdint.h>
12*10465441SEvalZero #include <stdio.h>
13*10465441SEvalZero
14*10465441SEvalZero #include <rtthread.h>
15*10465441SEvalZero #include <dfs_posix.h>
16*10465441SEvalZero
17*10465441SEvalZero #include <sys/mman.h>
18*10465441SEvalZero
mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset)19*10465441SEvalZero void *mmap(void *addr, size_t length, int prot, int flags,
20*10465441SEvalZero int fd, off_t offset)
21*10465441SEvalZero {
22*10465441SEvalZero uint8_t *mem;
23*10465441SEvalZero
24*10465441SEvalZero if (addr)
25*10465441SEvalZero {
26*10465441SEvalZero mem = addr;
27*10465441SEvalZero }
28*10465441SEvalZero else mem = (uint8_t *)malloc(length);
29*10465441SEvalZero
30*10465441SEvalZero if (mem)
31*10465441SEvalZero {
32*10465441SEvalZero off_t cur;
33*10465441SEvalZero size_t read_bytes;
34*10465441SEvalZero
35*10465441SEvalZero cur = lseek(fd, 0, SEEK_SET);
36*10465441SEvalZero
37*10465441SEvalZero lseek(fd, offset, SEEK_SET);
38*10465441SEvalZero read_bytes = read(fd, mem, length);
39*10465441SEvalZero if (read_bytes != length)
40*10465441SEvalZero {
41*10465441SEvalZero if (addr == RT_NULL)
42*10465441SEvalZero {
43*10465441SEvalZero /* read failed */
44*10465441SEvalZero free(mem);
45*10465441SEvalZero mem = RT_NULL;
46*10465441SEvalZero }
47*10465441SEvalZero }
48*10465441SEvalZero lseek(fd, cur, SEEK_SET);
49*10465441SEvalZero
50*10465441SEvalZero return mem;
51*10465441SEvalZero }
52*10465441SEvalZero
53*10465441SEvalZero errno = ENOMEM;
54*10465441SEvalZero
55*10465441SEvalZero return MAP_FAILED;
56*10465441SEvalZero }
57*10465441SEvalZero
munmap(void * addr,size_t length)58*10465441SEvalZero int munmap(void *addr, size_t length)
59*10465441SEvalZero {
60*10465441SEvalZero if (addr)
61*10465441SEvalZero {
62*10465441SEvalZero free(addr);
63*10465441SEvalZero return 0;
64*10465441SEvalZero }
65*10465441SEvalZero
66*10465441SEvalZero return -1;
67*10465441SEvalZero }
68