diff options
-rw-r--r-- | .SRCINFO | 6 | ||||
-rw-r--r-- | PKGBUILD | 6 | ||||
-rw-r--r-- | openonload-201606-bug63982-ilog2.patch | 31 | ||||
-rw-r--r-- | openonload-201606-bug64486-63982.patch | 91 |
4 files changed, 97 insertions, 37 deletions
@@ -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 @@ -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; + } |