| 231 | } |
| 232 | |
| 233 | void execute(vuart_av_thread &vuart, const void *pkt_buf) override { |
| 234 | const auto pkt = static_cast<const ps3av_pkt_get_bksv *>(pkt_buf); |
| 235 | |
| 236 | if (vuart.get_reply_buf_free_size() < sizeof(ps3av_pkt_reply_hdr)) { |
| 237 | vuart.write_resp(pkt->hdr.cid, PS3AV_STATUS_BUFFER_OVERFLOW); |
| 238 | return; |
| 239 | } |
| 240 | |
| 241 | if (pkt->avport > static_cast<u16>(UartAudioAvport::HDMI_1)) { |
| 242 | vuart.write_resp(pkt->hdr.cid, PS3AV_STATUS_INVALID_PORT); |
| 243 | return; |
| 244 | } |
| 245 | |
| 246 | if (pkt->avport == static_cast<u16>(UartAudioAvport::HDMI_1) && |
| 247 | !g_cfg.core.debug_console_mode) { |
| 248 | vuart.write_resp<true>(pkt->hdr.cid, |
| 249 | PS3AV_STATUS_SYSCON_COMMUNICATE_FAIL); |
| 250 | return; |
| 251 | } |
| 252 | |
| 253 | ps3av_pkt_get_bksv_reply reply{}; |
| 254 | reply.avport = pkt->avport; |
| 255 | u16 pkt_size = offsetof(ps3av_pkt_get_bksv_reply, ksv_arr); |
| 256 | |
| 257 | if (vuart.hdmi_behavior_mode == PS3AV_HDMI_BEHAVIOR_NORMAL || |
| 258 | !(vuart.hdmi_behavior_mode & PS3AV_HDMI_BEHAVIOR_HDCP_OFF)) { |
| 259 | reply.ksv_cnt = 1; |
| 260 | memcpy(reply.ksv_arr[0], PS3AV_BKSV_VALUE, sizeof(PS3AV_BKSV_VALUE)); |
| 261 | pkt_size = (pkt_size + 5 * reply.ksv_cnt + 3) & 0xFFFC; |
| 262 | } |
| 263 | |
| 264 | vuart.write_resp<true>(pkt->hdr.cid, PS3AV_STATUS_SUCCESS, &reply, |
| 265 | pkt_size); |
| 266 | } |
| 267 | }; |
| 268 | |
| 269 | struct av_enable_event_cmd : public ps3av_cmd { |
nothing calls this directly
no test coverage detected