diff options
Diffstat (limited to 'arch/arm')
51 files changed, 582 insertions, 629 deletions
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 299bc0468702..64cf480b0b02 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -8,7 +8,7 @@ | |||
8 | # Copyright (C) 1995-2001 by Russell King | 8 | # Copyright (C) 1995-2001 by Russell King |
9 | 9 | ||
10 | LDFLAGS_vmlinux :=-p --no-undefined -X | 10 | LDFLAGS_vmlinux :=-p --no-undefined -X |
11 | CPPFLAGS_vmlinux.lds = -DTEXTADDR=$(TEXTADDR) -DDATAADDR=$(DATAADDR) | 11 | CPPFLAGS_vmlinux.lds = -DKERNEL_RAM_ADDR=$(TEXTADDR) |
12 | OBJCOPYFLAGS :=-O binary -R .note -R .comment -S | 12 | OBJCOPYFLAGS :=-O binary -R .note -R .comment -S |
13 | GZFLAGS :=-9 | 13 | GZFLAGS :=-9 |
14 | #CFLAGS +=-pipe | 14 | #CFLAGS +=-pipe |
@@ -108,27 +108,19 @@ export CFLAGS_3c589_cs.o | |||
108 | endif | 108 | endif |
109 | 109 | ||
110 | TEXTADDR := $(textaddr-y) | 110 | TEXTADDR := $(textaddr-y) |
111 | ifeq ($(CONFIG_XIP_KERNEL),y) | ||
112 | DATAADDR := $(TEXTADDR) | ||
113 | xipaddr-$(CONFIG_ARCH_CO285) := 0x5f000000 | ||
114 | xipaddr-y ?= 0xbf000000 | ||
115 | # Replace phys addr with virt addr while keeping offset from base. | ||
116 | TEXTADDR := $(shell echo $(CONFIG_XIP_PHYS_ADDR) $(xipaddr-y) | \ | ||
117 | awk --non-decimal-data '/[:xdigit:]/ \ | ||
118 | { printf("0x%x\n", and($$1, 0x000fffff) + $$2) }' ) | ||
119 | endif | ||
120 | 111 | ||
121 | ifeq ($(incdir-y),) | 112 | ifeq ($(incdir-y),) |
122 | incdir-y := $(machine-y) | 113 | incdir-y := $(machine-y) |
123 | endif | 114 | endif |
124 | INCDIR := arch-$(incdir-y) | 115 | INCDIR := arch-$(incdir-y) |
116 | |||
125 | ifneq ($(machine-y),) | 117 | ifneq ($(machine-y),) |
126 | MACHINE := arch/arm/mach-$(machine-y)/ | 118 | MACHINE := arch/arm/mach-$(machine-y)/ |
127 | else | 119 | else |
128 | MACHINE := | 120 | MACHINE := |
129 | endif | 121 | endif |
130 | 122 | ||
131 | export TEXTADDR DATAADDR GZFLAGS | 123 | export TEXTADDR GZFLAGS |
132 | 124 | ||
133 | # Do we have FASTFPE? | 125 | # Do we have FASTFPE? |
134 | FASTFPE :=arch/arm/fastfpe | 126 | FASTFPE :=arch/arm/fastfpe |
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c index 23434b56786a..50f13eec6cd7 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c | |||
@@ -30,7 +30,7 @@ unsigned int __machine_arch_type; | |||
30 | #define putstr icedcc_putstr | 30 | #define putstr icedcc_putstr |
31 | #define putc icedcc_putc | 31 | #define putc icedcc_putc |
32 | 32 | ||
33 | extern void idedcc_putc(int ch); | 33 | extern void icedcc_putc(int ch); |
34 | 34 | ||
35 | static void | 35 | static void |
36 | icedcc_putstr(const char *ptr) | 36 | icedcc_putstr(const char *ptr) |
diff --git a/arch/arm/common/amba.c b/arch/arm/common/amba.c index c6beb751f2a9..e1013112c354 100644 --- a/arch/arm/common/amba.c +++ b/arch/arm/common/amba.c | |||
@@ -10,6 +10,8 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
13 | #include <linux/string.h> | ||
14 | #include <linux/slab.h> | ||
13 | 15 | ||
14 | #include <asm/io.h> | 16 | #include <asm/io.h> |
15 | #include <asm/irq.h> | 17 | #include <asm/irq.h> |
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index cbf2165476b0..ad6c89a555bb 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
@@ -33,8 +33,8 @@ | |||
33 | #include <asm/cacheflush.h> | 33 | #include <asm/cacheflush.h> |
34 | 34 | ||
35 | #undef DEBUG | 35 | #undef DEBUG |
36 | |||
37 | #undef STATS | 36 | #undef STATS |
37 | |||
38 | #ifdef STATS | 38 | #ifdef STATS |
39 | #define DO_STATS(X) do { X ; } while (0) | 39 | #define DO_STATS(X) do { X ; } while (0) |
40 | #else | 40 | #else |
@@ -52,26 +52,31 @@ struct safe_buffer { | |||
52 | int direction; | 52 | int direction; |
53 | 53 | ||
54 | /* safe buffer info */ | 54 | /* safe buffer info */ |
55 | struct dma_pool *pool; | 55 | struct dmabounce_pool *pool; |
56 | void *safe; | 56 | void *safe; |
57 | dma_addr_t safe_dma_addr; | 57 | dma_addr_t safe_dma_addr; |
58 | }; | 58 | }; |
59 | 59 | ||
60 | struct dmabounce_pool { | ||
61 | unsigned long size; | ||
62 | struct dma_pool *pool; | ||
63 | #ifdef STATS | ||
64 | unsigned long allocs; | ||
65 | #endif | ||
66 | }; | ||
67 | |||
60 | struct dmabounce_device_info { | 68 | struct dmabounce_device_info { |
61 | struct list_head node; | 69 | struct list_head node; |
62 | 70 | ||
63 | struct device *dev; | 71 | struct device *dev; |
64 | struct dma_pool *small_buffer_pool; | ||
65 | struct dma_pool *large_buffer_pool; | ||
66 | struct list_head safe_buffers; | 72 | struct list_head safe_buffers; |
67 | unsigned long small_buffer_size, large_buffer_size; | ||
68 | #ifdef STATS | 73 | #ifdef STATS |
69 | unsigned long sbp_allocs; | ||
70 | unsigned long lbp_allocs; | ||
71 | unsigned long total_allocs; | 74 | unsigned long total_allocs; |
72 | unsigned long map_op_count; | 75 | unsigned long map_op_count; |
73 | unsigned long bounce_count; | 76 | unsigned long bounce_count; |
74 | #endif | 77 | #endif |
78 | struct dmabounce_pool small; | ||
79 | struct dmabounce_pool large; | ||
75 | }; | 80 | }; |
76 | 81 | ||
77 | static LIST_HEAD(dmabounce_devs); | 82 | static LIST_HEAD(dmabounce_devs); |
@@ -82,9 +87,9 @@ static void print_alloc_stats(struct dmabounce_device_info *device_info) | |||
82 | printk(KERN_INFO | 87 | printk(KERN_INFO |
83 | "%s: dmabounce: sbp: %lu, lbp: %lu, other: %lu, total: %lu\n", | 88 | "%s: dmabounce: sbp: %lu, lbp: %lu, other: %lu, total: %lu\n", |
84 | device_info->dev->bus_id, | 89 | device_info->dev->bus_id, |
85 | device_info->sbp_allocs, device_info->lbp_allocs, | 90 | device_info->small.allocs, device_info->large.allocs, |
86 | device_info->total_allocs - device_info->sbp_allocs - | 91 | device_info->total_allocs - device_info->small.allocs - |
87 | device_info->lbp_allocs, | 92 | device_info->large.allocs, |
88 | device_info->total_allocs); | 93 | device_info->total_allocs); |
89 | } | 94 | } |
90 | #endif | 95 | #endif |
@@ -106,18 +111,22 @@ find_dmabounce_dev(struct device *dev) | |||
106 | /* allocate a 'safe' buffer and keep track of it */ | 111 | /* allocate a 'safe' buffer and keep track of it */ |
107 | static inline struct safe_buffer * | 112 | static inline struct safe_buffer * |
108 | alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr, | 113 | alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr, |
109 | size_t size, enum dma_data_direction dir) | 114 | size_t size, enum dma_data_direction dir) |
110 | { | 115 | { |
111 | struct safe_buffer *buf; | 116 | struct safe_buffer *buf; |
112 | struct dma_pool *pool; | 117 | struct dmabounce_pool *pool; |
113 | struct device *dev = device_info->dev; | 118 | struct device *dev = device_info->dev; |
114 | void *safe; | ||
115 | dma_addr_t safe_dma_addr; | ||
116 | 119 | ||
117 | dev_dbg(dev, "%s(ptr=%p, size=%d, dir=%d)\n", | 120 | dev_dbg(dev, "%s(ptr=%p, size=%d, dir=%d)\n", |
118 | __func__, ptr, size, dir); | 121 | __func__, ptr, size, dir); |
119 | 122 | ||
120 | DO_STATS ( device_info->total_allocs++ ); | 123 | if (size <= device_info->small.size) { |
124 | pool = &device_info->small; | ||
125 | } else if (size <= device_info->large.size) { | ||
126 | pool = &device_info->large; | ||
127 | } else { | ||
128 | pool = NULL; | ||
129 | } | ||
121 | 130 | ||
122 | buf = kmalloc(sizeof(struct safe_buffer), GFP_ATOMIC); | 131 | buf = kmalloc(sizeof(struct safe_buffer), GFP_ATOMIC); |
123 | if (buf == NULL) { | 132 | if (buf == NULL) { |
@@ -125,41 +134,35 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr, | |||
125 | return NULL; | 134 | return NULL; |
126 | } | 135 | } |
127 | 136 | ||
128 | if (size <= device_info->small_buffer_size) { | 137 | buf->ptr = ptr; |
129 | pool = device_info->small_buffer_pool; | 138 | buf->size = size; |
130 | safe = dma_pool_alloc(pool, GFP_ATOMIC, &safe_dma_addr); | 139 | buf->direction = dir; |
131 | 140 | buf->pool = pool; | |
132 | DO_STATS ( device_info->sbp_allocs++ ); | ||
133 | } else if (size <= device_info->large_buffer_size) { | ||
134 | pool = device_info->large_buffer_pool; | ||
135 | safe = dma_pool_alloc(pool, GFP_ATOMIC, &safe_dma_addr); | ||
136 | 141 | ||
137 | DO_STATS ( device_info->lbp_allocs++ ); | 142 | if (pool) { |
143 | buf->safe = dma_pool_alloc(pool->pool, GFP_ATOMIC, | ||
144 | &buf->safe_dma_addr); | ||
138 | } else { | 145 | } else { |
139 | pool = NULL; | 146 | buf->safe = dma_alloc_coherent(dev, size, &buf->safe_dma_addr, |
140 | safe = dma_alloc_coherent(dev, size, &safe_dma_addr, GFP_ATOMIC); | 147 | GFP_ATOMIC); |
141 | } | 148 | } |
142 | 149 | ||
143 | if (safe == NULL) { | 150 | if (buf->safe == NULL) { |
144 | dev_warn(device_info->dev, | 151 | dev_warn(dev, |
145 | "%s: could not alloc dma memory (size=%d)\n", | 152 | "%s: could not alloc dma memory (size=%d)\n", |
146 | __func__, size); | 153 | __func__, size); |
147 | kfree(buf); | 154 | kfree(buf); |
148 | return NULL; | 155 | return NULL; |
149 | } | 156 | } |
150 | 157 | ||
151 | #ifdef STATS | 158 | #ifdef STATS |
159 | if (pool) | ||
160 | pool->allocs++; | ||
161 | device_info->total_allocs++; | ||
152 | if (device_info->total_allocs % 1000 == 0) | 162 | if (device_info->total_allocs % 1000 == 0) |
153 | print_alloc_stats(device_info); | 163 | print_alloc_stats(device_info); |
154 | #endif | 164 | #endif |
155 | 165 | ||
156 | buf->ptr = ptr; | ||
157 | buf->size = size; | ||
158 | buf->direction = dir; | ||
159 | buf->pool = pool; | ||
160 | buf->safe = safe; | ||
161 | buf->safe_dma_addr = safe_dma_addr; | ||
162 | |||
163 | list_add(&buf->node, &device_info->safe_buffers); | 166 | list_add(&buf->node, &device_info->safe_buffers); |
164 | 167 | ||
165 | return buf; | 168 | return buf; |
@@ -186,7 +189,7 @@ free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer * | |||
186 | list_del(&buf->node); | 189 | list_del(&buf->node); |
187 | 190 | ||
188 | if (buf->pool) | 191 | if (buf->pool) |
189 | dma_pool_free(buf->pool, buf->safe, buf->safe_dma_addr); | 192 | dma_pool_free(buf->pool->pool, buf->safe, buf->safe_dma_addr); |
190 | else | 193 | else |
191 | dma_free_coherent(device_info->dev, buf->size, buf->safe, | 194 | dma_free_coherent(device_info->dev, buf->size, buf->safe, |
192 | buf->safe_dma_addr); | 195 | buf->safe_dma_addr); |
@@ -197,12 +200,10 @@ free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer * | |||
197 | /* ************************************************** */ | 200 | /* ************************************************** */ |
198 | 201 | ||
199 | #ifdef STATS | 202 | #ifdef STATS |
200 | |||
201 | static void print_map_stats(struct dmabounce_device_info *device_info) | 203 | static void print_map_stats(struct dmabounce_device_info *device_info) |
202 | { | 204 | { |
203 | printk(KERN_INFO | 205 | dev_info(device_info->dev, |
204 | "%s: dmabounce: map_op_count=%lu, bounce_count=%lu\n", | 206 | "dmabounce: map_op_count=%lu, bounce_count=%lu\n", |
205 | device_info->dev->bus_id, | ||
206 | device_info->map_op_count, device_info->bounce_count); | 207 | device_info->map_op_count, device_info->bounce_count); |
207 | } | 208 | } |
208 | #endif | 209 | #endif |
@@ -258,13 +259,13 @@ map_single(struct device *dev, void *ptr, size_t size, | |||
258 | __func__, ptr, buf->safe, size); | 259 | __func__, ptr, buf->safe, size); |
259 | memcpy(buf->safe, ptr, size); | 260 | memcpy(buf->safe, ptr, size); |
260 | } | 261 | } |
261 | consistent_sync(buf->safe, size, dir); | 262 | ptr = buf->safe; |
262 | 263 | ||
263 | dma_addr = buf->safe_dma_addr; | 264 | dma_addr = buf->safe_dma_addr; |
264 | } else { | ||
265 | consistent_sync(ptr, size, dir); | ||
266 | } | 265 | } |
267 | 266 | ||
267 | consistent_sync(ptr, size, dir); | ||
268 | |||
268 | return dma_addr; | 269 | return dma_addr; |
269 | } | 270 | } |
270 | 271 | ||
@@ -278,7 +279,7 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
278 | /* | 279 | /* |
279 | * Trying to unmap an invalid mapping | 280 | * Trying to unmap an invalid mapping |
280 | */ | 281 | */ |
281 | if (dma_addr == ~0) { | 282 | if (dma_mapping_error(dma_addr)) { |
282 | dev_err(dev, "Trying to unmap invalid mapping\n"); | 283 | dev_err(dev, "Trying to unmap invalid mapping\n"); |
283 | return; | 284 | return; |
284 | } | 285 | } |
@@ -570,11 +571,25 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, | |||
570 | local_irq_restore(flags); | 571 | local_irq_restore(flags); |
571 | } | 572 | } |
572 | 573 | ||
574 | static int | ||
575 | dmabounce_init_pool(struct dmabounce_pool *pool, struct device *dev, const char *name, | ||
576 | unsigned long size) | ||
577 | { | ||
578 | pool->size = size; | ||
579 | DO_STATS(pool->allocs = 0); | ||
580 | pool->pool = dma_pool_create(name, dev, size, | ||
581 | 0 /* byte alignment */, | ||
582 | 0 /* no page-crossing issues */); | ||
583 | |||
584 | return pool->pool ? 0 : -ENOMEM; | ||
585 | } | ||
586 | |||
573 | int | 587 | int |
574 | dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, | 588 | dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, |
575 | unsigned long large_buffer_size) | 589 | unsigned long large_buffer_size) |
576 | { | 590 | { |
577 | struct dmabounce_device_info *device_info; | 591 | struct dmabounce_device_info *device_info; |
592 | int ret; | ||
578 | 593 | ||
579 | device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC); | 594 | device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC); |
580 | if (!device_info) { | 595 | if (!device_info) { |
@@ -584,45 +599,31 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, | |||
584 | return -ENOMEM; | 599 | return -ENOMEM; |
585 | } | 600 | } |
586 | 601 | ||
587 | device_info->small_buffer_pool = | 602 | ret = dmabounce_init_pool(&device_info->small, dev, |
588 | dma_pool_create("small_dmabounce_pool", | 603 | "small_dmabounce_pool", small_buffer_size); |
589 | dev, | 604 | if (ret) { |
590 | small_buffer_size, | 605 | dev_err(dev, |
591 | 0 /* byte alignment */, | 606 | "dmabounce: could not allocate DMA pool for %ld byte objects\n", |
592 | 0 /* no page-crossing issues */); | 607 | small_buffer_size); |
593 | if (!device_info->small_buffer_pool) { | 608 | goto err_free; |
594 | printk(KERN_ERR | ||
595 | "dmabounce: could not allocate small DMA pool for %s\n", | ||
596 | dev->bus_id); | ||
597 | kfree(device_info); | ||
598 | return -ENOMEM; | ||
599 | } | 609 | } |
600 | 610 | ||
601 | if (large_buffer_size) { | 611 | if (large_buffer_size) { |
602 | device_info->large_buffer_pool = | 612 | ret = dmabounce_init_pool(&device_info->large, dev, |
603 | dma_pool_create("large_dmabounce_pool", | 613 | "large_dmabounce_pool", |
604 | dev, | 614 | large_buffer_size); |
605 | large_buffer_size, | 615 | if (ret) { |
606 | 0 /* byte alignment */, | 616 | dev_err(dev, |
607 | 0 /* no page-crossing issues */); | 617 | "dmabounce: could not allocate DMA pool for %ld byte objects\n", |
608 | if (!device_info->large_buffer_pool) { | 618 | large_buffer_size); |
609 | printk(KERN_ERR | 619 | goto err_destroy; |
610 | "dmabounce: could not allocate large DMA pool for %s\n", | ||
611 | dev->bus_id); | ||
612 | dma_pool_destroy(device_info->small_buffer_pool); | ||
613 | |||
614 | return -ENOMEM; | ||
615 | } | 620 | } |
616 | } | 621 | } |
617 | 622 | ||
618 | device_info->dev = dev; | 623 | device_info->dev = dev; |
619 | device_info->small_buffer_size = small_buffer_size; | ||
620 | device_info->large_buffer_size = large_buffer_size; | ||
621 | INIT_LIST_HEAD(&device_info->safe_buffers); | 624 | INIT_LIST_HEAD(&device_info->safe_buffers); |
622 | 625 | ||
623 | #ifdef STATS | 626 | #ifdef STATS |
624 | device_info->sbp_allocs = 0; | ||
625 | device_info->lbp_allocs = 0; | ||
626 | device_info->total_allocs = 0; | 627 | device_info->total_allocs = 0; |
627 | device_info->map_op_count = 0; | 628 | device_info->map_op_count = 0; |
628 | device_info->bounce_count = 0; | 629 | device_info->bounce_count = 0; |
@@ -634,6 +635,12 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, | |||
634 | dev->bus_id, dev->bus->name); | 635 | dev->bus_id, dev->bus->name); |
635 | 636 | ||
636 | return 0; | 637 | return 0; |
638 | |||
639 | err_destroy: | ||
640 | dma_pool_destroy(device_info->small.pool); | ||
641 | err_free: | ||
642 | kfree(device_info); | ||
643 | return ret; | ||
637 | } | 644 | } |
638 | 645 | ||
639 | void | 646 | void |
@@ -655,10 +662,10 @@ dmabounce_unregister_dev(struct device *dev) | |||
655 | BUG(); | 662 | BUG(); |
656 | } | 663 | } |
657 | 664 | ||
658 | if (device_info->small_buffer_pool) | 665 | if (device_info->small.pool) |
659 | dma_pool_destroy(device_info->small_buffer_pool); | 666 | dma_pool_destroy(device_info->small.pool); |
660 | if (device_info->large_buffer_pool) | 667 | if (device_info->large.pool) |
661 | dma_pool_destroy(device_info->large_buffer_pool); | 668 | dma_pool_destroy(device_info->large.pool); |
662 | 669 | ||
663 | #ifdef STATS | 670 | #ifdef STATS |
664 | print_alloc_stats(device_info); | 671 | print_alloc_stats(device_info); |
diff --git a/arch/arm/common/scoop.c b/arch/arm/common/scoop.c index 68b06d16f253..bb4eff614413 100644 --- a/arch/arm/common/scoop.c +++ b/arch/arm/common/scoop.c | |||
@@ -11,6 +11,8 @@ | |||
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/device.h> | ||
15 | #include <linux/string.h> | ||
14 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
15 | #include <asm/io.h> | 17 | #include <asm/io.h> |
16 | #include <asm/hardware/scoop.h> | 18 | #include <asm/hardware/scoop.h> |
diff --git a/arch/arm/configs/ixdp2400_defconfig b/arch/arm/configs/ixdp2400_defconfig index 678720fa2e2e..ddeb9f99d662 100644 --- a/arch/arm/configs/ixdp2400_defconfig +++ b/arch/arm/configs/ixdp2400_defconfig | |||
@@ -559,7 +559,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | |||
559 | # | 559 | # |
560 | CONFIG_SERIAL_8250=y | 560 | CONFIG_SERIAL_8250=y |
561 | CONFIG_SERIAL_8250_CONSOLE=y | 561 | CONFIG_SERIAL_8250_CONSOLE=y |
562 | CONFIG_SERIAL_8250_NR_UARTS=2 | 562 | CONFIG_SERIAL_8250_NR_UARTS=1 |
563 | # CONFIG_SERIAL_8250_EXTENDED is not set | 563 | # CONFIG_SERIAL_8250_EXTENDED is not set |
564 | 564 | ||
565 | # | 565 | # |
diff --git a/arch/arm/configs/ixdp2800_defconfig b/arch/arm/configs/ixdp2800_defconfig index 261e2343903b..81d3a0606f95 100644 --- a/arch/arm/configs/ixdp2800_defconfig +++ b/arch/arm/configs/ixdp2800_defconfig | |||
@@ -559,7 +559,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | |||
559 | # | 559 | # |
560 | CONFIG_SERIAL_8250=y | 560 | CONFIG_SERIAL_8250=y |
561 | CONFIG_SERIAL_8250_CONSOLE=y | 561 | CONFIG_SERIAL_8250_CONSOLE=y |
562 | CONFIG_SERIAL_8250_NR_UARTS=2 | 562 | CONFIG_SERIAL_8250_NR_UARTS=1 |
563 | # CONFIG_SERIAL_8250_EXTENDED is not set | 563 | # CONFIG_SERIAL_8250_EXTENDED is not set |
564 | 564 | ||
565 | # | 565 | # |
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 3e1b0327e4d7..c11169b5ed9a 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | AFLAGS_head.o := -DTEXTADDR=$(TEXTADDR) -DDATAADDR=$(DATAADDR) | 5 | AFLAGS_head.o := -DKERNEL_RAM_ADDR=$(TEXTADDR) |
6 | 6 | ||
7 | # Object file lists. | 7 | # Object file lists. |
8 | 8 | ||
diff --git a/arch/arm/kernel/arthur.c b/arch/arm/kernel/arthur.c index a418dad6692c..0ee2e9819631 100644 --- a/arch/arm/kernel/arthur.c +++ b/arch/arm/kernel/arthur.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/stddef.h> | 18 | #include <linux/stddef.h> |
19 | #include <linux/signal.h> | 19 | #include <linux/signal.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/sched.h> | ||
21 | 22 | ||
22 | #include <asm/ptrace.h> | 23 | #include <asm/ptrace.h> |
23 | 24 | ||
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index c1ff4d1f1bfd..04d3082a7b94 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c | |||
@@ -94,7 +94,6 @@ int main(void) | |||
94 | DEFINE(VM_EXEC, VM_EXEC); | 94 | DEFINE(VM_EXEC, VM_EXEC); |
95 | BLANK(); | 95 | BLANK(); |
96 | DEFINE(PAGE_SZ, PAGE_SIZE); | 96 | DEFINE(PAGE_SZ, PAGE_SIZE); |
97 | DEFINE(VIRT_OFFSET, PAGE_OFFSET); | ||
98 | BLANK(); | 97 | BLANK(); |
99 | DEFINE(SYS_ERROR0, 0x9f0000); | 98 | DEFINE(SYS_ERROR0, 0x9f0000); |
100 | BLANK(); | 99 | BLANK(); |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 93b5e8e5292e..be439cab92c6 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | #include <linux/config.h> | 16 | #include <linux/config.h> |
17 | 17 | ||
18 | #include <asm/memory.h> | ||
18 | #include <asm/glue.h> | 19 | #include <asm/glue.h> |
19 | #include <asm/vfpmacros.h> | 20 | #include <asm/vfpmacros.h> |
20 | #include <asm/hardware.h> /* should be moved into entry-macro.S */ | 21 | #include <asm/hardware.h> /* should be moved into entry-macro.S */ |
@@ -310,7 +311,7 @@ __pabt_svc: | |||
310 | 311 | ||
311 | #if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG) | 312 | #if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG) |
312 | @ make sure our user space atomic helper is aborted | 313 | @ make sure our user space atomic helper is aborted |
313 | cmp r2, #VIRT_OFFSET | 314 | cmp r2, #TASK_SIZE |
314 | bichs r3, r3, #PSR_Z_BIT | 315 | bichs r3, r3, #PSR_Z_BIT |
315 | #endif | 316 | #endif |
316 | 317 | ||
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 539626351348..8d8748407cbe 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <asm/procinfo.h> | 21 | #include <asm/procinfo.h> |
22 | #include <asm/ptrace.h> | 22 | #include <asm/ptrace.h> |
23 | #include <asm/asm-offsets.h> | 23 | #include <asm/asm-offsets.h> |
24 | #include <asm/memory.h> | ||
24 | #include <asm/thread_info.h> | 25 | #include <asm/thread_info.h> |
25 | #include <asm/system.h> | 26 | #include <asm/system.h> |
26 | 27 | ||
@@ -33,52 +34,28 @@ | |||
33 | #define MACHINFO_PGOFFIO 12 | 34 | #define MACHINFO_PGOFFIO 12 |
34 | #define MACHINFO_NAME 16 | 35 | #define MACHINFO_NAME 16 |
35 | 36 | ||
36 | #ifndef CONFIG_XIP_KERNEL | ||
37 | /* | 37 | /* |
38 | * We place the page tables 16K below TEXTADDR. Therefore, we must make sure | 38 | * swapper_pg_dir is the virtual address of the initial page table. |
39 | * that TEXTADDR is correctly set. Currently, we expect the least significant | 39 | * We place the page tables 16K below KERNEL_RAM_ADDR. Therefore, we must |
40 | * 16 bits to be 0x8000, but we could probably relax this restriction to | 40 | * make sure that KERNEL_RAM_ADDR is correctly set. Currently, we expect |
41 | * TEXTADDR >= PAGE_OFFSET + 0x4000 | 41 | * the least significant 16 bits to be 0x8000, but we could probably |
42 | * | 42 | * relax this restriction to KERNEL_RAM_ADDR >= PAGE_OFFSET + 0x4000. |
43 | * Note that swapper_pg_dir is the virtual address of the page tables, and | ||
44 | * pgtbl gives us a position-independent reference to these tables. We can | ||
45 | * do this because stext == TEXTADDR | ||
46 | */ | 43 | */ |
47 | #if (TEXTADDR & 0xffff) != 0x8000 | 44 | #if (KERNEL_RAM_ADDR & 0xffff) != 0x8000 |
48 | #error TEXTADDR must start at 0xXXXX8000 | 45 | #error KERNEL_RAM_ADDR must start at 0xXXXX8000 |
49 | #endif | 46 | #endif |
50 | 47 | ||
51 | .globl swapper_pg_dir | 48 | .globl swapper_pg_dir |
52 | .equ swapper_pg_dir, TEXTADDR - 0x4000 | 49 | .equ swapper_pg_dir, KERNEL_RAM_ADDR - 0x4000 |
53 | 50 | ||
54 | .macro pgtbl, rd, phys | 51 | .macro pgtbl, rd |
55 | adr \rd, stext | 52 | ldr \rd, =(__virt_to_phys(KERNEL_RAM_ADDR - 0x4000)) |
56 | sub \rd, \rd, #0x4000 | ||
57 | .endm | 53 | .endm |
58 | #else | ||
59 | /* | ||
60 | * XIP Kernel: | ||
61 | * | ||
62 | * We place the page tables 16K below DATAADDR. Therefore, we must make sure | ||
63 | * that DATAADDR is correctly set. Currently, we expect the least significant | ||
64 | * 16 bits to be 0x8000, but we could probably relax this restriction to | ||
65 | * DATAADDR >= PAGE_OFFSET + 0x4000 | ||
66 | * | ||
67 | * Note that pgtbl is meant to return the physical address of swapper_pg_dir. | ||
68 | * We can't make it relative to the kernel position in this case since | ||
69 | * the kernel can physically be anywhere. | ||
70 | */ | ||
71 | #if (DATAADDR & 0xffff) != 0x8000 | ||
72 | #error DATAADDR must start at 0xXXXX8000 | ||
73 | #endif | ||
74 | |||
75 | .globl swapper_pg_dir | ||
76 | .equ swapper_pg_dir, DATAADDR - 0x4000 | ||
77 | 54 | ||
78 | .macro pgtbl, rd, phys | 55 | #ifdef CONFIG_XIP_KERNEL |
79 | ldr \rd, =((DATAADDR - 0x4000) - VIRT_OFFSET) | 56 | #define TEXTADDR XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR) |
80 | add \rd, \rd, \phys | 57 | #else |
81 | .endm | 58 | #define TEXTADDR KERNEL_RAM_ADDR |
82 | #endif | 59 | #endif |
83 | 60 | ||
84 | /* | 61 | /* |
@@ -279,7 +256,7 @@ __turn_mmu_on: | |||
279 | .type __create_page_tables, %function | 256 | .type __create_page_tables, %function |
280 | __create_page_tables: | 257 | __create_page_tables: |
281 | ldr r5, [r8, #MACHINFO_PHYSRAM] @ physram | 258 | ldr r5, [r8, #MACHINFO_PHYSRAM] @ physram |
282 | pgtbl r4, r5 @ page table address | 259 | pgtbl r4 @ page table address |
283 | 260 | ||
284 | /* | 261 | /* |
285 | * Clear the 16K level 1 swapper page table | 262 | * Clear the 16K level 1 swapper page table |
@@ -324,7 +301,7 @@ __create_page_tables: | |||
324 | /* | 301 | /* |
325 | * Then map first 1MB of ram in case it contains our boot params. | 302 | * Then map first 1MB of ram in case it contains our boot params. |
326 | */ | 303 | */ |
327 | add r0, r4, #VIRT_OFFSET >> 18 | 304 | add r0, r4, #PAGE_OFFSET >> 18 |
328 | orr r6, r5, r7 | 305 | orr r6, r5, r7 |
329 | str r6, [r0] | 306 | str r6, [r0] |
330 | 307 | ||
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index cd99b83f14c2..9bd8609a2926 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
@@ -782,7 +782,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat | |||
782 | return ret; | 782 | return ret; |
783 | } | 783 | } |
784 | 784 | ||
785 | asmlinkage int sys_ptrace(long request, long pid, long addr, long data) | 785 | asmlinkage long sys_ptrace(long request, long pid, long addr, long data) |
786 | { | 786 | { |
787 | struct task_struct *child; | 787 | struct task_struct *child; |
788 | int ret; | 788 | int ret; |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index a94d75fef598..a917e3dd3666 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -139,93 +139,33 @@ struct iwmmxt_sigframe { | |||
139 | unsigned long storage[0x98/4]; | 139 | unsigned long storage[0x98/4]; |
140 | }; | 140 | }; |
141 | 141 | ||
142 | static int page_present(struct mm_struct *mm, void __user *uptr, int wr) | ||
143 | { | ||
144 | unsigned long addr = (unsigned long)uptr; | ||
145 | pgd_t *pgd = pgd_offset(mm, addr); | ||
146 | if (pgd_present(*pgd)) { | ||
147 | pmd_t *pmd = pmd_offset(pgd, addr); | ||
148 | if (pmd_present(*pmd)) { | ||
149 | pte_t *pte = pte_offset_map(pmd, addr); | ||
150 | return (pte_present(*pte) && (!wr || pte_write(*pte))); | ||
151 | } | ||
152 | } | ||
153 | return 0; | ||
154 | } | ||
155 | |||
156 | static int copy_locked(void __user *uptr, void *kptr, size_t size, int write, | ||
157 | void (*copyfn)(void *, void __user *)) | ||
158 | { | ||
159 | unsigned char v, __user *userptr = uptr; | ||
160 | int err = 0; | ||
161 | |||
162 | do { | ||
163 | struct mm_struct *mm; | ||
164 | |||
165 | if (write) { | ||
166 | __put_user_error(0, userptr, err); | ||
167 | __put_user_error(0, userptr + size - 1, err); | ||
168 | } else { | ||
169 | __get_user_error(v, userptr, err); | ||
170 | __get_user_error(v, userptr + size - 1, err); | ||
171 | } | ||
172 | |||
173 | if (err) | ||
174 | break; | ||
175 | |||
176 | mm = current->mm; | ||
177 | spin_lock(&mm->page_table_lock); | ||
178 | if (page_present(mm, userptr, write) && | ||
179 | page_present(mm, userptr + size - 1, write)) { | ||
180 | copyfn(kptr, uptr); | ||
181 | } else | ||
182 | err = 1; | ||
183 | spin_unlock(&mm->page_table_lock); | ||
184 | } while (err); | ||
185 | |||
186 | return err; | ||
187 | } | ||
188 | |||
189 | static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame) | 142 | static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame) |
190 | { | 143 | { |
191 | int err = 0; | 144 | char kbuf[sizeof(*frame) + 8]; |
145 | struct iwmmxt_sigframe *kframe; | ||
192 | 146 | ||
193 | /* the iWMMXt context must be 64 bit aligned */ | 147 | /* the iWMMXt context must be 64 bit aligned */ |
194 | WARN_ON((unsigned long)frame & 7); | 148 | kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7); |
195 | 149 | kframe->magic0 = IWMMXT_MAGIC0; | |
196 | __put_user_error(IWMMXT_MAGIC0, &frame->magic0, err); | 150 | kframe->magic1 = IWMMXT_MAGIC1; |
197 | __put_user_error(IWMMXT_MAGIC1, &frame->magic1, err); | 151 | iwmmxt_task_copy(current_thread_info(), &kframe->storage); |
198 | 152 | return __copy_to_user(frame, kframe, sizeof(*frame)); | |
199 | /* | ||
200 | * iwmmxt_task_copy() doesn't check user permissions. | ||
201 | * Let's do a dummy write on the upper boundary to ensure | ||
202 | * access to user mem is OK all way up. | ||
203 | */ | ||
204 | err |= copy_locked(&frame->storage, current_thread_info(), | ||
205 | sizeof(frame->storage), 1, iwmmxt_task_copy); | ||
206 | return err; | ||
207 | } | 153 | } |
208 | 154 | ||
209 | static int restore_iwmmxt_context(struct iwmmxt_sigframe *frame) | 155 | static int restore_iwmmxt_context(struct iwmmxt_sigframe *frame) |
210 | { | 156 | { |
211 | unsigned long magic0, magic1; | 157 | char kbuf[sizeof(*frame) + 8]; |
212 | int err = 0; | 158 | struct iwmmxt_sigframe *kframe; |
213 | 159 | ||
214 | /* the iWMMXt context is 64 bit aligned */ | 160 | /* the iWMMXt context must be 64 bit aligned */ |
215 | WARN_ON((unsigned long)frame & 7); | 161 | kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7); |
216 | 162 | if (__copy_from_user(kframe, frame, sizeof(*frame))) | |
217 | /* | 163 | return -1; |
218 | * Validate iWMMXt context signature. | 164 | if (kframe->magic0 != IWMMXT_MAGIC0 || |
219 | * Also, iwmmxt_task_restore() doesn't check user permissions. | 165 | kframe->magic1 != IWMMXT_MAGIC1) |
220 | * Let's do a dummy write on the upper boundary to ensure | 166 | return -1; |
221 | * access to user mem is OK all way up. | 167 | iwmmxt_task_restore(current_thread_info(), &kframe->storage); |
222 | */ | 168 | return 0; |
223 | __get_user_error(magic0, &frame->magic0, err); | ||
224 | __get_user_error(magic1, &frame->magic1, err); | ||
225 | if (!err && magic0 == IWMMXT_MAGIC0 && magic1 == IWMMXT_MAGIC1) | ||
226 | err = copy_locked(&frame->storage, current_thread_info(), | ||
227 | sizeof(frame->storage), 0, iwmmxt_task_restore); | ||
228 | return err; | ||
229 | } | 169 | } |
230 | 170 | ||
231 | #endif | 171 | #endif |
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index 69449a818dcc..fc4729106a32 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c | |||
@@ -36,10 +36,6 @@ | |||
36 | #include <asm/thread_info.h> | 36 | #include <asm/thread_info.h> |
37 | #include <asm/mach/time.h> | 37 | #include <asm/mach/time.h> |
38 | 38 | ||
39 | u64 jiffies_64 = INITIAL_JIFFIES; | ||
40 | |||
41 | EXPORT_SYMBOL(jiffies_64); | ||
42 | |||
43 | /* | 39 | /* |
44 | * Our system timer. | 40 | * Our system timer. |
45 | */ | 41 | */ |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index baa09601a64e..45e9ea6cd2a5 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -198,25 +198,16 @@ void show_stack(struct task_struct *tsk, unsigned long *sp) | |||
198 | barrier(); | 198 | barrier(); |
199 | } | 199 | } |
200 | 200 | ||
201 | DEFINE_SPINLOCK(die_lock); | 201 | static void __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs) |
202 | |||
203 | /* | ||
204 | * This function is protected against re-entrancy. | ||
205 | */ | ||
206 | NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) | ||
207 | { | 202 | { |
208 | struct task_struct *tsk = current; | 203 | struct task_struct *tsk = thread->task; |
209 | static int die_counter; | 204 | static int die_counter; |
210 | 205 | ||
211 | console_verbose(); | ||
212 | spin_lock_irq(&die_lock); | ||
213 | bust_spinlocks(1); | ||
214 | |||
215 | printk("Internal error: %s: %x [#%d]\n", str, err, ++die_counter); | 206 | printk("Internal error: %s: %x [#%d]\n", str, err, ++die_counter); |
216 | print_modules(); | 207 | print_modules(); |
217 | __show_regs(regs); | 208 | __show_regs(regs); |
218 | printk("Process %s (pid: %d, stack limit = 0x%p)\n", | 209 | printk("Process %s (pid: %d, stack limit = 0x%p)\n", |
219 | tsk->comm, tsk->pid, tsk->thread_info + 1); | 210 | tsk->comm, tsk->pid, thread + 1); |
220 | 211 | ||
221 | if (!user_mode(regs) || in_interrupt()) { | 212 | if (!user_mode(regs) || in_interrupt()) { |
222 | dump_mem("Stack: ", regs->ARM_sp, | 213 | dump_mem("Stack: ", regs->ARM_sp, |
@@ -224,7 +215,21 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) | |||
224 | dump_backtrace(regs, tsk); | 215 | dump_backtrace(regs, tsk); |
225 | dump_instr(regs); | 216 | dump_instr(regs); |
226 | } | 217 | } |
218 | } | ||
219 | |||
220 | DEFINE_SPINLOCK(die_lock); | ||
221 | |||
222 | /* | ||
223 | * This function is protected against re-entrancy. | ||
224 | */ | ||
225 | NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) | ||
226 | { | ||
227 | struct thread_info *thread = current_thread_info(); | ||
227 | 228 | ||
229 | console_verbose(); | ||
230 | spin_lock_irq(&die_lock); | ||
231 | bust_spinlocks(1); | ||
232 | __die(str, err, thread, regs); | ||
228 | bust_spinlocks(0); | 233 | bust_spinlocks(0); |
229 | spin_unlock_irq(&die_lock); | 234 | spin_unlock_irq(&die_lock); |
230 | do_exit(SIGSEGV); | 235 | do_exit(SIGSEGV); |
@@ -483,29 +488,33 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs) | |||
483 | unsigned long addr = regs->ARM_r2; | 488 | unsigned long addr = regs->ARM_r2; |
484 | struct mm_struct *mm = current->mm; | 489 | struct mm_struct *mm = current->mm; |
485 | pgd_t *pgd; pmd_t *pmd; pte_t *pte; | 490 | pgd_t *pgd; pmd_t *pmd; pte_t *pte; |
491 | spinlock_t *ptl; | ||
486 | 492 | ||
487 | regs->ARM_cpsr &= ~PSR_C_BIT; | 493 | regs->ARM_cpsr &= ~PSR_C_BIT; |
488 | spin_lock(&mm->page_table_lock); | 494 | down_read(&mm->mmap_sem); |
489 | pgd = pgd_offset(mm, addr); | 495 | pgd = pgd_offset(mm, addr); |
490 | if (!pgd_present(*pgd)) | 496 | if (!pgd_present(*pgd)) |
491 | goto bad_access; | 497 | goto bad_access; |
492 | pmd = pmd_offset(pgd, addr); | 498 | pmd = pmd_offset(pgd, addr); |
493 | if (!pmd_present(*pmd)) | 499 | if (!pmd_present(*pmd)) |
494 | goto bad_access; | 500 | goto bad_access; |
495 | pte = pte_offset_map(pmd, addr); | 501 | pte = pte_offset_map_lock(mm, pmd, addr, &ptl); |
496 | if (!pte_present(*pte) || !pte_write(*pte)) | 502 | if (!pte_present(*pte) || !pte_write(*pte)) { |
503 | pte_unmap_unlock(pte, ptl); | ||
497 | goto bad_access; | 504 | goto bad_access; |
505 | } | ||
498 | val = *(unsigned long *)addr; | 506 | val = *(unsigned long *)addr; |
499 | val -= regs->ARM_r0; | 507 | val -= regs->ARM_r0; |
500 | if (val == 0) { | 508 | if (val == 0) { |
501 | *(unsigned long *)addr = regs->ARM_r1; | 509 | *(unsigned long *)addr = regs->ARM_r1; |
502 | regs->ARM_cpsr |= PSR_C_BIT; | 510 | regs->ARM_cpsr |= PSR_C_BIT; |
503 | } | 511 | } |
504 | spin_unlock(&mm->page_table_lock); | 512 | pte_unmap_unlock(pte, ptl); |
513 | up_read(&mm->mmap_sem); | ||
505 | return val; | 514 | return val; |
506 | 515 | ||
507 | bad_access: | 516 | bad_access: |
508 | spin_unlock(&mm->page_table_lock); | 517 | up_read(&mm->mmap_sem); |
509 | /* simulate a write access fault */ | 518 | /* simulate a write access fault */ |
510 | do_DataAbort(addr, 15 + (1 << 11), regs); | 519 | do_DataAbort(addr, 15 + (1 << 11), regs); |
511 | return -1; | 520 | return -1; |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 0d5db5279c5c..80c8e4c8cefa 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -6,14 +6,23 @@ | |||
6 | #include <asm-generic/vmlinux.lds.h> | 6 | #include <asm-generic/vmlinux.lds.h> |
7 | #include <linux/config.h> | 7 | #include <linux/config.h> |
8 | #include <asm/thread_info.h> | 8 | #include <asm/thread_info.h> |
9 | #include <asm/memory.h> | ||
9 | 10 | ||
10 | OUTPUT_ARCH(arm) | 11 | OUTPUT_ARCH(arm) |
11 | ENTRY(stext) | 12 | ENTRY(stext) |
13 | |||
12 | #ifndef __ARMEB__ | 14 | #ifndef __ARMEB__ |
13 | jiffies = jiffies_64; | 15 | jiffies = jiffies_64; |
14 | #else | 16 | #else |
15 | jiffies = jiffies_64 + 4; | 17 | jiffies = jiffies_64 + 4; |
16 | #endif | 18 | #endif |
19 | |||
20 | #ifdef CONFIG_XIP_KERNEL | ||
21 | #define TEXTADDR XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR) | ||
22 | #else | ||
23 | #define TEXTADDR KERNEL_RAM_ADDR | ||
24 | #endif | ||
25 | |||
17 | SECTIONS | 26 | SECTIONS |
18 | { | 27 | { |
19 | . = TEXTADDR; | 28 | . = TEXTADDR; |
@@ -95,7 +104,7 @@ SECTIONS | |||
95 | 104 | ||
96 | #ifdef CONFIG_XIP_KERNEL | 105 | #ifdef CONFIG_XIP_KERNEL |
97 | __data_loc = ALIGN(4); /* location in binary */ | 106 | __data_loc = ALIGN(4); /* location in binary */ |
98 | . = DATAADDR; | 107 | . = KERNEL_RAM_ADDR; |
99 | #else | 108 | #else |
100 | . = ALIGN(THREAD_SIZE); | 109 | . = ALIGN(THREAD_SIZE); |
101 | __data_loc = .; | 110 | __data_loc = .; |
diff --git a/arch/arm/lib/ashldi3.S b/arch/arm/lib/ashldi3.S new file mode 100644 index 000000000000..561e20717b30 --- /dev/null +++ b/arch/arm/lib/ashldi3.S | |||
@@ -0,0 +1,48 @@ | |||
1 | /* Copyright 1995, 1996, 1998, 1999, 2000, 2003, 2004, 2005 | ||
2 | Free Software Foundation, Inc. | ||
3 | |||
4 | This file is free software; you can redistribute it and/or modify it | ||
5 | under the terms of the GNU General Public License as published by the | ||
6 | Free Software Foundation; either version 2, or (at your option) any | ||
7 | later version. | ||
8 | |||
9 | In addition to the permissions in the GNU General Public License, the | ||
10 | Free Software Foundation gives you unlimited permission to link the | ||
11 | compiled version of this file into combinations with other programs, | ||
12 | and to distribute those combinations without any restriction coming | ||
13 | from the use of this file. (The General Public License restrictions | ||
14 | do apply in other respects; for example, they cover modification of | ||
15 | the file, and distribution when not linked into a combine | ||
16 | executable.) | ||
17 | |||
18 | This file is distributed in the hope that it will be useful, but | ||
19 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
21 | General Public License for more details. | ||
22 | |||
23 | You should have received a copy of the GNU General Public License | ||
24 | along with this program; see the file COPYING. If not, write to | ||
25 | the Free Software Foundation, 51 Franklin Street, Fifth Floor, | ||
26 | Boston, MA 02110-1301, USA. */ | ||
27 | |||
28 | |||
29 | #include <linux/linkage.h> | ||
30 | |||
31 | #ifdef __ARMEB__ | ||
32 | #define al r1 | ||
33 | #define ah r0 | ||
34 | #else | ||
35 | #define al r0 | ||
36 | #define ah r1 | ||
37 | #endif | ||
38 | |||
39 | ENTRY(__ashldi3) | ||
40 | |||
41 | subs r3, r2, #32 | ||
42 | rsb ip, r2, #32 | ||
43 | movmi ah, ah, lsl r2 | ||
44 | movpl ah, al, lsl r3 | ||
45 | orrmi ah, ah, al, lsr ip | ||
46 | mov al, al, lsl r2 | ||
47 | mov pc, lr | ||
48 | |||
diff --git a/arch/arm/lib/ashldi3.c b/arch/arm/lib/ashldi3.c deleted file mode 100644 index b62875cfd8f8..000000000000 --- a/arch/arm/lib/ashldi3.c +++ /dev/null | |||
@@ -1,56 +0,0 @@ | |||
1 | /* More subroutines needed by GCC output code on some machines. */ | ||
2 | /* Compile this one with gcc. */ | ||
3 | /* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of GNU CC. | ||
6 | |||
7 | GNU CC is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2, or (at your option) | ||
10 | any later version. | ||
11 | |||
12 | GNU CC is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with GNU CC; see the file COPYING. If not, write to | ||
19 | the Free Software Foundation, 59 Temple Place - Suite 330, | ||
20 | Boston, MA 02111-1307, USA. */ | ||
21 | |||
22 | /* As a special exception, if you link this library with other files, | ||
23 | some of which are compiled with GCC, to produce an executable, | ||
24 | this library does not by itself cause the resulting executable | ||
25 | to be covered by the GNU General Public License. | ||
26 | This exception does not however invalidate any other reasons why | ||
27 | the executable file might be covered by the GNU General Public License. | ||
28 | */ | ||
29 | /* support functions required by the kernel. based on code from gcc-2.95.3 */ | ||
30 | /* I Molton 29/07/01 */ | ||
31 | |||
32 | #include "gcclib.h" | ||
33 | |||
34 | s64 __ashldi3(s64 u, int b) | ||
35 | { | ||
36 | DIunion w; | ||
37 | int bm; | ||
38 | DIunion uu; | ||
39 | |||
40 | if (b == 0) | ||
41 | return u; | ||
42 | |||
43 | uu.ll = u; | ||
44 | |||
45 | bm = (sizeof(s32) * BITS_PER_UNIT) - b; | ||
46 | if (bm <= 0) { | ||
47 | w.s.low = 0; | ||
48 | w.s.high = (u32) uu.s.low << -bm; | ||
49 | } else { | ||
50 | u32 carries = (u32) uu.s.low >> bm; | ||
51 | w.s.low = (u32) uu.s.low << b; | ||
52 | w.s.high = ((u32) uu.s.high << b) | carries; | ||
53 | } | ||
54 | |||
55 | return w.ll; | ||
56 | } | ||
diff --git a/arch/arm/lib/ashrdi3.S b/arch/arm/lib/ashrdi3.S new file mode 100644 index 000000000000..86fb2a90c301 --- /dev/null +++ b/arch/arm/lib/ashrdi3.S | |||
@@ -0,0 +1,48 @@ | |||
1 | /* Copyright 1995, 1996, 1998, 1999, 2000, 2003, 2004, 2005 | ||
2 | Free Software Foundation, Inc. | ||
3 | |||
4 | This file is free software; you can redistribute it and/or modify it | ||
5 | under the terms of the GNU General Public License as published by the | ||
6 | Free Software Foundation; either version 2, or (at your option) any | ||
7 | later version. | ||
8 | |||
9 | In addition to the permissions in the GNU General Public License, the | ||
10 | Free Software Foundation gives you unlimited permission to link the | ||
11 | compiled version of this file into combinations with other programs, | ||
12 | and to distribute those combinations without any restriction coming | ||
13 | from the use of this file. (The General Public License restrictions | ||
14 | do apply in other respects; for example, they cover modification of | ||
15 | the file, and distribution when not linked into a combine | ||
16 | executable.) | ||
17 | |||
18 | This file is distributed in the hope that it will be useful, but | ||
19 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
21 | General Public License for more details. | ||
22 | |||
23 | You should have received a copy of the GNU General Public License | ||
24 | along with this program; see the file COPYING. If not, write to | ||
25 | the Free Software Foundation, 51 Franklin Street, Fifth Floor, | ||
26 | Boston, MA 02110-1301, USA. */ | ||
27 | |||
28 | |||
29 | #include <linux/linkage.h> | ||
30 | |||
31 | #ifdef __ARMEB__ | ||
32 | #define al r1 | ||
33 | #define ah r0 | ||
34 | #else | ||
35 | #define al r0 | ||
36 | #define ah r1 | ||
37 | #endif | ||
38 | |||
39 | ENTRY(__ashrdi3) | ||
40 | |||
41 | subs r3, r2, #32 | ||
42 | rsb ip, r2, #32 | ||
43 | movmi al, al, lsr r2 | ||
44 | movpl al, ah, asr r3 | ||
45 | orrmi al, al, ah, lsl ip | ||
46 | mov ah, ah, asr r2 | ||
47 | mov pc, lr | ||
48 | |||
diff --git a/arch/arm/lib/ashrdi3.c b/arch/arm/lib/ashrdi3.c deleted file mode 100644 index 9a8600a7543f..000000000000 --- a/arch/arm/lib/ashrdi3.c +++ /dev/null | |||
@@ -1,57 +0,0 @@ | |||
1 | /* More subroutines needed by GCC output code on some machines. */ | ||
2 | /* Compile this one with gcc. */ | ||
3 | /* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of GNU CC. | ||
6 | |||
7 | GNU CC is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2, or (at your option) | ||
10 | any later version. | ||
11 | |||
12 | GNU CC is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with GNU CC; see the file COPYING. If not, write to | ||
19 | the Free Software Foundation, 59 Temple Place - Suite 330, | ||
20 | Boston, MA 02111-1307, USA. */ | ||
21 | |||
22 | /* As a special exception, if you link this library with other files, | ||
23 | some of which are compiled with GCC, to produce an executable, | ||
24 | this library does not by itself cause the resulting executable | ||
25 | to be covered by the GNU General Public License. | ||
26 | This exception does not however invalidate any other reasons why | ||
27 | the executable file might be covered by the GNU General Public License. | ||
28 | */ | ||
29 | /* support functions required by the kernel. based on code from gcc-2.95.3 */ | ||
30 | /* I Molton 29/07/01 */ | ||
31 | |||
32 | #include "gcclib.h" | ||
33 | |||
34 | s64 __ashrdi3(s64 u, int b) | ||
35 | { | ||
36 | DIunion w; | ||
37 | int bm; | ||
38 | DIunion uu; | ||
39 | |||
40 | if (b == 0) | ||
41 | return u; | ||
42 | |||
43 | uu.ll = u; | ||
44 | |||
45 | bm = (sizeof(s32) * BITS_PER_UNIT) - b; | ||
46 | if (bm <= 0) { | ||
47 | /* w.s.high = 1..1 or 0..0 */ | ||
48 | w.s.high = uu.s.high >> (sizeof(s32) * BITS_PER_UNIT - 1); | ||
49 | w.s.low = uu.s.high >> -bm; | ||
50 | } else { | ||
51 | u32 carries = (u32) uu.s.high << bm; | ||
52 | w.s.high = uu.s.high >> b; | ||
53 | w.s.low = ((u32) uu.s.low >> b) | carries; | ||
54 | } | ||
55 | |||
56 | return w.ll; | ||
57 | } | ||
diff --git a/arch/arm/lib/gcclib.h b/arch/arm/lib/gcclib.h deleted file mode 100644 index 8b6dcc656de7..000000000000 --- a/arch/arm/lib/gcclib.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* gcclib.h -- definitions for various functions 'borrowed' from gcc-2.95.3 */ | ||
2 | /* I Molton 29/07/01 */ | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | #define BITS_PER_UNIT 8 | ||
7 | #define SI_TYPE_SIZE (sizeof(s32) * BITS_PER_UNIT) | ||
8 | |||
9 | #ifdef __ARMEB__ | ||
10 | struct DIstruct { | ||
11 | s32 high, low; | ||
12 | }; | ||
13 | #else | ||
14 | struct DIstruct { | ||
15 | s32 low, high; | ||
16 | }; | ||
17 | #endif | ||
18 | |||
19 | typedef union { | ||
20 | struct DIstruct s; | ||
21 | s64 ll; | ||
22 | } DIunion; | ||
diff --git a/arch/arm/lib/lshrdi3.S b/arch/arm/lib/lshrdi3.S new file mode 100644 index 000000000000..46c2ed19ec95 --- /dev/null +++ b/arch/arm/lib/lshrdi3.S | |||
@@ -0,0 +1,48 @@ | |||
1 | /* Copyright 1995, 1996, 1998, 1999, 2000, 2003, 2004, 2005 | ||
2 | Free Software Foundation, Inc. | ||
3 | |||
4 | This file is free software; you can redistribute it and/or modify it | ||
5 | under the terms of the GNU General Public License as published by the | ||
6 | Free Software Foundation; either version 2, or (at your option) any | ||
7 | later version. | ||
8 | |||
9 | In addition to the permissions in the GNU General Public License, the | ||
10 | Free Software Foundation gives you unlimited permission to link the | ||
11 | compiled version of this file into combinations with other programs, | ||
12 | and to distribute those combinations without any restriction coming | ||
13 | from the use of this file. (The General Public License restrictions | ||
14 | do apply in other respects; for example, they cover modification of | ||
15 | the file, and distribution when not linked into a combine | ||
16 | executable.) | ||
17 | |||
18 | This file is distributed in the hope that it will be useful, but | ||
19 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
21 | General Public License for more details. | ||
22 | |||
23 | You should have received a copy of the GNU General Public License | ||
24 | along with this program; see the file COPYING. If not, write to | ||
25 | the Free Software Foundation, 51 Franklin Street, Fifth Floor, | ||
26 | Boston, MA 02110-1301, USA. */ | ||
27 | |||
28 | |||
29 | #include <linux/linkage.h> | ||
30 | |||
31 | #ifdef __ARMEB__ | ||
32 | #define al r1 | ||
33 | #define ah r0 | ||
34 | #else | ||
35 | #define al r0 | ||
36 | #define ah r1 | ||
37 | #endif | ||
38 | |||
39 | ENTRY(__lshrdi3) | ||
40 | |||
41 | subs r3, r2, #32 | ||
42 | rsb ip, r2, #32 | ||
43 | movmi al, al, lsr r2 | ||
44 | movpl al, ah, lsr r3 | ||
45 | orrmi al, al, ah, lsl ip | ||
46 | mov ah, ah, lsr r2 | ||
47 | mov pc, lr | ||
48 | |||
diff --git a/arch/arm/lib/lshrdi3.c b/arch/arm/lib/lshrdi3.c deleted file mode 100644 index 3681f49d2b6e..000000000000 --- a/arch/arm/lib/lshrdi3.c +++ /dev/null | |||
@@ -1,56 +0,0 @@ | |||
1 | /* More subroutines needed by GCC output code on some machines. */ | ||
2 | /* Compile this one with gcc. */ | ||
3 | /* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of GNU CC. | ||
6 | |||
7 | GNU CC is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2, or (at your option) | ||
10 | any later version. | ||
11 | |||
12 | GNU CC is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with GNU CC; see the file COPYING. If not, write to | ||
19 | the Free Software Foundation, 59 Temple Place - Suite 330, | ||
20 | Boston, MA 02111-1307, USA. */ | ||
21 | |||
22 | /* As a special exception, if you link this library with other files, | ||
23 | some of which are compiled with GCC, to produce an executable, | ||
24 | this library does not by itself cause the resulting executable | ||
25 | to be covered by the GNU General Public License. | ||
26 | This exception does not however invalidate any other reasons why | ||
27 | the executable file might be covered by the GNU General Public License. | ||
28 | */ | ||
29 | /* support functions required by the kernel. based on code from gcc-2.95.3 */ | ||
30 | /* I Molton 29/07/01 */ | ||
31 | |||
32 | #include "gcclib.h" | ||
33 | |||
34 | s64 __lshrdi3(s64 u, int b) | ||
35 | { | ||
36 | DIunion w; | ||
37 | int bm; | ||
38 | DIunion uu; | ||
39 | |||
40 | if (b == 0) | ||
41 | return u; | ||
42 | |||
43 | uu.ll = u; | ||
44 | |||
45 | bm = (sizeof(s32) * BITS_PER_UNIT) - b; | ||
46 | if (bm <= 0) { | ||
47 | w.s.high = 0; | ||
48 | w.s.low = (u32) uu.s.high >> -bm; | ||
49 | } else { | ||
50 | u32 carries = (u32) uu.s.high << bm; | ||
51 | w.s.high = (u32) uu.s.high >> b; | ||
52 | w.s.low = ((u32) uu.s.low >> b) | carries; | ||
53 | } | ||
54 | |||
55 | return w.ll; | ||
56 | } | ||
diff --git a/arch/arm/lib/muldi3.S b/arch/arm/lib/muldi3.S new file mode 100644 index 000000000000..c7fbdf005319 --- /dev/null +++ b/arch/arm/lib/muldi3.S | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/muldi3.S | ||
3 | * | ||
4 | * Author: Nicolas Pitre | ||
5 | * Created: Oct 19, 2005 | ||
6 | * Copyright: Monta Vista Software, Inc. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/linkage.h> | ||
14 | |||
15 | #ifdef __ARMEB__ | ||
16 | #define xh r0 | ||
17 | #define xl r1 | ||
18 | #define yh r2 | ||
19 | #define yl r3 | ||
20 | #else | ||
21 | #define xl r0 | ||
22 | #define xh r1 | ||
23 | #define yl r2 | ||
24 | #define yh r3 | ||
25 | #endif | ||
26 | |||
27 | ENTRY(__muldi3) | ||
28 | |||
29 | mul xh, yl, xh | ||
30 | mla xh, xl, yh, xh | ||
31 | mov ip, xl, asr #16 | ||
32 | mov yh, yl, asr #16 | ||
33 | bic xl, xl, ip, lsl #16 | ||
34 | bic yl, yl, yh, lsl #16 | ||
35 | mla xh, yh, ip, xh | ||
36 | mul yh, xl, yh | ||
37 | mul xl, yl, xl | ||
38 | mul ip, yl, ip | ||
39 | adds xl, xl, yh, lsl #16 | ||
40 | adc xh, xh, yh, lsr #16 | ||
41 | adds xl, xl, ip, lsl #16 | ||
42 | adc xh, xh, ip, lsr #16 | ||
43 | mov pc, lr | ||
44 | |||
diff --git a/arch/arm/lib/muldi3.c b/arch/arm/lib/muldi3.c deleted file mode 100644 index 0a3b93313f18..000000000000 --- a/arch/arm/lib/muldi3.c +++ /dev/null | |||
@@ -1,72 +0,0 @@ | |||
1 | /* More subroutines needed by GCC output code on some machines. */ | ||
2 | /* Compile this one with gcc. */ | ||
3 | /* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of GNU CC. | ||
6 | |||
7 | GNU CC is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2, or (at your option) | ||
10 | any later version. | ||
11 | |||
12 | GNU CC is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with GNU CC; see the file COPYING. If not, write to | ||
19 | the Free Software Foundation, 59 Temple Place - Suite 330, | ||
20 | Boston, MA 02111-1307, USA. */ | ||
21 | |||
22 | /* As a special exception, if you link this library with other files, | ||
23 | some of which are compiled with GCC, to produce an executable, | ||
24 | this library does not by itself cause the resulting executable | ||
25 | to be covered by the GNU General Public License. | ||
26 | This exception does not however invalidate any other reasons why | ||
27 | the executable file might be covered by the GNU General Public License. | ||
28 | */ | ||
29 | /* support functions required by the kernel. based on code from gcc-2.95.3 */ | ||
30 | /* I Molton 29/07/01 */ | ||
31 | |||
32 | #include "gcclib.h" | ||
33 | |||
34 | #define umul_ppmm(xh, xl, a, b) \ | ||
35 | {register u32 __t0, __t1, __t2; \ | ||
36 | __asm__ ("%@ Inlined umul_ppmm \n\ | ||
37 | mov %2, %5, lsr #16 \n\ | ||
38 | mov %0, %6, lsr #16 \n\ | ||
39 | bic %3, %5, %2, lsl #16 \n\ | ||
40 | bic %4, %6, %0, lsl #16 \n\ | ||
41 | mul %1, %3, %4 \n\ | ||
42 | mul %4, %2, %4 \n\ | ||
43 | mul %3, %0, %3 \n\ | ||
44 | mul %0, %2, %0 \n\ | ||
45 | adds %3, %4, %3 \n\ | ||
46 | addcs %0, %0, #65536 \n\ | ||
47 | adds %1, %1, %3, lsl #16 \n\ | ||
48 | adc %0, %0, %3, lsr #16" \ | ||
49 | : "=&r" ((u32) (xh)), \ | ||
50 | "=r" ((u32) (xl)), \ | ||
51 | "=&r" (__t0), "=&r" (__t1), "=r" (__t2) \ | ||
52 | : "r" ((u32) (a)), \ | ||
53 | "r" ((u32) (b)));} | ||
54 | |||
55 | #define __umulsidi3(u, v) \ | ||
56 | ({DIunion __w; \ | ||
57 | umul_ppmm (__w.s.high, __w.s.low, u, v); \ | ||
58 | __w.ll; }) | ||
59 | |||
60 | s64 __muldi3(s64 u, s64 v) | ||
61 | { | ||
62 | DIunion w; | ||
63 | DIunion uu, vv; | ||
64 | |||
65 | uu.ll = u, vv.ll = v; | ||
66 | |||
67 | w.ll = __umulsidi3(uu.s.low, vv.s.low); | ||
68 | w.s.high += ((u32) uu.s.low * (u32) vv.s.high | ||
69 | + (u32) uu.s.high * (u32) vv.s.low); | ||
70 | |||
71 | return w.ll; | ||
72 | } | ||
diff --git a/arch/arm/lib/ucmpdi2.S b/arch/arm/lib/ucmpdi2.S new file mode 100644 index 000000000000..112630f93e5d --- /dev/null +++ b/arch/arm/lib/ucmpdi2.S | |||
@@ -0,0 +1,35 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/ucmpdi2.S | ||
3 | * | ||
4 | * Author: Nicolas Pitre | ||
5 | * Created: Oct 19, 2005 | ||
6 | * Copyright: Monta Vista Software, Inc. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/linkage.h> | ||
14 | |||
15 | #ifdef __ARMEB__ | ||
16 | #define xh r0 | ||
17 | #define xl r1 | ||
18 | #define yh r2 | ||
19 | #define yl r3 | ||
20 | #else | ||
21 | #define xl r0 | ||
22 | #define xh r1 | ||
23 | #define yl r2 | ||
24 | #define yh r3 | ||
25 | #endif | ||
26 | |||
27 | ENTRY(__ucmpdi2) | ||
28 | |||
29 | cmp xh, yh | ||
30 | cmpeq xl, yl | ||
31 | movlo r0, #0 | ||
32 | moveq r0, #1 | ||
33 | movhi r0, #2 | ||
34 | mov pc, lr | ||
35 | |||
diff --git a/arch/arm/lib/ucmpdi2.c b/arch/arm/lib/ucmpdi2.c deleted file mode 100644 index 57f3f2df3850..000000000000 --- a/arch/arm/lib/ucmpdi2.c +++ /dev/null | |||
@@ -1,49 +0,0 @@ | |||
1 | /* More subroutines needed by GCC output code on some machines. */ | ||
2 | /* Compile this one with gcc. */ | ||
3 | /* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of GNU CC. | ||
6 | |||
7 | GNU CC is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2, or (at your option) | ||
10 | any later version. | ||
11 | |||
12 | GNU CC is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with GNU CC; see the file COPYING. If not, write to | ||
19 | the Free Software Foundation, 59 Temple Place - Suite 330, | ||
20 | Boston, MA 02111-1307, USA. */ | ||
21 | |||
22 | /* As a special exception, if you link this library with other files, | ||
23 | some of which are compiled with GCC, to produce an executable, | ||
24 | this library does not by itself cause the resulting executable | ||
25 | to be covered by the GNU General Public License. | ||
26 | This exception does not however invalidate any other reasons why | ||
27 | the executable file might be covered by the GNU General Public License. | ||
28 | */ | ||
29 | /* support functions required by the kernel. based on code from gcc-2.95.3 */ | ||
30 | /* I Molton 29/07/01 */ | ||
31 | |||
32 | #include "gcclib.h" | ||
33 | |||
34 | int __ucmpdi2(s64 a, s64 b) | ||
35 | { | ||
36 | DIunion au, bu; | ||
37 | |||
38 | au.ll = a, bu.ll = b; | ||
39 | |||
40 | if ((u32) au.s.high < (u32) bu.s.high) | ||
41 | return 0; | ||
42 | else if ((u32) au.s.high > (u32) bu.s.high) | ||
43 | return 2; | ||
44 | if ((u32) au.s.low < (u32) bu.s.low) | ||
45 | return 0; | ||
46 | else if ((u32) au.s.low > (u32) bu.s.low) | ||
47 | return 2; | ||
48 | return 1; | ||
49 | } | ||
diff --git a/arch/arm/mach-imx/generic.c b/arch/arm/mach-imx/generic.c index 60e2361e98e8..37613ad68366 100644 --- a/arch/arm/mach-imx/generic.c +++ b/arch/arm/mach-imx/generic.c | |||
@@ -26,6 +26,8 @@ | |||
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/string.h> | ||
30 | |||
29 | #include <asm/arch/imxfb.h> | 31 | #include <asm/arch/imxfb.h> |
30 | #include <asm/hardware.h> | 32 | #include <asm/hardware.h> |
31 | #include <asm/arch/imx-regs.h> | 33 | #include <asm/arch/imx-regs.h> |
diff --git a/arch/arm/mach-integrator/clock.c b/arch/arm/mach-integrator/clock.c index 56200594db3c..73c360685cad 100644 --- a/arch/arm/mach-integrator/clock.c +++ b/arch/arm/mach-integrator/clock.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/list.h> | 13 | #include <linux/list.h> |
14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
15 | #include <linux/err.h> | 15 | #include <linux/err.h> |
16 | #include <linux/string.h> | ||
16 | 17 | ||
17 | #include <asm/semaphore.h> | 18 | #include <asm/semaphore.h> |
18 | #include <asm/hardware/clock.h> | 19 | #include <asm/hardware/clock.h> |
diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index 1f9061ca7ef4..4c0f7c65facf 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/io.h> | 30 | #include <asm/io.h> |
31 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
32 | #include <asm/setup.h> | 32 | #include <asm/setup.h> |
33 | #include <asm/param.h> /* HZ */ | ||
33 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
34 | #include <asm/hardware/amba.h> | 35 | #include <asm/hardware/amba.h> |
35 | #include <asm/hardware/amba_kmi.h> | 36 | #include <asm/hardware/amba_kmi.h> |
diff --git a/arch/arm/mach-integrator/lm.c b/arch/arm/mach-integrator/lm.c index c5f19d160598..5b41e3a724e1 100644 --- a/arch/arm/mach-integrator/lm.c +++ b/arch/arm/mach-integrator/lm.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
13 | #include <linux/slab.h> | ||
13 | 14 | ||
14 | #include <asm/arch/lm.h> | 15 | #include <asm/arch/lm.h> |
15 | 16 | ||
diff --git a/arch/arm/mach-iop3xx/iq31244-pci.c b/arch/arm/mach-iop3xx/iq31244-pci.c index f997daa800bf..c6a973ba8fc6 100644 --- a/arch/arm/mach-iop3xx/iq31244-pci.c +++ b/arch/arm/mach-iop3xx/iq31244-pci.c | |||
@@ -14,6 +14,8 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/string.h> | ||
18 | #include <linux/slab.h> | ||
17 | 19 | ||
18 | #include <asm/hardware.h> | 20 | #include <asm/hardware.h> |
19 | #include <asm/irq.h> | 21 | #include <asm/irq.h> |
diff --git a/arch/arm/mach-iop3xx/iq80321-pci.c b/arch/arm/mach-iop3xx/iq80321-pci.c index 79fea3d20b66..802f6d091b75 100644 --- a/arch/arm/mach-iop3xx/iq80321-pci.c +++ b/arch/arm/mach-iop3xx/iq80321-pci.c | |||
@@ -14,6 +14,8 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/string.h> | ||
18 | #include <linux/slab.h> | ||
17 | 19 | ||
18 | #include <asm/hardware.h> | 20 | #include <asm/hardware.h> |
19 | #include <asm/irq.h> | 21 | #include <asm/irq.h> |
diff --git a/arch/arm/mach-iop3xx/iq80331-pci.c b/arch/arm/mach-iop3xx/iq80331-pci.c index f37a0e26b466..654e450a1311 100644 --- a/arch/arm/mach-iop3xx/iq80331-pci.c +++ b/arch/arm/mach-iop3xx/iq80331-pci.c | |||
@@ -13,6 +13,8 @@ | |||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/string.h> | ||
17 | #include <linux/slab.h> | ||
16 | 18 | ||
17 | #include <asm/hardware.h> | 19 | #include <asm/hardware.h> |
18 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
diff --git a/arch/arm/mach-iop3xx/iq80332-pci.c b/arch/arm/mach-iop3xx/iq80332-pci.c index b9807aa2aade..65951ffe4631 100644 --- a/arch/arm/mach-iop3xx/iq80332-pci.c +++ b/arch/arm/mach-iop3xx/iq80332-pci.c | |||
@@ -13,6 +13,8 @@ | |||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/string.h> | ||
17 | #include <linux/slab.h> | ||
16 | 18 | ||
17 | #include <asm/hardware.h> | 19 | #include <asm/hardware.h> |
18 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index 247147f29b93..eb5f6d744a4a 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c | |||
@@ -33,6 +33,7 @@ | |||
33 | 33 | ||
34 | #include <asm/arch/pxa-regs.h> | 34 | #include <asm/arch/pxa-regs.h> |
35 | #include <asm/arch/irq.h> | 35 | #include <asm/arch/irq.h> |
36 | #include <asm/arch/irda.h> | ||
36 | #include <asm/arch/mmc.h> | 37 | #include <asm/arch/mmc.h> |
37 | #include <asm/arch/udc.h> | 38 | #include <asm/arch/udc.h> |
38 | #include <asm/arch/corgi.h> | 39 | #include <asm/arch/corgi.h> |
@@ -224,6 +225,22 @@ static struct pxamci_platform_data corgi_mci_platform_data = { | |||
224 | }; | 225 | }; |
225 | 226 | ||
226 | 227 | ||
228 | /* | ||
229 | * Irda | ||
230 | */ | ||
231 | static void corgi_irda_transceiver_mode(struct device *dev, int mode) | ||
232 | { | ||
233 | if (mode & IR_OFF) | ||
234 | GPSR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON); | ||
235 | else | ||
236 | GPCR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON); | ||
237 | } | ||
238 | |||
239 | static struct pxaficp_platform_data corgi_ficp_platform_data = { | ||
240 | .transceiver_cap = IR_SIRMODE | IR_OFF, | ||
241 | .transceiver_mode = corgi_irda_transceiver_mode, | ||
242 | }; | ||
243 | |||
227 | 244 | ||
228 | /* | 245 | /* |
229 | * USB Device Controller | 246 | * USB Device Controller |
@@ -269,10 +286,13 @@ static void __init corgi_init(void) | |||
269 | 286 | ||
270 | corgi_ssp_set_machinfo(&corgi_ssp_machinfo); | 287 | corgi_ssp_set_machinfo(&corgi_ssp_machinfo); |
271 | 288 | ||
289 | pxa_gpio_mode(CORGI_GPIO_IR_ON | GPIO_OUT); | ||
272 | pxa_gpio_mode(CORGI_GPIO_USB_PULLUP | GPIO_OUT); | 290 | pxa_gpio_mode(CORGI_GPIO_USB_PULLUP | GPIO_OUT); |
273 | pxa_gpio_mode(CORGI_GPIO_HSYNC | GPIO_IN); | 291 | pxa_gpio_mode(CORGI_GPIO_HSYNC | GPIO_IN); |
292 | |||
274 | pxa_set_udc_info(&udc_info); | 293 | pxa_set_udc_info(&udc_info); |
275 | pxa_set_mci_info(&corgi_mci_platform_data); | 294 | pxa_set_mci_info(&corgi_mci_platform_data); |
295 | pxa_set_ficp_info(&corgi_ficp_platform_data); | ||
276 | 296 | ||
277 | scoop_num = 1; | 297 | scoop_num = 1; |
278 | scoop_devs = &corgi_pcmcia_scoop[0]; | 298 | scoop_devs = &corgi_pcmcia_scoop[0]; |
diff --git a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c index afd5063b0ebe..9b48a90aefce 100644 --- a/arch/arm/mach-pxa/generic.c +++ b/arch/arm/mach-pxa/generic.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
24 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
25 | #include <linux/pm.h> | 25 | #include <linux/pm.h> |
26 | #include <linux/string.h> | ||
26 | 27 | ||
27 | #include <asm/hardware.h> | 28 | #include <asm/hardware.h> |
28 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index 86326307ab9f..ad6a13f95a62 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <asm/arch/irq.h> | 32 | #include <asm/arch/irq.h> |
33 | #include <asm/arch/mmc.h> | 33 | #include <asm/arch/mmc.h> |
34 | #include <asm/arch/udc.h> | 34 | #include <asm/arch/udc.h> |
35 | #include <asm/arch/irda.h> | ||
35 | #include <asm/arch/poodle.h> | 36 | #include <asm/arch/poodle.h> |
36 | #include <asm/arch/pxafb.h> | 37 | #include <asm/arch/pxafb.h> |
37 | 38 | ||
@@ -152,6 +153,24 @@ static struct pxamci_platform_data poodle_mci_platform_data = { | |||
152 | 153 | ||
153 | 154 | ||
154 | /* | 155 | /* |
156 | * Irda | ||
157 | */ | ||
158 | static void poodle_irda_transceiver_mode(struct device *dev, int mode) | ||
159 | { | ||
160 | if (mode & IR_OFF) { | ||
161 | GPSR(POODLE_GPIO_IR_ON) = GPIO_bit(POODLE_GPIO_IR_ON); | ||
162 | } else { | ||
163 | GPCR(POODLE_GPIO_IR_ON) = GPIO_bit(POODLE_GPIO_IR_ON); | ||
164 | } | ||
165 | } | ||
166 | |||
167 | static struct pxaficp_platform_data poodle_ficp_platform_data = { | ||
168 | .transceiver_cap = IR_SIRMODE | IR_OFF, | ||
169 | .transceiver_mode = poodle_irda_transceiver_mode, | ||
170 | }; | ||
171 | |||
172 | |||
173 | /* | ||
155 | * USB Device Controller | 174 | * USB Device Controller |
156 | */ | 175 | */ |
157 | static void poodle_udc_command(int cmd) | 176 | static void poodle_udc_command(int cmd) |
@@ -244,8 +263,10 @@ static void __init poodle_init(void) | |||
244 | 263 | ||
245 | set_pxa_fb_info(&poodle_fb_info); | 264 | set_pxa_fb_info(&poodle_fb_info); |
246 | pxa_gpio_mode(POODLE_GPIO_USB_PULLUP | GPIO_OUT); | 265 | pxa_gpio_mode(POODLE_GPIO_USB_PULLUP | GPIO_OUT); |
266 | pxa_gpio_mode(POODLE_GPIO_IR_ON | GPIO_OUT); | ||
247 | pxa_set_udc_info(&udc_info); | 267 | pxa_set_udc_info(&udc_info); |
248 | pxa_set_mci_info(&poodle_mci_platform_data); | 268 | pxa_set_mci_info(&poodle_mci_platform_data); |
269 | pxa_set_ficp_info(&poodle_ficp_platform_data); | ||
249 | 270 | ||
250 | scoop_num = 1; | 271 | scoop_num = 1; |
251 | scoop_devs = &poodle_pcmcia_scoop[0]; | 272 | scoop_devs = &poodle_pcmcia_scoop[0]; |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 4182ddf330da..6c6878cd2207 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include <asm/arch/pxa-regs.h> | 35 | #include <asm/arch/pxa-regs.h> |
36 | #include <asm/arch/irq.h> | 36 | #include <asm/arch/irq.h> |
37 | #include <asm/arch/irda.h> | ||
37 | #include <asm/arch/mmc.h> | 38 | #include <asm/arch/mmc.h> |
38 | #include <asm/arch/udc.h> | 39 | #include <asm/arch/udc.h> |
39 | #include <asm/arch/pxafb.h> | 40 | #include <asm/arch/pxafb.h> |
@@ -277,6 +278,23 @@ static struct pxamci_platform_data spitz_mci_platform_data = { | |||
277 | 278 | ||
278 | 279 | ||
279 | /* | 280 | /* |
281 | * Irda | ||
282 | */ | ||
283 | static void spitz_irda_transceiver_mode(struct device *dev, int mode) | ||
284 | { | ||
285 | if (mode & IR_OFF) | ||
286 | set_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_IR_ON); | ||
287 | else | ||
288 | reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_IR_ON); | ||
289 | } | ||
290 | |||
291 | static struct pxaficp_platform_data spitz_ficp_platform_data = { | ||
292 | .transceiver_cap = IR_SIRMODE | IR_OFF, | ||
293 | .transceiver_mode = spitz_irda_transceiver_mode, | ||
294 | }; | ||
295 | |||
296 | |||
297 | /* | ||
280 | * Spitz PXA Framebuffer | 298 | * Spitz PXA Framebuffer |
281 | */ | 299 | */ |
282 | static struct pxafb_mach_info spitz_pxafb_info __initdata = { | 300 | static struct pxafb_mach_info spitz_pxafb_info __initdata = { |
@@ -326,6 +344,7 @@ static void __init common_init(void) | |||
326 | 344 | ||
327 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 345 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
328 | pxa_set_mci_info(&spitz_mci_platform_data); | 346 | pxa_set_mci_info(&spitz_mci_platform_data); |
347 | pxa_set_ficp_info(&spitz_ficp_platform_data); | ||
329 | set_pxa_fb_parent(&spitzssp_device.dev); | 348 | set_pxa_fb_parent(&spitzssp_device.dev); |
330 | set_pxa_fb_info(&spitz_pxafb_info); | 349 | set_pxa_fb_info(&spitz_pxafb_info); |
331 | } | 350 | } |
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 976380bde417..2abdc419e984 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/pm.h> | 17 | #include <linux/pm.h> |
18 | #include <linux/cpufreq.h> | 18 | #include <linux/cpufreq.h> |
19 | #include <linux/ioport.h> | 19 | #include <linux/ioport.h> |
20 | #include <linux/sched.h> /* just for sched_clock() - funny that */ | ||
20 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
21 | 22 | ||
22 | #include <asm/div64.h> | 23 | #include <asm/div64.h> |
@@ -24,6 +25,7 @@ | |||
24 | #include <asm/system.h> | 25 | #include <asm/system.h> |
25 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
26 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
28 | #include <asm/mach/flash.h> | ||
27 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
28 | 30 | ||
29 | #include "generic.h" | 31 | #include "generic.h" |
@@ -284,6 +286,7 @@ static struct platform_device sa11x0mtd_device = { | |||
284 | void sa11x0_set_flash_data(struct flash_platform_data *flash, | 286 | void sa11x0_set_flash_data(struct flash_platform_data *flash, |
285 | struct resource *res, int nr) | 287 | struct resource *res, int nr) |
286 | { | 288 | { |
289 | flash->name = "sa1100"; | ||
287 | sa11x0mtd_device.dev.platform_data = flash; | 290 | sa11x0mtd_device.dev.platform_data = flash; |
288 | sa11x0mtd_device.resource = res; | 291 | sa11x0mtd_device.resource = res; |
289 | sa11x0mtd_device.num_resources = nr; | 292 | sa11x0mtd_device.num_resources = nr; |
diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c index 9fb65cffa578..2f671cc3cb99 100644 --- a/arch/arm/mach-sa1100/jornada720.c +++ b/arch/arm/mach-sa1100/jornada720.c | |||
@@ -8,6 +8,8 @@ | |||
8 | #include <linux/delay.h> | 8 | #include <linux/delay.h> |
9 | #include <linux/platform_device.h> | 9 | #include <linux/platform_device.h> |
10 | #include <linux/ioport.h> | 10 | #include <linux/ioport.h> |
11 | #include <linux/mtd/mtd.h> | ||
12 | #include <linux/mtd/partitions.h> | ||
11 | 13 | ||
12 | #include <asm/hardware.h> | 14 | #include <asm/hardware.h> |
13 | #include <asm/hardware/sa1111.h> | 15 | #include <asm/hardware/sa1111.h> |
@@ -16,6 +18,7 @@ | |||
16 | #include <asm/setup.h> | 18 | #include <asm/setup.h> |
17 | 19 | ||
18 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
21 | #include <asm/mach/flash.h> | ||
19 | #include <asm/mach/map.h> | 22 | #include <asm/mach/map.h> |
20 | #include <asm/mach/serial_sa1100.h> | 23 | #include <asm/mach/serial_sa1100.h> |
21 | 24 | ||
@@ -108,6 +111,66 @@ static void __init jornada720_map_io(void) | |||
108 | sa1100_register_uart(1, 1); | 111 | sa1100_register_uart(1, 1); |
109 | } | 112 | } |
110 | 113 | ||
114 | static struct mtd_partition jornada720_partitions[] = { | ||
115 | { | ||
116 | .name = "JORNADA720 boot firmware", | ||
117 | .size = 0x00040000, | ||
118 | .offset = 0, | ||
119 | .mask_flags = MTD_WRITEABLE, /* force read-only */ | ||
120 | }, { | ||
121 | .name = "JORNADA720 kernel", | ||
122 | .size = 0x000c0000, | ||
123 | .offset = 0x00040000, | ||
124 | }, { | ||
125 | .name = "JORNADA720 params", | ||
126 | .size = 0x00040000, | ||
127 | .offset = 0x00100000, | ||
128 | }, { | ||
129 | .name = "JORNADA720 initrd", | ||
130 | .size = 0x00100000, | ||
131 | .offset = 0x00140000, | ||
132 | }, { | ||
133 | .name = "JORNADA720 root cramfs", | ||
134 | .size = 0x00300000, | ||
135 | .offset = 0x00240000, | ||
136 | }, { | ||
137 | .name = "JORNADA720 usr cramfs", | ||
138 | .size = 0x00800000, | ||
139 | .offset = 0x00540000, | ||
140 | }, { | ||
141 | .name = "JORNADA720 usr local", | ||
142 | .size = 0, /* will expand to the end of the flash */ | ||
143 | .offset = 0x00d00000, | ||
144 | } | ||
145 | }; | ||
146 | |||
147 | static void jornada720_set_vpp(int vpp) | ||
148 | { | ||
149 | if (vpp) | ||
150 | PPSR |= 0x80; | ||
151 | else | ||
152 | PPSR &= ~0x80; | ||
153 | PPDR |= 0x80; | ||
154 | } | ||
155 | |||
156 | static struct flash_platform_data jornada720_flash_data = { | ||
157 | .map_name = "cfi_probe", | ||
158 | .set_vpp = jornada720_set_vpp, | ||
159 | .parts = jornada720_partitions, | ||
160 | .nr_parts = ARRAY_SIZE(jornada720_partitions), | ||
161 | }; | ||
162 | |||
163 | static struct resource jornada720_flash_resource = { | ||
164 | .start = SA1100_CS0_PHYS, | ||
165 | .end = SA1100_CS0_PHYS + SZ_32M - 1, | ||
166 | .flags = IORESOURCE_MEM, | ||
167 | }; | ||
168 | |||
169 | static void __init jornada720_mach_init(void) | ||
170 | { | ||
171 | sa11x0_set_flash_data(&jornada720_flash_data, &jornada720_flash_resource, 1); | ||
172 | } | ||
173 | |||
111 | MACHINE_START(JORNADA720, "HP Jornada 720") | 174 | MACHINE_START(JORNADA720, "HP Jornada 720") |
112 | /* Maintainer: Michael Gernoth <michael@gernoth.net> */ | 175 | /* Maintainer: Michael Gernoth <michael@gernoth.net> */ |
113 | .phys_ram = 0xc0000000, | 176 | .phys_ram = 0xc0000000, |
@@ -117,4 +180,5 @@ MACHINE_START(JORNADA720, "HP Jornada 720") | |||
117 | .map_io = jornada720_map_io, | 180 | .map_io = jornada720_map_io, |
118 | .init_irq = sa1100_init_irq, | 181 | .init_irq = sa1100_init_irq, |
119 | .timer = &sa1100_timer, | 182 | .timer = &sa1100_timer, |
183 | .init_machine = jornada720_mach_init, | ||
120 | MACHINE_END | 184 | MACHINE_END |
diff --git a/arch/arm/mach-versatile/clock.c b/arch/arm/mach-versatile/clock.c index 48025c2b9987..b96a2ea15d41 100644 --- a/arch/arm/mach-versatile/clock.c +++ b/arch/arm/mach-versatile/clock.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/list.h> | 13 | #include <linux/list.h> |
14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
15 | #include <linux/err.h> | 15 | #include <linux/err.h> |
16 | #include <linux/string.h> | ||
16 | 17 | ||
17 | #include <asm/semaphore.h> | 18 | #include <asm/semaphore.h> |
18 | #include <asm/hardware/clock.h> | 19 | #include <asm/hardware/clock.h> |
diff --git a/arch/arm/mm/consistent.c b/arch/arm/mm/consistent.c index 82f4d5e27c54..47b0b767f080 100644 --- a/arch/arm/mm/consistent.c +++ b/arch/arm/mm/consistent.c | |||
@@ -397,8 +397,6 @@ static int __init consistent_init(void) | |||
397 | pte_t *pte; | 397 | pte_t *pte; |
398 | int ret = 0; | 398 | int ret = 0; |
399 | 399 | ||
400 | spin_lock(&init_mm.page_table_lock); | ||
401 | |||
402 | do { | 400 | do { |
403 | pgd = pgd_offset(&init_mm, CONSISTENT_BASE); | 401 | pgd = pgd_offset(&init_mm, CONSISTENT_BASE); |
404 | pmd = pmd_alloc(&init_mm, pgd, CONSISTENT_BASE); | 402 | pmd = pmd_alloc(&init_mm, pgd, CONSISTENT_BASE); |
@@ -409,7 +407,7 @@ static int __init consistent_init(void) | |||
409 | } | 407 | } |
410 | WARN_ON(!pmd_none(*pmd)); | 408 | WARN_ON(!pmd_none(*pmd)); |
411 | 409 | ||
412 | pte = pte_alloc_kernel(&init_mm, pmd, CONSISTENT_BASE); | 410 | pte = pte_alloc_kernel(pmd, CONSISTENT_BASE); |
413 | if (!pte) { | 411 | if (!pte) { |
414 | printk(KERN_ERR "%s: no pte tables\n", __func__); | 412 | printk(KERN_ERR "%s: no pte tables\n", __func__); |
415 | ret = -ENOMEM; | 413 | ret = -ENOMEM; |
@@ -419,8 +417,6 @@ static int __init consistent_init(void) | |||
419 | consistent_pte = pte; | 417 | consistent_pte = pte; |
420 | } while (0); | 418 | } while (0); |
421 | 419 | ||
422 | spin_unlock(&init_mm.page_table_lock); | ||
423 | |||
424 | return ret; | 420 | return ret; |
425 | } | 421 | } |
426 | 422 | ||
diff --git a/arch/arm/mm/copypage-v6.c b/arch/arm/mm/copypage-v6.c index 27d041574ea7..269ce6913ee9 100644 --- a/arch/arm/mm/copypage-v6.c +++ b/arch/arm/mm/copypage-v6.c | |||
@@ -22,9 +22,7 @@ | |||
22 | #endif | 22 | #endif |
23 | 23 | ||
24 | #define from_address (0xffff8000) | 24 | #define from_address (0xffff8000) |
25 | #define from_pgprot PAGE_KERNEL | ||
26 | #define to_address (0xffffc000) | 25 | #define to_address (0xffffc000) |
27 | #define to_pgprot PAGE_KERNEL | ||
28 | 26 | ||
29 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) | 27 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) |
30 | 28 | ||
@@ -34,7 +32,7 @@ static DEFINE_SPINLOCK(v6_lock); | |||
34 | * Copy the user page. No aliasing to deal with so we can just | 32 | * Copy the user page. No aliasing to deal with so we can just |
35 | * attack the kernel's existing mapping of these pages. | 33 | * attack the kernel's existing mapping of these pages. |
36 | */ | 34 | */ |
37 | void v6_copy_user_page_nonaliasing(void *kto, const void *kfrom, unsigned long vaddr) | 35 | static void v6_copy_user_page_nonaliasing(void *kto, const void *kfrom, unsigned long vaddr) |
38 | { | 36 | { |
39 | copy_page(kto, kfrom); | 37 | copy_page(kto, kfrom); |
40 | } | 38 | } |
@@ -43,7 +41,7 @@ void v6_copy_user_page_nonaliasing(void *kto, const void *kfrom, unsigned long v | |||
43 | * Clear the user page. No aliasing to deal with so we can just | 41 | * Clear the user page. No aliasing to deal with so we can just |
44 | * attack the kernel's existing mapping of this page. | 42 | * attack the kernel's existing mapping of this page. |
45 | */ | 43 | */ |
46 | void v6_clear_user_page_nonaliasing(void *kaddr, unsigned long vaddr) | 44 | static void v6_clear_user_page_nonaliasing(void *kaddr, unsigned long vaddr) |
47 | { | 45 | { |
48 | clear_page(kaddr); | 46 | clear_page(kaddr); |
49 | } | 47 | } |
@@ -51,7 +49,7 @@ void v6_clear_user_page_nonaliasing(void *kaddr, unsigned long vaddr) | |||
51 | /* | 49 | /* |
52 | * Copy the page, taking account of the cache colour. | 50 | * Copy the page, taking account of the cache colour. |
53 | */ | 51 | */ |
54 | void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vaddr) | 52 | static void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vaddr) |
55 | { | 53 | { |
56 | unsigned int offset = CACHE_COLOUR(vaddr); | 54 | unsigned int offset = CACHE_COLOUR(vaddr); |
57 | unsigned long from, to; | 55 | unsigned long from, to; |
@@ -72,8 +70,8 @@ void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vadd | |||
72 | */ | 70 | */ |
73 | spin_lock(&v6_lock); | 71 | spin_lock(&v6_lock); |
74 | 72 | ||
75 | set_pte(TOP_PTE(from_address) + offset, pfn_pte(__pa(kfrom) >> PAGE_SHIFT, from_pgprot)); | 73 | set_pte(TOP_PTE(from_address) + offset, pfn_pte(__pa(kfrom) >> PAGE_SHIFT, PAGE_KERNEL)); |
76 | set_pte(TOP_PTE(to_address) + offset, pfn_pte(__pa(kto) >> PAGE_SHIFT, to_pgprot)); | 74 | set_pte(TOP_PTE(to_address) + offset, pfn_pte(__pa(kto) >> PAGE_SHIFT, PAGE_KERNEL)); |
77 | 75 | ||
78 | from = from_address + (offset << PAGE_SHIFT); | 76 | from = from_address + (offset << PAGE_SHIFT); |
79 | to = to_address + (offset << PAGE_SHIFT); | 77 | to = to_address + (offset << PAGE_SHIFT); |
@@ -91,7 +89,7 @@ void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vadd | |||
91 | * so remap the kernel page into the same cache colour as the user | 89 | * so remap the kernel page into the same cache colour as the user |
92 | * page. | 90 | * page. |
93 | */ | 91 | */ |
94 | void v6_clear_user_page_aliasing(void *kaddr, unsigned long vaddr) | 92 | static void v6_clear_user_page_aliasing(void *kaddr, unsigned long vaddr) |
95 | { | 93 | { |
96 | unsigned int offset = CACHE_COLOUR(vaddr); | 94 | unsigned int offset = CACHE_COLOUR(vaddr); |
97 | unsigned long to = to_address + (offset << PAGE_SHIFT); | 95 | unsigned long to = to_address + (offset << PAGE_SHIFT); |
@@ -112,7 +110,7 @@ void v6_clear_user_page_aliasing(void *kaddr, unsigned long vaddr) | |||
112 | */ | 110 | */ |
113 | spin_lock(&v6_lock); | 111 | spin_lock(&v6_lock); |
114 | 112 | ||
115 | set_pte(TOP_PTE(to_address) + offset, pfn_pte(__pa(kaddr) >> PAGE_SHIFT, to_pgprot)); | 113 | set_pte(TOP_PTE(to_address) + offset, pfn_pte(__pa(kaddr) >> PAGE_SHIFT, PAGE_KERNEL)); |
116 | flush_tlb_kernel_page(to); | 114 | flush_tlb_kernel_page(to); |
117 | clear_page((void *)to); | 115 | clear_page((void *)to); |
118 | 116 | ||
diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c index be4ab3d73c91..7fc1b35a6746 100644 --- a/arch/arm/mm/fault-armv.c +++ b/arch/arm/mm/fault-armv.c | |||
@@ -26,6 +26,11 @@ static unsigned long shared_pte_mask = L_PTE_CACHEABLE; | |||
26 | /* | 26 | /* |
27 | * We take the easy way out of this problem - we make the | 27 | * We take the easy way out of this problem - we make the |
28 | * PTE uncacheable. However, we leave the write buffer on. | 28 | * PTE uncacheable. However, we leave the write buffer on. |
29 | * | ||
30 | * Note that the pte lock held when calling update_mmu_cache must also | ||
31 | * guard the pte (somewhere else in the same mm) that we modify here. | ||
32 | * Therefore those configurations which might call adjust_pte (those | ||
33 | * without CONFIG_CPU_CACHE_VIPT) cannot support split page_table_lock. | ||
29 | */ | 34 | */ |
30 | static int adjust_pte(struct vm_area_struct *vma, unsigned long address) | 35 | static int adjust_pte(struct vm_area_struct *vma, unsigned long address) |
31 | { | 36 | { |
@@ -127,7 +132,7 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page); | |||
127 | * 2. If we have multiple shared mappings of the same space in | 132 | * 2. If we have multiple shared mappings of the same space in |
128 | * an object, we need to deal with the cache aliasing issues. | 133 | * an object, we need to deal with the cache aliasing issues. |
129 | * | 134 | * |
130 | * Note that the page_table_lock will be held. | 135 | * Note that the pte lock will be held. |
131 | */ | 136 | */ |
132 | void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t pte) | 137 | void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t pte) |
133 | { | 138 | { |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index f4496813615a..fd079ff1fc53 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -363,20 +363,16 @@ static void __init bootmem_init(struct meminfo *mi) | |||
363 | 363 | ||
364 | memcpy(&meminfo, mi, sizeof(meminfo)); | 364 | memcpy(&meminfo, mi, sizeof(meminfo)); |
365 | 365 | ||
366 | #ifdef CONFIG_XIP_KERNEL | ||
367 | #error needs fixing | ||
368 | p->pfn = __phys_to_pfn(CONFIG_XIP_PHYS_ADDR & PMD_MASK); | ||
369 | p->virtual = (unsigned long)&_stext & PMD_MASK; | ||
370 | p->length = ((unsigned long)&_etext - p->virtual + ~PMD_MASK) & PMD_MASK; | ||
371 | p->type = MT_ROM; | ||
372 | p ++; | ||
373 | #endif | ||
374 | |||
375 | /* | 366 | /* |
376 | * Clear out all the mappings below the kernel image. | 367 | * Clear out all the mappings below the kernel image. |
377 | * FIXME: what about XIP? | ||
378 | */ | 368 | */ |
379 | for (addr = 0; addr < PAGE_OFFSET; addr += PGDIR_SIZE) | 369 | for (addr = 0; addr < MODULE_START; addr += PGDIR_SIZE) |
370 | pmd_clear(pmd_off_k(addr)); | ||
371 | #ifdef CONFIG_XIP_KERNEL | ||
372 | /* The XIP kernel is mapped in the module area -- skip over it */ | ||
373 | addr = ((unsigned long)&_etext + PGDIR_SIZE - 1) & PGDIR_MASK; | ||
374 | #endif | ||
375 | for ( ; addr < PAGE_OFFSET; addr += PGDIR_SIZE) | ||
380 | pmd_clear(pmd_off_k(addr)); | 376 | pmd_clear(pmd_off_k(addr)); |
381 | 377 | ||
382 | /* | 378 | /* |
@@ -436,6 +432,18 @@ static void __init devicemaps_init(struct machine_desc *mdesc) | |||
436 | pmd_clear(pmd_off_k(addr)); | 432 | pmd_clear(pmd_off_k(addr)); |
437 | 433 | ||
438 | /* | 434 | /* |
435 | * Map the kernel if it is XIP. | ||
436 | * It is always first in the modulearea. | ||
437 | */ | ||
438 | #ifdef CONFIG_XIP_KERNEL | ||
439 | map.pfn = __phys_to_pfn(CONFIG_XIP_PHYS_ADDR & PGDIR_MASK); | ||
440 | map.virtual = MODULE_START; | ||
441 | map.length = ((unsigned long)&_etext - map.virtual + ~PGDIR_MASK) & PGDIR_MASK; | ||
442 | map.type = MT_ROM; | ||
443 | create_mapping(&map); | ||
444 | #endif | ||
445 | |||
446 | /* | ||
439 | * Map the cache flushing regions. | 447 | * Map the cache flushing regions. |
440 | */ | 448 | */ |
441 | #ifdef FLUSH_BASE | 449 | #ifdef FLUSH_BASE |
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 6fb1258df1b5..0f128c28fee4 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -75,7 +75,7 @@ remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size, | |||
75 | 75 | ||
76 | pgprot = __pgprot(L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | L_PTE_WRITE | flags); | 76 | pgprot = __pgprot(L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | L_PTE_WRITE | flags); |
77 | do { | 77 | do { |
78 | pte_t * pte = pte_alloc_kernel(&init_mm, pmd, address); | 78 | pte_t * pte = pte_alloc_kernel(pmd, address); |
79 | if (!pte) | 79 | if (!pte) |
80 | return -ENOMEM; | 80 | return -ENOMEM; |
81 | remap_area_pte(pte, address, end - address, address + phys_addr, pgprot); | 81 | remap_area_pte(pte, address, end - address, address + phys_addr, pgprot); |
@@ -97,7 +97,6 @@ remap_area_pages(unsigned long start, unsigned long phys_addr, | |||
97 | phys_addr -= address; | 97 | phys_addr -= address; |
98 | dir = pgd_offset(&init_mm, address); | 98 | dir = pgd_offset(&init_mm, address); |
99 | BUG_ON(address >= end); | 99 | BUG_ON(address >= end); |
100 | spin_lock(&init_mm.page_table_lock); | ||
101 | do { | 100 | do { |
102 | pmd_t *pmd = pmd_alloc(&init_mm, dir, address); | 101 | pmd_t *pmd = pmd_alloc(&init_mm, dir, address); |
103 | if (!pmd) { | 102 | if (!pmd) { |
@@ -114,7 +113,6 @@ remap_area_pages(unsigned long start, unsigned long phys_addr, | |||
114 | dir++; | 113 | dir++; |
115 | } while (address && (address < end)); | 114 | } while (address && (address < end)); |
116 | 115 | ||
117 | spin_unlock(&init_mm.page_table_lock); | ||
118 | flush_cache_vmap(start, end); | 116 | flush_cache_vmap(start, end); |
119 | return err; | 117 | return err; |
120 | } | 118 | } |
diff --git a/arch/arm/mm/mm-armv.c b/arch/arm/mm/mm-armv.c index 61bc2fa0511e..1221fdde1769 100644 --- a/arch/arm/mm/mm-armv.c +++ b/arch/arm/mm/mm-armv.c | |||
@@ -180,11 +180,6 @@ pgd_t *get_pgd_slow(struct mm_struct *mm) | |||
180 | 180 | ||
181 | if (!vectors_high()) { | 181 | if (!vectors_high()) { |
182 | /* | 182 | /* |
183 | * This lock is here just to satisfy pmd_alloc and pte_lock | ||
184 | */ | ||
185 | spin_lock(&mm->page_table_lock); | ||
186 | |||
187 | /* | ||
188 | * On ARM, first page must always be allocated since it | 183 | * On ARM, first page must always be allocated since it |
189 | * contains the machine vectors. | 184 | * contains the machine vectors. |
190 | */ | 185 | */ |
@@ -201,23 +196,14 @@ pgd_t *get_pgd_slow(struct mm_struct *mm) | |||
201 | set_pte(new_pte, *init_pte); | 196 | set_pte(new_pte, *init_pte); |
202 | pte_unmap_nested(init_pte); | 197 | pte_unmap_nested(init_pte); |
203 | pte_unmap(new_pte); | 198 | pte_unmap(new_pte); |
204 | |||
205 | spin_unlock(&mm->page_table_lock); | ||
206 | } | 199 | } |
207 | 200 | ||
208 | return new_pgd; | 201 | return new_pgd; |
209 | 202 | ||
210 | no_pte: | 203 | no_pte: |
211 | spin_unlock(&mm->page_table_lock); | ||
212 | pmd_free(new_pmd); | 204 | pmd_free(new_pmd); |
213 | free_pages((unsigned long)new_pgd, 2); | ||
214 | return NULL; | ||
215 | |||
216 | no_pmd: | 205 | no_pmd: |
217 | spin_unlock(&mm->page_table_lock); | ||
218 | free_pages((unsigned long)new_pgd, 2); | 206 | free_pages((unsigned long)new_pgd, 2); |
219 | return NULL; | ||
220 | |||
221 | no_pgd: | 207 | no_pgd: |
222 | return NULL; | 208 | return NULL; |
223 | } | 209 | } |
@@ -243,6 +229,7 @@ void free_pgd_slow(pgd_t *pgd) | |||
243 | pte = pmd_page(*pmd); | 229 | pte = pmd_page(*pmd); |
244 | pmd_clear(pmd); | 230 | pmd_clear(pmd); |
245 | dec_page_state(nr_page_table_pages); | 231 | dec_page_state(nr_page_table_pages); |
232 | pte_lock_deinit(pte); | ||
246 | pte_free(pte); | 233 | pte_free(pte); |
247 | pmd_free(pmd); | 234 | pmd_free(pmd); |
248 | free: | 235 | free: |
diff --git a/arch/arm/oprofile/backtrace.c b/arch/arm/oprofile/backtrace.c index df35c452a8bf..7c22c12618cc 100644 --- a/arch/arm/oprofile/backtrace.c +++ b/arch/arm/oprofile/backtrace.c | |||
@@ -49,42 +49,22 @@ static struct frame_tail* kernel_backtrace(struct frame_tail *tail) | |||
49 | 49 | ||
50 | static struct frame_tail* user_backtrace(struct frame_tail *tail) | 50 | static struct frame_tail* user_backtrace(struct frame_tail *tail) |
51 | { | 51 | { |
52 | struct frame_tail buftail; | 52 | struct frame_tail buftail[2]; |
53 | 53 | ||
54 | /* hardware pte might not be valid due to dirty/accessed bit emulation | 54 | /* Also check accessibility of one struct frame_tail beyond */ |
55 | * so we use copy_from_user and benefit from exception fixups */ | 55 | if (!access_ok(VERIFY_READ, tail, sizeof(buftail))) |
56 | if (copy_from_user(&buftail, tail, sizeof(struct frame_tail))) | 56 | return NULL; |
57 | if (__copy_from_user_inatomic(buftail, tail, sizeof(buftail))) | ||
57 | return NULL; | 58 | return NULL; |
58 | 59 | ||
59 | oprofile_add_trace(buftail.lr); | 60 | oprofile_add_trace(buftail[0].lr); |
60 | 61 | ||
61 | /* frame pointers should strictly progress back up the stack | 62 | /* frame pointers should strictly progress back up the stack |
62 | * (towards higher addresses) */ | 63 | * (towards higher addresses) */ |
63 | if (tail >= buftail.fp) | 64 | if (tail >= buftail[0].fp) |
64 | return NULL; | 65 | return NULL; |
65 | 66 | ||
66 | return buftail.fp-1; | 67 | return buftail[0].fp-1; |
67 | } | ||
68 | |||
69 | /* Compare two addresses and see if they're on the same page */ | ||
70 | #define CMP_ADDR_EQUAL(x,y,offset) ((((unsigned long) x) >> PAGE_SHIFT) \ | ||
71 | == ((((unsigned long) y) + offset) >> PAGE_SHIFT)) | ||
72 | |||
73 | /* check that the page(s) containing the frame tail are present */ | ||
74 | static int pages_present(struct frame_tail *tail) | ||
75 | { | ||
76 | struct mm_struct * mm = current->mm; | ||
77 | |||
78 | if (!check_user_page_readable(mm, (unsigned long)tail)) | ||
79 | return 0; | ||
80 | |||
81 | if (CMP_ADDR_EQUAL(tail, tail, 8)) | ||
82 | return 1; | ||
83 | |||
84 | if (!check_user_page_readable(mm, ((unsigned long)tail) + 8)) | ||
85 | return 0; | ||
86 | |||
87 | return 1; | ||
88 | } | 68 | } |
89 | 69 | ||
90 | /* | 70 | /* |
@@ -118,7 +98,6 @@ static int valid_kernel_stack(struct frame_tail *tail, struct pt_regs *regs) | |||
118 | void arm_backtrace(struct pt_regs * const regs, unsigned int depth) | 98 | void arm_backtrace(struct pt_regs * const regs, unsigned int depth) |
119 | { | 99 | { |
120 | struct frame_tail *tail; | 100 | struct frame_tail *tail; |
121 | unsigned long last_address = 0; | ||
122 | 101 | ||
123 | tail = ((struct frame_tail *) regs->ARM_fp) - 1; | 102 | tail = ((struct frame_tail *) regs->ARM_fp) - 1; |
124 | 103 | ||
@@ -132,13 +111,6 @@ void arm_backtrace(struct pt_regs * const regs, unsigned int depth) | |||
132 | return; | 111 | return; |
133 | } | 112 | } |
134 | 113 | ||
135 | while (depth-- && tail && !((unsigned long) tail & 3)) { | 114 | while (depth-- && tail && !((unsigned long) tail & 3)) |
136 | if ((!CMP_ADDR_EQUAL(last_address, tail, 0) | ||
137 | || !CMP_ADDR_EQUAL(last_address, tail, 8)) | ||
138 | && !pages_present(tail)) | ||
139 | return; | ||
140 | last_address = (unsigned long) tail; | ||
141 | tail = user_backtrace(tail); | 115 | tail = user_backtrace(tail); |
142 | } | ||
143 | } | 116 | } |
144 | |||
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 52a58b2da288..a020fe16428f 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/list.h> | 13 | #include <linux/list.h> |
14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
15 | #include <linux/err.h> | 15 | #include <linux/err.h> |
16 | #include <linux/string.h> | ||
16 | 17 | ||
17 | #include <asm/io.h> | 18 | #include <asm/io.h> |
18 | #include <asm/semaphore.h> | 19 | #include <asm/semaphore.h> |