/*! * \brief Load an ELF file into an address space * \param space Address space * \param data ELF file data * \param size Size of data */ Elf::Entry Elf::load(AddressSpace *space, const char *name) { Elf32_Ehdr hdr; int obj; // World's stupidest ELF loader. Loop across program headers and // copy each into the address space obj = Name_Open(name); File_Read(obj, &hdr, sizeof(hdr)); Elf32_Phdr phdrs[hdr.e_phnum]; File_Seek(obj, hdr.e_phoff); File_Read(obj, phdrs, sizeof(phdrs)); for(int i=0; i<hdr.e_phnum; i++) { if(phdrs[i].p_type != PT_LOAD) { continue; } // Add a memory area for each program header int aligned = PAGE_ADDR_ROUND_DOWN(phdrs[i].p_vaddr); MemArea *area = new MemAreaPages(phdrs[i].p_memsz + phdrs[i].p_vaddr - aligned); space->map(area, (void*)phdrs[i].p_vaddr, 0, area->size()); // Copy the data into the section, and zero-init the space at the end File_Seek(obj, phdrs[i].p_offset); File_Read(obj, (void*)phdrs[i].p_vaddr, phdrs[i].p_filesz); memset((void*)(phdrs[i].p_vaddr + phdrs[i].p_filesz), 0, phdrs[i].p_memsz - phdrs[i].p_filesz); } Object_Release(obj); return (Entry)hdr.e_entry; }
int main(void) { INIT(); long int i; Object list = List_Create(); Object iterator; for(i = 0; i < NODES; i++) { List_PushFront(list, INT_AS_OBJECT(i)); }; List_Sort(list); ; for(iterator = List_First(list), i = 0; !ListIterator_ThisEnd(iterator); ListIterator_Next(iterator), i++) { if(OBJECT_AS_INT(ListIterator_ThisData(iterator)) != i) { DEBUG("Got %li, but %li expected.\n", OBJECT_AS_INT(ListIterator_ThisData(iterator)), i); return 1; }; }; Object_Release(list); return 0; };
int main(void) { Object obj = Object_Create(); DEBUG("Allocated..."); Object_Release(obj); DEBUG(" deleted.\n"); return 0; };
int main(void) { INIT(); int i, j; Object list = List_Create(); for(j = 0; j < TIMES; j++) { Object front, back; for(i = 0; i < NODES; i++) { if(i & 1) { List_PushBack(list, INT_AS_OBJECT(i)); } else { List_PushFront(list, INT_AS_OBJECT(i)); }; }; front = List_First(list); back = List_Last(list); while(!ListIterator_ThisEnd(front)) { ListIterator_Next(front); ListIterator_Prev(back); }; if(!ListIterator_ThisBegin(back)) { return 1; }; List_Clean(list); }; Object_Release(list); return 0; };
/*! * \brief Entry point for C++ code, called by assembly code after basic init is done */ void Entry() { // Run C++ constructors to get global objects initialized runCtors(); // Initialize the page list and kernel data structures Page::init(); Kernel::init(); Interrupt::init(); // Start the InitFs file server, to serve up files from the // built-in filesystem that is compiled into the kernel InitFs initfs; initfs.start(); // Kernel initialization is now complete. Set up the userspace server, and the first userspace process Server server; int obj = server.startUserProcess("/boot/name\0/boot/init\0\0", OBJECT_INVALID, OBJECT_INVALID, OBJECT_INVALID, initfs.object()); Object_Release(obj); // Start userspace. This call never returns. server.run(); }
int main(void) { INIT(); long int i; int l = 10, r = 5; Object list = List_Create(); Object list2 = List_Create(); Object temp_list; Object front, back; // list2 = (0 1 2 3 4 5 6 ... 148 149) for(i = 0; i < l + r; i++) { List_PushBack(list2, INT_AS_OBJECT(i)); }; // list = (99998 99996 ... 8 6 4 2 0 1 3 5 7 9 ... 99997 99999 ) for(i = 0; i < NODES; i++) { if(i & 1) { List_PushBack(list, INT_AS_OBJECT(i)); } else { List_PushFront(list, INT_AS_OBJECT(i)); }; }; for(front = List_First(list), i = 0; i < NODES / 2; ListIterator_Next(front), i++) { List_AddAfterPosition(list2, INT_AS_OBJECT(l - 1 + i), ListIterator_ThisData(front)); }; for(back = List_Last(list), i = 0; i < NODES / 2; ListIterator_Prev(back), i++) { List_AddAfterPosition(list2, INT_AS_OBJECT(l + NODES / 2 - 1), ListIterator_ThisData(back)); }; front = List_IteratorFromPosition(list2, INT_AS_OBJECT(l)); TEST("Checking for correctness of IteratorFromPosition after AddList{Before|After}", OBJECT_AS_INT(ListIterator_ThisData(front)) == (NODES & (~1)) - ((!(NODES & 1)) * 2)); back = List_IteratorFromPosition(list2, INT_AS_OBJECT(l + NODES - 1)); TEST("Checking for correctness of IteratorFromPosition after AddList{Before|After}", OBJECT_AS_INT(ListIterator_ThisData(back)) == (NODES & (~1)) - 1 + ((NODES & 1) * 2)); temp_list = List_SublistBetweenIterators(list2, front, back); front = List_First(temp_list); back = List_Last(temp_list); for(i = 1; i < NODES / 2; i++) { if(OBJECT_AS_INT(ListIterator_ThisData(front)) != OBJECT_AS_INT(ListIterator_ThisData(back)) + 1) { DEBUG("Got %li and %li.\n", OBJECT_AS_INT(ListIterator_ThisData(front)), OBJECT_AS_INT(ListIterator_ThisData(back))); return 1; }; ListIterator_Next(front); ListIterator_Prev(back); }; Object_Release(list); Object_Release(list2); Object_Release(temp_list); return 0; };