[kernel] Create system_map_mmio syscall
Create a syscall for drivers to be able to ask the kernel for a VMA that maps a MMIO area. Also expose vm_flags via j6 table style include file and new flags.h header.
This commit is contained in:
10
src/include/j6/flags.h
Normal file
10
src/include/j6/flags.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
/// \file flags.h
|
||||||
|
/// Enums used as flags for syscalls
|
||||||
|
|
||||||
|
enum j6_vm_flags {
|
||||||
|
#define VM_FLAG(name, v) j6_vm_flag_ ## name = v,
|
||||||
|
#include "j6/tables/vm_flags.inc"
|
||||||
|
#undef VM_FLAG
|
||||||
|
j6_vm_flags_MAX
|
||||||
|
};
|
||||||
@@ -2,6 +2,7 @@ SYSCALL(0x00, system_log, const char *)
|
|||||||
SYSCALL(0x01, system_noop, void)
|
SYSCALL(0x01, system_noop, void)
|
||||||
SYSCALL(0x02, system_get_log, j6_handle_t, char *, size_t *)
|
SYSCALL(0x02, system_get_log, j6_handle_t, char *, size_t *)
|
||||||
SYSCALL(0x03, system_bind_irq, j6_handle_t, j6_handle_t, unsigned)
|
SYSCALL(0x03, system_bind_irq, j6_handle_t, j6_handle_t, unsigned)
|
||||||
|
SYSCALL(0x04, system_map_mmio, j6_handle_t, j6_handle_t *, uintptr_t, size_t, uint32_t)
|
||||||
|
|
||||||
SYSCALL(0x08, object_koid, j6_handle_t, j6_koid_t *)
|
SYSCALL(0x08, object_koid, j6_handle_t, j6_koid_t *)
|
||||||
SYSCALL(0x09, object_wait, j6_handle_t, j6_signal_t, j6_signal_t *)
|
SYSCALL(0x09, object_wait, j6_handle_t, j6_signal_t, j6_signal_t *)
|
||||||
|
|||||||
9
src/include/j6/tables/vm_flags.inc
Normal file
9
src/include/j6/tables/vm_flags.inc
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
VM_FLAG( none, 0x00000000)
|
||||||
|
VM_FLAG( write, 0x00000001)
|
||||||
|
VM_FLAG( exec, 0x00000002)
|
||||||
|
VM_FLAG( zero, 0x00000010)
|
||||||
|
VM_FLAG( contiguous, 0x00000020)
|
||||||
|
VM_FLAG( large_pages, 0x00000100)
|
||||||
|
VM_FLAG( huge_pages, 0x00000200)
|
||||||
|
VM_FLAG( write_combine, 0x00001000)
|
||||||
|
VM_FLAG( mmio, 0x00010000)
|
||||||
@@ -17,20 +17,9 @@ class vm_space;
|
|||||||
|
|
||||||
enum class vm_flags : uint32_t
|
enum class vm_flags : uint32_t
|
||||||
{
|
{
|
||||||
none = 0x00000000,
|
#define VM_FLAG(name, v) name = v,
|
||||||
|
#include "j6/tables/vm_flags.inc"
|
||||||
write = 0x00000001,
|
#undef VM_FLAG
|
||||||
exec = 0x00000002,
|
|
||||||
|
|
||||||
zero = 0x00000010,
|
|
||||||
contiguous = 0x00000020,
|
|
||||||
|
|
||||||
large_pages = 0x00000100,
|
|
||||||
huge_pages = 0x00000200,
|
|
||||||
|
|
||||||
mmio = 0x00010000,
|
|
||||||
write_combine = 0x00020000,
|
|
||||||
|
|
||||||
user_mask = 0x0000ffff ///< flags allowed via syscall
|
user_mask = 0x0000ffff ///< flags allowed via syscall
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "objects/endpoint.h"
|
#include "objects/endpoint.h"
|
||||||
#include "objects/thread.h"
|
#include "objects/thread.h"
|
||||||
#include "objects/system.h"
|
#include "objects/system.h"
|
||||||
|
#include "objects/vm_area.h"
|
||||||
#include "syscalls/helpers.h"
|
#include "syscalls/helpers.h"
|
||||||
|
|
||||||
extern log::logger &g_logger;
|
extern log::logger &g_logger;
|
||||||
@@ -58,4 +59,16 @@ system_bind_irq(j6_handle_t sys, j6_handle_t endp, unsigned irq)
|
|||||||
return j6_err_invalid_arg;
|
return j6_err_invalid_arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
j6_status_t
|
||||||
|
system_map_mmio(j6_handle_t sys, j6_handle_t *vma_handle, uintptr_t phys_addr, size_t size, uint32_t flags)
|
||||||
|
{
|
||||||
|
// TODO: check capabilities on sys handle
|
||||||
|
if (!vma_handle) return j6_err_invalid_arg;
|
||||||
|
|
||||||
|
vm_flags vmf = vm_flags::mmio | (static_cast<vm_flags>(flags) & vm_flags::user_mask);
|
||||||
|
construct_handle<vm_area_fixed>(vma_handle, phys_addr, size, vmf);
|
||||||
|
|
||||||
|
return j6_status_ok;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace syscalls
|
} // namespace syscalls
|
||||||
|
|||||||
Reference in New Issue
Block a user