Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[POWERPC] PS3: Bootwrapper improvements

Improve the debugging support of the PS3 bootwraper code:

o Increase the size of the PS3 bootwrapper overlay from 256 to 512 bytes to
allow for more debugging code in the overlay.
o Use the dot symbol to set the size of __system_reset_overlay. The
assembler will then emit an error if the overlay code is too big.
o Remove some unused instructions.
o Update the text describing the PS3 bootwrapper overlay.
o Add a check for null pointer writes.
o Change hcall return value from s64.

Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by

Geoff Levand and committed by
Paul Mackerras
5761eaa3 23afcb4e

+42 -27
+16 -9
arch/powerpc/boot/ps3-head.S
··· 27 27 /* 28 28 * __system_reset_overlay - The PS3 first stage entry. 29 29 * 30 - * The bootwraper build script copies the 0x100 bytes at symbol 31 - * __system_reset_overlay to offset 0x100 of the rom image. 30 + * The bootwraper build script copies the 512 bytes at symbol 31 + * __system_reset_overlay to offset 0x100 of the rom image. This symbol 32 + * must occupy 512 or less bytes. 32 33 * 33 34 * The PS3 has a single processor with two threads. 34 35 */ ··· 48 47 49 48 mfspr r3, 0x88 50 49 cntlzw. r3, r3 51 - li r4, 0 52 - li r5, 0 53 50 beq 1f 54 51 55 52 /* Secondary goes to __secondary_hold in kernel. */ ··· 56 57 mtctr r4 57 58 bctr 58 59 59 - /* Primary delays then goes to _zimage_start in wrapper. */ 60 60 1: 61 + /* Save the value at addr zero for a null pointer write check later. */ 62 + 63 + li r4, 0 64 + lwz r3, 0(r4) 65 + 66 + /* Primary delays then goes to _zimage_start in wrapper. */ 67 + 61 68 or 31, 31, 31 /* db16cyc */ 62 69 or 31, 31, 31 /* db16cyc */ 63 70 ··· 72 67 mtctr r4 73 68 bctr 74 69 70 + . = __system_reset_overlay + 512 71 + 75 72 /* 76 73 * __system_reset_kernel - Place holder for the kernel reset vector. 77 74 * 78 - * The bootwrapper build script copies 0x100 bytes from offset 0x100 75 + * The bootwrapper build script copies 512 bytes from offset 0x100 79 76 * of the rom image to the symbol __system_reset_kernel. At runtime 80 - * the bootwrapper program copies the 0x100 bytes at __system_reset_kernel 81 - * to ram address 0x100. This symbol must occupy 0x100 bytes. 77 + * the bootwrapper program copies the 512 bytes at __system_reset_kernel 78 + * to ram address 0x100. This symbol must occupy 512 bytes. 82 79 */ 83 80 84 81 .globl __system_reset_kernel 85 82 __system_reset_kernel: 86 83 87 - . = __system_reset_kernel + 0x100 84 + . = __system_reset_kernel + 512
+15 -8
arch/powerpc/boot/ps3.c
··· 27 27 #include "page.h" 28 28 #include "ops.h" 29 29 30 - extern s64 lv1_panic(u64 in_1); 31 - extern s64 lv1_get_logical_partition_id(u64 *out_1); 32 - extern s64 lv1_get_logical_ppe_id(u64 *out_1); 33 - extern s64 lv1_get_repository_node_value(u64 in_1, u64 in_2, u64 in_3, 30 + extern int lv1_panic(u64 in_1); 31 + extern int lv1_get_logical_partition_id(u64 *out_1); 32 + extern int lv1_get_logical_ppe_id(u64 *out_1); 33 + extern int lv1_get_repository_node_value(u64 in_1, u64 in_2, u64 in_3, 34 34 u64 in_4, u64 in_5, u64 *out_1, u64 *out_2); 35 35 36 36 #ifdef DEBUG ··· 46 46 * edit the command line passed to vmlinux (by setting /chosen/bootargs). 47 47 * The buffer is put in it's own section so that tools may locate it easier. 48 48 */ 49 + 49 50 static char cmdline[COMMAND_LINE_SIZE] 50 51 __attribute__((__section__("__builtin_cmdline"))); 51 52 ··· 76 75 77 76 static int ps3_repository_read_rm_size(u64 *rm_size) 78 77 { 79 - s64 result; 78 + int result; 80 79 u64 lpar_id; 81 80 u64 ppe_id; 82 81 u64 v2; ··· 115 114 { 116 115 extern char __system_reset_kernel[]; 117 116 118 - memcpy((void *)0x100, __system_reset_kernel, 0x100); 119 - flush_cache((void *)0x100, 0x100); 117 + memcpy((void *)0x100, __system_reset_kernel, 512); 118 + flush_cache((void *)0x100, 512); 120 119 } 121 120 122 - void platform_init(void) 121 + void platform_init(unsigned long null_check) 123 122 { 124 123 const u32 heapsize = 0x1000000 - (u32)_end; /* 16MiB */ 125 124 void *chosen; 126 125 unsigned long ft_addr; 127 126 u64 rm_size; 127 + unsigned long val; 128 128 129 129 console_ops.write = ps3_console_write; 130 130 platform_ops.exit = ps3_exit; ··· 152 150 ps3_copy_vectors(); 153 151 154 152 printf(" flat tree at 0x%lx\n\r", ft_addr); 153 + 154 + val = *(unsigned long *)0; 155 + 156 + if (val != null_check) 157 + printf("null check failed: %lx != %lx\n\r", val, null_check); 155 158 156 159 ((kernel_entry_t)0)(ft_addr, 0, NULL); 157 160
+11 -10
arch/powerpc/boot/wrapper
··· 298 298 exit 0 299 299 ;; 300 300 ps3) 301 - # The ps3's loader supports loading gzipped binary images from flash 302 - # rom to addr zero. The loader enters the image at addr 0x100. A 303 - # bootwrapper overlay is use to arrange for the kernel to be loaded 304 - # to addr zero and to have a suitable bootwrapper entry at 0x100. 305 - # To construct the rom image, 0x100 bytes from offset 0x100 in the 306 - # kernel is copied to the bootwrapper symbol __system_reset_kernel. 307 - # The 0x100 bytes at the bootwrapper symbol __system_reset_overlay is 308 - # then copied to offset 0x100. At runtime the bootwrapper program 309 - # copies the 0x100 bytes at __system_reset_kernel to addr 0x100. 301 + # The ps3's loader supports loading a gzipped binary image from flash 302 + # rom to ram addr zero. The loader then enters the system reset 303 + # vector at addr 0x100. A bootwrapper overlay is used to arrange for 304 + # a binary image of the kernel to be at addr zero, and yet have a 305 + # suitable bootwrapper entry at 0x100. To construct the final rom 306 + # image 512 bytes from offset 0x100 is copied to the bootwrapper 307 + # place holder at symbol __system_reset_kernel. The 512 bytes of the 308 + # bootwrapper entry code at symbol __system_reset_overlay is then 309 + # copied to offset 0x100. At runtime the bootwrapper program copies 310 + # the data at __system_reset_kernel back to addr 0x100. 310 311 311 312 system_reset_overlay=0x`${CROSS}nm "$ofile" \ 312 313 | grep ' __system_reset_overlay$' \ ··· 318 317 | cut -d' ' -f1` 319 318 system_reset_kernel=`printf "%d" $system_reset_kernel` 320 319 overlay_dest="256" 321 - overlay_size="256" 320 + overlay_size="512" 322 321 323 322 ${CROSS}objcopy -O binary "$ofile" "$ofile.bin" 324 323