longjin 1 жил өмнө
parent
commit
f073773275
7 өөрчлөгдсөн 292 нэмэгдсэн , 2 устгасан
  1. 2 0
      .gitignore
  2. 11 0
      Cargo.toml
  3. 21 2
      README.md
  4. 25 0
      src/lib.rs
  5. 56 0
      src/macros.rs
  6. 149 0
      src/platform/x86_64/mod.rs
  7. 28 0
      src/platform/x86_64/nr.rs

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+/target
+/Cargo.lock

+ 11 - 0
Cargo.toml

@@ -0,0 +1,11 @@
+[package]
+name = "dsc"
+version = "0.1.0"
+edition = "2021"
+authors = ["longjin <longjin@DragonOS.org>"]
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+[lib]
+name = "dsc"
+
+[dependencies]

+ 21 - 2
README.md

@@ -1,2 +1,21 @@
-# dsc
-Raw Syscall Binding of DragonOS
+# dsc - DragonOS Raw Syscall Binding
+
+This is a raw syscall binding for DragonOS. It is not meant to be used directly, but rather as a dependency for other crates.
+
+## Usage
+
+Add this to your `Cargo.toml`:
+
+```toml
+[dependencies]
+dsc = { git = "https://github.com/DragonOS-Community/dsc.git" }
+```
+
+## 其他
+
+如果您正在开发dsc,请您在引入dsc的库的`Cargo.toml`中添加如下内容,而不是使用上述的代码:
+
+```toml
+[dependencies]
+dsc = { path = "您本地存放dsc的源代码的路径" }
+```

+ 25 - 0
src/lib.rs

@@ -0,0 +1,25 @@
+#![allow(deprecated)] // llvm_asm!
+#![deny(warnings)]
+#![no_std]
+#![cfg_attr(any(
+    target_arch = "arm",
+    target_arch = "mips",
+    target_arch = "mips64",
+    target_arch = "powerpc",
+    target_arch = "powerpc64",
+    target_arch = "sparc64",
+    target_arch = "x86"
+), feature(llvm_asm))]
+
+#[cfg(test)]
+extern crate std;
+
+pub use platform::*;
+
+pub mod macros;
+
+
+#[cfg(all(any(target_os = "dragonos"),
+          target_arch = "x86_64"))]
+#[path="platform/x86_64/mod.rs"]
+pub mod platform;

+ 56 - 0
src/macros.rs

@@ -0,0 +1,56 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#[macro_export]
+macro_rules! syscall {
+    ($nr:ident)
+        => ( ::dsc::syscall0(
+                ::dsc::nr::$nr) );
+
+    ($nr:ident, $a1:expr)
+        => ( ::dsc::syscall1(
+                ::dsc::nr::$nr,
+                $a1 as usize) );
+
+    ($nr:ident, $a1:expr, $a2:expr)
+        => ( ::dsc::syscall2(
+                ::dsc::nr::$nr,
+                $a1 as usize, $a2 as usize) );
+
+    ($nr:ident, $a1:expr, $a2:expr, $a3:expr)
+        => ( ::dsc::syscall3(
+                ::dsc::nr::$nr,
+                $a1 as usize, $a2 as usize, $a3 as usize) );
+
+    ($nr:ident, $a1:expr, $a2:expr, $a3:expr, $a4:expr)
+        => ( ::dsc::syscall4(
+                ::dsc::nr::$nr,
+                $a1 as usize, $a2 as usize, $a3 as usize,
+                $a4 as usize) );
+
+    ($nr:ident, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr)
+        => ( ::dsc::syscall5(
+                ::dsc::nr::$nr,
+                $a1 as usize, $a2 as usize, $a3 as usize,
+                $a4 as usize, $a5 as usize) );
+
+    ($nr:ident, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr)
+        => ( ::dsc::syscall6(
+                ::dsc::nr::$nr,
+                $a1 as usize, $a2 as usize, $a3 as usize,
+                $a4 as usize, $a5 as usize, $a6 as usize) );
+
+    ($nr:ident, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr, $a7:expr)
+        => ( ::dsc::syscall7(
+                ::dsc::nr::$nr,
+                $a1 as usize, $a2 as usize, $a3 as usize,
+                $a4 as usize, $a5 as usize, $a6 as usize,
+                $a7 as usize) );
+}

+ 149 - 0
src/platform/x86_64/mod.rs

@@ -0,0 +1,149 @@
+use core::arch::asm;
+
+pub mod nr;
+
+#[inline(always)]
+pub unsafe fn syscall0(mut n: usize) -> usize {
+    asm!(
+        "int 0x80",
+        inout("rax") n,
+        out("rcx") _,
+        out("r11") _,
+        options(nostack),
+    );
+    n
+}
+
+#[inline(always)]
+pub unsafe fn syscall1(mut n: usize, a1: usize) -> usize {
+    asm!(
+        "int 0x80",
+        inout("rax") n,
+        in("r8") a1,
+        out("rcx") _,
+        out("r11") _,
+        options(nostack),
+    );
+    n
+}
+
+#[inline(always)]
+pub unsafe fn syscall2(mut n: usize, a1: usize, a2: usize) -> usize {
+    asm!(
+        "int 0x80",
+        inout("rax") n,
+        in("r8") a1,
+        in("r9") a2,
+        out("rcx") _,
+        out("r11") _,
+        options(nostack),
+    );
+    n
+}
+
+#[inline(always)]
+pub unsafe fn syscall3(mut n: usize, a1: usize, a2: usize, a3: usize) -> usize {
+    asm!(
+        "int 0x80",
+        inout("rax") n,
+        in("r8") a1,
+        in("r9") a2,
+        in("r10") a3,
+        out("rcx") _,
+        out("r11") _,
+        options(nostack),
+    );
+    n
+}
+
+#[inline(always)]
+pub unsafe fn syscall4(mut n: usize,
+                       a1: usize,
+                       a2: usize,
+                       a3: usize,
+                       a4: usize)
+                       -> usize {
+    asm!(
+        "int 0x80",
+        inout("rax") n,
+        in("r8") a1,
+        in("r9") a2,
+        in("r10") a3,
+        in("r11") a4,
+        out("rcx") _,
+        options(nostack),
+    );
+    n
+}
+
+#[inline(always)]
+pub unsafe fn syscall5(mut n: usize,
+                       a1: usize,
+                       a2: usize,
+                       a3: usize,
+                       a4: usize,
+                       a5: usize)
+                       -> usize {
+    asm!(
+        "int 0x80",
+        inout("rax") n,
+        in("r8") a1,
+        in("r9") a2,
+        in("r10") a3,
+        in("r11") a4,
+        in("r12") a5,
+        out("rcx") _,
+        options(nostack),
+    );
+    n
+}
+
+#[inline(always)]
+pub unsafe fn syscall6(mut n: usize,
+                       a1: usize,
+                       a2: usize,
+                       a3: usize,
+                       a4: usize,
+                       a5: usize,
+                       a6: usize)
+                       -> usize {
+    asm!(
+        "int 0x80",
+        inout("rax") n,
+        in("r8") a1,
+        in("r9") a2,
+        in("r10") a3,
+        in("r11") a4,
+        in("r12") a5,
+        in("r13") a6,
+        out("rcx") _,
+        options(nostack),
+    );
+    n
+}
+
+#[inline(always)]
+pub unsafe fn syscall7(mut n: usize,
+                       a1: usize,
+                       a2: usize,
+                       a3: usize,
+                       a4: usize,
+                       a5: usize,
+                       a6: usize,
+                       a7: usize)
+                       -> usize {
+    asm!(
+        "int 0x80",
+        inout("rax") n,
+        in("r8") a1,
+        in("r9") a2,
+        in("r10") a3,
+        in("r11") a4,
+        in("r12") a5,
+        in("r13") a6,
+        in("r14") a7,
+        out("rcx") _,
+        options(nostack),
+    );
+    n
+}

+ 28 - 0
src/platform/x86_64/nr.rs

@@ -0,0 +1,28 @@
+pub const SYS_PUTSTRING: usize = 1;
+pub const SYS_OPEN: usize = 2;
+pub const SYS_CLOSE: usize = 3;
+pub const SYS_READ: usize = 4;
+pub const SYS_WRITE: usize = 5;
+pub const SYS_LSEEK: usize = 6;
+pub const SYS_FORK: usize = 7;
+pub const SYS_VFORK: usize = 8;
+pub const SYS_BRK: usize = 9;
+pub const SYS_SBRK: usize = 10;
+
+pub const SYS_REBOOT: usize = 11;
+pub const SYS_CHDIR: usize = 12;
+pub const SYS_GET_DENTS: usize = 13;
+pub const SYS_EXECVE: usize = 14;
+pub const SYS_WAIT4: usize = 15;
+pub const SYS_EXIT: usize = 16;
+pub const SYS_MKDIR: usize = 17;
+pub const SYS_NANOSLEEP: usize = 18;
+pub const SYS_CLOCK: usize = 19;
+pub const SYS_PIPE: usize = 20;
+
+pub const SYS_MSTAT: usize = 21;
+pub const SYS_UNLINK_AT: usize = 22;
+pub const SYS_KILL: usize = 23;
+pub const SYS_SIGACTION: usize = 24;
+pub const SYS_RT_SIGRETURN: usize = 25;
+pub const SYS_GETPID: usize = 26;