diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-15 13:49:15 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-15 13:49:15 -0500 |
| commit | b293fca43be544483b6488d33ad4b3ed55881064 (patch) | |
| tree | bf9f51967cd3a9fae3a8c1254b715b9c31aa56a6 /lib | |
| parent | 0ef76878cfcf4d6b64972b283021f576a95d9216 (diff) | |
| parent | fbe934d69eb7ed22b59514e9c1fe8871b8b198ec (diff) | |
Merge tag 'riscv-for-linus-4.15-arch-v9-premerge' of git://git.kernel.org/pub/scm/linux/kernel/git/palmer/linux
Pull RISC-V architecture support from Palmer Dabbelt:
"This contains the core RISC-V Linux port, which has been through nine
rounds of review on various mailing lists. The port is not complete:
there's some cleanup patches moving through the review process, a
whole bunch of drivers that need some work, and a lot of feature
additions that will be needed.
The patches contained in this tag have been through nine rounds of
review on the various mailing lists. I have some outstanding cleanup
patches, but since there's been so much review on these patches I
thought it would be best to submit them as-is and then submit explicit
cleanup patches so everyone can review them. This first patch set is
big enough that it's a bit of a pain to constantly rewrite, and it's
caused a few headaches with various contributors.
The port is definately a work in progress. While what's there builds
and boots with 4.14, it's a bit hard to actually see anything happen
because there are no device drivers yet. I maintain a staging branch
that contains all the device drivers and cleanup that actually works,
but those patches won't all be ready for a while. I'd like to get what
we currently have into your tree so everyone can start working from a
single base -- of particular importance is allowing the glibc
upstreaming process to proceed so we can sort out any possibly
lingering user-visible ABI problems we might have.
Copied below is the ChangeLog that contains the history of this patch
set:
(v9) As per suggestions on our v8 patch set, I've split the core
architecture code out from our drivers and would like to submit
this patch set to be included into linux-next, with the goal
being to be merged in during the next merge window. This patch
set is based on 4.14-rc2, but if it's better to have it based on
something else then I can change it around.
This patch set contains just the core arch code for RISC-V, so
while it builds an nominally boots, you can't print or take an
interrupt so it's not that useful. If you're looking to actually
boot a system it would probably be better to use the full patch
set listed below.
We've collected a handful of tags from reviewers, and the
remainder of the patch set only got minimal feedback last time.
Here's what changed:
- We now use the device tree to initialize the timer driver so
it's less tighly coupled with the arch port.
- I cleaned up the defconfigs -- there's actually now just one,
and it's empty. For now I think we're OK with what the kernel
sets as defaults, but I anticipate we'll begin to expand this
as people start to use the port more.
- The VDSO symbols version is sane.
- We WFI while spinning in the boot loop.
- A handful of comments have been added.
While there are still a handful of FIXMEs in this patch set,
we've started to get enough interest from various users and
contributors that maintaining an out of tree patch set is
starting to become a big burden. Hopefully the patches are good
enough to merge now, which will at least get everyone working in
a more reasonable manner as we clean up the remaining issues.
(v8) I know it may not be the ideal time to submit a patch set right
now, as it's the middle of the merge window, but things have
calmed down quite a bit in the last month so I thought it would
be good to get everyone on the same page. There's been a handful
of changes since the last patch set, but most of them are fairly
minor:
- We changed PAGE_OFFSET to allowing mapping more physical
memory on 64-bit systems. This is user configurable, as it
triggers a different code model that generates slightly less
efficient code.
- The device tree binding documentation is back, I'd managed to
lose it at some point.
- We now pass the atomic64 test suite
- The SBI timer driver has been refactored.
(v7) It's been a while since my last patch set, but the changes han
been fairly minimal:
- The PCI cleanup patches have been dropped, we'll do them as a
separate patch set later.
- We've the Kconfig entries from CONFIG_ISA_* to
CONFIG_RISCV_ISA_*, to make grep easier.
- There have been a handful of memory model related tweaks in
I/O land, particularly relating the PCI and the upcoming
platform specification. There are significant comments in the
relevant files. This is still a WIP, but I think we're close
to getting as good as we're going to get until we end up with
some more specifications.
(v6) As it's been only a day since the v5 patch set, the changes are
pretty minimal:
- The patch set is now based on linux-next/master, which I
believe is a better base now that we're getting closer to
upstream.
- EARLY_PRINTK is no longer an option. Since the SBI console is
reasonable, there's no penalty to enabling it (and thus no
benefit to disabling it).
- The mmap syscalls were refactored a bit.
(v5) Things have really started to calm down, so this is fairly
similar to the v4 patch set. The most interesting changes
include:
- We've moved back to a single patch set.
- SMP support has been fixed, I was accidentally running on a
non-SMP configuration. There were various mistakes all over
the tree as a result of this.
- The cmpxchg syscalls have been removed, as they were deemed a
bad idea. As a result, RISC-V Linux systems mandate the A
extension. The corresponding Kconfig entry to enable builds
on non-A systems has been removed.
- A few more atomic fixes: mostly fence changes, but those
resulted in a handful of additional macros that were no
longer necessary.
- riscv_early_sie has been removed.
(v4) There have only been a few changes since the v3 patch set:
- The cmpxchg64 syscall is no longer enabled on 32-bit systems.
It's not possible to provide this on SMP systems, and it's
not necessary as glibc knows not to call it.
- We provide a ELF_HWCAP so users can determine the ISA of the
machine the kernel is running on.
- The multi-line comments are in a better form.
- There were a handful of headers that could be replaced with
the asm-generic versions, and a few unnecessary definitions.
- We no longer use printk, but instead use pr_*.
- A few Kconfig and defconfig entries have been cleaned up.
(v3) A highlight of the changes since the v2 patch set includes:
- We've split out all our drivers into separate patch sets,
which I've already sent out to the relevant maintainers. I
haven't included those patches in this patch set, but some of
them are necessary to build our port.
- The patch set is now split up differently: rather than being
split per directory it is split per topic. Hopefully this
will make it easier to review the port on the mailing list.
The split is a bit rough, so you probably still want to look
at the patch set as a whole.
- atomic.h has been completely rewritten and is hopefully now
correct. I've attempted to sanitize the various other memory
model related code as well, and I think it should all be sane
now aside from a handful of FIXMEs commented in the code.
- We've changed the cmpexchg syscall to always exist and to not
be multiplexed. There is also a VDSO entry for compare and
exchange, which allows kernels with the A extension to
execute user code without the A extension reasonably fast.
- Our user-visible register state now contains enough space for
the Q extension for 128-bit floating point, as well as a few
words to allow extensibility to future ISA extensions like
the eventual V extension for vectors.
- A handful of driver cleanups, but these have been split into
separate patch sets now so I won't duplicate them here.
(v2) A highlight of the changes since the v1 patch set includes:
- We've split out our drivers into the right places, which
means now there's a lot more patches. I'll be submitting
these patches to various subsystem maintainers and including
them in any future RISC-V patch sets until they've been
merged.
- The SBI console driver has been completely rewritten to use
the HVC helpers and is now significantly smaller.
- We've begun to use weaker barriers as opposed to just the big
"fence". There's still some work to do here, specifically:
- We need fences in the relaxed MMIO functions.
- The non-relaxed MMIO functions are missing R/W bits on their fences.
- Many AMOs need the aq and rl bits set.
- We now have thread_info in task_struct. As a result, sscratch
now contains TP instead of SP. This was necessary because
thread_info is no longer on the stack.
- A few shared routines have been added that we use instead of
creating another arch copy"
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
* tag 'riscv-for-linus-4.15-arch-v9-premerge' of git://git.kernel.org/pub/scm/linux/kernel/git/palmer/linux:
RISC-V: Build Infrastructure
RISC-V: User-facing API
RISC-V: Paging and MMU
RISC-V: Device, timer, IRQs, and the SBI
RISC-V: Task implementation
RISC-V: ELF and module implementation
RISC-V: Generic library routines and assembly
RISC-V: Atomic and Locking Code
RISC-V: Init and Halt Code
dt-bindings: RISC-V CPU Bindings
lib: Add shared copies of some GCC library routines
MAINTAINERS: Add RISC-V
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Kconfig | 18 | ||||
| -rw-r--r-- | lib/Makefile | 8 | ||||
| -rw-r--r-- | lib/ashldi3.c | 44 | ||||
| -rw-r--r-- | lib/ashrdi3.c | 46 | ||||
| -rw-r--r-- | lib/cmpdi2.c | 42 | ||||
| -rw-r--r-- | lib/lshrdi3.c | 45 | ||||
| -rw-r--r-- | lib/muldi3.c | 72 | ||||
| -rw-r--r-- | lib/ucmpdi2.c | 35 |
8 files changed, 310 insertions, 0 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index b1445b22a6de..a2b6745324ab 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
| @@ -587,3 +587,21 @@ config STRING_SELFTEST | |||
| 587 | bool "Test string functions" | 587 | bool "Test string functions" |
| 588 | 588 | ||
| 589 | endmenu | 589 | endmenu |
| 590 | |||
| 591 | config GENERIC_ASHLDI3 | ||
| 592 | bool | ||
| 593 | |||
| 594 | config GENERIC_ASHRDI3 | ||
| 595 | bool | ||
| 596 | |||
| 597 | config GENERIC_LSHRDI3 | ||
| 598 | bool | ||
| 599 | |||
| 600 | config GENERIC_MULDI3 | ||
| 601 | bool | ||
| 602 | |||
| 603 | config GENERIC_CMPDI2 | ||
| 604 | bool | ||
| 605 | |||
| 606 | config GENERIC_UCMPDI2 | ||
| 607 | bool | ||
diff --git a/lib/Makefile b/lib/Makefile index b8f2c16fccaa..136a0b254564 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
| @@ -248,3 +248,11 @@ UBSAN_SANITIZE_ubsan.o := n | |||
| 248 | obj-$(CONFIG_SBITMAP) += sbitmap.o | 248 | obj-$(CONFIG_SBITMAP) += sbitmap.o |
| 249 | 249 | ||
| 250 | obj-$(CONFIG_PARMAN) += parman.o | 250 | obj-$(CONFIG_PARMAN) += parman.o |
| 251 | |||
| 252 | # GCC library routines | ||
| 253 | obj-$(CONFIG_GENERIC_ASHLDI3) += ashldi3.o | ||
| 254 | obj-$(CONFIG_GENERIC_ASHRDI3) += ashrdi3.o | ||
| 255 | obj-$(CONFIG_GENERIC_LSHRDI3) += lshrdi3.o | ||
| 256 | obj-$(CONFIG_GENERIC_MULDI3) += muldi3.o | ||
| 257 | obj-$(CONFIG_GENERIC_CMPDI2) += cmpdi2.o | ||
| 258 | obj-$(CONFIG_GENERIC_UCMPDI2) += ucmpdi2.o | ||
diff --git a/lib/ashldi3.c b/lib/ashldi3.c new file mode 100644 index 000000000000..1b6087db95a5 --- /dev/null +++ b/lib/ashldi3.c | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License as published by | ||
| 4 | * the Free Software Foundation; either version 2 of the License, or | ||
| 5 | * (at your option) any later version. | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, see the file COPYING, or write | ||
| 14 | * to the Free Software Foundation, Inc. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/export.h> | ||
| 18 | |||
| 19 | #include <lib/libgcc.h> | ||
| 20 | |||
| 21 | long long notrace __ashldi3(long long u, word_type b) | ||
| 22 | { | ||
| 23 | DWunion uu, w; | ||
| 24 | word_type bm; | ||
| 25 | |||
| 26 | if (b == 0) | ||
| 27 | return u; | ||
| 28 | |||
| 29 | uu.ll = u; | ||
| 30 | bm = 32 - b; | ||
| 31 | |||
| 32 | if (bm <= 0) { | ||
| 33 | w.s.low = 0; | ||
| 34 | w.s.high = (unsigned int) uu.s.low << -bm; | ||
| 35 | } else { | ||
| 36 | const unsigned int carries = (unsigned int) uu.s.low >> bm; | ||
| 37 | |||
| 38 | w.s.low = (unsigned int) uu.s.low << b; | ||
| 39 | w.s.high = ((unsigned int) uu.s.high << b) | carries; | ||
| 40 | } | ||
| 41 | |||
| 42 | return w.ll; | ||
| 43 | } | ||
| 44 | EXPORT_SYMBOL(__ashldi3); | ||
diff --git a/lib/ashrdi3.c b/lib/ashrdi3.c new file mode 100644 index 000000000000..2e67c97ac65a --- /dev/null +++ b/lib/ashrdi3.c | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License as published by | ||
| 4 | * the Free Software Foundation; either version 2 of the License, or | ||
| 5 | * (at your option) any later version. | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, see the file COPYING, or write | ||
| 14 | * to the Free Software Foundation, Inc. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/export.h> | ||
| 18 | |||
| 19 | #include <lib/libgcc.h> | ||
| 20 | |||
| 21 | long long notrace __ashrdi3(long long u, word_type b) | ||
| 22 | { | ||
| 23 | DWunion uu, w; | ||
| 24 | word_type bm; | ||
| 25 | |||
| 26 | if (b == 0) | ||
| 27 | return u; | ||
| 28 | |||
| 29 | uu.ll = u; | ||
| 30 | bm = 32 - b; | ||
| 31 | |||
| 32 | if (bm <= 0) { | ||
| 33 | /* w.s.high = 1..1 or 0..0 */ | ||
| 34 | w.s.high = | ||
| 35 | uu.s.high >> 31; | ||
| 36 | w.s.low = uu.s.high >> -bm; | ||
| 37 | } else { | ||
| 38 | const unsigned int carries = (unsigned int) uu.s.high << bm; | ||
| 39 | |||
| 40 | w.s.high = uu.s.high >> b; | ||
| 41 | w.s.low = ((unsigned int) uu.s.low >> b) | carries; | ||
| 42 | } | ||
| 43 | |||
| 44 | return w.ll; | ||
| 45 | } | ||
| 46 | EXPORT_SYMBOL(__ashrdi3); | ||
diff --git a/lib/cmpdi2.c b/lib/cmpdi2.c new file mode 100644 index 000000000000..6d7ebf6c2b86 --- /dev/null +++ b/lib/cmpdi2.c | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License as published by | ||
| 4 | * the Free Software Foundation; either version 2 of the License, or | ||
| 5 | * (at your option) any later version. | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, see the file COPYING, or write | ||
| 14 | * to the Free Software Foundation, Inc. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/export.h> | ||
| 18 | |||
| 19 | #include <lib/libgcc.h> | ||
| 20 | |||
| 21 | word_type notrace __cmpdi2(long long a, long long b) | ||
| 22 | { | ||
| 23 | const DWunion au = { | ||
| 24 | .ll = a | ||
| 25 | }; | ||
| 26 | const DWunion bu = { | ||
| 27 | .ll = b | ||
| 28 | }; | ||
| 29 | |||
| 30 | if (au.s.high < bu.s.high) | ||
| 31 | return 0; | ||
| 32 | else if (au.s.high > bu.s.high) | ||
| 33 | return 2; | ||
| 34 | |||
| 35 | if ((unsigned int) au.s.low < (unsigned int) bu.s.low) | ||
| 36 | return 0; | ||
| 37 | else if ((unsigned int) au.s.low > (unsigned int) bu.s.low) | ||
| 38 | return 2; | ||
| 39 | |||
| 40 | return 1; | ||
| 41 | } | ||
| 42 | EXPORT_SYMBOL(__cmpdi2); | ||
diff --git a/lib/lshrdi3.c b/lib/lshrdi3.c new file mode 100644 index 000000000000..8e845f4bb65f --- /dev/null +++ b/lib/lshrdi3.c | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | /* | ||
| 2 | * lib/lshrdi3.c | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, see the file COPYING, or write | ||
| 16 | * to the Free Software Foundation, Inc. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include <linux/module.h> | ||
| 20 | #include <lib/libgcc.h> | ||
| 21 | |||
| 22 | long long notrace __lshrdi3(long long u, word_type b) | ||
| 23 | { | ||
| 24 | DWunion uu, w; | ||
| 25 | word_type bm; | ||
| 26 | |||
| 27 | if (b == 0) | ||
| 28 | return u; | ||
| 29 | |||
| 30 | uu.ll = u; | ||
| 31 | bm = 32 - b; | ||
| 32 | |||
| 33 | if (bm <= 0) { | ||
| 34 | w.s.high = 0; | ||
| 35 | w.s.low = (unsigned int) uu.s.high >> -bm; | ||
| 36 | } else { | ||
| 37 | const unsigned int carries = (unsigned int) uu.s.high << bm; | ||
| 38 | |||
| 39 | w.s.high = (unsigned int) uu.s.high >> b; | ||
| 40 | w.s.low = ((unsigned int) uu.s.low >> b) | carries; | ||
| 41 | } | ||
| 42 | |||
| 43 | return w.ll; | ||
| 44 | } | ||
| 45 | EXPORT_SYMBOL(__lshrdi3); | ||
diff --git a/lib/muldi3.c b/lib/muldi3.c new file mode 100644 index 000000000000..88938543e10a --- /dev/null +++ b/lib/muldi3.c | |||
| @@ -0,0 +1,72 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License as published by | ||
| 4 | * the Free Software Foundation; either version 2 of the License, or | ||
| 5 | * (at your option) any later version. | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, see the file COPYING, or write | ||
| 14 | * to the Free Software Foundation, Inc. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/export.h> | ||
| 18 | #include <lib/libgcc.h> | ||
| 19 | |||
| 20 | #define W_TYPE_SIZE 32 | ||
| 21 | |||
| 22 | #define __ll_B ((unsigned long) 1 << (W_TYPE_SIZE / 2)) | ||
| 23 | #define __ll_lowpart(t) ((unsigned long) (t) & (__ll_B - 1)) | ||
| 24 | #define __ll_highpart(t) ((unsigned long) (t) >> (W_TYPE_SIZE / 2)) | ||
| 25 | |||
| 26 | /* If we still don't have umul_ppmm, define it using plain C. */ | ||
| 27 | #if !defined(umul_ppmm) | ||
| 28 | #define umul_ppmm(w1, w0, u, v) \ | ||
| 29 | do { \ | ||
| 30 | unsigned long __x0, __x1, __x2, __x3; \ | ||
| 31 | unsigned short __ul, __vl, __uh, __vh; \ | ||
| 32 | \ | ||
| 33 | __ul = __ll_lowpart(u); \ | ||
| 34 | __uh = __ll_highpart(u); \ | ||
| 35 | __vl = __ll_lowpart(v); \ | ||
| 36 | __vh = __ll_highpart(v); \ | ||
| 37 | \ | ||
| 38 | __x0 = (unsigned long) __ul * __vl; \ | ||
| 39 | __x1 = (unsigned long) __ul * __vh; \ | ||
| 40 | __x2 = (unsigned long) __uh * __vl; \ | ||
| 41 | __x3 = (unsigned long) __uh * __vh; \ | ||
| 42 | \ | ||
| 43 | __x1 += __ll_highpart(__x0); /* this can't give carry */\ | ||
| 44 | __x1 += __x2; /* but this indeed can */ \ | ||
| 45 | if (__x1 < __x2) /* did we get it? */ \ | ||
| 46 | __x3 += __ll_B; /* yes, add it in the proper pos */ \ | ||
| 47 | \ | ||
| 48 | (w1) = __x3 + __ll_highpart(__x1); \ | ||
| 49 | (w0) = __ll_lowpart(__x1) * __ll_B + __ll_lowpart(__x0);\ | ||
| 50 | } while (0) | ||
| 51 | #endif | ||
| 52 | |||
| 53 | #if !defined(__umulsidi3) | ||
| 54 | #define __umulsidi3(u, v) ({ \ | ||
| 55 | DWunion __w; \ | ||
| 56 | umul_ppmm(__w.s.high, __w.s.low, u, v); \ | ||
| 57 | __w.ll; \ | ||
| 58 | }) | ||
| 59 | #endif | ||
| 60 | |||
| 61 | long long notrace __muldi3(long long u, long long v) | ||
| 62 | { | ||
| 63 | const DWunion uu = {.ll = u}; | ||
| 64 | const DWunion vv = {.ll = v}; | ||
| 65 | DWunion w = {.ll = __umulsidi3(uu.s.low, vv.s.low)}; | ||
| 66 | |||
| 67 | w.s.high += ((unsigned long) uu.s.low * (unsigned long) vv.s.high | ||
| 68 | + (unsigned long) uu.s.high * (unsigned long) vv.s.low); | ||
| 69 | |||
| 70 | return w.ll; | ||
| 71 | } | ||
| 72 | EXPORT_SYMBOL(__muldi3); | ||
diff --git a/lib/ucmpdi2.c b/lib/ucmpdi2.c new file mode 100644 index 000000000000..49a53505c8e3 --- /dev/null +++ b/lib/ucmpdi2.c | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License as published by | ||
| 4 | * the Free Software Foundation; either version 2 of the License, or | ||
| 5 | * (at your option) any later version. | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, see the file COPYING, or write | ||
| 14 | * to the Free Software Foundation, Inc. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/module.h> | ||
| 18 | #include <lib/libgcc.h> | ||
| 19 | |||
| 20 | word_type __ucmpdi2(unsigned long long a, unsigned long long b) | ||
| 21 | { | ||
| 22 | const DWunion au = {.ll = a}; | ||
| 23 | const DWunion bu = {.ll = b}; | ||
| 24 | |||
| 25 | if ((unsigned int) au.s.high < (unsigned int) bu.s.high) | ||
| 26 | return 0; | ||
| 27 | else if ((unsigned int) au.s.high > (unsigned int) bu.s.high) | ||
| 28 | return 2; | ||
| 29 | if ((unsigned int) au.s.low < (unsigned int) bu.s.low) | ||
| 30 | return 0; | ||
| 31 | else if ((unsigned int) au.s.low > (unsigned int) bu.s.low) | ||
| 32 | return 2; | ||
| 33 | return 1; | ||
| 34 | } | ||
| 35 | EXPORT_SYMBOL(__ucmpdi2); | ||
