mirror of
https://github.com/AmbiML/sparrow-kata-full.git
synced 2025-07-14 22:44:13 +00:00
sel4-sys: change syscall stubs to return seL4_Result
Change-Id: I60e53a7ab8a96bddc0833aeb581f8bbecc8e20d5 GitOrigin-RevId: 5ee752094a7562c0e07b5abb22b5fc4fac3e7294
This commit is contained in:
parent
f31340b0bc
commit
82ed381ddb
@ -49,7 +49,7 @@ macro_rules! error_types {
|
||||
seL4_DeleteFirst,
|
||||
seL4_RevokeFirst,
|
||||
seL4_NotEnoughMemory,
|
||||
// XXX: Code depends on this being the last variant
|
||||
// NB: Code depends on this being the last variant
|
||||
}
|
||||
|
||||
#[repr($int_width)]
|
||||
@ -153,6 +153,31 @@ pub const seL4_MsgMaxLength: usize = 120;
|
||||
pub const seL4_MsgExtraCapBits: usize = 2;
|
||||
pub const seL4_MsgMaxExtraCaps: usize = (1usize << seL4_MsgExtraCapBits) - 1;
|
||||
|
||||
// Syscall stubs are generated to return seL4_Result unless they return
|
||||
// an APi struct with an embedded error code. The latter should be replaced
|
||||
// too but for now we leave it as-is.
|
||||
pub type seL4_Result = Result<(), seL4_Error>;
|
||||
|
||||
// NB: these traits are used by syscall stubs.
|
||||
impl From<seL4_Error> for seL4_Result {
|
||||
fn from(err: seL4_Error) -> seL4_Result {
|
||||
if err == seL4_NoError {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
// NB: usize works for both 32- and 64-bit architectures
|
||||
impl From<usize> for seL4_Error {
|
||||
fn from(val: usize) -> seL4_Error {
|
||||
// TODO(sleffler): 10 is seL4_NotEnoughMemory
|
||||
debug_assert!(val <= 10, "Invalid seL4_Error");
|
||||
unsafe { ::core::mem::transmute(val) }
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Debug)]
|
||||
/// Buffer used to store received IPC messages
|
||||
pub struct seL4_IPCBuffer {
|
||||
|
@ -647,13 +647,11 @@ def generate_stub(arch, wordsize, interface_name, method_name, method_id, input_
|
||||
standard_params.append(x)
|
||||
|
||||
# Determine if we are returning a structure, or just the error code.
|
||||
returning_struct = False
|
||||
results_structure = generate_result_struct(interface_name, method_name, output_params)
|
||||
if results_structure:
|
||||
returning_struct = generate_result_struct(interface_name, method_name, output_params)
|
||||
if returning_struct:
|
||||
return_type = "%s_%s" % (interface_name, method_name)
|
||||
returning_struct = True
|
||||
else:
|
||||
return_type = "isize"
|
||||
return_type = "seL4_Result"
|
||||
|
||||
#
|
||||
# Print doxygen comment.
|
||||
@ -690,9 +688,9 @@ def generate_stub(arch, wordsize, interface_name, method_name, method_id, input_
|
||||
#
|
||||
# Setup variables we will need.
|
||||
#
|
||||
result.append("\tlet mut result: %s = ::core::mem::zeroed();" % return_type)
|
||||
if returning_struct:
|
||||
result.append("\tlet mut result: %s = ::core::mem::zeroed();" % return_type)
|
||||
result.append("\tlet tag = seL4_MessageInfo::new(InvocationLabel::%s as seL4_Word, 0, %d, %d);" % (method_id, len(cap_expressions), len(input_expressions)))
|
||||
result.append("\tlet output_tag;")
|
||||
for i in range(num_mrs):
|
||||
result.append("\tlet mut mr%d: seL4_Word = 0;" % i)
|
||||
result.append("")
|
||||
@ -736,27 +734,31 @@ def generate_stub(arch, wordsize, interface_name, method_name, method_id, input_
|
||||
#
|
||||
if use_only_ipc_buffer:
|
||||
result.append("\t/* Perform the call. */")
|
||||
result.append("\toutput_tag = seL4_Call(%s, tag);" % service_cap)
|
||||
result.append("\tlet output_tag = seL4_Call(%s, tag);" % service_cap)
|
||||
else:
|
||||
result.append("\t/* Perform the call, passing in-register arguments directly. */")
|
||||
result.append("\toutput_tag = seL4_CallWithMRs(%s, tag," % (service_cap))
|
||||
result.append("\tlet output_tag = seL4_CallWithMRs(%s, tag," % (service_cap))
|
||||
result.append("\t\t%s);" % ', '.join(
|
||||
("&mut mr%d" % i) for i in range(num_mrs)))
|
||||
|
||||
#
|
||||
# Prepare the result.
|
||||
#
|
||||
label = "result.error" if returning_struct else "result"
|
||||
result.append("\t%s = output_tag.get_label() as _;" % label);
|
||||
if returning_struct:
|
||||
result.append("\tresult.error = output_tag.get_label() as _;");
|
||||
else:
|
||||
result.append("\tlet error: seL4_Error = output_tag.get_label().into();");
|
||||
result.append("")
|
||||
|
||||
if not use_only_ipc_buffer:
|
||||
result.append("\t/* Unmarshal registers into IPC buffer on error. */")
|
||||
result.append("\tif (%s != seL4_Error::seL4_NoError as u32) {" % label)
|
||||
result.append("\tif error != seL4_Error::seL4_NoError {")
|
||||
for i in range(num_mrs):
|
||||
result.append("\t\tseL4_SetMR(%d, mr%d);" % (i, i))
|
||||
if returning_struct:
|
||||
result.append("\t\treturn result;")
|
||||
else:
|
||||
result.append("\t\terror.into()")
|
||||
result.append("\t}")
|
||||
result.append("")
|
||||
|
||||
@ -791,7 +793,10 @@ def generate_stub(arch, wordsize, interface_name, method_name, method_id, input_
|
||||
#
|
||||
# }
|
||||
#
|
||||
result.append("\treturn result;")
|
||||
if returning_struct:
|
||||
result.append("\tresult")
|
||||
else:
|
||||
result.append("\terror.into()")
|
||||
result.append("}")
|
||||
|
||||
return "\n".join(result) + "\n"
|
||||
|
Loading…
Reference in New Issue
Block a user