Skip to content

Commit

Permalink
hw/intc/loongson_liointc: Fix per core ISR handling
Browse files Browse the repository at this point in the history
Per core ISR is a set of 32-bit registers spaced by 8 bytes.
This patch fixed calculation of it's size and also added check
of alignment at reading & writing.

Fixes: Coverity CID 1438965 and CID 1438967
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Reviewed-by: Huacai Chen <chenhuacai@kernel.org>
Message-Id: <20210112012527.28927-1-jiaxun.yang@flygoat.com>
[PMD: Added Coverity CID]
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
  • Loading branch information
FlyGoat authored and philmd committed Feb 21, 2021
1 parent 283eae1 commit 6902759
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions hw/intc/loongson_liointc.c
Expand Up @@ -41,7 +41,7 @@
#define R_IEN_CLR 0x2c
#define R_ISR_SIZE 0x8
#define R_START 0x40
#define R_END 0x64
#define R_END (R_START + R_ISR_SIZE * NUM_CORES)

struct loongson_liointc {
SysBusDevice parent_obj;
Expand Down Expand Up @@ -125,7 +125,12 @@ liointc_read(void *opaque, hwaddr addr, unsigned int size)
}

if (addr >= R_START && addr < R_END) {
int core = (addr - R_START) / R_ISR_SIZE;
hwaddr offset = addr - R_START;
int core = offset / R_ISR_SIZE;

if (offset % R_ISR_SIZE) {
goto out;
}
r = p->per_core_isr[core];
goto out;
}
Expand Down Expand Up @@ -169,7 +174,12 @@ liointc_write(void *opaque, hwaddr addr,
}

if (addr >= R_START && addr < R_END) {
int core = (addr - R_START) / R_ISR_SIZE;
hwaddr offset = addr - R_START;
int core = offset / R_ISR_SIZE;

if (offset % R_ISR_SIZE) {
goto out;
}
p->per_core_isr[core] = value;
goto out;
}
Expand Down

0 comments on commit 6902759

Please sign in to comment.