9d2a1c6a | 04-Jun-2023 |
Andrew Jeffery <andrew@aj.id.au> |
libpldm: Explicit deprecated, stable and testing ABI classes
Experimenting with new APIs is important, but ABI stability of the library is also important. We wish to have the freedom to add APIs wit
libpldm: Explicit deprecated, stable and testing ABI classes
Experimenting with new APIs is important, but ABI stability of the library is also important. We wish to have the freedom to add APIs without being burdened by them being immediately set in stone.
We implement this wish by introducing three classes of ABI:
1. deprecated 2. stable 3. testing
These are enforced by corresponding function attributes:
1. LIBPLDM_ABI_DEPRECATED 2. LIBPLDM_ABI_STABLE 3. LIBPLDM_ABI_TESTING
Symbol visibility in the library is flipped to 'hidden' by default, so one of these annotations must be used for the symbol to be exposed.
With these classes in place there are now clear points in time at which we update the ABI dumps captured under the abi/ directory: When an API is migrated from the 'testing' class to the 'stable' class, or when removed from the 'deprecated' class.
Which classes of functions are exposed by the build is controlled by the new 'abi' meson option. The option is of array type which contains the list of ABI classes the build should consider. It defaults to enabling all classes to provide test coverage in CI. The classes used should be constrained to deprecated and stable (and not test) in any dependent projects.
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I25402e20c7be9c9f264f9ccd7ac36b384823734c
show more ...
|
55e5e0a0 | 04-Jun-2023 |
Andrew Jeffery <andrew@aj.id.au> |
libpldm: Remove the requester-api option
Let's not have more opportunities to mangle the ABI than we need. This option was never explicitly set one way or the other in the OpenBMC Github organisatio
libpldm: Remove the requester-api option
Let's not have more opportunities to mangle the ABI than we need. This option was never explicitly set one way or the other in the OpenBMC Github organisation. Remove it, and always expose the associated symbols.
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I2d73c85ee1fe3c9b2f851bb63065111d68c57821
show more ...
|
57de5fce | 04-Jun-2023 |
Andrew Jeffery <andrew@aj.id.au> |
include: Sort file lists in meson.build
Maintain sanity when working with the lists.
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I8923f3db59f9ddf1e0a1d6f4333c0f3ada476340 |
b01fb1cc | 27-May-2023 |
Thu Nguyen <thu@os.amperecomputing.com> |
transport: Match on response in pldm_transport_send_recv_msg()
pldm_send_recv() does not verify the corrected match of a PLDM response message with the request message by comparing the Instance ID a
transport: Match on response in pldm_transport_send_recv_msg()
pldm_send_recv() does not verify the corrected match of a PLDM response message with the request message by comparing the Instance ID as pldm_recv(). This will cause the PLDM command of the pldmtool receives the response message of the other PLDM command from other services. The pldm_transport_send_recv_msg() which is called by pldm_send_recv() method should check the Instance ID of the response to verify the match.
Tested:
1. Run pldmtool while pldmd service continuously polls multiple pldm sensors. 2. The pldmtool should not be failed with PLDM_ERROR_INVALID_LENGTH error.
Signed-off-by: Thu Nguyen <thu@os.amperecomputing.com> Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I491db086cf2a0dff1981f2959d1dab936d46d2db
show more ...
|
5aa765a0 | 24-May-2023 |
Andrew Jeffery <andrew@aj.id.au> |
transport: Document the parameters to pldm_transport_poll()
The behaviour of the timeout value was under-specified. The behaviour is as for POSIX poll(2), but make it concrete that users of the API
transport: Document the parameters to pldm_transport_poll()
The behaviour of the timeout value was under-specified. The behaviour is as for POSIX poll(2), but make it concrete that users of the API can expect that behaviour.
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: Ic2fa470000e347c96c92285dbdee507ef04f1675
show more ...
|
7c250340 | 16-Nov-2022 |
Dung Cao <dung@os.amperecomputing.com> |
Add encode/decode pldmMessagePollEvent data
The API decodes/encodes eventData fields for pldmMessagePollEvent type (section 16.15) of PlatformEventMessage command(0xA) which is defined in DSP0248 Ve
Add encode/decode pldmMessagePollEvent data
The API decodes/encodes eventData fields for pldmMessagePollEvent type (section 16.15) of PlatformEventMessage command(0xA) which is defined in DSP0248 Version 1.2.2.
Signed-off-by: Dung Cao <dung@os.amperecomputing.com> Signed-off-by: Thu Nguyen <thu@os.amperecomputing.com> Change-Id: I1934792f0ce8f339ee04c4bae0c65e3973ed38b4
show more ...
|
b443b487 | 22-May-2023 |
Rashmica Gupta <rashmica@linux.ibm.com> |
include: Move installed transport.h under libpldm/
The in-tree location for the header is `${includedir}/libpldm/transport.h`. Make the installed location equivalent so we don't have an inconsistenc
include: Move installed transport.h under libpldm/
The in-tree location for the header is `${includedir}/libpldm/transport.h`. Make the installed location equivalent so we don't have an inconsistency. Nothing is yet using this header file so it's not quite an API break.
Change-Id: Ib071e8587908ad47e0699ee1cc13553edd240428 Signed-off-by: Rashmica Gupta <rashmica@linux.ibm.com>
show more ...
|
37dd6a3d | 12-May-2023 |
Andrew Jeffery <andrew@aj.id.au> |
clang-format: copy latest and re-format
clang-format-16 has some backwards incompatible changes that require additional settings for best compatibility and re-running the formatter. Copy the latest
clang-format: copy latest and re-format
clang-format-16 has some backwards incompatible changes that require additional settings for best compatibility and re-running the formatter. Copy the latest .clang-format from the docs repository[1] and reformat the repository.
[1] https://gerrit.openbmc.org/c/openbmc/docs/+/63441
Further, shift the fixup for C's `_Static_assert` into src/msgbuf.h to prevent a clang-tidy-16 error:
``` /data0/jenkins/workspace/ci-repository/openbmc/libpldm/src/msgbuf.h:315:2: error: '_Static_assert' is a C11 extension [clang-diagnostic-c11-extensions,-warnings-as-errors] _Static_assert(sizeof(*dst) == sizeof(ldst), ^ ```
And fix up the function prototype in the definition of `pldm_open()`:
``` ../src/requester/pldm.c:128:16: error: a function declaration without a prototype is deprecated in all versions of C [clang-diagnostic-strict-prototypes,-warnings-as-errors] void pldm_close() ^ void ```
Change-Id: I57b53f51914e39237e733d024e62ab41b3d306c1 Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
show more ...
|
8eb20f28 | 16-Nov-2022 |
Thu Nguyen <thu@os.amperecomputing.com> |
responder: Add PollForPlatformEventMessage APIs
Added APIs to encode/decode PollForPlatformEventMessage command(0x0B) which is defined in DSP0248 Version 1.2.2 sec:16.7.
Signed-off-by: Dung Cao <du
responder: Add PollForPlatformEventMessage APIs
Added APIs to encode/decode PollForPlatformEventMessage command(0x0B) which is defined in DSP0248 Version 1.2.2 sec:16.7.
Signed-off-by: Dung Cao <dung@os.amperecomputing.com> Signed-off-by: Thu Nguyen <thu@os.amperecomputing.com> Change-Id: Ic4a91625c9e30b49a9a3ea99755dffff2c667ca8
show more ...
|
159a98ba | 01-Nov-2022 |
Thu Nguyen <thu@os.amperecomputing.com> |
requester: Add PollForPlatformEventMessage APIs
Added encode/decode APIs for PollForPlatformEventMessage command(0x0B) which is defined in DSP0248 Version 1.2.1 sec:16.7.
Signed-off-by: Thu Nguyen
requester: Add PollForPlatformEventMessage APIs
Added encode/decode APIs for PollForPlatformEventMessage command(0x0B) which is defined in DSP0248 Version 1.2.1 sec:16.7.
Signed-off-by: Thu Nguyen <thu@os.amperecomputing.com> Signed-off-by: Dung Cao <dung@os.amperecomputing.com> Change-Id: I0a707256d0ff6133d48a384dc252bce736b802f7
show more ...
|
3a6a001b | 18-Oct-2022 |
Varsha Kaverappa <vkaverap@in.ibm.com> |
oem-ibm : Define file type for new VPD record consumed by host via PLDM
This commit defines file type to handle new VPD record to be handled by PLDM. The new VPD record data is transfered through fi
oem-ibm : Define file type for new VPD record consumed by host via PLDM
This commit defines file type to handle new VPD record to be handled by PLDM. The new VPD record data is transfered through file I/O operation to host and this file type will be used in the PLDM request command to identify file operation for PSPD data.
Signed-off-by: Varsha Kaverappa <vkaverap@in.ibm.com> Change-Id: Id8e2a85942bcd1ee9a1c39f913eac3ddc9c9b666
show more ...
|
c8d1a1a1 | 16-Feb-2023 |
Varsha Kaverappa <vkaverap@in.ibm.com> |
oem-ibm : Adding file types for Dump, PCIE and other functionalities
This commits includes files types for Dump file I/O functionalities. Also contains file types for cable and PCIE topology. These
oem-ibm : Adding file types for Dump, PCIE and other functionalities
This commits includes files types for Dump file I/O functionalities. Also contains file types for cable and PCIE topology. These file types are required to identify the file request and response commands and channel them to specific file I/O operations
Change-Id: I474e0ac6522a45ef847fbadb08fc18dee28ed3c7 Signed-off-by: Varsha Kaverappa <vkaverap@in.ibm.com>
show more ...
|
a918a628 | 21-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
include: Move instance-id.h under libpldm/
The installed location for the header is `${includedir}/libpldm/instance-id.h`. Make the in-tree location equivalent so we don't have a slightly jarring in
include: Move instance-id.h under libpldm/
The installed location for the header is `${includedir}/libpldm/instance-id.h`. Make the in-tree location equivalent so we don't have a slightly jarring inconsistency.
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I9c1f324e18ba504261845187e88e35db0d8ef873
show more ...
|
3884c44d | 11-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
platform: pldm_msgbuf for decode_set_numeric_effecter_value_req()
Also, make it at least possible to detect incorrect use of the API by declaring `effecter_value` as a fixed-size array of 4. Misuse
platform: pldm_msgbuf for decode_set_numeric_effecter_value_req()
Also, make it at least possible to detect incorrect use of the API by declaring `effecter_value` as a fixed-size array of 4. Misuse is detected by -Wstringop-overflow with `gcc`, however failure to uphold the requirement is ignored by `g++`, and both `clang` and `clang++`.
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I5769db4d3c812d7feef994de836a8621fb4bf3cf
show more ...
|
ba6971b9 | 08-Dec-2022 |
Rashmica Gupta <rashmica@linux.ibm.com> |
requester: Add af_mctp transport
Change-Id: I97641973fb85070876c11003a9758faa707f4a46 Signed-off-by: Rashmica Gupta <rashmica@linux.ibm.com> |
c1b66f42 | 08-Dec-2022 |
Rashmica Gupta <rashmica@linux.ibm.com> |
requester: Add new APIs to support multiple transports
This patch has two goals: (1) enable consumers to send PLDM messages over different transports and (2) do this in a way that allows us to move
requester: Add new APIs to support multiple transports
This patch has two goals: (1) enable consumers to send PLDM messages over different transports and (2) do this in a way that allows us to move towards a cleaner and more complete set of requester APIs.
The sole transport option of MCTP via the userspace mctp-demux-daemon is being deprecated. New transports are being added: MCTP via the kernel (AF_MCTP) and eventually NC-SI. As such, the requester APIs need updating to support multiple transports, as well as not having MCTP specific details in the APIs. To avoid a flag day, the current APIs (pldm_send, etc) have been rewritten terms of the new APIs.
The current APIs operate at the transport level - they don't implement all of the behaviour necessary for a requester. As such, the new APIs to send/recv a message have the prefix `pldm_transport`, rather than `pldm_requester`. Given the level that these APIs are operating at, these only send and receive a PLDM message. Any additional logic, such as looking for a response with a particular instance ID, belongs at the requester abstraction level.
Some of the missing behaviours to fully be a PLDM requester are: assigning instance IDs, request retransmission, implementing timeouts, and enforcing only one PLDM request to a specific TID at a time. These things are currently implemented in pldmd, meaning any consumer other than pldmd using the libpldm "requester" APIs doesn't get the full functionality of a requester and has to implement these things themselves.
We would like to eventually move these behaviours into libpldm so the libpldm requester APIs actually implement what is required to be a PLDM requester.
The next steps to add in a full set of requester APIs, while enabling the use of multiple transports looks something like this:
1) add instance id APIs into libpldm. 2) convert pldmd to use libpldm instance id APIs - so all users of PLDM are still using the same instance id allocation method. 3) convert all consumers of libpldm over to using the new libpldm APIs, including the instance id functions. 4) add in the AF_MCTP transport and move consumers over to it. 5) refactor the encode/decode functions to only encode/decode and not frame the message (ie, remove the instance id from these functions) 6) add additional requester functionality into libpldm, and have these use the `pldm_transport` APIs directly. 7) move consumers over to the new `pldm_requester` APIs. 8) remove unused code from pldmd.
Signed-off-by: Rashmica Gupta <rashmica@linux.ibm.com> Change-Id: I06e602831f360bbd0efda53d410bfb5080b3100d
show more ...
|
36af84cd | 12-Apr-2023 |
Rashmica Gupta <rashmica@linux.ibm.com> |
requester: Add new APIs for instance ID allocation and freeing
This patch starts the move of instance id handling into libpldm. Currently pldmd allocates instance ids, and exposes a DBus call for ex
requester: Add new APIs for instance ID allocation and freeing
This patch starts the move of instance id handling into libpldm. Currently pldmd allocates instance ids, and exposes a DBus call for external apps to get instance ids. It relies on exploiting a behaviour of mctp-demux to reclaim used ids by monitoring all incoming PLDM responses. When moving to AF_MCTP, PLDM messages are not broadcast to all PLDM sockets, and so this method of reclaiming ids won't work automatically.
As instance id handling is moving into libpldm eventually, we may as well do that now rather than adding an additional step to address this issue. So an allocate and free function for instance ids is added in this patch. As this implementation uses file locking, we have the feature of any ids belonging to a process that dies being automatically reclaimed into the id pool.
Some context behind the file based range locking design for instance IDs can be found here: https://amboar.github.io/notes/2023/03/28/motivating-a-new-scheme-for-pldm-instance-id-management-in-openbmc.html and https://amboar.github.io/notes/2023/03/29/a-global-pldm-instance-id-allocator-for-libpldm.html
Change-Id: Ia19870b1bcae9e614bda6e475b290faa0b327a73 Signed-off-by: Rashmica Gupta <rashmica@linux.ibm.com>
show more ...
|
7992eb84 | 06-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
Add numeric sensor PDR and sensor aux names PDR
1. Added struct for numeric sensor PDR in DSP0248_1.2.2 table78 and decode_numeric_sensor_pdr_data API to unpack pdr data to struct 2. Added struct fo
Add numeric sensor PDR and sensor aux names PDR
1. Added struct for numeric sensor PDR in DSP0248_1.2.2 table78 and decode_numeric_sensor_pdr_data API to unpack pdr data to struct 2. Added struct for sensor auxiliary names PDR in DSP0248_1.2.2 table83
Signed-off-by: Gilbert Chen <gilbertc@nvidia.com> Change-Id: I11d25ee7da8326a5f5fe2c8a237ac014882e436e
show more ...
|
2a38ab51 | 06-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
pdr: Fix doxygen on pldm_pdr_remove_pdrs_by_terminus_handle()
This was missed as part of the series fixing the code-base to enable clang-tidy.
Fixes: 6005f1c87fdd ("clang-tidy: Fix readability-iden
pdr: Fix doxygen on pldm_pdr_remove_pdrs_by_terminus_handle()
This was missed as part of the series fixing the code-base to enable clang-tidy.
Fixes: 6005f1c87fdd ("clang-tidy: Fix readability-identifier-naming diagnostic") Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I9d3f9433474c34bb9d78f336f6eb04649a43190c
show more ...
|
debe6b3f | 05-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
clang-tidy: Fix readability-non-const-parameter diagnostic
For example:
``` /usr/bin/clang-tidy -checks=-*, readability-non-const-parameter -export-fixes /tmp/tmpsuucvvf6/tmpe3yk5vmj.yaml -p=build
clang-tidy: Fix readability-non-const-parameter diagnostic
For example:
``` /usr/bin/clang-tidy -checks=-*, readability-non-const-parameter -export-fixes /tmp/tmpsuucvvf6/tmpe3yk5vmj.yaml -p=build /mnt/host/andrew/src/openbmc/libpldm/src/platform.c /mnt/host/andrew/src/openbmc/libpldm/build/../src/platform.c:594:14: error: pointer parameter 'effecter_value' can be pointer to const [readability-non-const-parameter,-warnings-as-errors] uint8_t *effecter_value, struct pldm_msg *msg, size_t payload_length) ^ const ```
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I7dbcb94b4ab68f24407fcca1a09e8cc3ab0593b8
show more ...
|
9145a414 | 05-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
clang-tidy: Fix readability-inconsistent-declaration-parameter-name
For example
``` /usr/bin/clang-tidy -checks=-*, readability-inconsistent-declaration-parameter-name -export-fixes /tmp/tmpy4skh98
clang-tidy: Fix readability-inconsistent-declaration-parameter-name
For example
``` /usr/bin/clang-tidy -checks=-*, readability-inconsistent-declaration-parameter-name -export-fixes /tmp/tmpy4skh98o/tmpwv373mwe.yaml -p=build /mnt/host/andrew/src/openbmc/libpldm/src/bios.c ../include/libpldm/bios.h:258:5: error: function 'encode_set_bios_attribute_current_value_req' has a definition with different parameter names [readability-inconsistent-declaration-parameter-name,-warnings-as-errors] int encode_set_bios_attribute_current_value_req( ^ ../src/bios.c:449:5: note: the definition seen here int encode_set_bios_attribute_current_value_req( ^ /mnt/host/andrew/src/openbmc/libpldm/build/../include/libpldm/bios.h:258:5: note: differing parameters are named here: ('payload_length'), in definition: ('payload_lenth') int encode_set_bios_attribute_current_value_req( ^ ```
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: Ia49183168619867709807507028e34a12cbdb937
show more ...
|
6005f1c8 | 05-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
clang-tidy: Fix readability-identifier-naming diagnostic
For example:
``` /usr/bin/clang-tidy -checks=-*, readability-identifier-naming -export-fixes /tmp/tmpsjbxtnss/tmpbj5pbywt.yaml -p=build /mnt
clang-tidy: Fix readability-identifier-naming diagnostic
For example:
``` /usr/bin/clang-tidy -checks=-*, readability-identifier-naming -export-fixes /tmp/tmpsjbxtnss/tmpbj5pbywt.yaml -p=build /mnt/host/andrew/src/openbmc/libpldm/src/platform.c /mnt/host/andrew/src/openbmc/libpldm/build/../include/libpldm/pdr.h:166:6: error: invalid case style for function 'pldm_pdr_update_TL_pdr' [readability-identifier-naming,-warnings-as-errors] void pldm_pdr_update_TL_pdr(const pldm_pdr *repo, uint16_t terminusHandle, ^~~~~~~~~~~~~~~~~~~~~~ pldm_pdr_update_tl_pdr /mnt/host/andrew/src/openbmc/libpldm/build/../include/libpldm/pdr.h:166:60: error: invalid case style for parameter 'terminusHandle' [readability-identifier-naming,-warnings-as-errors] void pldm_pdr_update_TL_pdr(const pldm_pdr *repo, uint16_t terminusHandle, ^~~~~~~~~~~~~~ terminus_handle /mnt/host/andrew/src/openbmc/libpldm/build/../include/libpldm/pdr.h:167:29: error: invalid case style for parameter 'tlEid' [readability-identifier-naming,-warnings-as-errors] uint8_t tid, uint8_t tlEid, bool valid); ^~~~~ tl_eid ```
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I6419dade685ee656fe773451148f15aefb20becd
show more ...
|
4edb7080 | 05-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
clang-tidy: Fix bugprone-reserved-identifier
For example:
``` /usr/bin/clang-tidy -checks=-*, bugprone-reserved-identifier -export-fixes /tmp/tmpzm__u6tl/tmpcmikv8op.yaml -p=build /mnt/host/andrew/
clang-tidy: Fix bugprone-reserved-identifier
For example:
``` /usr/bin/clang-tidy -checks=-*, bugprone-reserved-identifier -export-fixes /tmp/tmpzm__u6tl/tmpcmikv8op.yaml -p=build /mnt/host/andrew/src/openbmc/libpldm/src/pdr.c /mnt/host/andrew/src/openbmc/libpldm/build/../src/pdr.c:605:13: error: declaration uses identifier '_entity_association_pdr_add_entry', which is reserved in the global namespace [bugprone-reserved-identifier,-warnings-as-errors] static void _entity_association_pdr_add_entry(pldm_entity_node *curr, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ entity_association_pdr_add_entry ```
In the case of header guard macros, prefix them with `LIBPLDM_` and drop the trailing `__`.
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: I74809142cc428d2c014e0f7ba43e02d9a229eee2
show more ...
|
0a05b128 | 04-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
clang-tidy: Fix bugprone-macro-parentheses diagnostics
Example output:
``` /usr/bin/clang-tidy -checks=-*, bugprone-macro-parentheses -export-fixes /tmp/tmpemqa5szx/tmph_piz_ci.yaml -p=build /mnt/h
clang-tidy: Fix bugprone-macro-parentheses diagnostics
Example output:
``` /usr/bin/clang-tidy -checks=-*, bugprone-macro-parentheses -export-fixes /tmp/tmpemqa5szx/tmph_piz_ci.yaml -p=build /mnt/host/andrew/src/openbmc/libpldm/src/base.c /mnt/host/andrew/src/openbmc/libpldm/build/../include/libpldm/base.h:137:21: error: macro argument should be enclosed in parentheses [bugprone-macro-parentheses,-warnings-as-errors] ^ () ```
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: Id12338430a328436d57d6560db1d3a1c53001b83
show more ...
|
319304fd | 04-Apr-2023 |
Andrew Jeffery <andrew@aj.id.au> |
clang-tidy: Fix clang-diagnostic-strict-prototypes diagnostics
Produces output such as:
``` /usr/bin/clang-tidy -checks=-*, bugprone-branch-clone -export-fixes /tmp/tmpjjns4w4i/tmp2vh08b10.yaml -p=
clang-tidy: Fix clang-diagnostic-strict-prototypes diagnostics
Produces output such as:
``` /usr/bin/clang-tidy -checks=-*, bugprone-branch-clone -export-fixes /tmp/tmpjjns4w4i/tmp2vh08b10.yaml -p=build /mnt/host/andrew/src/openbmc/libpldm/src/platform.c /mnt/host/andrew/src/openbmc/libpldm/build/../include/libpldm/pdr.h:35:24: error: a function declaration without a prototype is deprecated in all versions of C [clang-diagnostic-strict-prototypes] pldm_pdr *pldm_pdr_init(); ^ void ```
Signed-off-by: Andrew Jeffery <andrew@aj.id.au> Change-Id: Ib9b679682cc25b8c1b294d2be856031f77d755d9
show more ...
|