fernly: Remove GPL-2 files, move to libgcc
We used to use source files taken from U-Boot to allow for division and modular arithmetic. With the move to a BSD license, this is no longer acceptible. As a workaround, use a libgcc taken from a standard gcc distribution. Add the .a file, which has not been modified in any way. Signed-off-by: Sean Cross <xobs@kosagi.com>
This commit is contained in:
parent
38011a7bdc
commit
7323c280ce
6 changed files with 18 additions and 265 deletions
5
Makefile
5
Makefile
|
@ -6,7 +6,7 @@ CFLAGS = -march=armv5te -mfloat-abi=soft -Wall \
|
||||||
AFLAGS =
|
AFLAGS =
|
||||||
|
|
||||||
LDFLAGS = --nostdlib -T fernvale.ld
|
LDFLAGS = --nostdlib -T fernvale.ld
|
||||||
LIBS =
|
LIBS = lib/libgcc-armv5.a
|
||||||
|
|
||||||
SRC_C = \
|
SRC_C = \
|
||||||
bionic.c \
|
bionic.c \
|
||||||
|
@ -38,9 +38,6 @@ SRC_S = \
|
||||||
scriptic/spi.S \
|
scriptic/spi.S \
|
||||||
scriptic/spi-blockmode.S \
|
scriptic/spi-blockmode.S \
|
||||||
scriptic/keypad.S \
|
scriptic/keypad.S \
|
||||||
_lshrdi3.S \
|
|
||||||
_udivsi3.S \
|
|
||||||
_divsi3.S \
|
|
||||||
start.S
|
start.S
|
||||||
|
|
||||||
OBJ = $(addprefix $(BUILD)/, $(SRC_S:.S=.o) $(SRC_C:.c=.o))
|
OBJ = $(addprefix $(BUILD)/, $(SRC_S:.S=.o) $(SRC_C:.c=.o))
|
||||||
|
|
17
README.md
17
README.md
|
@ -92,6 +92,23 @@ That is, send the following packet:
|
||||||
| 00 00 |
|
| 00 00 |
|
||||||
|
|
||||||
|
|
||||||
|
Licensing
|
||||||
|
---------
|
||||||
|
|
||||||
|
Fernly is licensed under the BSD 2-clause license (see LICENSE).
|
||||||
|
|
||||||
|
Previous versions of fernly linked against division libraries taken from U-Boot,
|
||||||
|
which were licensed under GPL-2. These files have been removed.
|
||||||
|
|
||||||
|
Instead, we supply a version of libgcc.a. This file was extracted from a
|
||||||
|
standard gcc toolchain, specifically:
|
||||||
|
|
||||||
|
https://code.google.com/p/yus-repo/downloads/detail?name=arm-none-eabi-4.6-armv5.tar.gz
|
||||||
|
|
||||||
|
It has not been modified, and its distribution here should be covered under
|
||||||
|
the "runtime exception".
|
||||||
|
|
||||||
|
|
||||||
Memory Map
|
Memory Map
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
|
142
_divsi3.S
142
_divsi3.S
|
@ -1,142 +0,0 @@
|
||||||
|
|
||||||
.macro ARM_DIV_BODY dividend, divisor, result, curbit
|
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 5
|
|
||||||
|
|
||||||
clz \curbit, \divisor
|
|
||||||
clz \result, \dividend
|
|
||||||
sub \result, \curbit, \result
|
|
||||||
mov \curbit, #1
|
|
||||||
mov \divisor, \divisor, lsl \result
|
|
||||||
mov \curbit, \curbit, lsl \result
|
|
||||||
mov \result, #0
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
@ Initially shift the divisor left 3 bits if possible,
|
|
||||||
@ set curbit accordingly. This allows for curbit to be located
|
|
||||||
@ at the left end of each 4 bit nibbles in the division loop
|
|
||||||
@ to save one loop in most cases.
|
|
||||||
tst \divisor, #0xe0000000
|
|
||||||
moveq \divisor, \divisor, lsl #3
|
|
||||||
moveq \curbit, #8
|
|
||||||
movne \curbit, #1
|
|
||||||
|
|
||||||
@ Unless the divisor is very big, shift it up in multiples of
|
|
||||||
@ four bits, since this is the amount of unwinding in the main
|
|
||||||
@ division loop. Continue shifting until the divisor is
|
|
||||||
@ larger than the dividend.
|
|
||||||
1: cmp \divisor, #0x10000000
|
|
||||||
cmplo \divisor, \dividend
|
|
||||||
movlo \divisor, \divisor, lsl #4
|
|
||||||
movlo \curbit, \curbit, lsl #4
|
|
||||||
blo 1b
|
|
||||||
|
|
||||||
@ For very big divisors, we must shift it a bit at a time, or
|
|
||||||
@ we will be in danger of overflowing.
|
|
||||||
1: cmp \divisor, #0x80000000
|
|
||||||
cmplo \divisor, \dividend
|
|
||||||
movlo \divisor, \divisor, lsl #1
|
|
||||||
movlo \curbit, \curbit, lsl #1
|
|
||||||
blo 1b
|
|
||||||
|
|
||||||
mov \result, #0
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@ Division loop
|
|
||||||
1: cmp \dividend, \divisor
|
|
||||||
subhs \dividend, \dividend, \divisor
|
|
||||||
orrhs \result, \result, \curbit
|
|
||||||
cmp \dividend, \divisor, lsr #1
|
|
||||||
subhs \dividend, \dividend, \divisor, lsr #1
|
|
||||||
orrhs \result, \result, \curbit, lsr #1
|
|
||||||
cmp \dividend, \divisor, lsr #2
|
|
||||||
subhs \dividend, \dividend, \divisor, lsr #2
|
|
||||||
orrhs \result, \result, \curbit, lsr #2
|
|
||||||
cmp \dividend, \divisor, lsr #3
|
|
||||||
subhs \dividend, \dividend, \divisor, lsr #3
|
|
||||||
orrhs \result, \result, \curbit, lsr #3
|
|
||||||
cmp \dividend, #0 @ Early termination?
|
|
||||||
movnes \curbit, \curbit, lsr #4 @ No, any more bits to do?
|
|
||||||
movne \divisor, \divisor, lsr #4
|
|
||||||
bne 1b
|
|
||||||
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro ARM_DIV2_ORDER divisor, order
|
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 5
|
|
||||||
|
|
||||||
clz \order, \divisor
|
|
||||||
rsb \order, \order, #31
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
cmp \divisor, #(1 << 16)
|
|
||||||
movhs \divisor, \divisor, lsr #16
|
|
||||||
movhs \order, #16
|
|
||||||
movlo \order, #0
|
|
||||||
|
|
||||||
cmp \divisor, #(1 << 8)
|
|
||||||
movhs \divisor, \divisor, lsr #8
|
|
||||||
addhs \order, \order, #8
|
|
||||||
|
|
||||||
cmp \divisor, #(1 << 4)
|
|
||||||
movhs \divisor, \divisor, lsr #4
|
|
||||||
addhs \order, \order, #4
|
|
||||||
|
|
||||||
cmp \divisor, #(1 << 2)
|
|
||||||
addhi \order, \order, #3
|
|
||||||
addls \order, \order, \divisor, lsr #1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.align 5
|
|
||||||
.globl __divsi3
|
|
||||||
.globl __aeabi_idiv
|
|
||||||
__divsi3:
|
|
||||||
__aeabi_idiv:
|
|
||||||
cmp r1, #0
|
|
||||||
eor ip, r0, r1 @ save the sign of the result.
|
|
||||||
beq Ldiv0
|
|
||||||
rsbmi r1, r1, #0 @ loops below use unsigned.
|
|
||||||
subs r2, r1, #1 @ division by 1 or -1 ?
|
|
||||||
beq 10f
|
|
||||||
movs r3, r0
|
|
||||||
rsbmi r3, r0, #0 @ positive dividend value
|
|
||||||
cmp r3, r1
|
|
||||||
bls 11f
|
|
||||||
tst r1, r2 @ divisor is power of 2 ?
|
|
||||||
beq 12f
|
|
||||||
|
|
||||||
ARM_DIV_BODY r3, r1, r0, r2
|
|
||||||
|
|
||||||
cmp ip, #0
|
|
||||||
rsbmi r0, r0, #0
|
|
||||||
mov pc, lr
|
|
||||||
|
|
||||||
10: teq ip, r0 @ same sign ?
|
|
||||||
rsbmi r0, r0, #0
|
|
||||||
mov pc, lr
|
|
||||||
|
|
||||||
11: movlo r0, #0
|
|
||||||
moveq r0, ip, asr #31
|
|
||||||
orreq r0, r0, #1
|
|
||||||
mov pc, lr
|
|
||||||
|
|
||||||
12: ARM_DIV2_ORDER r1, r2
|
|
||||||
|
|
||||||
cmp ip, #0
|
|
||||||
mov r0, r3, lsr r2
|
|
||||||
rsbmi r0, r0, #0
|
|
||||||
mov pc, lr
|
|
||||||
|
|
||||||
Ldiv0:
|
|
||||||
|
|
||||||
str lr, [sp, #-4]!
|
|
||||||
bl __div0
|
|
||||||
mov r0, #0 @ About as wrong as it could be.
|
|
||||||
ldr pc, [sp], #4
|
|
26
_lshrdi3.S
26
_lshrdi3.S
|
@ -1,26 +0,0 @@
|
||||||
/* Copyright 1995, 1996, 1998, 1999, 2000, 2003, 2004, 2005
|
|
||||||
Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
|
||||||
#define al r1
|
|
||||||
#define ah r0
|
|
||||||
#else
|
|
||||||
#define al r0
|
|
||||||
#define ah r1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.globl __lshrdi3
|
|
||||||
.globl __aeabi_llsr
|
|
||||||
__lshrdi3:
|
|
||||||
__aeabi_llsr:
|
|
||||||
|
|
||||||
subs r3, r2, #32
|
|
||||||
rsb ip, r2, #32
|
|
||||||
movmi al, al, lsr r2
|
|
||||||
movpl al, ah, lsr r3
|
|
||||||
orrmi al, al, ah, lsl ip
|
|
||||||
mov ah, ah, lsr r2
|
|
||||||
mov pc, lr
|
|
93
_udivsi3.S
93
_udivsi3.S
|
@ -1,93 +0,0 @@
|
||||||
/* # 1 "libgcc1.S" */
|
|
||||||
@ libgcc1 routines for ARM cpu.
|
|
||||||
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
|
||||||
dividend .req r0
|
|
||||||
divisor .req r1
|
|
||||||
result .req r2
|
|
||||||
curbit .req r3
|
|
||||||
/* ip .req r12 */
|
|
||||||
/* sp .req r13 */
|
|
||||||
/* lr .req r14 */
|
|
||||||
/* pc .req r15 */
|
|
||||||
.text
|
|
||||||
.globl __udivsi3
|
|
||||||
.type __udivsi3 ,function
|
|
||||||
.globl __aeabi_uidiv
|
|
||||||
.type __aeabi_uidiv ,function
|
|
||||||
.align 0
|
|
||||||
__udivsi3:
|
|
||||||
__aeabi_uidiv:
|
|
||||||
cmp divisor, #0
|
|
||||||
beq Ldiv0
|
|
||||||
mov curbit, #1
|
|
||||||
mov result, #0
|
|
||||||
cmp dividend, divisor
|
|
||||||
bcc Lgot_result
|
|
||||||
Loop1:
|
|
||||||
@ Unless the divisor is very big, shift it up in multiples of
|
|
||||||
@ four bits, since this is the amount of unwinding in the main
|
|
||||||
@ division loop. Continue shifting until the divisor is
|
|
||||||
@ larger than the dividend.
|
|
||||||
cmp divisor, #0x10000000
|
|
||||||
cmpcc divisor, dividend
|
|
||||||
movcc divisor, divisor, lsl #4
|
|
||||||
movcc curbit, curbit, lsl #4
|
|
||||||
bcc Loop1
|
|
||||||
Lbignum:
|
|
||||||
@ For very big divisors, we must shift it a bit at a time, or
|
|
||||||
@ we will be in danger of overflowing.
|
|
||||||
cmp divisor, #0x80000000
|
|
||||||
cmpcc divisor, dividend
|
|
||||||
movcc divisor, divisor, lsl #1
|
|
||||||
movcc curbit, curbit, lsl #1
|
|
||||||
bcc Lbignum
|
|
||||||
Loop3:
|
|
||||||
@ Test for possible subtractions, and note which bits
|
|
||||||
@ are done in the result. On the final pass, this may subtract
|
|
||||||
@ too much from the dividend, but the result will be ok, since the
|
|
||||||
@ "bit" will have been shifted out at the bottom.
|
|
||||||
cmp dividend, divisor
|
|
||||||
subcs dividend, dividend, divisor
|
|
||||||
orrcs result, result, curbit
|
|
||||||
cmp dividend, divisor, lsr #1
|
|
||||||
subcs dividend, dividend, divisor, lsr #1
|
|
||||||
orrcs result, result, curbit, lsr #1
|
|
||||||
cmp dividend, divisor, lsr #2
|
|
||||||
subcs dividend, dividend, divisor, lsr #2
|
|
||||||
orrcs result, result, curbit, lsr #2
|
|
||||||
cmp dividend, divisor, lsr #3
|
|
||||||
subcs dividend, dividend, divisor, lsr #3
|
|
||||||
orrcs result, result, curbit, lsr #3
|
|
||||||
cmp dividend, #0 @ Early termination?
|
|
||||||
movnes curbit, curbit, lsr #4 @ No, any more bits to do?
|
|
||||||
movne divisor, divisor, lsr #4
|
|
||||||
bne Loop3
|
|
||||||
Lgot_result:
|
|
||||||
mov r0, result
|
|
||||||
mov pc, lr
|
|
||||||
Ldiv0:
|
|
||||||
str lr, [sp, #-4]!
|
|
||||||
bl __div0 (PLT)
|
|
||||||
mov r0, #0 @ about as wrong as it could be
|
|
||||||
ldmia sp!, {pc}
|
|
||||||
.size __udivsi3 , . - __udivsi3
|
|
||||||
|
|
||||||
.globl __aeabi_uidivmod
|
|
||||||
__aeabi_uidivmod:
|
|
||||||
|
|
||||||
stmfd sp!, {r0, r1, ip, lr}
|
|
||||||
bl __aeabi_uidiv
|
|
||||||
ldmfd sp!, {r1, r2, ip, lr}
|
|
||||||
mul r3, r0, r2
|
|
||||||
sub r1, r1, r3
|
|
||||||
mov pc, lr
|
|
||||||
|
|
||||||
.globl __aeabi_idivmod
|
|
||||||
__aeabi_idivmod:
|
|
||||||
|
|
||||||
stmfd sp!, {r0, r1, ip, lr}
|
|
||||||
bl __aeabi_idiv
|
|
||||||
ldmfd sp!, {r1, r2, ip, lr}
|
|
||||||
mul r3, r0, r2
|
|
||||||
sub r1, r1, r3
|
|
||||||
mov pc, lr
|
|
BIN
lib/libgcc-armv5.a
Normal file
BIN
lib/libgcc-armv5.a
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue