/trunk/kernel/generic/include/lib/rd.h |
---|
75,7 → 75,7 |
uint64_t data_size; |
} rd_header; |
extern int init_rd(rd_header * addr); |
extern int init_rd(rd_header * addr, size_t size); |
#endif |
/trunk/kernel/generic/src/main/kinit.c |
---|
180,7 → 180,7 |
if (!ipc_phone_0) |
ipc_phone_0 = &utask->answerbox; |
} else { |
int rd = init_rd((void *) init.tasks[i].addr); |
int rd = init_rd((rd_header *) init.tasks[i].addr, init.tasks[i].size); |
if (rd != RE_OK) |
printf("Init binary %zd not used.\n", i); |
/trunk/kernel/generic/src/lib/rd.c |
---|
39,8 → 39,10 |
#include <lib/rd.h> |
#include <arch/byteorder.h> |
#include <mm/frame.h> |
#include <sysinfo/sysinfo.h> |
int init_rd(rd_header * header) |
int init_rd(rd_header * header, size_t size) |
{ |
/* Identify RAM disk */ |
if ((header->magic[0] != RD_MAG0) || (header->magic[1] != RD_MAG1) || (header->magic[2] != RD_MAG2) || (header->magic[3] != RD_MAG3)) |
50,18 → 52,33 |
if (header->version != RD_VERSION) |
return RE_UNSUPPORTED; |
uint64_t hsize; |
uint32_t hsize; |
uint64_t dsize; |
switch (header->data_type) { |
case RD_DATA_LSB: |
hsize = uint64_t_le2host(header->header_size); |
hsize = uint32_t_le2host(header->header_size); |
dsize = uint64_t_le2host(header->data_size); |
break; |
// case RD_DATA_MSB: |
// hsize = uint64_t_be2host(header->header_size); |
// break; |
case RD_DATA_MSB: |
hsize = uint32_t_be2host(header->header_size); |
dsize = uint64_t_le2host(header->data_size); |
break; |
default: |
return RE_UNSUPPORTED; |
} |
if ((hsize % FRAME_SIZE) || (dsize % FRAME_SIZE)) |
return RE_UNSUPPORTED; |
if (hsize > size) |
return RE_INVALID; |
if ((uint64_t) hsize + dsize > size) |
dsize = size - hsize; |
sysinfo_set_item_val("rd", NULL, true); |
sysinfo_set_item_val("rd.size", NULL, dsize); |
sysinfo_set_item_val("rd.address.physical", NULL, (unative_t) KA2PA((void *) header + hsize)); |
return RE_OK; |
} |
/trunk/uspace/rd/rd.c |
---|
38,6 → 38,11 |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <ipc/ns.h> |
#include <sysinfo.h> |
#include <as.h> |
#include <ddi.h> |
#include <align.h> |
#include <bool.h> |
#include <errno.h> |
#include <async.h> |
64,20 → 69,40 |
} |
int main(int argc, char **argv) |
static bool rd_init(void) |
{ |
ipcarg_t phonead; |
size_t rd_size = sysinfo_value("rd.size"); |
void * rd_ph_addr = (void *) sysinfo_value("rd.address.physical"); |
async_set_client_connection(rd_connection); |
if (rd_size == 0) |
return false; |
/* Register service at nameserver */ |
if (ipc_connect_to_me(PHONE_NS, SERVICE_RD, 0, &phonead) != 0) |
return -1; |
void * rd_addr = as_get_mappable_page(rd_size); |
map_physmem(rd_ph_addr, rd_addr, ALIGN_UP(rd_size, PAGE_SIZE) >> PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE); |
return true; |
} |
async_manager(); |
/* Never reached */ |
return 0; |
int main(int argc, char **argv) |
{ |
if (rd_init()) { |
ipcarg_t phonead; |
async_set_client_connection(rd_connection); |
/* Register service at nameserver */ |
if (ipc_connect_to_me(PHONE_NS, SERVICE_RD, 0, &phonead) != 0) |
return -1; |
async_manager(); |
/* Never reached */ |
return 0; |
} |
return -1; |
} |
/** |
/trunk/uspace/libc/generic/sysinfo.c |
---|
38,10 → 38,8 |
sysarg_t sysinfo_value(char *name) |
{ |
return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t ) name, (sysarg_t) strlen(name) ); |
return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t ) name, (sysarg_t) strlen(name)); |
} |
/** @} |
*/ |