Annotation of qemu/hw/qdev-properties.c, revision 1.1

1.1     ! root        1: #include "qdev.h"
        !             2: 
        !             3: void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
        !             4: {
        !             5:     void *ptr = dev;
        !             6:     ptr += prop->offset;
        !             7:     return ptr;
        !             8: }
        !             9: 
        !            10: /* --- 16bit integer --- */
        !            11: 
        !            12: static int parse_uint16(DeviceState *dev, Property *prop, const char *str)
        !            13: {
        !            14:     uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
        !            15:     const char *fmt;
        !            16: 
        !            17:     /* accept both hex and decimal */
        !            18:     fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx16 : "%" PRIu16;
        !            19:     if (sscanf(str, fmt, ptr) != 1)
        !            20:         return -1;
        !            21:     return 0;
        !            22: }
        !            23: 
        !            24: static int print_uint16(DeviceState *dev, Property *prop, char *dest, size_t len)
        !            25: {
        !            26:     uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
        !            27:     return snprintf(dest, len, "%" PRIu16, *ptr);
        !            28: }
        !            29: 
        !            30: PropertyInfo qdev_prop_uint16 = {
        !            31:     .name  = "uint16",
        !            32:     .type  = PROP_TYPE_UINT16,
        !            33:     .size  = sizeof(uint16_t),
        !            34:     .parse = parse_uint16,
        !            35:     .print = print_uint16,
        !            36: };
        !            37: 
        !            38: /* --- 32bit integer --- */
        !            39: 
        !            40: static int parse_uint32(DeviceState *dev, Property *prop, const char *str)
        !            41: {
        !            42:     uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
        !            43:     const char *fmt;
        !            44: 
        !            45:     /* accept both hex and decimal */
        !            46:     fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx32 : "%" PRIu32;
        !            47:     if (sscanf(str, fmt, ptr) != 1)
        !            48:         return -1;
        !            49:     return 0;
        !            50: }
        !            51: 
        !            52: static int print_uint32(DeviceState *dev, Property *prop, char *dest, size_t len)
        !            53: {
        !            54:     uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
        !            55:     return snprintf(dest, len, "%" PRIu32, *ptr);
        !            56: }
        !            57: 
        !            58: PropertyInfo qdev_prop_uint32 = {
        !            59:     .name  = "uint32",
        !            60:     .type  = PROP_TYPE_UINT32,
        !            61:     .size  = sizeof(uint32_t),
        !            62:     .parse = parse_uint32,
        !            63:     .print = print_uint32,
        !            64: };
        !            65: 
        !            66: /* --- 32bit hex value --- */
        !            67: 
        !            68: static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
        !            69: {
        !            70:     uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
        !            71: 
        !            72:     if (sscanf(str, "%" PRIx32, ptr) != 1)
        !            73:         return -1;
        !            74:     return 0;
        !            75: }
        !            76: 
        !            77: static int print_hex32(DeviceState *dev, Property *prop, char *dest, size_t len)
        !            78: {
        !            79:     uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
        !            80:     return snprintf(dest, len, "0x%" PRIx32, *ptr);
        !            81: }
        !            82: 
        !            83: PropertyInfo qdev_prop_hex32 = {
        !            84:     .name  = "hex32",
        !            85:     .type  = PROP_TYPE_UINT32,
        !            86:     .size  = sizeof(uint32_t),
        !            87:     .parse = parse_hex32,
        !            88:     .print = print_hex32,
        !            89: };
        !            90: 
        !            91: /* --- pointer --- */
        !            92: 
        !            93: static int print_ptr(DeviceState *dev, Property *prop, char *dest, size_t len)
        !            94: {
        !            95:     void **ptr = qdev_get_prop_ptr(dev, prop);
        !            96:     return snprintf(dest, len, "<%p>", *ptr);
        !            97: }
        !            98: 
        !            99: PropertyInfo qdev_prop_ptr = {
        !           100:     .name  = "ptr",
        !           101:     .type  = PROP_TYPE_PTR,
        !           102:     .size  = sizeof(void*),
        !           103:     .print = print_ptr,
        !           104: };
        !           105: 
        !           106: /* --- mac address --- */
        !           107: 
        !           108: /*
        !           109:  * accepted syntax versions:
        !           110:  *   01:02:03:04:05:06
        !           111:  *   01-02-03-04-05-06
        !           112:  */
        !           113: static int parse_mac(DeviceState *dev, Property *prop, const char *str)
        !           114: {
        !           115:     uint8_t *mac = qdev_get_prop_ptr(dev, prop);
        !           116:     int i, pos;
        !           117:     char *p;
        !           118: 
        !           119:     for (i = 0, pos = 0; i < 6; i++, pos += 3) {
        !           120:         if (!qemu_isxdigit(str[pos]))
        !           121:             return -1;
        !           122:         if (!qemu_isxdigit(str[pos+1]))
        !           123:             return -1;
        !           124:         if (i == 5 && str[pos+2] != '\0')
        !           125:             return -1;
        !           126:         if (str[pos+2] != ':' && str[pos+2] != '-')
        !           127:             return -1;
        !           128:         mac[i] = strtol(str+pos, &p, 16);
        !           129:     }
        !           130:     return 0;
        !           131: }
        !           132: 
        !           133: static int print_mac(DeviceState *dev, Property *prop, char *dest, size_t len)
        !           134: {
        !           135:     uint8_t *mac = qdev_get_prop_ptr(dev, prop);
        !           136:     return snprintf(dest, len, "%02x:%02x:%02x:%02x:%02x:%02x",
        !           137:                     mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
        !           138: }
        !           139: 
        !           140: PropertyInfo qdev_prop_macaddr = {
        !           141:     .name  = "mac-addr",
        !           142:     .type  = PROP_TYPE_MACADDR,
        !           143:     .size  = 6,
        !           144:     .parse = parse_mac,
        !           145:     .print = print_mac,
        !           146: };
        !           147: 
        !           148: /* --- public helpers --- */
        !           149: 
        !           150: static Property *qdev_prop_walk(Property *props, const char *name)
        !           151: {
        !           152:     if (!props)
        !           153:         return NULL;
        !           154:     while (props->name) {
        !           155:         if (strcmp(props->name, name) == 0)
        !           156:             return props;
        !           157:         props++;
        !           158:     }
        !           159:     return NULL;
        !           160: }
        !           161: 
        !           162: static Property *qdev_prop_find(DeviceState *dev, const char *name)
        !           163: {
        !           164:     Property *prop;
        !           165: 
        !           166:     /* device properties */
        !           167:     prop = qdev_prop_walk(dev->info->props, name);
        !           168:     if (prop)
        !           169:         return prop;
        !           170: 
        !           171:     /* bus properties */
        !           172:     prop = qdev_prop_walk(dev->parent_bus->info->props, name);
        !           173:     if (prop)
        !           174:         return prop;
        !           175: 
        !           176:     return NULL;
        !           177: }
        !           178: 
        !           179: int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
        !           180: {
        !           181:     Property *prop;
        !           182: 
        !           183:     prop = qdev_prop_find(dev, name);
        !           184:     if (!prop) {
        !           185:         fprintf(stderr, "property \"%s.%s\" not found\n",
        !           186:                 dev->info->name, name);
        !           187:         return -1;
        !           188:     }
        !           189:     if (!prop->info->parse) {
        !           190:         fprintf(stderr, "property \"%s.%s\" has no parser\n",
        !           191:                 dev->info->name, name);
        !           192:         return -1;
        !           193:     }
        !           194:     return prop->info->parse(dev, prop, value);
        !           195: }
        !           196: 
        !           197: void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type)
        !           198: {
        !           199:     Property *prop;
        !           200:     void *dst;
        !           201: 
        !           202:     prop = qdev_prop_find(dev, name);
        !           203:     if (!prop) {
        !           204:         fprintf(stderr, "%s: property \"%s.%s\" not found\n",
        !           205:                 __FUNCTION__, dev->info->name, name);
        !           206:         abort();
        !           207:     }
        !           208:     if (prop->info->type != type) {
        !           209:         fprintf(stderr, "%s: property \"%s.%s\" type mismatch\n",
        !           210:                 __FUNCTION__, dev->info->name, name);
        !           211:         abort();
        !           212:     }
        !           213:     dst = qdev_get_prop_ptr(dev, prop);
        !           214:     memcpy(dst, src, prop->info->size);
        !           215: }
        !           216: 
        !           217: void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
        !           218: {
        !           219:     qdev_prop_set(dev, name, &value, PROP_TYPE_UINT16);
        !           220: }
        !           221: 
        !           222: void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
        !           223: {
        !           224:     qdev_prop_set(dev, name, &value, PROP_TYPE_UINT32);
        !           225: }
        !           226: 
        !           227: void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
        !           228: {
        !           229:     qdev_prop_set(dev, name, &value, PROP_TYPE_PTR);
        !           230: }
        !           231: 
        !           232: void qdev_prop_set_defaults(DeviceState *dev, Property *props)
        !           233: {
        !           234:     char *dst;
        !           235: 
        !           236:     if (!props)
        !           237:         return;
        !           238:     while (props->name) {
        !           239:         if (props->defval) {
        !           240:             dst = qdev_get_prop_ptr(dev, props);
        !           241:             memcpy(dst, props->defval, props->info->size);
        !           242:         }
        !           243:         props++;
        !           244:     }
        !           245: }
        !           246: 
        !           247: static CompatProperty *compat_props;
        !           248: 
        !           249: void qdev_prop_register_compat(CompatProperty *props)
        !           250: {
        !           251:     compat_props = props;
        !           252: }
        !           253: 
        !           254: void qdev_prop_set_compat(DeviceState *dev)
        !           255: {
        !           256:     CompatProperty *prop;
        !           257: 
        !           258:     if (!compat_props) {
        !           259:         return;
        !           260:     }
        !           261:     for (prop = compat_props; prop->driver != NULL; prop++) {
        !           262:         if (strcmp(dev->info->name, prop->driver) != 0) {
        !           263:             continue;
        !           264:         }
        !           265:         if (qdev_prop_parse(dev, prop->property, prop->value) != 0) {
        !           266:             abort();
        !           267:         }
        !           268:     }
        !           269: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.