|
|
1.1 ! root 1: /****************************************************************************** ! 2: * Copyright (c) 2004, 2008 IBM Corporation ! 3: * All rights reserved. ! 4: * This program and the accompanying materials ! 5: * are made available under the terms of the BSD License ! 6: * which accompanies this distribution, and is available at ! 7: * http://www.opensource.org/licenses/bsd-license.php ! 8: * ! 9: * Contributors: ! 10: * IBM Corporation - initial implementation ! 11: *****************************************************************************/ ! 12: ! 13: #include <of.h> ! 14: #include <pci.h> ! 15: #include <kernel.h> ! 16: #include <stdint.h> ! 17: #include <string.h> ! 18: #include <cpu.h> ! 19: #include <fileio.h> ! 20: #include <stdlib.h> /* malloc */ ! 21: #include <ioctl.h> /* ioctl */ ! 22: ! 23: /* Application entry point .*/ ! 24: extern int _start(unsigned char *arg_string, long len); ! 25: extern int main(int, char**); ! 26: void * malloc_aligned(size_t size, int align); ! 27: extern snk_module_t *insmod_by_type(int); ! 28: extern void rmmod_by_type(int); ! 29: ! 30: unsigned long exception_stack_frame; ! 31: ! 32: snk_fileio_t fd_array[FILEIO_MAX]; ! 33: ! 34: extern uint64_t tb_freq; ! 35: ! 36: void modules_init(void); ! 37: void modules_term(void); ! 38: int glue_init(snk_kernel_t *, unsigned int *, size_t, size_t); ! 39: void glue_release(void); ! 40: ! 41: static char save_vector[0x4000]; ! 42: extern char _lowmem_start; ! 43: extern char _lowmem_end; ! 44: extern char __client_start; ! 45: extern char __client_end; ! 46: ! 47: snk_kernel_t snk_kernel_interface = { ! 48: .version = 1, ! 49: .print = printk, ! 50: .us_delay = udelay, ! 51: .ms_delay = mdelay, ! 52: .k_malloc = malloc, ! 53: .k_malloc_aligned = malloc_aligned, ! 54: .k_free = free, ! 55: .strcmp = strcmp, ! 56: .snk_call = main, ! 57: .k_open = open, ! 58: .k_close = close, ! 59: .k_read = read, ! 60: .k_write = write, ! 61: .k_ioctl = ioctl, ! 62: .modules_remove = rmmod_by_type, ! 63: .modules_load = insmod_by_type, ! 64: }; ! 65: ! 66: void * ! 67: malloc_aligned(size_t size, int align) ! 68: { ! 69: unsigned long p = (unsigned long) malloc(size + align - 1); ! 70: p = p + align - 1; ! 71: p = p & ~(align - 1); ! 72: ! 73: return (void *) p; ! 74: } ! 75: ! 76: static void ! 77: copy_exception_vectors() ! 78: { ! 79: char *dest; ! 80: char *src; ! 81: int len; ! 82: ! 83: dest = save_vector; ! 84: src = (char *) 0x200; ! 85: len = &_lowmem_end - &_lowmem_start; ! 86: memcpy(dest, src, len); ! 87: ! 88: dest = (char *) 0x200; ! 89: src = &_lowmem_start; ! 90: memcpy(dest, src, len); ! 91: flush_cache(dest, len); ! 92: } ! 93: ! 94: static void ! 95: restore_exception_vectors() ! 96: { ! 97: char *dest; ! 98: char *src; ! 99: int len; ! 100: ! 101: dest = (char *) 0x200; ! 102: src = save_vector; ! 103: len = &_lowmem_end - &_lowmem_start; ! 104: memcpy(dest, src, len); ! 105: flush_cache(dest, len); ! 106: } ! 107: ! 108: int ! 109: _start_kernel(unsigned long p0, unsigned long p1) ! 110: { ! 111: int rc; ! 112: unsigned int timebase; ! 113: ! 114: /* initialize all file descriptor by marking them as empty */ ! 115: for(rc=0; rc<FILEIO_MAX; ++rc) { ! 116: fd_array[rc].type = FILEIO_TYPE_EMPTY; ! 117: fd_array[rc].idx = rc; ! 118: } ! 119: ! 120: /* this is step is e.g. resposible to initialize file descriptor 0 and 1 for STDIO */ ! 121: rc = glue_init(&snk_kernel_interface, &timebase, (size_t)(unsigned long)&__client_start, ! 122: (size_t)(unsigned long)&__client_end - (size_t)(unsigned long)&__client_start); ! 123: if(rc < 0) ! 124: return -1; ! 125: ! 126: tb_freq = (uint64_t) timebase; ! 127: copy_exception_vectors(); ! 128: modules_init(); ! 129: rc = _start((unsigned char *) p0, p1); ! 130: modules_term(); ! 131: restore_exception_vectors(); ! 132: ! 133: glue_release(); ! 134: return rc; ! 135: } ! 136: ! 137: ! 138: void ! 139: exception_forward(void) ! 140: { ! 141: restore_exception_vectors(); ! 142: undo_exception(); ! 143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.