| /* |
| * PS3 flash memory os area. |
| * |
| * Copyright (C) 2006 Sony Computer Entertainment Inc. |
| * Copyright 2006 Sony Corp. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #if !defined(_C5A0A0BE_F815_48A6_BBE0_F553923CEFEE_H) |
| #define _C5A0A0BE_F815_48A6_BBE0_F553923CEFEE_H |
| |
| #include <stdint.h> |
| #include <stdio.h> |
| |
| enum { |
| OS_AREA_SEGMENT_SIZE = 0X200, |
| }; |
| |
| enum os_area_ldr_format { |
| HEADER_LDR_FORMAT_RAW = 0, |
| HEADER_LDR_FORMAT_GZIP = 1, |
| }; |
| |
| /** |
| * struct os_area_header - os area header segment. |
| * @magic_num: Always 'cell_ext_os_area'. |
| * @hdr_version: Header format version number. |
| * @db_area_offset: Starting segment number of other os database area. |
| * @ldr_area_offset: Starting segment number of bootloader image area. |
| * @ldr_format: HEADER_LDR_FORMAT flag. |
| * @ldr_size: Size of bootloader image in bytes. |
| * |
| * Note that the docs refer to area offsets. These are offsets in units of |
| * segments from the start of the os area (top of the header). These are |
| * better thought of as segment numbers. The os area of the os area is |
| * reserved for the os image. |
| */ |
| |
| struct os_area_header { |
| uint8_t magic_num[16]; |
| uint32_t hdr_version; |
| uint32_t db_area_offset; |
| uint32_t ldr_area_offset; |
| uint32_t _reserved_1; |
| uint32_t ldr_format; |
| uint32_t ldr_size; |
| uint32_t _reserved_2[6]; |
| }; |
| |
| enum os_area_boot_flag { |
| PARAM_BOOT_FLAG_GAME_OS = 0, |
| PARAM_BOOT_FLAG_OTHER_OS = 1, |
| }; |
| |
| enum { |
| PARAM_CTRL_BUTTON_O_IS_YES = 0, |
| PARAM_CTRL_BUTTON_X_IS_YES = 1, |
| }; |
| |
| /** |
| * struct os_area_params - os area params segment. |
| * @boot_flag: User preference of operating system, PARAM_BOOT_FLAG flag. |
| * @num_params: Number of params in this (params) segment. |
| * @rtc_diff: Difference in seconds between game os wall time and the ps3 rtc value. |
| * @av_multi_out: User preference of AV output, PARAM_AV_MULTI_OUT flag. |
| * @ctrl_button: User preference of controller button config, PARAM_CTRL_BUTTON |
| * flag. |
| * @static_ip_addr: User preference of static IP address. |
| * @network_mask: User preference of static network mask. |
| * @default_gateway: User preference of static default gateway. |
| * @dns_primary: User preference of static primary dns server. |
| * @dns_secondary: User preference of static secondary dns server. |
| * |
| * User preference of zero for static_ip_addr means use dhcp. |
| */ |
| |
| struct os_area_params { |
| uint32_t boot_flag; |
| uint32_t _reserved_1[3]; |
| uint32_t num_params; |
| uint32_t _reserved_2[3]; |
| /* param 0 */ |
| int64_t rtc_diff; |
| uint8_t av_multi_out; |
| uint8_t ctrl_button; |
| uint8_t _reserved_3[6]; |
| /* param 1 */ |
| uint8_t static_ip_addr[4]; |
| uint8_t network_mask[4]; |
| uint8_t default_gateway[4]; |
| uint8_t _reserved_4[4]; |
| /* param 2 */ |
| uint8_t dns_primary[4]; |
| uint8_t dns_secondary[4]; |
| uint8_t _reserved_5[8]; |
| }; |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| |
| FILE *os_area_set_log_stream(FILE *log); |
| int os_area_log(const char *fmt, ...); |
| |
| int os_area_header_read(struct os_area_header *h, FILE *dev); |
| int os_area_header_write(const struct os_area_header *h, FILE *dev); |
| int os_area_params_read(struct os_area_params *p, FILE *dev); |
| int os_area_params_write(const struct os_area_params *p, FILE *dev); |
| int os_area_image_write(FILE *image, struct os_area_header *h, FILE *dev); |
| int os_area_header_verify(const struct os_area_header *h); |
| static inline int os_area_fixed_read(struct os_area_header *h, |
| struct os_area_params *p, FILE *dev) |
| { |
| int result = os_area_header_read(h, dev); |
| return result ? result : os_area_params_read(p, dev); |
| } |
| int os_area_set_ldr_format(struct os_area_header *h, FILE *dev, |
| enum os_area_ldr_format value); |
| int os_area_set_ldr_size(struct os_area_header *h, FILE *dev, |
| unsigned int value); |
| int os_area_set_boot_flag(struct os_area_params *p, FILE *dev, |
| enum os_area_boot_flag value); |
| #define os_area_header_debug_dump(_a) os_area_header_dump(_a, __func__, \ |
| __LINE__) |
| void os_area_header_dump(const struct os_area_header *h, const char *header, |
| int id); |
| #define os_area_params_debug_dump(_a) os_area_params_dump(_a, __func__, \ |
| __LINE__) |
| void os_area_params_dump(const struct os_area_params *p, const char *header, |
| int id); |
| |
| #if defined(__cplusplus) |
| } |
| #endif |
| |
| /* flash db routines */ |
| |
| /** |
| * struct os_area_db - Shared flash memory database. |
| * @magic_num: Always '-db-' = 0x2d64622d. |
| * @version: os_area_db format version number. |
| * @index_64: byte offset of the database id index for 64 bit variables. |
| * @count_64: number of usable 64 bit index entries |
| * @index_32: byte offset of the database id index for 32 bit variables. |
| * @count_32: number of usable 32 bit index entries |
| * @index_16: byte offset of the database id index for 16 bit variables. |
| * @count_16: number of usable 16 bit index entries |
| * |
| * Flash rom storage for exclusive use by guests running in the other os lpar. |
| * The current system configuration allocates 1K (two segments) for other os |
| * use. |
| */ |
| |
| struct os_area_db { |
| uint32_t magic_num; |
| uint16_t version; |
| uint16_t _reserved_1; |
| uint16_t index_64; |
| uint16_t count_64; |
| uint16_t index_32; |
| uint16_t count_32; |
| uint16_t index_16; |
| uint16_t count_16; |
| uint32_t _reserved_2; |
| uint8_t _reserved_3[1000]; |
| }; |
| |
| /** |
| * enum os_area_db_owner - Data owners. |
| */ |
| |
| enum os_area_db_owner { |
| OS_AREA_DB_OWNER_ANY = -1, |
| OS_AREA_DB_OWNER_NONE = 0, |
| OS_AREA_DB_OWNER_PROTOTYPE = 1, |
| OS_AREA_DB_OWNER_LINUX = 2, |
| OS_AREA_DB_OWNER_PETITBOOT = 3, |
| OS_AREA_DB_OWNER_MAX = 32, |
| }; |
| |
| enum os_area_db_key { |
| OS_AREA_DB_KEY_ANY = -1, |
| OS_AREA_DB_KEY_NONE = 0, |
| OS_AREA_DB_KEY_RTC_DIFF = 1, |
| OS_AREA_DB_KEY_VIDEO_MODE = 2, |
| OS_AREA_DB_KEY_MAX = 8, |
| }; |
| |
| struct os_area_db_id { |
| int owner; |
| int key; |
| }; |
| |
| static const struct os_area_db_id os_area_db_empty_id = |
| {OS_AREA_DB_OWNER_NONE, OS_AREA_DB_KEY_NONE}; |
| static const struct os_area_db_id os_area_db_any_id = |
| {OS_AREA_DB_OWNER_ANY, OS_AREA_DB_KEY_ANY}; |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| |
| int os_area_db_read(struct os_area_db *db, const struct os_area_header *h, |
| FILE *dev); |
| int os_area_db_write(const struct os_area_db *db, const struct os_area_header *h, |
| FILE *dev); |
| void os_area_db_init(struct os_area_db *db); |
| int os_area_db_verify(const struct os_area_db *db); |
| int os_area_db_get(const struct os_area_db *db, const struct os_area_db_id *id, |
| uint64_t *value); |
| int os_area_db_remove(struct os_area_db *db, const struct os_area_db_id *id); |
| int os_area_db_set_64(struct os_area_db *db, const struct os_area_db_id *id, |
| uint64_t value); |
| int os_area_db_set_32(struct os_area_db *db, const struct os_area_db_id *id, |
| uint32_t value); |
| int os_area_db_set_16(struct os_area_db *db, const struct os_area_db_id *id, |
| uint16_t value); |
| void os_area_db_print(const struct os_area_db *db, |
| const struct os_area_db_id *id, int verbose); |
| int os_area_db_format(struct os_area_db *db, const struct os_area_header *h, |
| FILE *dev); |
| int os_area_db_get_rtc_diff(const struct os_area_db *db, int64_t *rtc_diff); |
| int os_area_db_get_video_mode(const struct os_area_db *db, |
| unsigned int *video_mode); |
| int os_area_db_list_owners(char *buf, unsigned int size); |
| void os_area_db_dump_header(const struct os_area_db *db, const char *header, |
| int id); |
| |
| #if defined(__cplusplus) |
| } |
| #endif |
| |
| #endif |