#include <lunaix/syscall.h>
#include <lunaix/syscall_utils.h>
-#include <sys/mm/mm_defs.h>
+#include <asm/mm_defs.h>
#include <usr/lunaix/mann_flags.h>
((param->proct | param->flags) & 0x3f) | (param->type & ~0xffff));
region->mfile = file;
+ region->flen = param->flen;
region->foff = param->offset;
region->proc_vms = param->pvms;
}
}
- while (&pos->head != regions && length) {
+ size_t remaining = length;
+ while (&pos->head != regions && remaining) {
n = container_of(pos->head.next, typeof(*pos), head);
- __unmap_overlapped_cases(mnt, pos, &cur_addr, &length);
+ if (pos->start > cur_addr + length) {
+ break;
+ }
+
+ __unmap_overlapped_cases(mnt, pos, &cur_addr, &remaining);
pos = n;
}
return 0;
}
-__DEFINE_LXSYSCALL3(void*, sys_mmap, void*, addr, size_t, length, va_list, lst)
+__DEFINE_LXSYSCALL1(void*, sys_mmap, struct usr_mmap_param*, mparam)
{
- int proct = va_arg(lst, int);
- int fd = va_arg(lst, u32_t);
- off_t offset = va_arg(lst, off_t);
- int options = va_arg(lst, int);
- int errno = 0;
- void* result = (void*)-1;
-
- ptr_t addr_ptr = (ptr_t)addr;
+ off_t offset;
+ size_t length;
+ int proct, fd, options;
+ int errno;
+ void* result;
+ ptr_t addr_ptr;
+
+ proct = mparam->proct;
+ fd = mparam->fd;
+ offset = mparam->offset;
+ options = mparam->flags;
+ addr_ptr = __ptr(mparam->addr);
+ length = mparam->length;
+
+ errno = 0;
+ result = (void*)-1;
if (!length || length > BS_SIZE || va_offset(addr_ptr)) {
errno = EINVAL;
}
}
+ length = ROUNDUP(length, PAGE_SIZE);
struct mmap_param param = { .flags = options,
- .mlen = ROUNDUP(length, PAGE_SIZE),
+ .mlen = length,
+ .flen = length,
.offset = offset,
.type = REGION_TYPE_GENERAL,
.proct = proct,