Commit 39e81633 authored by Neeraj Upadhyay's avatar Neeraj Upadhyay Committed by Sean Christopherson
Browse files

x86/apic: KVM: Move apic_find_highest_vector() to a common header



In preparation for using apic_find_highest_vector() in Secure AVIC
guest APIC driver, move it and associated macros to apic.h.

No functional change intended.

Acked-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarNeeraj Upadhyay <Neeraj.Upadhyay@amd.com>
Link: https://lore.kernel.org/r/20250709033242.267892-11-Neeraj.Upadhyay@amd.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent b5f8980f
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -503,6 +503,28 @@ static inline bool is_vector_pending(unsigned int vector)
	return lapic_vector_set_in_irr(vector) || pi_pending_this_cpu(vector);
}

#define MAX_APIC_VECTOR			256
#define APIC_VECTORS_PER_REG		32

/*
 * Vector states are maintained by APIC in 32-bit registers that are
 * 16 bytes aligned. The status of each vector is kept in a single
 * bit.
 */
static inline int apic_find_highest_vector(void *bitmap)
{
	int vec;
	u32 *reg;

	for (vec = MAX_APIC_VECTOR - APIC_VECTORS_PER_REG; vec >= 0; vec -= APIC_VECTORS_PER_REG) {
		reg = bitmap + APIC_VECTOR_TO_REG_OFFSET(vec);
		if (*reg)
			return __fls(*reg) + vec;
	}

	return -1;
}

/*
 * Warm reset vector position:
 */
+1 −17
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <linux/export.h>
#include <linux/math64.h>
#include <linux/slab.h>
#include <asm/apic.h>
#include <asm/processor.h>
#include <asm/mce.h>
#include <asm/msr.h>
@@ -55,9 +56,6 @@
/* 14 is the version for Xeon and Pentium 8.4.8*/
#define APIC_VERSION			0x14UL
#define LAPIC_MMIO_LENGTH		(1 << 12)
/* followed define is not in apicdef.h */
#define MAX_APIC_VECTOR			256
#define APIC_VECTORS_PER_REG		32

/*
 * Enable local APIC timer advancement (tscdeadline mode only) with adaptive
@@ -616,20 +614,6 @@ static const unsigned int apic_lvt_mask[KVM_APIC_MAX_NR_LVT_ENTRIES] = {
	[LVT_CMCI] = LVT_MASK | APIC_MODE_MASK
};

static int apic_find_highest_vector(void *bitmap)
{
	int vec;
	u32 *reg;

	for (vec = MAX_APIC_VECTOR - APIC_VECTORS_PER_REG; vec >= 0; vec -= APIC_VECTORS_PER_REG) {
		reg = bitmap + APIC_VECTOR_TO_REG_OFFSET(vec);
		if (*reg)
			return __fls(*reg) + vec;
	}

	return -1;
}

static u8 count_vectors(void *bitmap)
{
	int vec;