Skip to content

Commit 70c35cd

Browse files
committed
support penglai enclave [1/n]
1 parent 9c0d7f7 commit 70c35cd

File tree

3 files changed

+98
-13
lines changed

3 files changed

+98
-13
lines changed

rustsbi-qemu/src/execute.rs

+13-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{clint, hart_id, qemu_hsm::QemuHsm, Supervisor};
1+
use crate::{clint, hart_id, qemu_hsm::QemuHsm, Supervisor, penglai};
22
use core::arch::asm;
33
use riscv::register::*;
44

@@ -111,18 +111,18 @@ impl Context {
111111
use rustsbi::spec::{binary::*, hsm::*, srst::*};
112112
let extension = self.a(7);
113113
let function = self.a(6);
114-
let ans = rustsbi::ecall(
115-
extension,
116-
function,
117-
[
118-
self.a(0),
119-
self.a(1),
120-
self.a(2),
121-
self.a(3),
122-
self.a(4),
123-
self.a(5),
124-
],
125-
);
114+
let param = [
115+
self.a(0),
116+
self.a(1),
117+
self.a(2),
118+
self.a(3),
119+
self.a(4),
120+
self.a(5),
121+
];
122+
let ans = match extension {
123+
penglai::EID_PENGLAI_HOST => penglai::ecall(extension, function, param),
124+
_ => rustsbi::ecall(extension, function, param),
125+
};
126126
// 判断导致退出执行流程的调用
127127
if ans.error == RET_SUCCESS {
128128
match extension {

rustsbi-qemu/src/main.rs

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ mod ns16550a;
1111
mod qemu_hsm;
1212
mod qemu_test;
1313

14+
// penglai enclave. todo: move to separate crate?
15+
mod penglai;
16+
1417
#[macro_use] // for print
1518
extern crate rustsbi;
1619

rustsbi-qemu/src/penglai.rs

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/* todo: move to separate crate like sbi_spec? */
2+
use rustsbi::spec::binary::SbiRet;
3+
pub use host::EID_PENGLAI_HOST;
4+
5+
mod host {
6+
pub const EID_PENGLAI_HOST: usize /*u32*/ = 0x100100;
7+
8+
pub const CREATE_ENCLAVE: usize = 99;
9+
pub const ATTEST_ENCLAVE: usize = 98;
10+
pub const RUN_ENCLAVE: usize = 97;
11+
pub const STOP_ENCLAVE: usize = 96;
12+
pub const RESUME_ENCLAVE: usize = 95;
13+
pub const DESTROY_ENCALVE: usize = 94;
14+
15+
#[repr(C)]
16+
pub struct EnclaveCreate {
17+
pub enclave_id_ptr: usize, /* todo: what's this? */
18+
pub enclave_name: [u8; 16],
19+
pub enclave_type: EnclaveType,
20+
pub enclave_physical_address: usize,
21+
pub enclave_length: usize,
22+
pub entry_point: usize,
23+
pub free_memory: usize, // what's this?
24+
pub kbuffer_physical_address: usize,
25+
pub kbuffer_length: usize,
26+
pub shared_mem_physical_address: usize,
27+
pub shared_mem_length: usize,
28+
pub ecall_argument: [usize; 4],
29+
pub return_value: usize,
30+
}
31+
32+
#[repr(C)]
33+
pub struct EnclaveRun {
34+
pub memory_argument_address: usize,
35+
pub memory_argument_size: usize,
36+
// todo: extended arguments
37+
}
38+
39+
#[repr(usize)]
40+
pub enum EnclaveType {
41+
Normal = 0,
42+
Server = 1,
43+
}
44+
45+
#[repr(C)]
46+
pub struct ShangMiReport {
47+
pub hash: [u8; 32],
48+
pub signature: [u8; 64],
49+
pub public_key: [u8; 64],
50+
}
51+
52+
#[repr(C)]
53+
pub struct EnclaveReport {
54+
pub hash: [u8; 32],
55+
pub signature: [u8; 64],
56+
pub nonce: usize,
57+
}
58+
59+
#[repr(C)]
60+
pub struct Report {
61+
pub shangmi_report: ShangMiReport,
62+
pub enclave_report: EnclaveReport,
63+
pub device_public_key: [u8; 64],
64+
}
65+
}
66+
67+
use host::*;
68+
69+
// todo: instance based? strctu Contect { penglai: Penglai, ... }
70+
71+
#[inline]
72+
pub fn ecall(extension: usize, function: usize, param: [usize; 6]) -> SbiRet {
73+
match (extension, function) {
74+
(EID_PENGLAI_HOST, CREATE_ENCLAVE) => create_enclave(param[0]),
75+
_ => SbiRet::not_supported(),
76+
}
77+
}
78+
79+
#[inline]
80+
fn create_enclave(param: usize) -> SbiRet {
81+
todo!()
82+
}

0 commit comments

Comments
 (0)