Skip to content

Commit 4b0022e

Browse files
committed
Migrate away from SIM_register_typed_attribute -- SIMICS-22406
1 parent ef841f7 commit 4b0022e

File tree

4 files changed

+76
-99
lines changed

4 files changed

+76
-99
lines changed

include/simics/dmllib.h

Lines changed: 45 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,10 +1815,13 @@ _DML_serialize_hook_queue(ht_str_table_t *callback_ht,
18151815
return out;
18161816
}
18171817

1818+
typedef attr_value_t (*_get_attr_t)(conf_object_t *, lang_void *);
1819+
typedef set_error_t (*_set_attr_t)(conf_object_t *, attr_value_t *,
1820+
lang_void *);
18181821

18191822
UNUSED static void
18201823
_DML_register_hook_attribute(conf_class_t *cls, const char *attrname,
1821-
get_attr_t getter, set_attr_t setter,
1824+
_get_attr_t getter, _set_attr_t setter,
18221825
const _dml_hook_aux_info_t *aux_info,
18231826
_id_info_t hook_id_info, uint32 port_dims) {
18241827

@@ -1831,10 +1834,10 @@ _DML_register_hook_attribute(conf_class_t *cls, const char *attrname,
18311834
hook_id_info.dimsizes[hook_id_info.dimensions - 1 - i]);
18321835
MM_FREE(tmp_type);
18331836
}
1834-
SIM_register_typed_attribute(cls, attrname, getter, (lang_void *) aux_info,
1835-
setter, (lang_void *) aux_info,
1836-
Sim_Attr_Optional | Sim_Attr_Internal,
1837-
sb_str(&type), NULL, "hook");
1837+
SIM_register_attribute_with_user_data(
1838+
cls, attrname, getter, (lang_void *) aux_info, setter,
1839+
(lang_void *) aux_info, Sim_Attr_Optional | Sim_Attr_Internal,
1840+
sb_str(&type), "hook");
18381841
sb_free(&type);
18391842
}
18401843

@@ -1948,29 +1951,26 @@ thus don't need proxy attributes.
19481951
typedef struct {
19491952
ptrdiff_t port_obj_offset;
19501953
const char *attrname;
1951-
get_attr_t get;
1952-
set_attr_t set;
1954+
_get_attr_t get;
1955+
_set_attr_t set;
19531956
void *getset_data;
19541957
} _port_attr_t;
19551958
static attr_value_t
1956-
_get_legacy_proxy_attr(lang_void *ptr, conf_object_t *obj, attr_value_t *idx)
1959+
_get_legacy_proxy_attr(conf_object_t *obj, lang_void *ptr)
19571960
{
1958-
ASSERT(SIM_attr_is_nil(*idx));
19591961
_port_attr_t *port = (_port_attr_t *)ptr;
19601962
conf_object_t *portobj = *(conf_object_t **)(
19611963
(uintptr_t)obj + port->port_obj_offset);
1962-
return port->get(port->getset_data, portobj, NULL);
1964+
return port->get(portobj, port->getset_data);
19631965
}
19641966
static set_error_t
1965-
_set_legacy_proxy_attr(lang_void *ptr, conf_object_t *obj, attr_value_t *val,
1966-
attr_value_t *idx)
1967+
_set_legacy_proxy_attr(conf_object_t *obj, attr_value_t *val, lang_void *ptr)
19671968
{
1968-
ASSERT(SIM_attr_is_nil(*idx));
19691969
_port_attr_t *port = (_port_attr_t *)ptr;
19701970
conf_object_t *portobj = *(conf_object_t **)(
19711971
(uintptr_t)obj + port->port_obj_offset);
19721972
if (port->attrname == NULL || SIM_object_is_configured(portobj)) {
1973-
return port->set(port->getset_data, portobj, val, NULL);
1973+
return port->set(portobj, val, port->getset_data);
19741974
} else {
19751975
// port attribute is registered as required; need to propagate
19761976
// value through API call to fulfil requirement
@@ -1980,12 +1980,13 @@ _set_legacy_proxy_attr(lang_void *ptr, conf_object_t *obj, attr_value_t *val,
19801980

19811981
UNUSED static void
19821982
_register_port_attr_no_aux(conf_class_t *portcls, const char *attrname,
1983-
get_attr_t getter, set_attr_t setter,
1984-
attr_attr_t attr, const char *type, const char *desc)
1983+
_get_attr_t getter, _set_attr_t setter,
1984+
attr_attr_t attr, const char *type,
1985+
const char *desc)
19851986
{
1986-
SIM_register_typed_attribute(
1987+
SIM_register_attribute_with_user_data(
19871988
portcls, attrname, getter, NULL, setter, NULL,
1988-
attr, type, NULL, desc);
1989+
attr, type, desc);
19891990
}
19901991

19911992
// port_obj_offset is the offset within the device struct of a pointer to the
@@ -1994,7 +1995,7 @@ UNUSED static void
19941995
_register_port_legacy_proxy_attr(conf_class_t *devcls, conf_class_t *portcls,
19951996
ptrdiff_t port_obj_offset, bool is_bank,
19961997
const char *portname, const char *attrname,
1997-
get_attr_t getter, set_attr_t setter,
1998+
_get_attr_t getter, _set_attr_t setter,
19981999
attr_attr_t attr, const char *type,
19992000
const char *desc, void *getset_data)
20002001
{
@@ -2014,20 +2015,20 @@ _register_port_legacy_proxy_attr(conf_class_t *devcls, conf_class_t *portcls,
20142015
strbuf_t proxy_desc = sb_newf(
20152016
"Proxy attribute for %s.%s.%s",
20162017
is_bank ? "bank" : "port", portname, attrname);
2017-
SIM_register_typed_attribute(
2018+
SIM_register_attribute_with_user_data(
20182019
devcls, name,
20192020
getter ? _get_legacy_proxy_attr : NULL, data,
20202021
setter ? _set_legacy_proxy_attr : NULL, data,
20212022
(attr_attr_t)(Sim_Attr_Pseudo | Sim_Attr_Internal),
2022-
type, NULL, sb_str(&proxy_desc));
2023+
type, sb_str(&proxy_desc));
20232024
sb_free(&proxy_desc);
20242025
}
20252026

20262027
UNUSED static void
20272028
_register_port_attr(conf_class_t *devcls, conf_class_t *portcls,
20282029
ptrdiff_t port_obj_offset, bool is_bank,
20292030
const char *portname, const char *attrname,
2030-
get_attr_t getter, set_attr_t setter,
2031+
_get_attr_t getter, _set_attr_t setter,
20312032
attr_attr_t attr, const char *type, const char *desc) {
20322033
_register_port_attr_no_aux(portcls, attrname, getter, setter, attr, type,
20332034
desc);
@@ -2039,24 +2040,21 @@ _register_port_attr(conf_class_t *devcls, conf_class_t *portcls,
20392040
typedef struct {
20402041
ptrdiff_t port_obj_base_offset;
20412042
const char *attrname;
2042-
get_attr_t get;
2043-
set_attr_t set;
2043+
_get_attr_t get;
2044+
_set_attr_t set;
20442045
void *getset_data;
20452046
uint32 array_size;
20462047
} _port_array_attr_t;
20472048
static attr_value_t
2048-
_get_legacy_proxy_array_attr(lang_void *ptr, conf_object_t *obj,
2049-
attr_value_t *idx)
2049+
_get_legacy_proxy_array_attr(conf_object_t *obj, lang_void *ptr)
20502050
{
2051-
ASSERT(SIM_attr_is_nil(*idx));
20522051
_port_array_attr_t *port = (_port_array_attr_t *)ptr;
20532052
conf_object_t **port_obj_ptr_base = (conf_object_t **)(
20542053
(uintptr_t)obj + port->port_obj_base_offset);
20552054
attr_value_t vals = SIM_alloc_attr_list(port->array_size);
20562055
for (uint32 i = 0; i < port->array_size; i++) {
20572056
conf_object_t *port_obj = port_obj_ptr_base[i];
2058-
attr_value_t val = port->get(port->getset_data, port_obj,
2059-
NULL);
2057+
attr_value_t val = port->get(port_obj, port->getset_data);
20602058
if (SIM_attr_is_invalid(val)) {
20612059
SIM_attr_free(&vals);
20622060
return val;
@@ -2066,10 +2064,9 @@ _get_legacy_proxy_array_attr(lang_void *ptr, conf_object_t *obj,
20662064
return vals;
20672065
}
20682066
static set_error_t
2069-
_set_legacy_proxy_array_attr(lang_void *ptr, conf_object_t *obj,
2070-
attr_value_t *vals, attr_value_t *idx)
2067+
_set_legacy_proxy_array_attr(conf_object_t *obj, attr_value_t *vals,
2068+
lang_void *ptr)
20712069
{
2072-
ASSERT(SIM_attr_is_nil(*idx));
20732070
_port_array_attr_t *port = (_port_array_attr_t *)ptr;
20742071
conf_object_t **port_obj_ptr_base = (conf_object_t **)(
20752072
(uintptr_t)obj + port->port_obj_base_offset);
@@ -2079,8 +2076,7 @@ _set_legacy_proxy_array_attr(lang_void *ptr, conf_object_t *obj,
20792076
set_error_t err;
20802077
if (port->attrname == NULL
20812078
|| SIM_object_is_configured(port_obj)) {
2082-
err = port->set(port->getset_data, port_obj, &val,
2083-
NULL);
2079+
err = port->set(port_obj, &val, port->getset_data);
20842080
} else {
20852081
// port attribute is registered as required; need to
20862082
// propagate value through API call to fulfil
@@ -2100,7 +2096,7 @@ UNUSED static void
21002096
_register_port_array_legacy_proxy_attr(
21012097
conf_class_t *devcls, conf_class_t *portcls, ptrdiff_t port_obj_offset,
21022098
uint32 array_size, bool is_bank, const char *portname,
2103-
const char *attrname, get_attr_t getter, set_attr_t setter,
2099+
const char *attrname, _get_attr_t getter, _set_attr_t setter,
21042100
attr_attr_t attr, const char *type, const char *desc, void *getset_data) {
21052101
_port_array_attr_t *data = MM_MALLOC(1, _port_array_attr_t);
21062102
data->port_obj_base_offset = port_obj_offset;
@@ -2120,12 +2116,12 @@ _register_port_array_legacy_proxy_attr(
21202116
is_bank ? "bank" : "port",
21212117
portname, attrname);
21222118
strbuf_t proxy_type = sb_newf("[%s{%d}]", type, array_size);
2123-
SIM_register_typed_attribute(
2119+
SIM_register_attribute_with_user_data(
21242120
devcls, name,
21252121
getter ? _get_legacy_proxy_array_attr : NULL, data,
21262122
setter ? _set_legacy_proxy_array_attr : NULL, data,
21272123
(attr_attr_t)(Sim_Attr_Pseudo | Sim_Attr_Internal),
2128-
sb_str(&proxy_type), NULL, sb_str(&proxy_desc));
2124+
sb_str(&proxy_type), sb_str(&proxy_desc));
21292125
sb_free(&proxy_type);
21302126
sb_free(&proxy_desc);
21312127
}
@@ -2134,8 +2130,8 @@ UNUSED static void
21342130
_register_port_array_attr(conf_class_t *devcls, conf_class_t *portcls,
21352131
ptrdiff_t port_obj_offset, uint32 array_size,
21362132
bool is_bank, const char *portname,
2137-
const char *attrname, get_attr_t getter,
2138-
set_attr_t setter, attr_attr_t attr,
2133+
const char *attrname, _get_attr_t getter,
2134+
_set_attr_t setter, attr_attr_t attr,
21392135
const char *type, const char *desc) {
21402136
_register_port_attr_no_aux(portcls, attrname, getter, setter, attr, type,
21412137
desc);
@@ -3070,8 +3066,8 @@ _saved_device_member_getter(void *val, uintptr_t acc) {
30703066

30713067

30723068
UNUSED static set_error_t
3073-
_set_saved_variable(lang_void *saved_access, conf_object_t *obj,
3074-
attr_value_t *val, attr_value_t *_) {
3069+
_set_saved_variable(conf_object_t *obj, attr_value_t *val,
3070+
lang_void *saved_access) {
30753071
_saved_userdata_t *acc = (_saved_userdata_t *) saved_access;
30763072

30773073
return _set_device_member(*val,
@@ -3084,8 +3080,7 @@ _set_saved_variable(lang_void *saved_access, conf_object_t *obj,
30843080
}
30853081

30863082
UNUSED static attr_value_t
3087-
_get_saved_variable(lang_void *saved_access, conf_object_t *obj,
3088-
attr_value_t *_) {
3083+
_get_saved_variable(conf_object_t *obj, lang_void *saved_access) {
30893084
_saved_userdata_t *acc = (_saved_userdata_t *) saved_access;
30903085
return _get_device_member((char *)obj + acc->relative_base,
30913086
acc->dimension_sizes,
@@ -3096,8 +3091,8 @@ _get_saved_variable(lang_void *saved_access, conf_object_t *obj,
30963091
}
30973092

30983093
UNUSED static set_error_t
3099-
_set_port_saved_variable(lang_void *saved_access, conf_object_t *_portobj,
3100-
attr_value_t *val, attr_value_t *_) {
3094+
_set_port_saved_variable(conf_object_t *_portobj, attr_value_t *val,
3095+
lang_void *saved_access) {
31013096
_port_object_t *portobj = (_port_object_t *)_portobj;
31023097
conf_object_t *obj = portobj->dev;
31033098
_saved_userdata_t *acc = (_saved_userdata_t *) saved_access;
@@ -3115,8 +3110,7 @@ _set_port_saved_variable(lang_void *saved_access, conf_object_t *_portobj,
31153110
}
31163111

31173112
UNUSED static attr_value_t
3118-
_get_port_saved_variable(lang_void *saved_access, conf_object_t *_portobj,
3119-
attr_value_t *_) {
3113+
_get_port_saved_variable(conf_object_t *_portobj, lang_void *saved_access) {
31203114
_port_object_t *portobj = (_port_object_t *)_portobj;
31213115
conf_object_t *obj = portobj->dev;
31223116
_saved_userdata_t *acc = (_saved_userdata_t *) saved_access;
@@ -3380,12 +3374,8 @@ UNUSED static void _DML_register_attributes(
33803374
const _dml_port_object_assoc_t *port_object_assocs,
33813375
const _vtable_list_t *attribute_vtables, _each_in_t sequence,
33823376
_dml_attr_conf_info_t (*get_attribute_info)(_traitref_t),
3383-
attr_value_t (*get_attr)(void *, conf_object_t *, attr_value_t *),
3384-
set_error_t (*set_attr)(void *, conf_object_t *, attr_value_t *,
3385-
attr_value_t *),
3386-
attr_value_t (*get_portobj_attr)(void *, conf_object_t *, attr_value_t *),
3387-
set_error_t (*set_portobj_attr)(void *, conf_object_t *, attr_value_t *,
3388-
attr_value_t *)) {
3377+
_get_attr_t get_attr, _set_attr_t set_attr,
3378+
_get_attr_t get_portobj_attr, _set_attr_t set_portobj_attr) {
33893379
for (uint32 i = 0; i < sequence.num; ++i) {
33903380
_vtable_list_t list = attribute_vtables[i];
33913381
uint64 num = list.num / sequence.array_size;
@@ -3424,14 +3414,14 @@ UNUSED static void _DML_register_attributes(
34243414
MM_FREE(tmp_type);
34253415
}
34263416
conf_class_t *parent_obj_class = attr_info.parent_obj_class;
3427-
SIM_register_typed_attribute(
3417+
SIM_register_attribute_with_user_data(
34283418
parent_obj_class ? parent_obj_class : dev_class,
34293419
attr_info.name,
34303420
attr_info.readable ? parent_obj_class ? get_portobj_attr : get_attr
34313421
: NULL, attr_get_info,
34323422
attr_info.writable ? parent_obj_class ? set_portobj_attr : set_attr
34333423
: NULL, attr_set_info,
3434-
attr_info.flags, sb_str(&type), NULL, attr_info.doc);
3424+
attr_info.flags, sb_str(&type), attr_info.doc);
34353425

34363426
_dml_attr_parent_obj_proxy_info_t proxy_info = attr_info.proxy_info;
34373427
if (proxy_info.valid) {

lib/1.4/dml-builtins.dml

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -879,16 +879,14 @@ extern typedef struct {
879879
const uint32 *indices;
880880
} _port_object_t;
881881

882-
independent method _get_attribute_attr_trampoline(
883-
void *info, conf_object_t *obj, attr_value_t *_idx)
884-
-> (attr_value_t) {
885-
return (&_get_attribute_attr)(obj, info, 0, 0);
882+
method _get_attribute_attr_trampoline(void *info) -> (attr_value_t) {
883+
return _get_attribute_attr(info, 0, 0);
886884
}
887885

888886
independent method _get_attribute_attr_portobj_trampoline(
889-
void *_info, conf_object_t *_portobj, attr_value_t *_idx)
887+
conf_object_t *_portobj, void *_info)
890888
-> (attr_value_t) {
891-
local _port_object_t *portobj = cast(_portobj, _port_object_t*);
889+
local _port_object_t *portobj = cast(_portobj, _port_object_t *);
892890
local _dml_attr_getset_info_t *info =
893891
cast(_info, _dml_attr_getset_info_t *);
894892
local uint32 flat_index_offset = 0;
@@ -946,16 +944,14 @@ method _get_attribute_attr(const _dml_attr_getset_info_t *_conf_info,
946944
return to_ret;
947945
}
948946

949-
independent method _set_attribute_attr_trampoline(
950-
void *info, conf_object_t *obj, attr_value_t *val, attr_value_t *_idx)
951-
-> (set_error_t) {
952-
return (&_set_attribute_attr)(obj, info, 0, 0, val);
947+
method _set_attribute_attr_trampoline(attr_value_t *val, void *info)
948+
-> (set_error_t) {
949+
return _set_attribute_attr(info, 0, 0, val);
953950
}
954951

955952
independent method _set_attribute_attr_portobj_trampoline(
956-
void *_info, conf_object_t *_portobj, attr_value_t *val,
957-
attr_value_t *_idx) -> (set_error_t) {
958-
local _port_object_t *portobj = cast(_portobj, _port_object_t*);
953+
conf_object_t *_portobj, attr_value_t *val, void *_info) -> (set_error_t) {
954+
local _port_object_t *portobj = cast(_portobj, _port_object_t *);
959955
local _dml_attr_getset_info_t *info = cast(_info,
960956
_dml_attr_getset_info_t *);
961957
local uint32 flat_index_offset = 0;
@@ -1039,12 +1035,10 @@ extern void *_DML_register_attributes(
10391035
conf_class_t *, const _id_info_t *, const _dml_port_object_assoc_t *,
10401036
const _vtable_list_t *, sequence(_conf_attribute),
10411037
_dml_attr_conf_info_t (*)(_conf_attribute),
1042-
attr_value_t (*get)(void *, conf_object_t *, attr_value_t *),
1043-
set_error_t (*set)(void *, conf_object_t *, attr_value_t *,
1044-
attr_value_t *),
1045-
attr_value_t (*port_get)(void *, conf_object_t *, attr_value_t *),
1046-
set_error_t (*port_set)(void *, conf_object_t *, attr_value_t *,
1047-
attr_value_t *));
1038+
attr_value_t (*get)(conf_object_t *, void *),
1039+
set_error_t (*set)(conf_object_t *, attr_value_t *, void *),
1040+
attr_value_t (*port_get)(conf_object_t *, void *),
1041+
set_error_t (*port_set)(conf_object_t *, attr_value_t *, void *));
10481042

10491043
extern const _vtable_list_t *_each___conf_attribute;
10501044
extern const _dml_port_object_assoc_t *_port_object_assocs;

0 commit comments

Comments
 (0)