riscv: fix use of incorrectly sized variables
The RISC-V arch incorrectly uses 32-bit instead of 64-bit variables in several places. Fix this. In addition, BITS_PER_LONG is set to 64 on RV64I systems. Signed-off-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
776e6335bf
commit
b2c860c6dc
@ -74,12 +74,12 @@ static inline phys_addr_t virt_to_phys(void *vaddr)
|
|||||||
#define __arch_getb(a) (*(unsigned char *)(a))
|
#define __arch_getb(a) (*(unsigned char *)(a))
|
||||||
#define __arch_getw(a) (*(unsigned short *)(a))
|
#define __arch_getw(a) (*(unsigned short *)(a))
|
||||||
#define __arch_getl(a) (*(unsigned int *)(a))
|
#define __arch_getl(a) (*(unsigned int *)(a))
|
||||||
#define __arch_getq(a) (*(unsigned long *)(a))
|
#define __arch_getq(a) (*(unsigned long long *)(a))
|
||||||
|
|
||||||
#define __arch_putb(v, a) (*(unsigned char *)(a) = (v))
|
#define __arch_putb(v, a) (*(unsigned char *)(a) = (v))
|
||||||
#define __arch_putw(v, a) (*(unsigned short *)(a) = (v))
|
#define __arch_putw(v, a) (*(unsigned short *)(a) = (v))
|
||||||
#define __arch_putl(v, a) (*(unsigned int *)(a) = (v))
|
#define __arch_putl(v, a) (*(unsigned int *)(a) = (v))
|
||||||
#define __arch_putq(v, a) (*(unsigned long *)(a) = (v))
|
#define __arch_putq(v, a) (*(unsigned long long *)(a) = (v))
|
||||||
|
|
||||||
#define __raw_writeb(v, a) __arch_putb(v, a)
|
#define __raw_writeb(v, a) __arch_putb(v, a)
|
||||||
#define __raw_writew(v, a) __arch_putw(v, a)
|
#define __raw_writew(v, a) __arch_putw(v, a)
|
||||||
@ -152,7 +152,7 @@ static inline u32 readl(const volatile void __iomem *addr)
|
|||||||
|
|
||||||
static inline u64 readq(const volatile void __iomem *addr)
|
static inline u64 readq(const volatile void __iomem *addr)
|
||||||
{
|
{
|
||||||
u32 val;
|
u64 val;
|
||||||
|
|
||||||
val = __arch_getq(addr);
|
val = __arch_getq(addr);
|
||||||
__iormb();
|
__iormb();
|
||||||
|
@ -37,10 +37,10 @@ typedef unsigned short __kernel_gid_t;
|
|||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
typedef __SIZE_TYPE__ __kernel_size_t;
|
typedef __SIZE_TYPE__ __kernel_size_t;
|
||||||
#else
|
#else
|
||||||
typedef unsigned int __kernel_size_t;
|
typedef unsigned long __kernel_size_t;
|
||||||
#endif
|
#endif
|
||||||
typedef int __kernel_ssize_t;
|
typedef long __kernel_ssize_t;
|
||||||
typedef int __kernel_ptrdiff_t;
|
typedef long __kernel_ptrdiff_t;
|
||||||
typedef long __kernel_time_t;
|
typedef long __kernel_time_t;
|
||||||
typedef long __kernel_suseconds_t;
|
typedef long __kernel_suseconds_t;
|
||||||
typedef long __kernel_clock_t;
|
typedef long __kernel_clock_t;
|
||||||
|
@ -21,7 +21,11 @@ typedef unsigned short umode_t;
|
|||||||
*/
|
*/
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_RV64I
|
||||||
|
#define BITS_PER_LONG 64
|
||||||
|
#else
|
||||||
#define BITS_PER_LONG 32
|
#define BITS_PER_LONG 32
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/encoding.h>
|
#include <asm/encoding.h>
|
||||||
|
|
||||||
static void _exit_trap(int code, uint epc, struct pt_regs *regs);
|
static void _exit_trap(ulong code, ulong epc, struct pt_regs *regs);
|
||||||
|
|
||||||
int interrupt_init(void)
|
int interrupt_init(void)
|
||||||
{
|
{
|
||||||
@ -34,9 +34,9 @@ int disable_interrupts(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint handle_trap(uint mcause, uint epc, struct pt_regs *regs)
|
ulong handle_trap(ulong mcause, ulong epc, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
uint is_int;
|
ulong is_int;
|
||||||
|
|
||||||
is_int = (mcause & MCAUSE_INT);
|
is_int = (mcause & MCAUSE_INT);
|
||||||
if ((is_int) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT))
|
if ((is_int) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT))
|
||||||
@ -60,7 +60,7 @@ __attribute__((weak)) void timer_interrupt(struct pt_regs *regs)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _exit_trap(int code, uint epc, struct pt_regs *regs)
|
static void _exit_trap(ulong code, ulong epc, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
static const char * const exception_code[] = {
|
static const char * const exception_code[] = {
|
||||||
"Instruction address misaligned",
|
"Instruction address misaligned",
|
||||||
@ -70,6 +70,6 @@ static void _exit_trap(int code, uint epc, struct pt_regs *regs)
|
|||||||
"Load address misaligned"
|
"Load address misaligned"
|
||||||
};
|
};
|
||||||
|
|
||||||
printf("exception code: %d , %s , epc %08x , ra %08lx\n",
|
printf("exception code: %ld , %s , epc %lx , ra %lx\n",
|
||||||
code, exception_code[code], epc, regs->ra);
|
code, exception_code[code], epc, regs->ra);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user