forked from xuos/xiuos
				
			
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright (c) 2020 AIIT XUOS Lab
 | 
						|
 * XiUOS is licensed under Mulan PSL v2.
 | 
						|
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
						|
 * You may obtain a copy of Mulan PSL v2 at:
 | 
						|
 *        http://license.coscl.org.cn/MulanPSL2
 | 
						|
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
 * See the Mulan PSL v2 for more details.
 | 
						|
 */
 | 
						|
/**
 | 
						|
 * @file main.c
 | 
						|
 * @brief main
 | 
						|
 * @version 3.0
 | 
						|
 * @author AIIT XUOS Lab
 | 
						|
 * @date 2023.08.25
 | 
						|
 */
 | 
						|
 | 
						|
/*************************************************
 | 
						|
File name: main.c
 | 
						|
Description: main
 | 
						|
Others:
 | 
						|
History:
 | 
						|
1. Date: 2023-08-28
 | 
						|
Author: AIIT XUOS Lab
 | 
						|
Modification:
 | 
						|
1. first version
 | 
						|
*************************************************/
 | 
						|
/// @todo use hardkernel
 | 
						|
 | 
						|
#include "kern_init.h"
 | 
						|
#include "multicores.h"
 | 
						|
 | 
						|
#include "assert.h"
 | 
						|
#include "kalloc.h"
 | 
						|
#include "task.h"
 | 
						|
 | 
						|
struct spinlock whole_kernel_lock;
 | 
						|
 | 
						|
extern uintptr_t _binary_init_start[], _binary_default_fs_start[];
 | 
						|
extern int sys_spawn(char* img_start, char* name, char** argv);
 | 
						|
 | 
						|
static struct TraceTag hardkernel_tag, softkernel_tag;
 | 
						|
static volatile int core_init_done = 0;
 | 
						|
int main(void)
 | 
						|
{
 | 
						|
    /* init tracer */
 | 
						|
    uint32_t cpu_id = cur_cpuid();
 | 
						|
 | 
						|
    if (cpu_id == 0) {
 | 
						|
        /* init memory management first */
 | 
						|
        module_phymem_init(); // init buddy management system
 | 
						|
        /* init tracer system */
 | 
						|
        sys_tracer_init();
 | 
						|
        if (!CreateResourceTag(&hardkernel_tag, RequireRootTag(), "hardkernel", TRACER_OWNER, NULL) || //
 | 
						|
            !CreateResourceTag(&softkernel_tag, RequireRootTag(), "softkernel", TRACER_OWNER, NULL)) {
 | 
						|
            ERROR("Failed to create hardkernel owner and softkernel owner.\n");
 | 
						|
            return -1;
 | 
						|
        }
 | 
						|
        /* init hardkernel */
 | 
						|
        if (!hardkernel_init(&hardkernel_tag)) {
 | 
						|
            return -1;
 | 
						|
        }
 | 
						|
 | 
						|
        spinlock_init(&whole_kernel_lock, "wklock");
 | 
						|
    } else {
 | 
						|
        spinlock_lock(&whole_kernel_lock);
 | 
						|
        secondary_cpu_hardkernel_init(cpu_id, &hardkernel_tag);
 | 
						|
        spinlock_unlock(&whole_kernel_lock);
 | 
						|
    }
 | 
						|
 | 
						|
    spinlock_lock(&whole_kernel_lock);
 | 
						|
    if (cpu_id == 0) {
 | 
						|
        /* init softkernel */
 | 
						|
        if (!softkernel_init(&hardkernel_tag, &softkernel_tag)) {
 | 
						|
            return -1;
 | 
						|
        }
 | 
						|
        show_xizi_bar();
 | 
						|
 | 
						|
        for (int i = 1; i < NR_CPU; i++) {
 | 
						|
            // start secondary cpus
 | 
						|
            cpu_start_secondary(i);
 | 
						|
        }
 | 
						|
 | 
						|
        /* start first task */
 | 
						|
        char* init_task_param[2] = { "/app/init", 0 };
 | 
						|
        sys_spawn((char*)_binary_init_start, "init", init_task_param);
 | 
						|
        char* fs_server_task_param[2] = { "/app/fs_server", 0 };
 | 
						|
        sys_spawn((char*)_binary_default_fs_start, "memfs", fs_server_task_param);
 | 
						|
    }
 | 
						|
 | 
						|
    /* start scheduler */
 | 
						|
    struct SchedulerRightGroup scheduler_rights;
 | 
						|
    assert(AchieveResourceTag(&scheduler_rights.mmu_driver_tag, &hardkernel_tag, "mmu-ac-resource"));
 | 
						|
    assert(AchieveResourceTag(&scheduler_rights.intr_driver_tag, &hardkernel_tag, "intr-ac-resource"));
 | 
						|
    core_init_done |= (1 << cpu_id);
 | 
						|
    LOG_PRINTF("CPU %d init done\n", cpu_id);
 | 
						|
    spinlock_unlock(&whole_kernel_lock);
 | 
						|
 | 
						|
    // sync memory
 | 
						|
    __sync_synchronize();
 | 
						|
    start_smp_cache_broadcast(cpu_id);
 | 
						|
    // enter kernel seriously
 | 
						|
    xizi_enter_kernel();
 | 
						|
    xizi_task_manager.task_scheduler(scheduler_rights);
 | 
						|
 | 
						|
    // never reached
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
__attribute__((weak)) void _exit(int32_t status)
 | 
						|
{
 | 
						|
    (void)status;
 | 
						|
    while (1) {
 | 
						|
        ;
 | 
						|
    }
 | 
						|
} |