#[macro_export]
macro_rules! entry {
($main:path) => {
extern crate alloc;
#[cfg(not(target_arch = "riscv64"))]
#[unsafe(no_mangle)]
pub extern "C" fn _start() -> ! {
panic!("ckb_std::entry is only valid for riscv64 target")
}
#[unsafe(no_mangle)]
unsafe extern "C" fn __ckb_std_main(
argc: core::ffi::c_int,
argv: *const $crate::env::Arg,
) -> i8 {
let argv = core::slice::from_raw_parts(argv, argc as usize);
$crate::env::set_argv(argv);
$main()
}
#[cfg(target_arch = "riscv64")]
core::arch::global_asm!(
".global _start",
"_start:",
"lw a0, 0(sp)",
"addi a1, sp, 8",
"li a2, 0",
"call __ckb_std_main",
"li a7, 93",
"ecall",
);
#[cfg(target_arch = "riscv64")]
#[panic_handler]
fn panic_handler(panic_info: &core::panic::PanicInfo) -> ! {
$crate::debug!("{}", panic_info);
$crate::syscalls::exit(unsafe { $crate::asserts::__PANIC_EXIT_CODE })
}
};
}
#[cfg(feature = "native-simulator")]
#[macro_export]
macro_rules! entry_simulator {
($main:path) => {
extern crate alloc;
#[unsafe(no_mangle)]
unsafe extern "C" fn __ckb_std_main(
argc: core::ffi::c_int,
argv: *const $crate::env::Arg,
) -> i8 {
let argv = if argc == 0 {
&[]
} else {
core::slice::from_raw_parts(argv, argc as usize)
};
$crate::env::set_argv(argv);
$main()
}
#[unsafe(no_mangle)]
unsafe extern "C" fn __set_script_info(
ptr: *mut core::ffi::c_void,
tx_ctx_id: u64,
proc_ctx_id: u64,
) {
ckb_std::set_script_info(ptr, tx_ctx_id, proc_ctx_id)
}
};
}