2012-04-28 21:55:23 +00:00
|
|
|
#include <string.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <stdlib.h>
|
2012-05-16 21:15:38 +00:00
|
|
|
#include <unistd.h>
|
2012-04-28 21:55:23 +00:00
|
|
|
|
2016-05-05 12:46:42 +00:00
|
|
|
#include "stlink/mmap.h"
|
2012-04-28 21:55:23 +00:00
|
|
|
|
2012-05-16 21:15:38 +00:00
|
|
|
void *mmap (void *addr, size_t len, int prot, int flags, int fd, long long offset) {
|
2012-04-28 21:55:23 +00:00
|
|
|
|
2014-07-10 05:31:11 +00:00
|
|
|
void *buf;
|
|
|
|
ssize_t count;
|
2012-04-28 21:55:23 +00:00
|
|
|
|
2014-07-10 05:31:11 +00:00
|
|
|
if ( addr || fd == -1 || (prot & PROT_WRITE)) return MAP_FAILED;
|
2012-04-28 21:55:23 +00:00
|
|
|
|
2014-07-10 05:31:11 +00:00
|
|
|
buf = malloc(len);
|
|
|
|
if ( NULL == buf ) return MAP_FAILED;
|
2012-04-28 21:55:23 +00:00
|
|
|
|
2014-07-10 05:31:11 +00:00
|
|
|
if (lseek(fd,offset,SEEK_SET) != offset) return MAP_FAILED;
|
2012-05-16 21:22:54 +00:00
|
|
|
|
2014-07-10 05:31:11 +00:00
|
|
|
count = read(fd, buf, len);
|
2012-05-16 21:22:54 +00:00
|
|
|
|
2014-07-10 05:31:11 +00:00
|
|
|
if (count != len) {
|
|
|
|
free (buf);
|
|
|
|
return MAP_FAILED;
|
|
|
|
}
|
2012-04-28 21:55:23 +00:00
|
|
|
|
2014-07-10 05:31:11 +00:00
|
|
|
return buf;
|
2012-04-28 21:55:23 +00:00
|
|
|
}
|
|
|
|
|
2012-05-16 21:15:38 +00:00
|
|
|
int munmap (void *addr, size_t len) {
|
2014-07-10 05:31:11 +00:00
|
|
|
free (addr);
|
|
|
|
return 0;
|
2012-04-28 21:55:23 +00:00
|
|
|
}
|