[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 4/9] RISC-V: Add setjmp implementation
From: |
Alistair Francis |
Subject: |
Re: [PATCH 4/9] RISC-V: Add setjmp implementation |
Date: |
Thu, 8 Nov 2018 23:07:55 +0000 |
On Tue, 2018-11-06 at 18:58 +0100, Alexander Graf wrote:
> This patch adds a 32/64 capable setjmp implementation for RISC-V.
>
> Signed-off-by: Alexander Graf <address@hidden>
Reviewed-by: Alistair Francis <address@hidden>
Alistair
> ---
> grub-core/lib/riscv/setjmp.S | 82
> +++++++++++++++++++++++++++++++++++++++++++
> include/grub/riscv32/setjmp.h | 27 ++++++++++++++
> include/grub/riscv64/setjmp.h | 27 ++++++++++++++
> 3 files changed, 136 insertions(+)
> create mode 100644 grub-core/lib/riscv/setjmp.S
> create mode 100644 include/grub/riscv32/setjmp.h
> create mode 100644 include/grub/riscv64/setjmp.h
>
> diff --git a/grub-core/lib/riscv/setjmp.S b/grub-
> core/lib/riscv/setjmp.S
> new file mode 100644
> index 000000000..053e2e6ba
> --- /dev/null
> +++ b/grub-core/lib/riscv/setjmp.S
> @@ -0,0 +1,82 @@
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2013 Free Software Foundation, Inc.
> + *
> + * GRUB is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as
> published by
> + * the Free Software Foundation, either version 3 of the License,
> or
> + * (at your option) any later version.
> + *
> + * GRUB is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public
> License
> + * along with GRUB. If not, see <http://www.gnu.org/licenses/>;.
> + */
> +
> +#include <grub/symbol.h>
> +#include <grub/dl.h>
> +
> + .file "setjmp.S"
> +GRUB_MOD_LICENSE "GPLv3+"
> + .text
> +
> +#if __riscv_xlen == 64
> +#define STORE_IDX(reg, idx) sd reg, (idx*8)(a0)
> +#define LOAD_IDX(reg, idx) ld reg, (idx*8)(a0)
> +#else
> +#define STORE_IDX(reg, idx) sw reg, (idx*4)(a0)
> +#define LOAD_IDX(reg, idx) lw reg, (idx*4)(a0)
> +#endif
> +
> +/*
> + * int grub_setjmp (grub_jmp_buf env)
> + */
> +FUNCTION(grub_setjmp)
> + /* Preserve all callee-saved registers and the SP */
> + STORE_IDX(s0, 0)
> + STORE_IDX(s1, 1)
> + STORE_IDX(s2, 2)
> + STORE_IDX(s3, 3)
> + STORE_IDX(s4, 4)
> + STORE_IDX(s5, 5)
> + STORE_IDX(s6, 6)
> + STORE_IDX(s7, 7)
> + STORE_IDX(s8, 8)
> + STORE_IDX(s9, 9)
> + STORE_IDX(s10, 10)
> + STORE_IDX(s11, 11)
> + STORE_IDX(ra, 12)
> + STORE_IDX(sp, 13)
> + li a0, 0
> + ret
> +
> +/*
> + * int grub_longjmp (grub_jmp_buf env, int val)
> + */
> +FUNCTION(grub_longjmp)
> + LOAD_IDX(s0, 0)
> + LOAD_IDX(s1, 1)
> + LOAD_IDX(s2, 2)
> + LOAD_IDX(s3, 3)
> + LOAD_IDX(s4, 4)
> + LOAD_IDX(s5, 5)
> + LOAD_IDX(s6, 6)
> + LOAD_IDX(s7, 7)
> + LOAD_IDX(s8, 8)
> + LOAD_IDX(s9, 9)
> + LOAD_IDX(s10, 10)
> + LOAD_IDX(s11, 11)
> + LOAD_IDX(ra, 12)
> + LOAD_IDX(sp, 13)
> +
> + /* Move the return value in place, but return 1 if passed 0.
> */
> + beq a1, zero, longjmp_1
> + mv a0, a1
> + ret
> +
> + longjmp_1:
> + li a0, 1
> + ret
> diff --git a/include/grub/riscv32/setjmp.h
> b/include/grub/riscv32/setjmp.h
> new file mode 100644
> index 000000000..7a0ed0548
> --- /dev/null
> +++ b/include/grub/riscv32/setjmp.h
> @@ -0,0 +1,27 @@
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2013 Free Software Foundation, Inc.
> + *
> + * GRUB is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as
> published by
> + * the Free Software Foundation, either version 3 of the License,
> or
> + * (at your option) any later version.
> + *
> + * GRUB is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public
> License
> + * along with GRUB. If not, see <http://www.gnu.org/licenses/>;.
> + */
> +
> +#ifndef GRUB_SETJMP_CPU_HEADER
> +#define GRUB_SETJMP_CPU_HEADER 1
> +
> +typedef unsigned long long grub_jmp_buf[14];
> +
> +int grub_setjmp (grub_jmp_buf env) RETURNS_TWICE;
> +void grub_longjmp (grub_jmp_buf env, int val) __attribute__
> ((noreturn));
> +
> +#endif /* ! GRUB_SETJMP_CPU_HEADER */
> diff --git a/include/grub/riscv64/setjmp.h
> b/include/grub/riscv64/setjmp.h
> new file mode 100644
> index 000000000..7a0ed0548
> --- /dev/null
> +++ b/include/grub/riscv64/setjmp.h
> @@ -0,0 +1,27 @@
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2013 Free Software Foundation, Inc.
> + *
> + * GRUB is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as
> published by
> + * the Free Software Foundation, either version 3 of the License,
> or
> + * (at your option) any later version.
> + *
> + * GRUB is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public
> License
> + * along with GRUB. If not, see <http://www.gnu.org/licenses/>;.
> + */
> +
> +#ifndef GRUB_SETJMP_CPU_HEADER
> +#define GRUB_SETJMP_CPU_HEADER 1
> +
> +typedef unsigned long long grub_jmp_buf[14];
> +
> +int grub_setjmp (grub_jmp_buf env) RETURNS_TWICE;
> +void grub_longjmp (grub_jmp_buf env, int val) __attribute__
> ((noreturn));
> +
> +#endif /* ! GRUB_SETJMP_CPU_HEADER */
- [PATCH 0/9] Add RISC-V support, Alexander Graf, 2018/11/06
- [PATCH 7/9] RISC-V: Add awareness for RISC-V reloations, Alexander Graf, 2018/11/06
- [PATCH 2/9] PE: Add RISC-V definitions, Alexander Graf, 2018/11/06
- [PATCH 4/9] RISC-V: Add setjmp implementation, Alexander Graf, 2018/11/06
- Re: [PATCH 4/9] RISC-V: Add setjmp implementation,
Alistair Francis <=
- [PATCH 8/9] RISC-V: Add auxiliary files, Alexander Graf, 2018/11/06
- [PATCH 1/9] efi: Rename armxx to arch, Alexander Graf, 2018/11/06
- [PATCH 9/9] RISC-V: Add to build system, Alexander Graf, 2018/11/06
- [PATCH 6/9] RISC-V: Add Linux load logic, Alexander Graf, 2018/11/06
- [PATCH 3/9] elf.h: Add RISC-V definitions, Alexander Graf, 2018/11/06
- [PATCH 5/9] RISC-V: Add early startup code, Alexander Graf, 2018/11/06