diff options
author | Anton Altaparmakov <aia21@cantab.net> | 2005-09-26 05:50:29 -0400 |
---|---|---|
committer | Anton Altaparmakov <aia21@cantab.net> | 2005-09-26 05:50:29 -0400 |
commit | e8c2cd99a3933d93413910bc93cbd5b53177110b (patch) | |
tree | ea4c1d63b1bdeb9ef1aacacad0ac9c7dc0768fdc /arch | |
parent | 5a8c0cc32bb6e029cd9c36f655c6b0955b0d9967 (diff) | |
parent | 8ddec7460d2f5db3ac35812c03676b1473d1d668 (diff) |
Merge branch 'master' of /home/src/linux-2.6/
Diffstat (limited to 'arch')
34 files changed, 300 insertions, 118 deletions
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index fa98dae3cd..eb20c3afff 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c | |||
@@ -127,6 +127,10 @@ common_shutdown_1(void *generic_ptr) | |||
127 | /* If booted from SRM, reset some of the original environment. */ | 127 | /* If booted from SRM, reset some of the original environment. */ |
128 | if (alpha_using_srm) { | 128 | if (alpha_using_srm) { |
129 | #ifdef CONFIG_DUMMY_CONSOLE | 129 | #ifdef CONFIG_DUMMY_CONSOLE |
130 | /* If we've gotten here after SysRq-b, leave interrupt | ||
131 | context before taking over the console. */ | ||
132 | if (in_interrupt()) | ||
133 | irq_exit(); | ||
130 | /* This has the effect of resetting the VGA video origin. */ | 134 | /* This has the effect of resetting the VGA video origin. */ |
131 | take_over_console(&dummy_con, 0, MAX_NR_CONSOLES-1, 1); | 135 | take_over_console(&dummy_con, 0, MAX_NR_CONSOLES-1, 1); |
132 | #endif | 136 | #endif |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 7152bfbee5..93b5e8e529 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -537,7 +537,7 @@ ENTRY(__switch_to) | |||
537 | #ifdef CONFIG_CPU_MPCORE | 537 | #ifdef CONFIG_CPU_MPCORE |
538 | clrex | 538 | clrex |
539 | #else | 539 | #else |
540 | strex r3, r4, [ip] @ Clear exclusive monitor | 540 | strex r5, r4, [ip] @ Clear exclusive monitor |
541 | #endif | 541 | #endif |
542 | #endif | 542 | #endif |
543 | #if defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_IWMMXT) | 543 | #if defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_IWMMXT) |
diff --git a/arch/arm/kernel/io.c b/arch/arm/kernel/io.c index 6c20c1188b..1f6822dfae 100644 --- a/arch/arm/kernel/io.c +++ b/arch/arm/kernel/io.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * Copy data from IO memory space to "real" memory space. | 7 | * Copy data from IO memory space to "real" memory space. |
8 | * This needs to be optimized. | 8 | * This needs to be optimized. |
9 | */ | 9 | */ |
10 | void _memcpy_fromio(void *to, void __iomem *from, size_t count) | 10 | void _memcpy_fromio(void *to, const volatile void __iomem *from, size_t count) |
11 | { | 11 | { |
12 | unsigned char *t = to; | 12 | unsigned char *t = to; |
13 | while (count) { | 13 | while (count) { |
@@ -22,7 +22,7 @@ void _memcpy_fromio(void *to, void __iomem *from, size_t count) | |||
22 | * Copy data from "real" memory space to IO memory space. | 22 | * Copy data from "real" memory space to IO memory space. |
23 | * This needs to be optimized. | 23 | * This needs to be optimized. |
24 | */ | 24 | */ |
25 | void _memcpy_toio(void __iomem *to, const void *from, size_t count) | 25 | void _memcpy_toio(volatile void __iomem *to, const void *from, size_t count) |
26 | { | 26 | { |
27 | const unsigned char *f = from; | 27 | const unsigned char *f = from; |
28 | while (count) { | 28 | while (count) { |
@@ -37,7 +37,7 @@ void _memcpy_toio(void __iomem *to, const void *from, size_t count) | |||
37 | * "memset" on IO memory space. | 37 | * "memset" on IO memory space. |
38 | * This needs to be optimized. | 38 | * This needs to be optimized. |
39 | */ | 39 | */ |
40 | void _memset_io(void __iomem *dst, int c, size_t count) | 40 | void _memset_io(volatile void __iomem *dst, int c, size_t count) |
41 | { | 41 | { |
42 | while (count) { | 42 | while (count) { |
43 | count--; | 43 | count--; |
diff --git a/arch/ia64/hp/sim/simscsi.c b/arch/ia64/hp/sim/simscsi.c index 56405dbfd7..a18983a3c9 100644 --- a/arch/ia64/hp/sim/simscsi.c +++ b/arch/ia64/hp/sim/simscsi.c | |||
@@ -233,6 +233,23 @@ simscsi_readwrite10 (struct scsi_cmnd *sc, int mode) | |||
233 | simscsi_readwrite(sc, mode, offset, ((sc->cmnd[7] << 8) | sc->cmnd[8])*512); | 233 | simscsi_readwrite(sc, mode, offset, ((sc->cmnd[7] << 8) | sc->cmnd[8])*512); |
234 | } | 234 | } |
235 | 235 | ||
236 | static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len) | ||
237 | { | ||
238 | |||
239 | int scatterlen = sc->use_sg; | ||
240 | struct scatterlist *slp; | ||
241 | |||
242 | if (scatterlen == 0) | ||
243 | memcpy(sc->request_buffer, buf, len); | ||
244 | else for (slp = (struct scatterlist *)sc->buffer; scatterlen-- > 0 && len > 0; slp++) { | ||
245 | unsigned thislen = min(len, slp->length); | ||
246 | |||
247 | memcpy(page_address(slp->page) + slp->offset, buf, thislen); | ||
248 | slp++; | ||
249 | len -= thislen; | ||
250 | } | ||
251 | } | ||
252 | |||
236 | static int | 253 | static int |
237 | simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) | 254 | simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) |
238 | { | 255 | { |
@@ -240,6 +257,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) | |||
240 | char fname[MAX_ROOT_LEN+16]; | 257 | char fname[MAX_ROOT_LEN+16]; |
241 | size_t disk_size; | 258 | size_t disk_size; |
242 | char *buf; | 259 | char *buf; |
260 | char localbuf[36]; | ||
243 | #if DEBUG_SIMSCSI | 261 | #if DEBUG_SIMSCSI |
244 | register long sp asm ("sp"); | 262 | register long sp asm ("sp"); |
245 | 263 | ||
@@ -263,7 +281,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) | |||
263 | /* disk doesn't exist... */ | 281 | /* disk doesn't exist... */ |
264 | break; | 282 | break; |
265 | } | 283 | } |
266 | buf = sc->request_buffer; | 284 | buf = localbuf; |
267 | buf[0] = 0; /* magnetic disk */ | 285 | buf[0] = 0; /* magnetic disk */ |
268 | buf[1] = 0; /* not a removable medium */ | 286 | buf[1] = 0; /* not a removable medium */ |
269 | buf[2] = 2; /* SCSI-2 compliant device */ | 287 | buf[2] = 2; /* SCSI-2 compliant device */ |
@@ -273,6 +291,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) | |||
273 | buf[6] = 0; /* reserved */ | 291 | buf[6] = 0; /* reserved */ |
274 | buf[7] = 0; /* various flags */ | 292 | buf[7] = 0; /* various flags */ |
275 | memcpy(buf + 8, "HP SIMULATED DISK 0.00", 28); | 293 | memcpy(buf + 8, "HP SIMULATED DISK 0.00", 28); |
294 | simscsi_fillresult(sc, buf, 36); | ||
276 | sc->result = GOOD; | 295 | sc->result = GOOD; |
277 | break; | 296 | break; |
278 | 297 | ||
@@ -304,16 +323,13 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) | |||
304 | simscsi_readwrite10(sc, SSC_WRITE); | 323 | simscsi_readwrite10(sc, SSC_WRITE); |
305 | break; | 324 | break; |
306 | 325 | ||
307 | |||
308 | case READ_CAPACITY: | 326 | case READ_CAPACITY: |
309 | if (desc[target_id] < 0 || sc->request_bufflen < 8) { | 327 | if (desc[target_id] < 0 || sc->request_bufflen < 8) { |
310 | break; | 328 | break; |
311 | } | 329 | } |
312 | buf = sc->request_buffer; | 330 | buf = localbuf; |
313 | |||
314 | disk_size = simscsi_get_disk_size(desc[target_id]); | 331 | disk_size = simscsi_get_disk_size(desc[target_id]); |
315 | 332 | ||
316 | /* pretend to be a 1GB disk (partition table contains real stuff): */ | ||
317 | buf[0] = (disk_size >> 24) & 0xff; | 333 | buf[0] = (disk_size >> 24) & 0xff; |
318 | buf[1] = (disk_size >> 16) & 0xff; | 334 | buf[1] = (disk_size >> 16) & 0xff; |
319 | buf[2] = (disk_size >> 8) & 0xff; | 335 | buf[2] = (disk_size >> 8) & 0xff; |
@@ -323,13 +339,14 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) | |||
323 | buf[5] = 0; | 339 | buf[5] = 0; |
324 | buf[6] = 2; | 340 | buf[6] = 2; |
325 | buf[7] = 0; | 341 | buf[7] = 0; |
342 | simscsi_fillresult(sc, buf, 8); | ||
326 | sc->result = GOOD; | 343 | sc->result = GOOD; |
327 | break; | 344 | break; |
328 | 345 | ||
329 | case MODE_SENSE: | 346 | case MODE_SENSE: |
330 | case MODE_SENSE_10: | 347 | case MODE_SENSE_10: |
331 | /* sd.c uses this to determine whether disk does write-caching. */ | 348 | /* sd.c uses this to determine whether disk does write-caching. */ |
332 | memset(sc->request_buffer, 0, 128); | 349 | simscsi_fillresult(sc, (char *)empty_zero_page, sc->request_bufflen); |
333 | sc->result = GOOD; | 350 | sc->result = GOOD; |
334 | break; | 351 | break; |
335 | 352 | ||
diff --git a/arch/ia64/kernel/mca_asm.S b/arch/ia64/kernel/mca_asm.S index 499a065f4e..db32fc1d39 100644 --- a/arch/ia64/kernel/mca_asm.S +++ b/arch/ia64/kernel/mca_asm.S | |||
@@ -489,24 +489,27 @@ ia64_state_save: | |||
489 | ;; | 489 | ;; |
490 | st8 [temp1]=r17,16 // pal_min_state | 490 | st8 [temp1]=r17,16 // pal_min_state |
491 | st8 [temp2]=r6,16 // prev_IA64_KR_CURRENT | 491 | st8 [temp2]=r6,16 // prev_IA64_KR_CURRENT |
492 | mov r6=IA64_KR(CURRENT_STACK) | ||
493 | ;; | ||
494 | st8 [temp1]=r6,16 // prev_IA64_KR_CURRENT_STACK | ||
495 | st8 [temp2]=r0,16 // prev_task, starts off as NULL | ||
492 | mov r6=cr.ifa | 496 | mov r6=cr.ifa |
493 | ;; | 497 | ;; |
494 | st8 [temp1]=r0,16 // prev_task, starts off as NULL | 498 | st8 [temp1]=r12,16 // cr.isr |
495 | st8 [temp2]=r12,16 // cr.isr | 499 | st8 [temp2]=r6,16 // cr.ifa |
496 | mov r12=cr.itir | 500 | mov r12=cr.itir |
497 | ;; | 501 | ;; |
498 | st8 [temp1]=r6,16 // cr.ifa | 502 | st8 [temp1]=r12,16 // cr.itir |
499 | st8 [temp2]=r12,16 // cr.itir | 503 | st8 [temp2]=r11,16 // cr.iipa |
500 | mov r12=cr.iim | 504 | mov r12=cr.iim |
501 | ;; | 505 | ;; |
502 | st8 [temp1]=r11,16 // cr.iipa | 506 | st8 [temp1]=r12,16 // cr.iim |
503 | st8 [temp2]=r12,16 // cr.iim | ||
504 | mov r6=cr.iha | ||
505 | (p1) mov r12=IA64_MCA_COLD_BOOT | 507 | (p1) mov r12=IA64_MCA_COLD_BOOT |
506 | (p2) mov r12=IA64_INIT_WARM_BOOT | 508 | (p2) mov r12=IA64_INIT_WARM_BOOT |
509 | mov r6=cr.iha | ||
507 | ;; | 510 | ;; |
508 | st8 [temp1]=r6,16 // cr.iha | 511 | st8 [temp2]=r6,16 // cr.iha |
509 | st8 [temp2]=r12 // os_status, default is cold boot | 512 | st8 [temp1]=r12 // os_status, default is cold boot |
510 | mov r6=IA64_MCA_SAME_CONTEXT | 513 | mov r6=IA64_MCA_SAME_CONTEXT |
511 | ;; | 514 | ;; |
512 | st8 [temp1]=r6 // context, default is same context | 515 | st8 [temp1]=r6 // context, default is same context |
@@ -823,9 +826,12 @@ ia64_state_restore: | |||
823 | ld8 r12=[temp1],16 // sal_ra | 826 | ld8 r12=[temp1],16 // sal_ra |
824 | ld8 r9=[temp2],16 // sal_gp | 827 | ld8 r9=[temp2],16 // sal_gp |
825 | ;; | 828 | ;; |
826 | ld8 r22=[temp1],24 // pal_min_state, virtual. skip prev_task | 829 | ld8 r22=[temp1],16 // pal_min_state, virtual |
827 | ld8 r21=[temp2],16 // prev_IA64_KR_CURRENT | 830 | ld8 r21=[temp2],16 // prev_IA64_KR_CURRENT |
828 | ;; | 831 | ;; |
832 | ld8 r16=[temp1],16 // prev_IA64_KR_CURRENT_STACK | ||
833 | ld8 r20=[temp2],16 // prev_task | ||
834 | ;; | ||
829 | ld8 temp3=[temp1],16 // cr.isr | 835 | ld8 temp3=[temp1],16 // cr.isr |
830 | ld8 temp4=[temp2],16 // cr.ifa | 836 | ld8 temp4=[temp2],16 // cr.ifa |
831 | ;; | 837 | ;; |
@@ -846,6 +852,45 @@ ia64_state_restore: | |||
846 | ld8 r8=[temp1] // os_status | 852 | ld8 r8=[temp1] // os_status |
847 | ld8 r10=[temp2] // context | 853 | ld8 r10=[temp2] // context |
848 | 854 | ||
855 | /* Wire IA64_TR_CURRENT_STACK to the stack that we are resuming to. To | ||
856 | * avoid any dependencies on the algorithm in ia64_switch_to(), just | ||
857 | * purge any existing CURRENT_STACK mapping and insert the new one. | ||
858 | * | ||
859 | * r16 contains prev_IA64_KR_CURRENT_STACK, r21 contains | ||
860 | * prev_IA64_KR_CURRENT, these values may have been changed by the C | ||
861 | * code. Do not use r8, r9, r10, r22, they contain values ready for | ||
862 | * the return to SAL. | ||
863 | */ | ||
864 | |||
865 | mov r15=IA64_KR(CURRENT_STACK) // physical granule mapped by IA64_TR_CURRENT_STACK | ||
866 | ;; | ||
867 | shl r15=r15,IA64_GRANULE_SHIFT | ||
868 | ;; | ||
869 | dep r15=-1,r15,61,3 // virtual granule | ||
870 | mov r18=IA64_GRANULE_SHIFT<<2 // for cr.itir.ps | ||
871 | ;; | ||
872 | ptr.d r15,r18 | ||
873 | ;; | ||
874 | srlz.d | ||
875 | |||
876 | extr.u r19=r21,61,3 // r21 = prev_IA64_KR_CURRENT | ||
877 | shl r20=r16,IA64_GRANULE_SHIFT // r16 = prev_IA64_KR_CURRENT_STACK | ||
878 | movl r21=PAGE_KERNEL // page properties | ||
879 | ;; | ||
880 | mov IA64_KR(CURRENT_STACK)=r16 | ||
881 | cmp.ne p6,p0=RGN_KERNEL,r19 // new stack is in the kernel region? | ||
882 | or r21=r20,r21 // construct PA | page properties | ||
883 | (p6) br.spnt 1f // the dreaded cpu 0 idle task in region 5:( | ||
884 | ;; | ||
885 | mov cr.itir=r18 | ||
886 | mov cr.ifa=r21 | ||
887 | mov r20=IA64_TR_CURRENT_STACK | ||
888 | ;; | ||
889 | itr.d dtr[r20]=r21 | ||
890 | ;; | ||
891 | srlz.d | ||
892 | 1: | ||
893 | |||
849 | br.sptk b0 | 894 | br.sptk b0 |
850 | 895 | ||
851 | //EndStub////////////////////////////////////////////////////////////////////// | 896 | //EndStub////////////////////////////////////////////////////////////////////// |
@@ -982,6 +1027,7 @@ ia64_set_kernel_registers: | |||
982 | add temp4=temp4, temp1 // &struct ia64_sal_os_state.os_gp | 1027 | add temp4=temp4, temp1 // &struct ia64_sal_os_state.os_gp |
983 | add r12=temp1, temp3 // kernel stack pointer on MCA/INIT stack | 1028 | add r12=temp1, temp3 // kernel stack pointer on MCA/INIT stack |
984 | add r13=temp1, r3 // set current to start of MCA/INIT stack | 1029 | add r13=temp1, r3 // set current to start of MCA/INIT stack |
1030 | add r20=temp1, r3 // physical start of MCA/INIT stack | ||
985 | ;; | 1031 | ;; |
986 | ld8 r1=[temp4] // OS GP from SAL OS state | 1032 | ld8 r1=[temp4] // OS GP from SAL OS state |
987 | ;; | 1033 | ;; |
@@ -991,7 +1037,35 @@ ia64_set_kernel_registers: | |||
991 | ;; | 1037 | ;; |
992 | mov IA64_KR(CURRENT)=r13 | 1038 | mov IA64_KR(CURRENT)=r13 |
993 | 1039 | ||
994 | // FIXME: do I need to wire IA64_KR_CURRENT_STACK and IA64_TR_CURRENT_STACK? | 1040 | /* Wire IA64_TR_CURRENT_STACK to the MCA/INIT handler stack. To avoid |
1041 | * any dependencies on the algorithm in ia64_switch_to(), just purge | ||
1042 | * any existing CURRENT_STACK mapping and insert the new one. | ||
1043 | */ | ||
1044 | |||
1045 | mov r16=IA64_KR(CURRENT_STACK) // physical granule mapped by IA64_TR_CURRENT_STACK | ||
1046 | ;; | ||
1047 | shl r16=r16,IA64_GRANULE_SHIFT | ||
1048 | ;; | ||
1049 | dep r16=-1,r16,61,3 // virtual granule | ||
1050 | mov r18=IA64_GRANULE_SHIFT<<2 // for cr.itir.ps | ||
1051 | ;; | ||
1052 | ptr.d r16,r18 | ||
1053 | ;; | ||
1054 | srlz.d | ||
1055 | |||
1056 | shr.u r16=r20,IA64_GRANULE_SHIFT // r20 = physical start of MCA/INIT stack | ||
1057 | movl r21=PAGE_KERNEL // page properties | ||
1058 | ;; | ||
1059 | mov IA64_KR(CURRENT_STACK)=r16 | ||
1060 | or r21=r20,r21 // construct PA | page properties | ||
1061 | ;; | ||
1062 | mov cr.itir=r18 | ||
1063 | mov cr.ifa=r13 | ||
1064 | mov r20=IA64_TR_CURRENT_STACK | ||
1065 | ;; | ||
1066 | itr.d dtr[r20]=r21 | ||
1067 | ;; | ||
1068 | srlz.d | ||
995 | 1069 | ||
996 | br.sptk b0 | 1070 | br.sptk b0 |
997 | 1071 | ||
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c index 80f83d6cdb..f081c60ab2 100644 --- a/arch/ia64/kernel/mca_drv.c +++ b/arch/ia64/kernel/mca_drv.c | |||
@@ -56,8 +56,9 @@ static struct page *page_isolate[MAX_PAGE_ISOLATE]; | |||
56 | static int num_page_isolate = 0; | 56 | static int num_page_isolate = 0; |
57 | 57 | ||
58 | typedef enum { | 58 | typedef enum { |
59 | ISOLATE_NG = 0, | 59 | ISOLATE_NG, |
60 | ISOLATE_OK = 1 | 60 | ISOLATE_OK, |
61 | ISOLATE_NONE | ||
61 | } isolate_status_t; | 62 | } isolate_status_t; |
62 | 63 | ||
63 | /* | 64 | /* |
@@ -74,7 +75,7 @@ static struct { | |||
74 | * @paddr: poisoned memory location | 75 | * @paddr: poisoned memory location |
75 | * | 76 | * |
76 | * Return value: | 77 | * Return value: |
77 | * ISOLATE_OK / ISOLATE_NG | 78 | * one of isolate_status_t, ISOLATE_OK/NG/NONE. |
78 | */ | 79 | */ |
79 | 80 | ||
80 | static isolate_status_t | 81 | static isolate_status_t |
@@ -85,7 +86,10 @@ mca_page_isolate(unsigned long paddr) | |||
85 | 86 | ||
86 | /* whether physical address is valid or not */ | 87 | /* whether physical address is valid or not */ |
87 | if (!ia64_phys_addr_valid(paddr)) | 88 | if (!ia64_phys_addr_valid(paddr)) |
88 | return ISOLATE_NG; | 89 | return ISOLATE_NONE; |
90 | |||
91 | if (!pfn_valid(paddr)) | ||
92 | return ISOLATE_NONE; | ||
89 | 93 | ||
90 | /* convert physical address to physical page number */ | 94 | /* convert physical address to physical page number */ |
91 | p = pfn_to_page(paddr>>PAGE_SHIFT); | 95 | p = pfn_to_page(paddr>>PAGE_SHIFT); |
@@ -122,10 +126,15 @@ mca_handler_bh(unsigned long paddr) | |||
122 | current->pid, current->comm); | 126 | current->pid, current->comm); |
123 | 127 | ||
124 | spin_lock(&mca_bh_lock); | 128 | spin_lock(&mca_bh_lock); |
125 | if (mca_page_isolate(paddr) == ISOLATE_OK) { | 129 | switch (mca_page_isolate(paddr)) { |
130 | case ISOLATE_OK: | ||
126 | printk(KERN_DEBUG "Page isolation: ( %lx ) success.\n", paddr); | 131 | printk(KERN_DEBUG "Page isolation: ( %lx ) success.\n", paddr); |
127 | } else { | 132 | break; |
133 | case ISOLATE_NG: | ||
128 | printk(KERN_DEBUG "Page isolation: ( %lx ) failure.\n", paddr); | 134 | printk(KERN_DEBUG "Page isolation: ( %lx ) failure.\n", paddr); |
135 | break; | ||
136 | default: | ||
137 | break; | ||
129 | } | 138 | } |
130 | spin_unlock(&mca_bh_lock); | 139 | spin_unlock(&mca_bh_lock); |
131 | 140 | ||
diff --git a/arch/ppc/kernel/Makefile b/arch/ppc/kernel/Makefile index 1fb92f16ac..b1457a8a9c 100644 --- a/arch/ppc/kernel/Makefile +++ b/arch/ppc/kernel/Makefile | |||
@@ -15,9 +15,8 @@ extra-y += vmlinux.lds | |||
15 | obj-y := entry.o traps.o irq.o idle.o time.o misc.o \ | 15 | obj-y := entry.o traps.o irq.o idle.o time.o misc.o \ |
16 | process.o signal.o ptrace.o align.o \ | 16 | process.o signal.o ptrace.o align.o \ |
17 | semaphore.o syscalls.o setup.o \ | 17 | semaphore.o syscalls.o setup.o \ |
18 | cputable.o ppc_htab.o | 18 | cputable.o ppc_htab.o perfmon.o |
19 | obj-$(CONFIG_6xx) += l2cr.o cpu_setup_6xx.o | 19 | obj-$(CONFIG_6xx) += l2cr.o cpu_setup_6xx.o |
20 | obj-$(CONFIG_E500) += perfmon.o | ||
21 | obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o | 20 | obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o |
22 | obj-$(CONFIG_POWER4) += cpu_setup_power4.o | 21 | obj-$(CONFIG_POWER4) += cpu_setup_power4.o |
23 | obj-$(CONFIG_MODULES) += module.o ppc_ksyms.o | 22 | obj-$(CONFIG_MODULES) += module.o ppc_ksyms.o |
diff --git a/arch/ppc/kernel/perfmon.c b/arch/ppc/kernel/perfmon.c index fa1dad96b8..04c18788e8 100644 --- a/arch/ppc/kernel/perfmon.c +++ b/arch/ppc/kernel/perfmon.c | |||
@@ -45,7 +45,7 @@ static void dummy_perf(struct pt_regs *regs) | |||
45 | mtpmr(PMRN_PMGC0, pmgc0); | 45 | mtpmr(PMRN_PMGC0, pmgc0); |
46 | } | 46 | } |
47 | 47 | ||
48 | #else | 48 | #elif CONFIG_6xx |
49 | /* Ensure exceptions are disabled */ | 49 | /* Ensure exceptions are disabled */ |
50 | 50 | ||
51 | static void dummy_perf(struct pt_regs *regs) | 51 | static void dummy_perf(struct pt_regs *regs) |
@@ -55,6 +55,10 @@ static void dummy_perf(struct pt_regs *regs) | |||
55 | mmcr0 &= ~MMCR0_PMXE; | 55 | mmcr0 &= ~MMCR0_PMXE; |
56 | mtspr(SPRN_MMCR0, mmcr0); | 56 | mtspr(SPRN_MMCR0, mmcr0); |
57 | } | 57 | } |
58 | #else | ||
59 | static void dummy_perf(struct pt_regs *regs) | ||
60 | { | ||
61 | } | ||
58 | #endif | 62 | #endif |
59 | 63 | ||
60 | void (*perf_irq)(struct pt_regs *) = dummy_perf; | 64 | void (*perf_irq)(struct pt_regs *) = dummy_perf; |
diff --git a/arch/ppc/platforms/pmac_setup.c b/arch/ppc/platforms/pmac_setup.c index b392b9a159..4c56a4734a 100644 --- a/arch/ppc/platforms/pmac_setup.c +++ b/arch/ppc/platforms/pmac_setup.c | |||
@@ -719,7 +719,8 @@ pmac_declare_of_platform_devices(void) | |||
719 | if (np) { | 719 | if (np) { |
720 | for (np = np->child; np != NULL; np = np->sibling) | 720 | for (np = np->child; np != NULL; np = np->sibling) |
721 | if (strncmp(np->name, "i2c", 3) == 0) { | 721 | if (strncmp(np->name, "i2c", 3) == 0) { |
722 | of_platform_device_create(np, "uni-n-i2c"); | 722 | of_platform_device_create(np, "uni-n-i2c", |
723 | NULL); | ||
723 | break; | 724 | break; |
724 | } | 725 | } |
725 | } | 726 | } |
@@ -727,17 +728,18 @@ pmac_declare_of_platform_devices(void) | |||
727 | if (np) { | 728 | if (np) { |
728 | for (np = np->child; np != NULL; np = np->sibling) | 729 | for (np = np->child; np != NULL; np = np->sibling) |
729 | if (strncmp(np->name, "i2c", 3) == 0) { | 730 | if (strncmp(np->name, "i2c", 3) == 0) { |
730 | of_platform_device_create(np, "u3-i2c"); | 731 | of_platform_device_create(np, "u3-i2c", |
732 | NULL); | ||
731 | break; | 733 | break; |
732 | } | 734 | } |
733 | } | 735 | } |
734 | 736 | ||
735 | np = find_devices("valkyrie"); | 737 | np = find_devices("valkyrie"); |
736 | if (np) | 738 | if (np) |
737 | of_platform_device_create(np, "valkyrie"); | 739 | of_platform_device_create(np, "valkyrie", NULL); |
738 | np = find_devices("platinum"); | 740 | np = find_devices("platinum"); |
739 | if (np) | 741 | if (np) |
740 | of_platform_device_create(np, "platinum"); | 742 | of_platform_device_create(np, "platinum", NULL); |
741 | 743 | ||
742 | return 0; | 744 | return 0; |
743 | } | 745 | } |
diff --git a/arch/ppc/syslib/of_device.c b/arch/ppc/syslib/of_device.c index da8a0f2128..93c7231ea7 100644 --- a/arch/ppc/syslib/of_device.c +++ b/arch/ppc/syslib/of_device.c | |||
@@ -234,7 +234,9 @@ void of_device_unregister(struct of_device *ofdev) | |||
234 | device_unregister(&ofdev->dev); | 234 | device_unregister(&ofdev->dev); |
235 | } | 235 | } |
236 | 236 | ||
237 | struct of_device* of_platform_device_create(struct device_node *np, const char *bus_id) | 237 | struct of_device* of_platform_device_create(struct device_node *np, |
238 | const char *bus_id, | ||
239 | struct device *parent) | ||
238 | { | 240 | { |
239 | struct of_device *dev; | 241 | struct of_device *dev; |
240 | u32 *reg; | 242 | u32 *reg; |
@@ -247,7 +249,7 @@ struct of_device* of_platform_device_create(struct device_node *np, const char * | |||
247 | dev->node = of_node_get(np); | 249 | dev->node = of_node_get(np); |
248 | dev->dma_mask = 0xffffffffUL; | 250 | dev->dma_mask = 0xffffffffUL; |
249 | dev->dev.dma_mask = &dev->dma_mask; | 251 | dev->dev.dma_mask = &dev->dma_mask; |
250 | dev->dev.parent = NULL; | 252 | dev->dev.parent = parent; |
251 | dev->dev.bus = &of_platform_bus_type; | 253 | dev->dev.bus = &of_platform_bus_type; |
252 | dev->dev.release = of_release_dev; | 254 | dev->dev.release = of_release_dev; |
253 | 255 | ||
diff --git a/arch/ppc/syslib/ppc85xx_setup.c b/arch/ppc/syslib/ppc85xx_setup.c index b7242f1bd9..832b8bf99a 100644 --- a/arch/ppc/syslib/ppc85xx_setup.c +++ b/arch/ppc/syslib/ppc85xx_setup.c | |||
@@ -184,8 +184,8 @@ mpc85xx_setup_pci1(struct pci_controller *hose) | |||
184 | pci->powar1 = 0x80044000 | | 184 | pci->powar1 = 0x80044000 | |
185 | (__ilog2(MPC85XX_PCI1_UPPER_MEM - MPC85XX_PCI1_LOWER_MEM + 1) - 1); | 185 | (__ilog2(MPC85XX_PCI1_UPPER_MEM - MPC85XX_PCI1_LOWER_MEM + 1) - 1); |
186 | 186 | ||
187 | /* Setup outboud IO windows @ MPC85XX_PCI1_IO_BASE */ | 187 | /* Setup outbound IO windows @ MPC85XX_PCI1_IO_BASE */ |
188 | pci->potar2 = 0x00000000; | 188 | pci->potar2 = (MPC85XX_PCI1_LOWER_IO >> 12) & 0x000fffff; |
189 | pci->potear2 = 0x00000000; | 189 | pci->potear2 = 0x00000000; |
190 | pci->powbar2 = (MPC85XX_PCI1_IO_BASE >> 12) & 0x000fffff; | 190 | pci->powbar2 = (MPC85XX_PCI1_IO_BASE >> 12) & 0x000fffff; |
191 | /* Enable, IO R/W */ | 191 | /* Enable, IO R/W */ |
@@ -235,8 +235,8 @@ mpc85xx_setup_pci2(struct pci_controller *hose) | |||
235 | pci->powar1 = 0x80044000 | | 235 | pci->powar1 = 0x80044000 | |
236 | (__ilog2(MPC85XX_PCI2_UPPER_MEM - MPC85XX_PCI2_LOWER_MEM + 1) - 1); | 236 | (__ilog2(MPC85XX_PCI2_UPPER_MEM - MPC85XX_PCI2_LOWER_MEM + 1) - 1); |
237 | 237 | ||
238 | /* Setup outboud IO windows @ MPC85XX_PCI2_IO_BASE */ | 238 | /* Setup outbound IO windows @ MPC85XX_PCI2_IO_BASE */ |
239 | pci->potar2 = 0x00000000; | 239 | pci->potar2 = (MPC85XX_PCI2_LOWER_IO >> 12) & 0x000fffff;; |
240 | pci->potear2 = 0x00000000; | 240 | pci->potear2 = 0x00000000; |
241 | pci->powbar2 = (MPC85XX_PCI2_IO_BASE >> 12) & 0x000fffff; | 241 | pci->powbar2 = (MPC85XX_PCI2_IO_BASE >> 12) & 0x000fffff; |
242 | /* Enable, IO R/W */ | 242 | /* Enable, IO R/W */ |
diff --git a/arch/ppc64/kernel/of_device.c b/arch/ppc64/kernel/of_device.c index da580812dd..9f200f0f2a 100644 --- a/arch/ppc64/kernel/of_device.c +++ b/arch/ppc64/kernel/of_device.c | |||
@@ -233,7 +233,9 @@ void of_device_unregister(struct of_device *ofdev) | |||
233 | device_unregister(&ofdev->dev); | 233 | device_unregister(&ofdev->dev); |
234 | } | 234 | } |
235 | 235 | ||
236 | struct of_device* of_platform_device_create(struct device_node *np, const char *bus_id) | 236 | struct of_device* of_platform_device_create(struct device_node *np, |
237 | const char *bus_id, | ||
238 | struct device *parent) | ||
237 | { | 239 | { |
238 | struct of_device *dev; | 240 | struct of_device *dev; |
239 | 241 | ||
@@ -245,7 +247,7 @@ struct of_device* of_platform_device_create(struct device_node *np, const char * | |||
245 | dev->node = np; | 247 | dev->node = np; |
246 | dev->dma_mask = 0xffffffffUL; | 248 | dev->dma_mask = 0xffffffffUL; |
247 | dev->dev.dma_mask = &dev->dma_mask; | 249 | dev->dev.dma_mask = &dev->dma_mask; |
248 | dev->dev.parent = NULL; | 250 | dev->dev.parent = parent; |
249 | dev->dev.bus = &of_platform_bus_type; | 251 | dev->dev.bus = &of_platform_bus_type; |
250 | dev->dev.release = of_release_dev; | 252 | dev->dev.release = of_release_dev; |
251 | 253 | ||
@@ -259,6 +261,7 @@ struct of_device* of_platform_device_create(struct device_node *np, const char * | |||
259 | return dev; | 261 | return dev; |
260 | } | 262 | } |
261 | 263 | ||
264 | |||
262 | EXPORT_SYMBOL(of_match_device); | 265 | EXPORT_SYMBOL(of_match_device); |
263 | EXPORT_SYMBOL(of_platform_bus_type); | 266 | EXPORT_SYMBOL(of_platform_bus_type); |
264 | EXPORT_SYMBOL(of_register_driver); | 267 | EXPORT_SYMBOL(of_register_driver); |
diff --git a/arch/ppc64/kernel/pSeries_iommu.c b/arch/ppc64/kernel/pSeries_iommu.c index 8c6313e7e1..d17f0108a0 100644 --- a/arch/ppc64/kernel/pSeries_iommu.c +++ b/arch/ppc64/kernel/pSeries_iommu.c | |||
@@ -364,7 +364,8 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus) | |||
364 | 364 | ||
365 | while (pci->phb->dma_window_size * children > 0x80000000ul) | 365 | while (pci->phb->dma_window_size * children > 0x80000000ul) |
366 | pci->phb->dma_window_size >>= 1; | 366 | pci->phb->dma_window_size >>= 1; |
367 | DBG("No ISA/IDE, window size is %x\n", pci->phb->dma_window_size); | 367 | DBG("No ISA/IDE, window size is 0x%lx\n", |
368 | pci->phb->dma_window_size); | ||
368 | pci->phb->dma_window_base_cur = 0; | 369 | pci->phb->dma_window_base_cur = 0; |
369 | 370 | ||
370 | return; | 371 | return; |
@@ -388,7 +389,7 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus) | |||
388 | while (pci->phb->dma_window_size * children > 0x70000000ul) | 389 | while (pci->phb->dma_window_size * children > 0x70000000ul) |
389 | pci->phb->dma_window_size >>= 1; | 390 | pci->phb->dma_window_size >>= 1; |
390 | 391 | ||
391 | DBG("ISA/IDE, window size is %x\n", pci->phb->dma_window_size); | 392 | DBG("ISA/IDE, window size is 0x%lx\n", pci->phb->dma_window_size); |
392 | 393 | ||
393 | } | 394 | } |
394 | 395 | ||
@@ -442,7 +443,7 @@ static void iommu_dev_setup_pSeries(struct pci_dev *dev) | |||
442 | struct device_node *dn, *mydn; | 443 | struct device_node *dn, *mydn; |
443 | struct iommu_table *tbl; | 444 | struct iommu_table *tbl; |
444 | 445 | ||
445 | DBG("iommu_dev_setup_pSeries, dev %p (%s)\n", dev, dev->pretty_name); | 446 | DBG("iommu_dev_setup_pSeries, dev %p (%s)\n", dev, pci_name(dev)); |
446 | 447 | ||
447 | mydn = dn = pci_device_to_OF_node(dev); | 448 | mydn = dn = pci_device_to_OF_node(dev); |
448 | 449 | ||
@@ -469,7 +470,7 @@ static void iommu_dev_setup_pSeries(struct pci_dev *dev) | |||
469 | if (dn && dn->data) { | 470 | if (dn && dn->data) { |
470 | PCI_DN(mydn)->iommu_table = PCI_DN(dn)->iommu_table; | 471 | PCI_DN(mydn)->iommu_table = PCI_DN(dn)->iommu_table; |
471 | } else { | 472 | } else { |
472 | DBG("iommu_dev_setup_pSeries, dev %p (%s) has no iommu table\n", dev, dev->pretty_name); | 473 | DBG("iommu_dev_setup_pSeries, dev %p (%s) has no iommu table\n", dev, pci_name(dev)); |
473 | } | 474 | } |
474 | } | 475 | } |
475 | 476 | ||
@@ -503,7 +504,7 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
503 | int *dma_window = NULL; | 504 | int *dma_window = NULL; |
504 | struct pci_dn *pci; | 505 | struct pci_dn *pci; |
505 | 506 | ||
506 | DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, dev->pretty_name); | 507 | DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, pci_name(dev)); |
507 | 508 | ||
508 | /* dev setup for LPAR is a little tricky, since the device tree might | 509 | /* dev setup for LPAR is a little tricky, since the device tree might |
509 | * contain the dma-window properties per-device and not neccesarily | 510 | * contain the dma-window properties per-device and not neccesarily |
@@ -525,9 +526,8 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
525 | * slots on POWER4 machines. | 526 | * slots on POWER4 machines. |
526 | */ | 527 | */ |
527 | if (dma_window == NULL || pdn->parent == NULL) { | 528 | if (dma_window == NULL || pdn->parent == NULL) { |
528 | /* Fall back to regular (non-LPAR) dev setup */ | 529 | DBG("No dma window for device, linking to parent\n"); |
529 | DBG("No dma window for device, falling back to regular setup\n"); | 530 | PCI_DN(dn)->iommu_table = PCI_DN(pdn)->iommu_table; |
530 | iommu_dev_setup_pSeries(dev); | ||
531 | return; | 531 | return; |
532 | } else { | 532 | } else { |
533 | DBG("Found DMA window, allocating table\n"); | 533 | DBG("Found DMA window, allocating table\n"); |
diff --git a/arch/ppc64/kernel/pmac_setup.c b/arch/ppc64/kernel/pmac_setup.c index 325426c7be..2575525206 100644 --- a/arch/ppc64/kernel/pmac_setup.c +++ b/arch/ppc64/kernel/pmac_setup.c | |||
@@ -434,15 +434,23 @@ static int pmac_check_legacy_ioport(unsigned int baseport) | |||
434 | 434 | ||
435 | static int __init pmac_declare_of_platform_devices(void) | 435 | static int __init pmac_declare_of_platform_devices(void) |
436 | { | 436 | { |
437 | struct device_node *np; | 437 | struct device_node *np, *npp; |
438 | 438 | ||
439 | np = find_devices("u3"); | 439 | npp = of_find_node_by_name(NULL, "u3"); |
440 | if (np) { | 440 | if (npp) { |
441 | for (np = np->child; np != NULL; np = np->sibling) | 441 | for (np = NULL; (np = of_get_next_child(npp, np)) != NULL;) { |
442 | if (strncmp(np->name, "i2c", 3) == 0) { | 442 | if (strncmp(np->name, "i2c", 3) == 0) { |
443 | of_platform_device_create(np, "u3-i2c"); | 443 | of_platform_device_create(np, "u3-i2c", NULL); |
444 | of_node_put(np); | ||
444 | break; | 445 | break; |
445 | } | 446 | } |
447 | } | ||
448 | of_node_put(npp); | ||
449 | } | ||
450 | npp = of_find_node_by_type(NULL, "smu"); | ||
451 | if (npp) { | ||
452 | of_platform_device_create(npp, "smu", NULL); | ||
453 | of_node_put(npp); | ||
446 | } | 454 | } |
447 | 455 | ||
448 | return 0; | 456 | return 0; |
diff --git a/arch/ppc64/kernel/pmac_time.c b/arch/ppc64/kernel/pmac_time.c index 3059edb09c..41bbb8c596 100644 --- a/arch/ppc64/kernel/pmac_time.c +++ b/arch/ppc64/kernel/pmac_time.c | |||
@@ -84,7 +84,7 @@ void __pmac pmac_get_rtc_time(struct rtc_time *tm) | |||
84 | 84 | ||
85 | #ifdef CONFIG_PMAC_SMU | 85 | #ifdef CONFIG_PMAC_SMU |
86 | case SYS_CTRLER_SMU: | 86 | case SYS_CTRLER_SMU: |
87 | smu_get_rtc_time(tm); | 87 | smu_get_rtc_time(tm, 1); |
88 | break; | 88 | break; |
89 | #endif /* CONFIG_PMAC_SMU */ | 89 | #endif /* CONFIG_PMAC_SMU */ |
90 | default: | 90 | default: |
@@ -128,7 +128,7 @@ int __pmac pmac_set_rtc_time(struct rtc_time *tm) | |||
128 | 128 | ||
129 | #ifdef CONFIG_PMAC_SMU | 129 | #ifdef CONFIG_PMAC_SMU |
130 | case SYS_CTRLER_SMU: | 130 | case SYS_CTRLER_SMU: |
131 | return smu_set_rtc_time(tm); | 131 | return smu_set_rtc_time(tm, 1); |
132 | #endif /* CONFIG_PMAC_SMU */ | 132 | #endif /* CONFIG_PMAC_SMU */ |
133 | default: | 133 | default: |
134 | return -ENODEV; | 134 | return -ENODEV; |
diff --git a/arch/ppc64/kernel/ptrace.c b/arch/ppc64/kernel/ptrace.c index 85ed3188a9..b1c044ca57 100644 --- a/arch/ppc64/kernel/ptrace.c +++ b/arch/ppc64/kernel/ptrace.c | |||
@@ -219,6 +219,7 @@ int sys_ptrace(long request, long pid, long addr, long data) | |||
219 | 219 | ||
220 | case PTRACE_SET_DEBUGREG: | 220 | case PTRACE_SET_DEBUGREG: |
221 | ret = ptrace_set_debugreg(child, addr, data); | 221 | ret = ptrace_set_debugreg(child, addr, data); |
222 | break; | ||
222 | 223 | ||
223 | case PTRACE_DETACH: | 224 | case PTRACE_DETACH: |
224 | ret = ptrace_detach(child, data); | 225 | ret = ptrace_detach(child, data); |
diff --git a/arch/ppc64/mm/hash_native.c b/arch/ppc64/mm/hash_native.c index 7626bb5995..eb1bbb5b6c 100644 --- a/arch/ppc64/mm/hash_native.c +++ b/arch/ppc64/mm/hash_native.c | |||
@@ -343,9 +343,7 @@ static void native_flush_hash_range(unsigned long context, | |||
343 | hpte_t *hptep; | 343 | hpte_t *hptep; |
344 | unsigned long hpte_v; | 344 | unsigned long hpte_v; |
345 | struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch); | 345 | struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch); |
346 | 346 | unsigned long large; | |
347 | /* XXX fix for large ptes */ | ||
348 | unsigned long large = 0; | ||
349 | 347 | ||
350 | local_irq_save(flags); | 348 | local_irq_save(flags); |
351 | 349 | ||
@@ -358,6 +356,7 @@ static void native_flush_hash_range(unsigned long context, | |||
358 | 356 | ||
359 | va = (vsid << 28) | (batch->addr[i] & 0x0fffffff); | 357 | va = (vsid << 28) | (batch->addr[i] & 0x0fffffff); |
360 | batch->vaddr[j] = va; | 358 | batch->vaddr[j] = va; |
359 | large = pte_huge(batch->pte[i]); | ||
361 | if (large) | 360 | if (large) |
362 | vpn = va >> HPAGE_SHIFT; | 361 | vpn = va >> HPAGE_SHIFT; |
363 | else | 362 | else |
diff --git a/arch/ppc64/mm/hugetlbpage.c b/arch/ppc64/mm/hugetlbpage.c index 338771ec70..0ea0994ed9 100644 --- a/arch/ppc64/mm/hugetlbpage.c +++ b/arch/ppc64/mm/hugetlbpage.c | |||
@@ -710,10 +710,13 @@ repeat: | |||
710 | hpte_group = ((~hash & htab_hash_mask) * | 710 | hpte_group = ((~hash & htab_hash_mask) * |
711 | HPTES_PER_GROUP) & ~0x7UL; | 711 | HPTES_PER_GROUP) & ~0x7UL; |
712 | slot = ppc_md.hpte_insert(hpte_group, va, prpn, | 712 | slot = ppc_md.hpte_insert(hpte_group, va, prpn, |
713 | HPTE_V_LARGE, rflags); | 713 | HPTE_V_LARGE | |
714 | HPTE_V_SECONDARY, | ||
715 | rflags); | ||
714 | if (slot == -1) { | 716 | if (slot == -1) { |
715 | if (mftb() & 0x1) | 717 | if (mftb() & 0x1) |
716 | hpte_group = ((hash & htab_hash_mask) * HPTES_PER_GROUP) & ~0x7UL; | 718 | hpte_group = ((hash & htab_hash_mask) * |
719 | HPTES_PER_GROUP)&~0x7UL; | ||
717 | 720 | ||
718 | ppc_md.hpte_remove(hpte_group); | 721 | ppc_md.hpte_remove(hpte_group); |
719 | goto repeat; | 722 | goto repeat; |
diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c index 14a12d6b3d..16e7dc89f6 100644 --- a/arch/um/drivers/chan_kern.c +++ b/arch/um/drivers/chan_kern.c | |||
@@ -19,18 +19,44 @@ | |||
19 | #include "line.h" | 19 | #include "line.h" |
20 | #include "os.h" | 20 | #include "os.h" |
21 | 21 | ||
22 | #ifdef CONFIG_NOCONFIG_CHAN | 22 | /* XXX: could well be moved to somewhere else, if needed. */ |
23 | static int my_printf(const char * fmt, ...) | ||
24 | __attribute__ ((format (printf, 1, 2))); | ||
25 | |||
26 | static int my_printf(const char * fmt, ...) | ||
27 | { | ||
28 | /* Yes, can be called on atomic context.*/ | ||
29 | char *buf = kmalloc(4096, GFP_ATOMIC); | ||
30 | va_list args; | ||
31 | int r; | ||
32 | |||
33 | if (!buf) { | ||
34 | /* We print directly fmt. | ||
35 | * Yes, yes, yes, feel free to complain. */ | ||
36 | r = strlen(fmt); | ||
37 | } else { | ||
38 | va_start(args, fmt); | ||
39 | r = vsprintf(buf, fmt, args); | ||
40 | va_end(args); | ||
41 | fmt = buf; | ||
42 | } | ||
23 | 43 | ||
24 | /* The printk's here are wrong because we are complaining that there is no | 44 | if (r) |
25 | * output device, but printk is printing to that output device. The user will | 45 | r = os_write_file(1, fmt, r); |
26 | * never see the error. printf would be better, except it can't run on a | 46 | return r; |
27 | * kernel stack because it will overflow it. | 47 | |
28 | * Use printk for now since that will avoid crashing. | 48 | } |
29 | */ | 49 | |
50 | #ifdef CONFIG_NOCONFIG_CHAN | ||
51 | /* Despite its name, there's no added trailing newline. */ | ||
52 | static int my_puts(const char * buf) | ||
53 | { | ||
54 | return os_write_file(1, buf, strlen(buf)); | ||
55 | } | ||
30 | 56 | ||
31 | static void *not_configged_init(char *str, int device, struct chan_opts *opts) | 57 | static void *not_configged_init(char *str, int device, struct chan_opts *opts) |
32 | { | 58 | { |
33 | printk(KERN_ERR "Using a channel type which is configured out of " | 59 | my_puts("Using a channel type which is configured out of " |
34 | "UML\n"); | 60 | "UML\n"); |
35 | return(NULL); | 61 | return(NULL); |
36 | } | 62 | } |
@@ -38,27 +64,27 @@ static void *not_configged_init(char *str, int device, struct chan_opts *opts) | |||
38 | static int not_configged_open(int input, int output, int primary, void *data, | 64 | static int not_configged_open(int input, int output, int primary, void *data, |
39 | char **dev_out) | 65 | char **dev_out) |
40 | { | 66 | { |
41 | printk(KERN_ERR "Using a channel type which is configured out of " | 67 | my_puts("Using a channel type which is configured out of " |
42 | "UML\n"); | 68 | "UML\n"); |
43 | return(-ENODEV); | 69 | return(-ENODEV); |
44 | } | 70 | } |
45 | 71 | ||
46 | static void not_configged_close(int fd, void *data) | 72 | static void not_configged_close(int fd, void *data) |
47 | { | 73 | { |
48 | printk(KERN_ERR "Using a channel type which is configured out of " | 74 | my_puts("Using a channel type which is configured out of " |
49 | "UML\n"); | 75 | "UML\n"); |
50 | } | 76 | } |
51 | 77 | ||
52 | static int not_configged_read(int fd, char *c_out, void *data) | 78 | static int not_configged_read(int fd, char *c_out, void *data) |
53 | { | 79 | { |
54 | printk(KERN_ERR "Using a channel type which is configured out of " | 80 | my_puts("Using a channel type which is configured out of " |
55 | "UML\n"); | 81 | "UML\n"); |
56 | return(-EIO); | 82 | return(-EIO); |
57 | } | 83 | } |
58 | 84 | ||
59 | static int not_configged_write(int fd, const char *buf, int len, void *data) | 85 | static int not_configged_write(int fd, const char *buf, int len, void *data) |
60 | { | 86 | { |
61 | printk(KERN_ERR "Using a channel type which is configured out of " | 87 | my_puts("Using a channel type which is configured out of " |
62 | "UML\n"); | 88 | "UML\n"); |
63 | return(-EIO); | 89 | return(-EIO); |
64 | } | 90 | } |
@@ -66,7 +92,7 @@ static int not_configged_write(int fd, const char *buf, int len, void *data) | |||
66 | static int not_configged_console_write(int fd, const char *buf, int len, | 92 | static int not_configged_console_write(int fd, const char *buf, int len, |
67 | void *data) | 93 | void *data) |
68 | { | 94 | { |
69 | printk(KERN_ERR "Using a channel type which is configured out of " | 95 | my_puts("Using a channel type which is configured out of " |
70 | "UML\n"); | 96 | "UML\n"); |
71 | return(-EIO); | 97 | return(-EIO); |
72 | } | 98 | } |
@@ -74,14 +100,14 @@ static int not_configged_console_write(int fd, const char *buf, int len, | |||
74 | static int not_configged_window_size(int fd, void *data, unsigned short *rows, | 100 | static int not_configged_window_size(int fd, void *data, unsigned short *rows, |
75 | unsigned short *cols) | 101 | unsigned short *cols) |
76 | { | 102 | { |
77 | printk(KERN_ERR "Using a channel type which is configured out of " | 103 | my_puts("Using a channel type which is configured out of " |
78 | "UML\n"); | 104 | "UML\n"); |
79 | return(-ENODEV); | 105 | return(-ENODEV); |
80 | } | 106 | } |
81 | 107 | ||
82 | static void not_configged_free(void *data) | 108 | static void not_configged_free(void *data) |
83 | { | 109 | { |
84 | printf(KERN_ERR "Using a channel type which is configured out of " | 110 | my_puts("Using a channel type which is configured out of " |
85 | "UML\n"); | 111 | "UML\n"); |
86 | } | 112 | } |
87 | 113 | ||
@@ -457,7 +483,7 @@ static struct chan *parse_chan(char *str, int pri, int device, | |||
457 | } | 483 | } |
458 | } | 484 | } |
459 | if(ops == NULL){ | 485 | if(ops == NULL){ |
460 | printk(KERN_ERR "parse_chan couldn't parse \"%s\"\n", | 486 | my_printf("parse_chan couldn't parse \"%s\"\n", |
461 | str); | 487 | str); |
462 | return(NULL); | 488 | return(NULL); |
463 | } | 489 | } |
@@ -465,7 +491,7 @@ static struct chan *parse_chan(char *str, int pri, int device, | |||
465 | data = (*ops->init)(str, device, opts); | 491 | data = (*ops->init)(str, device, opts); |
466 | if(data == NULL) return(NULL); | 492 | if(data == NULL) return(NULL); |
467 | 493 | ||
468 | chan = kmalloc(sizeof(*chan), GFP_KERNEL); | 494 | chan = kmalloc(sizeof(*chan), GFP_ATOMIC); |
469 | if(chan == NULL) return(NULL); | 495 | if(chan == NULL) return(NULL); |
470 | *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list), | 496 | *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list), |
471 | .primary = 1, | 497 | .primary = 1, |
diff --git a/arch/um/drivers/mconsole_user.c b/arch/um/drivers/mconsole_user.c index 310c1f823f..04383f98f4 100644 --- a/arch/um/drivers/mconsole_user.c +++ b/arch/um/drivers/mconsole_user.c | |||
@@ -23,7 +23,7 @@ static struct mconsole_command commands[] = { | |||
23 | { "reboot", mconsole_reboot, MCONSOLE_PROC }, | 23 | { "reboot", mconsole_reboot, MCONSOLE_PROC }, |
24 | { "config", mconsole_config, MCONSOLE_PROC }, | 24 | { "config", mconsole_config, MCONSOLE_PROC }, |
25 | { "remove", mconsole_remove, MCONSOLE_PROC }, | 25 | { "remove", mconsole_remove, MCONSOLE_PROC }, |
26 | { "sysrq", mconsole_sysrq, MCONSOLE_INTR }, | 26 | { "sysrq", mconsole_sysrq, MCONSOLE_PROC }, |
27 | { "help", mconsole_help, MCONSOLE_INTR }, | 27 | { "help", mconsole_help, MCONSOLE_INTR }, |
28 | { "cad", mconsole_cad, MCONSOLE_INTR }, | 28 | { "cad", mconsole_cad, MCONSOLE_INTR }, |
29 | { "stop", mconsole_stop, MCONSOLE_PROC }, | 29 | { "stop", mconsole_stop, MCONSOLE_PROC }, |
diff --git a/arch/um/include/user.h b/arch/um/include/user.h index 57ee9e2612..0f865ef469 100644 --- a/arch/um/include/user.h +++ b/arch/um/include/user.h | |||
@@ -14,7 +14,9 @@ extern void *um_kmalloc_atomic(int size); | |||
14 | extern void kfree(void *ptr); | 14 | extern void kfree(void *ptr); |
15 | extern int in_aton(char *str); | 15 | extern int in_aton(char *str); |
16 | extern int open_gdb_chan(void); | 16 | extern int open_gdb_chan(void); |
17 | extern int strlcpy(char *, const char *, int); | 17 | /* These use size_t, however unsigned long is correct on both i386 and x86_64. */ |
18 | extern unsigned long strlcpy(char *, const char *, unsigned long); | ||
19 | extern unsigned long strlcat(char *, const char *, unsigned long); | ||
18 | extern void *um_vmalloc(int size); | 20 | extern void *um_vmalloc(int size); |
19 | extern void vfree(void *ptr); | 21 | extern void vfree(void *ptr); |
20 | 22 | ||
diff --git a/arch/um/kernel/process_kern.c b/arch/um/kernel/process_kern.c index 39cf568ccf..ea65db679e 100644 --- a/arch/um/kernel/process_kern.c +++ b/arch/um/kernel/process_kern.c | |||
@@ -82,7 +82,8 @@ unsigned long alloc_stack(int order, int atomic) | |||
82 | unsigned long page; | 82 | unsigned long page; |
83 | int flags = GFP_KERNEL; | 83 | int flags = GFP_KERNEL; |
84 | 84 | ||
85 | if(atomic) flags |= GFP_ATOMIC; | 85 | if (atomic) |
86 | flags = GFP_ATOMIC; | ||
86 | page = __get_free_pages(flags, order); | 87 | page = __get_free_pages(flags, order); |
87 | if(page == 0) | 88 | if(page == 0) |
88 | return(0); | 89 | return(0); |
diff --git a/arch/um/kernel/sigio_user.c b/arch/um/kernel/sigio_user.c index e89218958f..a52751108a 100644 --- a/arch/um/kernel/sigio_user.c +++ b/arch/um/kernel/sigio_user.c | |||
@@ -340,7 +340,7 @@ static int setup_initial_poll(int fd) | |||
340 | { | 340 | { |
341 | struct pollfd *p; | 341 | struct pollfd *p; |
342 | 342 | ||
343 | p = um_kmalloc(sizeof(struct pollfd)); | 343 | p = um_kmalloc_atomic(sizeof(struct pollfd)); |
344 | if(p == NULL){ | 344 | if(p == NULL){ |
345 | printk("setup_initial_poll : failed to allocate poll\n"); | 345 | printk("setup_initial_poll : failed to allocate poll\n"); |
346 | return(-1); | 346 | return(-1); |
diff --git a/arch/um/kernel/tlb.c b/arch/um/kernel/tlb.c index 0a562c3c0f..f5b0636f9a 100644 --- a/arch/um/kernel/tlb.c +++ b/arch/um/kernel/tlb.c | |||
@@ -193,12 +193,12 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | |||
193 | r = pte_read(*npte); | 193 | r = pte_read(*npte); |
194 | w = pte_write(*npte); | 194 | w = pte_write(*npte); |
195 | x = pte_exec(*npte); | 195 | x = pte_exec(*npte); |
196 | if(!pte_dirty(*npte)) | 196 | if (!pte_young(*npte)) { |
197 | w = 0; | 197 | r = 0; |
198 | if(!pte_young(*npte)){ | 198 | w = 0; |
199 | r = 0; | 199 | } else if (!pte_dirty(*npte)) { |
200 | w = 0; | 200 | w = 0; |
201 | } | 201 | } |
202 | if(force || pte_newpage(*npte)){ | 202 | if(force || pte_newpage(*npte)){ |
203 | if(pte_present(*npte)) | 203 | if(pte_present(*npte)) |
204 | ret = add_mmap(addr, | 204 | ret = add_mmap(addr, |
diff --git a/arch/um/kernel/trap_kern.c b/arch/um/kernel/trap_kern.c index 87cc6fd76c..d297429ac3 100644 --- a/arch/um/kernel/trap_kern.c +++ b/arch/um/kernel/trap_kern.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include "asm/a.out.h" | 18 | #include "asm/a.out.h" |
19 | #include "asm/current.h" | 19 | #include "asm/current.h" |
20 | #include "asm/irq.h" | 20 | #include "asm/irq.h" |
21 | #include "sysdep/sigcontext.h" | ||
21 | #include "user_util.h" | 22 | #include "user_util.h" |
22 | #include "kern_util.h" | 23 | #include "kern_util.h" |
23 | #include "kern.h" | 24 | #include "kern.h" |
@@ -39,6 +40,12 @@ int handle_page_fault(unsigned long address, unsigned long ip, | |||
39 | int err = -EFAULT; | 40 | int err = -EFAULT; |
40 | 41 | ||
41 | *code_out = SEGV_MAPERR; | 42 | *code_out = SEGV_MAPERR; |
43 | |||
44 | /* If the fault was during atomic operation, don't take the fault, just | ||
45 | * fail. */ | ||
46 | if (in_atomic()) | ||
47 | goto out_nosemaphore; | ||
48 | |||
42 | down_read(&mm->mmap_sem); | 49 | down_read(&mm->mmap_sem); |
43 | vma = find_vma(mm, address); | 50 | vma = find_vma(mm, address); |
44 | if(!vma) | 51 | if(!vma) |
@@ -89,6 +96,7 @@ survive: | |||
89 | flush_tlb_page(vma, address); | 96 | flush_tlb_page(vma, address); |
90 | out: | 97 | out: |
91 | up_read(&mm->mmap_sem); | 98 | up_read(&mm->mmap_sem); |
99 | out_nosemaphore: | ||
92 | return(err); | 100 | return(err); |
93 | 101 | ||
94 | /* | 102 | /* |
@@ -125,7 +133,15 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | |||
125 | } | 133 | } |
126 | else if(current->mm == NULL) | 134 | else if(current->mm == NULL) |
127 | panic("Segfault with no mm"); | 135 | panic("Segfault with no mm"); |
128 | err = handle_page_fault(address, ip, is_write, is_user, &si.si_code); | 136 | |
137 | if (SEGV_IS_FIXABLE(&fi)) | ||
138 | err = handle_page_fault(address, ip, is_write, is_user, &si.si_code); | ||
139 | else { | ||
140 | err = -EFAULT; | ||
141 | /* A thread accessed NULL, we get a fault, but CR2 is invalid. | ||
142 | * This code is used in __do_copy_from_user() of TT mode. */ | ||
143 | address = 0; | ||
144 | } | ||
129 | 145 | ||
130 | catcher = current->thread.fault_catcher; | 146 | catcher = current->thread.fault_catcher; |
131 | if(!err) | 147 | if(!err) |
diff --git a/arch/um/kernel/tt/uaccess_user.c b/arch/um/kernel/tt/uaccess_user.c index f01475512e..8c220f054b 100644 --- a/arch/um/kernel/tt/uaccess_user.c +++ b/arch/um/kernel/tt/uaccess_user.c | |||
@@ -22,8 +22,15 @@ int __do_copy_from_user(void *to, const void *from, int n, | |||
22 | __do_copy, &faulted); | 22 | __do_copy, &faulted); |
23 | TASK_REGS(get_current())->tt = save; | 23 | TASK_REGS(get_current())->tt = save; |
24 | 24 | ||
25 | if(!faulted) return(0); | 25 | if(!faulted) |
26 | else return(n - (fault - (unsigned long) from)); | 26 | return 0; |
27 | else if (fault) | ||
28 | return n - (fault - (unsigned long) from); | ||
29 | else | ||
30 | /* In case of a general protection fault, we don't have the | ||
31 | * fault address, so NULL is used instead. Pretend we didn't | ||
32 | * copy anything. */ | ||
33 | return n; | ||
27 | } | 34 | } |
28 | 35 | ||
29 | static void __do_strncpy(void *dst, const void *src, int count) | 36 | static void __do_strncpy(void *dst, const void *src, int count) |
diff --git a/arch/um/kernel/umid.c b/arch/um/kernel/umid.c index 186c288850..0b21d59ba0 100644 --- a/arch/um/kernel/umid.c +++ b/arch/um/kernel/umid.c | |||
@@ -31,6 +31,8 @@ static char *uml_dir = UML_DIR; | |||
31 | /* Changed by set_umid */ | 31 | /* Changed by set_umid */ |
32 | static int umid_is_random = 1; | 32 | static int umid_is_random = 1; |
33 | static int umid_inited = 0; | 33 | static int umid_inited = 0; |
34 | /* Have we created the files? Should we remove them? */ | ||
35 | static int umid_owned = 0; | ||
34 | 36 | ||
35 | static int make_umid(int (*printer)(const char *fmt, ...)); | 37 | static int make_umid(int (*printer)(const char *fmt, ...)); |
36 | 38 | ||
@@ -82,20 +84,21 @@ int __init umid_file_name(char *name, char *buf, int len) | |||
82 | 84 | ||
83 | extern int tracing_pid; | 85 | extern int tracing_pid; |
84 | 86 | ||
85 | static int __init create_pid_file(void) | 87 | static void __init create_pid_file(void) |
86 | { | 88 | { |
87 | char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; | 89 | char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; |
88 | char pid[sizeof("nnnnn\0")]; | 90 | char pid[sizeof("nnnnn\0")]; |
89 | int fd, n; | 91 | int fd, n; |
90 | 92 | ||
91 | if(umid_file_name("pid", file, sizeof(file))) return 0; | 93 | if(umid_file_name("pid", file, sizeof(file))) |
94 | return; | ||
92 | 95 | ||
93 | fd = os_open_file(file, of_create(of_excl(of_rdwr(OPENFLAGS()))), | 96 | fd = os_open_file(file, of_create(of_excl(of_rdwr(OPENFLAGS()))), |
94 | 0644); | 97 | 0644); |
95 | if(fd < 0){ | 98 | if(fd < 0){ |
96 | printf("Open of machine pid file \"%s\" failed: %s\n", | 99 | printf("Open of machine pid file \"%s\" failed: %s\n", |
97 | file, strerror(-fd)); | 100 | file, strerror(-fd)); |
98 | return 0; | 101 | return; |
99 | } | 102 | } |
100 | 103 | ||
101 | sprintf(pid, "%d\n", os_getpid()); | 104 | sprintf(pid, "%d\n", os_getpid()); |
@@ -103,7 +106,6 @@ static int __init create_pid_file(void) | |||
103 | if(n != strlen(pid)) | 106 | if(n != strlen(pid)) |
104 | printf("Write of pid file failed - err = %d\n", -n); | 107 | printf("Write of pid file failed - err = %d\n", -n); |
105 | os_close_file(fd); | 108 | os_close_file(fd); |
106 | return 0; | ||
107 | } | 109 | } |
108 | 110 | ||
109 | static int actually_do_remove(char *dir) | 111 | static int actually_do_remove(char *dir) |
@@ -147,7 +149,8 @@ static int actually_do_remove(char *dir) | |||
147 | void remove_umid_dir(void) | 149 | void remove_umid_dir(void) |
148 | { | 150 | { |
149 | char dir[strlen(uml_dir) + UMID_LEN + 1]; | 151 | char dir[strlen(uml_dir) + UMID_LEN + 1]; |
150 | if(!umid_inited) return; | 152 | if (!umid_owned) |
153 | return; | ||
151 | 154 | ||
152 | sprintf(dir, "%s%s", uml_dir, umid); | 155 | sprintf(dir, "%s%s", uml_dir, umid); |
153 | actually_do_remove(dir); | 156 | actually_do_remove(dir); |
@@ -155,11 +158,12 @@ void remove_umid_dir(void) | |||
155 | 158 | ||
156 | char *get_umid(int only_if_set) | 159 | char *get_umid(int only_if_set) |
157 | { | 160 | { |
158 | if(only_if_set && umid_is_random) return(NULL); | 161 | if(only_if_set && umid_is_random) |
159 | return(umid); | 162 | return NULL; |
163 | return umid; | ||
160 | } | 164 | } |
161 | 165 | ||
162 | int not_dead_yet(char *dir) | 166 | static int not_dead_yet(char *dir) |
163 | { | 167 | { |
164 | char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; | 168 | char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; |
165 | char pid[sizeof("nnnnn\0")], *end; | 169 | char pid[sizeof("nnnnn\0")], *end; |
@@ -193,7 +197,8 @@ int not_dead_yet(char *dir) | |||
193 | (p == CHOOSE_MODE(tracing_pid, os_getpid()))) | 197 | (p == CHOOSE_MODE(tracing_pid, os_getpid()))) |
194 | dead = 1; | 198 | dead = 1; |
195 | } | 199 | } |
196 | if(!dead) return(1); | 200 | if(!dead) |
201 | return(1); | ||
197 | return(actually_do_remove(dir)); | 202 | return(actually_do_remove(dir)); |
198 | } | 203 | } |
199 | 204 | ||
@@ -232,16 +237,13 @@ static int __init make_uml_dir(void) | |||
232 | strlcpy(dir, home, sizeof(dir)); | 237 | strlcpy(dir, home, sizeof(dir)); |
233 | uml_dir++; | 238 | uml_dir++; |
234 | } | 239 | } |
240 | strlcat(dir, uml_dir, sizeof(dir)); | ||
235 | len = strlen(dir); | 241 | len = strlen(dir); |
236 | strncat(dir, uml_dir, sizeof(dir) - len); | 242 | if (len > 0 && dir[len - 1] != '/') |
237 | len = strlen(dir); | 243 | strlcat(dir, "/", sizeof(dir)); |
238 | if((len > 0) && (len < sizeof(dir) - 1) && (dir[len - 1] != '/')){ | ||
239 | dir[len] = '/'; | ||
240 | dir[len + 1] = '\0'; | ||
241 | } | ||
242 | 244 | ||
243 | uml_dir = malloc(strlen(dir) + 1); | 245 | uml_dir = malloc(strlen(dir) + 1); |
244 | if(uml_dir == NULL){ | 246 | if (uml_dir == NULL) { |
245 | printf("make_uml_dir : malloc failed, errno = %d\n", errno); | 247 | printf("make_uml_dir : malloc failed, errno = %d\n", errno); |
246 | exit(1); | 248 | exit(1); |
247 | } | 249 | } |
@@ -286,6 +288,7 @@ static int __init make_umid(int (*printer)(const char *fmt, ...)) | |||
286 | if(errno == EEXIST){ | 288 | if(errno == EEXIST){ |
287 | if(not_dead_yet(tmp)){ | 289 | if(not_dead_yet(tmp)){ |
288 | (*printer)("umid '%s' is in use\n", umid); | 290 | (*printer)("umid '%s' is in use\n", umid); |
291 | umid_owned = 0; | ||
289 | return(-1); | 292 | return(-1); |
290 | } | 293 | } |
291 | err = mkdir(tmp, 0777); | 294 | err = mkdir(tmp, 0777); |
@@ -296,7 +299,8 @@ static int __init make_umid(int (*printer)(const char *fmt, ...)) | |||
296 | return(-1); | 299 | return(-1); |
297 | } | 300 | } |
298 | 301 | ||
299 | return(0); | 302 | umid_owned = 1; |
303 | return 0; | ||
300 | } | 304 | } |
301 | 305 | ||
302 | __uml_setup("uml_dir=", set_uml_dir, | 306 | __uml_setup("uml_dir=", set_uml_dir, |
@@ -309,7 +313,8 @@ static int __init make_umid_setup(void) | |||
309 | /* one function with the ordering we need ... */ | 313 | /* one function with the ordering we need ... */ |
310 | make_uml_dir(); | 314 | make_uml_dir(); |
311 | make_umid(printf); | 315 | make_umid(printf); |
312 | return create_pid_file(); | 316 | create_pid_file(); |
317 | return 0; | ||
313 | } | 318 | } |
314 | __uml_postsetup(make_umid_setup); | 319 | __uml_postsetup(make_umid_setup); |
315 | 320 | ||
diff --git a/arch/xtensa/kernel/pci.c b/arch/xtensa/kernel/pci.c index 09887c96e9..de19501aa8 100644 --- a/arch/xtensa/kernel/pci.c +++ b/arch/xtensa/kernel/pci.c | |||
@@ -402,8 +402,8 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
402 | __pci_mmap_set_flags(dev, vma, mmap_state); | 402 | __pci_mmap_set_flags(dev, vma, mmap_state); |
403 | __pci_mmap_set_pgprot(dev, vma, mmap_state, write_combine); | 403 | __pci_mmap_set_pgprot(dev, vma, mmap_state, write_combine); |
404 | 404 | ||
405 | ret = io_remap_page_range(vma, vma->vm_start, vma->vm_pgoff<<PAGE_SHIFT, | 405 | ret = io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, |
406 | vma->vm_end - vma->vm_start, vma->vm_page_prot); | 406 | vma->vm_end - vma->vm_start,vma->vm_page_prot); |
407 | 407 | ||
408 | return ret; | 408 | return ret; |
409 | } | 409 | } |
diff --git a/arch/xtensa/kernel/platform.c b/arch/xtensa/kernel/platform.c index cf13627844..03674daabc 100644 --- a/arch/xtensa/kernel/platform.c +++ b/arch/xtensa/kernel/platform.c | |||
@@ -39,7 +39,7 @@ _F(int, pcibios_fixup, (void), { return 0; }); | |||
39 | _F(int, get_rtc_time, (time_t* t), { return 0; }); | 39 | _F(int, get_rtc_time, (time_t* t), { return 0; }); |
40 | _F(int, set_rtc_time, (time_t t), { return 0; }); | 40 | _F(int, set_rtc_time, (time_t t), { return 0; }); |
41 | 41 | ||
42 | #if CONFIG_XTENSA_CALIBRATE_CCOUNT | 42 | #ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT |
43 | _F(void, calibrate_ccount, (void), | 43 | _F(void, calibrate_ccount, (void), |
44 | { | 44 | { |
45 | printk ("ERROR: Cannot calibrate cpu frequency! Assuming 100MHz.\n"); | 45 | printk ("ERROR: Cannot calibrate cpu frequency! Assuming 100MHz.\n"); |
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c index c83bb0d417..08ef6d82ee 100644 --- a/arch/xtensa/kernel/process.c +++ b/arch/xtensa/kernel/process.c | |||
@@ -457,7 +457,7 @@ int | |||
457 | dump_task_fpu(struct pt_regs *regs, struct task_struct *task, elf_fpregset_t *r) | 457 | dump_task_fpu(struct pt_regs *regs, struct task_struct *task, elf_fpregset_t *r) |
458 | { | 458 | { |
459 | /* see asm/coprocessor.h for this magic number 16 */ | 459 | /* see asm/coprocessor.h for this magic number 16 */ |
460 | #if TOTAL_CPEXTRA_SIZE > 16 | 460 | #if XTENSA_CP_EXTRA_SIZE > 16 |
461 | do_save_fpregs (r, regs, task); | 461 | do_save_fpregs (r, regs, task); |
462 | 462 | ||
463 | /* For now, bit 16 means some extra state may be present: */ | 463 | /* For now, bit 16 means some extra state may be present: */ |
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c index 1f5bf5d624..513ed8d677 100644 --- a/arch/xtensa/kernel/setup.c +++ b/arch/xtensa/kernel/setup.c | |||
@@ -304,7 +304,7 @@ void __init setup_arch(char **cmdline_p) | |||
304 | # endif | 304 | # endif |
305 | #endif | 305 | #endif |
306 | 306 | ||
307 | #if CONFIG_PCI | 307 | #ifdef CONFIG_PCI |
308 | platform_pcibios_init(); | 308 | platform_pcibios_init(); |
309 | #endif | 309 | #endif |
310 | } | 310 | } |
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c index dc42cede93..e252b61e45 100644 --- a/arch/xtensa/kernel/signal.c +++ b/arch/xtensa/kernel/signal.c | |||
@@ -182,7 +182,7 @@ restore_cpextra (struct _cpstate *buf) | |||
182 | 182 | ||
183 | struct task_struct *tsk = current; | 183 | struct task_struct *tsk = current; |
184 | release_all_cp(tsk); | 184 | release_all_cp(tsk); |
185 | return __copy_from_user(tsk->thread.cpextra, buf, TOTAL_CPEXTRA_SIZE); | 185 | return __copy_from_user(tsk->thread.cpextra, buf, XTENSA_CP_EXTRA_SIZE); |
186 | #endif | 186 | #endif |
187 | return 0; | 187 | return 0; |
188 | } | 188 | } |
diff --git a/arch/xtensa/kernel/time.c b/arch/xtensa/kernel/time.c index 1ac7d5ce74..8e423d1335 100644 --- a/arch/xtensa/kernel/time.c +++ b/arch/xtensa/kernel/time.c | |||
@@ -68,7 +68,7 @@ void __init time_init(void) | |||
68 | * speed for the CALIBRATE. | 68 | * speed for the CALIBRATE. |
69 | */ | 69 | */ |
70 | 70 | ||
71 | #if CONFIG_XTENSA_CALIBRATE_CCOUNT | 71 | #ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT |
72 | printk("Calibrating CPU frequency "); | 72 | printk("Calibrating CPU frequency "); |
73 | platform_calibrate_ccount(); | 73 | platform_calibrate_ccount(); |
74 | printk("%d.%02d MHz\n", (int)ccount_per_jiffy/(1000000/HZ), | 74 | printk("%d.%02d MHz\n", (int)ccount_per_jiffy/(1000000/HZ), |
diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c index 56aace84aa..5a91d6c9e6 100644 --- a/arch/xtensa/mm/init.c +++ b/arch/xtensa/mm/init.c | |||
@@ -239,7 +239,7 @@ void __init mem_init(void) | |||
239 | high_memory = (void *) __va(max_mapnr << PAGE_SHIFT); | 239 | high_memory = (void *) __va(max_mapnr << PAGE_SHIFT); |
240 | highmemsize = 0; | 240 | highmemsize = 0; |
241 | 241 | ||
242 | #if CONFIG_HIGHMEM | 242 | #ifdef CONFIG_HIGHMEM |
243 | #error HIGHGMEM not implemented in init.c | 243 | #error HIGHGMEM not implemented in init.c |
244 | #endif | 244 | #endif |
245 | 245 | ||