diff options
author | Michael Ellerman <michael@ellerman.id.au> | 2005-11-03 20:12:52 -0500 |
---|---|---|
committer | Michael Ellerman <michael@ellerman.id.au> | 2005-11-03 20:12:52 -0500 |
commit | dc3a9efb5ee89493a42c3365d219e339e4720c2b (patch) | |
tree | a0d261c2933f3083f351c858b01de7677356d4b7 | |
parent | 30415f6a63f3383a18e9adf7c144acabe6893f63 (diff) | |
parent | d3ab57ebdc6457543b346255fa47b0ecd7671136 (diff) |
Merge with Paulus
34 files changed, 419 insertions, 617 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 1c44a1dac421..3cf03ab46113 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -278,7 +278,6 @@ config PPC_PSERIES | |||
278 | select PPC_I8259 | 278 | select PPC_I8259 |
279 | select PPC_RTAS | 279 | select PPC_RTAS |
280 | select RTAS_ERROR_LOGGING | 280 | select RTAS_ERROR_LOGGING |
281 | select RTAS_FW | ||
282 | default y | 281 | default y |
283 | 282 | ||
284 | config PPC_CHRP | 283 | config PPC_CHRP |
@@ -324,7 +323,6 @@ config PPC_CELL | |||
324 | bool " Cell Broadband Processor Architecture" | 323 | bool " Cell Broadband Processor Architecture" |
325 | depends on PPC_MULTIPLATFORM && PPC64 | 324 | depends on PPC_MULTIPLATFORM && PPC64 |
326 | select PPC_RTAS | 325 | select PPC_RTAS |
327 | select RTAS_FW | ||
328 | select MMIO_NVRAM | 326 | select MMIO_NVRAM |
329 | 327 | ||
330 | config PPC_OF | 328 | config PPC_OF |
@@ -356,10 +354,14 @@ config RTAS_ERROR_LOGGING | |||
356 | depends on PPC_RTAS | 354 | depends on PPC_RTAS |
357 | default n | 355 | default n |
358 | 356 | ||
359 | config RTAS_FW | 357 | config RTAS_PROC |
360 | bool | 358 | bool "Proc interface to RTAS" |
361 | depends on PPC_RTAS | 359 | depends on PPC_RTAS |
362 | default n | 360 | default y |
361 | |||
362 | config RTAS_FLASH | ||
363 | tristate "Firmware flash interface" | ||
364 | depends on PPC64 && RTAS_PROC | ||
363 | 365 | ||
364 | config MMIO_NVRAM | 366 | config MMIO_NVRAM |
365 | bool | 367 | bool |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index abad3059a21a..7a3e1155ac9a 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -13,12 +13,13 @@ endif | |||
13 | obj-y := semaphore.o cputable.o ptrace.o syscalls.o \ | 13 | obj-y := semaphore.o cputable.o ptrace.o syscalls.o \ |
14 | signal_32.o pmc.o | 14 | signal_32.o pmc.o |
15 | obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \ | 15 | obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \ |
16 | ptrace32.o systbl.o | 16 | signal_64.o ptrace32.o systbl.o |
17 | obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o | 17 | obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o |
18 | obj-$(CONFIG_POWER4) += idle_power4.o | 18 | obj-$(CONFIG_POWER4) += idle_power4.o |
19 | obj-$(CONFIG_PPC_OF) += of_device.o | 19 | obj-$(CONFIG_PPC_OF) += of_device.o |
20 | obj-$(CONFIG_PPC_RTAS) += rtas.o | 20 | obj-$(CONFIG_PPC_RTAS) += rtas.o |
21 | obj-$(CONFIG_RTAS_FW) += rtas_fw.o | 21 | obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o |
22 | obj-$(CONFIG_RTAS_PROC) += rtas-proc.o | ||
22 | obj-$(CONFIG_IBMVIO) += vio.o | 23 | obj-$(CONFIG_IBMVIO) += vio.o |
23 | 24 | ||
24 | ifeq ($(CONFIG_PPC_MERGE),y) | 25 | ifeq ($(CONFIG_PPC_MERGE),y) |
diff --git a/include/asm-ppc64/ppc32.h b/arch/powerpc/kernel/ppc32.h index 3945a55d112a..90e562771791 100644 --- a/include/asm-ppc64/ppc32.h +++ b/arch/powerpc/kernel/ppc32.h | |||
@@ -91,6 +91,22 @@ typedef struct sigaltstack_32 { | |||
91 | compat_size_t ss_size; | 91 | compat_size_t ss_size; |
92 | } stack_32_t; | 92 | } stack_32_t; |
93 | 93 | ||
94 | struct pt_regs32 { | ||
95 | unsigned int gpr[32]; | ||
96 | unsigned int nip; | ||
97 | unsigned int msr; | ||
98 | unsigned int orig_gpr3; /* Used for restarting system calls */ | ||
99 | unsigned int ctr; | ||
100 | unsigned int link; | ||
101 | unsigned int xer; | ||
102 | unsigned int ccr; | ||
103 | unsigned int mq; /* 601 only (not used at present) */ | ||
104 | unsigned int trap; /* Reason for being here */ | ||
105 | unsigned int dar; /* Fault registers */ | ||
106 | unsigned int dsisr; | ||
107 | unsigned int result; /* Result of a system call */ | ||
108 | }; | ||
109 | |||
94 | struct sigcontext32 { | 110 | struct sigcontext32 { |
95 | unsigned int _unused[4]; | 111 | unsigned int _unused[4]; |
96 | int signal; | 112 | int signal; |
diff --git a/arch/ppc64/kernel/rtas-proc.c b/arch/powerpc/kernel/rtas-proc.c index 5bdd5b079d96..5bdd5b079d96 100644 --- a/arch/ppc64/kernel/rtas-proc.c +++ b/arch/powerpc/kernel/rtas-proc.c | |||
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 4d22eeeeb91d..b7fc2d884950 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
@@ -43,6 +43,13 @@ char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned; | |||
43 | unsigned long rtas_rmo_buf; | 43 | unsigned long rtas_rmo_buf; |
44 | 44 | ||
45 | /* | 45 | /* |
46 | * If non-NULL, this gets called when the kernel terminates. | ||
47 | * This is done like this so rtas_flash can be a module. | ||
48 | */ | ||
49 | void (*rtas_flash_term_hook)(int); | ||
50 | EXPORT_SYMBOL(rtas_flash_term_hook); | ||
51 | |||
52 | /* | ||
46 | * call_rtas_display_status and call_rtas_display_status_delay | 53 | * call_rtas_display_status and call_rtas_display_status_delay |
47 | * are designed only for very early low-level debugging, which | 54 | * are designed only for very early low-level debugging, which |
48 | * is why the token is hard-coded to 10. | 55 | * is why the token is hard-coded to 10. |
@@ -206,6 +213,7 @@ void rtas_progress(char *s, unsigned short hex) | |||
206 | 213 | ||
207 | spin_unlock(&progress_lock); | 214 | spin_unlock(&progress_lock); |
208 | } | 215 | } |
216 | EXPORT_SYMBOL(rtas_progress); /* needed by rtas_flash module */ | ||
209 | 217 | ||
210 | int rtas_token(const char *service) | 218 | int rtas_token(const char *service) |
211 | { | 219 | { |
@@ -492,6 +500,8 @@ int rtas_set_indicator(int indicator, int index, int new_value) | |||
492 | 500 | ||
493 | void rtas_restart(char *cmd) | 501 | void rtas_restart(char *cmd) |
494 | { | 502 | { |
503 | if (rtas_flash_term_hook) | ||
504 | rtas_flash_term_hook(SYS_RESTART); | ||
495 | printk("RTAS system-reboot returned %d\n", | 505 | printk("RTAS system-reboot returned %d\n", |
496 | rtas_call(rtas_token("system-reboot"), 0, 1, NULL)); | 506 | rtas_call(rtas_token("system-reboot"), 0, 1, NULL)); |
497 | for (;;); | 507 | for (;;); |
@@ -499,6 +509,8 @@ void rtas_restart(char *cmd) | |||
499 | 509 | ||
500 | void rtas_power_off(void) | 510 | void rtas_power_off(void) |
501 | { | 511 | { |
512 | if (rtas_flash_term_hook) | ||
513 | rtas_flash_term_hook(SYS_POWER_OFF); | ||
502 | /* allow power on only with power button press */ | 514 | /* allow power on only with power button press */ |
503 | printk("RTAS power-off returned %d\n", | 515 | printk("RTAS power-off returned %d\n", |
504 | rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1)); | 516 | rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1)); |
@@ -507,7 +519,12 @@ void rtas_power_off(void) | |||
507 | 519 | ||
508 | void rtas_halt(void) | 520 | void rtas_halt(void) |
509 | { | 521 | { |
510 | rtas_power_off(); | 522 | if (rtas_flash_term_hook) |
523 | rtas_flash_term_hook(SYS_HALT); | ||
524 | /* allow power on only with power button press */ | ||
525 | printk("RTAS power-off returned %d\n", | ||
526 | rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1)); | ||
527 | for (;;); | ||
511 | } | 528 | } |
512 | 529 | ||
513 | /* Must be in the RMO region, so we place it here */ | 530 | /* Must be in the RMO region, so we place it here */ |
diff --git a/arch/ppc64/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c index 923e2e201a70..50500093c97f 100644 --- a/arch/ppc64/kernel/rtas_flash.c +++ b/arch/powerpc/kernel/rtas_flash.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/delay.h> | 19 | #include <asm/delay.h> |
20 | #include <asm/uaccess.h> | 20 | #include <asm/uaccess.h> |
21 | #include <asm/rtas.h> | 21 | #include <asm/rtas.h> |
22 | #include <asm/abs_addr.h> | ||
22 | 23 | ||
23 | #define MODULE_VERS "1.0" | 24 | #define MODULE_VERS "1.0" |
24 | #define MODULE_NAME "rtas_flash" | 25 | #define MODULE_NAME "rtas_flash" |
@@ -71,10 +72,36 @@ | |||
71 | #define VALIDATE_BUF_SIZE 4096 | 72 | #define VALIDATE_BUF_SIZE 4096 |
72 | #define RTAS_MSG_MAXLEN 64 | 73 | #define RTAS_MSG_MAXLEN 64 |
73 | 74 | ||
75 | struct flash_block { | ||
76 | char *data; | ||
77 | unsigned long length; | ||
78 | }; | ||
79 | |||
80 | /* This struct is very similar but not identical to | ||
81 | * that needed by the rtas flash update. | ||
82 | * All we need to do for rtas is rewrite num_blocks | ||
83 | * into a version/length and translate the pointers | ||
84 | * to absolute. | ||
85 | */ | ||
86 | #define FLASH_BLOCKS_PER_NODE ((PAGE_SIZE - 16) / sizeof(struct flash_block)) | ||
87 | struct flash_block_list { | ||
88 | unsigned long num_blocks; | ||
89 | struct flash_block_list *next; | ||
90 | struct flash_block blocks[FLASH_BLOCKS_PER_NODE]; | ||
91 | }; | ||
92 | struct flash_block_list_header { /* just the header of flash_block_list */ | ||
93 | unsigned long num_blocks; | ||
94 | struct flash_block_list *next; | ||
95 | }; | ||
96 | |||
97 | static struct flash_block_list_header rtas_firmware_flash_list = {0, NULL}; | ||
98 | |||
99 | #define FLASH_BLOCK_LIST_VERSION (1UL) | ||
100 | |||
74 | /* Local copy of the flash block list. | 101 | /* Local copy of the flash block list. |
75 | * We only allow one open of the flash proc file and create this | 102 | * We only allow one open of the flash proc file and create this |
76 | * list as we go. This list will be put in the kernel's | 103 | * list as we go. This list will be put in the |
77 | * rtas_firmware_flash_list global var once it is fully read. | 104 | * rtas_firmware_flash_list var once it is fully read. |
78 | * | 105 | * |
79 | * For convenience as we build the list we use virtual addrs, | 106 | * For convenience as we build the list we use virtual addrs, |
80 | * we do not fill in the version number, and the length field | 107 | * we do not fill in the version number, and the length field |
@@ -562,6 +589,86 @@ static int validate_flash_release(struct inode *inode, struct file *file) | |||
562 | return 0; | 589 | return 0; |
563 | } | 590 | } |
564 | 591 | ||
592 | static void rtas_flash_firmware(int reboot_type) | ||
593 | { | ||
594 | unsigned long image_size; | ||
595 | struct flash_block_list *f, *next, *flist; | ||
596 | unsigned long rtas_block_list; | ||
597 | int i, status, update_token; | ||
598 | |||
599 | if (rtas_firmware_flash_list.next == NULL) | ||
600 | return; /* nothing to do */ | ||
601 | |||
602 | if (reboot_type != SYS_RESTART) { | ||
603 | printk(KERN_ALERT "FLASH: firmware flash requires a reboot\n"); | ||
604 | printk(KERN_ALERT "FLASH: the firmware image will NOT be flashed\n"); | ||
605 | return; | ||
606 | } | ||
607 | |||
608 | update_token = rtas_token("ibm,update-flash-64-and-reboot"); | ||
609 | if (update_token == RTAS_UNKNOWN_SERVICE) { | ||
610 | printk(KERN_ALERT "FLASH: ibm,update-flash-64-and-reboot " | ||
611 | "is not available -- not a service partition?\n"); | ||
612 | printk(KERN_ALERT "FLASH: firmware will not be flashed\n"); | ||
613 | return; | ||
614 | } | ||
615 | |||
616 | /* NOTE: the "first" block list is a global var with no data | ||
617 | * blocks in the kernel data segment. We do this because | ||
618 | * we want to ensure this block_list addr is under 4GB. | ||
619 | */ | ||
620 | rtas_firmware_flash_list.num_blocks = 0; | ||
621 | flist = (struct flash_block_list *)&rtas_firmware_flash_list; | ||
622 | rtas_block_list = virt_to_abs(flist); | ||
623 | if (rtas_block_list >= 4UL*1024*1024*1024) { | ||
624 | printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n"); | ||
625 | return; | ||
626 | } | ||
627 | |||
628 | printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n"); | ||
629 | /* Update the block_list in place. */ | ||
630 | image_size = 0; | ||
631 | for (f = flist; f; f = next) { | ||
632 | /* Translate data addrs to absolute */ | ||
633 | for (i = 0; i < f->num_blocks; i++) { | ||
634 | f->blocks[i].data = (char *)virt_to_abs(f->blocks[i].data); | ||
635 | image_size += f->blocks[i].length; | ||
636 | } | ||
637 | next = f->next; | ||
638 | /* Don't translate NULL pointer for last entry */ | ||
639 | if (f->next) | ||
640 | f->next = (struct flash_block_list *)virt_to_abs(f->next); | ||
641 | else | ||
642 | f->next = NULL; | ||
643 | /* make num_blocks into the version/length field */ | ||
644 | f->num_blocks = (FLASH_BLOCK_LIST_VERSION << 56) | ((f->num_blocks+1)*16); | ||
645 | } | ||
646 | |||
647 | printk(KERN_ALERT "FLASH: flash image is %ld bytes\n", image_size); | ||
648 | printk(KERN_ALERT "FLASH: performing flash and reboot\n"); | ||
649 | rtas_progress("Flashing \n", 0x0); | ||
650 | rtas_progress("Please Wait... ", 0x0); | ||
651 | printk(KERN_ALERT "FLASH: this will take several minutes. Do not power off!\n"); | ||
652 | status = rtas_call(update_token, 1, 1, NULL, rtas_block_list); | ||
653 | switch (status) { /* should only get "bad" status */ | ||
654 | case 0: | ||
655 | printk(KERN_ALERT "FLASH: success\n"); | ||
656 | break; | ||
657 | case -1: | ||
658 | printk(KERN_ALERT "FLASH: hardware error. Firmware may not be not flashed\n"); | ||
659 | break; | ||
660 | case -3: | ||
661 | printk(KERN_ALERT "FLASH: image is corrupt or not correct for this platform. Firmware not flashed\n"); | ||
662 | break; | ||
663 | case -4: | ||
664 | printk(KERN_ALERT "FLASH: flash failed when partially complete. System may not reboot\n"); | ||
665 | break; | ||
666 | default: | ||
667 | printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status); | ||
668 | break; | ||
669 | } | ||
670 | } | ||
671 | |||
565 | static void remove_flash_pde(struct proc_dir_entry *dp) | 672 | static void remove_flash_pde(struct proc_dir_entry *dp) |
566 | { | 673 | { |
567 | if (dp) { | 674 | if (dp) { |
@@ -701,6 +808,7 @@ int __init rtas_flash_init(void) | |||
701 | if (rc != 0) | 808 | if (rc != 0) |
702 | goto cleanup; | 809 | goto cleanup; |
703 | 810 | ||
811 | rtas_flash_term_hook = rtas_flash_firmware; | ||
704 | return 0; | 812 | return 0; |
705 | 813 | ||
706 | cleanup: | 814 | cleanup: |
@@ -714,6 +822,7 @@ cleanup: | |||
714 | 822 | ||
715 | void __exit rtas_flash_cleanup(void) | 823 | void __exit rtas_flash_cleanup(void) |
716 | { | 824 | { |
825 | rtas_flash_term_hook = NULL; | ||
717 | remove_flash_pde(firmware_flash_pde); | 826 | remove_flash_pde(firmware_flash_pde); |
718 | remove_flash_pde(firmware_update_pde); | 827 | remove_flash_pde(firmware_update_pde); |
719 | remove_flash_pde(validate_pde); | 828 | remove_flash_pde(validate_pde); |
diff --git a/arch/powerpc/kernel/rtas_fw.c b/arch/powerpc/kernel/rtas_fw.c deleted file mode 100644 index 448922e8af1b..000000000000 --- a/arch/powerpc/kernel/rtas_fw.c +++ /dev/null | |||
@@ -1,136 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * Procedures for firmware flash updates. | ||
4 | * | ||
5 | * Peter Bergner, IBM March 2001. | ||
6 | * Copyright (C) 2001 IBM. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * as published by the Free Software Foundation; either version | ||
11 | * 2 of the License, or (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <stdarg.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/spinlock.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/init.h> | ||
20 | |||
21 | #include <asm/prom.h> | ||
22 | #include <asm/rtas.h> | ||
23 | #include <asm/semaphore.h> | ||
24 | #include <asm/machdep.h> | ||
25 | #include <asm/page.h> | ||
26 | #include <asm/param.h> | ||
27 | #include <asm/system.h> | ||
28 | #include <asm/abs_addr.h> | ||
29 | #include <asm/udbg.h> | ||
30 | #include <asm/delay.h> | ||
31 | #include <asm/uaccess.h> | ||
32 | #include <asm/systemcfg.h> | ||
33 | |||
34 | struct flash_block_list_header rtas_firmware_flash_list = {0, NULL}; | ||
35 | |||
36 | #define FLASH_BLOCK_LIST_VERSION (1UL) | ||
37 | |||
38 | static void rtas_flash_firmware(void) | ||
39 | { | ||
40 | unsigned long image_size; | ||
41 | struct flash_block_list *f, *next, *flist; | ||
42 | unsigned long rtas_block_list; | ||
43 | int i, status, update_token; | ||
44 | |||
45 | update_token = rtas_token("ibm,update-flash-64-and-reboot"); | ||
46 | if (update_token == RTAS_UNKNOWN_SERVICE) { | ||
47 | printk(KERN_ALERT "FLASH: ibm,update-flash-64-and-reboot is not available -- not a service partition?\n"); | ||
48 | printk(KERN_ALERT "FLASH: firmware will not be flashed\n"); | ||
49 | return; | ||
50 | } | ||
51 | |||
52 | /* NOTE: the "first" block list is a global var with no data | ||
53 | * blocks in the kernel data segment. We do this because | ||
54 | * we want to ensure this block_list addr is under 4GB. | ||
55 | */ | ||
56 | rtas_firmware_flash_list.num_blocks = 0; | ||
57 | flist = (struct flash_block_list *)&rtas_firmware_flash_list; | ||
58 | rtas_block_list = virt_to_abs(flist); | ||
59 | if (rtas_block_list >= 4UL*1024*1024*1024) { | ||
60 | printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n"); | ||
61 | return; | ||
62 | } | ||
63 | |||
64 | printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n"); | ||
65 | /* Update the block_list in place. */ | ||
66 | image_size = 0; | ||
67 | for (f = flist; f; f = next) { | ||
68 | /* Translate data addrs to absolute */ | ||
69 | for (i = 0; i < f->num_blocks; i++) { | ||
70 | f->blocks[i].data = (char *)virt_to_abs(f->blocks[i].data); | ||
71 | image_size += f->blocks[i].length; | ||
72 | } | ||
73 | next = f->next; | ||
74 | /* Don't translate NULL pointer for last entry */ | ||
75 | if (f->next) | ||
76 | f->next = (struct flash_block_list *)virt_to_abs(f->next); | ||
77 | else | ||
78 | f->next = NULL; | ||
79 | /* make num_blocks into the version/length field */ | ||
80 | f->num_blocks = (FLASH_BLOCK_LIST_VERSION << 56) | ((f->num_blocks+1)*16); | ||
81 | } | ||
82 | |||
83 | printk(KERN_ALERT "FLASH: flash image is %ld bytes\n", image_size); | ||
84 | printk(KERN_ALERT "FLASH: performing flash and reboot\n"); | ||
85 | rtas_progress("Flashing \n", 0x0); | ||
86 | rtas_progress("Please Wait... ", 0x0); | ||
87 | printk(KERN_ALERT "FLASH: this will take several minutes. Do not power off!\n"); | ||
88 | status = rtas_call(update_token, 1, 1, NULL, rtas_block_list); | ||
89 | switch (status) { /* should only get "bad" status */ | ||
90 | case 0: | ||
91 | printk(KERN_ALERT "FLASH: success\n"); | ||
92 | break; | ||
93 | case -1: | ||
94 | printk(KERN_ALERT "FLASH: hardware error. Firmware may not be not flashed\n"); | ||
95 | break; | ||
96 | case -3: | ||
97 | printk(KERN_ALERT "FLASH: image is corrupt or not correct for this platform. Firmware not flashed\n"); | ||
98 | break; | ||
99 | case -4: | ||
100 | printk(KERN_ALERT "FLASH: flash failed when partially complete. System may not reboot\n"); | ||
101 | break; | ||
102 | default: | ||
103 | printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status); | ||
104 | break; | ||
105 | } | ||
106 | } | ||
107 | |||
108 | void rtas_flash_bypass_warning(void) | ||
109 | { | ||
110 | printk(KERN_ALERT "FLASH: firmware flash requires a reboot\n"); | ||
111 | printk(KERN_ALERT "FLASH: the firmware image will NOT be flashed\n"); | ||
112 | } | ||
113 | |||
114 | |||
115 | void rtas_fw_restart(char *cmd) | ||
116 | { | ||
117 | if (rtas_firmware_flash_list.next) | ||
118 | rtas_flash_firmware(); | ||
119 | rtas_restart(cmd); | ||
120 | } | ||
121 | |||
122 | void rtas_fw_power_off(void) | ||
123 | { | ||
124 | if (rtas_firmware_flash_list.next) | ||
125 | rtas_flash_bypass_warning(); | ||
126 | rtas_power_off(); | ||
127 | } | ||
128 | |||
129 | void rtas_fw_halt(void) | ||
130 | { | ||
131 | if (rtas_firmware_flash_list.next) | ||
132 | rtas_flash_bypass_warning(); | ||
133 | rtas_halt(); | ||
134 | } | ||
135 | |||
136 | EXPORT_SYMBOL(rtas_firmware_flash_list); | ||
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 444c3e81884c..876c57c11365 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
@@ -43,7 +43,7 @@ | |||
43 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
44 | #include <asm/cacheflush.h> | 44 | #include <asm/cacheflush.h> |
45 | #ifdef CONFIG_PPC64 | 45 | #ifdef CONFIG_PPC64 |
46 | #include <asm/ppc32.h> | 46 | #include "ppc32.h" |
47 | #include <asm/ppcdebug.h> | 47 | #include <asm/ppcdebug.h> |
48 | #include <asm/unistd.h> | 48 | #include <asm/unistd.h> |
49 | #include <asm/vdso.h> | 49 | #include <asm/vdso.h> |
diff --git a/arch/ppc64/kernel/signal.c b/arch/powerpc/kernel/signal_64.c index ec9d0984b6a0..ec9d0984b6a0 100644 --- a/arch/ppc64/kernel/signal.c +++ b/arch/powerpc/kernel/signal_64.c | |||
diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c index d8bdaaf74c9b..80b58c1ec412 100644 --- a/arch/powerpc/platforms/powermac/setup.c +++ b/arch/powerpc/platforms/powermac/setup.c | |||
@@ -351,7 +351,7 @@ void __init pmac_setup_arch(void) | |||
351 | find_via_pmu(); | 351 | find_via_pmu(); |
352 | smu_init(); | 352 | smu_init(); |
353 | 353 | ||
354 | #ifdef CONFIG_NVRAM | 354 | #if defined(CONFIG_NVRAM) || defined(CONFIG_PPC64) |
355 | pmac_nvram_init(); | 355 | pmac_nvram_init(); |
356 | #endif | 356 | #endif |
357 | 357 | ||
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig index 2d57f588151d..e3fc3407bb1f 100644 --- a/arch/powerpc/platforms/pseries/Kconfig +++ b/arch/powerpc/platforms/pseries/Kconfig | |||
@@ -21,15 +21,6 @@ config EEH | |||
21 | depends on PPC_PSERIES | 21 | depends on PPC_PSERIES |
22 | default y if !EMBEDDED | 22 | default y if !EMBEDDED |
23 | 23 | ||
24 | config RTAS_PROC | ||
25 | bool "Proc interface to RTAS" | ||
26 | depends on PPC_RTAS | ||
27 | default y | ||
28 | |||
29 | config RTAS_FLASH | ||
30 | tristate "Firmware flash interface" | ||
31 | depends on PPC64 && RTAS_PROC | ||
32 | |||
33 | config SCANLOG | 24 | config SCANLOG |
34 | tristate "Scanlog dump interface" | 25 | tristate "Scanlog dump interface" |
35 | depends on RTAS_PROC && PPC_PSERIES | 26 | depends on RTAS_PROC && PPC_PSERIES |
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile index 91909a844736..b9938fece781 100644 --- a/arch/powerpc/platforms/pseries/Makefile +++ b/arch/powerpc/platforms/pseries/Makefile | |||
@@ -1,5 +1,5 @@ | |||
1 | obj-y := pci.o lpar.o hvCall.o nvram.o reconfig.o \ | 1 | obj-y := pci.o lpar.o hvCall.o nvram.o reconfig.o \ |
2 | setup.o iommu.o ras.o | 2 | setup.o iommu.o ras.o rtasd.o |
3 | obj-$(CONFIG_SMP) += smp.o | 3 | obj-$(CONFIG_SMP) += smp.o |
4 | obj-$(CONFIG_IBMVIO) += vio.o | 4 | obj-$(CONFIG_IBMVIO) += vio.o |
5 | obj-$(CONFIG_XICS) += xics.o | 5 | obj-$(CONFIG_XICS) += xics.o |
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index 9e58a1922109..513e27231493 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -499,7 +499,7 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti | |||
499 | 499 | ||
500 | switch (action) { | 500 | switch (action) { |
501 | case PSERIES_RECONFIG_REMOVE: | 501 | case PSERIES_RECONFIG_REMOVE: |
502 | if (pci->iommu_table && | 502 | if (pci && pci->iommu_table && |
503 | get_property(np, "ibm,dma-window", NULL)) | 503 | get_property(np, "ibm,dma-window", NULL)) |
504 | iommu_free_table(np); | 504 | iommu_free_table(np); |
505 | break; | 505 | break; |
diff --git a/arch/ppc64/kernel/rtasd.c b/arch/powerpc/platforms/pseries/rtasd.c index e26b0420b6dd..e26b0420b6dd 100644 --- a/arch/ppc64/kernel/rtasd.c +++ b/arch/powerpc/platforms/pseries/rtasd.c | |||
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index d54e1e4c7c63..65bee939eecc 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -602,9 +602,9 @@ struct machdep_calls __initdata pSeries_md = { | |||
602 | .pcibios_fixup = pSeries_final_fixup, | 602 | .pcibios_fixup = pSeries_final_fixup, |
603 | .pci_probe_mode = pSeries_pci_probe_mode, | 603 | .pci_probe_mode = pSeries_pci_probe_mode, |
604 | .irq_bus_setup = pSeries_irq_bus_setup, | 604 | .irq_bus_setup = pSeries_irq_bus_setup, |
605 | .restart = rtas_fw_restart, | 605 | .restart = rtas_restart, |
606 | .power_off = rtas_fw_power_off, | 606 | .power_off = rtas_power_off, |
607 | .halt = rtas_fw_halt, | 607 | .halt = rtas_halt, |
608 | .panic = rtas_os_term, | 608 | .panic = rtas_os_term, |
609 | .cpu_die = pSeries_mach_cpu_die, | 609 | .cpu_die = pSeries_mach_cpu_die, |
610 | .get_boot_time = rtas_get_boot_time, | 610 | .get_boot_time = rtas_get_boot_time, |
diff --git a/arch/ppc/8xx_io/commproc.c b/arch/ppc/8xx_io/commproc.c index b42789f8eb76..579cd40258b9 100644 --- a/arch/ppc/8xx_io/commproc.c +++ b/arch/ppc/8xx_io/commproc.c | |||
@@ -388,9 +388,8 @@ void m8xx_cpm_dpinit(void) | |||
388 | 388 | ||
389 | /* | 389 | /* |
390 | * Allocate the requested size worth of DP memory. | 390 | * Allocate the requested size worth of DP memory. |
391 | * This function used to return an index into the DPRAM area. | 391 | * This function returns an offset into the DPRAM area. |
392 | * Now it returns the actuall physical address of that area. | 392 | * Use cpm_dpram_addr() to get the virtual address of the area. |
393 | * use m8xx_cpm_dpram_offset() to get the index | ||
394 | */ | 393 | */ |
395 | uint cpm_dpalloc(uint size, uint align) | 394 | uint cpm_dpalloc(uint size, uint align) |
396 | { | 395 | { |
diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c index ae24196d78f6..e0ca61b37f4f 100644 --- a/arch/ppc/kernel/ppc_ksyms.c +++ b/arch/ppc/kernel/ppc_ksyms.c | |||
@@ -131,6 +131,11 @@ EXPORT_SYMBOL(outw); | |||
131 | EXPORT_SYMBOL(outl); | 131 | EXPORT_SYMBOL(outl); |
132 | EXPORT_SYMBOL(outsl);*/ | 132 | EXPORT_SYMBOL(outsl);*/ |
133 | 133 | ||
134 | EXPORT_SYMBOL(__ide_mm_insl); | ||
135 | EXPORT_SYMBOL(__ide_mm_outsw); | ||
136 | EXPORT_SYMBOL(__ide_mm_insw); | ||
137 | EXPORT_SYMBOL(__ide_mm_outsl); | ||
138 | |||
134 | EXPORT_SYMBOL(_insb); | 139 | EXPORT_SYMBOL(_insb); |
135 | EXPORT_SYMBOL(_outsb); | 140 | EXPORT_SYMBOL(_outsb); |
136 | EXPORT_SYMBOL(_insw); | 141 | EXPORT_SYMBOL(_insw); |
diff --git a/arch/ppc/kernel/traps.c b/arch/ppc/kernel/traps.c index f265b81e7008..16adde6b429d 100644 --- a/arch/ppc/kernel/traps.c +++ b/arch/ppc/kernel/traps.c | |||
@@ -606,22 +606,22 @@ int check_bug_trap(struct pt_regs *regs) | |||
606 | if (bug->line & BUG_WARNING_TRAP) { | 606 | if (bug->line & BUG_WARNING_TRAP) { |
607 | /* this is a WARN_ON rather than BUG/BUG_ON */ | 607 | /* this is a WARN_ON rather than BUG/BUG_ON */ |
608 | #ifdef CONFIG_XMON | 608 | #ifdef CONFIG_XMON |
609 | xmon_printf(KERN_ERR "Badness in %s at %s:%d\n", | 609 | xmon_printf(KERN_ERR "Badness in %s at %s:%ld\n", |
610 | bug->function, bug->file, | 610 | bug->function, bug->file, |
611 | bug->line & ~BUG_WARNING_TRAP); | 611 | bug->line & ~BUG_WARNING_TRAP); |
612 | #endif /* CONFIG_XMON */ | 612 | #endif /* CONFIG_XMON */ |
613 | printk(KERN_ERR "Badness in %s at %s:%d\n", | 613 | printk(KERN_ERR "Badness in %s at %s:%ld\n", |
614 | bug->function, bug->file, | 614 | bug->function, bug->file, |
615 | bug->line & ~BUG_WARNING_TRAP); | 615 | bug->line & ~BUG_WARNING_TRAP); |
616 | dump_stack(); | 616 | dump_stack(); |
617 | return 1; | 617 | return 1; |
618 | } | 618 | } |
619 | #ifdef CONFIG_XMON | 619 | #ifdef CONFIG_XMON |
620 | xmon_printf(KERN_CRIT "kernel BUG in %s at %s:%d!\n", | 620 | xmon_printf(KERN_CRIT "kernel BUG in %s at %s:%ld!\n", |
621 | bug->function, bug->file, bug->line); | 621 | bug->function, bug->file, bug->line); |
622 | xmon(regs); | 622 | xmon(regs); |
623 | #endif /* CONFIG_XMON */ | 623 | #endif /* CONFIG_XMON */ |
624 | printk(KERN_CRIT "kernel BUG in %s at %s:%d!\n", | 624 | printk(KERN_CRIT "kernel BUG in %s at %s:%ld!\n", |
625 | bug->function, bug->file, bug->line); | 625 | bug->function, bug->file, bug->line); |
626 | 626 | ||
627 | return 0; | 627 | return 0; |
diff --git a/arch/ppc/syslib/m8xx_setup.c b/arch/ppc/syslib/m8xx_setup.c index 97ffbc70574f..1cc3abe6fa43 100644 --- a/arch/ppc/syslib/m8xx_setup.c +++ b/arch/ppc/syslib/m8xx_setup.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <asm/bootinfo.h> | 45 | #include <asm/bootinfo.h> |
46 | #include <asm/time.h> | 46 | #include <asm/time.h> |
47 | #include <asm/xmon.h> | 47 | #include <asm/xmon.h> |
48 | #include <asm/ppc_sys.h> | ||
48 | 49 | ||
49 | #include "ppc8xx_pic.h" | 50 | #include "ppc8xx_pic.h" |
50 | 51 | ||
diff --git a/arch/ppc64/kernel/Makefile b/arch/ppc64/kernel/Makefile index 990df0905c87..430cb3900a07 100644 --- a/arch/ppc64/kernel/Makefile +++ b/arch/ppc64/kernel/Makefile | |||
@@ -12,7 +12,6 @@ obj-y := misc.o prom.o | |||
12 | endif | 12 | endif |
13 | 13 | ||
14 | obj-y += irq.o idle.o dma.o \ | 14 | obj-y += irq.o idle.o dma.o \ |
15 | signal.o \ | ||
16 | align.o pacaData.o \ | 15 | align.o pacaData.o \ |
17 | udbg.o ioctl32.o \ | 16 | udbg.o ioctl32.o \ |
18 | rtc.o \ | 17 | rtc.o \ |
@@ -29,19 +28,17 @@ ifneq ($(CONFIG_PPC_MERGE),y) | |||
29 | obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o | 28 | obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o |
30 | endif | 29 | endif |
31 | 30 | ||
32 | obj-$(CONFIG_PPC_PSERIES) += rtasd.o udbg_16550.o | 31 | obj-$(CONFIG_PPC_PSERIES) += udbg_16550.o |
33 | 32 | ||
34 | obj-$(CONFIG_KEXEC) += machine_kexec.o | 33 | obj-$(CONFIG_KEXEC) += machine_kexec.o |
35 | obj-$(CONFIG_EEH) += eeh.o | 34 | obj-$(CONFIG_EEH) += eeh.o |
36 | obj-$(CONFIG_PROC_FS) += proc_ppc64.o | 35 | obj-$(CONFIG_PROC_FS) += proc_ppc64.o |
37 | obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o | ||
38 | obj-$(CONFIG_SMP) += smp.o | 36 | obj-$(CONFIG_SMP) += smp.o |
39 | obj-$(CONFIG_MODULES) += module.o | 37 | obj-$(CONFIG_MODULES) += module.o |
40 | ifneq ($(CONFIG_PPC_MERGE),y) | 38 | ifneq ($(CONFIG_PPC_MERGE),y) |
41 | obj-$(CONFIG_MODULES) += ppc_ksyms.o | 39 | obj-$(CONFIG_MODULES) += ppc_ksyms.o |
42 | endif | 40 | endif |
43 | obj-$(CONFIG_PPC_RTAS) += rtas_pci.o | 41 | obj-$(CONFIG_PPC_RTAS) += rtas_pci.o |
44 | obj-$(CONFIG_RTAS_PROC) += rtas-proc.o | ||
45 | obj-$(CONFIG_SCANLOG) += scanlog.o | 42 | obj-$(CONFIG_SCANLOG) += scanlog.o |
46 | obj-$(CONFIG_LPARCFG) += lparcfg.o | 43 | obj-$(CONFIG_LPARCFG) += lparcfg.o |
47 | obj-$(CONFIG_HVC_CONSOLE) += hvconsole.o | 44 | obj-$(CONFIG_HVC_CONSOLE) += hvconsole.o |
diff --git a/arch/ppc64/kernel/pci_dn.c b/arch/ppc64/kernel/pci_dn.c index 493bbe43f5b4..1a443a7ada4c 100644 --- a/arch/ppc64/kernel/pci_dn.c +++ b/arch/ppc64/kernel/pci_dn.c | |||
@@ -181,13 +181,14 @@ EXPORT_SYMBOL(fetch_dev_dn); | |||
181 | static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node) | 181 | static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node) |
182 | { | 182 | { |
183 | struct device_node *np = node; | 183 | struct device_node *np = node; |
184 | struct pci_dn *pci; | 184 | struct pci_dn *pci = NULL; |
185 | int err = NOTIFY_OK; | 185 | int err = NOTIFY_OK; |
186 | 186 | ||
187 | switch (action) { | 187 | switch (action) { |
188 | case PSERIES_RECONFIG_ADD: | 188 | case PSERIES_RECONFIG_ADD: |
189 | pci = np->parent->data; | 189 | pci = np->parent->data; |
190 | update_dn_pci_info(np, pci->phb); | 190 | if (pci) |
191 | update_dn_pci_info(np, pci->phb); | ||
191 | break; | 192 | break; |
192 | default: | 193 | default: |
193 | err = NOTIFY_DONE; | 194 | err = NOTIFY_DONE; |
diff --git a/include/asm-powerpc/ipcbuf.h b/include/asm-powerpc/ipcbuf.h index 71382c1ec6e3..2c3e1d94db1d 100644 --- a/include/asm-powerpc/ipcbuf.h +++ b/include/asm-powerpc/ipcbuf.h | |||
@@ -27,7 +27,8 @@ struct ipc64_perm | |||
27 | __kernel_mode_t mode; | 27 | __kernel_mode_t mode; |
28 | unsigned int seq; | 28 | unsigned int seq; |
29 | unsigned int __pad1; | 29 | unsigned int __pad1; |
30 | __u32 __unused[4]; | 30 | unsigned long long __unused1; |
31 | unsigned long long __unused2; | ||
31 | }; | 32 | }; |
32 | 33 | ||
33 | #endif /* _ASM_POWERPC_IPCBUF_H */ | 34 | #endif /* _ASM_POWERPC_IPCBUF_H */ |
diff --git a/include/asm-ppc64/ptrace.h b/include/asm-powerpc/ptrace.h index 3a55377f1fd3..1f7ecdb0b6ce 100644 --- a/include/asm-ppc64/ptrace.h +++ b/include/asm-powerpc/ptrace.h | |||
@@ -1,5 +1,5 @@ | |||
1 | #ifndef _PPC64_PTRACE_H | 1 | #ifndef _ASM_POWERPC_PTRACE_H |
2 | #define _PPC64_PTRACE_H | 2 | #define _ASM_POWERPC_PTRACE_H |
3 | 3 | ||
4 | /* | 4 | /* |
5 | * Copyright (C) 2001 PPC64 Team, IBM Corp | 5 | * Copyright (C) 2001 PPC64 Team, IBM Corp |
@@ -16,7 +16,7 @@ | |||
16 | * that the overall structure is a multiple of 16 bytes in length. | 16 | * that the overall structure is a multiple of 16 bytes in length. |
17 | * | 17 | * |
18 | * Note that the offsets of the fields in this struct correspond with | 18 | * Note that the offsets of the fields in this struct correspond with |
19 | * the PT_* values below. This simplifies arch/ppc64/kernel/ptrace.c. | 19 | * the PT_* values below. This simplifies arch/powerpc/kernel/ptrace.c. |
20 | * | 20 | * |
21 | * This program is free software; you can redistribute it and/or | 21 | * This program is free software; you can redistribute it and/or |
22 | * modify it under the terms of the GNU General Public License | 22 | * modify it under the terms of the GNU General Public License |
@@ -30,70 +30,96 @@ struct pt_regs { | |||
30 | unsigned long gpr[32]; | 30 | unsigned long gpr[32]; |
31 | unsigned long nip; | 31 | unsigned long nip; |
32 | unsigned long msr; | 32 | unsigned long msr; |
33 | unsigned long orig_gpr3; /* Used for restarting system calls */ | 33 | unsigned long orig_gpr3; /* Used for restarting system calls */ |
34 | unsigned long ctr; | 34 | unsigned long ctr; |
35 | unsigned long link; | 35 | unsigned long link; |
36 | unsigned long xer; | 36 | unsigned long xer; |
37 | unsigned long ccr; | 37 | unsigned long ccr; |
38 | unsigned long softe; /* Soft enabled/disabled */ | 38 | #ifdef __powerpc64__ |
39 | unsigned long trap; /* Reason for being here */ | 39 | unsigned long softe; /* Soft enabled/disabled */ |
40 | unsigned long dar; /* Fault registers */ | 40 | #else |
41 | unsigned long dsisr; | 41 | unsigned long mq; /* 601 only (not used at present) */ |
42 | unsigned long result; /* Result of a system call */ | 42 | /* Used on APUS to hold IPL value. */ |
43 | #endif | ||
44 | unsigned long trap; /* Reason for being here */ | ||
45 | /* N.B. for critical exceptions on 4xx, the dar and dsisr | ||
46 | fields are overloaded to hold srr0 and srr1. */ | ||
47 | unsigned long dar; /* Fault registers */ | ||
48 | unsigned long dsisr; /* on 4xx/Book-E used for ESR */ | ||
49 | unsigned long result; /* Result of a system call */ | ||
43 | }; | 50 | }; |
44 | 51 | ||
45 | struct pt_regs32 { | 52 | #endif /* __ASSEMBLY__ */ |
46 | unsigned int gpr[32]; | ||
47 | unsigned int nip; | ||
48 | unsigned int msr; | ||
49 | unsigned int orig_gpr3; /* Used for restarting system calls */ | ||
50 | unsigned int ctr; | ||
51 | unsigned int link; | ||
52 | unsigned int xer; | ||
53 | unsigned int ccr; | ||
54 | unsigned int mq; /* 601 only (not used at present) */ | ||
55 | unsigned int trap; /* Reason for being here */ | ||
56 | unsigned int dar; /* Fault registers */ | ||
57 | unsigned int dsisr; | ||
58 | unsigned int result; /* Result of a system call */ | ||
59 | }; | ||
60 | 53 | ||
61 | #ifdef __KERNEL__ | 54 | #ifdef __KERNEL__ |
62 | 55 | ||
63 | #define instruction_pointer(regs) ((regs)->nip) | 56 | #ifdef __powerpc64__ |
57 | |||
58 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ | ||
59 | |||
60 | /* Size of dummy stack frame allocated when calling signal handler. */ | ||
61 | #define __SIGNAL_FRAMESIZE 128 | ||
62 | #define __SIGNAL_FRAMESIZE32 64 | ||
63 | |||
64 | #else /* __powerpc64__ */ | ||
65 | |||
66 | #define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */ | ||
67 | |||
68 | /* Size of stack frame allocated when calling signal handler. */ | ||
69 | #define __SIGNAL_FRAMESIZE 64 | ||
70 | |||
71 | #endif /* __powerpc64__ */ | ||
64 | 72 | ||
73 | #ifndef __ASSEMBLY__ | ||
74 | |||
75 | #define instruction_pointer(regs) ((regs)->nip) | ||
65 | #ifdef CONFIG_SMP | 76 | #ifdef CONFIG_SMP |
66 | extern unsigned long profile_pc(struct pt_regs *regs); | 77 | extern unsigned long profile_pc(struct pt_regs *regs); |
67 | #else | 78 | #else |
68 | #define profile_pc(regs) instruction_pointer(regs) | 79 | #define profile_pc(regs) instruction_pointer(regs) |
69 | #endif | 80 | #endif |
70 | 81 | ||
82 | #ifdef __powerpc64__ | ||
71 | #define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1) | 83 | #define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1) |
84 | #else | ||
85 | #define user_mode(regs) (((regs)->msr & MSR_PR) != 0) | ||
86 | #endif | ||
72 | 87 | ||
73 | #define force_successful_syscall_return() \ | 88 | #define force_successful_syscall_return() \ |
74 | (current_thread_info()->syscall_noerror = 1) | 89 | do { \ |
90 | current_thread_info()->syscall_noerror = 1; \ | ||
91 | } while(0) | ||
75 | 92 | ||
76 | /* | 93 | /* |
77 | * We use the least-significant bit of the trap field to indicate | 94 | * We use the least-significant bit of the trap field to indicate |
78 | * whether we have saved the full set of registers, or only a | 95 | * whether we have saved the full set of registers, or only a |
79 | * partial set. A 1 there means the partial set. | 96 | * partial set. A 1 there means the partial set. |
97 | * On 4xx we use the next bit to indicate whether the exception | ||
98 | * is a critical exception (1 means it is). | ||
80 | */ | 99 | */ |
81 | #define FULL_REGS(regs) (((regs)->trap & 1) == 0) | 100 | #define FULL_REGS(regs) (((regs)->trap & 1) == 0) |
101 | #ifndef __powerpc64__ | ||
102 | #define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) == 0) | ||
103 | #endif /* ! __powerpc64__ */ | ||
82 | #define TRAP(regs) ((regs)->trap & ~0xF) | 104 | #define TRAP(regs) ((regs)->trap & ~0xF) |
105 | #ifdef __powerpc64__ | ||
83 | #define CHECK_FULL_REGS(regs) BUG_ON(regs->trap & 1) | 106 | #define CHECK_FULL_REGS(regs) BUG_ON(regs->trap & 1) |
84 | 107 | #else | |
85 | #endif /* __KERNEL__ */ | 108 | #define CHECK_FULL_REGS(regs) \ |
109 | do { \ | ||
110 | if ((regs)->trap & 1) \ | ||
111 | printk(KERN_CRIT "%s: partial register set\n", __FUNCTION__); \ | ||
112 | } while (0) | ||
113 | #endif /* __powerpc64__ */ | ||
86 | 114 | ||
87 | #endif /* __ASSEMBLY__ */ | 115 | #endif /* __ASSEMBLY__ */ |
88 | 116 | ||
89 | #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ | 117 | #endif /* __KERNEL__ */ |
90 | |||
91 | /* Size of dummy stack frame allocated when calling signal handler. */ | ||
92 | #define __SIGNAL_FRAMESIZE 128 | ||
93 | #define __SIGNAL_FRAMESIZE32 64 | ||
94 | 118 | ||
95 | /* | 119 | /* |
96 | * Offsets used by 'ptrace' system call interface. | 120 | * Offsets used by 'ptrace' system call interface. |
121 | * These can't be changed without breaking binary compatibility | ||
122 | * with MkLinux, etc. | ||
97 | */ | 123 | */ |
98 | #define PT_R0 0 | 124 | #define PT_R0 0 |
99 | #define PT_R1 1 | 125 | #define PT_R1 1 |
@@ -137,18 +163,25 @@ extern unsigned long profile_pc(struct pt_regs *regs); | |||
137 | #define PT_LNK 36 | 163 | #define PT_LNK 36 |
138 | #define PT_XER 37 | 164 | #define PT_XER 37 |
139 | #define PT_CCR 38 | 165 | #define PT_CCR 38 |
166 | #ifndef __powerpc64__ | ||
167 | #define PT_MQ 39 | ||
168 | #else | ||
140 | #define PT_SOFTE 39 | 169 | #define PT_SOFTE 39 |
141 | #define PT_TRAP 40 | 170 | #define PT_TRAP 40 |
142 | #define PT_DAR 41 | 171 | #define PT_DAR 41 |
143 | #define PT_DSISR 42 | 172 | #define PT_DSISR 42 |
144 | #define PT_RESULT 43 | 173 | #define PT_RESULT 43 |
174 | #endif | ||
145 | 175 | ||
146 | #define PT_FPR0 48 | 176 | #define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */ |
177 | |||
178 | #ifndef __powerpc64__ | ||
179 | |||
180 | #define PT_FPR31 (PT_FPR0 + 2*31) | ||
181 | #define PT_FPSCR (PT_FPR0 + 2*32 + 1) | ||
182 | |||
183 | #else /* __powerpc64__ */ | ||
147 | 184 | ||
148 | /* | ||
149 | * Kernel and userspace will both use this PT_FPSCR value. 32-bit apps will | ||
150 | * have visibility to the asm-ppc/ptrace.h header instead of this one. | ||
151 | */ | ||
152 | #define PT_FPSCR (PT_FPR0 + 32) /* each FP reg occupies 1 slot in 64-bit space */ | 185 | #define PT_FPSCR (PT_FPR0 + 32) /* each FP reg occupies 1 slot in 64-bit space */ |
153 | 186 | ||
154 | #ifdef __KERNEL__ | 187 | #ifdef __KERNEL__ |
@@ -165,29 +198,29 @@ extern unsigned long profile_pc(struct pt_regs *regs); | |||
165 | #define PT_VRSAVE_32 (PT_VR0 + 33*4) | 198 | #define PT_VRSAVE_32 (PT_VR0 + 33*4) |
166 | #endif | 199 | #endif |
167 | 200 | ||
201 | #endif /* __powerpc64__ */ | ||
202 | |||
168 | /* | 203 | /* |
169 | * Get/set all the altivec registers vr0..vr31, vscr, vrsave, in one go. | 204 | * Get/set all the altivec registers vr0..vr31, vscr, vrsave, in one go. |
170 | * The transfer totals 34 quadword. Quadwords 0-31 contain the | 205 | * The transfer totals 34 quadword. Quadwords 0-31 contain the |
171 | * corresponding vector registers. Quadword 32 contains the vscr as the | 206 | * corresponding vector registers. Quadword 32 contains the vscr as the |
172 | * last word (offset 12) within that quadword. Quadword 33 contains the | 207 | * last word (offset 12) within that quadword. Quadword 33 contains the |
173 | * vrsave as the first word (offset 0) within the quadword. | 208 | * vrsave as the first word (offset 0) within the quadword. |
174 | * | 209 | * |
175 | * This definition of the VMX state is compatible with the current PPC32 | 210 | * This definition of the VMX state is compatible with the current PPC32 |
176 | * ptrace interface. This allows signal handling and ptrace to use the same | 211 | * ptrace interface. This allows signal handling and ptrace to use the same |
177 | * structures. This also simplifies the implementation of a bi-arch | 212 | * structures. This also simplifies the implementation of a bi-arch |
178 | * (combined (32- and 64-bit) gdb. | 213 | * (combined (32- and 64-bit) gdb. |
179 | */ | 214 | */ |
180 | #define PTRACE_GETVRREGS 18 | 215 | #define PTRACE_GETVRREGS 18 |
181 | #define PTRACE_SETVRREGS 19 | 216 | #define PTRACE_SETVRREGS 19 |
182 | 217 | ||
183 | /* | 218 | #ifndef __powerpc64__ |
184 | * While we dont have 64bit book E processors, we need to reserve the | 219 | /* Get/set all the upper 32-bits of the SPE registers, accumulator, and |
185 | * relevant ptrace calls for 32bit compatibility. | 220 | * spefscr, in one go */ |
186 | */ | 221 | #define PTRACE_GETEVRREGS 20 |
187 | #if 0 | 222 | #define PTRACE_SETEVRREGS 21 |
188 | #define PTRACE_GETEVRREGS 20 | 223 | #endif /* __powerpc64__ */ |
189 | #define PTRACE_SETEVRREGS 21 | ||
190 | #endif | ||
191 | 224 | ||
192 | /* | 225 | /* |
193 | * Get or set a debug register. The first 16 are DABR registers and the | 226 | * Get or set a debug register. The first 16 are DABR registers and the |
@@ -196,6 +229,7 @@ extern unsigned long profile_pc(struct pt_regs *regs); | |||
196 | #define PTRACE_GET_DEBUGREG 25 | 229 | #define PTRACE_GET_DEBUGREG 25 |
197 | #define PTRACE_SET_DEBUGREG 26 | 230 | #define PTRACE_SET_DEBUGREG 26 |
198 | 231 | ||
232 | #ifdef __powerpc64__ | ||
199 | /* Additional PTRACE requests implemented on PowerPC. */ | 233 | /* Additional PTRACE requests implemented on PowerPC. */ |
200 | #define PPC_PTRACE_GETREGS 0x99 /* Get GPRs 0 - 31 */ | 234 | #define PPC_PTRACE_GETREGS 0x99 /* Get GPRs 0 - 31 */ |
201 | #define PPC_PTRACE_SETREGS 0x98 /* Set GPRs 0 - 31 */ | 235 | #define PPC_PTRACE_SETREGS 0x98 /* Set GPRs 0 - 31 */ |
@@ -209,5 +243,6 @@ extern unsigned long profile_pc(struct pt_regs *regs); | |||
209 | #define PPC_PTRACE_POKEDATA_3264 0x92 | 243 | #define PPC_PTRACE_POKEDATA_3264 0x92 |
210 | #define PPC_PTRACE_PEEKUSR_3264 0x91 | 244 | #define PPC_PTRACE_PEEKUSR_3264 0x91 |
211 | #define PPC_PTRACE_POKEUSR_3264 0x90 | 245 | #define PPC_PTRACE_POKEUSR_3264 0x90 |
246 | #endif /* __powerpc64__ */ | ||
212 | 247 | ||
213 | #endif /* _PPC64_PTRACE_H */ | 248 | #endif /* _ASM_POWERPC_PTRACE_H */ |
diff --git a/include/asm-powerpc/rtas.h b/include/asm-powerpc/rtas.h index d9fd7866927f..d1bb611ea626 100644 --- a/include/asm-powerpc/rtas.h +++ b/include/asm-powerpc/rtas.h | |||
@@ -149,31 +149,11 @@ struct rtas_error_log { | |||
149 | unsigned char buffer[1]; | 149 | unsigned char buffer[1]; |
150 | }; | 150 | }; |
151 | 151 | ||
152 | struct flash_block { | 152 | /* |
153 | char *data; | 153 | * This can be set by the rtas_flash module so that it can get called |
154 | unsigned long length; | 154 | * as the absolutely last thing before the kernel terminates. |
155 | }; | ||
156 | |||
157 | /* This struct is very similar but not identical to | ||
158 | * that needed by the rtas flash update. | ||
159 | * All we need to do for rtas is rewrite num_blocks | ||
160 | * into a version/length and translate the pointers | ||
161 | * to absolute. | ||
162 | */ | 155 | */ |
163 | #define FLASH_BLOCKS_PER_NODE ((PAGE_SIZE - 16) / sizeof(struct flash_block)) | 156 | extern void (*rtas_flash_term_hook)(int); |
164 | struct flash_block_list { | ||
165 | unsigned long num_blocks; | ||
166 | struct flash_block_list *next; | ||
167 | struct flash_block blocks[FLASH_BLOCKS_PER_NODE]; | ||
168 | }; | ||
169 | struct flash_block_list_header { /* just the header of flash_block_list */ | ||
170 | unsigned long num_blocks; | ||
171 | struct flash_block_list *next; | ||
172 | }; | ||
173 | extern struct flash_block_list_header rtas_firmware_flash_list; | ||
174 | void rtas_fw_restart(char *cmd); | ||
175 | void rtas_fw_power_off(void); | ||
176 | void rtas_fw_halt(void); | ||
177 | 157 | ||
178 | extern struct rtas_t rtas; | 158 | extern struct rtas_t rtas; |
179 | 159 | ||
diff --git a/include/asm-ppc64/sigcontext.h b/include/asm-powerpc/sigcontext.h index 6f8aee768c5e..165d630e1cf3 100644 --- a/include/asm-ppc64/sigcontext.h +++ b/include/asm-powerpc/sigcontext.h | |||
@@ -1,5 +1,5 @@ | |||
1 | #ifndef _ASM_PPC64_SIGCONTEXT_H | 1 | #ifndef _ASM_POWERPC_SIGCONTEXT_H |
2 | #define _ASM_PPC64_SIGCONTEXT_H | 2 | #define _ASM_POWERPC_SIGCONTEXT_H |
3 | 3 | ||
4 | /* | 4 | /* |
5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
@@ -9,39 +9,44 @@ | |||
9 | */ | 9 | */ |
10 | #include <linux/compiler.h> | 10 | #include <linux/compiler.h> |
11 | #include <asm/ptrace.h> | 11 | #include <asm/ptrace.h> |
12 | #ifdef __powerpc64__ | ||
12 | #include <asm/elf.h> | 13 | #include <asm/elf.h> |
13 | 14 | #endif | |
14 | 15 | ||
15 | struct sigcontext { | 16 | struct sigcontext { |
16 | unsigned long _unused[4]; | 17 | unsigned long _unused[4]; |
17 | int signal; | 18 | int signal; |
19 | #ifdef __powerpc64__ | ||
18 | int _pad0; | 20 | int _pad0; |
21 | #endif | ||
19 | unsigned long handler; | 22 | unsigned long handler; |
20 | unsigned long oldmask; | 23 | unsigned long oldmask; |
21 | struct pt_regs __user *regs; | 24 | struct pt_regs __user *regs; |
25 | #ifdef __powerpc64__ | ||
22 | elf_gregset_t gp_regs; | 26 | elf_gregset_t gp_regs; |
23 | elf_fpregset_t fp_regs; | 27 | elf_fpregset_t fp_regs; |
24 | /* | 28 | /* |
25 | * To maintain compatibility with current implementations the sigcontext is | 29 | * To maintain compatibility with current implementations the sigcontext is |
26 | * extended by appending a pointer (v_regs) to a quadword type (elf_vrreg_t) | 30 | * extended by appending a pointer (v_regs) to a quadword type (elf_vrreg_t) |
27 | * followed by an unstructured (vmx_reserve) field of 69 doublewords. This | 31 | * followed by an unstructured (vmx_reserve) field of 69 doublewords. This |
28 | * allows the array of vector registers to be quadword aligned independent of | 32 | * allows the array of vector registers to be quadword aligned independent of |
29 | * the alignment of the containing sigcontext or ucontext. It is the | 33 | * the alignment of the containing sigcontext or ucontext. It is the |
30 | * responsibility of the code setting the sigcontext to set this pointer to | 34 | * responsibility of the code setting the sigcontext to set this pointer to |
31 | * either NULL (if this processor does not support the VMX feature) or the | 35 | * either NULL (if this processor does not support the VMX feature) or the |
32 | * address of the first quadword within the allocated (vmx_reserve) area. | 36 | * address of the first quadword within the allocated (vmx_reserve) area. |
33 | * | 37 | * |
34 | * The pointer (v_regs) of vector type (elf_vrreg_t) is type compatible with | 38 | * The pointer (v_regs) of vector type (elf_vrreg_t) is type compatible with |
35 | * an array of 34 quadword entries (elf_vrregset_t). The entries with | 39 | * an array of 34 quadword entries (elf_vrregset_t). The entries with |
36 | * indexes 0-31 contain the corresponding vector registers. The entry with | 40 | * indexes 0-31 contain the corresponding vector registers. The entry with |
37 | * index 32 contains the vscr as the last word (offset 12) within the | 41 | * index 32 contains the vscr as the last word (offset 12) within the |
38 | * quadword. This allows the vscr to be stored as either a quadword (since | 42 | * quadword. This allows the vscr to be stored as either a quadword (since |
39 | * it must be copied via a vector register to/from storage) or as a word. | 43 | * it must be copied via a vector register to/from storage) or as a word. |
40 | * The entry with index 33 contains the vrsave as the first word (offset 0) | 44 | * The entry with index 33 contains the vrsave as the first word (offset 0) |
41 | * within the quadword. | 45 | * within the quadword. |
42 | */ | 46 | */ |
43 | elf_vrreg_t __user *v_regs; | 47 | elf_vrreg_t __user *v_regs; |
44 | long vmx_reserve[ELF_NVRREG+ELF_NVRREG+1]; | 48 | long vmx_reserve[ELF_NVRREG+ELF_NVRREG+1]; |
49 | #endif | ||
45 | }; | 50 | }; |
46 | 51 | ||
47 | #endif /* _ASM_PPC64_SIGCONTEXT_H */ | 52 | #endif /* _ASM_POWERPC_SIGCONTEXT_H */ |
diff --git a/include/asm-powerpc/stat.h b/include/asm-powerpc/stat.h new file mode 100644 index 000000000000..e4edc510b530 --- /dev/null +++ b/include/asm-powerpc/stat.h | |||
@@ -0,0 +1,81 @@ | |||
1 | #ifndef _ASM_POWERPC_STAT_H | ||
2 | #define _ASM_POWERPC_STAT_H | ||
3 | /* | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version | ||
7 | * 2 of the License, or (at your option) any later version. | ||
8 | */ | ||
9 | #include <linux/types.h> | ||
10 | |||
11 | #define STAT_HAVE_NSEC 1 | ||
12 | |||
13 | #ifndef __powerpc64__ | ||
14 | struct __old_kernel_stat { | ||
15 | unsigned short st_dev; | ||
16 | unsigned short st_ino; | ||
17 | unsigned short st_mode; | ||
18 | unsigned short st_nlink; | ||
19 | unsigned short st_uid; | ||
20 | unsigned short st_gid; | ||
21 | unsigned short st_rdev; | ||
22 | unsigned long st_size; | ||
23 | unsigned long st_atime; | ||
24 | unsigned long st_mtime; | ||
25 | unsigned long st_ctime; | ||
26 | }; | ||
27 | #endif /* !__powerpc64__ */ | ||
28 | |||
29 | struct stat { | ||
30 | unsigned long st_dev; | ||
31 | ino_t st_ino; | ||
32 | #ifdef __powerpc64__ | ||
33 | nlink_t st_nlink; | ||
34 | mode_t st_mode; | ||
35 | #else | ||
36 | mode_t st_mode; | ||
37 | nlink_t st_nlink; | ||
38 | #endif | ||
39 | uid_t st_uid; | ||
40 | gid_t st_gid; | ||
41 | unsigned long st_rdev; | ||
42 | off_t st_size; | ||
43 | unsigned long st_blksize; | ||
44 | unsigned long st_blocks; | ||
45 | unsigned long st_atime; | ||
46 | unsigned long st_atime_nsec; | ||
47 | unsigned long st_mtime; | ||
48 | unsigned long st_mtime_nsec; | ||
49 | unsigned long st_ctime; | ||
50 | unsigned long st_ctime_nsec; | ||
51 | unsigned long __unused4; | ||
52 | unsigned long __unused5; | ||
53 | #ifdef __powerpc64__ | ||
54 | unsigned long __unused6; | ||
55 | #endif | ||
56 | }; | ||
57 | |||
58 | /* This matches struct stat64 in glibc2.1. Only used for 32 bit. */ | ||
59 | struct stat64 { | ||
60 | unsigned long long st_dev; /* Device. */ | ||
61 | unsigned long long st_ino; /* File serial number. */ | ||
62 | unsigned int st_mode; /* File mode. */ | ||
63 | unsigned int st_nlink; /* Link count. */ | ||
64 | unsigned int st_uid; /* User ID of the file's owner. */ | ||
65 | unsigned int st_gid; /* Group ID of the file's group. */ | ||
66 | unsigned long long st_rdev; /* Device number, if device. */ | ||
67 | unsigned short __pad2; | ||
68 | long long st_size; /* Size of file, in bytes. */ | ||
69 | int st_blksize; /* Optimal block size for I/O. */ | ||
70 | long long st_blocks; /* Number 512-byte blocks allocated. */ | ||
71 | int st_atime; /* Time of last access. */ | ||
72 | unsigned int st_atime_nsec; | ||
73 | int st_mtime; /* Time of last modification. */ | ||
74 | unsigned int st_mtime_nsec; | ||
75 | int st_ctime; /* Time of last status change. */ | ||
76 | unsigned int st_ctime_nsec; | ||
77 | unsigned int __unused4; | ||
78 | unsigned int __unused5; | ||
79 | }; | ||
80 | |||
81 | #endif /* _ASM_POWERPC_STAT_H */ | ||
diff --git a/include/asm-powerpc/ucontext.h b/include/asm-powerpc/ucontext.h new file mode 100644 index 000000000000..d9a4ddf0cc86 --- /dev/null +++ b/include/asm-powerpc/ucontext.h | |||
@@ -0,0 +1,40 @@ | |||
1 | #ifndef _ASM_POWERPC_UCONTEXT_H | ||
2 | #define _ASM_POWERPC_UCONTEXT_H | ||
3 | |||
4 | #ifdef __powerpc64__ | ||
5 | #include <asm/sigcontext.h> | ||
6 | #else | ||
7 | #include <asm/elf.h> | ||
8 | #endif | ||
9 | #include <asm/signal.h> | ||
10 | |||
11 | #ifndef __powerpc64__ | ||
12 | struct mcontext { | ||
13 | elf_gregset_t mc_gregs; | ||
14 | elf_fpregset_t mc_fregs; | ||
15 | unsigned long mc_pad[2]; | ||
16 | elf_vrregset_t mc_vregs __attribute__((__aligned__(16))); | ||
17 | }; | ||
18 | #endif | ||
19 | |||
20 | struct ucontext { | ||
21 | unsigned long uc_flags; | ||
22 | struct ucontext __user *uc_link; | ||
23 | stack_t uc_stack; | ||
24 | #ifndef __powerpc64__ | ||
25 | int uc_pad[7]; | ||
26 | struct mcontext __user *uc_regs;/* points to uc_mcontext field */ | ||
27 | #endif | ||
28 | sigset_t uc_sigmask; | ||
29 | /* glibc has 1024-bit signal masks, ours are 64-bit */ | ||
30 | #ifdef __powerpc64__ | ||
31 | sigset_t __unused[15]; /* Allow for uc_sigmask growth */ | ||
32 | struct sigcontext uc_mcontext; /* last for extensibility */ | ||
33 | #else | ||
34 | int uc_maskext[30]; | ||
35 | int uc_pad2[3]; | ||
36 | struct mcontext uc_mcontext; | ||
37 | #endif | ||
38 | }; | ||
39 | |||
40 | #endif /* _ASM_POWERPC_UCONTEXT_H */ | ||
diff --git a/include/asm-ppc/commproc.h b/include/asm-ppc/commproc.h index 5bbb8e2c1c6d..973e60908234 100644 --- a/include/asm-ppc/commproc.h +++ b/include/asm-ppc/commproc.h | |||
@@ -83,6 +83,8 @@ extern uint m8xx_cpm_hostalloc(uint size); | |||
83 | extern int m8xx_cpm_hostfree(uint start); | 83 | extern int m8xx_cpm_hostfree(uint start); |
84 | extern void m8xx_cpm_hostdump(void); | 84 | extern void m8xx_cpm_hostdump(void); |
85 | 85 | ||
86 | extern void cpm_load_patch(volatile immap_t *immr); | ||
87 | |||
86 | /* Buffer descriptors used by many of the CPM protocols. | 88 | /* Buffer descriptors used by many of the CPM protocols. |
87 | */ | 89 | */ |
88 | typedef struct cpm_buf_desc { | 90 | typedef struct cpm_buf_desc { |
diff --git a/include/asm-ppc/ptrace.h b/include/asm-ppc/ptrace.h deleted file mode 100644 index c34fb4e37a97..000000000000 --- a/include/asm-ppc/ptrace.h +++ /dev/null | |||
@@ -1,152 +0,0 @@ | |||
1 | #ifndef _PPC_PTRACE_H | ||
2 | #define _PPC_PTRACE_H | ||
3 | |||
4 | /* | ||
5 | * This struct defines the way the registers are stored on the | ||
6 | * kernel stack during a system call or other kernel entry. | ||
7 | * | ||
8 | * this should only contain volatile regs | ||
9 | * since we can keep non-volatile in the thread_struct | ||
10 | * should set this up when only volatiles are saved | ||
11 | * by intr code. | ||
12 | * | ||
13 | * Since this is going on the stack, *CARE MUST BE TAKEN* to insure | ||
14 | * that the overall structure is a multiple of 16 bytes in length. | ||
15 | * | ||
16 | * Note that the offsets of the fields in this struct correspond with | ||
17 | * the PT_* values below. This simplifies arch/ppc/kernel/ptrace.c. | ||
18 | */ | ||
19 | |||
20 | #ifndef __ASSEMBLY__ | ||
21 | struct pt_regs { | ||
22 | unsigned long gpr[32]; | ||
23 | unsigned long nip; | ||
24 | unsigned long msr; | ||
25 | unsigned long orig_gpr3; /* Used for restarting system calls */ | ||
26 | unsigned long ctr; | ||
27 | unsigned long link; | ||
28 | unsigned long xer; | ||
29 | unsigned long ccr; | ||
30 | unsigned long mq; /* 601 only (not used at present) */ | ||
31 | /* Used on APUS to hold IPL value. */ | ||
32 | unsigned long trap; /* Reason for being here */ | ||
33 | /* N.B. for critical exceptions on 4xx, the dar and dsisr | ||
34 | fields are overloaded to hold srr0 and srr1. */ | ||
35 | unsigned long dar; /* Fault registers */ | ||
36 | unsigned long dsisr; /* on 4xx/Book-E used for ESR */ | ||
37 | unsigned long result; /* Result of a system call */ | ||
38 | }; | ||
39 | |||
40 | #endif /* __ASSEMBLY__ */ | ||
41 | |||
42 | #ifdef __KERNEL__ | ||
43 | #define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */ | ||
44 | |||
45 | /* Size of stack frame allocated when calling signal handler. */ | ||
46 | #define __SIGNAL_FRAMESIZE 64 | ||
47 | |||
48 | #ifndef __ASSEMBLY__ | ||
49 | #define instruction_pointer(regs) ((regs)->nip) | ||
50 | #ifdef CONFIG_SMP | ||
51 | extern unsigned long profile_pc(struct pt_regs *regs); | ||
52 | #else | ||
53 | #define profile_pc(regs) instruction_pointer(regs) | ||
54 | #endif | ||
55 | |||
56 | #define user_mode(regs) (((regs)->msr & MSR_PR) != 0) | ||
57 | |||
58 | #define force_successful_syscall_return() \ | ||
59 | do { \ | ||
60 | current_thread_info()->syscall_noerror = 1; \ | ||
61 | } while(0) | ||
62 | |||
63 | /* | ||
64 | * We use the least-significant bit of the trap field to indicate | ||
65 | * whether we have saved the full set of registers, or only a | ||
66 | * partial set. A 1 there means the partial set. | ||
67 | * On 4xx we use the next bit to indicate whether the exception | ||
68 | * is a critical exception (1 means it is). | ||
69 | */ | ||
70 | #define FULL_REGS(regs) (((regs)->trap & 1) == 0) | ||
71 | #define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) == 0) | ||
72 | #define TRAP(regs) ((regs)->trap & ~0xF) | ||
73 | |||
74 | #define CHECK_FULL_REGS(regs) \ | ||
75 | do { \ | ||
76 | if ((regs)->trap & 1) \ | ||
77 | printk(KERN_CRIT "%s: partial register set\n", __FUNCTION__); \ | ||
78 | } while (0) | ||
79 | #endif /* __ASSEMBLY__ */ | ||
80 | |||
81 | #endif /* __KERNEL__ */ | ||
82 | |||
83 | /* | ||
84 | * Offsets used by 'ptrace' system call interface. | ||
85 | * These can't be changed without breaking binary compatibility | ||
86 | * with MkLinux, etc. | ||
87 | */ | ||
88 | #define PT_R0 0 | ||
89 | #define PT_R1 1 | ||
90 | #define PT_R2 2 | ||
91 | #define PT_R3 3 | ||
92 | #define PT_R4 4 | ||
93 | #define PT_R5 5 | ||
94 | #define PT_R6 6 | ||
95 | #define PT_R7 7 | ||
96 | #define PT_R8 8 | ||
97 | #define PT_R9 9 | ||
98 | #define PT_R10 10 | ||
99 | #define PT_R11 11 | ||
100 | #define PT_R12 12 | ||
101 | #define PT_R13 13 | ||
102 | #define PT_R14 14 | ||
103 | #define PT_R15 15 | ||
104 | #define PT_R16 16 | ||
105 | #define PT_R17 17 | ||
106 | #define PT_R18 18 | ||
107 | #define PT_R19 19 | ||
108 | #define PT_R20 20 | ||
109 | #define PT_R21 21 | ||
110 | #define PT_R22 22 | ||
111 | #define PT_R23 23 | ||
112 | #define PT_R24 24 | ||
113 | #define PT_R25 25 | ||
114 | #define PT_R26 26 | ||
115 | #define PT_R27 27 | ||
116 | #define PT_R28 28 | ||
117 | #define PT_R29 29 | ||
118 | #define PT_R30 30 | ||
119 | #define PT_R31 31 | ||
120 | |||
121 | #define PT_NIP 32 | ||
122 | #define PT_MSR 33 | ||
123 | #ifdef __KERNEL__ | ||
124 | #define PT_ORIG_R3 34 | ||
125 | #endif | ||
126 | #define PT_CTR 35 | ||
127 | #define PT_LNK 36 | ||
128 | #define PT_XER 37 | ||
129 | #define PT_CCR 38 | ||
130 | #define PT_MQ 39 | ||
131 | |||
132 | #define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */ | ||
133 | #define PT_FPR31 (PT_FPR0 + 2*31) | ||
134 | #define PT_FPSCR (PT_FPR0 + 2*32 + 1) | ||
135 | |||
136 | /* Get/set all the altivec registers vr0..vr31, vscr, vrsave, in one go */ | ||
137 | #define PTRACE_GETVRREGS 18 | ||
138 | #define PTRACE_SETVRREGS 19 | ||
139 | |||
140 | /* Get/set all the upper 32-bits of the SPE registers, accumulator, and | ||
141 | * spefscr, in one go */ | ||
142 | #define PTRACE_GETEVRREGS 20 | ||
143 | #define PTRACE_SETEVRREGS 21 | ||
144 | |||
145 | /* | ||
146 | * Get or set a debug register. The first 16 are DABR registers and the | ||
147 | * second 16 are IABR registers. | ||
148 | */ | ||
149 | #define PTRACE_GET_DEBUGREG 25 | ||
150 | #define PTRACE_SET_DEBUGREG 26 | ||
151 | |||
152 | #endif | ||
diff --git a/include/asm-ppc/sigcontext.h b/include/asm-ppc/sigcontext.h deleted file mode 100644 index b7a417e0a921..000000000000 --- a/include/asm-ppc/sigcontext.h +++ /dev/null | |||
@@ -1,15 +0,0 @@ | |||
1 | #ifndef _ASM_PPC_SIGCONTEXT_H | ||
2 | #define _ASM_PPC_SIGCONTEXT_H | ||
3 | |||
4 | #include <asm/ptrace.h> | ||
5 | #include <linux/compiler.h> | ||
6 | |||
7 | struct sigcontext { | ||
8 | unsigned long _unused[4]; | ||
9 | int signal; | ||
10 | unsigned long handler; | ||
11 | unsigned long oldmask; | ||
12 | struct pt_regs __user *regs; | ||
13 | }; | ||
14 | |||
15 | #endif | ||
diff --git a/include/asm-ppc/stat.h b/include/asm-ppc/stat.h deleted file mode 100644 index cadb34298496..000000000000 --- a/include/asm-ppc/stat.h +++ /dev/null | |||
@@ -1,69 +0,0 @@ | |||
1 | #ifndef _PPC_STAT_H | ||
2 | #define _PPC_STAT_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | #include <linux/types.h> | ||
6 | #endif /* __KERNEL__ */ | ||
7 | |||
8 | struct __old_kernel_stat { | ||
9 | unsigned short st_dev; | ||
10 | unsigned short st_ino; | ||
11 | unsigned short st_mode; | ||
12 | unsigned short st_nlink; | ||
13 | unsigned short st_uid; | ||
14 | unsigned short st_gid; | ||
15 | unsigned short st_rdev; | ||
16 | unsigned long st_size; | ||
17 | unsigned long st_atime; | ||
18 | unsigned long st_mtime; | ||
19 | unsigned long st_ctime; | ||
20 | }; | ||
21 | |||
22 | #define STAT_HAVE_NSEC 1 | ||
23 | |||
24 | struct stat { | ||
25 | unsigned st_dev; | ||
26 | ino_t st_ino; | ||
27 | mode_t st_mode; | ||
28 | nlink_t st_nlink; | ||
29 | uid_t st_uid; | ||
30 | gid_t st_gid; | ||
31 | unsigned st_rdev; | ||
32 | off_t st_size; | ||
33 | unsigned long st_blksize; | ||
34 | unsigned long st_blocks; | ||
35 | unsigned long st_atime; | ||
36 | unsigned long st_atime_nsec; | ||
37 | unsigned long st_mtime; | ||
38 | unsigned long st_mtime_nsec; | ||
39 | unsigned long st_ctime; | ||
40 | unsigned long st_ctime_nsec; | ||
41 | unsigned long __unused4; | ||
42 | unsigned long __unused5; | ||
43 | }; | ||
44 | |||
45 | /* This matches struct stat64 in glibc2.1. | ||
46 | */ | ||
47 | struct stat64 { | ||
48 | unsigned long long st_dev; /* Device. */ | ||
49 | unsigned long long st_ino; /* File serial number. */ | ||
50 | unsigned int st_mode; /* File mode. */ | ||
51 | unsigned int st_nlink; /* Link count. */ | ||
52 | unsigned int st_uid; /* User ID of the file's owner. */ | ||
53 | unsigned int st_gid; /* Group ID of the file's group. */ | ||
54 | unsigned long long st_rdev; /* Device number, if device. */ | ||
55 | unsigned short int __pad2; | ||
56 | long long st_size; /* Size of file, in bytes. */ | ||
57 | long st_blksize; /* Optimal block size for I/O. */ | ||
58 | |||
59 | long long st_blocks; /* Number 512-byte blocks allocated. */ | ||
60 | long st_atime; /* Time of last access. */ | ||
61 | unsigned long st_atime_nsec; | ||
62 | long st_mtime; /* Time of last modification. */ | ||
63 | unsigned long int st_mtime_nsec; | ||
64 | long st_ctime; /* Time of last status change. */ | ||
65 | unsigned long int st_ctime_nsec; | ||
66 | unsigned long int __unused4; | ||
67 | unsigned long int __unused5; | ||
68 | }; | ||
69 | #endif | ||
diff --git a/include/asm-ppc/ucontext.h b/include/asm-ppc/ucontext.h deleted file mode 100644 index 664bc984d51f..000000000000 --- a/include/asm-ppc/ucontext.h +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | #ifndef _ASMPPC_UCONTEXT_H | ||
2 | #define _ASMPPC_UCONTEXT_H | ||
3 | |||
4 | #include <asm/elf.h> | ||
5 | #include <asm/signal.h> | ||
6 | |||
7 | struct mcontext { | ||
8 | elf_gregset_t mc_gregs; | ||
9 | elf_fpregset_t mc_fregs; | ||
10 | unsigned long mc_pad[2]; | ||
11 | elf_vrregset_t mc_vregs __attribute__((__aligned__(16))); | ||
12 | }; | ||
13 | |||
14 | struct ucontext { | ||
15 | unsigned long uc_flags; | ||
16 | struct ucontext __user *uc_link; | ||
17 | stack_t uc_stack; | ||
18 | int uc_pad[7]; | ||
19 | struct mcontext __user *uc_regs;/* points to uc_mcontext field */ | ||
20 | sigset_t uc_sigmask; | ||
21 | /* glibc has 1024-bit signal masks, ours are 64-bit */ | ||
22 | int uc_maskext[30]; | ||
23 | int uc_pad2[3]; | ||
24 | struct mcontext uc_mcontext; | ||
25 | }; | ||
26 | |||
27 | #endif /* !_ASMPPC_UCONTEXT_H */ | ||
diff --git a/include/asm-ppc64/stat.h b/include/asm-ppc64/stat.h deleted file mode 100644 index 973a5f97951d..000000000000 --- a/include/asm-ppc64/stat.h +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | #ifndef _PPC64_STAT_H | ||
2 | #define _PPC64_STAT_H | ||
3 | |||
4 | /* | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License | ||
7 | * as published by the Free Software Foundation; either version | ||
8 | * 2 of the License, or (at your option) any later version. | ||
9 | */ | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | |||
13 | struct stat { | ||
14 | unsigned long st_dev; | ||
15 | ino_t st_ino; | ||
16 | nlink_t st_nlink; | ||
17 | mode_t st_mode; | ||
18 | uid_t st_uid; | ||
19 | gid_t st_gid; | ||
20 | unsigned long st_rdev; | ||
21 | off_t st_size; | ||
22 | unsigned long st_blksize; | ||
23 | unsigned long st_blocks; | ||
24 | unsigned long st_atime; | ||
25 | unsigned long st_atime_nsec; | ||
26 | unsigned long st_mtime; | ||
27 | unsigned long st_mtime_nsec; | ||
28 | unsigned long st_ctime; | ||
29 | unsigned long st_ctime_nsec; | ||
30 | unsigned long __unused4; | ||
31 | unsigned long __unused5; | ||
32 | unsigned long __unused6; | ||
33 | }; | ||
34 | |||
35 | #define STAT_HAVE_NSEC 1 | ||
36 | |||
37 | /* This matches struct stat64 in glibc2.1. Only used for 32 bit. */ | ||
38 | struct stat64 { | ||
39 | unsigned long st_dev; /* Device. */ | ||
40 | unsigned long st_ino; /* File serial number. */ | ||
41 | unsigned int st_mode; /* File mode. */ | ||
42 | unsigned int st_nlink; /* Link count. */ | ||
43 | unsigned int st_uid; /* User ID of the file's owner. */ | ||
44 | unsigned int st_gid; /* Group ID of the file's group. */ | ||
45 | unsigned long st_rdev; /* Device number, if device. */ | ||
46 | unsigned short __pad2; | ||
47 | long st_size; /* Size of file, in bytes. */ | ||
48 | int st_blksize; /* Optimal block size for I/O. */ | ||
49 | |||
50 | long st_blocks; /* Number 512-byte blocks allocated. */ | ||
51 | int st_atime; /* Time of last access. */ | ||
52 | int st_atime_nsec; | ||
53 | int st_mtime; /* Time of last modification. */ | ||
54 | int st_mtime_nsec; | ||
55 | int st_ctime; /* Time of last status change. */ | ||
56 | int st_ctime_nsec; | ||
57 | unsigned int __unused4; | ||
58 | unsigned int __unused5; | ||
59 | }; | ||
60 | #endif | ||
diff --git a/include/asm-ppc64/ucontext.h b/include/asm-ppc64/ucontext.h deleted file mode 100644 index ef8cc5b37542..000000000000 --- a/include/asm-ppc64/ucontext.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | #ifndef _ASMPPC64_UCONTEXT_H | ||
2 | #define _ASMPPC64_UCONTEXT_H | ||
3 | |||
4 | #include <asm/sigcontext.h> | ||
5 | |||
6 | /* | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | struct ucontext { | ||
14 | unsigned long uc_flags; | ||
15 | struct ucontext *uc_link; | ||
16 | stack_t uc_stack; | ||
17 | sigset_t uc_sigmask; | ||
18 | sigset_t __unsued[15]; /* Allow for uc_sigmask growth */ | ||
19 | struct sigcontext uc_mcontext; /* last for extensibility */ | ||
20 | }; | ||
21 | |||
22 | #endif /* _ASMPPC64_UCONTEXT_H */ | ||