Author: blueswirl Date: 2010-01-09 22:28:28 +0100 (Sat, 09 Jan 2010) New Revision: 663
Modified: trunk/openbios-devel/arch/sparc64/openbios.c trunk/openbios-devel/include/openbios/fw_cfg.h Log: Sparc64: use firmware configuration device for command line storage
Signed-off-by: Blue Swirl blauwirbel@gmail.com
Modified: trunk/openbios-devel/arch/sparc64/openbios.c =================================================================== --- trunk/openbios-devel/arch/sparc64/openbios.c 2010-01-05 20:49:50 UTC (rev 662) +++ trunk/openbios-devel/arch/sparc64/openbios.c 2010-01-09 21:28:28 UTC (rev 663) @@ -280,7 +280,6 @@ uint32_t clock_frequency; uint16_t machine_id; const char *stdin_path, *stdout_path; - const char *kernel_cmdline;
fw_cfg_init();
@@ -302,12 +301,12 @@ kernel_size = fw_cfg_read_i32(FW_CFG_KERNEL_SIZE); if (kernel_size) kernel_image = fw_cfg_read_i64(FW_CFG_KERNEL_ADDR); - kernel_cmdline = (const char *) fw_cfg_read_i64(FW_CFG_KERNEL_CMDLINE); - if (kernel_cmdline) { - size = strlen(kernel_cmdline); - if (size > OBIO_CMDLINE_MAX - 1) - size = OBIO_CMDLINE_MAX - 1; - memcpy(&obio_cmdline, kernel_cmdline, size); + + size = fw_cfg_read_i32(FW_CFG_CMDLINE_SIZE); + if (size > OBIO_CMDLINE_MAX - 1) + size = OBIO_CMDLINE_MAX - 1; + if (size) { + fw_cfg_read(FW_CFG_CMDLINE_DATA, obio_cmdline, size); } obio_cmdline[size] = '\0'; qemu_cmdline = (uint64_t)obio_cmdline;
Modified: trunk/openbios-devel/include/openbios/fw_cfg.h =================================================================== --- trunk/openbios-devel/include/openbios/fw_cfg.h 2010-01-05 20:49:50 UTC (rev 662) +++ trunk/openbios-devel/include/openbios/fw_cfg.h 2010-01-09 21:28:28 UTC (rev 663) @@ -14,8 +14,24 @@ #define FW_CFG_INITRD_ADDR 0x0a #define FW_CFG_INITRD_SIZE 0x0b #define FW_CFG_BOOT_DEVICE 0x0c -#define FW_CFG_MAX_ENTRY 0x10 +#define FW_CFG_NUMA 0x0d +#define FW_CFG_BOOT_MENU 0x0e +#define FW_CFG_MAX_CPUS 0x0f +#define FW_CFG_KERNEL_ENTRY 0x10 +#define FW_CFG_KERNEL_DATA 0x11 +#define FW_CFG_INITRD_DATA 0x12 +#define FW_CFG_CMDLINE_ADDR 0x13 +#define FW_CFG_CMDLINE_SIZE 0x14 +#define FW_CFG_CMDLINE_DATA 0x15 +#define FW_CFG_SETUP_ADDR 0x16 +#define FW_CFG_SETUP_SIZE 0x17 +#define FW_CFG_SETUP_DATA 0x18 +#define FW_CFG_FILE_DIR 0x19
+#define FW_CFG_FILE_FIRST 0x20 +#define FW_CFG_FILE_SLOTS 0x10 +#define FW_CFG_MAX_ENTRY (FW_CFG_FILE_FIRST+FW_CFG_FILE_SLOTS) + #define FW_CFG_WRITE_CHANNEL 0x4000 #define FW_CFG_ARCH_LOCAL 0x8000 #define FW_CFG_ENTRY_MASK ~(FW_CFG_WRITE_CHANNEL | FW_CFG_ARCH_LOCAL) @@ -23,16 +39,31 @@ #define FW_CFG_INVALID 0xffff
#ifndef NO_QEMU_PROTOS +typedef struct FWCfgFile { + uint32_t size; /* file size */ + uint16_t select; /* write this to 0x510 to read it */ + uint16_t reserved; + char name[56]; +} FWCfgFile; + +typedef struct FWCfgFiles { + uint32_t count; + FWCfgFile f[]; +} FWCfgFiles; + typedef void (*FWCfgCallback)(void *opaque, uint8_t *data);
-int fw_cfg_add_bytes(void *opaque, uint16_t key, uint8_t *data, uint16_t len); -int fw_cfg_add_i16(void *opaque, uint16_t key, uint16_t value); -int fw_cfg_add_i32(void *opaque, uint16_t key, uint32_t value); -int fw_cfg_add_i64(void *opaque, uint16_t key, uint64_t value); -int fw_cfg_add_callback(void *opaque, uint16_t key, FWCfgCallback callback, +typedef struct _FWCfgState FWCfgState; +int fw_cfg_add_bytes(FWCfgState *s, uint16_t key, uint8_t *data, uint32_t len); +int fw_cfg_add_i16(FWCfgState *s, uint16_t key, uint16_t value); +int fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value); +int fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value); +int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback, void *callback_opaque, uint8_t *data, size_t len); -void *fw_cfg_init(uint32_t ctl_port, uint32_t data_port, - target_phys_addr_t crl_addr, target_phys_addr_t data_addr); +int fw_cfg_add_file(FWCfgState *s, const char *dir, const char *filename, + uint8_t *data, uint32_t len); +FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port, + target_phys_addr_t crl_addr, target_phys_addr_t data_addr);
#endif /* NO_QEMU_PROTOS */