使得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

@ -1,26 +0,0 @@
#![allow(dead_code)]
use core::ptr::{read_volatile, write_volatile};
use crate::include::bindings::bindings::atomic_t;
/// @brief 原子的读取指定的原子变量的值
#[inline]
pub fn atomic_read(ato: *const atomic_t) -> i64 {
unsafe {
return read_volatile(&(*ato).value);
}
}
/// @brief 原子的设置原子变量的值
#[inline]
pub fn atomic_set(ato: *mut atomic_t, value: i64) {
unsafe {
write_volatile(&mut (*ato).value, value);
}
}
impl Default for atomic_t {
fn default() -> Self {
Self { value: 0 }
}
}

View File

@ -30,6 +30,9 @@ uint Cpu_max_linear_addrline_size;
uint64_t Cpu_tsc_freq = 0;
struct cpu_core_info_t cpu_core_info[MAX_CPU_NUM];
#if ARCH(I386) || ARCH(X86_64)
void cpu_init(void)
{
// 获取处理器制造商信息
@ -100,3 +103,7 @@ void cpu_cpuid(uint32_t mop, uint32_t sop, uint32_t *eax, uint32_t *ebx, uint32_
: "0"(mop), "2"(sop)
: "memory");
}
#else
void cpu_init(void){}
#endif

View File

@ -37,7 +37,7 @@ pub struct ElfLoader;
pub const ELF_LOADER: ElfLoader = ElfLoader::new();
impl ElfLoader {
#[cfg(target_arch = "x86_64")]
#[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
pub const ELF_PAGE_SIZE: usize = MMArch::PAGE_SIZE;
/// 读取文件的缓冲区大小
@ -47,8 +47,7 @@ impl ElfLoader {
Self
}
#[cfg(target_arch = "x86_64")]
pub fn probe_x86_64(
fn inner_probe_common(
&self,
param: &ExecParam,
ehdr: &FileHeader<AnyEndian>,
@ -58,11 +57,6 @@ impl ElfLoader {
return Err(ExecError::WrongArchitecture);
}
// 判断架构是否匹配
if ElfMachine::from(ehdr.e_machine) != ElfMachine::X86_64 {
return Err(ExecError::WrongArchitecture);
}
// 判断是否以可执行文件的形式加载
if param.load_mode() == ExecLoadMode::Exec {
// 检查文件类型是否为可执行文件
@ -76,6 +70,32 @@ impl ElfLoader {
return Ok(());
}
#[cfg(target_arch = "x86_64")]
pub fn probe_x86_64(
&self,
param: &ExecParam,
ehdr: &FileHeader<AnyEndian>,
) -> Result<(), ExecError> {
// 判断架构是否匹配
if ElfMachine::from(ehdr.e_machine) != ElfMachine::X86_64 {
return Err(ExecError::WrongArchitecture);
}
return self.inner_probe_common(param, ehdr);
}
#[cfg(target_arch = "riscv64")]
pub fn probe_riscv(
&self,
param: &ExecParam,
ehdr: &FileHeader<AnyEndian>,
) -> Result<(), ExecError> {
// 判断架构是否匹配
if ElfMachine::from(ehdr.e_machine) != ElfMachine::RiscV {
return Err(ExecError::WrongArchitecture);
}
return self.inner_probe_common(param, ehdr);
}
/// 设置用户堆空间,映射[start, end)区间的虚拟地址并把brk指针指向end
///
/// ## 参数
@ -471,8 +491,11 @@ impl BinaryLoader for ElfLoader {
#[cfg(target_arch = "x86_64")]
return self.probe_x86_64(param, &ehdr);
#[cfg(not(target_arch = "x86_64"))]
unimplemented!("Unsupported architecture");
#[cfg(target_arch = "riscv64")]
return self.probe_riscv(param, &ehdr);
#[cfg(not(any(target_arch = "x86_64", target_arch = "riscv64")))]
compile_error!("BinaryLoader: Unsupported architecture");
}
fn load(

View File

@ -1,6 +1,8 @@
#include <arch/arch.h>
#if ARCH(I386) || ARCH(X86_64)
#include <common/idr.h>
#include <mm/slab.h>
/**
* @brief 更换两个idr_layer指针
*
@ -1052,3 +1054,5 @@ bool ida_empty(struct ida *ida_p)
return false;
}
#endif

View File

@ -20,11 +20,15 @@ impl<T> LockFreeFlags<T> {
}
pub fn get_mut(&self) -> &mut T {
unsafe { &mut *self.inner.get() }
unsafe {
(self.inner.get().as_ref().unwrap() as *const T as *mut T)
.as_mut()
.unwrap()
}
}
pub fn get(&self) -> &T {
unsafe { &*self.inner.get() }
unsafe { self.inner.get().as_ref().unwrap() }
}
}

View File

@ -1,3 +1,7 @@
#include <arch/arch.h>
#if ARCH(I386) || ARCH(X86_64)
#include <common/lockref.h>
#include <common/compiler.h>
@ -241,3 +245,5 @@ bool lockref_inc_not_dead(struct lockref *lock_ref)
spin_unlock(&lock_ref->lock);
return retval;
}
#endif

View File

@ -41,6 +41,7 @@
* in memory stack (0:default, fastest), or in memory heap (1:requires malloc()).
*/
#include<arch/arch.h>
#if ARCH(I386) || ARCH(X86_64)
#if ARCH(I386) || ARCH(X86_64)
#include <arch/x86_64/math/bitcount.h>
@ -3152,4 +3153,8 @@ char *LZ4_slideInputBuffer(void *state)
return (char *)(uptrval)((LZ4_stream_t *)state)->internal_donotuse.dictionary;
}
#endif /* LZ4_COMMONDEFS_ONLY */
#endif /* LZ4_COMMONDEFS_ONLY */
#else
#endif

View File

@ -1,5 +1,4 @@
pub mod align;
pub mod atomic;
pub mod casting;
pub mod elf;
pub mod ffi_convert;

View File

@ -191,7 +191,7 @@ impl<T> RwLock<T> {
return (self.lock.load(Ordering::Relaxed) & WRITER) / WRITER;
}
#[cfg(target_arch = "x86_64")]
#[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
#[allow(dead_code)]
#[inline]
/// @brief 尝试获得WRITER守卫
@ -205,7 +205,7 @@ impl<T> RwLock<T> {
return r;
} //当架构为arm时,有些代码需要作出调整compare_exchange=>compare_exchange_weak
#[cfg(target_arch = "x86_64")]
#[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
#[allow(dead_code)]
fn inner_try_write(&self) -> Option<RwLockWriteGuard<T>> {
let res: bool = self

View File

@ -38,47 +38,27 @@ long strnlen(const char *src, unsigned long maxlen)
FirstPart > SecondPart => 1
FirstPart < SecondPart => -1
*/
int strcmp(const char *FirstPart, const char *SecondPart)
int strcmp(const char *l, const char *r)
{
register int __res;
__asm__ __volatile__("cld \n\t"
"1: \n\t"
"lodsb \n\t"
"scasb \n\t"
"jne 2f \n\t"
"testb %%al, %%al \n\t"
"jne 1b \n\t"
"xorl %%eax, %%eax \n\t"
"jmp 3f \n\t"
"2: \n\t"
"movl $1, %%eax \n\t"
"jl 3f \n\t"
"negl %%eax \n\t"
"3: \n\t"
: "=a"(__res)
: "D"(FirstPart), "S"(SecondPart)
:);
return __res;
for (; *l == *r && *l; l++, r++)
;
return *(unsigned char *)l - *(unsigned char *)r;
}
char *strncpy(char *dst, const char *src, long count)
char *__stpncpy(char *restrict d, const char *restrict s, size_t n)
{
__asm__ __volatile__("cld \n\t"
"1: \n\t"
"decq %2 \n\t"
"js 2f \n\t"
"lodsb \n\t"
"stosb \n\t"
"testb %%al, %%al \n\t"
"jne 1b \n\t"
"rep \n\t"
"stosb \n\t"
"2: \n\t"
:
: "S"(src), "D"(dst), "c"(count)
: "ax", "memory");
return dst;
for (; n && (*d = *s); n--, s++, d++)
;
tail:
memset(d, 0, n);
return d;
}
char *strncpy(char *restrict d, const char *restrict s, size_t n)
{
__stpncpy(d, s, n);
return d;
}
long strncpy_from_user(char *dst, const char *src, unsigned long size)