summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO6
-rw-r--r--PKGBUILD6
-rw-r--r--openonload-201606-bug63982-ilog2.patch31
-rw-r--r--openonload-201606-bug64486-63982.patch91
4 files changed, 97 insertions, 37 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 927640f61e10..7441bd69c227 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,5 +1,5 @@
# Generated by mksrcinfo v8
-# Thu Aug 11 16:42:47 UTC 2016
+# Mon Aug 15 13:55:13 UTC 2016
pkgbase = openonload
pkgdesc = A high performance network stack from Solarflare.
pkgver = 201606
@@ -22,13 +22,13 @@ pkgbase = openonload
source = openonload.service
source = openonload-201310-cpp11-space-literal-fix.patch
source = openonload-201606-archlinux.patch
- source = openonload-201606-bug63982-ilog2.patch
+ source = openonload-201606-bug64486-63982.patch
sha512sums = 23207e9c701ccf85cdc70229390dfdf5b351d362509a1fd8d8666231f1061fe4054a95dc1d4968ce8c43be490abaf405f252f07a07eec72771b015cf9ff01b16
sha512sums = ac464250f2fb96d13e8ae129bac80c03f8cca62e450fdd765f24ccd064e28e9942e4a16ebc693e75c71fc1eb86c3a1b08337b2e39c6c618e129d8ec87d872bdb
sha512sums = b7e4529e37c64f99c660ca9b58f388cdd8f0d2f250ba875eb210f4909bb1f1c985a065aae64c048ca6f824adc6e3176c6eae1f582c049631326db73e939edd7b
sha512sums = a1d23b60b699c04caee93eb18d855dbe2e65d2115f10eb3771d1a2f04eea8d3b8042550152a5f96140aca759db10c3fbebdde85dbebcf46505c15f2ba7934bdb
sha512sums = c368ce3ed7987d1b374f1e671eb21bc80af4b927e4db4a229712f334ee4843f5921fb64c7ac83df214a9cc37134f8a3360273e9ba9496ff56c329476d26d050a
- sha512sums = 8f8e331de9d5d98ae9d6a3592bea5ad26af06eef5c798890b63c1f02bf326fd73aac3e4cdba34069d9b21504236d05c709f76e2f6c092fed4d78fd68353a395e
+ sha512sums = 11f9a82a438a8bb169df3c838b9fecaf1c2355082193d59defbf4bcf40cb35e7605678129778fac5dd82e49a8e271b0dfc6b28fc0b1ea6fbe3d1ccbbbd65efff
pkgname = openonload
diff --git a/PKGBUILD b/PKGBUILD
index 3b1b29d1bb12..ff5d59cf3af1 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -31,14 +31,14 @@ source=("http://www.openonload.org/download/openonload-${pkgver//\./-}.tgz"
'openonload.service'
'openonload-201310-cpp11-space-literal-fix.patch'
'openonload-201606-archlinux.patch'
- 'openonload-201606-bug63982-ilog2.patch'
+ 'openonload-201606-bug64486-63982.patch'
)
sha512sums=('23207e9c701ccf85cdc70229390dfdf5b351d362509a1fd8d8666231f1061fe4054a95dc1d4968ce8c43be490abaf405f252f07a07eec72771b015cf9ff01b16'
'ac464250f2fb96d13e8ae129bac80c03f8cca62e450fdd765f24ccd064e28e9942e4a16ebc693e75c71fc1eb86c3a1b08337b2e39c6c618e129d8ec87d872bdb'
'b7e4529e37c64f99c660ca9b58f388cdd8f0d2f250ba875eb210f4909bb1f1c985a065aae64c048ca6f824adc6e3176c6eae1f582c049631326db73e939edd7b'
'a1d23b60b699c04caee93eb18d855dbe2e65d2115f10eb3771d1a2f04eea8d3b8042550152a5f96140aca759db10c3fbebdde85dbebcf46505c15f2ba7934bdb'
'c368ce3ed7987d1b374f1e671eb21bc80af4b927e4db4a229712f334ee4843f5921fb64c7ac83df214a9cc37134f8a3360273e9ba9496ff56c329476d26d050a'
- '8f8e331de9d5d98ae9d6a3592bea5ad26af06eef5c798890b63c1f02bf326fd73aac3e4cdba34069d9b21504236d05c709f76e2f6c092fed4d78fd68353a395e')
+ '11f9a82a438a8bb169df3c838b9fecaf1c2355082193d59defbf4bcf40cb35e7605678129778fac5dd82e49a8e271b0dfc6b28fc0b1ea6fbe3d1ccbbbd65efff')
install="openonload.install"
@@ -53,7 +53,7 @@ prepare() {
patch -p1 < "${srcdir}/openonload-201310-cpp11-space-literal-fix.patch"
patch -p1 < "${srcdir}/openonload-201606-archlinux.patch"
- patch -p1 < "${srcdir}/openonload-201606-bug63982-ilog2.patch"
+ patch -p1 < "${srcdir}/openonload-201606-bug64486-63982.patch"
}
build() {
diff --git a/openonload-201606-bug63982-ilog2.patch b/openonload-201606-bug63982-ilog2.patch
deleted file mode 100644
index dc6414d51eec..000000000000
--- a/openonload-201606-bug63982-ilog2.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff --git a/src/lib/efrm/vi_resource_alloc.c b/src/lib/efrm/vi_resource_alloc.c
---- a/src/lib/efrm/vi_resource_alloc.c
-+++ b/src/lib/efrm/vi_resource_alloc.c
-@@ -1432,6 +1432,15 @@
-
- qso->q_len_entries = n_q_entries;
- qso->q_len_bytes = efrm_vi_q_bytes(virs, q_type, n_q_entries);
-+
-+ /* This value should always be positive, but if we don't check for this
-+ * explicitly, some compilers will assume that undefined logarithms
-+ * can be taken in get_order() and will generate code that won't link.
-+ * See bug63982. */
-+ EFRM_ASSERT(qso->q_len_bytes > 0);
-+ if (qso->q_len_bytes <= 0)
-+ return -EINVAL;
-+
- qso->q_len_page_order = get_order(qso->q_len_bytes);
- return 0;
- }
---- a/src/include/onload/version.h
-+++ b/src/include/onload/version.h
-@@ -29,7 +29,7 @@
-
-
- #ifndef ONLOAD_VERSION
--# define ONLOAD_VERSION "201606"
-+# define ONLOAD_VERSION "201606-patch63982"
- #endif
-
- #define ONLOAD_PRODUCT "OpenOnload"
-
diff --git a/openonload-201606-bug64486-63982.patch b/openonload-201606-bug64486-63982.patch
new file mode 100644
index 000000000000..93df45fbd0ba
--- /dev/null
+++ b/openonload-201606-bug64486-63982.patch
@@ -0,0 +1,91 @@
+diff -ur openonload-201606/src/driver/linux_onload/x86_linux_trampoline.c openonload-201606_patched/src/driver/linux_onload/x86_linux_trampoline.c
+--- openonload-201606/src/driver/linux_onload/x86_linux_trampoline.c 2016-06-30 11:42:18.000000000 +0100
++++ openonload-201606_patched/src/driver/linux_onload/x86_linux_trampoline.c 2016-08-15 14:32:18.640463000 +0100
+@@ -367,29 +367,42 @@
+ {
+ unsigned long result = 0;
+ unsigned char *p, *pend;
+- unsigned int *idtbase;
++ unsigned int *idtbase = NULL;
+ unsigned char idt[10];
+
+ #ifdef ERFM_HAVE_NEW_KALLSYMS
+- void *addr;
+-
++#if 0
++ /* It works with CONFIG_KALLSYMS_ALL=y only. */
+ /* Linux>=4.2: ia32_sys_call_table is not a local variable any more, so
+- * we can use kallsyms to find it. */
++ * we can use kallsyms to find it if CONFIG_KALLSYMS_ALL=y. */
++ void *addr;
+ addr = efrm_find_ksym("ia32_sys_call_table");
+ if( addr != NULL )
+ return addr;
+ #endif
+
+- /* linux<4.4: ia32_sys_call_table is an internal variable in
+- * linux/arch/x86/entry/entry_64_compat.S, and we can parse this asm
+- * code. */
+- __asm__("sidt %0" : "=m"(idt));
+- idtbase = *(unsigned int **)(&idt[2]);
+- TRAMP_DEBUG("idt base=%p, entry 0x80=%08x,%08x,%08x", idtbase,
+- idtbase[0x80*4], idtbase[0x80*4+1], idtbase[0x80*4+2]);
+- result = (idtbase[0x80*4] & 0xffff) | (idtbase[0x80*4+1] & 0xffff0000)
+- | ((unsigned long)idtbase[0x80*4+2] << 32);
+- p = (unsigned char *)result;
++ /* Linux-4.4 & 4.5: do_syscall_32_irqs_off is a function, so it does not
++ * require CONFIG_KALLSYMS_ALL=y. */
++ idtbase = efrm_find_ksym("do_syscall_32_irqs_off");
++ /* Linux-4.6: */
++ if( idtbase == NULL )
++ idtbase = efrm_find_ksym("do_int80_syscall_32");
++#endif
++
++ if( idtbase == NULL ) {
++ /* linux<4.4: get ia32_sys_call_table variable from asm code at
++ * linux/arch/x86/entry/entry_64_compat.S. */
++ __asm__("sidt %0" : "=m"(idt));
++ idtbase = *(unsigned int **)(&idt[2]);
++ TRAMP_DEBUG("idt base=%p, entry 0x80=%08x,%08x,%08x", idtbase,
++ idtbase[0x80*4], idtbase[0x80*4+1], idtbase[0x80*4+2]);
++ result = (idtbase[0x80*4] & 0xffff) | (idtbase[0x80*4+1] & 0xffff0000)
++ | ((unsigned long)idtbase[0x80*4+2] << 32);
++ p = (unsigned char *)result;
++ }
++ else {
++ p = (void *)idtbase;
++ }
+ TRAMP_DEBUG("int 0x80 entry point at %p", p);
+ pend = p + 1024 - 7;
+ while (p < pend) {
+diff -ur openonload-201606/src/include/onload/version.h openonload-201606_patched/src/include/onload/version.h
+--- openonload-201606/src/include/onload/version.h 2016-08-15 14:47:01.461718000 +0100
++++ openonload-201606_patched/src/include/onload/version.h 2016-08-15 14:47:23.538636000 +0100
+@@ -29,7 +29,7 @@
+
+
+ #ifndef ONLOAD_VERSION
+-# define ONLOAD_VERSION "201606"
++# define ONLOAD_VERSION "201606-p64486_63982"
+ #endif
+
+ #define ONLOAD_PRODUCT "OpenOnload"
+diff -ur openonload-201606/src/lib/efrm/vi_resource_alloc.c openonload-201606_patched/src/lib/efrm/vi_resource_alloc.c
+--- openonload-201606/src/lib/efrm/vi_resource_alloc.c 2016-06-30 11:42:13.000000000 +0100
++++ openonload-201606_patched/src/lib/efrm/vi_resource_alloc.c 2016-08-15 14:32:28.140994000 +0100
+@@ -1432,6 +1432,15 @@
+
+ qso->q_len_entries = n_q_entries;
+ qso->q_len_bytes = efrm_vi_q_bytes(virs, q_type, n_q_entries);
++
++ /* This value should always be positive, but if we don't check for this
++ * explicitly, some compilers will assume that undefined logarithms
++ * can be taken in get_order() and will generate code that won't link.
++ * See bug63982. */
++ EFRM_ASSERT(qso->q_len_bytes > 0);
++ if (qso->q_len_bytes <= 0)
++ return -EINVAL;
++
+ qso->q_len_page_order = get_order(qso->q_len_bytes);
+ return 0;
+ }