Compare commits
	
		
			29 Commits 
		
	
	
		
			7c1f380184
			...
			e8135e9ff9
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | e8135e9ff9 | 4 months ago | 
|  | c38000e503 | 4 months ago | 
|  | 9ffd22e941 | 4 months ago | 
|  | 698d0c155b | 4 months ago | 
|  | 68f0381c01 | 4 months ago | 
|  | bc0a94b705 | 4 months ago | 
|  | 2a7d1bdedc | 4 months ago | 
|  | 689c77f19e | 4 months ago | 
|  | 38a10f2010 | 4 months ago | 
|  | f5c42a8e77 | 4 months ago | 
|  | 638aa9b636 | 4 months ago | 
|  | 7322a9ed70 | 4 months ago | 
|  | e6d6e7521c | 4 months ago | 
|  | da34f7cada | 4 months ago | 
|  | 94249eda37 | 4 months ago | 
|  | d9978ddc37 | 5 months ago | 
|  | 68e11c9793 | 5 months ago | 
|  | 5b664840d8 | 5 months ago | 
|  | 944d4991cb | 5 months ago | 
|  | 76eb2420bd | 5 months ago | 
|  | b422ee176a | 5 months ago | 
|  | c1145d28f8 | 5 months ago | 
|  | ab76afa30a | 5 months ago | 
|  | 3d659e0eab | 5 months ago | 
|  | e8ec76112b | 5 months ago | 
|  | a0e2a59f96 | 5 months ago | 
|  | 24a0888760 | 5 months ago | 
|  | f90eaa3fcd | 5 months ago | 
|  | a38b6cbdb2 | 5 months ago | 
| @ -0,0 +1,195 @@ | |||||||
|  | #include "arch/lapic.h" | ||||||
|  | #include "boot/startup_ap.h" | ||||||
|  | #include "arch/core_interrupt.h" | ||||||
|  | #include "debug/copystream.h" | ||||||
|  | #include "debug/output.h" | ||||||
|  | #include "debug/assert.h" | ||||||
|  | 
 | ||||||
|  | #include "arch/cga.h" | ||||||
|  | #include "arch/textwindow.h" | ||||||
|  | #include "arch/serial.h" | ||||||
|  | #include "device/serialstream.h" | ||||||
|  | #include "device/textstream.h" | ||||||
|  | #include "device/ps2controller.h" | ||||||
|  | #include "arch/ioapic.h" | ||||||
|  | #include "thread/scheduler.h" | ||||||
|  | #include "user/app1/appl.h" | ||||||
|  | #include "sync/ticketlock.h" | ||||||
|  | #include "interrupt/guard.h" | ||||||
|  | 
 | ||||||
|  | #include "arch/context.h" | ||||||
|  | #include "thread/thread.h" | ||||||
|  | 
 | ||||||
|  | ///TextStream kout = TextStream(0, 80, 0, 10, true); | ||||||
|  | Ticketlock koutlock; | ||||||
|  | Scheduler sch; | ||||||
|  | 
 | ||||||
|  | //TextStream dout[8] = { | ||||||
|  | //    TextStream(0 ,20,12,25,false),  | ||||||
|  | //    TextStream(20,40,12,25,false), | ||||||
|  | //    TextStream(40,60,12,25,false), | ||||||
|  | //    TextStream(60,80,12,25,false), | ||||||
|  | //    TextStream(0 ,0 ,0, 0,false), | ||||||
|  | //    TextStream(0 ,0 ,0, 0,false), | ||||||
|  | //    TextStream(0 ,0 ,0, 0,false), | ||||||
|  | //    TextStream(0 ,0 ,0, 0,false), | ||||||
|  | //}; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | TextStream dout[Core::MAX] = { | ||||||
|  |     {0,  40, 10, 14}, | ||||||
|  |     {40, 80, 10, 14}, | ||||||
|  |     {0,  40, 14, 18}, | ||||||
|  |     {40, 80, 14, 18}, | ||||||
|  |     {0,  40, 18, 22}, | ||||||
|  |     {40, 80, 18, 22}, | ||||||
|  |     {0,  40, 22, 25}, | ||||||
|  |     {40, 80, 22, 25}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | CopyStream copystream[Core::MAX]{ | ||||||
|  |     {&dout[0], &sout}, | ||||||
|  |     {&dout[1], &sout}, | ||||||
|  |     {&dout[2], &sout}, | ||||||
|  |     {&dout[3], &sout}, | ||||||
|  |     {&dout[4], &sout}, | ||||||
|  |     {&dout[5], &sout}, | ||||||
|  |     {&dout[6], &sout}, | ||||||
|  |     {&dout[7], &sout}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | OutputStream* copyout[Core::MAX]{ | ||||||
|  |     &dout[0], | ||||||
|  |     ©stream[1], | ||||||
|  |     &dout[2], | ||||||
|  |     &dout[3], | ||||||
|  |     &dout[4], | ||||||
|  |     &dout[5], | ||||||
|  |     &dout[6], | ||||||
|  |     &dout[7] | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | unsigned int testx, testy; | ||||||
|  | 
 | ||||||
|  | uint8_t test1_stack[1024]; | ||||||
|  | uint8_t test2_stack[1024]; | ||||||
|  | uint8_t test3_stack[1024]; | ||||||
|  | uint8_t test4_stack[1024]; | ||||||
|  | uint8_t test5_stack[1024]; | ||||||
|  | uint8_t test6_stack[1024]; | ||||||
|  | uint8_t test7_stack[1024]; | ||||||
|  | uint8_t test8_stack[1024]; | ||||||
|  | uint8_t test9_stack[1024]; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //Thread test1_thread = Thread(&test1_stack[sizeof(test1_stack)-1]); | ||||||
|  | Application application1 = Application(&test1_stack[sizeof(test1_stack)-1]); | ||||||
|  | Application application2 = Application(&test2_stack[sizeof(test2_stack)-1]); | ||||||
|  | Application application3 = Application(&test3_stack[sizeof(test3_stack)-1]); | ||||||
|  | Application application4 = Application(&test4_stack[sizeof(test4_stack)-1]); | ||||||
|  | Application application5 = Application(&test5_stack[sizeof(test5_stack)-1]); | ||||||
|  | Application application6 = Application(&test6_stack[sizeof(test5_stack)-1]); | ||||||
|  | Application application7 = Application(&test7_stack[sizeof(test5_stack)-1]); | ||||||
|  | Application application8 = Application(&test8_stack[sizeof(test5_stack)-1]); | ||||||
|  | Application application9 = Application(&test9_stack[sizeof(test5_stack)-1]); | ||||||
|  | 
 | ||||||
|  | //Context test2; | ||||||
|  | //uint8_t test2_stack[256]; | ||||||
|  | //Thread test2_thread = Thread(&test2_stack[sizeof(test2_stack)-1]); | ||||||
|  | 
 | ||||||
|  | //void test_func1(){ | ||||||
|  | //    while(1){ | ||||||
|  | //        { | ||||||
|  | //            Guarded g = Guard::enter(); | ||||||
|  | //            g.vault().kout << "test 1\n" << flush; | ||||||
|  | //        } | ||||||
|  | //        context_switch(&test2, &test1); | ||||||
|  | //    } | ||||||
|  | //} | ||||||
|  | // | ||||||
|  | //void test_func2(){ | ||||||
|  | //    while(1){ | ||||||
|  | //        { | ||||||
|  | //            Guarded g = Guard::enter(); | ||||||
|  | //            g.vault().kout << "test 2\n" << flush; | ||||||
|  | //        } | ||||||
|  | //        context_switch(&test1, &test2); | ||||||
|  | //    } | ||||||
|  | //} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // Main function | ||||||
|  | // (the bootstrap processor starts here)} | ||||||
|  | extern "C" int main() { | ||||||
|  |   CGA::setCursor(0, 0); | ||||||
|  | 
 | ||||||
|  |   unsigned int numCPUs = Core::count(); | ||||||
|  |   /* Start application processors | ||||||
|  |    * To avoid unexpected behaviour, make sure that interrupts are not | ||||||
|  |    * enabled before the APs are booted. Otherwise it might interfere with the | ||||||
|  |    * Startup IPIs or even block devices like keyboard because of a missing EOI | ||||||
|  |    */ | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |       Guarded g = Guard::enter(); | ||||||
|  |       sch.ready(&application1); | ||||||
|  |       sch.ready(&application2); | ||||||
|  |       sch.ready(&application3); | ||||||
|  |       sch.ready(&application4); | ||||||
|  |       sch.ready(&application5); | ||||||
|  |       sch.ready(&application6); | ||||||
|  |       sch.ready(&application7); | ||||||
|  |       sch.ready(&application8); | ||||||
|  |       sch.ready(&application9); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   ApplicationProcessor::boot(); | ||||||
|  |    | ||||||
|  |   PS2Controller::init(); | ||||||
|  | 
 | ||||||
|  |   IOAPIC::init(); | ||||||
|  |   IOAPIC::config(1, Core::Interrupt::KEYBOARD); | ||||||
|  |   IOAPIC::allow(1); | ||||||
|  | 
 | ||||||
|  |   Core::Interrupt::enable(); | ||||||
|  | 
 | ||||||
|  |   PS2Controller::drainBuffer(); | ||||||
|  | 
 | ||||||
|  |   DBG << "Main CPU " << static_cast<int>(LAPIC::getID()) << endl << flush; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |       Guarded g = Guard::enter(); | ||||||
|  |       sch.schedule(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   //Application{}.action(); | ||||||
|  |   while (true){ | ||||||
|  |       //DBG << "pos: " << testx << ", " << testy << endl << flush; | ||||||
|  |       //Core::pause(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Main function for application processors | ||||||
|  | extern "C" int main_ap() { | ||||||
|  |   DBG_VERBOSE << "CPU core " << static_cast<int>(Core::getID()) << " / LAPIC " | ||||||
|  |               << static_cast<int>(LAPIC::getID()) << " in main_ap()" << endl; | ||||||
|  |   Core::Interrupt::enable(); | ||||||
|  | 
 | ||||||
|  |   DBG << "App CPU " << static_cast<int>(Core::getID()) << endl << flush; | ||||||
|  | 
 | ||||||
|  |   { | ||||||
|  |       Guarded g = Guard::enter(); | ||||||
|  |       sch.schedule(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   //assert(Core::getID() != 1); | ||||||
|  |   //Application{}.action(); | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
| @ -1,9 +1,21 @@ | |||||||
| #include "context.h" | #include "context.h" | ||||||
|  | #include "../debug/output.h" | ||||||
|  | 
 | ||||||
|  | void panic(){ | ||||||
|  |     DBG << "panic!\n" << flush; | ||||||
|  |     while(1); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| void prepareContext(void* tos, Context& context, void (*kickoff)(void*), | void prepareContext(void* tos, Context& context, void (*kickoff)(void*), | ||||||
|                     void* param1) { |                     void* param1) { | ||||||
|   (void)tos; |     ((uint64_t*)tos)[0] = (uint64_t)panic; | ||||||
|   (void)context; |     ((uint64_t*)tos)[-1] = (uint64_t)kickoff; | ||||||
|   (void)kickoff; |     ((uint64_t*)tos)[-2] = (uint64_t)fake_systemv_abi; | ||||||
|   (void)param1; |     context.rsp = (void*)(((uint64_t) tos)-16); | ||||||
|  |     context.rbx = 0; | ||||||
|  |     context.rbp = 0; | ||||||
|  |     context.r12 = 0; | ||||||
|  |     context.r13 = 0; | ||||||
|  |     context.r14 = 0; | ||||||
|  |     context.r15 = (uint64_t)param1; | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,4 @@ | |||||||
|  | scheduler in vault | ||||||
|  | next implementieren | ||||||
|  | thread kill nicht in die liste enqueuen, scheduler.cc zeile 26 | ||||||
|  | setzen von epi flags interrupt vermutlich disablen.  | ||||||
| @ -1,16 +1,7 @@ | |||||||
| #include "./semaphore.h" | #include "./semaphore.h" | ||||||
| 
 | 
 | ||||||
| #include "../interrupt/guard.h" |  | ||||||
| #include "../thread/thread.h" |  | ||||||
| 
 |  | ||||||
| Semaphore::Semaphore(unsigned c) { (void)c; } | Semaphore::Semaphore(unsigned c) { (void)c; } | ||||||
| 
 | 
 | ||||||
| Thread **Semaphore::thread_link(Thread &obj, unsigned link_index) { |  | ||||||
|   (void)obj; |  | ||||||
|   (void)link_index; |  | ||||||
|   return nullptr; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Semaphore::p(Vault &vault) { (void)vault; } | void Semaphore::p(Vault &vault) { (void)vault; } | ||||||
| 
 | 
 | ||||||
| void Semaphore::v(Vault &vault) { (void)vault; } | void Semaphore::v(Vault &vault) { (void)vault; } | ||||||
|  | |||||||
| @ -1,17 +1,32 @@ | |||||||
| // vim: set noet ts=4 sw=4:
 | // vim: set noet ts=4 sw=4:
 | ||||||
| 
 | 
 | ||||||
| #include "dispatcher.h" | #include "dispatcher.h" | ||||||
|  | #include "../arch/core.h" | ||||||
| 
 | 
 | ||||||
| Dispatcher::Dispatcher() {} | Dispatcher::Dispatcher() { | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| Thread *Dispatcher::active() { return nullptr; } | Thread *Dispatcher::active() { | ||||||
|  | 	return lifePointer[Core::getID()]; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| bool Dispatcher::isActive(const Thread *thread, unsigned *cpu) { | bool Dispatcher::isActive(const Thread *thread, unsigned *cpu) { | ||||||
|   (void)thread; | 	for(uint8_t i=0; i<Core::MAX; i++){ | ||||||
|   (void)cpu; | 		if(thread == lifePointer[i]){ | ||||||
|  | 			*cpu = i; | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	cpu = nullptr; | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Dispatcher::go(Thread *first) { (void)first; } | void Dispatcher::go(Thread *first) { | ||||||
|  | 	lifePointer[Core::getID()] = first; | ||||||
|  | 	first->go(); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| void Dispatcher::dispatch(Thread *next) { (void)next; } | void Dispatcher::dispatch(Thread *next) { | ||||||
|  | 	lifePointer[Core::getID()] = next; | ||||||
|  | 	lifePointer[Core::getID()]->resume(next); | ||||||
|  | } | ||||||
|  | |||||||
| @ -1,16 +1,43 @@ | |||||||
| // vim: set noet ts=4 sw=4:
 | // vim: set noet ts=4 sw=4:
 | ||||||
| 
 | 
 | ||||||
| #include "thread.h" | #include "thread.h" | ||||||
| 
 | #include "../debug/output.h" | ||||||
|  | #include "../arch/context.h" | ||||||
|  | #include "interrupt/guard.h" | ||||||
| // Alias to simplify stuff
 | // Alias to simplify stuff
 | ||||||
| typedef void (*kickoff_t)(void*); | typedef void (*kickoff_t)(void*); | ||||||
| 
 | 
 | ||||||
| void Thread::kickoff(Thread* object) { (void)object; } | void Thread::kickoff(Thread* object) {  | ||||||
|  | 	Guard::leave(); | ||||||
|  | 	object->action();  | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Thread::Thread(void* tos) {  | ||||||
|  | 	prepareContext(tos, context, (void(*)(void*)) &(kickoff), this); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #include "../thread/scheduler.h" | ||||||
|  | void Thread::resume(Thread* next) { | ||||||
|  | 	Context *from; | ||||||
|  | 	Context *to; | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
|  | 		from = &this->context; | ||||||
|  | 		to = &next->context; | ||||||
|  | 
 | ||||||
|  | 		//dispatcher.lifePointer[Core::getID()] = next;
 | ||||||
|  | 		DBG << "from: " << hex << from << endl; | ||||||
|  | 		DBG << "to  : " << hex << to << endl << flush; | ||||||
| 	 | 	 | ||||||
| Thread::Thread(void* tos) { (void)tos; } | 	context_switch(to, from); | ||||||
| 
 | 
 | ||||||
| void Thread::resume(Thread* next) { (void)next; } | } | ||||||
| 
 | 
 | ||||||
| void Thread::go() {} | void Thread::go() { | ||||||
|  | 	context_launch(&context); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| void Thread::action() {} | void Thread::action() { | ||||||
|  | 	while(1); | ||||||
|  | } | ||||||
|  | |||||||
					Loading…
					
					
				
		Reference in New Issue