/branches/tracing/uspace/lib/libc/include/loader/pcb.h |
---|
47,25 → 47,25 |
* arguments, environment variables etc. |
*/ |
typedef struct { |
/** Program entry point */ |
/** Program entry point. */ |
entry_point_t entry; |
/** Number of command-line arguments */ |
/** Number of command-line arguments. */ |
int argc; |
/** Command-line arguments */ |
/** Command-line arguments. */ |
char **argv; |
/* |
* ELF-specific data |
* ELF-specific data. |
*/ |
/** Pointer to ELF dynamic section of the program */ |
/** Pointer to ELF dynamic section of the program. */ |
void *dynamic; |
/** Pointer to dynamic section of the runtime linker */ |
void *rtld_dynamic; |
/** Runtime-linker load bias */ |
uintptr_t rtld_bias; |
} pcb_t; |
/** |
* A pointer to the program control block. Having received the PCB pointer, |
* the C library startup code stores it here for later use. |
*/ |
extern pcb_t *__pcb; |
#endif |
/branches/tracing/uspace/srv/loader/main.c |
---|
59,12 → 59,6 |
#include <elf.h> |
#include <elf_load.h> |
/** |
* Bias used for loading the dynamic linker. This will be soon replaced |
* by automatic placement. |
*/ |
#define RTLD_BIAS 0x80000 |
/** Pathname of the file that will be loaded */ |
static char *pathname = NULL; |
229,16 → 223,13 |
{ |
int rc; |
// printf("Load program '%s'\n", pathname); |
rc = elf_load_file(pathname, 0, &prog_info); |
if (rc < 0) { |
printf("failed to load program\n"); |
printf("Failed to load executable '%s'.\n", pathname); |
ipc_answer_0(rid, EINVAL); |
return 1; |
} |
// printf("Create PCB\n"); |
elf_create_pcb(&prog_info, &pcb); |
pcb.argc = argc; |
246,27 → 237,18 |
if (prog_info.interp == NULL) { |
/* Statically linked program */ |
// printf("Run statically linked program\n"); |
// printf("entry point: 0x%lx\n", prog_info.entry); |
is_dyn_linked = false; |
ipc_answer_0(rid, EOK); |
return 0; |
} |
printf("Load dynamic linker '%s'\n", prog_info.interp); |
rc = elf_load_file("/rtld.so", RTLD_BIAS, &interp_info); |
rc = elf_load_file(prog_info.interp, 0, &interp_info); |
if (rc < 0) { |
printf("failed to load dynamic linker\n"); |
printf("Failed to load interpreter '%s.'\n", prog_info.interp); |
ipc_answer_0(rid, EINVAL); |
return 1; |
} |
/* |
* Provide dynamic linker with some useful data |
*/ |
pcb.rtld_dynamic = interp_info.dynamic; |
pcb.rtld_bias = RTLD_BIAS; |
is_dyn_linked = true; |
ipc_answer_0(rid, EOK); |
/branches/tracing/uspace/srv/fb/fb.c |
---|
521,8 → 521,9 |
* |
*/ |
static bool |
screen_init(void *addr, unsigned int xres, unsigned int yres, |
unsigned int scan, unsigned int visual, bool invert_colors) |
screen_init(void *addr, unsigned int offset, unsigned int xres, |
unsigned int yres, unsigned int scan, unsigned int visual, |
bool invert_colors) |
{ |
switch (visual) { |
case VISUAL_INDIRECT_8: |
564,7 → 565,7 |
return false; |
} |
screen.fbaddress = (unsigned char *) addr; |
screen.fbaddress = (unsigned char *) (((uintptr_t) addr) + offset); |
screen.xres = xres; |
screen.yres = yres; |
screen.scanline = scan; |
1353,6 → 1354,7 |
unsigned int fb_height; |
unsigned int fb_scanline; |
unsigned int fb_visual; |
unsigned int fb_offset; |
bool fb_invert_colors; |
void *fb_addr; |
size_t asz; |
1360,6 → 1362,7 |
async_set_client_connection(fb_client_connection); |
fb_ph_addr = (void *) sysinfo_value("fb.address.physical"); |
fb_offset = sysinfo_value("fb.offset"); |
fb_width = sysinfo_value("fb.width"); |
fb_height = sysinfo_value("fb.height"); |
fb_scanline = sysinfo_value("fb.scanline"); |
1369,10 → 1372,10 |
asz = fb_scanline * fb_height; |
fb_addr = as_get_mappable_page(asz); |
physmem_map(fb_ph_addr, fb_addr, ALIGN_UP(asz, PAGE_SIZE) >> |
physmem_map(fb_ph_addr + fb_offset, fb_addr, ALIGN_UP(asz, PAGE_SIZE) >> |
PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE); |
if (screen_init(fb_addr, fb_width, fb_height, fb_scanline, fb_visual, |
if (screen_init(fb_addr, fb_offset, fb_width, fb_height, fb_scanline, fb_visual, |
fb_invert_colors)) |
return 0; |