使得DragonOS kernel 能为riscv64编译通过(尚未能启动) (#457)

* 使得DragonOS kernel 能为riscv64编译通过(尚未能启动)

* 修正了系统调用号声明不正确的问题,同时添加了编译配置文档
This commit is contained in:
LoGin
2023-11-25 12:07:39 +08:00
committed by GitHub
parent a1fd1cf1cb
commit 4fda81ce81
112 changed files with 2587 additions and 615 deletions

View File

@ -3,25 +3,6 @@
#include <arch/arch.h>
#if ARCH(I386) || ARCH(X86_64)
#include <arch/x86_64/include/x86_64_ipi.h>
#else
#error "error type of arch!"
#endif
/**
* @brief 发送ipi消息
*
* @param dest_mode 目标模式
* @param deliver_status 投递模式
* @param level 信号驱动电平
* @param trigger 触发模式
* @param vector 中断向量
* @param deliver_mode 投递模式
* @param dest_shorthand 投递目标速记值
* @param apic_type apic的类型 0:xapic 1: x2apic
* @param destination 投递目标
*/
extern void ipi_send_IPI(uint32_t dest_mode, uint32_t deliver_status, uint32_t level, uint32_t trigger,
uint32_t vector, uint32_t deliver_mode, uint32_t dest_shorthand, uint32_t destination);
/**
* @brief ipi中断处理注册函数
@ -36,4 +17,14 @@ extern void ipi_send_IPI(uint32_t dest_mode, uint32_t deliver_status, uint32_t l
*/
extern int ipi_regiserIPI(uint64_t irq_num, void *arg,
void (*handler)(uint64_t irq_num, uint64_t param, struct pt_regs *regs),
uint64_t param, hardware_intr_controller *controller, char *irq_name);
uint64_t param, hardware_intr_controller *controller, char *irq_name);
#else
int ipi_regiserIPI(uint64_t irq_num, void *arg,
void (*handler)(uint64_t irq_num, uint64_t param, struct pt_regs *regs),
uint64_t param, hardware_intr_controller *controller, char *irq_name)
{
return -1;
}
#endif

View File

@ -11,7 +11,9 @@
#include <sched/sched.h>
#include <driver/acpi/acpi.h>
#include "exception/trap.h"
#include "exception/irq.h"
#include "ipi.h"
#include <arch/arch.h>
/* x86-64 specific MSRs */
#define MSR_EFER 0xc0000080 /* extended feature register */
@ -56,6 +58,7 @@ static struct X86CpuInfo __cpu_info[MAX_SUPPORTED_PROCESSOR_NUM] = {0};
void smp_init()
{
spin_init(&multi_core_starting_lock); // 初始化多核启动锁
#if ARCH(I386) || ARCH(X86_64)
// 设置多核启动时,要加载的页表
__APU_START_CR3 = (uint64_t)get_CR3();
@ -135,6 +138,7 @@ void smp_init()
// 由于ap处理器初始化过程需要用到0x00处的地址因此初始化完毕后才取消内存地址的重映射
rs_unmap_at_low_addr();
kinfo("Successfully cleaned page table remapping!\n");
#endif
io_mfence();
}
@ -149,7 +153,7 @@ void smp_ap_start_stage2()
io_mfence();
++num_cpu_started;
io_mfence();
#if ARCH(I386) || ARCH(X86_64)
rs_apic_init_ap();
// ============ 为ap处理器初始化IDLE进程 =============
@ -160,8 +164,9 @@ void smp_ap_start_stage2()
spin_unlock_no_preempt(&multi_core_starting_lock);
rs_init_syscall_64();
apic_timer_ap_core_init();
#endif
sti();
sched();