Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 169927
b: refs/heads/master
c: f88f2b4
h: refs/heads/master
i:
  169925: b875aa3
  169923: 3710088
  169919: 75f811e
v: v3
  • Loading branch information
Cyrill Gorcunov authored and Ingo Molnar committed Oct 15, 2009
1 parent 6b61200 commit 5d7c10a
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 48 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9636bc0555e3f383c120ddcffe4b7c5c58a10b1a
refs/heads/master: f88f2b4fdb1e098433ad2b005b6f7353f7268ce1
1 change: 1 addition & 0 deletions trunk/arch/x86/kernel/apic/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ static int modern_apic(void)
*/
void apic_disable(void)
{
pr_info("APIC: switched to apic NOOP\n");
apic = &apic_noop;
}

Expand Down
105 changes: 58 additions & 47 deletions trunk/arch/x86/kernel/apic/apic_noop.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*
* Though in case if apic is disabled (for some reason) we try
* to not uglify the caller's code and allow to call (some) apic routines
* like self-ipi, etc... and issue a warning if an operation is not allowed
* like self-ipi, etc...
*/

#include <linux/threads.h>
Expand All @@ -30,76 +30,88 @@
#include <asm/acpi.h>
#include <asm/e820.h>

/*
* some operations should never be reached with
* noop apic if it's not turned off, this mostly
* means the caller forgot to disable apic (or
* check the apic presence) before doing a call
*/
static void warn_apic_enabled(void)
static void noop_init_apic_ldr(void) { }
static void noop_send_IPI_mask(const struct cpumask *cpumask, int vector) { }
static void noop_send_IPI_mask_allbutself(const struct cpumask *cpumask, int vector) { }
static void noop_send_IPI_allbutself(int vector) { }
static void noop_send_IPI_all(int vector) { }
static void noop_send_IPI_self(int vector) { }
static void noop_apic_wait_icr_idle(void) { }
static void noop_apic_icr_write(u32 low, u32 id) { }

static int noop_wakeup_secondary_cpu(int apicid, unsigned long start_eip)
{
WARN_ONCE((cpu_has_apic || !disable_apic),
"APIC: Called for NOOP operation with apic enabled\n");
return -1;
}

/*
* To check operations but do not bloat source code
*/
#define NOOP_FUNC(func) func { warn_apic_enabled(); }
#define NOOP_FUNC_RET(func, ret) func { warn_apic_enabled(); return ret; }

NOOP_FUNC(static void noop_init_apic_ldr(void))
NOOP_FUNC(static void noop_send_IPI_mask(const struct cpumask *cpumask, int vector))
NOOP_FUNC(static void noop_send_IPI_mask_allbutself(const struct cpumask *cpumask, int vector))
NOOP_FUNC(static void noop_send_IPI_allbutself(int vector))
NOOP_FUNC(static void noop_send_IPI_all(int vector))
NOOP_FUNC(static void noop_send_IPI_self(int vector))
NOOP_FUNC_RET(static int noop_wakeup_secondary_cpu(int apicid, unsigned long start_eip), -1)
NOOP_FUNC(static void noop_apic_write(u32 reg, u32 v))
NOOP_FUNC(void noop_apic_wait_icr_idle(void))
NOOP_FUNC_RET(static u32 noop_safe_apic_wait_icr_idle(void), 0)
NOOP_FUNC_RET(static u64 noop_apic_icr_read(void), 0)
NOOP_FUNC(static void noop_apic_icr_write(u32 low, u32 id))
NOOP_FUNC_RET(static physid_mask_t noop_ioapic_phys_id_map(physid_mask_t phys_map), phys_map)
NOOP_FUNC_RET(static int noop_cpu_to_logical_apicid(int cpu), 1)
NOOP_FUNC_RET(static int noop_default_phys_pkg_id(int cpuid_apic, int index_msb), 0)
NOOP_FUNC_RET(static unsigned int noop_get_apic_id(unsigned long x), 0)
static u32 noop_safe_apic_wait_icr_idle(void)
{
return 0;
}

static u64 noop_apic_icr_read(void)
{
return 0;
}

static physid_mask_t noop_ioapic_phys_id_map(physid_mask_t phys_map)
{
return phys_map;
}

static int noop_cpu_to_logical_apicid(int cpu)
{
return 0;
}

static int noop_phys_pkg_id(int cpuid_apic, int index_msb)
{
return 0;
}

static unsigned int noop_get_apic_id(unsigned long x)
{
return 0;
}

static int noop_probe(void)
{
/* should not ever be enabled this way */
/*
* NOOP apic should not ever be
* enabled via probe routine
*/
return 0;
}

static int noop_apic_id_registered(void)
{
warn_apic_enabled();
return physid_isset(read_apic_id(), phys_cpu_present_map);
/*
* if we would be really "pedantic"
* we should pass read_apic_id() here
* but since NOOP suppose APIC ID = 0
* lets save a few cycles
*/
return physid_isset(0, phys_cpu_present_map);
}

static const struct cpumask *noop_target_cpus(void)
{
warn_apic_enabled();

/* only BSP here */
return cpumask_of(0);
}

static unsigned long noop_check_apicid_used(physid_mask_t bitmap, int apicid)
{
warn_apic_enabled();
return physid_isset(apicid, bitmap);
}

static unsigned long noop_check_apicid_present(int bit)
{
warn_apic_enabled();
return physid_isset(bit, phys_cpu_present_map);
}

static void noop_vector_allocation_domain(int cpu, struct cpumask *retmask)
{
warn_apic_enabled();
if (cpu != 0)
pr_warning("APIC: Vector allocated for non-BSP cpu\n");
cpumask_clear(retmask);
Expand All @@ -108,22 +120,21 @@ static void noop_vector_allocation_domain(int cpu, struct cpumask *retmask)

int noop_apicid_to_node(int logical_apicid)
{
warn_apic_enabled();

/* we're always on node 0 */
return 0;
}

static u32 noop_apic_read(u32 reg)
{
/*
* noop-read is always safe until we have
* non-disabled unit
*/
WARN_ON_ONCE((cpu_has_apic && !disable_apic));
return 0;
}

static void noop_apic_write(u32 reg, u32 v)
{
WARN_ON_ONCE((cpu_has_apic || !disable_apic));
}

struct apic apic_noop = {
.name = "noop",
.probe = noop_probe,
Expand Down Expand Up @@ -157,7 +168,7 @@ struct apic apic_noop = {
.check_phys_apicid_present = default_check_phys_apicid_present,
.enable_apic_mode = NULL,

.phys_pkg_id = noop_default_phys_pkg_id,
.phys_pkg_id = noop_phys_pkg_id,

.mps_oem_check = NULL,

Expand Down

0 comments on commit 5d7c10a

Please sign in to comment.