C convert to rust: smc #0

static inline smc_args_t smc_helper(uint32_t func, uint64_t arg0,
	       uint64_t arg1, uint64_t arg2,
	       uint64_t arg3, uint64_t arg4,
	       uint64_t arg5, uint64_t arg6)
{
	smc_args_t ret_args = {0};

	register uint64_t r0 __asm__("x0") = func;
	register uint64_t r1 __asm__("x1") = arg0;
	register uint64_t r2 __asm__("x2") = arg1;
	register uint64_t r3 __asm__("x3") = arg2;
	register uint64_t r4 __asm__("x4") = arg3;
	register uint64_t r5 __asm__("x5") = arg4;
	register uint64_t r6 __asm__("x6") = arg5;
	register uint64_t r7 __asm__("x7") = arg6;

	/* Output registers, also used as inputs ('+' constraint). */
	__asm__ volatile("smc #0"
			: "+r"(r0), "+r"(r1), "+r"(r2), "+r"(r3), "+r"(r4),
			  "+r"(r5), "+r"(r6), "+r"(r7));

	ret_args._regs[0] = r0;
	ret_args._regs[1] = r1;
	ret_args._regs[2] = r2;
	ret_args._regs[3] = r3;
	ret_args._regs[4] = r4;
	ret_args._regs[5] = r5;
	ret_args._regs[6] = r6;
	ret_args._regs[7] = r7;

	return ret_args;
}

I want to implement this code in C,but "smc #0" I don't know how to do it.

I found a crate appears to do that at https://crates.io/crates/smccc. What you’re trying to do will presumably look like its code at smccc/src/lib.rs at 17c8d58ffef26f34ebeaffbf71e0acaee5e724b1 · google/smccc · GitHub.

2 Likes