mirror of https://gitlab.com/nakst/essence
				
				
				
			improve kernel/main.cpp
This commit is contained in:
		
							parent
							
								
									cd51bf4d6c
								
							
						
					
					
						commit
						b66b27a9f4
					
				|  | @ -32,7 +32,7 @@ | ||||||
| [extern ArchNextTimer] | [extern ArchNextTimer] | ||||||
| [extern InterruptHandler] | [extern InterruptHandler] | ||||||
| [extern KThreadTerminate] | [extern KThreadTerminate] | ||||||
| [extern KernelMain] | [extern KernelInitialise] | ||||||
| [extern PostContextSwitch] | [extern PostContextSwitch] | ||||||
| [extern SetupProcessor2] | [extern SetupProcessor2] | ||||||
| [extern Syscall] | [extern Syscall] | ||||||
|  | @ -149,12 +149,12 @@ _start: | ||||||
| %assign i i+1 | %assign i i+1 | ||||||
| %endrep | %endrep | ||||||
| 
 | 
 | ||||||
| 	; Setup the remaining things and call KernelMain.
 | 	; Setup the remaining things and call KernelInitialise
 | ||||||
| 	call	SetupProcessor1 ; Need to get SSE up before calling into C code.
 | 	call	SetupProcessor1 ; Need to get SSE up before calling into C code.
 | ||||||
| 	call	PCSetupCOM1 | 	call	PCSetupCOM1 | ||||||
| 	call	PCDisablePIC | 	call	PCDisablePIC | ||||||
| 	call	PCProcessMemoryMap | 	call	PCProcessMemoryMap | ||||||
| 	call	KernelMain | 	call	KernelInitialise | ||||||
| 
 | 
 | ||||||
| 	; Fall-through.
 | 	; Fall-through.
 | ||||||
| ProcessorReady: | ProcessorReady: | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ | ||||||
| [extern ArchNextTimer] | [extern ArchNextTimer] | ||||||
| [extern InterruptHandler] | [extern InterruptHandler] | ||||||
| [extern KThreadTerminate] | [extern KThreadTerminate] | ||||||
| [extern KernelMain] | [extern KernelInitialise] | ||||||
| [extern PostContextSwitch] | [extern PostContextSwitch] | ||||||
| [extern SetupProcessor2] | [extern SetupProcessor2] | ||||||
| [extern Syscall] | [extern Syscall] | ||||||
|  | @ -157,9 +157,9 @@ _start: | ||||||
| 	; First stage of processor initilisation
 | 	; First stage of processor initilisation
 | ||||||
| 	call	SetupProcessor1 | 	call	SetupProcessor1 | ||||||
| 
 | 
 | ||||||
| 	; Call the KernelMain function
 | 	; Call the KernelInitialise function
 | ||||||
| 	and	rsp,~0xF | 	and	rsp,~0xF | ||||||
| 	call	KernelMain | 	call	KernelInitialise | ||||||
| 
 | 
 | ||||||
| ProcessorReady: | ProcessorReady: | ||||||
| 	; Set the timer and become this CPU's idle thread.
 | 	; Set the timer and become this CPU's idle thread.
 | ||||||
|  |  | ||||||
|  | @ -324,8 +324,8 @@ CPULocalStorage *KGetCPULocal(uintptr_t index) { | ||||||
| #ifdef USE_ACPICA | #ifdef USE_ACPICA | ||||||
| #include "acpica.cpp" | #include "acpica.cpp" | ||||||
| #else | #else | ||||||
| void ArchShutdown(uintptr_t action) { | void ArchShutdown() { | ||||||
| 	if (action == SHUTDOWN_ACTION_RESTART) ProcessorReset(); | 	if (shutdownAction == SHUTDOWN_ACTION_RESTART) ProcessorReset(); | ||||||
| 	StartDebugOutput(); | 	StartDebugOutput(); | ||||||
| 	EsPrint("\nIt's now safe to turn off your computer.\n"); | 	EsPrint("\nIt's now safe to turn off your computer.\n"); | ||||||
| 	ProcessorDisableInterrupts(); | 	ProcessorDisableInterrupts(); | ||||||
|  |  | ||||||
|  | @ -591,8 +591,8 @@ ACPI_STATUS ACPIWalkNamespaceCallback(ACPI_HANDLE object, uint32_t depth, void * | ||||||
| 	return AE_OK; | 	return AE_OK; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ArchShutdown(uintptr_t action) { | void ArchShutdown() { | ||||||
| 	if (action == SHUTDOWN_ACTION_RESTART) ProcessorReset(); | 	if (shutdownAction == SHUTDOWN_ACTION_RESTART) ProcessorReset(); | ||||||
| 	AcpiEnterSleepStatePrep(5); | 	AcpiEnterSleepStatePrep(5); | ||||||
| 	ProcessorDisableInterrupts(); | 	ProcessorDisableInterrupts(); | ||||||
| 	AcpiEnterSleepState(5); | 	AcpiEnterSleepState(5); | ||||||
|  |  | ||||||
|  | @ -101,8 +101,8 @@ struct PhysicalMemoryRegion { | ||||||
| 	uint64_t pageCount; | 	uint64_t pageCount; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void KernelInitialise(); | extern "C" void KernelInitialise(); | ||||||
| void KernelShutdown(uintptr_t action); | void KernelMain(uintptr_t); | ||||||
| 
 | 
 | ||||||
| uintptr_t DoSyscall(EsSyscallType index, | uintptr_t DoSyscall(EsSyscallType index, | ||||||
| 		uintptr_t argument0, uintptr_t argument1, uintptr_t argument2, uintptr_t argument3, | 		uintptr_t argument0, uintptr_t argument1, uintptr_t argument2, uintptr_t argument3, | ||||||
|  | @ -110,6 +110,8 @@ uintptr_t DoSyscall(EsSyscallType index, | ||||||
| 
 | 
 | ||||||
| uint64_t timeStampTicksPerMs; | uint64_t timeStampTicksPerMs; | ||||||
| EsUniqueIdentifier installationID; // The identifier of this OS installation, given to us by the bootloader.
 | EsUniqueIdentifier installationID; // The identifier of this OS installation, given to us by the bootloader.
 | ||||||
|  | KEvent shutdownEvent; | ||||||
|  | uintptr_t shutdownAction; | ||||||
| 
 | 
 | ||||||
| // ---------------------------------------------------------------------------------------------------------------
 | // ---------------------------------------------------------------------------------------------------------------
 | ||||||
| // Architecture specific layer definitions.
 | // Architecture specific layer definitions.
 | ||||||
|  | @ -117,7 +119,7 @@ EsUniqueIdentifier installationID; // The identifier of this OS installation, gi | ||||||
| 
 | 
 | ||||||
| extern "C" { | extern "C" { | ||||||
| 	void ArchInitialise(); | 	void ArchInitialise(); | ||||||
| 	void ArchShutdown(uintptr_t action); | 	void ArchShutdown(); | ||||||
| 	void ArchNextTimer(size_t ms); // Schedule the next TIMER_INTERRUPT.
 | 	void ArchNextTimer(size_t ms); // Schedule the next TIMER_INTERRUPT.
 | ||||||
| 	uint64_t ArchGetTimeMs(); // Called by the scheduler on the boot processor every context switch.
 | 	uint64_t ArchGetTimeMs(); // Called by the scheduler on the boot processor every context switch.
 | ||||||
| 	InterruptContext *ArchInitialiseThread(uintptr_t kernelStack, uintptr_t kernelStackSize, struct Thread *thread,  | 	InterruptContext *ArchInitialiseThread(uintptr_t kernelStack, uintptr_t kernelStackSize, struct Thread *thread,  | ||||||
|  |  | ||||||
|  | @ -9,22 +9,21 @@ | ||||||
| #define IMPLEMENTATION | #define IMPLEMENTATION | ||||||
| #include "kernel.h" | #include "kernel.h" | ||||||
| 
 | 
 | ||||||
| extern "C" void KernelMain() {										 | void KernelInitialise() {										 | ||||||
| 	kernelProcess = scheduler.SpawnProcess(PROCESS_KERNEL);		// Spawn the kernel process.
 | 	kernelProcess = scheduler.SpawnProcess(PROCESS_KERNEL);		// Spawn the kernel process.
 | ||||||
|  | 	MMInitialise();							// Initialise the memory manager.
 | ||||||
|  | 	KThreadCreate("KernelMain", KernelMain);			// Create the KernelMain thread.
 | ||||||
| 	ArchInitialise(); 						// Start processors and initialise CPULocalStorage. 
 | 	ArchInitialise(); 						// Start processors and initialise CPULocalStorage. 
 | ||||||
| 	scheduler.started = true;					// Start the pre-emptive scheduler.
 | 	scheduler.started = true;					// Start the pre-emptive scheduler.
 | ||||||
| 	// Continues in KernelInitialise.
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void KernelInitialise() {						 | void KernelMain(uintptr_t) { | ||||||
| 	desktopProcess = scheduler.SpawnProcess(PROCESS_DESKTOP);	// Spawn the desktop process.
 | 	desktopProcess = scheduler.SpawnProcess(PROCESS_DESKTOP);	// Spawn the desktop process.
 | ||||||
| 	DriversInitialise();						// Load the root device.
 | 	DriversInitialise();						// Load the root device.
 | ||||||
| 	desktopProcess->Start(EsLiteral(K_DESKTOP_EXECUTABLE));		// Start the desktop process.
 | 	desktopProcess->Start(EsLiteral(K_DESKTOP_EXECUTABLE));		// Start the desktop process.
 | ||||||
| } | 	KEventWait(&shutdownEvent, ES_WAIT_NO_TIMEOUT);			// Wait for a shutdown request.
 | ||||||
| 
 |  | ||||||
| void KernelShutdown(uintptr_t action) { |  | ||||||
| 	scheduler.Shutdown();						// Kill user processes.
 | 	scheduler.Shutdown();						// Kill user processes.
 | ||||||
| 	FSShutdown();							// Flush file cache and unmount filesystems.
 | 	FSShutdown();							// Flush file cache and unmount filesystems.
 | ||||||
| 	DriversShutdown();						// Inform drivers of shutdown.
 | 	DriversShutdown();						// Inform drivers of shutdown.
 | ||||||
| 	ArchShutdown(action);						// Power off or restart the computer. 
 | 	ArchShutdown();							// Power off or restart the computer. 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -771,8 +771,6 @@ Process *Scheduler::SpawnProcess(ProcessType processType) { | ||||||
| 	if (processType == PROCESS_KERNEL) { | 	if (processType == PROCESS_KERNEL) { | ||||||
| 		EsCRTstrcpy(process->cExecutableName, "Kernel"); | 		EsCRTstrcpy(process->cExecutableName, "Kernel"); | ||||||
| 		scheduler.allProcesses.InsertEnd(&process->allItem); | 		scheduler.allProcesses.InsertEnd(&process->allItem); | ||||||
| 		MMInitialise();								 |  | ||||||
| 		scheduler.SpawnThread("InitKernel", (uintptr_t) KernelInitialise); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return process;  | 	return process;  | ||||||
|  | @ -1370,9 +1368,7 @@ void Scheduler::Yield(InterruptContext *context) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Scheduler::Shutdown() { | void Scheduler::Shutdown() { | ||||||
| 	// Prevent the creation of new proceses or threads,
 | 	scheduler.shutdown = true; | ||||||
| 	// or terminate this thread if we're already shutting down.
 |  | ||||||
| 	if (__sync_val_compare_and_swap(&scheduler.shutdown, false, true)) KThreadTerminate(); |  | ||||||
| 
 | 
 | ||||||
| 	// Close our handle to the desktop process.
 | 	// Close our handle to the desktop process.
 | ||||||
| 	CloseHandleToObject(desktopProcess->executableMainThread, KERNEL_OBJECT_THREAD); | 	CloseHandleToObject(desktopProcess->executableMainThread, KERNEL_OBJECT_THREAD); | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
| extern "C" int EsStringCompareRaw(const char *s1, size_t b1, const char *s2, size_t b2); | extern "C" int EsStringCompareRaw(const char *s1, size_t b1, const char *s2, size_t b2); | ||||||
| void EsPrint(const char *format, ...); | void EsPrint(const char *format, ...); | ||||||
| 
 | 
 | ||||||
| extern "C" void KernelMain(); | extern "C" void KernelInitialise(); | ||||||
| extern "C" void ProcessorHalt(); | extern "C" void ProcessorHalt(); | ||||||
| 
 | 
 | ||||||
| struct ExportedKernelFunction { | struct ExportedKernelFunction { | ||||||
|  | @ -27,7 +27,7 @@ void *ResolveKernelSymbol(const char *name, size_t nameBytes) { | ||||||
| 		// As we get the function addresses before the kernel is linked (this file needs to be linked with the kernel),
 | 		// As we get the function addresses before the kernel is linked (this file needs to be linked with the kernel),
 | ||||||
| 		// they are relative to wherever the kernel_all.o's text is placed in the executable's text section.
 | 		// they are relative to wherever the kernel_all.o's text is placed in the executable's text section.
 | ||||||
| 
 | 
 | ||||||
| 		uintptr_t offset = (uintptr_t) ResolveKernelSymbol("KernelMain", 10) - (uintptr_t) KernelMain; | 		uintptr_t offset = (uintptr_t) ResolveKernelSymbol("KernelInitialise", 10) - (uintptr_t) KernelInitialise; | ||||||
| 
 | 
 | ||||||
| 		for (uintptr_t i = 0; i < sizeof(exportedKernelFunctions) / sizeof(exportedKernelFunctions[0]); i++) { | 		for (uintptr_t i = 0; i < sizeof(exportedKernelFunctions) / sizeof(exportedKernelFunctions[0]); i++) { | ||||||
| 			exportedKernelFunctions[i].address = (void *) ((uintptr_t) exportedKernelFunctions[i].address - offset); | 			exportedKernelFunctions[i].address = (void *) ((uintptr_t) exportedKernelFunctions[i].address - offset); | ||||||
|  |  | ||||||
|  | @ -1223,7 +1223,8 @@ SYSCALL_IMPLEMENT(ES_SYSCALL_PROCESS_GET_STATE) { | ||||||
| 
 | 
 | ||||||
| SYSCALL_IMPLEMENT(ES_SYSCALL_SHUTDOWN) { | SYSCALL_IMPLEMENT(ES_SYSCALL_SHUTDOWN) { | ||||||
| 	SYSCALL_PERMISSION(ES_PERMISSION_SHUTDOWN); | 	SYSCALL_PERMISSION(ES_PERMISSION_SHUTDOWN); | ||||||
| 	KThreadCreate("Shutdown", [] (uintptr_t action) { KernelShutdown(action); }, argument0); | 	shutdownAction = argument0; | ||||||
|  | 	KEventSet(&shutdownEvent, false, true); | ||||||
| 	SYSCALL_RETURN(ES_SUCCESS, false); | 	SYSCALL_RETURN(ES_SUCCESS, false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 nakst
						nakst