temp_cap.u.io.end = 65535;
/* fall through */
+ case ObjType_IRQSrc:
+ /* Caller has to set vec_start and vec_end */
case ObjType_Kernel:
case ObjType_IPI:
case ObjType_IRQTable:
case ObjType_IRQDest:
- case ObjType_IRQSrc:
case ObjType_EndPoint:
case ObjType_Notify_IPI:
case ObjType_PerfMon:
gensize_t size = 0;
errval_t err;
bool do_range_check = false;
+ struct capability *src_cap = &src_cte->cap;
/* Parameter checking */
assert(type != ObjType_Null);
__FUNCTION__, type, offset, objsize, count);
/* check that offset into source cap is multiple of BASE_PAGE_SIZE */
- if (offset % BASE_PAGE_SIZE != 0) {
+ if (src_cap->type != ObjType_IRQSrc && offset % BASE_PAGE_SIZE != 0) {
return SYS_ERR_RETYPE_INVALID_OFFSET;
}
- assert(offset % BASE_PAGE_SIZE == 0);
+ assert(offset % BASE_PAGE_SIZE == 0 || src_cap->type == ObjType_IRQSrc);
// check that size is multiple of BASE_PAGE_SIZE for mappable types
gensize_t base_size = BASE_PAGE_SIZE;
return SYS_ERR_RETYPE_MAPPING_EXPLICIT;
}
- struct capability *src_cap = &src_cte->cap;
TRACE_CAP_MSG("retyping", src_cte);
src_cap->type == ObjType_RAM ||
src_cap->type == ObjType_Dispatcher ||
src_cap->type == ObjType_Frame ||
- src_cap->type == ObjType_DevFrame);
+ src_cap->type == ObjType_DevFrame ||
+ src_cap->type == ObjType_IRQSrc);
- if (src_cap->type != ObjType_Dispatcher) {
+ if (src_cap->type != ObjType_Dispatcher && src_cap->type != ObjType_IRQSrc) {
base = get_address(src_cap);
size = get_size(src_cap);
}
/* check that we can create `count` objs from `offset` in source, and
* update base accordingly */
- if (src_cap->type != ObjType_Dispatcher) {
+ if (src_cap->type != ObjType_Dispatcher && src_cap->type != ObjType_IRQSrc) {
// TODO: convince ourselves that this is the only condition on offset
if (offset + count * objsize > get_size(src_cap)) {
debug(SUBSYS_CAPS, "caps_retype: cannot create all %zu objects"
}
}
+ // IRQSrc specific checks
+ uint64_t vec_start_new = offset;
+ uint64_t vec_end_new = objsize;
+ if(src_cap->type == ObjType_IRQSrc){
+
+ // Check new range is valid
+ if(vec_start_new > vec_end_new){
+ return SYS_ERR_RETYPE_INVALID_OFFSET;
+ }
+
+ // Check vec_start_new in range
+ if(!(src_cap->u.irqsrc.vec_start <= vec_start_new &&
+ vec_start_new <= src_cap->u.irqsrc.vec_end)){
+ return SYS_ERR_RETYPE_INVALID_OFFSET;
+ }
+
+ // Check vec_end_new in range
+ if(!(src_cap->u.irqsrc.vec_start <= vec_end_new &&
+ vec_end_new <= src_cap->u.irqsrc.vec_end)){
+ return SYS_ERR_RETYPE_INVALID_OBJSIZE;
+ }
+ }
+
+
/* create new caps */
struct cte *dest_cte =
caps_locate_slot(get_address(dest_cnode), dest_slot);
- err = caps_create(type, base, size, objsize, count, my_core_id, dest_cte);
+ if(type == ObjType_IRQSrc){
+ // Pass special arguments
+ err = caps_create(type, 0, 0, 0, 1, my_core_id, dest_cte);
+ if(err_is_ok(err)){
+ dest_cte->cap.u.irqsrc.vec_start = vec_start_new;
+ dest_cte->cap.u.irqsrc.vec_end = vec_end_new;
+ }
+ } else {
+ err = caps_create(type, base, size, objsize, count, my_core_id, dest_cte);
+ }
if (err_is_fail(err)) {
debug(SUBSYS_CAPS, "caps_retype: failed to create a dest cap\n");
return err_push(err, SYS_ERR_RETYPE_CREATE);
#include "kaluga.h"
+static struct capref all_irq_cap;
+
static void pci_change_event(octopus_mode_t mode, char* device_record, void* st);
static void spawnd_up_event(octopus_mode_t mode, char* spawnd_record, void* st)
struct capref cap;
cap.cnode = argnode_ref;
cap.slot = 0;
- err = sys_debug_create_irq_src_cap(cap, start, end);
+ //err = sys_debug_create_irq_src_cap(cap, start, end);
+ err = cap_retype(cap, all_irq_cap, start, ObjType_IRQSrc,
+ end, 1);
if(err_is_fail(err)){
USER_PANIC_ERR(err, "Could not create int_src cap");
}
errval_t watch_for_pci_root_bridge(void)
{
+
+ // TODO: Get all_irq_cap from somewhere and remove sys_debug call
+ errval_t err;
+ err = slot_alloc(&all_irq_cap);
+ assert(err_is_ok(err));
+ err = sys_debug_create_irq_src_cap(all_irq_cap, 0, 65536);
+ assert(err_is_ok(err));
+
static char* root_bridge = "r'hw\\.pci\\.rootbridge\\.[0-9]+' { "
" bus: _, device: _, function: _, maxbus: _,"
" acpi_node: _ }";