## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Error code E0798

Functions marked as `cmse-nonsecure-call` place restrictions on their inputs and outputs.

- inputs must fit in the 4 available 32-bit argument registers. Alignment is relevant.
- outputs must either fit in 4 bytes, or be a foundational type of size 8 (`i64`, `u64`, `f64`).
- no generics can be used in the signature

For more information, see arm's aapcs32.

Erroneous code example:

    #![feature(abi_cmse_nonsecure_call)]

    #[no_mangle]
    pub fn test(
        f: extern "cmse-nonsecure-call" fn(u32, u32, u32, u32, u32) -> u32,
    ) -> u32 {
        f(1, 2, 3, 4, 5)
    }

Arguments' alignment is respected. In the example below, padding is inserted so that the `u64` argument is passed in registers r2 and r3. There is then no room left for the final `f32` argument

    #![feature(abi_cmse_nonsecure_call)]

    #[no_mangle]
    pub fn test(
        f: extern "cmse-nonsecure-call" fn(u32, u64, f32) -> u32,
    ) -> u32 {
        f(1, 2, 3.0)
    }