aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/ps3
diff options
context:
space:
mode:
authorGeoff Levand <geoffrey.levand@am.sony.com>2007-12-23 12:41:01 -0500
committerPaul Mackerras <paulus@samba.org>2007-12-27 23:07:52 -0500
commitec5d2dfe72cf4808ae4ecee03454a4d91dfcbe0c (patch)
tree89f4547fe9a88cfe5cb76b324fa95d7d1e0cb97c /arch/powerpc/platforms/ps3
parentaed3a8c9bb1a8623a618232087c5ff62718e3b9a (diff)
[POWERPC] PS3: Fix printing of os-area magic numbers
Fix a bug in the printing of the os-area magic numbers which assumed that magic numbers were zero terminated strings. The magic numbers are represented in memory as integers. If the os-area sections are not initialized correctly they could contained random data that would be printed to the display. Also unify the handling of header and db magic numbers and make both of type array of u8. Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms/ps3')
-rw-r--r--arch/powerpc/platforms/ps3/os-area.c40
1 files changed, 30 insertions, 10 deletions
diff --git a/arch/powerpc/platforms/ps3/os-area.c b/arch/powerpc/platforms/ps3/os-area.c
index 766685ab26f8..b9ea09d9d2fb 100644
--- a/arch/powerpc/platforms/ps3/os-area.c
+++ b/arch/powerpc/platforms/ps3/os-area.c
@@ -23,6 +23,7 @@
23#include <linux/workqueue.h> 23#include <linux/workqueue.h>
24#include <linux/fs.h> 24#include <linux/fs.h>
25#include <linux/syscalls.h> 25#include <linux/syscalls.h>
26#include <linux/ctype.h>
26 27
27#include <asm/lmb.h> 28#include <asm/lmb.h>
28 29
@@ -37,6 +38,8 @@ enum os_area_ldr_format {
37 HEADER_LDR_FORMAT_GZIP = 1, 38 HEADER_LDR_FORMAT_GZIP = 1,
38}; 39};
39 40
41#define OS_AREA_HEADER_MAGIC_NUM "cell_ext_os_area"
42
40/** 43/**
41 * struct os_area_header - os area header segment. 44 * struct os_area_header - os area header segment.
42 * @magic_num: Always 'cell_ext_os_area'. 45 * @magic_num: Always 'cell_ext_os_area'.
@@ -114,13 +117,11 @@ struct os_area_params {
114 u8 _reserved_5[8]; 117 u8 _reserved_5[8];
115}; 118};
116 119
117enum { 120#define OS_AREA_DB_MAGIC_NUM "-db-"
118 OS_AREA_DB_MAGIC_NUM = 0x2d64622dU,
119};
120 121
121/** 122/**
122 * struct os_area_db - Shared flash memory database. 123 * struct os_area_db - Shared flash memory database.
123 * @magic_num: Always '-db-' = 0x2d64622d. 124 * @magic_num: Always '-db-'.
124 * @version: os_area_db format version number. 125 * @version: os_area_db format version number.
125 * @index_64: byte offset of the database id index for 64 bit variables. 126 * @index_64: byte offset of the database id index for 64 bit variables.
126 * @count_64: number of usable 64 bit index entries 127 * @count_64: number of usable 64 bit index entries
@@ -135,7 +136,7 @@ enum {
135 */ 136 */
136 137
137struct os_area_db { 138struct os_area_db {
138 u32 magic_num; 139 u8 magic_num[4];
139 u16 version; 140 u16 version;
140 u16 _reserved_1; 141 u16 _reserved_1;
141 u16 index_64; 142 u16 index_64;
@@ -265,12 +266,26 @@ static void __init os_area_get_property(struct device_node *node,
265 prop->name); 266 prop->name);
266} 267}
267 268
269static void dump_field(char *s, const u8 *field, int size_of_field)
270{
271#if defined(DEBUG)
272 int i;
273
274 for (i = 0; i < size_of_field; i++)
275 s[i] = isprint(field[i]) ? field[i] : '.';
276 s[i] = 0;
277#endif
278}
279
268#define dump_header(_a) _dump_header(_a, __func__, __LINE__) 280#define dump_header(_a) _dump_header(_a, __func__, __LINE__)
269static void _dump_header(const struct os_area_header *h, const char *func, 281static void _dump_header(const struct os_area_header *h, const char *func,
270 int line) 282 int line)
271{ 283{
284 char str[sizeof(h->magic_num) + 1];
285
286 dump_field(str, h->magic_num, sizeof(h->magic_num));
272 pr_debug("%s:%d: h.magic_num: '%s'\n", func, line, 287 pr_debug("%s:%d: h.magic_num: '%s'\n", func, line,
273 h->magic_num); 288 str);
274 pr_debug("%s:%d: h.hdr_version: %u\n", func, line, 289 pr_debug("%s:%d: h.hdr_version: %u\n", func, line,
275 h->hdr_version); 290 h->hdr_version);
276 pr_debug("%s:%d: h.db_area_offset: %u\n", func, line, 291 pr_debug("%s:%d: h.db_area_offset: %u\n", func, line,
@@ -311,7 +326,8 @@ static void _dump_params(const struct os_area_params *p, const char *func,
311 326
312static int verify_header(const struct os_area_header *header) 327static int verify_header(const struct os_area_header *header)
313{ 328{
314 if (memcmp(header->magic_num, "cell_ext_os_area", 16)) { 329 if (memcmp(header->magic_num, OS_AREA_HEADER_MAGIC_NUM,
330 sizeof(header->magic_num))) {
315 pr_debug("%s:%d magic_num failed\n", __func__, __LINE__); 331 pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
316 return -1; 332 return -1;
317 } 333 }
@@ -331,7 +347,8 @@ static int verify_header(const struct os_area_header *header)
331 347
332static int db_verify(const struct os_area_db *db) 348static int db_verify(const struct os_area_db *db)
333{ 349{
334 if (db->magic_num != OS_AREA_DB_MAGIC_NUM) { 350 if (memcmp(db->magic_num, OS_AREA_DB_MAGIC_NUM,
351 sizeof(db->magic_num))) {
335 pr_debug("%s:%d magic_num failed\n", __func__, __LINE__); 352 pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
336 return -1; 353 return -1;
337 } 354 }
@@ -484,8 +501,11 @@ static int db_get_rtc_diff(const struct os_area_db *db, int64_t *rtc_diff)
484static void _dump_db(const struct os_area_db *db, const char *func, 501static void _dump_db(const struct os_area_db *db, const char *func,
485 int line) 502 int line)
486{ 503{
504 char str[sizeof(db->magic_num) + 1];
505
506 dump_field(str, db->magic_num, sizeof(db->magic_num));
487 pr_debug("%s:%d: db.magic_num: '%s'\n", func, line, 507 pr_debug("%s:%d: db.magic_num: '%s'\n", func, line,
488 (const char*)&db->magic_num); 508 str);
489 pr_debug("%s:%d: db.version: %u\n", func, line, 509 pr_debug("%s:%d: db.version: %u\n", func, line,
490 db->version); 510 db->version);
491 pr_debug("%s:%d: db.index_64: %u\n", func, line, 511 pr_debug("%s:%d: db.index_64: %u\n", func, line,
@@ -516,7 +536,7 @@ static void os_area_db_init(struct os_area_db *db)
516 536
517 memset(db, 0, sizeof(struct os_area_db)); 537 memset(db, 0, sizeof(struct os_area_db));
518 538
519 db->magic_num = OS_AREA_DB_MAGIC_NUM; 539 memcpy(db->magic_num, OS_AREA_DB_MAGIC_NUM, sizeof(db->magic_num));
520 db->version = 1; 540 db->version = 1;
521 db->index_64 = HEADER_SIZE; 541 db->index_64 = HEADER_SIZE;
522 db->count_64 = VALUES_64_COUNT; 542 db->count_64 = VALUES_64_COUNT;