Skip to content

Commit 3025ea6

Browse files
committed
hw/sd/sdcard: Factor sd_response_size() out
Set @rsplen once before switching to fill the response buffer. This will allow to assert in a single place that the buffer is big enough to be filled with the response. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20250804133406.17456-3-philmd@linaro.org>
1 parent 0a9a273 commit 3025ea6

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

hw/sd/sd.c

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,33 @@ static int sd_req_crc_validate(SDRequest *req)
729729
return sd_crc7(buffer, 5) != req->crc; /* TODO */
730730
}
731731

732+
static size_t sd_response_size(SDState *sd, sd_rsp_type_t rtype)
733+
{
734+
switch (rtype) {
735+
case sd_r1:
736+
case sd_r1b:
737+
return 4;
738+
739+
case sd_r2_i:
740+
case sd_r2_s:
741+
return 16;
742+
743+
case sd_r3:
744+
case sd_r7:
745+
return 4;
746+
747+
case sd_r6:
748+
return 4;
749+
750+
case sd_r0:
751+
case sd_illegal:
752+
return 0;
753+
754+
default:
755+
g_assert_not_reached();
756+
}
757+
}
758+
732759
static void sd_response_r1_make(SDState *sd, uint8_t *response)
733760
{
734761
stl_be_p(response, sd->card_status);
@@ -2203,36 +2230,32 @@ static int sd_do_command(SDState *sd, SDRequest *req,
22032230
}
22042231

22052232
send_response:
2233+
rsplen = sd_response_size(sd, rtype);
2234+
22062235
switch (rtype) {
22072236
case sd_r1:
22082237
case sd_r1b:
22092238
sd_response_r1_make(sd, response);
2210-
rsplen = 4;
22112239
break;
22122240

22132241
case sd_r2_i:
22142242
memcpy(response, sd->cid, sizeof(sd->cid));
2215-
rsplen = 16;
22162243
break;
22172244

22182245
case sd_r2_s:
22192246
memcpy(response, sd->csd, sizeof(sd->csd));
2220-
rsplen = 16;
22212247
break;
22222248

22232249
case sd_r3:
22242250
sd_response_r3_make(sd, response);
2225-
rsplen = 4;
22262251
break;
22272252

22282253
case sd_r6:
22292254
sd_response_r6_make(sd, response);
2230-
rsplen = 4;
22312255
break;
22322256

22332257
case sd_r7:
22342258
sd_response_r7_make(sd, response);
2235-
rsplen = 4;
22362259
break;
22372260

22382261
case sd_r0:
@@ -2244,7 +2267,6 @@ static int sd_do_command(SDState *sd, SDRequest *req,
22442267
sd->data_offset = 0;
22452268
/* fall-through */
22462269
case sd_illegal:
2247-
rsplen = 0;
22482270
break;
22492271
default:
22502272
g_assert_not_reached();

0 commit comments

Comments
 (0)