mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-18 08:06:32 +00:00
使得DragonOS kernel 能为riscv64编译通过(尚未能启动) (#457)
* 使得DragonOS kernel 能为riscv64编译通过(尚未能启动) * 修正了系统调用号声明不正确的问题,同时添加了编译配置文档
This commit is contained in:
@ -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 }
|
||||
}
|
||||
}
|
@ -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
|
@ -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(
|
||||
|
@ -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
|
@ -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() }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
@ -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
|
@ -1,5 +1,4 @@
|
||||
pub mod align;
|
||||
pub mod atomic;
|
||||
pub mod casting;
|
||||
pub mod elf;
|
||||
pub mod ffi_convert;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user