diff options
author | Benji Dial <Benji3.141@gmail.com> | 2020-08-11 11:33:21 -0400 |
---|---|---|
committer | Benji Dial <Benji3.141@gmail.com> | 2020-08-11 11:33:21 -0400 |
commit | 63167f223e1f54910f6b80e698390ee60aec79ee (patch) | |
tree | 41844f646bdcb5c9ba241bb5867c5e4f51737d52 /src/kernel/plef.c | |
parent | 77d7a284c02bc6b1b3a3a92ad5d957172cee9b81 (diff) | |
download | portland-os-63167f223e1f54910f6b80e698390ee60aec79ee.tar.gz |
lots of progress
currently, BAR fields of IDE drives are all returning zero, and the ATA read function isn't working. i'm not sure why.
i'm going to work on VESA next, and come back to the IDE driver later
Diffstat (limited to 'src/kernel/plef.c')
-rw-r--r-- | src/kernel/plef.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/kernel/plef.c b/src/kernel/plef.c new file mode 100644 index 0000000..2cba843 --- /dev/null +++ b/src/kernel/plef.c @@ -0,0 +1,33 @@ +#include <stdint.h> +#include <stdbool.h> +#include "plef.h" +#include "drive.h" +#include "util.h" +#include "task.h" + +#define PLEF_MAGIC 0xb9ba4c50 + +task_handle plef_run(struct drive *d, char *path) { + drive_file_id_t h = d->get_file(d, path); + if (!h) + return 0; + + uint8_t start[512]; + d->load_sector(d, h, 0, start); + + struct plef_header head = *(struct plef_header *)start; + if ((head.magic != PLEF_MAGIC) || (head.version_high)) { + d->free_file(d, h); + return 0; + } + + uint32_t payload_addr; + segment_id cs = new_segment(true, head.payload_length + head.bss_length, &payload_addr); + segment_id ds = mirror_segment(false, cs); + + fmcpy((void *)payload_addr, d, h, head.payload_offset, head.payload_length); + + d->free_file(d, h); + + return new_task(cs, ds, head.entry_point, head.payload_length + head.bss_length); +}
\ No newline at end of file |