|  | 
|  | 1 | +/* todo: move to separate crate like sbi_spec? */ | 
|  | 2 | +pub use host::EID_PENGLAI_HOST; | 
|  | 3 | +use rustsbi::spec::binary::SbiRet; | 
|  | 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