110,13 → 110,8 |
static arc_func_vector_t *arc_entry; |
|
|
static void arc_putchar(char ch); |
|
/** Return true if ARC is available */ |
int arc_enabled(void) |
{ |
return sbp != NULL; |
} |
#define arc_enabled() (sbp != NULL) |
|
|
/** Print configuration data that ARC reports about component */ |
210,28 → 205,23 |
/** Read from arc bios memory map and print it |
* |
*/ |
static int cmd_arc_print_memmap(cmd_arg_t *argv) |
void physmem_print(void) |
{ |
arc_memdescriptor_t *desc; |
printf("Base Size Type\n"); |
printf("---------- ---------- ---------\n"); |
|
printf("Memory map:\n"); |
if (arc_enabled()) { |
arc_memdescriptor_t *desc = arc_entry->getmemorydescriptor(NULL); |
|
desc = arc_entry->getmemorydescriptor(NULL); |
while (desc) { |
printf("%s: %d(%p) (size: %dKB)\n",basetypes[desc->type], |
desc->basepage * ARC_FRAME, |
desc->basepage * ARC_FRAME, |
desc->basecount*ARC_FRAME/1024); |
printf("%#10x %#10x %s\n", |
desc->basepage * ARC_FRAME, desc->basecount * ARC_FRAME, |
basetypes[desc->type]); |
desc = arc_entry->getmemorydescriptor(desc); |
} |
return 1; |
} else |
printf("%#10x %#10x free\n", 0, config.memory_size); |
} |
static cmd_info_t memmap_info = { |
.name = "arcmemmap", |
.description = "Print arc memory map", |
.func = cmd_arc_print_memmap, |
.argc = 0 |
}; |
|
/** Print charactor to console */ |
static void arc_putchar(char ch) |
243,20 → 233,8 |
ipl = interrupts_disable(); |
arc_entry->write(1, &ch, 1, &cnt); |
interrupts_restore(ipl); |
|
} |
|
static int cmd_reboot(cmd_arg_t *argv) |
{ |
arc_entry->reboot(); |
return 0; |
} |
static cmd_info_t reboot_info = { |
.name = "reboot", |
.description = "Reboot computer", |
.func = cmd_reboot, |
.argc = 0 |
}; |
|
/** Initialize ARC structure |
* |
276,10 → 254,6 |
arc_putchar('\n'); |
|
/* Add command for resetting the computer */ |
cmd_initialize(&reboot_info); |
cmd_register(&reboot_info); |
cmd_initialize(&memmap_info); |
cmd_register(&memmap_info); |
cmd_initialize(&devlist_info); |
cmd_register(&devlist_info); |
|
286,6 → 260,17 |
return 0; |
} |
|
int arc_reboot(void) |
{ |
if (arc_enabled()) { |
arc_entry->reboot(); |
return true; |
} |
|
return false; |
} |
|
|
static bool kbd_polling_enabled; |
static chardev_t console; |
|
302,7 → 287,7 |
if (arc_entry->getreadstatus(0)) |
return; |
result = arc_entry->read(0, &ch, 1, &count); |
if (result || count!=1) { |
if ((result) || (count != 1)) { |
return; |
} |
if (ch == '\r') |
320,7 → 305,7 |
long result; |
|
result = arc_entry->read(0, &ch, 1, &count); |
if (result || count!=1) { |
if ((result) || (count != 1)) { |
printf("Error reading from ARC keyboard.\n"); |
cpu_halt(); |
} |
353,8 → 338,9 |
.read = arc_read |
}; |
|
void arc_console(void) |
int arc_console(void) |
{ |
if (arc_enabled()) { |
kbd_polling_enabled = true; |
|
chardev_initialize("arc_console", &console, &arc_ops); |
361,14 → 347,20 |
virtual_timer_fnc = &arc_keyboard_poll; |
stdin = &console; |
stdout = &console; |
|
return true; |
} |
|
return false; |
} |
|
/* Initialize frame zones from ARC firmware. |
* In the future we may use even the FirmwareTemporary regions, |
* currently we use the FreeMemory (what about the LoadedProgram?) |
*/ |
void arc_frame_init(void) |
int arc_frame_init(void) |
{ |
if (arc_enabled()) { |
arc_memdescriptor_t *desc; |
int total = 0; |
uintptr_t base; |
376,8 → 368,8 |
|
desc = arc_entry->getmemorydescriptor(NULL); |
while (desc) { |
if (desc->type == FreeMemory || |
desc->type == FreeContiguous) { |
if ((desc->type == FreeMemory) || |
(desc->type == FreeContiguous)) { |
base = desc->basepage*ARC_FRAME; |
basesize = desc->basecount*ARC_FRAME; |
|
396,7 → 388,11 |
} |
|
config.memory_size = total; |
return true; |
} |
|
return false; |
} |
|
/** @} |
*/ |