mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
xen/misc: CFI hardening
Control Flow Integrity schemes use toolchain and optionally hardware support to help protect against call/jump/return oriented programming attacks. Use cf_check to annotate function pointer targets for the toolchain. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
780c89eefa
commit
66342fb5de
16 files changed
+36
-35
No files matched your search
+4
-2
@@ -835,7 +835,8 @@ struct mmio_emul_range_ctxt {
|
||||
unsigned long mfn;
|
||||
};
|
||||
|
||||
static int print_mmio_emul_range(unsigned long s, unsigned long e, void *arg)
|
||||
static int cf_check print_mmio_emul_range(
|
||||
unsigned long s, unsigned long e, void *arg)
|
||||
{
|
||||
const struct mmio_emul_range_ctxt *ctxt = arg;
|
||||
|
||||
@@ -4606,7 +4607,8 @@ static int _handle_iomem_range(unsigned long s, unsigned long e,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int handle_iomem_range(unsigned long s, unsigned long e, void *p)
|
||||
static int cf_check handle_iomem_range(
|
||||
unsigned long s, unsigned long e, void *p)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
|
||||
@@ -2021,8 +2021,8 @@ int __hwdom_init xen_in_range(unsigned long mfn)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __hwdom_init io_bitmap_cb(unsigned long s, unsigned long e,
|
||||
void *ctx)
|
||||
static int __hwdom_init cf_check io_bitmap_cb(
|
||||
unsigned long s, unsigned long e, void *ctx)
|
||||
{
|
||||
struct domain *d = ctx;
|
||||
unsigned int i;
|
||||
|
||||
@@ -120,7 +120,7 @@ static int gcov_info_dump_payload(const struct gcov_info *info,
|
||||
|
||||
}
|
||||
|
||||
static uint32_t gcov_get_size(void)
|
||||
static uint32_t cf_check gcov_get_size(void)
|
||||
{
|
||||
uint32_t total_size = sizeof(uint32_t); /* Magic number XCOV */
|
||||
struct gcov_info *info = NULL;
|
||||
@@ -140,7 +140,7 @@ static uint32_t gcov_get_size(void)
|
||||
return total_size;
|
||||
}
|
||||
|
||||
static void gcov_reset_all_counters(void)
|
||||
static void cf_check gcov_reset_all_counters(void)
|
||||
{
|
||||
struct gcov_info *info = NULL;
|
||||
|
||||
@@ -172,8 +172,8 @@ static int gcov_dump_one_record(const struct gcov_info *info,
|
||||
return gcov_info_dump_payload(info, buffer, off);
|
||||
}
|
||||
|
||||
static int gcov_dump_all(XEN_GUEST_HANDLE_PARAM(char) buffer,
|
||||
uint32_t *buffer_size)
|
||||
static int cf_check gcov_dump_all(
|
||||
XEN_GUEST_HANDLE_PARAM(char) buffer, uint32_t *buffer_size)
|
||||
{
|
||||
uint32_t off;
|
||||
uint32_t magic = XEN_GCOV_FORMAT_MAGIC;
|
||||
|
||||
@@ -94,18 +94,19 @@ extern uint64_t __stop___llvm_prf_cnts[];
|
||||
#define START_COUNTERS ((void *)__start___llvm_prf_cnts)
|
||||
#define END_COUNTERS ((void *)__stop___llvm_prf_cnts)
|
||||
|
||||
static void reset_counters(void)
|
||||
static void cf_check reset_counters(void)
|
||||
{
|
||||
memset(START_COUNTERS, 0, END_COUNTERS - START_COUNTERS);
|
||||
}
|
||||
|
||||
static uint32_t get_size(void)
|
||||
static uint32_t cf_check get_size(void)
|
||||
{
|
||||
return ROUNDUP(sizeof(struct llvm_profile_header) + END_DATA - START_DATA +
|
||||
END_COUNTERS - START_COUNTERS + END_NAMES - START_NAMES, 8);
|
||||
}
|
||||
|
||||
static int dump(XEN_GUEST_HANDLE_PARAM(char) buffer, uint32_t *buf_size)
|
||||
static int cf_check dump(
|
||||
XEN_GUEST_HANDLE_PARAM(char) buffer, uint32_t *buf_size)
|
||||
{
|
||||
struct llvm_profile_header header = {
|
||||
.magic = LLVM_PROFILE_MAGIC,
|
||||
|
||||
+1
-1
@@ -1803,7 +1803,7 @@ static void cf_check _free_pirq_struct(struct rcu_head *head)
|
||||
xfree(container_of(head, struct pirq, rcu_head));
|
||||
}
|
||||
|
||||
void free_pirq_struct(void *ptr)
|
||||
void cf_check free_pirq_struct(void *ptr)
|
||||
{
|
||||
struct pirq *pirq = ptr;
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ static void gdb_smp_resume(void);
|
||||
static char __initdata opt_gdb[30];
|
||||
string_param("gdb", opt_gdb);
|
||||
|
||||
static void gdbstub_console_puts(const char *str, size_t nr);
|
||||
static void cf_check gdbstub_console_puts(const char *str, size_t nr);
|
||||
|
||||
/* value <-> char (de)serialzers */
|
||||
static char
|
||||
@@ -546,8 +546,7 @@ __gdb_ctx = {
|
||||
};
|
||||
static struct gdb_context *gdb_ctx = &__gdb_ctx;
|
||||
|
||||
static void
|
||||
gdbstub_console_puts(const char *str, size_t nr)
|
||||
static void cf_check gdbstub_console_puts(const char *str, size_t nr)
|
||||
{
|
||||
const char *p;
|
||||
|
||||
|
||||
@@ -157,10 +157,9 @@ unsigned long livepatch_symbols_lookup_by_name(const char *symname)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *livepatch_symbols_lookup(unsigned long addr,
|
||||
unsigned long *symbolsize,
|
||||
unsigned long *offset,
|
||||
char *namebuf)
|
||||
static const char *cf_check livepatch_symbols_lookup(
|
||||
unsigned long addr, unsigned long *symbolsize, unsigned long *offset,
|
||||
char *namebuf)
|
||||
{
|
||||
const struct payload *data;
|
||||
unsigned int i, best;
|
||||
|
||||
+2
-2
@@ -1051,8 +1051,8 @@ struct get_reserved_device_memory {
|
||||
unsigned int used_entries;
|
||||
};
|
||||
|
||||
static int get_reserved_device_memory(xen_pfn_t start, xen_ulong_t nr,
|
||||
u32 id, void *ctxt)
|
||||
static int cf_check get_reserved_device_memory(
|
||||
xen_pfn_t start, xen_ulong_t nr, u32 id, void *ctxt)
|
||||
{
|
||||
struct get_reserved_device_memory *grdm = ctxt;
|
||||
uint32_t sbdf = PCI_SBDF3(grdm->map.dev.pci.seg, grdm->map.dev.pci.bus,
|
||||
|
||||
@@ -1238,7 +1238,7 @@ struct scrub_wait_state {
|
||||
bool drop;
|
||||
};
|
||||
|
||||
static void scrub_continue(void *data)
|
||||
static void cf_check scrub_continue(void *data)
|
||||
{
|
||||
struct scrub_wait_state *st = data;
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ struct rcu_node {
|
||||
struct rcu_head rcu_head;
|
||||
};
|
||||
|
||||
static struct radix_tree_node *rcu_node_alloc(void *arg)
|
||||
static struct radix_tree_node *cf_check rcu_node_alloc(void *arg)
|
||||
{
|
||||
struct rcu_node *rcu_node = xmalloc(struct rcu_node);
|
||||
return rcu_node ? &rcu_node->node : NULL;
|
||||
@@ -65,7 +65,7 @@ static void cf_check _rcu_node_free(struct rcu_head *head)
|
||||
xfree(rcu_node);
|
||||
}
|
||||
|
||||
static void rcu_node_free(struct radix_tree_node *node, void *arg)
|
||||
static void cf_check rcu_node_free(struct radix_tree_node *node, void *arg)
|
||||
{
|
||||
struct rcu_node *rcu_node = container_of(node, struct rcu_node, node);
|
||||
call_rcu(&rcu_node->rcu_head, _rcu_node_free);
|
||||
|
||||
@@ -384,7 +384,7 @@ int rangeset_consume_ranges(struct rangeset *r,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int merge(unsigned long s, unsigned long e, void *data)
|
||||
static int cf_check merge(unsigned long s, unsigned long e, void *data)
|
||||
{
|
||||
struct rangeset *r = data;
|
||||
|
||||
|
||||
@@ -375,7 +375,7 @@ static void spinlock_profile_iterate(lock_profile_subfunc *sub, void *par)
|
||||
spin_unlock(&lock_profile_lock);
|
||||
}
|
||||
|
||||
static void spinlock_profile_print_elem(struct lock_profile *data,
|
||||
static void cf_check spinlock_profile_print_elem(struct lock_profile *data,
|
||||
int32_t type, int32_t idx, void *par)
|
||||
{
|
||||
struct spinlock *lock = data->lock;
|
||||
@@ -404,7 +404,7 @@ void cf_check spinlock_profile_printall(unsigned char key)
|
||||
spinlock_profile_iterate(spinlock_profile_print_elem, NULL);
|
||||
}
|
||||
|
||||
static void spinlock_profile_reset_elem(struct lock_profile *data,
|
||||
static void cf_check spinlock_profile_reset_elem(struct lock_profile *data,
|
||||
int32_t type, int32_t idx, void *par)
|
||||
{
|
||||
data->lock_cnt = 0;
|
||||
@@ -428,7 +428,7 @@ typedef struct {
|
||||
int rc;
|
||||
} spinlock_profile_ucopy_t;
|
||||
|
||||
static void spinlock_profile_ucopy_elem(struct lock_profile *data,
|
||||
static void cf_check spinlock_profile_ucopy_elem(struct lock_profile *data,
|
||||
int32_t type, int32_t idx, void *par)
|
||||
{
|
||||
spinlock_profile_ucopy_t *p = par;
|
||||
|
||||
@@ -523,21 +523,21 @@ int __vm_event_claim_slot(struct domain *d, struct vm_event_domain *ved,
|
||||
|
||||
#ifdef CONFIG_MEM_PAGING
|
||||
/* Registered with Xen-bound event channel for incoming notifications. */
|
||||
static void mem_paging_notification(struct vcpu *v, unsigned int port)
|
||||
static void cf_check mem_paging_notification(struct vcpu *v, unsigned int port)
|
||||
{
|
||||
vm_event_resume(v->domain, v->domain->vm_event_paging);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Registered with Xen-bound event channel for incoming notifications. */
|
||||
static void monitor_notification(struct vcpu *v, unsigned int port)
|
||||
static void cf_check monitor_notification(struct vcpu *v, unsigned int port)
|
||||
{
|
||||
vm_event_resume(v->domain, v->domain->vm_event_monitor);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEM_SHARING
|
||||
/* Registered with Xen-bound event channel for incoming notifications. */
|
||||
static void mem_sharing_notification(struct vcpu *v, unsigned int port)
|
||||
static void cf_check mem_sharing_notification(struct vcpu *v, unsigned int port)
|
||||
{
|
||||
vm_event_resume(v->domain, v->domain->vm_event_share);
|
||||
}
|
||||
|
||||
@@ -512,13 +512,13 @@ int xmem_pool_maxalloc(struct xmem_pool *pool)
|
||||
|
||||
static struct xmem_pool *xenpool;
|
||||
|
||||
static void *xmalloc_pool_get(unsigned long size)
|
||||
static void *cf_check xmalloc_pool_get(unsigned long size)
|
||||
{
|
||||
ASSERT(size == PAGE_SIZE);
|
||||
return alloc_xenheap_page();
|
||||
}
|
||||
|
||||
static void xmalloc_pool_put(void *p)
|
||||
static void cf_check xmalloc_pool_put(void *p)
|
||||
{
|
||||
free_xenheap_page(p);
|
||||
}
|
||||
|
||||
@@ -1073,7 +1073,7 @@ static void * __init allocate_ppr_log(struct amd_iommu *iommu)
|
||||
#define IVRS_MAPPINGS_DEVTAB(m) (m)[ivrs_bdf_entries].intremap_table
|
||||
|
||||
/* Gets passed to radix_tree_destroy(), so its param needs to be void *. */
|
||||
static void __init free_ivrs_mapping_callback(void *ptr)
|
||||
static void __init cf_check free_ivrs_mapping_callback(void *ptr)
|
||||
{
|
||||
const struct ivrs_mappings *ivrs_mappings = ptr;
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ void free_vcpu_struct(struct vcpu *v);
|
||||
#ifndef alloc_pirq_struct
|
||||
struct pirq *alloc_pirq_struct(struct domain *);
|
||||
#endif
|
||||
void free_pirq_struct(void *);
|
||||
void cf_check free_pirq_struct(void *);
|
||||
|
||||
/*
|
||||
* Initialise/destroy arch-specific details of a VCPU.
|
||||
|
||||