machine/icd2061a: Fix out of bounds array access (#12207)

* machine/icd2061a: Fix out of bounds array access. Add error messages for unimplemented clock settings
This commit is contained in:
987123879113 2024-04-02 21:21:00 +09:00 committed by GitHub
parent c61a23e0dd
commit 092e75bb07
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -24,11 +24,15 @@
#define LOG_PINS (1 << 1)
#define LOG_STATE (1 << 2)
#define LOG_TODO (1 << 3)
// #define VERBOSE (LOG_GENERAL | LOG_PINS | LOG_STATE)
// #define VERBOSE (LOG_GENERAL | LOG_PINS | LOG_STATE | LOG_TODO)
#define VERBOSE (LOG_TODO)
#include "logmacro.h"
#define LOGTODO(...) LOGMASKED(LOG_TODO, __VA_ARGS__)
DEFINE_DEVICE_TYPE(ICD2061A, icd2061a_device, "icd2061a", "IC Designs 2061A Dual Programmable Graphics Clock Generator")
@ -168,6 +172,8 @@ TIMER_CALLBACK_MEMBER( icd2061a_device::update_clock_callback )
const int m = BIT(m_regs[MREG], 7, 3); // post-vco divisor
const int q = BIT(m_regs[MREG], 0, 7) + 2; // q counter value
m_reg_clocks[MREG] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m);
} else {
LOGTODO("unimplemented mclkout selected %d\n", m_mclkout_select);
}
if (m_reg_clocks[MREG] != m_mclkout_clock) {
@ -189,18 +195,23 @@ TIMER_CALLBACK_MEMBER( icd2061a_device::update_clock_callback )
else if (m_outdis == 1 && m_pwrdwn == 1 && m_sel1 == 1 && (m_intclk == 1 || m_sel0 == 1))
m_vclkout_select = VCLKOUT_REG2;
uint32_t vclkout_clock = m_vclkout_clock;
if (m_vclkout_select == VCLKOUT_FEATCLK) {
m_reg_clocks[m_vclkout_select] = m_featclock;
vclkout_clock = m_featclock;
} else if (m_vclkout_select >= VCLKOUT_REG0 && m_vclkout_select <= VCLKOUT_REG2) {
const int a = BIT(m_regs[m_vclkout_select], 21, 2); // register addr
const int p = BIT(m_regs[m_vclkout_select], 10, 7) + 3; // p counter value
const int m = BIT(m_regs[m_vclkout_select], 7, 3); // post-vco divisor
const int q = BIT(m_regs[m_vclkout_select], 0, 7) + 2; // q counter value
m_reg_clocks[m_vclkout_select] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m);
vclkout_clock = m_reg_clocks[m_vclkout_select] = (clock() * m_prescale[a] * (p / double(q))) / (1 << m);
} else {
LOGTODO("unimplemented vclkout selected %d\n", m_vclkout_select);
}
m_vclkout_changed_cb(m_reg_clocks[m_vclkout_select]);
m_vclkout_clock = m_reg_clocks[m_vclkout_select];
if (vclkout_clock != m_vclkout_clock) {
m_vclkout_clock = vclkout_clock;
m_vclkout_changed_cb(vclkout_clock);
}
}
void icd2061a_device::update_clock()