/branches/dynload/tools/bin2c.py |
---|
33,15 → 33,18 |
import os |
INPUT = sys.argv[1] |
FILE_NAME = sys.argv[2] |
VAR_NAME = sys.argv[3] |
f = open(INPUT) |
line_length = 8 |
file_size = os.path.getsize(INPUT) |
print """#include <sys/types.h>' |
print """#include <sys/types.h> |
const size_t data_size = %d; |
const char data_filename[] = "/test"; |
const uint8_t data[] = {""" % file_size |
const size_t """ + VAR_NAME + "_size = " + str(file_size) +"""; |
const char """ + VAR_NAME + "_filename[] = \"/" + FILE_NAME +"""\"; |
const uint8_t """ + VAR_NAME + """[] = { |
"""; |
first_line = True |
/branches/dynload/uspace/app/iloader/main.c |
---|
38,8 → 38,10 |
#include <unistd.h> |
#include <fcntl.h> |
#include <sys/types.h> |
#include <as.h> |
#include "elf.h" |
#include "pcb.h" |
unsigned int elf_load(int fd, elf_header_t *header); |
76,9 → 78,26 |
/* not reached */ |
} |
void elf_create_pcb(elf_header_t *header) |
{ |
pcb_t *pcb; |
void *a; |
pcb = (pcb_t *)PCB_ADDRESS; |
a = as_area_create(pcb, sizeof(pcb_t), AS_AREA_READ | AS_AREA_WRITE); |
if (a == (void *)(-1)) { |
printf("elf_create_pcb: memory mapping failed\n"); |
return EE_MEMORY; |
} |
pcb->entry = (entry_point_t)header->e_entry; |
} |
int main(int argc, char *argv[]) |
{ |
elf_header_t header; |
elf_header_t prog_header; |
elf_header_t interp_header; |
char *file_name; |
int rc; |
85,18 → 104,29 |
printf("This is loader\n"); |
getchar(); |
file_name = "/test"; |
rc = elf_load_file(file_name, &header); |
printf("open and read '%s'...\n", file_name); |
printf("Load program\n"); |
rc = elf_load_file("/tetris", &prog_header); |
if (rc < 0) { |
printf("failed to load program\n"); |
return 1; |
} |
printf("run program\n"); |
elf_run(&header); |
printf("Create PCB\n"); |
elf_create_pcb(&prog_header); |
printf("Load dynamic linker\n"); |
file_name = "/rtld.so"; |
printf("open and read '%s'...\n", file_name); |
rc = elf_load_file(file_name, &interp_header); |
if (rc < 0) { |
printf("failed to load dynamic linker\n"); |
return 1; |
} |
printf("run dynamic linker\n"); |
elf_run(&interp_header); |
/* not reached */ |
return 0; |
} |
/branches/dynload/uspace/app/iloader/arch/ia32/_link.ld.in |
---|
7,7 → 7,7 |
} |
SECTIONS { |
. = 0x40001000; |
. = 0x70001000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
/branches/dynload/uspace/app/iramfs/data.h |
---|
37,10 → 37,14 |
#include <sys/types.h> |
extern const uint8_t data[]; |
extern const size_t data_size; |
extern const char data_filename[]; |
extern const uint8_t rtld[]; |
extern const size_t rtld_size; |
extern const char rtld_filename[]; |
extern const uint8_t tetris[]; |
extern const size_t tetris_size; |
extern const char tetris_filename[]; |
#endif |
/** @} |
/branches/dynload/uspace/app/iramfs/main.c |
---|
42,33 → 42,25 |
#include "data.h" |
#define min(a,b) ((a)>(b) ? (b) : (a)) |
int main(int argc, char *argv[]) |
int write_file(const uint8_t *data, size_t length, const char *file_name) |
{ |
int fd; |
int cnt; |
int rc; |
int nbytes; |
uint8_t *dp; |
int written; |
int fd; |
int cnt; |
printf("This is iramfs\n"); |
do { |
rc = mount("tmpfs", "/", "nulldev0"); |
printf("mount tmpfs on / -> %d\n", rc); |
if (rc == 0) break; |
printf("Create %s\n", file_name); |
usleep(1000 * 1000); |
} while (1); |
fd = open(file_name, O_CREAT); |
if (fd < 0) { printf("open failed\n"); return -1; } |
fd = open(data_filename, O_CREAT); |
if (fd < 0) { printf("open failed\n"); return 1; } |
printf("write %d bytes...\n", data_size); |
nbytes = data_size; dp = data; written = 0; |
printf("write %d bytes...\n", length); |
nbytes = length; dp = data; written = 0; |
while (nbytes > 0) { |
cnt = write(fd, dp, min(4096, nbytes)); |
if (cnt < 0) { printf("write failed\n"); return 1; } |
if (cnt < 0) { printf("write failed\n"); return -1; } |
dp += cnt; |
written += cnt; |
nbytes -= cnt; |
78,6 → 70,25 |
printf("\n\nwritten %d bytes\n", written); |
close(fd); |
return 0; |
} |
int main(int argc, char *argv[]) |
{ |
int rc; |
printf("This is iramfs\n"); |
do { |
rc = mount("tmpfs", "/", "nulldev0"); |
printf("mount tmpfs on / -> %d\n", rc); |
if (rc == 0) break; |
usleep(1000 * 1000); |
} while (1); |
if (write_file(rtld, rtld_size, rtld_filename) < 0) return 1; |
if (write_file(tetris, tetris_size, tetris_filename) < 0) return 1; |
printf("done\n"); |
getchar(); |
return 0; |
/branches/dynload/uspace/app/iramfs/Makefile |
---|
87,5 → 87,6 |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
data.c: ../../lib/rtld/rtld.so |
../../../tools/bin2c.py $< >$@ |
data.c: ../../lib/rtld/rtld.so ../tetris/tetris |
../../../tools/bin2c.py ../../lib/rtld/rtld.so rtld.so rtld >$@ |
../../../tools/bin2c.py ../tetris/tetris tetris tetris >>$@ |
/branches/dynload/uspace/lib/rtld/rtld.c |
---|
38,6 → 38,8 |
#include <unistd.h> |
#include <fcntl.h> |
#include "../../app/iloader/pcb.h" |
static void kputint(unsigned i) |
{ |
unsigned dummy; |
60,11 → 62,9 |
int fd, rc; |
char buf[5]; |
kputint(-1); |
kputint(z); |
printf("Hello, world! (from rtld)\n"); |
fd = open("/test", O_RDONLY); |
fd = open("/tetris", O_RDONLY); |
if (fd < 0) { printf("fd<0 ("); _putint(fd); printf(")\n"); } |
fd = 0; |
76,26 → 76,21 |
printf("x\n"); |
while(1); |
asm ( |
"movl $253, %%eax;" |
"int $0x30" |
: /* output */ |
: /* input */ |
: "%eax","%ecx","%edx" /* all scratch registers clobbered */ |
); |
} |
void _rtld_main(void) |
{ |
kputint(-1); |
// test_func(); |
kputint(32); |
pcb_t *pcb; |
test_func(); |
printf("Hello, world! (from rtld)\n"); |
getchar(); |
printf("Run program..\n"); |
kputint(46); |
pcb = (pcb_t *)PCB_ADDRESS; |
pcb->entry(); |
} |
/** @} |
/branches/dynload/uspace/lib/libc/generic/time.c |
---|
145,6 → 145,7 |
SERVICE_MEM_REALTIME, &rights); |
if (res) { |
printf("Failed to initialize timeofday memarea\n"); |
printf("Address was 0x%x\n", (unsigned)mapping); |
_exit(1); |
} |
if (!(rights & AS_AREA_READ)) { |