[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: [SeaBIOS] [PATCH 4/8] fw_cfg: add API for file transfer
From: |
Gleb Natapov |
Subject: |
[Qemu-devel] Re: [SeaBIOS] [PATCH 4/8] fw_cfg: add API for file transfer. |
Date: |
Sun, 20 Dec 2009 10:42:49 +0200 |
On Fri, Dec 18, 2009 at 12:01:10PM +0100, Gerd Hoffmann wrote:
> This patch adds a file transfer interface to fw_cfg. Intended to be
> used for passing non-pci option roms and vgabios to seabios. Namespace
> is modeled after the existing cbfs filesystem support in seabios.
>
> Reading the new FW_CFG_FILE_DIR entry returns a file list.
> Fields there are in network byte order (aka bigendian).
>
> Signed-off-by: Gerd Hoffmann <address@hidden>
> ---
> hw/fw_cfg.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> hw/fw_cfg.h | 21 +++++++++++++++++++--
> 2 files changed, 62 insertions(+), 2 deletions(-)
>
> diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
> index 2e3662d..0492f5f 100644
> --- a/hw/fw_cfg.c
> +++ b/hw/fw_cfg.c
> @@ -47,6 +47,7 @@ typedef struct _FWCfgEntry {
>
> struct _FWCfgState {
> FWCfgEntry entries[2][FW_CFG_MAX_ENTRY];
> + FWCfgFiles *files;
> uint16_t cur_entry;
> uint32_t cur_offset;
> };
> @@ -273,6 +274,48 @@ int fw_cfg_add_callback(FWCfgState *s, uint16_t key,
> FWCfgCallback callback,
> return 1;
> }
>
> +int fw_cfg_add_file(FWCfgState *s, const char *dir, const char *filename,
> + uint8_t *data, uint32_t len)
> +{
> + const char *basename;
> + int index;
> +
> + if (!s->files) {
> + int dsize = sizeof(uint32_t) + sizeof(FWCfgFile) * FW_CFG_FILE_SLOTS;
> + s->files = qemu_mallocz(dsize);
> + fw_cfg_add_bytes(s, FW_CFG_FILE_DIR, (uint8_t*)s->files, dsize);
> + }
> +
> + index = be32_to_cpu(s->files->count);
> + if (index == FW_CFG_FILE_SLOTS) {
> + fprintf(stderr, "fw_cfg: out of file slots\n");
> + return 0;
> + }
> +
> + fw_cfg_add_bytes(s, FW_CFG_FILE_FIRST + index, data, len);
> +
> + basename = strrchr(filename, '/');
> + if (basename) {
> + basename++;
> + } else {
> + basename = filename;
> + }
> + if (dir) {
> + snprintf(s->files->f[index].name, sizeof(s->files->f[index].name),
> + "%s/%s", dir, basename);
> + } else {
> + snprintf(s->files->f[index].name, sizeof(s->files->f[index].name),
> + "%s", basename);
> + }
> + s->files->f[index].size = cpu_to_be32(len);
> + s->files->f[index].select = cpu_to_be16(FW_CFG_FILE_FIRST + index);
> + fprintf(stderr, "%s: #%d: %s (%d bytes)\n", __FUNCTION__,
> + index, s->files->f[index].name, len);
> +
> + s->files->count = cpu_to_be32(index+1);
> + return 1;
> +}
> +
> FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
> target_phys_addr_t ctl_addr, target_phys_addr_t
> data_addr)
> {
> diff --git a/hw/fw_cfg.h b/hw/fw_cfg.h
> index b06665e..a63f54f 100644
> --- a/hw/fw_cfg.h
> +++ b/hw/fw_cfg.h
> @@ -26,7 +26,11 @@
> #define FW_CFG_SETUP_ADDR 0x16
> #define FW_CFG_SETUP_SIZE 0x17
> #define FW_CFG_SETUP_DATA 0x18
> -#define FW_CFG_MAX_ENTRY 0x19
> +#define FW_CFG_FILE_DIR 0x19
> +
> +#define FW_CFG_FILE_FIRST 0x20
> +#define FW_CFG_FILE_SLOTS 0x10
The name of this define looks like CFG option number but it is not.
Lets rename it.
> +#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
> @@ -34,6 +38,18 @@
>
> #define FW_CFG_INVALID 0xffff
>
> +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;
> +
> #ifndef NO_QEMU_PROTOS
> typedef void (*FWCfgCallback)(void *opaque, uint8_t *data);
>
> @@ -44,7 +60,8 @@ 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);
> -int fw_cfg_add_file(FWCfgState *s, uint8_t type, uint8_t *data, uint32_t
> len);
> +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);
>
> --
> 1.6.5.2
>
>
> _______________________________________________
> SeaBIOS mailing list
> address@hidden
> http://www.seabios.org/mailman/listinfo/seabios
--
Gleb.
- Re: [Qemu-devel] [PATCH 1/8] Support PCI based option rom loading, (continued)
- Re: [Qemu-devel] [PATCH 1/8] Support PCI based option rom loading, Alexander Graf, 2009/12/20
- Re: [Qemu-devel] [PATCH 1/8] Support PCI based option rom loading, Anthony Liguori, 2009/12/20
- Re: [Qemu-devel] [PATCH 1/8] Support PCI based option rom loading, Alexander Graf, 2009/12/20
- Re: [Qemu-devel] [PATCH 1/8] Support PCI based option rom loading, Andreas Färber, 2009/12/20
- Re: [Qemu-devel] [PATCH 1/8] Support PCI based option rom loading, Blue Swirl, 2009/12/20
- Re: [Qemu-devel] [PATCH 1/8] Support PCI based option rom loading, Benjamin Herrenschmidt, 2009/12/20
- Re: [Qemu-devel] [PATCH 1/8] Support PCI based option rom loading, Benjamin Herrenschmidt, 2009/12/20
[Qemu-devel] [PATCH 8/8] debug: enable bios messages, Gerd Hoffmann, 2009/12/18
[Qemu-devel] [PATCH 4/8] fw_cfg: add API for file transfer., Gerd Hoffmann, 2009/12/18
[Qemu-devel] [PATCH 6/8] roms: remove option rom packing logic, Gerd Hoffmann, 2009/12/18
[Qemu-devel] [PATCH 5/8] roms: use new fw_cfg file xfer support., Gerd Hoffmann, 2009/12/18
[Qemu-devel] [PATCH 2/8] pci romfiles: add property, add default to PCIDeviceInfo, Gerd Hoffmann, 2009/12/18
[Qemu-devel] [PATCH 7/8] updated seabios binary for testing convinience., Gerd Hoffmann, 2009/12/18
[Qemu-devel] Re: [SeaBIOS] [PATCH 0/8] option rom loading overhaul., Anthony Liguori, 2009/12/18