ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
emu_elf_source.c
Go to the documentation of this file.
1
11
12#include <stdint.h>
13
14#include "emu_elf.h"
17
35internal_elf_result(emu_elf_io_status_t status, uint64_t required, uint64_t supplied, int os_error)
36{
37 return (emu_elf_io_result_t){.status = status,
38 .required_bytes = required,
39 .supplied_bytes = supplied,
40 .os_error = os_error};
41}
42
59internal_from_host(emu_io_result_t io, uint64_t required, uint64_t supplied)
60{
62 if (io.status == k_emu_io_invalid) {
63 status = k_emu_elf_io_invalid;
64 } else if (io.status == k_emu_io_eof) {
65 status = k_emu_elf_io_eof;
66 }
67 return internal_elf_result(status, required, supplied, io.os_error);
68}
69
71{
72 if (source == nullptr) {
74 }
75 emu_io_file_t file = {.fd = -1, .size = 0};
76 const emu_io_result_t opened = priv_emu_io_open_read(path, &file);
77 if (opened.status != k_emu_io_ok) {
78 return internal_from_host(opened, 0U, 0U);
79 }
80 const emu_elf_source_t ready = {.fd = file.fd, .length = (uint64_t)file.size};
81 *source = ready;
82 return internal_elf_result(k_emu_elf_io_ok, ready.length, 0U, 0);
83}
84
86{
87 if ((source == nullptr) || (source->fd < 0)) {
89 }
90 const uint64_t length = source->length;
91 emu_io_file_t file = {.fd = source->fd, .size = (int64_t)source->length};
92 source->fd = -1;
93 source->length = 0U;
94 const emu_io_result_t closed = priv_emu_io_close(&file);
95 return (closed.status == k_emu_io_ok) ? internal_elf_result(k_emu_elf_io_ok, length, 0U, 0)
96 : internal_from_host(closed, length, 0U);
97}
98
100 uint64_t offset,
101 size_t required_bytes,
102 void* scratch,
103 size_t supplied_bytes,
104 emu_elf_view_t* view)
105{
106 if ((source == nullptr) || (source->fd < 0) || (scratch == nullptr) || (view == nullptr) ||
107 (required_bytes == 0U)) {
108 return internal_elf_result(k_emu_elf_io_invalid, required_bytes, supplied_bytes, 0);
109 }
110 if ((offset > source->length) || ((uint64_t)required_bytes > (source->length - offset))) {
111 return internal_elf_result(k_emu_elf_io_eof, required_bytes, supplied_bytes, 0);
112 }
113 if (required_bytes > supplied_bytes) {
114 return internal_elf_result(k_emu_elf_io_capacity, required_bytes, supplied_bytes, 0);
115 }
116 const emu_io_result_t read =
117 priv_emu_io_pread_exact(source->fd, scratch, required_bytes, (off_t)offset);
118 if (read.status != k_emu_io_ok) {
119 return internal_from_host(read, required_bytes, supplied_bytes);
120 }
121 *view =
122 (emu_elf_view_t){.bytes = (const uint8_t*)scratch, .length = required_bytes, .offset = offset};
123 return internal_elf_result(k_emu_elf_io_ok, required_bytes, supplied_bytes, 0);
124}
ELF32 image services for the board emulator (load / symbols / vectors).
emu_elf_io_status_t
Status for bounded raw-descriptor ELF source operations.
Definition emu_elf.h:74
@ k_emu_elf_io_eof
The source ended during an exact read.
Definition emu_elf.h:78
@ k_emu_elf_io_error
A host operation failed.
Definition emu_elf.h:79
@ k_emu_elf_io_capacity
Caller scratch is smaller than required.
Definition emu_elf.h:77
@ k_emu_elf_io_ok
The complete operation succeeded.
Definition emu_elf.h:75
@ k_emu_elf_io_invalid
A pointer, descriptor, range, or path was bad.
Definition emu_elf.h:76
emu_elf_io_result_t priv_emu_elf_read(const emu_elf_source_t *source, uint64_t offset, size_t required_bytes, void *scratch, size_t supplied_bytes, emu_elf_view_t *view)
Read one exact source range into caller-owned bounded scratch.
emu_elf_io_result_t priv_emu_elf_source_open(const char *path, emu_elf_source_t *source)
Open one regular ELF source without reading or allocating its bytes.
static RA8_INTERNAL emu_elf_io_result_t internal_elf_result(emu_elf_io_status_t status, uint64_t required, uint64_t supplied, int os_error)
Construct one fully initialized ELF I/O result.
emu_elf_io_result_t priv_emu_elf_source_close(emu_elf_source_t *source)
Close and invalidate one independently owned ELF source.
static RA8_INTERNAL emu_elf_io_result_t internal_from_host(emu_io_result_t io, uint64_t required, uint64_t supplied)
Translate a raw host-I/O result without losing progress metadata.
Private raw-descriptor ELF source operations.
Bounded raw-descriptor I/O seam for the RA8 emulator.
@ k_emu_io_eof
Input ended before the requested byte count.
@ k_emu_io_ok
The complete operation succeeded.
@ k_emu_io_invalid
A pointer, descriptor, size, or path was invalid.
emu_io_result_t priv_emu_io_pread_exact(int fd, void *buf, size_t count, off_t offset)
Read exactly count bytes at offset without changing the cursor.
emu_io_result_t priv_emu_io_close(emu_io_file_t *file)
Close and invalidate an owned raw file descriptor.
emu_io_result_t priv_emu_io_open_read(const char *path, emu_io_file_t *file)
Open and stat a regular file for bounded raw reading.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Exact result for source open and bounded view acquisition.
Definition emu_elf.h:83
One independently owned immutable raw-descriptor ELF source.
Definition emu_elf.h:91
int fd
Owned regular-file descriptor, or -1 when closed.
Definition emu_elf.h:92
uint64_t length
Stat-derived parsing bound.
Definition emu_elf.h:93
Transient view into caller-owned bounded scratch.
Definition emu_elf.h:97
Raw descriptor plus its stat-derived byte length.
Complete, caller-visible result of a raw host-I/O operation.
emu_io_status_t status
Semantic completion status.