/*#
 *#Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
 *#
 *#SPDX-License-Identifier: BSD-2-Clause
  #*/

/*# Assign client ids and badges #*/
/*- set badges = namespace() -*/
/*- if client_ids is not undefined -*/
    /*- set badges.badges = client_ids.badges -*/
/*- else -*/
    /*- from 'rpc-connector.c' import allocate_badges with context -*/
    /*- do allocate_badges(badges) -*/
/*- endif -*/
/*- set badges = badges.badges -*/

/*- from 'global-endpoint.template.c' import allocate_cap with context -*/

#[no_mangle]
pub fn /*? me.interface.name ?*/_emit(badge: sel4_sys::seL4_Word) {
    match badge {
    /*- for (i, c) in enumerate(me.parent.from_ends) -*/
        /*- do allocate_cap(c, is_reader=False) -*/
        /*- set notification = pop('notification') -*/
        /*? badges[i] ?*/ => unsafe { sel4_sys::seL4_Signal(/*? notification ?*/) },
    /*- endfor -*/
        _ => unreachable!(),
    }
}

/*# Enumerate all the incoming interfaces #*/
/*- set shmems = [] -*/
/*- set client_ids = set() -*/
/*- for c in me.parent.from_ends -*/

    /*- set client_id = badges[loop.index0] -*/

    /*- if client_id not in client_ids -*/
        /*- do client_ids.add(client_id) -*/

        /*- set shmem_size = configuration[c.instance.name].get("%s_shmem_size" % c.interface.name, 4096) -*/
        /*- set shmem_section = '%s_%s' % (me.interface.name.upper(), client_id) -*/
        /*- set shmem_symbol = '%s_%s_DATA' % (me.interface.name.upper(), client_id) -*/
        /*- set shmem_name = "%s_buf_%s" % (me.interface.name, client_id) -*/
        /*- set page_size = macros.get_page_size(shmem_size, options.architecture) -*/
        /*- if page_size == 0 -*/
          /*? raise(TemplateError('Setting %s.%s_shmem_size does not meet minimum size and alignment requirements. %d must be at least %d and %d aligned' % (c.instance.name, c.interface.name, size, 4096, 4096))) ?*/
        /*- endif -*/
        /*- set page_size_bits = int(math.log(page_size, 2)) -*/

        /*? macros.shared_buffer_symbol(sym=shmem_symbol, shmem_size=shmem_size, page_size=page_size, language='rust') ?*/
        /*? register_shared_variable('%s_%s_data' % (me.parent.name, client_id), shmem_symbol, shmem_size, frame_size=page_size, language='rust') ?*/

        /*- do shmems.append((shmem_symbol, client_id, shmem_size)) -*/
    /*- else -*/
        /* skipping /*? client_id ?*/ */
    /*- endif -*/

/*- endfor -*/


pub fn /*? me.interface.name ?*/_interface_recv_buffer(
    badge: sel4_sys::seL4_Word,
) -> &'static mut [u8] {
    match badge {
    /*- for symbol, id, _ in shmems -*/
        /*? id ?*/ => unsafe { &mut /*? symbol.upper() ?*/.data[..] },
    /*- endfor -*/
        _ => unreachable!(),
    }
}


/*- from 'rpc-connector.c' import establish_recv_rpc with context -*/

/*- set connector = namespace() -*/

/*? establish_recv_rpc(connector, me.interface.name, buffer=('(%s_buf(%s_get_sender_id()))' % (me.interface.name,me.interface.name) , '(%s_buf_size(%s_get_sender_id()))' % (me.interface.name,me.interface.name)), language='rust') ?*/

/*- set prefix = me.interface.name.upper() -*/
#[no_mangle]
pub static /*? prefix ?*/_INTERFACE_ENDPOINT: sel4_sys::seL4_CPtr = /*? connector.ep ?*/;
#[no_mangle]
pub static /*? prefix ?*/_INTERFACE_REPLY: sel4_sys::seL4_CPtr = /*? connector.reply_cap_slot ?*/;
