fw_cfg: make calls typesafe
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									8c52c8f320
								
							
						
					
					
						commit
						c2b5bda43a
					
				
							
								
								
									
										26
									
								
								hw/fw_cfg.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								hw/fw_cfg.c
									
									
									
									
									
								
							@ -45,11 +45,11 @@ typedef struct _FWCfgEntry {
 | 
			
		||||
    FWCfgCallback callback;
 | 
			
		||||
} FWCfgEntry;
 | 
			
		||||
 | 
			
		||||
typedef struct _FWCfgState {
 | 
			
		||||
struct _FWCfgState {
 | 
			
		||||
    FWCfgEntry entries[2][FW_CFG_MAX_ENTRY];
 | 
			
		||||
    uint16_t cur_entry;
 | 
			
		||||
    uint32_t cur_offset;
 | 
			
		||||
} FWCfgState;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void fw_cfg_write(FWCfgState *s, uint8_t value)
 | 
			
		||||
{
 | 
			
		||||
@ -210,9 +210,8 @@ static const VMStateDescription vmstate_fw_cfg = {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int fw_cfg_add_bytes(void *opaque, uint16_t key, uint8_t *data, uint32_t len)
 | 
			
		||||
int fw_cfg_add_bytes(FWCfgState *s, uint16_t key, uint8_t *data, uint32_t len)
 | 
			
		||||
{
 | 
			
		||||
    FWCfgState *s = opaque;
 | 
			
		||||
    int arch = !!(key & FW_CFG_ARCH_LOCAL);
 | 
			
		||||
 | 
			
		||||
    key &= FW_CFG_ENTRY_MASK;
 | 
			
		||||
@ -226,37 +225,36 @@ int fw_cfg_add_bytes(void *opaque, uint16_t key, uint8_t *data, uint32_t len)
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fw_cfg_add_i16(void *opaque, uint16_t key, uint16_t value)
 | 
			
		||||
int fw_cfg_add_i16(FWCfgState *s, uint16_t key, uint16_t value)
 | 
			
		||||
{
 | 
			
		||||
    uint16_t *copy;
 | 
			
		||||
 | 
			
		||||
    copy = qemu_malloc(sizeof(value));
 | 
			
		||||
    *copy = cpu_to_le16(value);
 | 
			
		||||
    return fw_cfg_add_bytes(opaque, key, (uint8_t *)copy, sizeof(value));
 | 
			
		||||
    return fw_cfg_add_bytes(s, key, (uint8_t *)copy, sizeof(value));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fw_cfg_add_i32(void *opaque, uint16_t key, uint32_t value)
 | 
			
		||||
int fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t *copy;
 | 
			
		||||
 | 
			
		||||
    copy = qemu_malloc(sizeof(value));
 | 
			
		||||
    *copy = cpu_to_le32(value);
 | 
			
		||||
    return fw_cfg_add_bytes(opaque, key, (uint8_t *)copy, sizeof(value));
 | 
			
		||||
    return fw_cfg_add_bytes(s, key, (uint8_t *)copy, sizeof(value));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fw_cfg_add_i64(void *opaque, uint16_t key, uint64_t value)
 | 
			
		||||
int fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value)
 | 
			
		||||
{
 | 
			
		||||
    uint64_t *copy;
 | 
			
		||||
 | 
			
		||||
    copy = qemu_malloc(sizeof(value));
 | 
			
		||||
    *copy = cpu_to_le64(value);
 | 
			
		||||
    return fw_cfg_add_bytes(opaque, key, (uint8_t *)copy, sizeof(value));
 | 
			
		||||
    return fw_cfg_add_bytes(s, key, (uint8_t *)copy, sizeof(value));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fw_cfg_add_callback(void *opaque, uint16_t key, FWCfgCallback callback,
 | 
			
		||||
int fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
 | 
			
		||||
                        void *callback_opaque, uint8_t *data, size_t len)
 | 
			
		||||
{
 | 
			
		||||
    FWCfgState *s = opaque;
 | 
			
		||||
    int arch = !!(key & FW_CFG_ARCH_LOCAL);
 | 
			
		||||
 | 
			
		||||
    if (!(key & FW_CFG_WRITE_CHANNEL))
 | 
			
		||||
@ -275,8 +273,8 @@ int fw_cfg_add_callback(void *opaque, uint16_t key, FWCfgCallback callback,
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
 | 
			
		||||
		target_phys_addr_t ctl_addr, target_phys_addr_t data_addr)
 | 
			
		||||
FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
 | 
			
		||||
                        target_phys_addr_t ctl_addr, target_phys_addr_t data_addr)
 | 
			
		||||
{
 | 
			
		||||
    FWCfgState *s;
 | 
			
		||||
    int io_ctl_memory, io_data_memory;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								hw/fw_cfg.h
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								hw/fw_cfg.h
									
									
									
									
									
								
							@ -37,14 +37,16 @@
 | 
			
		||||
#ifndef NO_QEMU_PROTOS
 | 
			
		||||
typedef void (*FWCfgCallback)(void *opaque, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
int fw_cfg_add_bytes(void *opaque, uint16_t key, uint8_t *data, uint32_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, uint8_t type, 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 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user