From c59cbe0dbc51e348eaa21db0d1550be3dd92339c Mon Sep 17 00:00:00 2001 From: Harry Chen Date: Tue, 7 May 2019 19:50:48 +0800 Subject: [PATCH] Fix stack alignment problem for MIPS N32 ABI, and fix alignment problem in CharAttribute Signed-off-by: Harry Chen --- kernel/src/arch/mipsel/boot/context.S | 4 ++-- kernel/src/arch/mipsel/boot/trap.S | 6 +++--- kernel/src/arch/mipsel/context.rs | 2 ++ kernel/src/drivers/console/mod.rs | 1 + kernel/src/util/escape_parser.rs | 1 + 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/kernel/src/arch/mipsel/boot/context.S b/kernel/src/arch/mipsel/boot/context.S index d81e961..5854e85 100644 --- a/kernel/src/arch/mipsel/boot/context.S +++ b/kernel/src/arch/mipsel/boot/context.S @@ -11,7 +11,7 @@ switch_context: // save from's registers - addi sp, sp, (-4*14) + addi sp, sp, (-4*16) sw sp, 0(a0) sw ra, 0(sp) sw s0, 4*4(sp) @@ -60,7 +60,7 @@ switch_context: lw s7, 11*4(sp) lw s8, 12*4(sp) lw gp, 13*4(sp) - addi sp, sp, (4*14) + addi sp, sp, (4*16) sw zero, 0(a1) jr ra diff --git a/kernel/src/arch/mipsel/boot/trap.S b/kernel/src/arch/mipsel/boot/trap.S index 44d48d2..35d3096 100644 --- a/kernel/src/arch/mipsel/boot/trap.S +++ b/kernel/src/arch/mipsel/boot/trap.S @@ -32,8 +32,8 @@ trap_from_kernel: * k1 = old stack pointer * sp = kernel stack */ - # allocate 38 words for trapframe + 4 extra words - addiu sp, sp, -168 + # allocate 38 words for trapframe + 6 extra words + addiu sp, sp, -176 # save general registers sw ra, 160(sp) @@ -149,7 +149,7 @@ trap_return: // save kernel stack la k0, _cur_kstack_ptr - addiu k1, sp, 168 + addiu k1, sp, 176 sw k1, 0(k0) nop diff --git a/kernel/src/arch/mipsel/context.rs b/kernel/src/arch/mipsel/context.rs index 606fbad..1f63f3a 100644 --- a/kernel/src/arch/mipsel/context.rs +++ b/kernel/src/arch/mipsel/context.rs @@ -52,6 +52,7 @@ pub struct TrapFrame { pub ra: usize, /// Reserved pub reserved: usize, + pub __padding: [usize; 2], } impl TrapFrame { @@ -135,6 +136,7 @@ struct ContextData { /// s[1] = reserved /// s[2..11] = Callee-saved registers s: [usize; 12], + __padding: [usize; 2], } impl ContextData { diff --git a/kernel/src/drivers/console/mod.rs b/kernel/src/drivers/console/mod.rs index 525f295..ef5a2e0 100644 --- a/kernel/src/drivers/console/mod.rs +++ b/kernel/src/drivers/console/mod.rs @@ -19,6 +19,7 @@ mod color; mod fonts; #[derive(Debug, Clone, Copy, PartialEq)] +#[repr(align(4))] pub struct ConsoleChar { ascii_char: u8, attr: CharacterAttribute, diff --git a/kernel/src/util/escape_parser.rs b/kernel/src/util/escape_parser.rs index 1ae6cd5..8a821b9 100644 --- a/kernel/src/util/escape_parser.rs +++ b/kernel/src/util/escape_parser.rs @@ -9,6 +9,7 @@ use heapless::Vec; #[derive(Debug, Clone, Copy, PartialEq)] +#[repr(align(4))] pub struct CharacterAttribute { /// foreground color pub foreground: ConsoleColor,