Skip to content

Per-CPU structure

include/smp/core.h View source View on GitHub
struct cpu_capability {
    enum cpu_class  class;
    uint32_t        uarch_id;
    uint32_t        issue_width;
    uint32_t        retire_width;
    cpu_perf_t      perf_score;
    uint32_t        energy_score;
    uint64_t        feature_bits;
};
struct core {
    struct core                 *self;
    cpu_id_t                    id;
    struct thread               *current_thread;
    struct cpu_capability       cap;
    size_t                      domain_cpu_id;
    struct scheduler_domain     *domains[TOPOLOGY_LEVEL_MAX];
    int32_t                     group_index[TOPOLOGY_LEVEL_MAX];
    atomic_bool                 executing_dpcs;
    atomic_bool                 idle;
    uint8_t                     *irq_stack_scratch_buf;
    bool                        in_interrupt;
    enum irql                   current_irql;
    enum irql                   irq_entered_irql;
    enum dpc_event              dpc_event;
    atomic_bool                 needs_resched;
    atomic_bool                 in_resched;
    uint32_t                    preempt_disable_depth;
    struct domain               *domain;
    struct domain_arena         *domain_arena;
    size_t                      rr_current_domain;
    struct tss                  *tss;
    uint32_t                    lapic_freq;
    struct topology_node        *topo_node;
    struct topology_cache_info  llc;
    numa_node_t                 numa_node;
    uint32_t                    package_id;
    uint32_t                    smt_mask;
    uint32_t                    smt_id;
    uint32_t                    core_id;
    uint64_t                    tsc_hz;
    uint64_t                    last_us;
    uint64_t                    last_tsc;
    _Atomic uint64_t            pt_seen_epoch;
    bool                        reclaiming_page_tables;
};
enum cpu_class {
    CPU_CLASS_UNKNOWN,
    CPU_CLASS_PERFORMANCE,
    CPU_CLASS_EFFICIENCY,
};
uint64_t smp_core_id();
struct core smp_core(void);
#define CPU_FEAT_SSE2 (1ULL << 0)
#define CPU_FEAT_AVX (1ULL << 1)
#define CPU_FEAT_AVX2 (1ULL << 2)
#define CPU_FEAT_AVX512F (1ULL << 3)
#define for_each_cpu_struct(__iter) \
    for (size_t __id = 0; \
         ((__iter = global.cores[__id]), __id < global.core_count); __id++)
#define for_each_cpu_id(__id) for (__id = 0; __id < global.core_count; __id++)