summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2019-01-15 13:43:03 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2019-01-15 13:43:03 +0100
commit7c2517c2444fdd5c2eceee330a03ff15d12602ca (patch)
tree1770d5217d689f0513bb1534c7e4dfbf114800fc /lib
parentcbc25b2b8488452085d3195dfc7164b00a265364 (diff)
parent0473048c4fa5410b0c4a75f667f7b317e44c15df (diff)
downloadbarebox-7c2517c2444fdd5c2eceee330a03ff15d12602ca.tar.gz
barebox-7c2517c2444fdd5c2eceee330a03ff15d12602ca.tar.xz
Merge branch 'for-next/misc'
Diffstat (limited to 'lib')
-rw-r--r--lib/Kconfig3
-rw-r--r--lib/Makefile1
-rw-r--r--lib/gui/2d-primitives.c2
-rw-r--r--lib/muldi3.c73
-rw-r--r--lib/parameter.c4
5 files changed, 81 insertions, 2 deletions
diff --git a/lib/Kconfig b/lib/Kconfig
index 67680adbb5..e048aded8b 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -145,4 +145,7 @@ config GENERIC_LIB_ASHRDI3
config GENERIC_LIB_LSHRDI3
bool
+config GENERIC_LIB_MULDI3
+ bool
+
endmenu
diff --git a/lib/Makefile b/lib/Makefile
index 8ece2c284f..e72aa6655c 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -72,5 +72,6 @@ obj-$(CONFIG_CRC8) += crc8.o
obj-$(CONFIG_GENERIC_LIB_ASHLDI3) += ashldi3.o
obj-$(CONFIG_GENERIC_LIB_ASHRDI3) += ashrdi3.o
obj-$(CONFIG_GENERIC_LIB_LSHRDI3) += lshrdi3.o
+obj-$(CONFIG_GENERIC_LIB_MULDI3) += muldi3.o
pbl-$(CONFIG_GENERIC_LIB_ASHLDI3) += ashldi3.o
diff --git a/lib/gui/2d-primitives.c b/lib/gui/2d-primitives.c
index 82e59d9a67..940e82b7d4 100644
--- a/lib/gui/2d-primitives.c
+++ b/lib/gui/2d-primitives.c
@@ -7,6 +7,8 @@
#include <fs.h>
#include <malloc.h>
+#include <gui/2d-primitives.h>
+
static void __illuminate(struct fb_info *info,
int x, int y,
u8 r, u8 g, u8 b, u8 a)
diff --git a/lib/muldi3.c b/lib/muldi3.c
new file mode 100644
index 0000000000..eec810e807
--- /dev/null
+++ b/lib/muldi3.c
@@ -0,0 +1,73 @@
+/*
+ * 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
+ * (at your option) 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, see the file COPYING, or write
+ * to the Free Software Foundation, Inc.
+ */
+
+#include <module.h>
+
+#include <lib/libgcc.h>
+
+#define W_TYPE_SIZE 32
+
+#define __ll_B ((unsigned long) 1 << (W_TYPE_SIZE / 2))
+#define __ll_lowpart(t) ((unsigned long) (t) & (__ll_B - 1))
+#define __ll_highpart(t) ((unsigned long) (t) >> (W_TYPE_SIZE / 2))
+
+/* If we still don't have umul_ppmm, define it using plain C. */
+#if !defined(umul_ppmm)
+#define umul_ppmm(w1, w0, u, v) \
+ do { \
+ unsigned long __x0, __x1, __x2, __x3; \
+ unsigned short __ul, __vl, __uh, __vh; \
+ \
+ __ul = __ll_lowpart(u); \
+ __uh = __ll_highpart(u); \
+ __vl = __ll_lowpart(v); \
+ __vh = __ll_highpart(v); \
+ \
+ __x0 = (unsigned long) __ul * __vl; \
+ __x1 = (unsigned long) __ul * __vh; \
+ __x2 = (unsigned long) __uh * __vl; \
+ __x3 = (unsigned long) __uh * __vh; \
+ \
+ __x1 += __ll_highpart(__x0); /* this can't give carry */\
+ __x1 += __x2; /* but this indeed can */ \
+ if (__x1 < __x2) /* did we get it? */ \
+ __x3 += __ll_B; /* yes, add it in the proper pos */ \
+ \
+ (w1) = __x3 + __ll_highpart(__x1); \
+ (w0) = __ll_lowpart(__x1) * __ll_B + __ll_lowpart(__x0);\
+ } while (0)
+#endif
+
+#if !defined(__umulsidi3)
+#define __umulsidi3(u, v) ({ \
+ DWunion __w; \
+ umul_ppmm(__w.s.high, __w.s.low, u, v); \
+ __w.ll; \
+ })
+#endif
+
+long long notrace __muldi3(long long u, long long v)
+{
+ const DWunion uu = {.ll = u};
+ const DWunion vv = {.ll = v};
+ DWunion w = {.ll = __umulsidi3(uu.s.low, vv.s.low)};
+
+ w.s.high += ((unsigned long) uu.s.low * (unsigned long) vv.s.high
+ + (unsigned long) uu.s.high * (unsigned long) vv.s.low);
+
+ return w.ll;
+}
+EXPORT_SYMBOL(__muldi3);
diff --git a/lib/parameter.c b/lib/parameter.c
index a21b8fa4a4..00e9a9ff4e 100644
--- a/lib/parameter.c
+++ b/lib/parameter.c
@@ -343,10 +343,10 @@ static int param_int_set(struct device_d *dev, struct param_d *p, const char *va
ret = strtobool(val, pi->value);
break;
case PARAM_TYPE_INT32:
- *(uint32_t *)pi->value = simple_strtol(val, NULL, 0);
+ *(int32_t *)pi->value = simple_strtol(val, NULL, 0);
break;
case PARAM_TYPE_UINT32:
- *(int32_t *)pi->value = simple_strtoul(val, NULL, 0);
+ *(uint32_t *)pi->value = simple_strtoul(val, NULL, 0);
break;
case PARAM_TYPE_INT64:
*(int64_t *)pi->value = simple_strtoll(val, NULL, 0);