Skip to content

Commit 194fd8b

Browse files
shiqinggjren1
authored andcommitted
hv: irq: fix 'Pointer arithmetic is not on array'
- Define the array for 'struct irq_desc' with its size The array size for 'struct irq_desc' is constant and will not be changed. - Use array rather than a pointer to avoid the pointer arithmetic. Signed-off-by: Shiqing Gao <shiqing.gao@intel.com> Reviewed-by: Junjie Mao <junjie.mao@intel.com>
1 parent 401ffd1 commit 194fd8b

File tree

1 file changed

+17
-25
lines changed

1 file changed

+17
-25
lines changed

hypervisor/arch/x86/irq.c

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,19 @@
88

99
static spinlock_t exception_spinlock = { .head = 0U, .tail = 0U, };
1010

11-
static struct irq_desc *irq_desc_base;
11+
static struct irq_desc irq_desc_array[NR_MAX_IRQS];
1212
static uint32_t vector_to_irq[NR_MAX_VECTOR + 1];
1313

1414
spurious_handler_t spurious_handler;
1515

1616
static void init_irq_desc(void)
1717
{
18-
uint32_t i, page_num = 0;
19-
uint32_t desc_size = NR_MAX_IRQS * sizeof(struct irq_desc);
20-
21-
page_num = (desc_size + CPU_PAGE_SIZE - 1U) >> CPU_PAGE_SHIFT;
22-
23-
irq_desc_base = alloc_pages(page_num);
24-
25-
ASSERT(irq_desc_base != NULL, "page alloc failed!");
26-
(void)memset(irq_desc_base, 0, page_num * CPU_PAGE_SIZE);
18+
uint32_t i;
2719

2820
for (i = 0U; i < NR_MAX_IRQS; i++) {
29-
irq_desc_base[i].irq = i;
30-
irq_desc_base[i].vector = VECTOR_INVALID;
31-
spinlock_init(&irq_desc_base[i].irq_lock);
21+
irq_desc_array[i].irq = i;
22+
irq_desc_array[i].vector = VECTOR_INVALID;
23+
spinlock_init(&irq_desc_array[i].irq_lock);
3224
}
3325

3426
for (i = 0U; i <= NR_MAX_VECTOR; i++) {
@@ -75,7 +67,7 @@ uint32_t irq_mark_used(uint32_t irq)
7567
if (irq > NR_MAX_IRQS)
7668
return IRQ_INVALID;
7769

78-
desc = irq_desc_base + irq;
70+
desc = &irq_desc_array[irq];
7971
spinlock_irqsave_obtain(&desc->irq_lock);
8072
if (desc->used == IRQ_NOT_ASSIGNED)
8173
desc->used = IRQ_ASSIGNED_NOSHARE;
@@ -95,7 +87,7 @@ static uint32_t alloc_irq(void)
9587
spinlock_rflags;
9688

9789
for (i = irq_gsi_num(); i < NR_MAX_IRQS; i++) {
98-
desc = irq_desc_base + i;
90+
desc = &irq_desc_array[i];
9991
spinlock_irqsave_obtain(&desc->irq_lock);
10092
if (desc->used == IRQ_NOT_ASSIGNED) {
10193
desc->used = IRQ_ASSIGNED_NOSHARE;
@@ -112,7 +104,7 @@ static void _irq_desc_set_vector(uint32_t irq, uint32_t vr)
112104
{
113105
struct irq_desc *desc;
114106

115-
desc = irq_desc_base + irq;
107+
desc = &irq_desc_array[irq];
116108
vector_to_irq[vr] = irq;
117109
desc->vector = vr;
118110
}
@@ -124,7 +116,7 @@ static void irq_desc_set_vector(uint32_t irq, uint32_t vr)
124116

125117
spinlock_rflags;
126118

127-
desc = irq_desc_base + irq;
119+
desc = &irq_desc_array[irq];
128120
spinlock_irqsave_obtain(&desc->irq_lock);
129121
vector_to_irq[vr] = irq;
130122
desc->vector = vr;
@@ -141,7 +133,7 @@ static void _irq_desc_free_vector(uint32_t irq)
141133
if (irq > NR_MAX_IRQS)
142134
return;
143135

144-
desc = irq_desc_base + irq;
136+
desc = &irq_desc_array[irq];
145137

146138
vr = desc->vector;
147139
desc->used = IRQ_NOT_ASSIGNED;
@@ -258,7 +250,7 @@ common_register_handler(uint32_t irq,
258250
goto OUT;
259251
}
260252

261-
desc = irq_desc_base + irq;
253+
desc = &irq_desc_array[irq];
262254
added = irq_desc_append_dev(desc, node, info->share);
263255
if (!added) {
264256
free(node);
@@ -306,7 +298,7 @@ uint32_t irq_desc_alloc_vector(uint32_t irq, bool lowpri)
306298
if (irq > NR_MAX_IRQS)
307299
return VECTOR_INVALID;
308300

309-
desc = irq_desc_base + irq;
301+
desc = &irq_desc_array[irq];
310302
spinlock_irqsave_obtain(&desc->irq_lock);
311303
if (desc->vector != VECTOR_INVALID) {
312304
/* already allocated a vector */
@@ -335,7 +327,7 @@ void irq_desc_try_free_vector(uint32_t irq)
335327
if (irq > NR_MAX_IRQS || irq < NR_LEGACY_IRQ)
336328
return;
337329

338-
desc = irq_desc_base + irq;
330+
desc = &irq_desc_array[irq];
339331
spinlock_irqsave_obtain(&desc->irq_lock);
340332
if (desc->dev_list == NULL)
341333
_irq_desc_free_vector(irq);
@@ -347,7 +339,7 @@ void irq_desc_try_free_vector(uint32_t irq)
347339
uint32_t irq_to_vector(uint32_t irq)
348340
{
349341
if (irq < NR_MAX_IRQS)
350-
return irq_desc_base[irq].vector;
342+
return irq_desc_array[irq].vector;
351343
else
352344
return VECTOR_INVALID;
353345
}
@@ -416,7 +408,7 @@ void dispatch_interrupt(struct intr_excp_ctx *ctx)
416408
if (irq == IRQ_INVALID)
417409
goto ERR;
418410

419-
desc = irq_desc_base + irq;
411+
desc = &irq_desc_array[irq];
420412
per_cpu(irq_count, get_cpu_id())[irq]++;
421413

422414
if (vr != desc->vector)
@@ -572,7 +564,7 @@ void update_irq_handler(uint32_t irq, irq_handler_t func)
572564
if (irq >= NR_MAX_IRQS)
573565
return;
574566

575-
desc = irq_desc_base + irq;
567+
desc = &irq_desc_array[irq];
576568
spinlock_irqsave_obtain(&desc->irq_lock);
577569
desc->irq_handler = func;
578570
spinlock_irqrestore_release(&desc->irq_lock);
@@ -688,7 +680,7 @@ void get_cpu_interrupt_info(char *str, int str_max)
688680
str += len;
689681

690682
for (irq = 0U; irq < NR_MAX_IRQS; irq++) {
691-
desc = irq_desc_base + irq;
683+
desc = &irq_desc_array[irq];
692684
vector = irq_to_vector(irq);
693685
if (desc->used != IRQ_NOT_ASSIGNED &&
694686
vector != VECTOR_INVALID) {

0 commit comments

Comments
 (0)