diff options
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 */ | ||
