Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2956 → Rev 2959

/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)) {