usercopy: usercopy_memset and possibly user helper macro

This commit is contained in:
Matheus
2024-09-21 12:05:44 -03:00
parent fb2fa68752
commit 09836801a3
2 changed files with 40 additions and 0 deletions
+33
View File
@@ -18,6 +18,12 @@ typedef struct {
uint32_t *address;
} atomic32desc_t;
typedef struct {
void *dst;
uint8_t byte;
size_t size;
} memsetdesc_t;
static void memcpyinternal(context_t *ctx, void *arg) {
memcpydesc_t *desc = arg;
@@ -60,6 +66,20 @@ static void atomic32internal(context_t *ctx, void *arg) {
current_thread()->usercopyctx = NULL;
}
static void memset_internal(context_t *ctx, void *arg) {
memsetdesc_t *desc = arg;
// this sets up the thread so that in the next invalid page fault, it will jump to
// this context with CTX_RET set to EFAULT
current_thread()->usercopyctx = ctx;
memset(desc->dst, desc->byte, desc->size);
// no errors!
CTX_RET(ctx) = 0;
current_thread()->usercopyctx = NULL;
}
int usercopy_touser(void *user, void *kernel, size_t size) {
memcpydesc_t desc = {
.dst = user,
@@ -109,3 +129,16 @@ int usercopy_fromuseratomic32(uint32_t *user32, uint32_t *value) {
return arch_context_saveandcall(atomic32internal, NULL, &desc);
}
int usercopy_memset(void *user, uint8_t byte, size_t size) {
memsetdesc_t desc = {
.dst = user,
.byte = byte,
.size = size
};
if (IS_USER_ADDRESS(user) == false)
return EFAULT;
return arch_context_saveandcall(memset_internal, NULL, &desc);
}