diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Kconfig | 2 | ||||
| -rw-r--r-- | lib/Kconfig.debug | 124 | ||||
| -rw-r--r-- | lib/Kconfig.kgdb | 3 | ||||
| -rw-r--r-- | lib/bug.c | 1 | ||||
| -rw-r--r-- | lib/cpu_rmap.c | 54 | ||||
| -rw-r--r-- | lib/devres.c | 58 | ||||
| -rw-r--r-- | lib/digsig.c | 43 | ||||
| -rw-r--r-- | lib/dynamic_debug.c | 165 | ||||
| -rw-r--r-- | lib/hexdump.c | 4 | ||||
| -rw-r--r-- | lib/mpi/mpi-internal.h | 4 | ||||
| -rw-r--r-- | lib/mpi/mpicoder.c | 8 | ||||
| -rw-r--r-- | lib/parser.c | 6 | ||||
| -rw-r--r-- | lib/rbtree.c | 20 | ||||
| -rw-r--r-- | lib/vsprintf.c | 7 | ||||
| -rw-r--r-- | lib/xz/Kconfig | 34 |
15 files changed, 325 insertions, 208 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index 75cdb77fa49d..3958dc4389f9 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
| @@ -322,7 +322,7 @@ config CPUMASK_OFFSTACK | |||
| 322 | 322 | ||
| 323 | config DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | 323 | config DISABLE_OBSOLETE_CPUMASK_FUNCTIONS |
| 324 | bool "Disable obsolete cpumask functions" if DEBUG_PER_CPU_MAPS | 324 | bool "Disable obsolete cpumask functions" if DEBUG_PER_CPU_MAPS |
| 325 | depends on EXPERIMENTAL && BROKEN | 325 | depends on BROKEN |
| 326 | 326 | ||
| 327 | config CPU_RMAP | 327 | config CPU_RMAP |
| 328 | bool | 328 | bool |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 3a353091a903..e4a7f808fa06 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
| @@ -134,7 +134,7 @@ config DEBUG_SECTION_MISMATCH | |||
| 134 | any use of code/data previously in these sections would | 134 | any use of code/data previously in these sections would |
| 135 | most likely result in an oops. | 135 | most likely result in an oops. |
| 136 | In the code, functions and variables are annotated with | 136 | In the code, functions and variables are annotated with |
| 137 | __init, __devinit, etc. (see the full list in include/linux/init.h), | 137 | __init, __cpuinit, etc. (see the full list in include/linux/init.h), |
| 138 | which results in the code/data being placed in specific sections. | 138 | which results in the code/data being placed in specific sections. |
| 139 | The section mismatch analysis is always performed after a full | 139 | The section mismatch analysis is always performed after a full |
| 140 | kernel build, and enabling this option causes the following | 140 | kernel build, and enabling this option causes the following |
| @@ -243,8 +243,7 @@ config BOOTPARAM_SOFTLOCKUP_PANIC_VALUE | |||
| 243 | default 1 if BOOTPARAM_SOFTLOCKUP_PANIC | 243 | default 1 if BOOTPARAM_SOFTLOCKUP_PANIC |
| 244 | 244 | ||
| 245 | config PANIC_ON_OOPS | 245 | config PANIC_ON_OOPS |
| 246 | bool "Panic on Oops" if EXPERT | 246 | bool "Panic on Oops" |
| 247 | default n | ||
| 248 | help | 247 | help |
| 249 | Say Y here to enable the kernel to panic when it oopses. This | 248 | Say Y here to enable the kernel to panic when it oopses. This |
| 250 | has the same effect as setting oops=panic on the kernel command | 249 | has the same effect as setting oops=panic on the kernel command |
| @@ -455,7 +454,7 @@ config HAVE_DEBUG_KMEMLEAK | |||
| 455 | 454 | ||
| 456 | config DEBUG_KMEMLEAK | 455 | config DEBUG_KMEMLEAK |
| 457 | bool "Kernel memory leak detector" | 456 | bool "Kernel memory leak detector" |
| 458 | depends on DEBUG_KERNEL && EXPERIMENTAL && HAVE_DEBUG_KMEMLEAK | 457 | depends on DEBUG_KERNEL && HAVE_DEBUG_KMEMLEAK |
| 459 | select DEBUG_FS | 458 | select DEBUG_FS |
| 460 | select STACKTRACE if STACKTRACE_SUPPORT | 459 | select STACKTRACE if STACKTRACE_SUPPORT |
| 461 | select KALLSYMS | 460 | select KALLSYMS |
| @@ -605,61 +604,6 @@ config PROVE_LOCKING | |||
| 605 | 604 | ||
| 606 | For more details, see Documentation/lockdep-design.txt. | 605 | For more details, see Documentation/lockdep-design.txt. |
| 607 | 606 | ||
| 608 | config PROVE_RCU | ||
| 609 | bool "RCU debugging: prove RCU correctness" | ||
| 610 | depends on PROVE_LOCKING | ||
| 611 | default n | ||
| 612 | help | ||
| 613 | This feature enables lockdep extensions that check for correct | ||
| 614 | use of RCU APIs. This is currently under development. Say Y | ||
| 615 | if you want to debug RCU usage or help work on the PROVE_RCU | ||
| 616 | feature. | ||
| 617 | |||
| 618 | Say N if you are unsure. | ||
| 619 | |||
| 620 | config PROVE_RCU_REPEATEDLY | ||
| 621 | bool "RCU debugging: don't disable PROVE_RCU on first splat" | ||
| 622 | depends on PROVE_RCU | ||
| 623 | default n | ||
| 624 | help | ||
| 625 | By itself, PROVE_RCU will disable checking upon issuing the | ||
| 626 | first warning (or "splat"). This feature prevents such | ||
| 627 | disabling, allowing multiple RCU-lockdep warnings to be printed | ||
| 628 | on a single reboot. | ||
| 629 | |||
| 630 | Say Y to allow multiple RCU-lockdep warnings per boot. | ||
| 631 | |||
| 632 | Say N if you are unsure. | ||
| 633 | |||
| 634 | config PROVE_RCU_DELAY | ||
| 635 | bool "RCU debugging: preemptible RCU race provocation" | ||
| 636 | depends on DEBUG_KERNEL && PREEMPT_RCU | ||
| 637 | default n | ||
| 638 | help | ||
| 639 | There is a class of races that involve an unlikely preemption | ||
| 640 | of __rcu_read_unlock() just after ->rcu_read_lock_nesting has | ||
| 641 | been set to INT_MIN. This feature inserts a delay at that | ||
| 642 | point to increase the probability of these races. | ||
| 643 | |||
| 644 | Say Y to increase probability of preemption of __rcu_read_unlock(). | ||
| 645 | |||
| 646 | Say N if you are unsure. | ||
| 647 | |||
| 648 | config SPARSE_RCU_POINTER | ||
| 649 | bool "RCU debugging: sparse-based checks for pointer usage" | ||
| 650 | default n | ||
| 651 | help | ||
| 652 | This feature enables the __rcu sparse annotation for | ||
| 653 | RCU-protected pointers. This annotation will cause sparse | ||
| 654 | to flag any non-RCU used of annotated pointers. This can be | ||
| 655 | helpful when debugging RCU usage. Please note that this feature | ||
| 656 | is not intended to enforce code cleanliness; it is instead merely | ||
| 657 | a debugging aid. | ||
| 658 | |||
| 659 | Say Y to make sparse flag questionable use of RCU-protected pointers | ||
| 660 | |||
| 661 | Say N if you are unsure. | ||
| 662 | |||
| 663 | config LOCKDEP | 607 | config LOCKDEP |
| 664 | bool | 608 | bool |
| 665 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT | 609 | depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT |
| @@ -937,6 +881,63 @@ config BOOT_PRINTK_DELAY | |||
| 937 | BOOT_PRINTK_DELAY also may cause LOCKUP_DETECTOR to detect | 881 | BOOT_PRINTK_DELAY also may cause LOCKUP_DETECTOR to detect |
| 938 | what it believes to be lockup conditions. | 882 | what it believes to be lockup conditions. |
| 939 | 883 | ||
| 884 | menu "RCU Debugging" | ||
| 885 | |||
| 886 | config PROVE_RCU | ||
| 887 | bool "RCU debugging: prove RCU correctness" | ||
| 888 | depends on PROVE_LOCKING | ||
| 889 | default n | ||
| 890 | help | ||
| 891 | This feature enables lockdep extensions that check for correct | ||
| 892 | use of RCU APIs. This is currently under development. Say Y | ||
| 893 | if you want to debug RCU usage or help work on the PROVE_RCU | ||
| 894 | feature. | ||
| 895 | |||
| 896 | Say N if you are unsure. | ||
| 897 | |||
| 898 | config PROVE_RCU_REPEATEDLY | ||
| 899 | bool "RCU debugging: don't disable PROVE_RCU on first splat" | ||
| 900 | depends on PROVE_RCU | ||
| 901 | default n | ||
| 902 | help | ||
| 903 | By itself, PROVE_RCU will disable checking upon issuing the | ||
| 904 | first warning (or "splat"). This feature prevents such | ||
| 905 | disabling, allowing multiple RCU-lockdep warnings to be printed | ||
| 906 | on a single reboot. | ||
| 907 | |||
| 908 | Say Y to allow multiple RCU-lockdep warnings per boot. | ||
| 909 | |||
| 910 | Say N if you are unsure. | ||
| 911 | |||
| 912 | config PROVE_RCU_DELAY | ||
| 913 | bool "RCU debugging: preemptible RCU race provocation" | ||
| 914 | depends on DEBUG_KERNEL && PREEMPT_RCU | ||
| 915 | default n | ||
| 916 | help | ||
| 917 | There is a class of races that involve an unlikely preemption | ||
| 918 | of __rcu_read_unlock() just after ->rcu_read_lock_nesting has | ||
| 919 | been set to INT_MIN. This feature inserts a delay at that | ||
| 920 | point to increase the probability of these races. | ||
| 921 | |||
| 922 | Say Y to increase probability of preemption of __rcu_read_unlock(). | ||
| 923 | |||
| 924 | Say N if you are unsure. | ||
| 925 | |||
| 926 | config SPARSE_RCU_POINTER | ||
| 927 | bool "RCU debugging: sparse-based checks for pointer usage" | ||
| 928 | default n | ||
| 929 | help | ||
| 930 | This feature enables the __rcu sparse annotation for | ||
| 931 | RCU-protected pointers. This annotation will cause sparse | ||
| 932 | to flag any non-RCU used of annotated pointers. This can be | ||
| 933 | helpful when debugging RCU usage. Please note that this feature | ||
| 934 | is not intended to enforce code cleanliness; it is instead merely | ||
| 935 | a debugging aid. | ||
| 936 | |||
| 937 | Say Y to make sparse flag questionable use of RCU-protected pointers | ||
| 938 | |||
| 939 | Say N if you are unsure. | ||
| 940 | |||
| 940 | config RCU_TORTURE_TEST | 941 | config RCU_TORTURE_TEST |
| 941 | tristate "torture tests for RCU" | 942 | tristate "torture tests for RCU" |
| 942 | depends on DEBUG_KERNEL | 943 | depends on DEBUG_KERNEL |
| @@ -970,7 +971,7 @@ config RCU_TORTURE_TEST_RUNNABLE | |||
| 970 | 971 | ||
| 971 | config RCU_CPU_STALL_TIMEOUT | 972 | config RCU_CPU_STALL_TIMEOUT |
| 972 | int "RCU CPU stall timeout in seconds" | 973 | int "RCU CPU stall timeout in seconds" |
| 973 | depends on TREE_RCU || TREE_PREEMPT_RCU | 974 | depends on RCU_STALL_COMMON |
| 974 | range 3 300 | 975 | range 3 300 |
| 975 | default 21 | 976 | default 21 |
| 976 | help | 977 | help |
| @@ -1008,6 +1009,7 @@ config RCU_CPU_STALL_INFO | |||
| 1008 | config RCU_TRACE | 1009 | config RCU_TRACE |
| 1009 | bool "Enable tracing for RCU" | 1010 | bool "Enable tracing for RCU" |
| 1010 | depends on DEBUG_KERNEL | 1011 | depends on DEBUG_KERNEL |
| 1012 | select TRACE_CLOCK | ||
| 1011 | help | 1013 | help |
| 1012 | This option provides tracing in RCU which presents stats | 1014 | This option provides tracing in RCU which presents stats |
| 1013 | in debugfs for debugging RCU implementation. | 1015 | in debugfs for debugging RCU implementation. |
| @@ -1015,6 +1017,8 @@ config RCU_TRACE | |||
| 1015 | Say Y here if you want to enable RCU tracing | 1017 | Say Y here if you want to enable RCU tracing |
| 1016 | Say N if you are unsure. | 1018 | Say N if you are unsure. |
| 1017 | 1019 | ||
| 1020 | endmenu # "RCU Debugging" | ||
| 1021 | |||
| 1018 | config KPROBES_SANITY_TEST | 1022 | config KPROBES_SANITY_TEST |
| 1019 | bool "Kprobes sanity tests" | 1023 | bool "Kprobes sanity tests" |
| 1020 | depends on DEBUG_KERNEL | 1024 | depends on DEBUG_KERNEL |
diff --git a/lib/Kconfig.kgdb b/lib/Kconfig.kgdb index 43cb93fa2651..dbb58ae1b8e0 100644 --- a/lib/Kconfig.kgdb +++ b/lib/Kconfig.kgdb | |||
| @@ -5,7 +5,7 @@ config HAVE_ARCH_KGDB | |||
| 5 | menuconfig KGDB | 5 | menuconfig KGDB |
| 6 | bool "KGDB: kernel debugger" | 6 | bool "KGDB: kernel debugger" |
| 7 | depends on HAVE_ARCH_KGDB | 7 | depends on HAVE_ARCH_KGDB |
| 8 | depends on DEBUG_KERNEL && EXPERIMENTAL | 8 | depends on DEBUG_KERNEL |
| 9 | help | 9 | help |
| 10 | If you say Y here, it will be possible to remotely debug the | 10 | If you say Y here, it will be possible to remotely debug the |
| 11 | kernel using gdb. It is recommended but not required, that | 11 | kernel using gdb. It is recommended but not required, that |
| @@ -22,6 +22,7 @@ config KGDB_SERIAL_CONSOLE | |||
| 22 | tristate "KGDB: use kgdb over the serial console" | 22 | tristate "KGDB: use kgdb over the serial console" |
| 23 | select CONSOLE_POLL | 23 | select CONSOLE_POLL |
| 24 | select MAGIC_SYSRQ | 24 | select MAGIC_SYSRQ |
| 25 | depends on TTY | ||
| 25 | default y | 26 | default y |
| 26 | help | 27 | help |
| 27 | Share a serial console with kgdb. Sysrq-g must be used | 28 | Share a serial console with kgdb. Sysrq-g must be used |
| @@ -55,6 +55,7 @@ static inline unsigned long bug_addr(const struct bug_entry *bug) | |||
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | #ifdef CONFIG_MODULES | 57 | #ifdef CONFIG_MODULES |
| 58 | /* Updates are protected by module mutex */ | ||
| 58 | static LIST_HEAD(module_bug_list); | 59 | static LIST_HEAD(module_bug_list); |
| 59 | 60 | ||
| 60 | static const struct bug_entry *module_find_bug(unsigned long bugaddr) | 61 | static const struct bug_entry *module_find_bug(unsigned long bugaddr) |
diff --git a/lib/cpu_rmap.c b/lib/cpu_rmap.c index 145dec5267c9..5fbed5caba6e 100644 --- a/lib/cpu_rmap.c +++ b/lib/cpu_rmap.c | |||
| @@ -45,6 +45,7 @@ struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags) | |||
| 45 | if (!rmap) | 45 | if (!rmap) |
| 46 | return NULL; | 46 | return NULL; |
| 47 | 47 | ||
| 48 | kref_init(&rmap->refcount); | ||
| 48 | rmap->obj = (void **)((char *)rmap + obj_offset); | 49 | rmap->obj = (void **)((char *)rmap + obj_offset); |
| 49 | 50 | ||
| 50 | /* Initially assign CPUs to objects on a rota, since we have | 51 | /* Initially assign CPUs to objects on a rota, since we have |
| @@ -63,6 +64,35 @@ struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags) | |||
| 63 | } | 64 | } |
| 64 | EXPORT_SYMBOL(alloc_cpu_rmap); | 65 | EXPORT_SYMBOL(alloc_cpu_rmap); |
| 65 | 66 | ||
| 67 | /** | ||
| 68 | * cpu_rmap_release - internal reclaiming helper called from kref_put | ||
| 69 | * @ref: kref to struct cpu_rmap | ||
| 70 | */ | ||
| 71 | static void cpu_rmap_release(struct kref *ref) | ||
| 72 | { | ||
| 73 | struct cpu_rmap *rmap = container_of(ref, struct cpu_rmap, refcount); | ||
| 74 | kfree(rmap); | ||
| 75 | } | ||
| 76 | |||
| 77 | /** | ||
| 78 | * cpu_rmap_get - internal helper to get new ref on a cpu_rmap | ||
| 79 | * @rmap: reverse-map allocated with alloc_cpu_rmap() | ||
| 80 | */ | ||
| 81 | static inline void cpu_rmap_get(struct cpu_rmap *rmap) | ||
| 82 | { | ||
| 83 | kref_get(&rmap->refcount); | ||
| 84 | } | ||
| 85 | |||
| 86 | /** | ||
| 87 | * cpu_rmap_put - release ref on a cpu_rmap | ||
| 88 | * @rmap: reverse-map allocated with alloc_cpu_rmap() | ||
| 89 | */ | ||
| 90 | int cpu_rmap_put(struct cpu_rmap *rmap) | ||
| 91 | { | ||
| 92 | return kref_put(&rmap->refcount, cpu_rmap_release); | ||
| 93 | } | ||
| 94 | EXPORT_SYMBOL(cpu_rmap_put); | ||
| 95 | |||
| 66 | /* Reevaluate nearest object for given CPU, comparing with the given | 96 | /* Reevaluate nearest object for given CPU, comparing with the given |
| 67 | * neighbours at the given distance. | 97 | * neighbours at the given distance. |
| 68 | */ | 98 | */ |
| @@ -197,8 +227,7 @@ struct irq_glue { | |||
| 197 | * free_irq_cpu_rmap - free a CPU affinity reverse-map used for IRQs | 227 | * free_irq_cpu_rmap - free a CPU affinity reverse-map used for IRQs |
| 198 | * @rmap: Reverse-map allocated with alloc_irq_cpu_map(), or %NULL | 228 | * @rmap: Reverse-map allocated with alloc_irq_cpu_map(), or %NULL |
| 199 | * | 229 | * |
| 200 | * Must be called in process context, before freeing the IRQs, and | 230 | * Must be called in process context, before freeing the IRQs. |
| 201 | * without holding any locks required by global workqueue items. | ||
| 202 | */ | 231 | */ |
| 203 | void free_irq_cpu_rmap(struct cpu_rmap *rmap) | 232 | void free_irq_cpu_rmap(struct cpu_rmap *rmap) |
| 204 | { | 233 | { |
| @@ -212,12 +241,18 @@ void free_irq_cpu_rmap(struct cpu_rmap *rmap) | |||
| 212 | glue = rmap->obj[index]; | 241 | glue = rmap->obj[index]; |
| 213 | irq_set_affinity_notifier(glue->notify.irq, NULL); | 242 | irq_set_affinity_notifier(glue->notify.irq, NULL); |
| 214 | } | 243 | } |
| 215 | irq_run_affinity_notifiers(); | ||
| 216 | 244 | ||
| 217 | kfree(rmap); | 245 | cpu_rmap_put(rmap); |
| 218 | } | 246 | } |
| 219 | EXPORT_SYMBOL(free_irq_cpu_rmap); | 247 | EXPORT_SYMBOL(free_irq_cpu_rmap); |
| 220 | 248 | ||
| 249 | /** | ||
| 250 | * irq_cpu_rmap_notify - callback for IRQ subsystem when IRQ affinity updated | ||
| 251 | * @notify: struct irq_affinity_notify passed by irq/manage.c | ||
| 252 | * @mask: cpu mask for new SMP affinity | ||
| 253 | * | ||
| 254 | * This is executed in workqueue context. | ||
| 255 | */ | ||
| 221 | static void | 256 | static void |
| 222 | irq_cpu_rmap_notify(struct irq_affinity_notify *notify, const cpumask_t *mask) | 257 | irq_cpu_rmap_notify(struct irq_affinity_notify *notify, const cpumask_t *mask) |
| 223 | { | 258 | { |
| @@ -230,10 +265,16 @@ irq_cpu_rmap_notify(struct irq_affinity_notify *notify, const cpumask_t *mask) | |||
| 230 | pr_warning("irq_cpu_rmap_notify: update failed: %d\n", rc); | 265 | pr_warning("irq_cpu_rmap_notify: update failed: %d\n", rc); |
| 231 | } | 266 | } |
| 232 | 267 | ||
| 268 | /** | ||
| 269 | * irq_cpu_rmap_release - reclaiming callback for IRQ subsystem | ||
| 270 | * @ref: kref to struct irq_affinity_notify passed by irq/manage.c | ||
| 271 | */ | ||
| 233 | static void irq_cpu_rmap_release(struct kref *ref) | 272 | static void irq_cpu_rmap_release(struct kref *ref) |
| 234 | { | 273 | { |
| 235 | struct irq_glue *glue = | 274 | struct irq_glue *glue = |
| 236 | container_of(ref, struct irq_glue, notify.kref); | 275 | container_of(ref, struct irq_glue, notify.kref); |
| 276 | |||
| 277 | cpu_rmap_put(glue->rmap); | ||
| 237 | kfree(glue); | 278 | kfree(glue); |
| 238 | } | 279 | } |
| 239 | 280 | ||
| @@ -258,10 +299,13 @@ int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq) | |||
| 258 | glue->notify.notify = irq_cpu_rmap_notify; | 299 | glue->notify.notify = irq_cpu_rmap_notify; |
| 259 | glue->notify.release = irq_cpu_rmap_release; | 300 | glue->notify.release = irq_cpu_rmap_release; |
| 260 | glue->rmap = rmap; | 301 | glue->rmap = rmap; |
| 302 | cpu_rmap_get(rmap); | ||
| 261 | glue->index = cpu_rmap_add(rmap, glue); | 303 | glue->index = cpu_rmap_add(rmap, glue); |
| 262 | rc = irq_set_affinity_notifier(irq, &glue->notify); | 304 | rc = irq_set_affinity_notifier(irq, &glue->notify); |
| 263 | if (rc) | 305 | if (rc) { |
| 306 | cpu_rmap_put(glue->rmap); | ||
| 264 | kfree(glue); | 307 | kfree(glue); |
| 308 | } | ||
| 265 | return rc; | 309 | return rc; |
| 266 | } | 310 | } |
| 267 | EXPORT_SYMBOL(irq_cpu_rmap_add); | 311 | EXPORT_SYMBOL(irq_cpu_rmap_add); |
diff --git a/lib/devres.c b/lib/devres.c index 80b9c76d436a..88ad75952a76 100644 --- a/lib/devres.c +++ b/lib/devres.c | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | #include <linux/err.h> | ||
| 1 | #include <linux/pci.h> | 2 | #include <linux/pci.h> |
| 2 | #include <linux/io.h> | 3 | #include <linux/io.h> |
| 3 | #include <linux/gfp.h> | 4 | #include <linux/gfp.h> |
| @@ -86,22 +87,24 @@ void devm_iounmap(struct device *dev, void __iomem *addr) | |||
| 86 | EXPORT_SYMBOL(devm_iounmap); | 87 | EXPORT_SYMBOL(devm_iounmap); |
| 87 | 88 | ||
| 88 | /** | 89 | /** |
| 89 | * devm_request_and_ioremap() - Check, request region, and ioremap resource | 90 | * devm_ioremap_resource() - check, request region, and ioremap resource |
| 90 | * @dev: Generic device to handle the resource for | 91 | * @dev: generic device to handle the resource for |
| 91 | * @res: resource to be handled | 92 | * @res: resource to be handled |
| 92 | * | 93 | * |
| 93 | * Takes all necessary steps to ioremap a mem resource. Uses managed device, so | 94 | * Checks that a resource is a valid memory region, requests the memory region |
| 94 | * everything is undone on driver detach. Checks arguments, so you can feed | 95 | * and ioremaps it either as cacheable or as non-cacheable memory depending on |
| 95 | * it the result from e.g. platform_get_resource() directly. Returns the | 96 | * the resource's flags. All operations are managed and will be undone on |
| 96 | * remapped pointer or NULL on error. Usage example: | 97 | * driver detach. |
| 98 | * | ||
| 99 | * Returns a pointer to the remapped memory or an ERR_PTR() encoded error code | ||
| 100 | * on failure. Usage example: | ||
| 97 | * | 101 | * |
| 98 | * res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 102 | * res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 99 | * base = devm_request_and_ioremap(&pdev->dev, res); | 103 | * base = devm_ioremap_resource(&pdev->dev, res); |
| 100 | * if (!base) | 104 | * if (IS_ERR(base)) |
| 101 | * return -EADDRNOTAVAIL; | 105 | * return PTR_ERR(base); |
| 102 | */ | 106 | */ |
| 103 | void __iomem *devm_request_and_ioremap(struct device *dev, | 107 | void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) |
| 104 | struct resource *res) | ||
| 105 | { | 108 | { |
| 106 | resource_size_t size; | 109 | resource_size_t size; |
| 107 | const char *name; | 110 | const char *name; |
| @@ -111,7 +114,7 @@ void __iomem *devm_request_and_ioremap(struct device *dev, | |||
| 111 | 114 | ||
| 112 | if (!res || resource_type(res) != IORESOURCE_MEM) { | 115 | if (!res || resource_type(res) != IORESOURCE_MEM) { |
| 113 | dev_err(dev, "invalid resource\n"); | 116 | dev_err(dev, "invalid resource\n"); |
| 114 | return NULL; | 117 | return ERR_PTR(-EINVAL); |
| 115 | } | 118 | } |
| 116 | 119 | ||
| 117 | size = resource_size(res); | 120 | size = resource_size(res); |
| @@ -119,7 +122,7 @@ void __iomem *devm_request_and_ioremap(struct device *dev, | |||
| 119 | 122 | ||
| 120 | if (!devm_request_mem_region(dev, res->start, size, name)) { | 123 | if (!devm_request_mem_region(dev, res->start, size, name)) { |
| 121 | dev_err(dev, "can't request region for resource %pR\n", res); | 124 | dev_err(dev, "can't request region for resource %pR\n", res); |
| 122 | return NULL; | 125 | return ERR_PTR(-EBUSY); |
| 123 | } | 126 | } |
| 124 | 127 | ||
| 125 | if (res->flags & IORESOURCE_CACHEABLE) | 128 | if (res->flags & IORESOURCE_CACHEABLE) |
| @@ -130,10 +133,39 @@ void __iomem *devm_request_and_ioremap(struct device *dev, | |||
| 130 | if (!dest_ptr) { | 133 | if (!dest_ptr) { |
| 131 | dev_err(dev, "ioremap failed for resource %pR\n", res); | 134 | dev_err(dev, "ioremap failed for resource %pR\n", res); |
| 132 | devm_release_mem_region(dev, res->start, size); | 135 | devm_release_mem_region(dev, res->start, size); |
| 136 | dest_ptr = ERR_PTR(-ENOMEM); | ||
| 133 | } | 137 | } |
| 134 | 138 | ||
| 135 | return dest_ptr; | 139 | return dest_ptr; |
| 136 | } | 140 | } |
| 141 | EXPORT_SYMBOL(devm_ioremap_resource); | ||
| 142 | |||
| 143 | /** | ||
| 144 | * devm_request_and_ioremap() - Check, request region, and ioremap resource | ||
| 145 | * @dev: Generic device to handle the resource for | ||
| 146 | * @res: resource to be handled | ||
| 147 | * | ||
| 148 | * Takes all necessary steps to ioremap a mem resource. Uses managed device, so | ||
| 149 | * everything is undone on driver detach. Checks arguments, so you can feed | ||
| 150 | * it the result from e.g. platform_get_resource() directly. Returns the | ||
| 151 | * remapped pointer or NULL on error. Usage example: | ||
| 152 | * | ||
| 153 | * res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 154 | * base = devm_request_and_ioremap(&pdev->dev, res); | ||
| 155 | * if (!base) | ||
| 156 | * return -EADDRNOTAVAIL; | ||
| 157 | */ | ||
| 158 | void __iomem *devm_request_and_ioremap(struct device *device, | ||
| 159 | struct resource *res) | ||
| 160 | { | ||
| 161 | void __iomem *dest_ptr; | ||
| 162 | |||
| 163 | dest_ptr = devm_ioremap_resource(device, res); | ||
| 164 | if (IS_ERR(dest_ptr)) | ||
| 165 | return NULL; | ||
| 166 | |||
| 167 | return dest_ptr; | ||
| 168 | } | ||
| 137 | EXPORT_SYMBOL(devm_request_and_ioremap); | 169 | EXPORT_SYMBOL(devm_request_and_ioremap); |
| 138 | 170 | ||
| 139 | #ifdef CONFIG_HAS_IOPORT | 171 | #ifdef CONFIG_HAS_IOPORT |
diff --git a/lib/digsig.c b/lib/digsig.c index 8c0e62975c88..2f31e6a45f0a 100644 --- a/lib/digsig.c +++ b/lib/digsig.c | |||
| @@ -30,11 +30,10 @@ | |||
| 30 | 30 | ||
| 31 | static struct crypto_shash *shash; | 31 | static struct crypto_shash *shash; |
| 32 | 32 | ||
| 33 | static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg, | 33 | static const char *pkcs_1_v1_5_decode_emsa(const unsigned char *msg, |
| 34 | unsigned long msglen, | 34 | unsigned long msglen, |
| 35 | unsigned long modulus_bitlen, | 35 | unsigned long modulus_bitlen, |
| 36 | unsigned char *out, | 36 | unsigned long *outlen) |
| 37 | unsigned long *outlen) | ||
| 38 | { | 37 | { |
| 39 | unsigned long modulus_len, ps_len, i; | 38 | unsigned long modulus_len, ps_len, i; |
| 40 | 39 | ||
| @@ -42,11 +41,11 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg, | |||
| 42 | 41 | ||
| 43 | /* test message size */ | 42 | /* test message size */ |
| 44 | if ((msglen > modulus_len) || (modulus_len < 11)) | 43 | if ((msglen > modulus_len) || (modulus_len < 11)) |
| 45 | return -EINVAL; | 44 | return NULL; |
| 46 | 45 | ||
| 47 | /* separate encoded message */ | 46 | /* separate encoded message */ |
| 48 | if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) | 47 | if (msg[0] != 0x00 || msg[1] != 0x01) |
| 49 | return -EINVAL; | 48 | return NULL; |
| 50 | 49 | ||
| 51 | for (i = 2; i < modulus_len - 1; i++) | 50 | for (i = 2; i < modulus_len - 1; i++) |
| 52 | if (msg[i] != 0xFF) | 51 | if (msg[i] != 0xFF) |
| @@ -56,19 +55,13 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg, | |||
| 56 | if (msg[i] != 0) | 55 | if (msg[i] != 0) |
| 57 | /* There was no octet with hexadecimal value 0x00 | 56 | /* There was no octet with hexadecimal value 0x00 |
| 58 | to separate ps from m. */ | 57 | to separate ps from m. */ |
| 59 | return -EINVAL; | 58 | return NULL; |
| 60 | 59 | ||
| 61 | ps_len = i - 2; | 60 | ps_len = i - 2; |
| 62 | 61 | ||
| 63 | if (*outlen < (msglen - (2 + ps_len + 1))) { | ||
| 64 | *outlen = msglen - (2 + ps_len + 1); | ||
| 65 | return -EOVERFLOW; | ||
| 66 | } | ||
| 67 | |||
| 68 | *outlen = (msglen - (2 + ps_len + 1)); | 62 | *outlen = (msglen - (2 + ps_len + 1)); |
| 69 | memcpy(out, &msg[2 + ps_len + 1], *outlen); | ||
| 70 | 63 | ||
| 71 | return 0; | 64 | return msg + 2 + ps_len + 1; |
| 72 | } | 65 | } |
| 73 | 66 | ||
| 74 | /* | 67 | /* |
| @@ -83,7 +76,8 @@ static int digsig_verify_rsa(struct key *key, | |||
| 83 | unsigned long mlen, mblen; | 76 | unsigned long mlen, mblen; |
| 84 | unsigned nret, l; | 77 | unsigned nret, l; |
| 85 | int head, i; | 78 | int head, i; |
| 86 | unsigned char *out1 = NULL, *out2 = NULL; | 79 | unsigned char *out1 = NULL; |
| 80 | const char *m; | ||
| 87 | MPI in = NULL, res = NULL, pkey[2]; | 81 | MPI in = NULL, res = NULL, pkey[2]; |
| 88 | uint8_t *p, *datap, *endp; | 82 | uint8_t *p, *datap, *endp; |
| 89 | struct user_key_payload *ukp; | 83 | struct user_key_payload *ukp; |
| @@ -120,7 +114,7 @@ static int digsig_verify_rsa(struct key *key, | |||
| 120 | } | 114 | } |
| 121 | 115 | ||
| 122 | mblen = mpi_get_nbits(pkey[0]); | 116 | mblen = mpi_get_nbits(pkey[0]); |
| 123 | mlen = (mblen + 7)/8; | 117 | mlen = DIV_ROUND_UP(mblen, 8); |
| 124 | 118 | ||
| 125 | if (mlen == 0) | 119 | if (mlen == 0) |
| 126 | goto err; | 120 | goto err; |
| @@ -129,10 +123,6 @@ static int digsig_verify_rsa(struct key *key, | |||
| 129 | if (!out1) | 123 | if (!out1) |
| 130 | goto err; | 124 | goto err; |
| 131 | 125 | ||
| 132 | out2 = kzalloc(mlen, GFP_KERNEL); | ||
| 133 | if (!out2) | ||
| 134 | goto err; | ||
| 135 | |||
| 136 | nret = siglen; | 126 | nret = siglen; |
| 137 | in = mpi_read_from_buffer(sig, &nret); | 127 | in = mpi_read_from_buffer(sig, &nret); |
| 138 | if (!in) | 128 | if (!in) |
| @@ -162,18 +152,17 @@ static int digsig_verify_rsa(struct key *key, | |||
| 162 | memset(out1, 0, head); | 152 | memset(out1, 0, head); |
| 163 | memcpy(out1 + head, p, l); | 153 | memcpy(out1 + head, p, l); |
| 164 | 154 | ||
| 165 | err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); | 155 | kfree(p); |
| 166 | if (err) | 156 | |
| 167 | goto err; | 157 | m = pkcs_1_v1_5_decode_emsa(out1, len, mblen, &len); |
| 168 | 158 | ||
| 169 | if (len != hlen || memcmp(out2, h, hlen)) | 159 | if (!m || len != hlen || memcmp(m, h, hlen)) |
| 170 | err = -EINVAL; | 160 | err = -EINVAL; |
| 171 | 161 | ||
| 172 | err: | 162 | err: |
| 173 | mpi_free(in); | 163 | mpi_free(in); |
| 174 | mpi_free(res); | 164 | mpi_free(res); |
| 175 | kfree(out1); | 165 | kfree(out1); |
| 176 | kfree(out2); | ||
| 177 | while (--i >= 0) | 166 | while (--i >= 0) |
| 178 | mpi_free(pkey[i]); | 167 | mpi_free(pkey[i]); |
| 179 | err1: | 168 | err1: |
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 1db1fc660538..5276b99ca650 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c | |||
| @@ -59,7 +59,7 @@ struct ddebug_iter { | |||
| 59 | 59 | ||
| 60 | static DEFINE_MUTEX(ddebug_lock); | 60 | static DEFINE_MUTEX(ddebug_lock); |
| 61 | static LIST_HEAD(ddebug_tables); | 61 | static LIST_HEAD(ddebug_tables); |
| 62 | static int verbose = 0; | 62 | static int verbose; |
| 63 | module_param(verbose, int, 0644); | 63 | module_param(verbose, int, 0644); |
| 64 | 64 | ||
| 65 | /* Return the path relative to source root */ | 65 | /* Return the path relative to source root */ |
| @@ -100,24 +100,32 @@ static char *ddebug_describe_flags(struct _ddebug *dp, char *buf, | |||
| 100 | return buf; | 100 | return buf; |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | #define vpr_info(fmt, ...) \ | 103 | #define vpr_info(fmt, ...) \ |
| 104 | if (verbose) do { pr_info(fmt, ##__VA_ARGS__); } while (0) | ||
| 105 | |||
| 106 | #define vpr_info_dq(q, msg) \ | ||
| 107 | do { \ | 104 | do { \ |
| 108 | /* trim last char off format print */ \ | 105 | if (verbose) \ |
| 109 | vpr_info("%s: func=\"%s\" file=\"%s\" " \ | 106 | pr_info(fmt, ##__VA_ARGS__); \ |
| 110 | "module=\"%s\" format=\"%.*s\" " \ | ||
| 111 | "lineno=%u-%u", \ | ||
| 112 | msg, \ | ||
| 113 | q->function ? q->function : "", \ | ||
| 114 | q->filename ? q->filename : "", \ | ||
| 115 | q->module ? q->module : "", \ | ||
| 116 | (int)(q->format ? strlen(q->format) - 1 : 0), \ | ||
| 117 | q->format ? q->format : "", \ | ||
| 118 | q->first_lineno, q->last_lineno); \ | ||
| 119 | } while (0) | 107 | } while (0) |
| 120 | 108 | ||
| 109 | static void vpr_info_dq(const struct ddebug_query *query, const char *msg) | ||
| 110 | { | ||
| 111 | /* trim any trailing newlines */ | ||
| 112 | int fmtlen = 0; | ||
| 113 | |||
| 114 | if (query->format) { | ||
| 115 | fmtlen = strlen(query->format); | ||
| 116 | while (fmtlen && query->format[fmtlen - 1] == '\n') | ||
| 117 | fmtlen--; | ||
| 118 | } | ||
| 119 | |||
| 120 | vpr_info("%s: func=\"%s\" file=\"%s\" module=\"%s\" format=\"%.*s\" lineno=%u-%u\n", | ||
| 121 | msg, | ||
| 122 | query->function ? query->function : "", | ||
| 123 | query->filename ? query->filename : "", | ||
| 124 | query->module ? query->module : "", | ||
| 125 | fmtlen, query->format ? query->format : "", | ||
| 126 | query->first_lineno, query->last_lineno); | ||
| 127 | } | ||
| 128 | |||
| 121 | /* | 129 | /* |
| 122 | * Search the tables for _ddebug's which match the given `query' and | 130 | * Search the tables for _ddebug's which match the given `query' and |
| 123 | * apply the `flags' and `mask' to them. Returns number of matching | 131 | * apply the `flags' and `mask' to them. Returns number of matching |
| @@ -141,7 +149,7 @@ static int ddebug_change(const struct ddebug_query *query, | |||
| 141 | if (query->module && strcmp(query->module, dt->mod_name)) | 149 | if (query->module && strcmp(query->module, dt->mod_name)) |
| 142 | continue; | 150 | continue; |
| 143 | 151 | ||
| 144 | for (i = 0 ; i < dt->num_ddebugs ; i++) { | 152 | for (i = 0; i < dt->num_ddebugs; i++) { |
| 145 | struct _ddebug *dp = &dt->ddebugs[i]; | 153 | struct _ddebug *dp = &dt->ddebugs[i]; |
| 146 | 154 | ||
| 147 | /* match against the source filename */ | 155 | /* match against the source filename */ |
| @@ -176,10 +184,10 @@ static int ddebug_change(const struct ddebug_query *query, | |||
| 176 | continue; | 184 | continue; |
| 177 | dp->flags = newflags; | 185 | dp->flags = newflags; |
| 178 | vpr_info("changed %s:%d [%s]%s =%s\n", | 186 | vpr_info("changed %s:%d [%s]%s =%s\n", |
| 179 | trim_prefix(dp->filename), dp->lineno, | 187 | trim_prefix(dp->filename), dp->lineno, |
| 180 | dt->mod_name, dp->function, | 188 | dt->mod_name, dp->function, |
| 181 | ddebug_describe_flags(dp, flagbuf, | 189 | ddebug_describe_flags(dp, flagbuf, |
| 182 | sizeof(flagbuf))); | 190 | sizeof(flagbuf))); |
| 183 | } | 191 | } |
| 184 | } | 192 | } |
| 185 | mutex_unlock(&ddebug_lock); | 193 | mutex_unlock(&ddebug_lock); |
| @@ -213,19 +221,23 @@ static int ddebug_tokenize(char *buf, char *words[], int maxwords) | |||
| 213 | /* find `end' of word, whitespace separated or quoted */ | 221 | /* find `end' of word, whitespace separated or quoted */ |
| 214 | if (*buf == '"' || *buf == '\'') { | 222 | if (*buf == '"' || *buf == '\'') { |
| 215 | int quote = *buf++; | 223 | int quote = *buf++; |
| 216 | for (end = buf ; *end && *end != quote ; end++) | 224 | for (end = buf; *end && *end != quote; end++) |
| 217 | ; | 225 | ; |
| 218 | if (!*end) | 226 | if (!*end) { |
| 227 | pr_err("unclosed quote: %s\n", buf); | ||
| 219 | return -EINVAL; /* unclosed quote */ | 228 | return -EINVAL; /* unclosed quote */ |
| 229 | } | ||
| 220 | } else { | 230 | } else { |
| 221 | for (end = buf ; *end && !isspace(*end) ; end++) | 231 | for (end = buf; *end && !isspace(*end); end++) |
| 222 | ; | 232 | ; |
| 223 | BUG_ON(end == buf); | 233 | BUG_ON(end == buf); |
| 224 | } | 234 | } |
| 225 | 235 | ||
| 226 | /* `buf' is start of word, `end' is one past its end */ | 236 | /* `buf' is start of word, `end' is one past its end */ |
| 227 | if (nwords == maxwords) | 237 | if (nwords == maxwords) { |
| 238 | pr_err("too many words, legal max <=%d\n", maxwords); | ||
| 228 | return -EINVAL; /* ran out of words[] before bytes */ | 239 | return -EINVAL; /* ran out of words[] before bytes */ |
| 240 | } | ||
| 229 | if (*end) | 241 | if (*end) |
| 230 | *end++ = '\0'; /* terminate the word */ | 242 | *end++ = '\0'; /* terminate the word */ |
| 231 | words[nwords++] = buf; | 243 | words[nwords++] = buf; |
| @@ -235,7 +247,7 @@ static int ddebug_tokenize(char *buf, char *words[], int maxwords) | |||
| 235 | if (verbose) { | 247 | if (verbose) { |
| 236 | int i; | 248 | int i; |
| 237 | pr_info("split into words:"); | 249 | pr_info("split into words:"); |
| 238 | for (i = 0 ; i < nwords ; i++) | 250 | for (i = 0; i < nwords; i++) |
| 239 | pr_cont(" \"%s\"", words[i]); | 251 | pr_cont(" \"%s\"", words[i]); |
| 240 | pr_cont("\n"); | 252 | pr_cont("\n"); |
| 241 | } | 253 | } |
| @@ -257,7 +269,11 @@ static inline int parse_lineno(const char *str, unsigned int *val) | |||
| 257 | return 0; | 269 | return 0; |
| 258 | } | 270 | } |
| 259 | *val = simple_strtoul(str, &end, 10); | 271 | *val = simple_strtoul(str, &end, 10); |
| 260 | return end == NULL || end == str || *end != '\0' ? -EINVAL : 0; | 272 | if (end == NULL || end == str || *end != '\0') { |
| 273 | pr_err("bad line-number: %s\n", str); | ||
| 274 | return -EINVAL; | ||
| 275 | } | ||
| 276 | return 0; | ||
| 261 | } | 277 | } |
| 262 | 278 | ||
| 263 | /* | 279 | /* |
| @@ -286,11 +302,11 @@ static char *unescape(char *str) | |||
| 286 | in += 2; | 302 | in += 2; |
| 287 | continue; | 303 | continue; |
| 288 | } else if (isodigit(in[1]) && | 304 | } else if (isodigit(in[1]) && |
| 289 | isodigit(in[2]) && | 305 | isodigit(in[2]) && |
| 290 | isodigit(in[3])) { | 306 | isodigit(in[3])) { |
| 291 | *out++ = ((in[1] - '0')<<6) | | 307 | *out++ = (((in[1] - '0') << 6) | |
| 292 | ((in[2] - '0')<<3) | | 308 | ((in[2] - '0') << 3) | |
| 293 | (in[3] - '0'); | 309 | (in[3] - '0')); |
| 294 | in += 4; | 310 | in += 4; |
| 295 | continue; | 311 | continue; |
| 296 | } | 312 | } |
| @@ -308,8 +324,8 @@ static int check_set(const char **dest, char *src, char *name) | |||
| 308 | 324 | ||
| 309 | if (*dest) { | 325 | if (*dest) { |
| 310 | rc = -EINVAL; | 326 | rc = -EINVAL; |
| 311 | pr_err("match-spec:%s val:%s overridden by %s", | 327 | pr_err("match-spec:%s val:%s overridden by %s\n", |
| 312 | name, *dest, src); | 328 | name, *dest, src); |
| 313 | } | 329 | } |
| 314 | *dest = src; | 330 | *dest = src; |
| 315 | return rc; | 331 | return rc; |
| @@ -337,40 +353,46 @@ static int ddebug_parse_query(char *words[], int nwords, | |||
| 337 | int rc; | 353 | int rc; |
| 338 | 354 | ||
| 339 | /* check we have an even number of words */ | 355 | /* check we have an even number of words */ |
| 340 | if (nwords % 2 != 0) | 356 | if (nwords % 2 != 0) { |
| 357 | pr_err("expecting pairs of match-spec <value>\n"); | ||
| 341 | return -EINVAL; | 358 | return -EINVAL; |
| 359 | } | ||
| 342 | memset(query, 0, sizeof(*query)); | 360 | memset(query, 0, sizeof(*query)); |
| 343 | 361 | ||
| 344 | if (modname) | 362 | if (modname) |
| 345 | /* support $modname.dyndbg=<multiple queries> */ | 363 | /* support $modname.dyndbg=<multiple queries> */ |
| 346 | query->module = modname; | 364 | query->module = modname; |
| 347 | 365 | ||
| 348 | for (i = 0 ; i < nwords ; i += 2) { | 366 | for (i = 0; i < nwords; i += 2) { |
| 349 | if (!strcmp(words[i], "func")) | 367 | if (!strcmp(words[i], "func")) { |
| 350 | rc = check_set(&query->function, words[i+1], "func"); | 368 | rc = check_set(&query->function, words[i+1], "func"); |
| 351 | else if (!strcmp(words[i], "file")) | 369 | } else if (!strcmp(words[i], "file")) { |
| 352 | rc = check_set(&query->filename, words[i+1], "file"); | 370 | rc = check_set(&query->filename, words[i+1], "file"); |
| 353 | else if (!strcmp(words[i], "module")) | 371 | } else if (!strcmp(words[i], "module")) { |
| 354 | rc = check_set(&query->module, words[i+1], "module"); | 372 | rc = check_set(&query->module, words[i+1], "module"); |
| 355 | else if (!strcmp(words[i], "format")) | 373 | } else if (!strcmp(words[i], "format")) { |
| 356 | rc = check_set(&query->format, unescape(words[i+1]), | 374 | rc = check_set(&query->format, unescape(words[i+1]), |
| 357 | "format"); | 375 | "format"); |
| 358 | else if (!strcmp(words[i], "line")) { | 376 | } else if (!strcmp(words[i], "line")) { |
| 359 | char *first = words[i+1]; | 377 | char *first = words[i+1]; |
| 360 | char *last = strchr(first, '-'); | 378 | char *last = strchr(first, '-'); |
| 361 | if (query->first_lineno || query->last_lineno) { | 379 | if (query->first_lineno || query->last_lineno) { |
| 362 | pr_err("match-spec:line given 2 times\n"); | 380 | pr_err("match-spec: line used 2x\n"); |
| 363 | return -EINVAL; | 381 | return -EINVAL; |
| 364 | } | 382 | } |
| 365 | if (last) | 383 | if (last) |
| 366 | *last++ = '\0'; | 384 | *last++ = '\0'; |
| 367 | if (parse_lineno(first, &query->first_lineno) < 0) | 385 | if (parse_lineno(first, &query->first_lineno) < 0) { |
| 386 | pr_err("line-number is <0\n"); | ||
| 368 | return -EINVAL; | 387 | return -EINVAL; |
| 388 | } | ||
| 369 | if (last) { | 389 | if (last) { |
| 370 | /* range <first>-<last> */ | 390 | /* range <first>-<last> */ |
| 371 | if (parse_lineno(last, &query->last_lineno) | 391 | if (parse_lineno(last, &query->last_lineno) |
| 372 | < query->first_lineno) { | 392 | < query->first_lineno) { |
| 373 | pr_err("last-line < 1st-line\n"); | 393 | pr_err("last-line:%d < 1st-line:%d\n", |
| 394 | query->last_lineno, | ||
| 395 | query->first_lineno); | ||
| 374 | return -EINVAL; | 396 | return -EINVAL; |
| 375 | } | 397 | } |
| 376 | } else { | 398 | } else { |
| @@ -406,19 +428,22 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp, | |||
| 406 | op = *str++; | 428 | op = *str++; |
| 407 | break; | 429 | break; |
| 408 | default: | 430 | default: |
| 431 | pr_err("bad flag-op %c, at start of %s\n", *str, str); | ||
| 409 | return -EINVAL; | 432 | return -EINVAL; |
| 410 | } | 433 | } |
| 411 | vpr_info("op='%c'\n", op); | 434 | vpr_info("op='%c'\n", op); |
| 412 | 435 | ||
| 413 | for ( ; *str ; ++str) { | 436 | for (; *str ; ++str) { |
| 414 | for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) { | 437 | for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) { |
| 415 | if (*str == opt_array[i].opt_char) { | 438 | if (*str == opt_array[i].opt_char) { |
| 416 | flags |= opt_array[i].flag; | 439 | flags |= opt_array[i].flag; |
| 417 | break; | 440 | break; |
| 418 | } | 441 | } |
| 419 | } | 442 | } |
| 420 | if (i < 0) | 443 | if (i < 0) { |
| 444 | pr_err("unknown flag '%c' in \"%s\"\n", *str, str); | ||
| 421 | return -EINVAL; | 445 | return -EINVAL; |
| 446 | } | ||
| 422 | } | 447 | } |
| 423 | vpr_info("flags=0x%x\n", flags); | 448 | vpr_info("flags=0x%x\n", flags); |
| 424 | 449 | ||
| @@ -450,16 +475,22 @@ static int ddebug_exec_query(char *query_string, const char *modname) | |||
| 450 | char *words[MAXWORDS]; | 475 | char *words[MAXWORDS]; |
| 451 | 476 | ||
| 452 | nwords = ddebug_tokenize(query_string, words, MAXWORDS); | 477 | nwords = ddebug_tokenize(query_string, words, MAXWORDS); |
| 453 | if (nwords <= 0) | 478 | if (nwords <= 0) { |
| 479 | pr_err("tokenize failed\n"); | ||
| 454 | return -EINVAL; | 480 | return -EINVAL; |
| 455 | if (ddebug_parse_query(words, nwords-1, &query, modname)) | 481 | } |
| 482 | /* check flags 1st (last arg) so query is pairs of spec,val */ | ||
| 483 | if (ddebug_parse_flags(words[nwords-1], &flags, &mask)) { | ||
| 484 | pr_err("flags parse failed\n"); | ||
| 456 | return -EINVAL; | 485 | return -EINVAL; |
| 457 | if (ddebug_parse_flags(words[nwords-1], &flags, &mask)) | 486 | } |
| 487 | if (ddebug_parse_query(words, nwords-1, &query, modname)) { | ||
| 488 | pr_err("query parse failed\n"); | ||
| 458 | return -EINVAL; | 489 | return -EINVAL; |
| 459 | 490 | } | |
| 460 | /* actually go and implement the change */ | 491 | /* actually go and implement the change */ |
| 461 | nfound = ddebug_change(&query, flags, mask); | 492 | nfound = ddebug_change(&query, flags, mask); |
| 462 | vpr_info_dq((&query), (nfound) ? "applied" : "no-match"); | 493 | vpr_info_dq(&query, nfound ? "applied" : "no-match"); |
| 463 | 494 | ||
| 464 | return nfound; | 495 | return nfound; |
| 465 | } | 496 | } |
| @@ -488,8 +519,9 @@ static int ddebug_exec_queries(char *query, const char *modname) | |||
| 488 | if (rc < 0) { | 519 | if (rc < 0) { |
| 489 | errs++; | 520 | errs++; |
| 490 | exitcode = rc; | 521 | exitcode = rc; |
| 491 | } else | 522 | } else { |
| 492 | nfound += rc; | 523 | nfound += rc; |
| 524 | } | ||
| 493 | i++; | 525 | i++; |
| 494 | } | 526 | } |
| 495 | vpr_info("processed %d queries, with %d matches, %d errs\n", | 527 | vpr_info("processed %d queries, with %d matches, %d errs\n", |
| @@ -765,7 +797,7 @@ static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos) | |||
| 765 | struct _ddebug *dp; | 797 | struct _ddebug *dp; |
| 766 | 798 | ||
| 767 | vpr_info("called m=%p p=%p *pos=%lld\n", | 799 | vpr_info("called m=%p p=%p *pos=%lld\n", |
| 768 | m, p, (unsigned long long)*pos); | 800 | m, p, (unsigned long long)*pos); |
| 769 | 801 | ||
| 770 | if (p == SEQ_START_TOKEN) | 802 | if (p == SEQ_START_TOKEN) |
| 771 | dp = ddebug_iter_first(iter); | 803 | dp = ddebug_iter_first(iter); |
| @@ -791,14 +823,14 @@ static int ddebug_proc_show(struct seq_file *m, void *p) | |||
| 791 | 823 | ||
| 792 | if (p == SEQ_START_TOKEN) { | 824 | if (p == SEQ_START_TOKEN) { |
| 793 | seq_puts(m, | 825 | seq_puts(m, |
| 794 | "# filename:lineno [module]function flags format\n"); | 826 | "# filename:lineno [module]function flags format\n"); |
| 795 | return 0; | 827 | return 0; |
| 796 | } | 828 | } |
| 797 | 829 | ||
| 798 | seq_printf(m, "%s:%u [%s]%s =%s \"", | 830 | seq_printf(m, "%s:%u [%s]%s =%s \"", |
| 799 | trim_prefix(dp->filename), dp->lineno, | 831 | trim_prefix(dp->filename), dp->lineno, |
| 800 | iter->table->mod_name, dp->function, | 832 | iter->table->mod_name, dp->function, |
| 801 | ddebug_describe_flags(dp, flagsbuf, sizeof(flagsbuf))); | 833 | ddebug_describe_flags(dp, flagsbuf, sizeof(flagsbuf))); |
| 802 | seq_escape(m, dp->format, "\t\r\n\""); | 834 | seq_escape(m, dp->format, "\t\r\n\""); |
| 803 | seq_puts(m, "\"\n"); | 835 | seq_puts(m, "\"\n"); |
| 804 | 836 | ||
| @@ -845,7 +877,7 @@ static int ddebug_proc_open(struct inode *inode, struct file *file) | |||
| 845 | kfree(iter); | 877 | kfree(iter); |
| 846 | return err; | 878 | return err; |
| 847 | } | 879 | } |
| 848 | ((struct seq_file *) file->private_data)->private = iter; | 880 | ((struct seq_file *)file->private_data)->private = iter; |
| 849 | return 0; | 881 | return 0; |
| 850 | } | 882 | } |
| 851 | 883 | ||
| @@ -1002,8 +1034,7 @@ static int __init dynamic_debug_init(void) | |||
| 1002 | int verbose_bytes = 0; | 1034 | int verbose_bytes = 0; |
| 1003 | 1035 | ||
| 1004 | if (__start___verbose == __stop___verbose) { | 1036 | if (__start___verbose == __stop___verbose) { |
| 1005 | pr_warn("_ddebug table is empty in a " | 1037 | pr_warn("_ddebug table is empty in a CONFIG_DYNAMIC_DEBUG build\n"); |
| 1006 | "CONFIG_DYNAMIC_DEBUG build"); | ||
| 1007 | return 1; | 1038 | return 1; |
| 1008 | } | 1039 | } |
| 1009 | iter = __start___verbose; | 1040 | iter = __start___verbose; |
| @@ -1030,18 +1061,16 @@ static int __init dynamic_debug_init(void) | |||
| 1030 | goto out_err; | 1061 | goto out_err; |
| 1031 | 1062 | ||
| 1032 | ddebug_init_success = 1; | 1063 | ddebug_init_success = 1; |
| 1033 | vpr_info("%d modules, %d entries and %d bytes in ddebug tables," | 1064 | vpr_info("%d modules, %d entries and %d bytes in ddebug tables, %d bytes in (readonly) verbose section\n", |
| 1034 | " %d bytes in (readonly) verbose section\n", | 1065 | modct, entries, (int)(modct * sizeof(struct ddebug_table)), |
| 1035 | modct, entries, (int)( modct * sizeof(struct ddebug_table)), | 1066 | verbose_bytes + (int)(__stop___verbose - __start___verbose)); |
| 1036 | verbose_bytes + (int)(__stop___verbose - __start___verbose)); | ||
| 1037 | 1067 | ||
| 1038 | /* apply ddebug_query boot param, dont unload tables on err */ | 1068 | /* apply ddebug_query boot param, dont unload tables on err */ |
| 1039 | if (ddebug_setup_string[0] != '\0') { | 1069 | if (ddebug_setup_string[0] != '\0') { |
| 1040 | pr_warn("ddebug_query param name is deprecated," | 1070 | pr_warn("ddebug_query param name is deprecated, change it to dyndbg\n"); |
| 1041 | " change it to dyndbg\n"); | ||
| 1042 | ret = ddebug_exec_queries(ddebug_setup_string, NULL); | 1071 | ret = ddebug_exec_queries(ddebug_setup_string, NULL); |
| 1043 | if (ret < 0) | 1072 | if (ret < 0) |
| 1044 | pr_warn("Invalid ddebug boot param %s", | 1073 | pr_warn("Invalid ddebug boot param %s\n", |
| 1045 | ddebug_setup_string); | 1074 | ddebug_setup_string); |
| 1046 | else | 1075 | else |
| 1047 | pr_info("%d changes by ddebug_query\n", ret); | 1076 | pr_info("%d changes by ddebug_query\n", ret); |
diff --git a/lib/hexdump.c b/lib/hexdump.c index 6540d657dca4..3f0494c9d57a 100644 --- a/lib/hexdump.c +++ b/lib/hexdump.c | |||
| @@ -227,6 +227,7 @@ void print_hex_dump(const char *level, const char *prefix_str, int prefix_type, | |||
| 227 | } | 227 | } |
| 228 | EXPORT_SYMBOL(print_hex_dump); | 228 | EXPORT_SYMBOL(print_hex_dump); |
| 229 | 229 | ||
| 230 | #if !defined(CONFIG_DYNAMIC_DEBUG) | ||
| 230 | /** | 231 | /** |
| 231 | * print_hex_dump_bytes - shorthand form of print_hex_dump() with default params | 232 | * print_hex_dump_bytes - shorthand form of print_hex_dump() with default params |
| 232 | * @prefix_str: string to prefix each line with; | 233 | * @prefix_str: string to prefix each line with; |
| @@ -246,4 +247,5 @@ void print_hex_dump_bytes(const char *prefix_str, int prefix_type, | |||
| 246 | buf, len, true); | 247 | buf, len, true); |
| 247 | } | 248 | } |
| 248 | EXPORT_SYMBOL(print_hex_dump_bytes); | 249 | EXPORT_SYMBOL(print_hex_dump_bytes); |
| 249 | #endif | 250 | #endif /* !defined(CONFIG_DYNAMIC_DEBUG) */ |
| 251 | #endif /* defined(CONFIG_PRINTK) */ | ||
diff --git a/lib/mpi/mpi-internal.h b/lib/mpi/mpi-internal.h index 77adcf6bc257..60cf765628e9 100644 --- a/lib/mpi/mpi-internal.h +++ b/lib/mpi/mpi-internal.h | |||
| @@ -65,10 +65,6 @@ | |||
| 65 | typedef mpi_limb_t *mpi_ptr_t; /* pointer to a limb */ | 65 | typedef mpi_limb_t *mpi_ptr_t; /* pointer to a limb */ |
| 66 | typedef int mpi_size_t; /* (must be a signed type) */ | 66 | typedef int mpi_size_t; /* (must be a signed type) */ |
| 67 | 67 | ||
| 68 | #define ABS(x) (x >= 0 ? x : -x) | ||
| 69 | #define MIN(l, o) ((l) < (o) ? (l) : (o)) | ||
| 70 | #define MAX(h, i) ((h) > (i) ? (h) : (i)) | ||
| 71 | |||
| 72 | static inline int RESIZE_IF_NEEDED(MPI a, unsigned b) | 68 | static inline int RESIZE_IF_NEEDED(MPI a, unsigned b) |
| 73 | { | 69 | { |
| 74 | if (a->alloced < b) | 70 | if (a->alloced < b) |
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index 3962b7f7fe3f..5f9c44cdf1f5 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c | |||
| @@ -52,7 +52,7 @@ MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes) | |||
| 52 | else | 52 | else |
| 53 | nbits = 0; | 53 | nbits = 0; |
| 54 | 54 | ||
| 55 | nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; | 55 | nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB); |
| 56 | val = mpi_alloc(nlimbs); | 56 | val = mpi_alloc(nlimbs); |
| 57 | if (!val) | 57 | if (!val) |
| 58 | return NULL; | 58 | return NULL; |
| @@ -96,8 +96,8 @@ MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread) | |||
| 96 | buffer += 2; | 96 | buffer += 2; |
| 97 | nread = 2; | 97 | nread = 2; |
| 98 | 98 | ||
| 99 | nbytes = (nbits + 7) / 8; | 99 | nbytes = DIV_ROUND_UP(nbits, 8); |
| 100 | nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; | 100 | nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB); |
| 101 | val = mpi_alloc(nlimbs); | 101 | val = mpi_alloc(nlimbs); |
| 102 | if (!val) | 102 | if (!val) |
| 103 | return NULL; | 103 | return NULL; |
| @@ -193,7 +193,7 @@ int mpi_set_buffer(MPI a, const void *xbuffer, unsigned nbytes, int sign) | |||
| 193 | int nlimbs; | 193 | int nlimbs; |
| 194 | int i; | 194 | int i; |
| 195 | 195 | ||
| 196 | nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; | 196 | nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB); |
| 197 | if (RESIZE_IF_NEEDED(a, nlimbs) < 0) | 197 | if (RESIZE_IF_NEEDED(a, nlimbs) < 0) |
| 198 | return -ENOMEM; | 198 | return -ENOMEM; |
| 199 | a->sign = sign; | 199 | a->sign = sign; |
diff --git a/lib/parser.c b/lib/parser.c index 52cfa69f73df..807b2aaa33fa 100644 --- a/lib/parser.c +++ b/lib/parser.c | |||
| @@ -157,7 +157,7 @@ static int match_number(substring_t *s, int *result, int base) | |||
| 157 | * | 157 | * |
| 158 | * Description: Attempts to parse the &substring_t @s as a decimal integer. On | 158 | * Description: Attempts to parse the &substring_t @s as a decimal integer. On |
| 159 | * success, sets @result to the integer represented by the string and returns 0. | 159 | * success, sets @result to the integer represented by the string and returns 0. |
| 160 | * Returns either -ENOMEM or -EINVAL on failure. | 160 | * Returns -ENOMEM, -EINVAL, or -ERANGE on failure. |
| 161 | */ | 161 | */ |
| 162 | int match_int(substring_t *s, int *result) | 162 | int match_int(substring_t *s, int *result) |
| 163 | { | 163 | { |
| @@ -171,7 +171,7 @@ int match_int(substring_t *s, int *result) | |||
| 171 | * | 171 | * |
| 172 | * Description: Attempts to parse the &substring_t @s as an octal integer. On | 172 | * Description: Attempts to parse the &substring_t @s as an octal integer. On |
| 173 | * success, sets @result to the integer represented by the string and returns | 173 | * success, sets @result to the integer represented by the string and returns |
| 174 | * 0. Returns either -ENOMEM or -EINVAL on failure. | 174 | * 0. Returns -ENOMEM, -EINVAL, or -ERANGE on failure. |
| 175 | */ | 175 | */ |
| 176 | int match_octal(substring_t *s, int *result) | 176 | int match_octal(substring_t *s, int *result) |
| 177 | { | 177 | { |
| @@ -185,7 +185,7 @@ int match_octal(substring_t *s, int *result) | |||
| 185 | * | 185 | * |
| 186 | * Description: Attempts to parse the &substring_t @s as a hexadecimal integer. | 186 | * Description: Attempts to parse the &substring_t @s as a hexadecimal integer. |
| 187 | * On success, sets @result to the integer represented by the string and | 187 | * On success, sets @result to the integer represented by the string and |
| 188 | * returns 0. Returns either -ENOMEM or -EINVAL on failure. | 188 | * returns 0. Returns -ENOMEM, -EINVAL, or -ERANGE on failure. |
| 189 | */ | 189 | */ |
| 190 | int match_hex(substring_t *s, int *result) | 190 | int match_hex(substring_t *s, int *result) |
| 191 | { | 191 | { |
diff --git a/lib/rbtree.c b/lib/rbtree.c index 4f56a11d67fa..c0e31fe2fabf 100644 --- a/lib/rbtree.c +++ b/lib/rbtree.c | |||
| @@ -194,8 +194,12 @@ __rb_insert(struct rb_node *node, struct rb_root *root, | |||
| 194 | } | 194 | } |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | __always_inline void | 197 | /* |
| 198 | __rb_erase_color(struct rb_node *parent, struct rb_root *root, | 198 | * Inline version for rb_erase() use - we want to be able to inline |
| 199 | * and eliminate the dummy_rotate callback there | ||
| 200 | */ | ||
| 201 | static __always_inline void | ||
| 202 | ____rb_erase_color(struct rb_node *parent, struct rb_root *root, | ||
| 199 | void (*augment_rotate)(struct rb_node *old, struct rb_node *new)) | 203 | void (*augment_rotate)(struct rb_node *old, struct rb_node *new)) |
| 200 | { | 204 | { |
| 201 | struct rb_node *node = NULL, *sibling, *tmp1, *tmp2; | 205 | struct rb_node *node = NULL, *sibling, *tmp1, *tmp2; |
| @@ -355,6 +359,13 @@ __rb_erase_color(struct rb_node *parent, struct rb_root *root, | |||
| 355 | } | 359 | } |
| 356 | } | 360 | } |
| 357 | } | 361 | } |
| 362 | |||
| 363 | /* Non-inline version for rb_erase_augmented() use */ | ||
| 364 | void __rb_erase_color(struct rb_node *parent, struct rb_root *root, | ||
| 365 | void (*augment_rotate)(struct rb_node *old, struct rb_node *new)) | ||
| 366 | { | ||
| 367 | ____rb_erase_color(parent, root, augment_rotate); | ||
| 368 | } | ||
| 358 | EXPORT_SYMBOL(__rb_erase_color); | 369 | EXPORT_SYMBOL(__rb_erase_color); |
| 359 | 370 | ||
| 360 | /* | 371 | /* |
| @@ -380,7 +391,10 @@ EXPORT_SYMBOL(rb_insert_color); | |||
| 380 | 391 | ||
| 381 | void rb_erase(struct rb_node *node, struct rb_root *root) | 392 | void rb_erase(struct rb_node *node, struct rb_root *root) |
| 382 | { | 393 | { |
| 383 | rb_erase_augmented(node, root, &dummy_callbacks); | 394 | struct rb_node *rebalance; |
| 395 | rebalance = __rb_erase_augmented(node, root, &dummy_callbacks); | ||
| 396 | if (rebalance) | ||
| 397 | ____rb_erase_color(rebalance, root, dummy_rotate); | ||
| 384 | } | 398 | } |
| 385 | EXPORT_SYMBOL(rb_erase); | 399 | EXPORT_SYMBOL(rb_erase); |
| 386 | 400 | ||
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index fab33a9c5318..0d62fd700f68 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
| @@ -1030,6 +1030,7 @@ int kptr_restrict __read_mostly; | |||
| 1030 | * N no separator | 1030 | * N no separator |
| 1031 | * The maximum supported length is 64 bytes of the input. Consider | 1031 | * The maximum supported length is 64 bytes of the input. Consider |
| 1032 | * to use print_hex_dump() for the larger input. | 1032 | * to use print_hex_dump() for the larger input. |
| 1033 | * - 'a' For a phys_addr_t type and its derivative types (passed by reference) | ||
| 1033 | * | 1034 | * |
| 1034 | * Note: The difference between 'S' and 'F' is that on ia64 and ppc64 | 1035 | * Note: The difference between 'S' and 'F' is that on ia64 and ppc64 |
| 1035 | * function pointers are really function descriptors, which contain a | 1036 | * function pointers are really function descriptors, which contain a |
| @@ -1120,6 +1121,12 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, | |||
| 1120 | return netdev_feature_string(buf, end, ptr, spec); | 1121 | return netdev_feature_string(buf, end, ptr, spec); |
| 1121 | } | 1122 | } |
| 1122 | break; | 1123 | break; |
| 1124 | case 'a': | ||
| 1125 | spec.flags |= SPECIAL | SMALL | ZEROPAD; | ||
| 1126 | spec.field_width = sizeof(phys_addr_t) * 2 + 2; | ||
| 1127 | spec.base = 16; | ||
| 1128 | return number(buf, end, | ||
| 1129 | (unsigned long long) *((phys_addr_t *)ptr), spec); | ||
| 1123 | } | 1130 | } |
| 1124 | spec.flags |= SMALL; | 1131 | spec.flags |= SMALL; |
| 1125 | if (spec.field_width == -1) { | 1132 | if (spec.field_width == -1) { |
diff --git a/lib/xz/Kconfig b/lib/xz/Kconfig index 60a6088d0e5e..82a04d7ba99e 100644 --- a/lib/xz/Kconfig +++ b/lib/xz/Kconfig | |||
| @@ -6,42 +6,40 @@ config XZ_DEC | |||
| 6 | the .xz file format as the container. For integrity checking, | 6 | the .xz file format as the container. For integrity checking, |
| 7 | CRC32 is supported. See Documentation/xz.txt for more information. | 7 | CRC32 is supported. See Documentation/xz.txt for more information. |
| 8 | 8 | ||
| 9 | if XZ_DEC | ||
| 10 | |||
| 9 | config XZ_DEC_X86 | 11 | config XZ_DEC_X86 |
| 10 | bool "x86 BCJ filter decoder" if EXPERT | 12 | bool "x86 BCJ filter decoder" |
| 11 | default y | 13 | default y if X86 |
| 12 | depends on XZ_DEC | ||
| 13 | select XZ_DEC_BCJ | 14 | select XZ_DEC_BCJ |
| 14 | 15 | ||
| 15 | config XZ_DEC_POWERPC | 16 | config XZ_DEC_POWERPC |
| 16 | bool "PowerPC BCJ filter decoder" if EXPERT | 17 | bool "PowerPC BCJ filter decoder" |
| 17 | default y | 18 | default y if POWERPC |
| 18 | depends on XZ_DEC | ||
| 19 | select XZ_DEC_BCJ | 19 | select XZ_DEC_BCJ |
| 20 | 20 | ||
| 21 | config XZ_DEC_IA64 | 21 | config XZ_DEC_IA64 |
| 22 | bool "IA-64 BCJ filter decoder" if EXPERT | 22 | bool "IA-64 BCJ filter decoder" |
| 23 | default y | 23 | default y if IA64 |
| 24 | depends on XZ_DEC | ||
| 25 | select XZ_DEC_BCJ | 24 | select XZ_DEC_BCJ |
| 26 | 25 | ||
| 27 | config XZ_DEC_ARM | 26 | config XZ_DEC_ARM |
| 28 | bool "ARM BCJ filter decoder" if EXPERT | 27 | bool "ARM BCJ filter decoder" |
| 29 | default y | 28 | default y if ARM |
| 30 | depends on XZ_DEC | ||
| 31 | select XZ_DEC_BCJ | 29 | select XZ_DEC_BCJ |
| 32 | 30 | ||
| 33 | config XZ_DEC_ARMTHUMB | 31 | config XZ_DEC_ARMTHUMB |
| 34 | bool "ARM-Thumb BCJ filter decoder" if EXPERT | 32 | bool "ARM-Thumb BCJ filter decoder" |
| 35 | default y | 33 | default y if (ARM && ARM_THUMB) |
| 36 | depends on XZ_DEC | ||
| 37 | select XZ_DEC_BCJ | 34 | select XZ_DEC_BCJ |
| 38 | 35 | ||
| 39 | config XZ_DEC_SPARC | 36 | config XZ_DEC_SPARC |
| 40 | bool "SPARC BCJ filter decoder" if EXPERT | 37 | bool "SPARC BCJ filter decoder" |
| 41 | default y | 38 | default y if SPARC |
| 42 | depends on XZ_DEC | ||
| 43 | select XZ_DEC_BCJ | 39 | select XZ_DEC_BCJ |
| 44 | 40 | ||
| 41 | endif | ||
| 42 | |||
| 45 | config XZ_DEC_BCJ | 43 | config XZ_DEC_BCJ |
| 46 | bool | 44 | bool |
| 47 | default n | 45 | default n |
