diff options
| author | Michael Brown | 2016-05-08 01:18:35 +0200 |
|---|---|---|
| committer | Michael Brown | 2016-05-08 01:18:35 +0200 |
| commit | edea3a434ccae8dc980c715949287c9ba63babf5 (patch) | |
| tree | d821d987dcf1ac0bc4f22e1363fa32c95f6bd0b2 /src/arch/arm/core | |
| parent | [arm] Avoid instruction references to symbols defined via ".equ" (diff) | |
| download | ipxe-edea3a434ccae8dc980c715949287c9ba63babf5.tar.gz ipxe-edea3a434ccae8dc980c715949287c9ba63babf5.tar.xz ipxe-edea3a434ccae8dc980c715949287c9ba63babf5.zip | |
[arm] Split out 32-bit-specific code to arch/arm32
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch/arm/core')
| -rw-r--r-- | src/arch/arm/core/arm_bigint.c | 102 | ||||
| -rw-r--r-- | src/arch/arm/core/arm_io.c | 26 | ||||
| -rw-r--r-- | src/arch/arm/core/setjmp.S | 32 |
3 files changed, 13 insertions, 147 deletions
diff --git a/src/arch/arm/core/arm_bigint.c b/src/arch/arm/core/arm_bigint.c deleted file mode 100644 index 839bead18..000000000 --- a/src/arch/arm/core/arm_bigint.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2016 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program 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 2 of the - * License, or any later version. - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); - -#include <stdint.h> -#include <string.h> -#include <ipxe/bigint.h> - -/** @file - * - * Big integer support - */ - -/** - * Multiply big integers - * - * @v multiplicand0 Element 0 of big integer to be multiplied - * @v multiplier0 Element 0 of big integer to be multiplied - * @v result0 Element 0 of big integer to hold result - * @v size Number of elements - */ -void bigint_multiply_raw ( const uint32_t *multiplicand0, - const uint32_t *multiplier0, - uint32_t *result0, unsigned int size ) { - const bigint_t ( size ) __attribute__ (( may_alias )) *multiplicand = - ( ( const void * ) multiplicand0 ); - const bigint_t ( size ) __attribute__ (( may_alias )) *multiplier = - ( ( const void * ) multiplier0 ); - bigint_t ( size * 2 ) __attribute__ (( may_alias )) *result = - ( ( void * ) result0 ); - unsigned int i; - unsigned int j; - uint32_t multiplicand_element; - uint32_t multiplier_element; - uint32_t *result_elements; - uint32_t discard_low; - uint32_t discard_high; - uint32_t discard_temp; - - /* Zero result */ - memset ( result, 0, sizeof ( *result ) ); - - /* Multiply integers one element at a time */ - for ( i = 0 ; i < size ; i++ ) { - multiplicand_element = multiplicand->element[i]; - for ( j = 0 ; j < size ; j++ ) { - multiplier_element = multiplier->element[j]; - result_elements = &result->element[ i + j ]; - /* Perform a single multiply, and add the - * resulting double-element into the result, - * carrying as necessary. The carry can - * never overflow beyond the end of the - * result, since: - * - * a < 2^{n}, b < 2^{n} => ab < 2^{2n} - */ - __asm__ __volatile__ ( "umull %1, %2, %5, %6\n\t" - "ldr %3, [%0]\n\t" - "adds %3, %1\n\t" - "stmia %0!, {%3}\n\t" - "ldr %3, [%0]\n\t" - "adcs %3, %2\n\t" - "stmia %0!, {%3}\n\t" - "bcc 2f\n\t" - "\n1:\n\t" - "ldr %3, [%0]\n\t" - "adcs %3, #0\n\t" - "stmia %0!, {%3}\n\t" - "bcs 1b\n\t" - "\n2:\n\t" - : "+l" ( result_elements ), - "=l" ( discard_low ), - "=l" ( discard_high ), - "=l" ( discard_temp ), - "+m" ( *result ) - : "l" ( multiplicand_element ), - "l" ( multiplier_element ) - : "cc" ); - } - } -} diff --git a/src/arch/arm/core/arm_io.c b/src/arch/arm/core/arm_io.c index 804014c9a..4bc47a5c6 100644 --- a/src/arch/arm/core/arm_io.c +++ b/src/arch/arm/core/arm_io.c @@ -33,7 +33,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); */ /** An ARM I/O qword */ -union arm_io_qword { +union arm32_io_qword { uint64_t qword; uint32_t dword[2]; }; @@ -44,12 +44,12 @@ union arm_io_qword { * @v io_addr I/O address * @ret data Value read * - * This is not atomic for ARM. + * This is not atomic for ARM32. */ -static uint64_t arm_readq ( volatile uint64_t *io_addr ) { - volatile union arm_io_qword *ptr = - container_of ( io_addr, union arm_io_qword, qword ); - union arm_io_qword tmp; +static uint64_t arm32_readq ( volatile uint64_t *io_addr ) { + volatile union arm32_io_qword *ptr = + container_of ( io_addr, union arm32_io_qword, qword ); + union arm32_io_qword tmp; tmp.dword[0] = readl ( &ptr->dword[0] ); tmp.dword[1] = readl ( &ptr->dword[1] ); @@ -62,12 +62,12 @@ static uint64_t arm_readq ( volatile uint64_t *io_addr ) { * @v data Value to write * @v io_addr I/O address * - * This is not atomic for ARM. + * This is not atomic for ARM32. */ -static void arm_writeq ( uint64_t data, volatile uint64_t *io_addr ) { - volatile union arm_io_qword *ptr = - container_of ( io_addr, union arm_io_qword, qword ); - union arm_io_qword tmp; +static void arm32_writeq ( uint64_t data, volatile uint64_t *io_addr ) { + volatile union arm32_io_qword *ptr = + container_of ( io_addr, union arm32_io_qword, qword ); + union arm32_io_qword tmp; tmp.qword = data; writel ( tmp.dword[0], &ptr->dword[0] ); @@ -84,5 +84,5 @@ PROVIDE_IOAPI_INLINE ( arm, writew ); PROVIDE_IOAPI_INLINE ( arm, writel ); PROVIDE_IOAPI_INLINE ( arm, iodelay ); PROVIDE_IOAPI_INLINE ( arm, mb ); -PROVIDE_IOAPI ( arm, readq, arm_readq ); -PROVIDE_IOAPI ( arm, writeq, arm_writeq ); +PROVIDE_IOAPI ( arm, readq, arm32_readq ); +PROVIDE_IOAPI ( arm, writeq, arm32_writeq ); diff --git a/src/arch/arm/core/setjmp.S b/src/arch/arm/core/setjmp.S deleted file mode 100644 index 7e7b0fe58..000000000 --- a/src/arch/arm/core/setjmp.S +++ /dev/null @@ -1,32 +0,0 @@ -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) - - .text - .arm - -/* - * Save stack context for non-local goto - */ - .globl setjmp - .type setjmp, %function -setjmp: - /* Store registers */ - stmia r0, { r4, r5, r6, r7, r8, r9, r10, fp, sp, lr } - /* Return 0 when returning as setjmp() */ - mov r0, #0 - bx lr - .size setjmp, . - setjmp - -/* - * Non-local jump to a saved stack context - */ - .globl longjmp - .type longjmp, %function -longjmp: - /* Restore registers */ - ldmia r0, { r4, r5, r6, r7, r8, r9, r10, fp, sp, lr } - /* Force result to non-zero */ - movs r0, r1 - moveq r0, #1 - /* Return to setjmp() caller */ - bx lr - .size longjmp, . - longjmp |
