The RISC-V calling convention specifies that when a C function takes an argument by value, the binary function should take the argument by reference, if the value is larger than 2 pointer words. For binary verification, we avoid implementing this aspect of the RISC-V calling convention, by eliminating all such function arguments for functions which are not inlined. In this commit, we remove `extra_caps_t` function arguments. This primarily concerns invocation decode functions. Since `loookupExtraCaps` already stores extra caps in a global `current_extra_caps`, this essentially amounts to eliminating many redundant structure copy operations. On some execution paths involving IPC, the extra caps lookup may happen twice: first in the invocation decode, and then for cap transfer in the performance phase of the IPC operation. Because the two phases are entirely distinct, there is no interference in the use of a common global variable. Even though we are primarily concerned with RISC-V, we remove `extra_caps_t` arguments across all architectures. Signed-off-by: Matthew Brecknell <Matthew.Brecknell@data61.csiro.au>
27 lines
893 B
C
27 lines
893 B
C
/*
|
|
* Copyright 2014, General Dynamics C4 Systems
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-only
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <types.h>
|
|
#include <api/failures.h>
|
|
#include <object/structures.h>
|
|
#include <arch/object/interrupt.h>
|
|
#include <plat/machine.h>
|
|
|
|
exception_t decodeIRQControlInvocation(word_t invLabel, word_t length,
|
|
cte_t *srcSlot, word_t *buffer);
|
|
exception_t invokeIRQControl(irq_t irq, cte_t *handlerSlot, cte_t *controlSlot);
|
|
exception_t decodeIRQHandlerInvocation(word_t invLabel, irq_t irq);
|
|
void invokeIRQHandler_AckIRQ(irq_t irq);
|
|
void invokeIRQHandler_SetIRQHandler(irq_t irq, cap_t cap, cte_t *slot);
|
|
void invokeIRQHandler_ClearIRQHandler(irq_t irq);
|
|
void deletingIRQHandler(irq_t irq);
|
|
void deletedIRQHandler(irq_t irq);
|
|
void handleInterrupt(irq_t irq);
|
|
bool_t isIRQActive(irq_t irq);
|
|
void setIRQState(irq_state_t irqState, irq_t irq);
|
|
|