blob: e0152cad39a8231bc5100b2cc0e2e81285bbdcce [file] [log] [blame]
/*#
*#Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
*#
*#SPDX-License-Identifier: BSD-2-Clause
#*/
#include <camkes/dataport.h>
#include <sel4/sel4.h>
#include <utils/util.h>
/*? macros.show_includes(me.instance.type.includes) ?*/
/*# 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 -*/
/*# 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 = 'to_%s_%s' % (me.interface.name, client_id) -*/
/*- set shmem_symbol = 'to_%s_%s_data' % (me.interface.name, 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) ?*/
/*? register_shared_variable('%s_%s_data' % (me.parent.name, client_id), shmem_symbol, shmem_size, frame_size=page_size) ?*/
volatile void * /*? shmem_name ?*/ = (volatile void *) & /*? shmem_symbol ?*/;
/*- do shmems.append((shmem_name, client_id, shmem_size)) -*/
/*- else -*/
/* skipping /*? client_id ?*/ */
/*- endif -*/
/*- endfor -*/
void * /*? me.interface.name ?*/_buf(seL4_Word client_id) {
/*- if len(shmems) == 0 -*/
return NULL;
/*- else -*/
switch (client_id) {
/*- for symbol, id, _ in shmems -*/
case /*? id ?*/:
return (void *) /*? symbol ?*/;
/*- endfor -*/
default:
return NULL;
}
/*- endif -*/
}
size_t /*? me.interface.name ?*/_buf_size(seL4_Word client_id) {
/*- if len(shmems) == 0 -*/
return 0;
/*- else -*/
switch (client_id) {
/*- for _, id, size in shmems -*/
case /*? id ?*/:
return ROUND_UP_UNSAFE(/*? size ?*/, PAGE_SIZE_4K);
/*- endfor -*/
default:
return 0;
}
/*- endif -*/
}
unsigned int /*? me.interface.name ?*/_num_badges(void) {
return /*? len(shmems) ?*/;
}
seL4_Word /*? me.interface.name ?*/_enumerate_badge(unsigned int i) {
/*- if len(shmems) == 0 -*/
return -1;
/*- else -*/
switch (i) {
/*- for _, id, _ in shmems -*/
case /*? loop.index0 ?*/:
return /*? id ?*/;
/*- endfor -*/
default:
return -1;
}
/*- endif -*/
}
int /*? me.interface.name ?*/_wrap_ptr(dataport_ptr_t *p, void *ptr) {
return -1;
}
void * /*? me.interface.name ?*/_unwrap_ptr(dataport_ptr_t *p) {
return NULL;
}