Skip to content
Snippets Groups Projects
Commit 7cfea176 authored by Byron Lathi's avatar Byron Lathi
Browse files

map user space and load data

parent 80e2710e
No related branches found
No related tags found
No related merge requests found
......@@ -15,8 +15,12 @@ name: PUSHL %EBX ;\
RET
/* the system call library wrappers */
DO_CALL(sys_read,1)
DO_CALL(sys_write,2)
DO_CALL(sys_halt,1)
DO_CALL(sys_open,3)
DO_CALL(sys_close,4)
DO_CALL(sys_exec,5)
DO_CALL(sys_exit,6)
......@@ -28,5 +32,5 @@ _start:
PUSHL $0
PUSHL $0
PUSHL %EAX
CALL sys_halt
CALL sys_exit
......@@ -40,13 +40,13 @@ uint32_t ext2_read_data(uint32_t inode_num, uint32_t count, uint16_t* buf)
if (!buf)
return -1;
if (!count)
return 0;
inode_t inode;
ext2_get_inode(inode_num, &inode);
uint32_t blocks_left = count;
// pass in 0 to load the whole file
if (blocks_left == 0)
blocks_left = (inode.sectors_used + 1) / 2;
int i;
for (i = 0; i < 12 && blocks_left != 0; i++) {
......@@ -174,8 +174,10 @@ uint32_t ext2_parse_path_to_inode_num(int8_t* filename)
inode = ext2_find_inode_num2(filename, inode);
if (!inode)
if (!inode) {
printf("File not found: %s\n", filename);
return inode;
}
// so now we got the inode of the first folder.
......
......@@ -306,4 +306,8 @@ sys_call_table:
.long 0
.long sys_read
.long sys_write
.long sys_open
.long sys_close
.long sys_exec
.long sys_exit
#include <types.h>
#include <lib.h>
#include <Devices/Storage/ext2.h>
#include <paging.h>
#include "execute.h"
// TEMPORARY!!!
static uint32_t pid = 0;
int32_t _sys_exec(uint8_t* name)
{
printf("In _sys_exec\n");
union {
uint16_t data16[512];
uint8_t data8[1024];
} data;
uint32_t parsed_inode = ext2_parse_path_to_inode_num((int8_t*)name);
if (!parsed_inode)
return -EXEC_NOT_FOUND;
ext2_read_data(parsed_inode, 1, data.data16);
if (data.data8[EI_MAG0] != ELFMAG0) return EXEC_NOT_ELF;
if (data.data8[EI_MAG1] != ELFMAG1) return EXEC_NOT_ELF;
if (data.data8[EI_MAG2] != ELFMAG2) return EXEC_NOT_ELF;
if (data.data8[EI_MAG3] != ELFMAG3) return EXEC_NOT_ELF;
elf_header_t* header = (elf_header_t*)data.data8;
map_large(EXEC_BASE_ADDR, _8MB + pid * _4MB);
ext2_read_data(parsed_inode, 0, (uint16_t*)EXEC_LOAD_ADDR);
printf("Some code for you: ");
int i;
for (i = 0; i < 16; i++) {
printf("%x ", *((uint8_t*)(header->e_entry) + i));
}
printf("\n");
return 1;
}
int32_t _sys_exit()
{
printf("in _sys_exit\n");
return -1;
}
......@@ -3,6 +3,12 @@
#include <types.h>
#define EXEC_NOT_FOUND -1
#define EXEC_NOT_ELF -2
#define EXEC_BASE_ADDR 0x08000000
#define EXEC_LOAD_ADDR 0x08048000
#define ET_NONE 0
#define ET_REL 1
#define ET_EXEC 2
......@@ -60,5 +66,7 @@ typedef struct {
uint16_t e_shstrndx;
} elf_header_t;
int32_t _sys_exec(uint8_t* name);
int32_t _sys_exit();
#endif
\ No newline at end of file
......@@ -2,6 +2,7 @@
#include <lib.h>
#include "syscalls.h"
#include "execute.h"
int32_t sys_read(int32_t fd, const void* buf, int32_t len)
{
......@@ -13,4 +14,23 @@ int32_t sys_write(int32_t fd, const void* buf, int32_t len)
{
printf("syswrite\n");
return -1;
}
int32_t sys_open(uint8_t* name)
{
return -1;
}
int32_t sys_close(int32_t fd)
{
return -1;
}
int32_t sys_exec(uint8_t* name)
{
return _sys_exec(name);
}
int32_t sys_exit() {
return _sys_exit();
}
\ No newline at end of file
......@@ -3,9 +3,19 @@
#include <types.h>
#define SYS_INVALID 0
#define SYS_READ 1
#define SYS_WRITE 2
#define SYS_OPEN 3
#define SYS_CLOSE 4
#define SYS_EXEC 5
#define SYS_EXIT 6
int32_t sys_read(int32_t fd, const void* buf, int32_t len);
int32_t sys_write(int32_t fd, const void* buf, int32_t len);
int32_t sys_open(uint8_t* name);
int32_t sys_close(int32_t fd);
int32_t sys_exec(uint8_t* name);
int32_t sys_exit();
#endif
......@@ -11,7 +11,7 @@
#include "Devices/Storage/ext2.h"
#include "paging.h"
#include "Syscalls/execute.h"
#include "Syscalls/syscalls.h"
#define MORE_DEBUG 0
......@@ -101,7 +101,7 @@ void entry(unsigned long magic, unsigned long addr) {
uint32_t fb_addr = mbi->framebuffer_info.framebuffer_addr_low;
init_paging();
map_large(fb_addr, fb_addr);
kmap_large(fb_addr, fb_addr);
printf("Does this work?\n");
......@@ -120,30 +120,10 @@ void entry(unsigned long magic, unsigned long addr) {
ext2_init(mbr.partitions[0].lba_start);
union {
uint16_t data16[512];
uint8_t data8[1024];
} data;
printf("Going to read some stuff.\n");
uint32_t parsed_inode = ext2_parse_path_to_inode_num("/Programs/bin/hello");
printf("Parsed inode: %x\n", parsed_inode);
ext2_read_data(parsed_inode, 1, data.data16);
printf("Data: %s\n", data.data8);
elf_header_t* header = (elf_header_t*)data.data8;
printf("elf type: %x\n", header->e_type);
printf("elf machine: %x\n", header->e_machine);
printf("elf flags: %x\n", header->e_flags);
printf("elf entry: %x\n", header->e_entry);
asm volatile(" \n\
mov $2, %eax \n\
int $0x80 \n\
");
int32_t error = sys_exec((uint8_t*)"/Programs/bin/hello");
if (error) {
printf("Error executing file: %d\n", error);
}
while (1) {
......
......@@ -6,6 +6,10 @@
#define CHECK_FLAG(flags, bit) ((flags) & (1 << (bit)))
#define _4MB 0x400000
#define _8MB 0x800000
typedef struct bmp {
union {
struct {
......
......@@ -64,6 +64,7 @@ int32_t kmap_large(uint32_t v_addr, uint32_t p_addr)
page_directory[dir_index].present = 1;
page_directory[dir_index].rw = 1;
page_directory[dir_index].us = 0;
page_directory[dir_index].ps = 1;
page_directory[dir_index].g = 1;
PDIR_SET_ADDR(dir_index, p_addr);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment