mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
hw/misc/aspeed_hace: Extract accumulation-mode hash execution into helper function
To improve code readability and maintainability of do_hash_operation(), this commit introduces a new helper function: hash_execute_acc_mode(). This function encapsulates the full flow for accumulation mode, including context initialization, update, conditional finalization, and digest writeback with I/O vector unmapping. No functional changes are introduced. Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Link: https://lore.kernel.org/qemu-devel/20250515081008.583578-9-jamin_lin@aspeedtech.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
02c4c44846
commit
b9ccbe212e
1 changed files with 41 additions and 33 deletions
|
@ -267,26 +267,57 @@ static void hash_execute_non_acc_mode(AspeedHACEState *s, int algo,
|
||||||
hash_write_digest_and_unmap_iov(s, iov, iov_idx, digest_buf, digest_len);
|
hash_write_digest_and_unmap_iov(s, iov, iov_idx, digest_buf, digest_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode,
|
static void hash_execute_acc_mode(AspeedHACEState *s, int algo,
|
||||||
bool acc_mode)
|
struct iovec *iov, int iov_idx,
|
||||||
|
bool final_request)
|
||||||
{
|
{
|
||||||
g_autofree uint8_t *digest_buf = NULL;
|
g_autofree uint8_t *digest_buf = NULL;
|
||||||
struct iovec iov[ASPEED_HACE_MAX_SG];
|
|
||||||
bool acc_final_request = false;
|
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
size_t digest_len = 0;
|
size_t digest_len = 0;
|
||||||
int iov_idx = -1;
|
|
||||||
|
|
||||||
if (acc_mode && s->hash_ctx == NULL) {
|
if (s->hash_ctx == NULL) {
|
||||||
s->hash_ctx = qcrypto_hash_new(algo, &local_err);
|
s->hash_ctx = qcrypto_hash_new(algo, &local_err);
|
||||||
if (s->hash_ctx == NULL) {
|
if (s->hash_ctx == NULL) {
|
||||||
qemu_log_mask(LOG_GUEST_ERROR, "qcrypto hash failed : %s",
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: qcrypto hash new failed : %s",
|
||||||
error_get_pretty(local_err));
|
__func__, error_get_pretty(local_err));
|
||||||
error_free(local_err);
|
error_free(local_err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (qcrypto_hash_updatev(s->hash_ctx, iov, iov_idx, &local_err) < 0) {
|
||||||
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: qcrypto hash updatev failed : %s",
|
||||||
|
__func__, error_get_pretty(local_err));
|
||||||
|
error_free(local_err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (final_request) {
|
||||||
|
if (qcrypto_hash_finalize_bytes(s->hash_ctx, &digest_buf,
|
||||||
|
&digest_len, &local_err)) {
|
||||||
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
|
"%s: qcrypto hash finalize bytes failed : %s",
|
||||||
|
__func__, error_get_pretty(local_err));
|
||||||
|
error_free(local_err);
|
||||||
|
local_err = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
qcrypto_hash_free(s->hash_ctx);
|
||||||
|
|
||||||
|
s->hash_ctx = NULL;
|
||||||
|
s->total_req_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash_write_digest_and_unmap_iov(s, iov, iov_idx, digest_buf, digest_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode,
|
||||||
|
bool acc_mode)
|
||||||
|
{
|
||||||
|
struct iovec iov[ASPEED_HACE_MAX_SG];
|
||||||
|
bool acc_final_request = false;
|
||||||
|
int iov_idx = -1;
|
||||||
|
|
||||||
/* Prepares the iov for hashing operations based on the selected mode */
|
/* Prepares the iov for hashing operations based on the selected mode */
|
||||||
if (sg_mode) {
|
if (sg_mode) {
|
||||||
iov_idx = hash_prepare_sg_iov(s, iov, acc_mode, &acc_final_request);
|
iov_idx = hash_prepare_sg_iov(s, iov, acc_mode, &acc_final_request);
|
||||||
|
@ -300,32 +331,9 @@ static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Executes the hash operation */
|
||||||
if (acc_mode) {
|
if (acc_mode) {
|
||||||
if (qcrypto_hash_updatev(s->hash_ctx, iov, iov_idx, &local_err) < 0) {
|
hash_execute_acc_mode(s, algo, iov, iov_idx, acc_final_request);
|
||||||
qemu_log_mask(LOG_GUEST_ERROR, "qcrypto hash update failed : %s",
|
|
||||||
error_get_pretty(local_err));
|
|
||||||
error_free(local_err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (acc_final_request) {
|
|
||||||
if (qcrypto_hash_finalize_bytes(s->hash_ctx, &digest_buf,
|
|
||||||
&digest_len, &local_err)) {
|
|
||||||
qemu_log_mask(LOG_GUEST_ERROR,
|
|
||||||
"qcrypto hash finalize failed : %s",
|
|
||||||
error_get_pretty(local_err));
|
|
||||||
error_free(local_err);
|
|
||||||
local_err = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
qcrypto_hash_free(s->hash_ctx);
|
|
||||||
|
|
||||||
s->hash_ctx = NULL;
|
|
||||||
s->total_req_len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
hash_write_digest_and_unmap_iov(s, iov, iov_idx, digest_buf,
|
|
||||||
digest_len);
|
|
||||||
} else {
|
} else {
|
||||||
hash_execute_non_acc_mode(s, algo, iov, iov_idx);
|
hash_execute_non_acc_mode(s, algo, iov, iov_idx);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue