-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjrisc_ctx_mem.c
87 lines (69 loc) · 1.79 KB
/
jrisc_ctx_mem.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* SPDX-License-Identifier: CC0-1.0
*
* Author: James Jones
*/
#include "jrisc_base.h"
#include "jrisc_ctx.h"
#include "jrisc_ctx_mem.h"
#include <stdlib.h>
#include <string.h>
struct MemoryContext {
const uint8_t *memoryRead;
size_t sizeRead;
uint8_t *memoryWrite;
size_t sizeWrite;
};
static enum JRISC_Error
jriscMemoryRead(void *userData,
uint64_t location,
uint64_t size,
void *dst)
{
struct MemoryContext *mCtx = (struct MemoryContext *)userData;
if (!mCtx->memoryRead) return JRISC_ERROR_ioError;
if ((location + size) > mCtx->sizeRead) return JRISC_ERROR_ioError;
memcpy(dst, &mCtx->memoryRead[location], size);
return JRISC_success;
}
static enum JRISC_Error
jriscMemoryWrite(void *userData,
uint64_t location,
uint64_t size,
const void *src)
{
struct MemoryContext *mCtx = (struct MemoryContext *)userData;
if (!mCtx->memoryWrite) return JRISC_ERROR_ioError;
if ((location + size) > mCtx->sizeWrite) return JRISC_ERROR_ioError;
memcpy(&mCtx->memoryWrite[location], src, size);
return JRISC_success;
}
static void
jriscDestroyMemory(void *userData)
{
free(userData);
}
enum JRISC_Error
jriscContextFromMemory(const void *memoryRead,
size_t sizeRead,
void *memoryWrite,
size_t sizeWrite,
uint32_t baseAddress,
struct JRISC_Context **contextOut)
{
struct MemoryContext *mCtx = calloc(1, sizeof(*mCtx));
enum JRISC_Error ret;
if (!mCtx) return JRISC_ERROR_outOfMemory;
mCtx->memoryRead = memoryRead;
mCtx->sizeRead = sizeRead;
mCtx->memoryWrite = memoryWrite;
mCtx->sizeWrite = sizeWrite;
ret = jriscContextCreate(jriscMemoryRead,
jriscMemoryWrite,
jriscDestroyMemory,
mCtx,
baseAddress,
contextOut);
if (JRISC_success != ret) jriscDestroyMemory(mCtx);
return ret;
}