Example #1
0
/*!
 * \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;
}
Example #2
0
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;
};
Example #3
0
int main(void)
{
	Object obj = Object_Create();
	DEBUG("Allocated...");
	Object_Release(obj);
	DEBUG(" deleted.\n");
	return 0;
};
Example #4
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;
};
Example #5
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();
}
Example #6
0
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;
};