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