From 5a2348c68f9a0f1fd110ddd4df9fdd441bda3472 Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Sun, 5 Feb 2023 07:45:39 -0500 Subject: [PATCH 01/29] qt: hdd fields should not be editable in settings view --- src/qt/qt_settingsharddisks.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qt/qt_settingsharddisks.ui b/src/qt/qt_settingsharddisks.ui index b5ab110c9..ef351e5e7 100644 --- a/src/qt/qt_settingsharddisks.ui +++ b/src/qt/qt_settingsharddisks.ui @@ -28,6 +28,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection From b67c3c41e15ba4357d248b7f2e79118a57bb76aa Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 5 Feb 2023 17:16:53 +0100 Subject: [PATCH 02/29] Fixed (S)VGA timings, according to tests by Sergi. --- src/video/vid_svga.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 8b61bf395..704c6f612 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -455,7 +455,8 @@ svga_recalctimings(svga_t *svga) svga->hdisp++; svga->htotal = svga->crtc[0]; - svga->htotal += 6; /*+6 is required for Tyrian*/ + /* +5 has been verified by Sergi to be correct - +6 must have been an off by one error. */ + svga->htotal += 5; /*+6 is required for Tyrian*/ svga->rowoffset = svga->crtc[0x13]; From 6655d2d498ebeafc3b171a8b8a97f41997510ffb Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 5 Feb 2023 17:22:13 +0100 Subject: [PATCH 03/29] Removed an unused variable from the SiS 85c50x code. --- src/chipset/sis_85c50x.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/chipset/sis_85c50x.c b/src/chipset/sis_85c50x.c index 8d7222d54..247ff1b96 100644 --- a/src/chipset/sis_85c50x.c +++ b/src/chipset/sis_85c50x.c @@ -136,7 +136,6 @@ static void sis_85c50x_write(int func, int addr, uint8_t val, void *priv) { sis_85c50x_t *dev = (sis_85c50x_t *) priv; - uint8_t valxor = (val ^ dev->pci_conf[addr]); sis_85c50x_log("85C501: [W] (%02X, %02X) = %02X\n", func, addr, val); @@ -192,8 +191,6 @@ sis_85c50x_write(int func, int addr, uint8_t val, void *priv) break; case 0x5b: dev->pci_conf[addr] = val; - // if (valxor & 0xc0) - // port_92_set_features(dev->port_92, !!(val & 0x40), !!(val & 0x80)); break; case 0x60: /* SMI */ if ((dev->pci_conf[0x68] & 0x01) && !(dev->pci_conf[addr] & 0x02) && (val & 0x02)) { From c809f482d57a96ff0c4f9cee526f3cafc6110f54 Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Sun, 5 Feb 2023 12:12:37 -0500 Subject: [PATCH 04/29] qt: Fixes to the process for selecting an existing hdd image --- src/qt/qt_filefield.cpp | 2 +- src/qt/qt_filefield.hpp | 2 +- src/qt/qt_harddiskdialog.cpp | 76 +++++++++++++++++++----------------- src/qt/qt_harddiskdialog.hpp | 2 +- 4 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/qt/qt_filefield.cpp b/src/qt/qt_filefield.cpp index 9bdb6cd7f..b6db5e611 100644 --- a/src/qt/qt_filefield.cpp +++ b/src/qt/qt_filefield.cpp @@ -29,7 +29,7 @@ FileField::FileField(QWidget *parent) connect(ui->label, &QLineEdit::editingFinished, this, [this]() { fileName_ = ui->label->text(); - emit fileSelected(ui->label->text()); + emit fileSelected(ui->label->text(), true); }); this->setFixedWidth(this->sizeHint().width() + ui->pushButton->sizeHint().width()); } diff --git a/src/qt/qt_filefield.hpp b/src/qt/qt_filefield.hpp index 8520e3e57..ee011a38b 100644 --- a/src/qt/qt_filefield.hpp +++ b/src/qt/qt_filefield.hpp @@ -24,7 +24,7 @@ public: bool createFile() { return createFile_; } signals: - void fileSelected(const QString &fileName); + void fileSelected(const QString &fileName, bool precheck = false); private slots: void on_pushButton_clicked(); diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp index 943b13dc0..e8ccccd6f 100644 --- a/src/qt/qt_harddiskdialog.cpp +++ b/src/qt/qt_harddiskdialog.cpp @@ -51,6 +51,40 @@ HarddiskDialog::HarddiskDialog(bool existing, QWidget *parent) { ui->setupUi(this); + auto *model = ui->comboBoxFormat->model(); + model->insertRows(0, 6); + model->setData(model->index(0, 0), tr("Raw image (.img)")); + model->setData(model->index(1, 0), tr("HDI image (.hdi)")); + model->setData(model->index(2, 0), tr("HDX image (.hdx)")); + model->setData(model->index(3, 0), tr("Fixed-size VHD (.vhd)")); + model->setData(model->index(4, 0), tr("Dynamic-size VHD (.vhd)")); + model->setData(model->index(5, 0), tr("Differencing VHD (.vhd)")); + + model = ui->comboBoxBlockSize->model(); + model->insertRows(0, 2); + model->setData(model->index(0, 0), tr("Large blocks (2 MB)")); + model->setData(model->index(1, 0), tr("Small blocks (512 KB)")); + + ui->comboBoxBlockSize->hide(); + ui->labelBlockSize->hide(); + + Harddrives::populateBuses(ui->comboBoxBus->model()); + ui->comboBoxBus->setCurrentIndex(3); + + model = ui->comboBoxType->model(); + for (int i = 0; i < 127; i++) { + uint64_t size = ((uint64_t) hdd_table[i][0]) * hdd_table[i][1] * hdd_table[i][2]; + uint32_t size_mb = size >> 11LL; + // QString text = QString("%1 MiB (CHS: %2, %3, %4)").arg(size_mb).arg(hdd_table[i][0]).arg(hdd_table[i][1]).arg(hdd_table[i][2]); + QString text = QString::asprintf(tr("%u MB (CHS: %i, %i, %i)").toUtf8().constData(), (size_mb), (hdd_table[i][0]), (hdd_table[i][1]), (hdd_table[i][2])); + Models::AddEntry(model, text, i); + } + Models::AddEntry(model, tr("Custom..."), 127); + Models::AddEntry(model, tr("Custom (large)..."), 128); + + ui->lineEditSize->setValidator(new QIntValidator()); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + if (existing) { ui->fileField->setFilter(tr("Hard disk images") % util::DlgFilter({ "hd?", "im?", "vhd" }) % tr("All files") % util::DlgFilter({ "*" }, true)); @@ -85,40 +119,6 @@ HarddiskDialog::HarddiskDialog(bool existing, QWidget *parent) ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); }); } - - auto *model = ui->comboBoxFormat->model(); - model->insertRows(0, 6); - model->setData(model->index(0, 0), tr("Raw image (.img)")); - model->setData(model->index(1, 0), tr("HDI image (.hdi)")); - model->setData(model->index(2, 0), tr("HDX image (.hdx)")); - model->setData(model->index(3, 0), tr("Fixed-size VHD (.vhd)")); - model->setData(model->index(4, 0), tr("Dynamic-size VHD (.vhd)")); - model->setData(model->index(5, 0), tr("Differencing VHD (.vhd)")); - - model = ui->comboBoxBlockSize->model(); - model->insertRows(0, 2); - model->setData(model->index(0, 0), tr("Large blocks (2 MB)")); - model->setData(model->index(1, 0), tr("Small blocks (512 KB)")); - - ui->comboBoxBlockSize->hide(); - ui->labelBlockSize->hide(); - - Harddrives::populateBuses(ui->comboBoxBus->model()); - ui->comboBoxBus->setCurrentIndex(3); - - model = ui->comboBoxType->model(); - for (int i = 0; i < 127; i++) { - uint64_t size = ((uint64_t) hdd_table[i][0]) * hdd_table[i][1] * hdd_table[i][2]; - uint32_t size_mb = size >> 11LL; - // QString text = QString("%1 MiB (CHS: %2, %3, %4)").arg(size_mb).arg(hdd_table[i][0]).arg(hdd_table[i][1]).arg(hdd_table[i][2]); - QString text = QString::asprintf(tr("%u MB (CHS: %i, %i, %i)").toUtf8().constData(), (size_mb), (hdd_table[i][0]), (hdd_table[i][1]), (hdd_table[i][2])); - Models::AddEntry(model, text, i); - } - Models::AddEntry(model, tr("Custom..."), 127); - Models::AddEntry(model, tr("Custom (large)..."), 128); - - ui->lineEditSize->setValidator(new QIntValidator()); - ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); } HarddiskDialog::~HarddiskDialog() @@ -499,7 +499,7 @@ HarddiskDialog::recalcSelection() } void -HarddiskDialog::onExistingFileSelected(const QString &fileName) +HarddiskDialog::onExistingFileSelected(const QString &fileName, bool precheck) { // TODO : Over to non-existing file selected /* @@ -531,7 +531,11 @@ HarddiskDialog::onExistingFileSelected(const QString &fileName) ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { - QMessageBox::critical(this, tr("Unable to read file"), tr("Make sure the file exists and is readable.")); + // No message box during precheck (performed when the file input loses focus and this function is called) + // If precheck is false, the file has been chosen from a file dialog and the alert should display. + if(!precheck) { + QMessageBox::critical(this, tr("Unable to read file"), tr("Make sure the file exists and is readable.")); + } return; } QByteArray fileNameUtf8 = fileName.toUtf8(); diff --git a/src/qt/qt_harddiskdialog.hpp b/src/qt/qt_harddiskdialog.hpp index a630bd8e2..0d5fa13bc 100644 --- a/src/qt/qt_harddiskdialog.hpp +++ b/src/qt/qt_harddiskdialog.hpp @@ -37,7 +37,7 @@ private slots: void on_comboBoxBus_currentIndexChanged(int index); void on_comboBoxFormat_currentIndexChanged(int index); void onCreateNewFile(); - void onExistingFileSelected(const QString &fileName); + void onExistingFileSelected(const QString &fileName, bool precheck); private: Ui::HarddiskDialog *ui; From 118ae94200a432be33f7cf69bf504ffb87661012 Mon Sep 17 00:00:00 2001 From: cold-brewed Date: Sun, 5 Feb 2023 12:20:44 -0500 Subject: [PATCH 05/29] qt: Fix some other fields that should not be editable --- src/qt/qt_settingsfloppycdrom.ui | 6 ++++++ src/qt/qt_settingsotherremovable.ui | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/qt/qt_settingsfloppycdrom.ui b/src/qt/qt_settingsfloppycdrom.ui index 30be29153..7a025e7a6 100644 --- a/src/qt/qt_settingsfloppycdrom.ui +++ b/src/qt/qt_settingsfloppycdrom.ui @@ -35,6 +35,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection @@ -99,6 +102,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection diff --git a/src/qt/qt_settingsotherremovable.ui b/src/qt/qt_settingsotherremovable.ui index a82c296ae..c57dd3ca2 100644 --- a/src/qt/qt_settingsotherremovable.ui +++ b/src/qt/qt_settingsotherremovable.ui @@ -35,6 +35,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection @@ -105,6 +108,9 @@ + + QAbstractItemView::NoEditTriggers + QAbstractItemView::SingleSelection From a9149bb78a8bdbbd4fde2182e0e8f4905d7d8853 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 6 Feb 2023 01:39:34 +0600 Subject: [PATCH 06/29] qt: Reenable and make functional ACPI shutdown button --- src/86box.c | 5 +++++ src/acpi.c | 23 ++++++++++++++++++++++- src/include/86box/acpi.h | 10 ++++++++-- src/qt/qt_mainwindow.cpp | 10 ++++++++++ src/qt/qt_mainwindow.hpp | 3 +++ src/qt/qt_mainwindow.ui | 4 ++-- 6 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/86box.c b/src/86box.c index fba67ca55..32724802c 100644 --- a/src/86box.c +++ b/src/86box.c @@ -97,6 +97,8 @@ #include <86box/version.h> #include <86box/gdbstub.h> #include <86box/machine_status.h> +#include <86box/apm.h> +#include <86box/acpi.h> // Disable c99-designator to avoid the warnings about int ng #ifdef __clang__ @@ -1016,6 +1018,9 @@ pc_reset_hard_init(void) * modules that are. */ + /* Mark ACPI as unavailable */ + acpi_enabled = 0; + /* Reset the general machine support modules. */ io_init(); diff --git a/src/acpi.c b/src/acpi.c index 5f9db8d05..2c5f2ff90 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -40,7 +40,9 @@ #include <86box/i2c.h> #include <86box/video.h> -int acpi_rtc_status = 0; +int acpi_rtc_status = 0; +atomic_int acpi_pwrbut_pressed = 0; +int acpi_enabled = 0; static double cpu_to_acpi; @@ -1516,6 +1518,21 @@ acpi_ali_soft_smi_status_write(acpi_t *dev, uint8_t soft_smi) dev->regs.ali_soft_smi = soft_smi; } +void +acpi_pwrbtn_timer(void* priv) +{ + acpi_t *dev = (acpi_t *) priv; + + timer_on_auto(&dev->pwrbtn_timer, 16. * 1000.); + if (acpi_pwrbut_pressed) { + acpi_pwrbut_pressed = 0; + if (dev->regs.pmen & PWRBTN_EN) { + dev->regs.pmsts |= PWRBTN_STS; + acpi_update_irq(dev); + } + } +} + static void acpi_apm_out(uint16_t port, uint8_t val, void *p) { @@ -1707,9 +1724,13 @@ acpi_init(const device_t *info) timer_add(&dev->timer, acpi_timer_overflow, dev, 0); timer_add(&dev->resume_timer, acpi_timer_resume, dev, 0); + timer_add(&dev->pwrbtn_timer, acpi_pwrbtn_timer, dev, 0); + + timer_on_auto(&dev->pwrbtn_timer, 16. * 1000.); acpi_reset(dev); + acpi_enabled = 1; return dev; } diff --git a/src/include/86box/acpi.h b/src/include/86box/acpi.h index 4d2f2ac0d..18f40d874 100644 --- a/src/include/86box/acpi.h +++ b/src/include/86box/acpi.h @@ -18,7 +18,11 @@ #define ACPI_H #ifdef __cplusplus +#include +using atomic_int = std::atomic_int; extern "C" { +#else +#include #endif #define ACPI_TIMER_FREQ 3579545 @@ -90,7 +94,7 @@ typedef struct slot, irq_mode, irq_pin, irq_line, mirq_is_level; - pc_timer_t timer, resume_timer; + pc_timer_t timer, resume_timer, pwrbtn_timer; nvr_t *nvr; apm_t *apm; void *i2c, @@ -98,7 +102,9 @@ typedef struct } acpi_t; /* Global variables. */ -extern int acpi_rtc_status; +extern int acpi_rtc_status; +extern atomic_int acpi_pwrbut_pressed; +extern int acpi_enabled; extern const device_t acpi_ali_device; extern const device_t acpi_intel_device; diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 0af5626f3..013650673 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -47,6 +47,9 @@ extern "C" { #include <86box/machine.h> #include <86box/vid_ega.h> #include <86box/version.h> +//#include <86box/acpi.h> /* Requires timer.h include, which conflicts with Qt headers */ +extern atomic_int acpi_pwrbut_pressed; +extern int acpi_enabled; #ifdef USE_VNC # include <86box/vnc.h> @@ -1679,6 +1682,7 @@ MainWindow::refreshMediaMenu() mm->refresh(ui->menuMedia); status->refresh(ui->statusbar); ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); + ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled); } void @@ -2430,3 +2434,9 @@ MainWindow::on_actionApply_fullscreen_stretch_mode_when_maximized_triggered(bool device_force_redraw(); config_save(); } + +void MainWindow::on_actionACPI_Shutdown_triggered() +{ + acpi_pwrbut_pressed = 1; +} + diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 6ad4c9beb..9668ecbbb 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -134,6 +134,9 @@ protected: void closeEvent(QCloseEvent *event) override; void changeEvent(QEvent *event) override; +private slots: + void on_actionACPI_Shutdown_triggered(); + private slots: void on_actionShow_non_primary_monitors_triggered(); diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index 6a86b632e..eb921899b 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -743,7 +743,7 @@ - false + true @@ -756,7 +756,7 @@ ACPI Shutdown - false + true From 7d212d6dddcd0dafd9cc0e5996fd234377a99fb2 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 01:47:02 -0500 Subject: [PATCH 07/29] Fix p6bat internal sound --- src/machine/m_at_socket370.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index e2b9eacbf..b8cc437a1 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -173,7 +173,7 @@ machine_at_p6bat_init(const machine_t *model) device_add(&sst_flash_39sf020_device); spd_register(SPD_TYPE_SDRAM, 0x7, 256); - if (sound_card_current == SOUND_INTERNAL) { + if (sound_card_current[0] == SOUND_INTERNAL) { device_add(&cmi8738_onboard_device); } From 6978f6d7d470e36d2092489ae9419dc963a11a73 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 01:49:21 -0500 Subject: [PATCH 08/29] Fix uninitialized use in mitsumi_cdrom_reset --- src/cdrom/cdrom_mitsumi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cdrom/cdrom_mitsumi.c b/src/cdrom/cdrom_mitsumi.c index eaddccef8..e7e12bb94 100644 --- a/src/cdrom/cdrom_mitsumi.c +++ b/src/cdrom/cdrom_mitsumi.c @@ -144,6 +144,8 @@ static void mitsumi_cdrom_reset(mcd_t *dev) { cdrom_t cdrom; + + cdrom.host_drive = 0; dev->stat = cdrom.host_drive ? (STAT_READY | STAT_CHANGE) : 0; dev->cmdrd_count = 0; From 13b954a336278d06dfb26e4855dab07acd5f6f0d Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 02:58:04 -0500 Subject: [PATCH 09/29] Port PR#2786 (Higher scaling factors) to win32 UI --- src/include/86box/resource.h | 35 +++++++++++++++++++++-------------- src/win/languages/cs-CZ.rc | 14 ++++++++++---- src/win/languages/de-DE.rc | 6 ++++++ src/win/languages/en-GB.rc | 6 ++++++ src/win/languages/en-US.rc | 6 ++++++ src/win/languages/es-ES.rc | 6 ++++++ src/win/languages/fi-FI.rc | 6 ++++++ src/win/languages/fr-FR.rc | 6 ++++++ src/win/languages/hr-HR.rc | 6 ++++++ src/win/languages/hu-HU.rc | 6 ++++++ src/win/languages/it-IT.rc | 6 ++++++ src/win/languages/ja-JP.rc | 6 ++++++ src/win/languages/ko-KR.rc | 6 ++++++ src/win/languages/pl-PL.rc | 6 ++++++ src/win/languages/pt-BR.rc | 6 ++++++ src/win/languages/pt-PT.rc | 6 ++++++ src/win/languages/ru-RU.rc | 6 ++++++ src/win/languages/sl-SI.rc | 6 ++++++ src/win/languages/tr-TR.rc | 6 ++++++ src/win/languages/uk-UA.rc | 6 ++++++ src/win/languages/zh-CN.rc | 6 ++++++ src/win/languages/zh-TW.rc | 6 ++++++ src/win/win_specify_dim.c | 6 ++++++ src/win/win_ui.c | 6 ++++++ 24 files changed, 163 insertions(+), 18 deletions(-) diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 10f3a4224..967430216 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -412,20 +412,27 @@ #define IDM_VID_SCALE_2X 40056 #define IDM_VID_SCALE_3X 40057 #define IDM_VID_SCALE_4X 40058 -#define IDM_VID_HIDPI 40059 -#define IDM_VID_FULLSCREEN 40060 -#define IDM_VID_FS_FULL 40061 -#define IDM_VID_FS_43 40062 -#define IDM_VID_FS_KEEPRATIO 40063 -#define IDM_VID_FS_INT 40064 -#define IDM_VID_SPECIFY_DIM 40065 -#define IDM_VID_FORCE43 40066 -#define IDM_VID_OVERSCAN 40067 -#define IDM_VID_INVERT 40069 -#define IDM_VID_CGACON 40070 -#define IDM_VID_GRAYCT_601 40075 -#define IDM_VID_GRAYCT_709 40076 -#define IDM_VID_GRAYCT_AVE 40077 +#define IDM_VID_SCALE_5X 40059 +#define IDM_VID_SCALE_6X 40060 +#define IDM_VID_SCALE_7X 40061 +#define IDM_VID_SCALE_8X 40062 +#define IDM_VID_SCALE_9X 40063 +#define IDM_VID_SCALE_10X 40064 + +#define IDM_VID_HIDPI 40065 +#define IDM_VID_FULLSCREEN 40066 +#define IDM_VID_FS_FULL 40067 +#define IDM_VID_FS_43 40068 +#define IDM_VID_FS_KEEPRATIO 40069 +#define IDM_VID_FS_INT 40070 +#define IDM_VID_SPECIFY_DIM 40071 +#define IDM_VID_FORCE43 40072 +#define IDM_VID_OVERSCAN 40073 +#define IDM_VID_INVERT 40074 +#define IDM_VID_CGACON 40075 +#define IDM_VID_GRAYCT_601 40076 +#define IDM_VID_GRAYCT_709 40077 +#define IDM_VID_GRAYCT_AVE 40078 #define IDM_VID_GRAY_RGB 40080 #define IDM_VID_GRAY_MONO 40081 #define IDM_VID_GRAY_AMBER 40082 diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 2c50e5316..c888fe954 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -53,10 +53,16 @@ BEGIN MENUITEM "&Dodržovat poměr stran 4:3", IDM_VID_FORCE43 POPUP "&Násobek zvětšení okna" BEGIN - MENUITEM "&0.5x", IDM_VID_SCALE_1X - MENUITEM "&1x", IDM_VID_SCALE_2X - MENUITEM "1.&5x", IDM_VID_SCALE_3X - MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&0.5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1.&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metoda &filtrování" BEGIN diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 0f9517038..3768898a5 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1,&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Filteringmethode" BEGIN diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index 7b849bef2..a16c7977f 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Filter method" BEGIN diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 8f279e355..42070879d 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Filter method" BEGIN diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 3e1f746ba..8be2db827 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "&Método de filtrado" BEGIN diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index 1eee0df45..9f2f14187 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "&Suodatusmetodi" BEGIN diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 29ccb911d..fcd4d480a 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Methode Filtre" BEGIN diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 317ceccef..fe0f9dad5 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1,&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metoda filtriranja" BEGIN diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 8a90cdfe6..f23e3c35a 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -62,6 +62,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1,&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Szűrési mód" BEGIN diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 38189f706..6335c690f 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -58,6 +58,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metodo filtro" BEGIN diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index daf28f011..1de5e1f42 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "1x(&1)", IDM_VID_SCALE_2X MENUITEM "1.5x(&5)", IDM_VID_SCALE_3X MENUITEM "2x(&2)", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "フィルター方式" BEGIN diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index f967286dd..b96e21fa1 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "1배(&1)", IDM_VID_SCALE_2X MENUITEM "1.5배(&5)", IDM_VID_SCALE_3X MENUITEM "2배(&2)", IDM_VID_SCALE_4X + MENUITEM "&3배", IDM_VID_SCALE_5X + MENUITEM "&4배", IDM_VID_SCALE_6X + MENUITEM "&5배", IDM_VID_SCALE_7X + MENUITEM "&6배", IDM_VID_SCALE_8X + MENUITEM "&7배", IDM_VID_SCALE_9X + MENUITEM "&8배", IDM_VID_SCALE_10X END POPUP "필터 형식" BEGIN diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc index 412076305..e4e6a4963 100644 --- a/src/win/languages/pl-PL.rc +++ b/src/win/languages/pl-PL.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Metoda filtrowania" BEGIN diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 46a823713..7a08080bc 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -60,6 +60,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1,&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Método de filtragem" BEGIN diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index 188b0a930..74968da02 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Método de filtragem" BEGIN diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 32e6ed32d..790738148 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Метод фильтрации" BEGIN diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index 93f2c4d98..317cf51b8 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "&Metoda filtriranja" BEGIN diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 2c72f2bdf..04a0f9abc 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "&Filtre metodu" BEGIN diff --git a/src/win/languages/uk-UA.rc b/src/win/languages/uk-UA.rc index 0dc2a544d..d8c5f1106 100644 --- a/src/win/languages/uk-UA.rc +++ b/src/win/languages/uk-UA.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "&1x", IDM_VID_SCALE_2X MENUITEM "1.&5x", IDM_VID_SCALE_3X MENUITEM "&2x", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "Метод фільтрації" BEGIN diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index 945194968..72d67e880 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "1x(&1)", IDM_VID_SCALE_2X MENUITEM "1.5x(&5)", IDM_VID_SCALE_3X MENUITEM "2x(&2)", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "过滤方式" BEGIN diff --git a/src/win/languages/zh-TW.rc b/src/win/languages/zh-TW.rc index 6e5ed0321..9cbb7c70e 100644 --- a/src/win/languages/zh-TW.rc +++ b/src/win/languages/zh-TW.rc @@ -57,6 +57,12 @@ BEGIN MENUITEM "1x(&1)", IDM_VID_SCALE_2X MENUITEM "1.5x(&5)", IDM_VID_SCALE_3X MENUITEM "2x(&2)", IDM_VID_SCALE_4X + MENUITEM "&3x", IDM_VID_SCALE_5X + MENUITEM "&4x", IDM_VID_SCALE_6X + MENUITEM "&5x", IDM_VID_SCALE_7X + MENUITEM "&6x", IDM_VID_SCALE_8X + MENUITEM "&7x", IDM_VID_SCALE_9X + MENUITEM "&8x", IDM_VID_SCALE_10X END POPUP "過濾方式" BEGIN diff --git a/src/win/win_specify_dim.c b/src/win/win_specify_dim.c index 184c39d4f..30698fac6 100644 --- a/src/win/win_specify_dim.c +++ b/src/win/win_specify_dim.c @@ -130,6 +130,12 @@ SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM EnableMenuItem(hmenu, IDM_VID_SCALE_2X, vid_resize ? MF_GRAYED : MF_ENABLED); EnableMenuItem(hmenu, IDM_VID_SCALE_3X, vid_resize ? MF_GRAYED : MF_ENABLED); EnableMenuItem(hmenu, IDM_VID_SCALE_4X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_5X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_6X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_7X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_8X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_9X, vid_resize ? MF_GRAYED : MF_ENABLED); + EnableMenuItem(hmenu, IDM_VID_SCALE_10X, vid_resize ? MF_GRAYED : MF_ENABLED); scrnsz_x = fixed_size_x; scrnsz_y = fixed_size_y; diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 63db0176b..8eefb1ccd 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -278,6 +278,12 @@ ResetAllMenus(void) CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 1, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 2, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 3, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 4, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 5, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 6, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 7, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 8, MF_UNCHECKED); + CheckMenuItem(menuMain, IDM_VID_SCALE_1X + 9, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_HIDPI, MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_CGACON, MF_UNCHECKED); From a7236a9022b865504fed39f3d37d8b43cc70edf0 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 04:12:46 -0500 Subject: [PATCH 10/29] Make dual video card code use array --- src/86box.c | 19 ++++++------- src/config.c | 16 +++++------ src/device/keyboard_at.c | 2 +- src/device/keyboard_xt.c | 2 +- src/device/phoenix_486_jumper.c | 2 +- src/include/86box/86box.h | 2 +- src/include/86box/video.h | 1 - src/machine/m_amstrad.c | 4 +-- src/machine/m_at_286_386sx.c | 14 ++++----- src/machine/m_at_386dx_486.c | 14 ++++----- src/machine/m_at_compaq.c | 6 ++-- src/machine/m_at_slot1.c | 2 +- src/machine/m_at_socket4.c | 2 +- src/machine/m_at_socket7.c | 4 +-- src/machine/m_at_socket7_3v.c | 8 +++--- src/machine/m_elt.c | 2 +- src/machine/m_europc.c | 2 +- src/machine/m_pcjr.c | 2 +- src/machine/m_ps1.c | 2 +- src/machine/m_ps2_mca.c | 8 +++--- src/machine/m_tandy.c | 2 +- src/machine/m_v86p.c | 2 +- src/machine/m_xt_olivetti.c | 6 ++-- src/machine/m_xt_t1000.c | 4 +-- src/machine/machine.c | 6 ++-- src/qt/qt_settingsdisplay.cpp | 28 +++++++++--------- src/qt/qt_settingsdisplay.hpp | 5 ++-- src/unix/unix.c | 4 +-- src/video/vid_table.c | 8 +++--- src/win/win.c | 4 +-- src/win/win_settings.c | 50 ++++++++++++++++----------------- 31 files changed, 115 insertions(+), 118 deletions(-) diff --git a/src/86box.c b/src/86box.c index 32724802c..fb96ed87e 100644 --- a/src/86box.c +++ b/src/86box.c @@ -166,8 +166,7 @@ int bugger_enabled = 0; /* (C) enable ISAbug int postcard_enabled = 0; /* (C) enable POST card */ int isamem_type[ISAMEM_MAX] = { 0, 0, 0, 0 }; /* (C) enable ISA mem cards */ int isartc_type = 0; /* (C) enable ISA RTC card */ -int gfxcard = 0; /* (C) graphics/video card */ -int gfxcard_2 = 0; /* (C) graphics/video card */ +int gfxcard[2] = { 0, 0 }; /* (C) graphics/video card */ int show_second_monitors = 1; /* (C) show non-primary monitors */ int sound_is_float = 1; /* (C) sound uses FP values */ int voodoo_enabled = 0; /* (C) video option */ @@ -869,34 +868,34 @@ pc_init_modules(void) } /* Make sure we have a usable video card. */ - if (!video_card_available(gfxcard)) { + if (!video_card_available(gfxcard[0])) { memset(tempc, 0, sizeof(tempc)); - device_get_name(video_card_getdevice(gfxcard), 0, tempc); + device_get_name(video_card_getdevice(gfxcard[0]), 0, tempc); swprintf(temp, sizeof(temp), plat_get_string(IDS_2064), tempc); c = 0; while (video_get_internal_name(c) != NULL) { - gfxcard = -1; + gfxcard[0] = -1; if (video_card_available(c)) { ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2129, temp); - gfxcard = c; + gfxcard[0] = c; config_save(); break; } c++; } - if (gfxcard == -1) { + if (gfxcard[0] == -1) { fatal("No available video cards\n"); exit(-1); return (0); } } - if (!video_card_available(gfxcard_2)) { + if (!video_card_available(gfxcard[1])) { char tempc[512] = { 0 }; - device_get_name(video_card_getdevice(gfxcard_2), 0, tempc); + device_get_name(video_card_getdevice(gfxcard[1]), 0, tempc); swprintf(temp, sizeof(temp), (wchar_t *) "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.", tempc); ui_msgbox_header(MBX_INFO, (wchar_t *) IDS_2129, temp); - gfxcard_2 = 0; + gfxcard[1] = 0; } atfullspeed = 0; diff --git a/src/config.c b/src/config.c index f573d3d4b..a0f9a71f0 100644 --- a/src/config.c +++ b/src/config.c @@ -530,7 +530,7 @@ load_video(void) if (machine_has_flags(machine, MACHINE_VIDEO_ONLY)) { ini_section_delete_var(cat, "gfxcard"); - gfxcard = VID_INTERNAL; + gfxcard[0] = VID_INTERNAL; } else { p = ini_section_get_string(cat, "gfxcard", NULL); if (p == NULL) { @@ -544,9 +544,9 @@ load_video(void) free_p = 1; } if (!strcmp(p, "virge375_vbe20_pci")) /* migrate renamed cards */ - gfxcard = video_get_video_from_internal_name("virge385_pci"); + gfxcard[0] = video_get_video_from_internal_name("virge385_pci"); else - gfxcard = video_get_video_from_internal_name(p); + gfxcard[0] = video_get_video_from_internal_name(p); if (free_p) free(p); } @@ -560,7 +560,7 @@ load_video(void) p = ini_section_get_string(cat, "gfxcard_2", NULL); if (!p) p = "none"; - gfxcard_2 = video_get_video_from_internal_name(p); + gfxcard[1] = video_get_video_from_internal_name(p); } /* Load "Input Devices" section. */ @@ -1851,7 +1851,7 @@ config_load(void) dpi_scale = 1; fpu_type = fpu_get_type(cpu_f, cpu, "none"); - gfxcard = video_get_video_from_internal_name("cga"); + gfxcard[0] = video_get_video_from_internal_name("cga"); vid_api = plat_vidapi("default"); vid_resize = 0; video_fullscreen_first = 1; @@ -2235,7 +2235,7 @@ save_video(void) ini_section_t cat = ini_find_or_create_section(config, "Video"); ini_section_set_string(cat, "gfxcard", - video_get_internal_name(gfxcard)); + video_get_internal_name(gfxcard[0])); if (voodoo_enabled == 0) ini_section_delete_var(cat, "voodoo"); @@ -2252,10 +2252,10 @@ save_video(void) else ini_section_set_int(cat, "xga", xga_enabled); - if (gfxcard_2 == 0) + if (gfxcard[1] == 0) ini_section_delete_var(cat, "gfxcard_2"); else - ini_section_set_string(cat, "gfxcard_2", video_get_internal_name(gfxcard_2)); + ini_section_set_string(cat, "gfxcard_2", video_get_internal_name(gfxcard[1])); if (show_second_monitors == 1) ini_section_delete_var(cat, "show_second_monitors"); diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index dc385c011..c71213aa6 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -2491,7 +2491,7 @@ kbd_init(const device_t *info) dev->flags = info->local; - video_reset(gfxcard); + video_reset(gfxcard[0]); kbd_reset(dev); io_sethandler(0x0060, 1, kbd_read, NULL, NULL, kbd_write, NULL, NULL, dev); diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index 676f99f54..fe523cd2f 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -730,7 +730,7 @@ kbd_init(const device_t *info) key_queue_start = key_queue_end = 0; - video_reset(gfxcard); + video_reset(gfxcard[0]); if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) || (kbd->type == KBD_TYPE_PRAVETZ) || (kbd->type == KBD_TYPE_XT82) || diff --git a/src/device/phoenix_486_jumper.c b/src/device/phoenix_486_jumper.c index 357240ba7..d5e833404 100644 --- a/src/device/phoenix_486_jumper.c +++ b/src/device/phoenix_486_jumper.c @@ -91,7 +91,7 @@ phoenix_486_jumper_reset(void *priv) dev->jumper = 0x00; else { dev->jumper = 0x9f; - if (gfxcard != 0x01) + if (gfxcard[0] != 0x01) dev->jumper |= 0x40; } } diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index ca8d797cc..b88fa24ef 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -107,7 +107,7 @@ extern int vid_cga_contrast, /* (C) video */ video_filter_method, /* (C) video */ video_vsync, /* (C) video */ video_framerate, /* (C) video */ - gfxcard; /* (C) graphics/video card */ + gfxcard[2]; /* (C) graphics/video card */ extern char video_shader[512]; /* (C) video */ extern int bugger_enabled, /* (C) enable ISAbugger */ postcard_enabled, /* (C) enable POST card */ diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 6f35dc5ee..a49f3bf34 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -132,7 +132,6 @@ extern monitor_t monitors[MONITORS_NUM]; extern monitor_settings_t monitor_settings[MONITORS_NUM]; extern atomic_bool doresize_monitors[MONITORS_NUM]; extern int monitor_index_global; -extern int gfxcard_2; extern int show_second_monitors; extern int video_fullscreen_scale_maximized; diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 89f8f5670..a37427de1 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -2474,9 +2474,9 @@ machine_amstrad_init(const machine_t *model, int type) ams->language = 7; - video_reset(gfxcard); + video_reset(gfxcard[0]); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) switch (type) { case AMS_PC1512: loadfont("roms/machines/pc1512/40078", 8); diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index 253ce804d..54e7d6b9e 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -114,7 +114,7 @@ machine_at_ama932j_init(const machine_t *model) machine_at_common_ide_init(model); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&oti067_ama932j_device); machine_at_headland_common_init(2); @@ -420,7 +420,7 @@ machine_at_spc4620p_init(const machine_t *model) if (bios_only || !ret) return ret; - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ati28800k_spc4620p_device); machine_at_scat_init(model, 1, 1); @@ -527,7 +527,7 @@ machine_at_wd76c10_init(const machine_t *model) machine_at_common_init(model); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(¶dise_wd90c11_megapc_device); device_add(&keyboard_ps2_quadtel_device); @@ -591,7 +591,7 @@ machine_at_cmdsl386sx25_init(const machine_t *model) if (bios_only || !ret) return ret; - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5402_onboard_device); machine_at_scamp_common_init(model, 1); @@ -626,7 +626,7 @@ machine_at_spc6033p_init(const machine_t *model) if (bios_only || !ret) return ret; - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ati28800k_spc6033p_device); machine_at_scamp_common_init(model, 1); @@ -711,7 +711,7 @@ machine_at_flytech386_init(const machine_t *model) device_add(&ali1217_device); device_add(&w83787f_ide_en_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&tvga8900d_device); device_add(&keyboard_ps2_device); @@ -833,7 +833,7 @@ machine_at_3302_init(const machine_t *model) if (fdc_type == FDC_INTERNAL) device_add(&fdc_at_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(¶dise_pvga1a_ncr3302_device); device_add(&keyboard_at_ncr_device); diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 036eac550..eeebbb784 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -168,7 +168,7 @@ machine_at_valuepoint433_init(const machine_t *model) // hangs without the PS/2 machine_at_common_ide_init(model); device_add(&sis_85c461_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&et4000w32_onboard_device); device_add(&keyboard_ps2_device); @@ -310,7 +310,7 @@ machine_at_pb410a_init(const machine_t *model) device_add(&phoenix_486_jumper_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ht216_32_pb410a_device); return ret; @@ -331,7 +331,7 @@ machine_at_vect486vl_init(const machine_t *model) // has HDC problems device_add(&vl82c480_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5428_onboard_device); device_add(&keyboard_ps2_ami_device); @@ -355,7 +355,7 @@ machine_at_d824_init(const machine_t *model) device_add(&vl82c480_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5428_onboard_device); device_add(&keyboard_ps2_device); @@ -378,7 +378,7 @@ machine_at_acera1g_init(const machine_t *model) machine_at_common_init(model); device_add(&ali1429g_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5428_onboard_device); device_add(&keyboard_ps2_acer_pci_device); @@ -428,7 +428,7 @@ machine_at_decpclpv_init(const machine_t *model) device_add(&sis_85c461_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_86c805_onboard_vlb_device); /* TODO: Phoenix MultiKey KBC */ @@ -1365,7 +1365,7 @@ machine_at_sbc490_init(const machine_t *model) device_add(&ali1489_device); device_add(&fdc37c665_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&tgui9440_onboard_pci_device); device_add(&keyboard_ps2_ami_device); diff --git a/src/machine/m_at_compaq.c b/src/machine/m_at_compaq.c index 0b3a901b5..e74261b8a 100644 --- a/src/machine/m_at_compaq.c +++ b/src/machine/m_at_compaq.c @@ -787,21 +787,21 @@ machine_at_compaq_init(const machine_t *model, int type) write_ram, write_ramw, write_raml, 0xa0000 + ram, MEM_MAPPING_INTERNAL, NULL); - video_reset(gfxcard); + video_reset(gfxcard[0]); switch (type) { case COMPAQ_PORTABLEII: break; case COMPAQ_PORTABLEIII: - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&compaq_plasma_device); break; case COMPAQ_PORTABLEIII386: if (hdc_current == 1) device_add(&ide_isa_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&compaq_plasma_device); break; diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index c30f39603..3cedb669a 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -663,7 +663,7 @@ machine_at_ms6168_common_init(const machine_t *model) device_add(&piix4e_device); device_add(&w83977ef_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&voodoo_3_2000_agp_onboard_8m_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 2aa94cce5..ef745d088 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -345,7 +345,7 @@ machine_at_pb520r_init(const machine_t *model) device_add(&i430lx_device); device_add(&ide_cmd640_pci_single_channel_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5434_onboard_pci_device); device_add(&keyboard_ps2_pci_device); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index f7faae167..0e76ac1c9 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -398,7 +398,7 @@ machine_at_presario2240_init(const machine_t *model) pci_register_slot(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_trio64v2_dx_onboard_pci_device); device_add(&i430vx_device); @@ -429,7 +429,7 @@ machine_at_presario4500_init(const machine_t *model) pci_register_slot(0x14, PCI_CARD_VIDEO, 3, 0, 0, 0); pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_trio64v2_dx_onboard_pci_device); device_add(&i430vx_device); diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 03be14c37..55a5068d9 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -58,7 +58,7 @@ machine_at_thor_common_init(const machine_t *model, int mr) pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 3, 2, 1); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_phoenix_trio64vplus_onboard_pci_device); // device_add(&keyboard_ps2_ami_pci_device); @@ -222,7 +222,7 @@ machine_at_endeavor_init(const machine_t *model) pci_register_slot(0x10, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_phoenix_trio64_onboard_pci_device); device_add(&keyboard_ps2_intel_ami_pci_device); @@ -286,7 +286,7 @@ machine_at_pb640_init(const machine_t *model) device_add(&i430fx_rev02_device); device_add(&piix_rev02_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&gd5440_onboard_pci_device); device_add(&keyboard_ps2_intel_ami_pci_device); @@ -616,7 +616,7 @@ machine_at_vectra54_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&s3_phoenix_trio64_onboard_pci_device); device_add(&keyboard_ps2_ami_pci_device); diff --git a/src/machine/m_elt.c b/src/machine/m_elt.c index 81647612c..0370b45a2 100644 --- a/src/machine/m_elt.c +++ b/src/machine/m_elt.c @@ -178,7 +178,7 @@ machine_elt_init(const machine_t *model) if (fdc_type == FDC_INTERNAL) device_add(&fdc_xt_device); - if (gfxcard == VID_INTERNAL) { + if (gfxcard[0] == VID_INTERNAL) { cga = device_add(&cga_device); io_removehandler(0x03d0, 0x0010, cga_in, NULL, NULL, cga_out, NULL, NULL, cga); io_sethandler(0x03d0, 0x0010, elt_vid_in, NULL, NULL, elt_vid_out, NULL, NULL, cga); diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index 116e10e5f..b1368dd5d 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -549,7 +549,7 @@ europc_boot(const device_t *info) * with values set by the user. */ b = (sys->nvr.regs[MRTC_CONF_D] & ~0x17); - video_reset(gfxcard); + video_reset(gfxcard[0]); if (video_is_cga()) b |= 0x12; /* external video, CGA80 */ else if (video_is_mda()) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index b03272f3d..0b1f8ec58 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -781,7 +781,7 @@ machine_pcjr_init(const machine_t *model) cpu_set(); /* Initialize the video controller. */ - video_reset(gfxcard); + video_reset(gfxcard[0]); loadfont("roms/video/mda/mda.rom", 0); mem_mapping_add(&pcjr->mapping, 0xb8000, 0x08000, vid_read, NULL, NULL, diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 209b5d7a4..d002ba6bd 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -300,7 +300,7 @@ ps1_setup(int model) 0xfc0000, 0x40000, 0x3ffff, 0, MEM_MAPPING_EXTERNAL); /* Initialize the video controller. */ - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ibm_ps1_2121_device); device_add(&fdc_at_ps1_device); diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index f77b6f4a0..5057b65ea 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -950,7 +950,7 @@ ps2_mca_board_model_50_init(int slots) ps2_mca_mem_fffc_init(2); } - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ps1vga_mca_device); } @@ -1008,7 +1008,7 @@ ps2_mca_board_model_55sx_init(int has_sec_nvram, int slots) ps2.planar_read = model_55sx_read; ps2.planar_write = model_55sx_write; - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ps1vga_mca_device); model_55sx_mem_recalc(); @@ -1244,7 +1244,7 @@ ps2_mca_board_model_70_type34_init(int is_type4, int slots) } } - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ps1vga_mca_device); } @@ -1318,7 +1318,7 @@ ps2_mca_board_model_80_type2_init(int is486) } } - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ps1vga_mca_device); ps2.split_size = 0; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 0eddc1e19..04f5e5381 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -1437,7 +1437,7 @@ machine_tandy1k_init(const machine_t *model, int type) if (fdc_type == FDC_INTERNAL) device_add(&fdc_xt_tandy_device); - video_reset(gfxcard); + video_reset(gfxcard[0]); switch (type) { case TYPE_TANDY: diff --git a/src/machine/m_v86p.c b/src/machine/m_v86p.c index 03bfda842..af90ab629 100644 --- a/src/machine/m_v86p.c +++ b/src/machine/m_v86p.c @@ -90,7 +90,7 @@ machine_v86p_init(const machine_t *model) if (fdc_type == FDC_INTERNAL) device_add(&fdc_xt_device); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&f82c425_video_device); if (hdc_current <= 1) diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index bb52c2049..e9c24f88f 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -1807,9 +1807,9 @@ machine_xt_m24_init(const machine_t *model) mm58174_init(nvr, model->nvrmask + 1); - video_reset(gfxcard); + video_reset(gfxcard[0]); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&ogc_m24_device); pit_devs[0].set_out_func(pit_devs[0].data, 1, pit_refresh_timer_xt); @@ -1919,7 +1919,7 @@ machine_xt_m19_init(const machine_t *model) nmi_init(); - video_reset(gfxcard); + video_reset(gfxcard[0]); m19_vid_init(vid); device_add_ex(&m19_vid_device, vid); diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index f6f2e5322..f632003ac 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -897,7 +897,7 @@ machine_xt_t1000_init(const machine_t *model) t1000_nvr_load(); nvr_set_ven_save(t1000_nvr_save); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&t1000_video_device); return ret; @@ -957,7 +957,7 @@ machine_xt_t1200_init(const machine_t *model) t1200_nvr_load(); nvr_set_ven_save(t1200_nvr_save); - if (gfxcard == VID_INTERNAL) + if (gfxcard[0] == VID_INTERNAL) device_add(&t1200_video_device); if (hdc_current <= 1) diff --git a/src/machine/machine.c b/src/machine/machine.c index f7970d4f1..7a69f4879 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -96,7 +96,7 @@ machine_init_ex(int m) /* Prepare some video-related things if we're using internal or no video. */ - video_pre_reset(gfxcard); + video_pre_reset(gfxcard[0]); /* Reset any ISA memory cards. */ isamem_reset(); @@ -112,7 +112,7 @@ machine_init_ex(int m) if (bios_only || !ret) return ret; - if (gfxcard != VID_NONE) { + if (gfxcard[0] != VID_NONE) { if (ibm8514_enabled) { ibm8514_device_add(); } @@ -122,7 +122,7 @@ machine_init_ex(int m) /* Reset the graphics card (or do nothing if it was already done by the machine's init function). */ - video_reset(gfxcard); + video_reset(gfxcard[0]); return ret; } diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index 10321cb2c..e64dc74dd 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -36,8 +36,8 @@ SettingsDisplay::SettingsDisplay(QWidget *parent) { ui->setupUi(this); - videoCard = gfxcard; - videoCard_2 = gfxcard_2; + videoCard[0] = gfxcard[0]; + videoCard[1] = gfxcard[1]; onCurrentMachineChanged(machine); } @@ -49,8 +49,8 @@ SettingsDisplay::~SettingsDisplay() void SettingsDisplay::save() { - gfxcard = ui->comboBoxVideo->currentData().toInt(); - gfxcard_2 = ui->comboBoxVideoSecondary->currentData().toInt(); + gfxcard[0] = ui->comboBoxVideo->currentData().toInt(); + gfxcard[1] = ui->comboBoxVideoSecondary->currentData().toInt(); voodoo_enabled = ui->checkBoxVoodoo->isChecked() ? 1 : 0; ibm8514_enabled = ui->checkBox8514->isChecked() ? 1 : 0; xga_enabled = ui->checkBoxXga->isChecked() ? 1 : 0; @@ -61,7 +61,7 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) { // win_settings_video_proc, WM_INITDIALOG this->machineId = machineId; - auto curVideoCard = videoCard; + auto curVideoCard = videoCard[0]; auto *model = ui->comboBoxVideo->model(); auto removeRows = model->rowCount(); @@ -103,7 +103,7 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) ui->pushButtonConfigureSecondary->setEnabled(true); } ui->comboBoxVideo->setCurrentIndex(selectedRow); - if (gfxcard_2 == 0) + if (gfxcard[1] == 0) ui->pushButtonConfigureSecondary->setEnabled(false); } @@ -136,9 +136,9 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) if (index < 0) { return; } - auto curVideoCard_2 = videoCard_2; - videoCard = ui->comboBoxVideo->currentData().toInt(); - ui->pushButtonConfigure->setEnabled(video_card_has_config(videoCard) > 0); + auto curVideoCard_2 = videoCard[1]; + videoCard[0] = ui->comboBoxVideo->currentData().toInt(); + ui->pushButtonConfigure->setEnabled(video_card_has_config(videoCard[0]) > 0); bool machineHasPci = machine_has_bus(machineId, MACHINE_BUS_PCI) > 0; ui->checkBoxVoodoo->setEnabled(machineHasPci); @@ -167,7 +167,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) ui->comboBoxVideoSecondary->setCurrentIndex(0); // TODO: Implement support for selecting non-MDA secondary cards properly when MDA cards are the primary ones. - if (video_card_get_flags(videoCard) == VIDEO_FLAG_TYPE_MDA) { + if (video_card_get_flags(videoCard[0]) == VIDEO_FLAG_TYPE_MDA) { ui->comboBoxVideoSecondary->setCurrentIndex(0); return; } @@ -178,7 +178,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) break; } - if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard) && (video_card_get_flags(c) != VIDEO_FLAG_TYPE_SPECIAL))) { + if (video_card_available(c) && device_is_valid(video_dev, machineId) && !(video_card_get_flags(c) == video_card_get_flags(videoCard[0]) && (video_card_get_flags(c) != VIDEO_FLAG_TYPE_SPECIAL))) { ui->comboBoxVideoSecondary->addItem(name, c); if (c == curVideoCard_2) ui->comboBoxVideoSecondary->setCurrentIndex(ui->comboBoxVideoSecondary->count() - 1); @@ -187,7 +187,7 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) c++; } - if (videoCard_2 == 0 || (machine_has_flags(machineId, MACHINE_VIDEO_ONLY) > 0)) { + if (videoCard[1] == 0 || (machine_has_flags(machineId, MACHINE_VIDEO_ONLY) > 0)) { ui->comboBoxVideoSecondary->setCurrentIndex(0); ui->pushButtonConfigureSecondary->setEnabled(false); } @@ -212,8 +212,8 @@ SettingsDisplay::on_comboBoxVideoSecondary_currentIndexChanged(int index) ui->pushButtonConfigureSecondary->setEnabled(false); return; } - videoCard_2 = ui->comboBoxVideoSecondary->currentData().toInt(); - ui->pushButtonConfigureSecondary->setEnabled(index != 0 && video_card_has_config(videoCard_2) > 0); + videoCard[1] = ui->comboBoxVideoSecondary->currentData().toInt(); + ui->pushButtonConfigureSecondary->setEnabled(index != 0 && video_card_has_config(videoCard[1]) > 0); } void diff --git a/src/qt/qt_settingsdisplay.hpp b/src/qt/qt_settingsdisplay.hpp index c02e55ce0..8331bbb5b 100644 --- a/src/qt/qt_settingsdisplay.hpp +++ b/src/qt/qt_settingsdisplay.hpp @@ -35,9 +35,8 @@ private slots: private: Ui::SettingsDisplay *ui; - int machineId = 0; - int videoCard = 0; - int videoCard_2 = 0; + int machineId = 0; + int videoCard[2] = { 0, 0 }; }; #endif // QT_SETTINGSDISPLAY_HPP diff --git a/src/unix/unix.c b/src/unix/unix.c index b9e842280..730d5be4c 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1074,7 +1074,7 @@ monitor_thread(void *param) #endif } -extern int gfxcard_2; +extern int gfxcard[2]; int main(int argc, char **argv) { @@ -1089,7 +1089,7 @@ main(int argc, char **argv) return 6; } - gfxcard_2 = 0; + gfxcard[1] = 0; eventthread = SDL_ThreadID(); blitmtx = SDL_CreateMutex(); if (!blitmtx) { diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 92b82d17a..fb6624ced 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -331,7 +331,7 @@ video_reset(int card) if ((video_get_type() != VIDEO_FLAG_TYPE_NONE) && was_reset) return; - vid_table_log("VIDEO: reset (gfxcard=%d, internal=%d)\n", + vid_table_log("VIDEO: reset (gfxcard[0]=%d, internal=%d)\n", card, machine_has_flags(machine, MACHINE_VIDEO) ? 1 : 0); monitor_index_global = 0; @@ -349,11 +349,11 @@ video_reset(int card) if (!(card == VID_NONE) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY) - && gfxcard_2 != 0 - && device_is_valid(video_card_getdevice(gfxcard_2), machine)) { + && gfxcard[1] != 0 + && device_is_valid(video_card_getdevice(gfxcard[1]), machine)) { video_monitor_init(1); monitor_index_global = 1; - device_add(video_cards[gfxcard_2].device); + device_add(video_cards[gfxcard[1]].device); monitor_index_global = 0; } diff --git a/src/win/win.c b/src/win/win.c index 3dd41fca9..69561036d 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -488,8 +488,8 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow) return (1); } - extern int gfxcard_2; - gfxcard_2 = 0; + extern int gfxcard[2]; + gfxcard[1] = 0; /* Create console window. */ if (force_debug) { diff --git a/src/win/win_settings.c b/src/win/win_settings.c index ea8d356b9..37a8aafb0 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -93,7 +93,7 @@ static int temp_dynarec; #endif /* Video category */ -static int temp_gfxcard, temp_gfxcard_2, temp_ibm8514, temp_voodoo, temp_xga; +static int temp_gfxcard[2], temp_ibm8514, temp_voodoo, temp_xga; /* Input devices category */ static int temp_mouse, temp_joystick; @@ -326,8 +326,8 @@ win_settings_init(void) temp_sync = time_sync; /* Video category */ - temp_gfxcard = gfxcard; - temp_gfxcard_2 = gfxcard_2; + temp_gfxcard[0] = gfxcard[0]; + temp_gfxcard[1] = gfxcard[1]; temp_voodoo = voodoo_enabled; temp_ibm8514 = ibm8514_enabled; temp_xga = xga_enabled; @@ -453,8 +453,8 @@ win_settings_changed(void) i = i || (temp_sync != time_sync); /* Video category */ - i = i || (gfxcard != temp_gfxcard); - i = i || (gfxcard_2 != temp_gfxcard_2); + i = i || (gfxcard[0] != temp_gfxcard[0]); + i = i || (gfxcard[1] != temp_gfxcard[1]); i = i || (voodoo_enabled != temp_voodoo); i = i || (ibm8514_enabled != temp_ibm8514); i = i || (xga_enabled != temp_xga); @@ -546,8 +546,8 @@ win_settings_save(void) time_sync = temp_sync; /* Video category */ - gfxcard = temp_gfxcard; - gfxcard_2 = temp_gfxcard_2; + gfxcard[0] = temp_gfxcard[0]; + gfxcard[1] = temp_gfxcard[1]; voodoo_enabled = temp_voodoo; ibm8514_enabled = temp_ibm8514; xga_enabled = temp_xga; @@ -1090,7 +1090,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) else settings_add_string(hdlg, IDC_COMBO_VIDEO, (LPARAM) device_name); settings_list_to_device[0][d] = c; - if ((c == 0) || (c == temp_gfxcard)) + if ((c == 0) || (c == temp_gfxcard[0])) settings_set_cur_sel(hdlg, IDC_COMBO_VIDEO, d); d++; } @@ -1120,7 +1120,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if (!device_name[0]) break; - if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard))) { + if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard[0]))) { c++; continue; } @@ -1133,7 +1133,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) else settings_add_string(hdlg, IDC_COMBO_VIDEO_2, (LPARAM) device_name); settings_list_to_device[1][d] = c; - if ((c == 0) || (c == temp_gfxcard_2)) + if ((c == 0) || (c == temp_gfxcard[1])) settings_set_cur_sel(hdlg, IDC_COMBO_VIDEO_2, d); d++; } @@ -1163,8 +1163,8 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_COMBO_VIDEO: - temp_gfxcard = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; - settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(temp_gfxcard)); + temp_gfxcard[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; + settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(temp_gfxcard[0])); // Secondary Video Card c = d = 0; @@ -1182,7 +1182,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) if (!device_name[0]) break; - if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard))) { + if ((c > 1) && (video_card_get_flags(c) == video_card_get_flags(temp_gfxcard[0]))) { c++; continue; } @@ -1195,7 +1195,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) else settings_add_string(hdlg, IDC_COMBO_VIDEO_2, (LPARAM) device_name); settings_list_to_device[1][d] = c; - if ((c == 0) || (c == temp_gfxcard_2)) + if ((c == 0) || (c == temp_gfxcard[1])) settings_set_cur_sel(hdlg, IDC_COMBO_VIDEO_2, d); d++; } @@ -1211,8 +1211,8 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_COMBO_VIDEO_2: - temp_gfxcard_2 = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; - settings_enable_window(hdlg, IDC_CONFIGURE_VID_2, video_card_has_config(temp_gfxcard_2)); + temp_gfxcard[1] = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; + settings_enable_window(hdlg, IDC_CONFIGURE_VID_2, video_card_has_config(temp_gfxcard[1])); break; case IDC_CHECK_VOODOO: @@ -1241,23 +1241,23 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_CONFIGURE_VID: - temp_gfxcard = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) video_card_getdevice(temp_gfxcard)); + temp_gfxcard[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) video_card_getdevice(temp_gfxcard[0])); break; case IDC_CONFIGURE_VID_2: - temp_gfxcard_2 = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) video_card_getdevice(temp_gfxcard_2)); + temp_gfxcard[1] = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) video_card_getdevice(temp_gfxcard[1])); break; } return FALSE; case WM_SAVESETTINGS: - temp_gfxcard = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; - temp_gfxcard_2 = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; - temp_voodoo = settings_get_check(hdlg, IDC_CHECK_VOODOO); - temp_ibm8514 = settings_get_check(hdlg, IDC_CHECK_IBM8514); - temp_xga = settings_get_check(hdlg, IDC_CHECK_XGA); + temp_gfxcard[0] = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)]; + temp_gfxcard[1] = settings_list_to_device[1][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO_2)]; + temp_voodoo = settings_get_check(hdlg, IDC_CHECK_VOODOO); + temp_ibm8514 = settings_get_check(hdlg, IDC_CHECK_IBM8514); + temp_xga = settings_get_check(hdlg, IDC_CHECK_XGA); default: return FALSE; From 3b5cfe8bfc42984ae2e563ef7ca5705ddad12241 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 12:46:37 -0500 Subject: [PATCH 11/29] Update libslirp to 4.7.0 with our customizations --- src/include/slirp/libslirp-version.h | 6 +- src/include/slirp/libslirp.h | 121 ++++++- src/include/tinyglib.h | 2 + src/network/net_slirp.c | 8 +- src/network/slirp/CMakeLists.txt | 9 +- src/network/slirp/arp_table.c | 26 +- src/network/slirp/bootp.c | 59 +++- src/network/slirp/bootp.h | 3 +- src/network/slirp/cksum.c | 2 +- src/network/slirp/debug.h | 8 + src/network/slirp/if.c | 23 +- src/network/slirp/ip.h | 14 +- src/network/slirp/ip6.h | 2 +- src/network/slirp/ip6_icmp.c | 43 ++- src/network/slirp/ip6_icmp.h | 23 +- src/network/slirp/ip6_input.c | 9 +- src/network/slirp/ip6_output.c | 6 + src/network/slirp/ip_icmp.c | 121 ++++--- src/network/slirp/ip_icmp.h | 2 + src/network/slirp/ip_input.c | 18 +- src/network/slirp/ip_output.c | 2 + src/network/slirp/libslirp-version.h | 6 +- src/network/slirp/libslirp.h | 121 ++++++- src/network/slirp/mbuf.c | 89 +++++- src/network/slirp/mbuf.h | 65 ++++ src/network/slirp/misc.c | 104 ++++-- src/network/slirp/ncsi-pkt.h | 229 +++++++++++-- src/network/slirp/ncsi.c | 12 +- src/network/slirp/ndp_table.c | 29 +- src/network/slirp/sbuf.c | 2 +- src/network/slirp/slirp.c | 460 +++++++++++++++++++++++++-- src/network/slirp/slirp.h | 36 ++- src/network/slirp/socket.c | 383 +++++++++++++++++++--- src/network/slirp/socket.h | 62 +++- src/network/slirp/state.c | 2 +- src/network/slirp/tcp.h | 2 +- src/network/slirp/tcp_input.c | 37 ++- src/network/slirp/tcp_subr.c | 59 +++- src/network/slirp/tcp_timer.c | 6 +- src/network/slirp/tcpip.h | 4 +- src/network/slirp/tftp.c | 62 ++-- src/network/slirp/tftp.h | 12 +- src/network/slirp/tinyglib.c | 12 + src/network/slirp/udp.c | 114 +++++-- src/network/slirp/udp.h | 6 + src/network/slirp/udp6.c | 27 +- src/network/slirp/util.c | 13 + src/network/slirp/util.h | 23 +- src/network/slirp/vmstate.h | 13 +- src/win/Makefile.mingw | 15 +- 50 files changed, 2071 insertions(+), 441 deletions(-) diff --git a/src/include/slirp/libslirp-version.h b/src/include/slirp/libslirp-version.h index 1599206a5..b68906957 100644 --- a/src/include/slirp/libslirp-version.h +++ b/src/include/slirp/libslirp-version.h @@ -7,9 +7,9 @@ extern "C" { #endif #define SLIRP_MAJOR_VERSION 4 -#define SLIRP_MINOR_VERSION 3 -#define SLIRP_MICRO_VERSION 1 -#define SLIRP_VERSION_STRING "4.3.1-git-86Box" +#define SLIRP_MINOR_VERSION 7 +#define SLIRP_MICRO_VERSION 0 +#define SLIRP_VERSION_STRING "4.7.0-86Box" #define SLIRP_CHECK_VERSION(major,minor,micro) \ (SLIRP_MAJOR_VERSION > (major) || \ diff --git a/src/include/slirp/libslirp.h b/src/include/slirp/libslirp.h index 7c4340390..7a6c9a4da 100644 --- a/src/include/slirp/libslirp.h +++ b/src/include/slirp/libslirp.h @@ -8,6 +8,7 @@ #ifdef _WIN32 #include +#include #include #else #include @@ -31,8 +32,10 @@ extern "C" { #endif +/* Opaque structure containing the slirp state */ typedef struct Slirp Slirp; +/* Flags passed to SlirpAddPollCb and to be returned by SlirpGetREventsCb. */ enum { SLIRP_POLL_IN = 1 << 0, SLIRP_POLL_OUT = 1 << 1, @@ -47,38 +50,58 @@ typedef void (*SlirpTimerCb)(void *opaque); typedef int (*SlirpAddPollCb)(int fd, int events, void *opaque); typedef int (*SlirpGetREventsCb)(int idx, void *opaque); +typedef enum SlirpTimerId { + SLIRP_TIMER_RA, + SLIRP_TIMER_NUM, +} SlirpTimerId; + /* - * Callbacks from slirp + * Callbacks from slirp, to be set by the application. + * + * The opaque parameter is set to the opaque pointer given in the slirp_new / + * slirp_init call. */ typedef struct SlirpCb { /* - * Send an ethernet frame to the guest network. The opaque - * parameter is the one given to slirp_init(). The function - * doesn't need to send all the data and may return vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr; ArpTable *arptbl = &slirp->arp_table; int i; +/* + char ethaddr_str[ETH_ADDRSTRLEN]; + char addr[INET_ADDRSTRLEN]; DEBUG_CALL("arp_table_add"); - DEBUG_ARG("ip = %s", inet_ntoa((struct in_addr){ .s_addr = ip_addr })); - DEBUG_ARG("hw addr = %02x:%02x:%02x:%02x:%02x:%02x", ethaddr[0], ethaddr[1], - ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]); + DEBUG_ARG("ip = %s", inet_ntop(AF_INET, &(struct in_addr){ .s_addr = ip_addr }, + addr, sizeof(addr))); + DEBUG_ARG("hw addr = %s", slirp_ether_ntoa(ethaddr, ethaddr_str, + sizeof(ethaddr_str))); +*/ if (ip_addr == 0 || ip_addr == 0xffffffff || ip_addr == broadcast_addr) { /* Do not register broadcast addresses */ @@ -67,9 +72,14 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr, ~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr; ArpTable *arptbl = &slirp->arp_table; int i; +/* + char ethaddr_str[ETH_ADDRSTRLEN]; + char addr[INET_ADDRSTRLEN]; DEBUG_CALL("arp_table_search"); - DEBUG_ARG("ip = %s", inet_ntoa((struct in_addr){ .s_addr = ip_addr })); + DEBUG_ARG("ip = %s", inet_ntop(AF_INET, &(struct in_addr){ .s_addr = ip_addr }, + addr, sizeof(addr))); +*/ /* If broadcast address */ if (ip_addr == 0 || ip_addr == 0xffffffff || ip_addr == broadcast_addr) { @@ -81,9 +91,11 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr, for (i = 0; i < ARP_TABLE_SIZE; i++) { if (arptbl->table[i].ar_sip == ip_addr) { memcpy(out_ethaddr, arptbl->table[i].ar_sha, ETH_ALEN); - DEBUG_ARG("found hw addr = %02x:%02x:%02x:%02x:%02x:%02x", - out_ethaddr[0], out_ethaddr[1], out_ethaddr[2], - out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]); +/* + DEBUG_ARG("found hw addr = %s", + slirp_ether_ntoa(out_ethaddr, ethaddr_str, + sizeof(ethaddr_str))); +*/ return 1; } } diff --git a/src/network/slirp/bootp.c b/src/network/slirp/bootp.c index 46e96810a..a0eb17a9d 100644 --- a/src/network/slirp/bootp.c +++ b/src/network/slirp/bootp.c @@ -34,6 +34,8 @@ #define LEASE_TIME (24 * 3600) +#define UEFI_HTTP_VENDOR_CLASS_ID "HTTPClient" + static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE }; #define DPRINTF(fmt, ...) DEBUG_CALL(fmt, ##__VA_ARGS__) @@ -92,21 +94,22 @@ found: return bc; } -static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type, +static void dhcp_decode(const struct bootp_t *bp, + const uint8_t *bp_end, + int *pmsg_type, struct in_addr *preq_addr) { - const uint8_t *p, *p_end; + const uint8_t *p; int len, tag; *pmsg_type = 0; preq_addr->s_addr = htonl(0L); p = bp->bp_vend; - p_end = p + DHCP_OPT_LEN; if (memcmp(p, rfc1533_cookie, 4) != 0) return; p += 4; - while (p < p_end) { + while (p < bp_end) { tag = p[0]; if (tag == RFC1533_PAD) { p++; @@ -114,10 +117,10 @@ static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type, break; } else { p++; - if (p >= p_end) + if (p >= bp_end) break; len = *p++; - if (p + len > p_end) { + if (p + len > bp_end) { break; } DPRINTF("dhcp: tag=%d len=%d\n", tag, len); @@ -144,7 +147,9 @@ static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type, } } -static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) +static void bootp_reply(Slirp *slirp, + const struct bootp_t *bp, + const uint8_t *bp_end) { BOOTPClient *bc = NULL; struct mbuf *m; @@ -157,7 +162,7 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) uint8_t client_ethaddr[ETH_ALEN]; /* extract exact DHCP msg type */ - dhcp_decode(bp, &dhcp_msg_type, &preq_addr); + dhcp_decode(bp, bp_end, &dhcp_msg_type, &preq_addr); DPRINTF("bootp packet op=%d msgtype=%d", bp->bp_op, dhcp_msg_type); if (preq_addr.s_addr != htonl(0L)) DPRINTF(" req_addr=%08" PRIx32 "\n", ntohl(preq_addr.s_addr)); @@ -179,9 +184,10 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) return; } m->m_data += IF_MAXLINKHDR; + m_inc(m, sizeof(struct bootp_t) + DHCP_OPT_LEN); rbp = (struct bootp_t *)m->m_data; m->m_data += sizeof(struct udpiphdr); - memset(rbp, 0, sizeof(struct bootp_t)); + memset(rbp, 0, sizeof(struct bootp_t) + DHCP_OPT_LEN); if (dhcp_msg_type == DHCPDISCOVER) { if (preq_addr.s_addr != htonl(0L)) { @@ -235,7 +241,7 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) rbp->bp_siaddr = saddr.sin_addr; /* Server IP address */ q = rbp->bp_vend; - end = (uint8_t *)&rbp[1]; + end = rbp->bp_vend + DHCP_OPT_LEN; memcpy(q, rfc1533_cookie, 4); q += 4; @@ -336,6 +342,27 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) q += val; } } + + /* this allows to support UEFI HTTP boot: according to the UEFI + specification, DHCP server must send vendor class identifier option + set to "HTTPClient" string, when responding to DHCP requests as part + of the UEFI HTTP boot + + we assume that, if the bootfile parameter was configured as an http + URL, the user intends to perform UEFI HTTP boot, so send this option + automatically */ + if (slirp->bootp_filename && g_str_has_prefix(slirp->bootp_filename, "http://")) { + val = strlen(UEFI_HTTP_VENDOR_CLASS_ID); + if (q + val + 2 >= end) { + g_warning("DHCP packet size exceeded, " + "omitting vendor class id option."); + } else { + *q++ = RFC2132_VENDOR_CLASS_ID; + *q++ = val; + memcpy(q, UEFI_HTTP_VENDOR_CLASS_ID, val); + q += val; + } + } } else { static const char nak_msg[] = "requested address not available"; @@ -351,19 +378,21 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) q += sizeof(nak_msg) - 1; } assert(q < end); - *q = RFC1533_END; + *q++ = RFC1533_END; daddr.sin_addr.s_addr = 0xffffffffu; - m->m_len = sizeof(struct bootp_t) - sizeof(struct ip) - sizeof(struct udphdr); + assert(q <= end); + + m->m_len = sizeof(struct bootp_t) + (end - rbp->bp_vend) - sizeof(struct ip) - sizeof(struct udphdr); udp_output(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY); } void bootp_input(struct mbuf *m) { - struct bootp_t *bp = mtod(m, struct bootp_t *); + struct bootp_t *bp = mtod_check(m, sizeof(struct bootp_t)); - if (bp->bp_op == BOOTP_REQUEST) { - bootp_reply(m->slirp, bp); + if (!m->slirp->disable_dhcp && bp && bp->bp_op == BOOTP_REQUEST) { + bootp_reply(m->slirp, bp, m_end(m)); } } diff --git a/src/network/slirp/bootp.h b/src/network/slirp/bootp.h index a57fa51bc..cf7797fac 100644 --- a/src/network/slirp/bootp.h +++ b/src/network/slirp/bootp.h @@ -71,6 +71,7 @@ #define RFC2132_MAX_SIZE 57 #define RFC2132_RENEWAL_TIME 58 #define RFC2132_REBIND_TIME 59 +#define RFC2132_VENDOR_CLASS_ID 60 #define RFC2132_TFTP_SERVER_NAME 66 #define DHCPDISCOVER 1 @@ -114,7 +115,7 @@ struct bootp_t { uint8_t bp_hwaddr[16]; uint8_t bp_sname[64]; char bp_file[128]; - uint8_t bp_vend[DHCP_OPT_LEN]; + uint8_t bp_vend[]; }; typedef struct { diff --git a/src/network/slirp/cksum.c b/src/network/slirp/cksum.c index 4d08380a4..b1cb97b7e 100644 --- a/src/network/slirp/cksum.c +++ b/src/network/slirp/cksum.c @@ -47,7 +47,7 @@ { \ l_util.l = sum; \ sum = l_util.s[0] + l_util.s[1]; \ - (void)ADDCARRY(sum); \ + ADDCARRY(sum); \ } int cksum(struct mbuf *m, int len) diff --git a/src/network/slirp/debug.h b/src/network/slirp/debug.h index 47712bd78..0f9f3eff3 100644 --- a/src/network/slirp/debug.h +++ b/src/network/slirp/debug.h @@ -10,6 +10,7 @@ #define DBG_MISC (1 << 1) #define DBG_ERROR (1 << 2) #define DBG_TFTP (1 << 3) +#define DBG_VERBOSE_CALL (1 << 4) extern int slirp_debug; @@ -20,6 +21,13 @@ extern int slirp_debug; } \ } while (0) +#define DEBUG_VERBOSE_CALL(fmt, ...) \ + do { \ + if (G_UNLIKELY(slirp_debug & DBG_VERBOSE_CALL)) { \ + g_debug(fmt "...", ##__VA_ARGS__); \ + } \ + } while (0) + #define DEBUG_ARG(fmt, ...) \ do { \ if (G_UNLIKELY(slirp_debug & DBG_CALL)) { \ diff --git a/src/network/slirp/if.c b/src/network/slirp/if.c index 23190b559..741473dc4 100644 --- a/src/network/slirp/if.c +++ b/src/network/slirp/if.c @@ -41,6 +41,8 @@ void if_init(Slirp *slirp) void if_output(struct socket *so, struct mbuf *ifm) { Slirp *slirp = ifm->slirp; + M_DUP_DEBUG(slirp, ifm, 0, 0); + struct mbuf *ifq; int on_fastq = 1; @@ -54,7 +56,7 @@ void if_output(struct socket *so, struct mbuf *ifm) * XXX Shouldn't need this, gotta change dtom() etc. */ if (ifm->m_flags & M_USEDLIST) { - remque(ifm); + slirp_remque(ifm); ifm->m_flags &= ~M_USEDLIST; } @@ -68,7 +70,8 @@ void if_output(struct socket *so, struct mbuf *ifm) */ if (so) { for (ifq = (struct mbuf *)slirp->if_batchq.qh_rlink; - (struct quehead *)ifq != &slirp->if_batchq; ifq = ifq->ifq_prev) { + (struct slirp_quehead *)ifq != &slirp->if_batchq; + ifq = ifq->ifq_prev) { if (so == ifq->ifq_so) { /* A match! */ ifm->ifq_so = so; @@ -98,7 +101,7 @@ void if_output(struct socket *so, struct mbuf *ifm) /* Create a new doubly linked list for this session */ ifm->ifq_so = so; ifs_init(ifm); - insque(ifm, ifq); + slirp_insque(ifm, ifq); diddit: if (so) { @@ -115,10 +118,10 @@ diddit: if (on_fastq && ((so->so_nqueued >= 6) && (so->so_nqueued - so->so_queued) >= 3)) { /* Remove from current queue... */ - remque(ifm->ifs_next); + slirp_remque(ifm->ifs_next); /* ...And insert in the new. That'll teach ya! */ - insque(ifm->ifs_next, &slirp->if_batchq); + slirp_insque(ifm->ifs_next, &slirp->if_batchq); } } @@ -143,7 +146,7 @@ void if_start(Slirp *slirp) bool from_batchq = false; struct mbuf *ifm, *ifm_next, *ifqt; - DEBUG_CALL("if_start"); + DEBUG_VERBOSE_CALL("if_start"); if (slirp->if_start_busy) { return; @@ -169,12 +172,12 @@ void if_start(Slirp *slirp) ifm = ifm_next; ifm_next = ifm->ifq_next; - if ((struct quehead *)ifm_next == &slirp->if_fastq) { + if ((struct slirp_quehead *)ifm_next == &slirp->if_fastq) { /* No more packets in fastq, switch to batchq */ ifm_next = batch_head; from_batchq = true; } - if ((struct quehead *)ifm_next == &slirp->if_batchq) { + if ((struct slirp_quehead *)ifm_next == &slirp->if_batchq) { /* end of batchq */ ifm_next = NULL; } @@ -187,13 +190,13 @@ void if_start(Slirp *slirp) /* Remove it from the queue */ ifqt = ifm->ifq_prev; - remque(ifm); + slirp_remque(ifm); /* If there are more packets for this session, re-queue them */ if (ifm->ifs_next != ifm) { struct mbuf *next = ifm->ifs_next; - insque(next, ifqt); + slirp_insque(next, ifqt); ifs_remque(ifm); if (!from_batchq) { ifm_next = next; diff --git a/src/network/slirp/ip.h b/src/network/slirp/ip.h index fba3defa1..c4203f635 100644 --- a/src/network/slirp/ip.h +++ b/src/network/slirp/ip.h @@ -75,7 +75,7 @@ typedef uint32_t n_long; /* long as received from the net */ #pragma pack(push, 1) #endif struct ip { -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t ip_v : 4, /* version */ ip_hl : 4; /* header length */ #else @@ -147,7 +147,7 @@ struct ip_timestamp { uint8_t ipt_code; /* IPOPT_TS */ uint8_t ipt_len; /* size of structure (variable) */ uint8_t ipt_ptr; /* index of current entry */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t ipt_oflw : 4, /* overflow counter */ ipt_flg : 4; /* flags, see below */ #else @@ -190,22 +190,28 @@ struct ip_timestamp { #define IP_MSS 576 /* default maximum segment size */ +#if GLIB_SIZEOF_VOID_P == 4 #if defined(_MSC_VER) && !defined (__clang__) #pragma pack(push, 1) #endif -#if GLIB_SIZEOF_VOID_P == 4 struct mbuf_ptr { struct mbuf *mptr; uint32_t dummy; } SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif #else +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct mbuf_ptr { struct mbuf *mptr; } SLIRP_PACKED; -#endif #if defined(_MSC_VER) && !defined (__clang__) #pragma pack(pop) #endif +#endif struct qlink { void *next, *prev; }; diff --git a/src/network/slirp/ip6.h b/src/network/slirp/ip6.h index 7210964d4..73a00b114 100644 --- a/src/network/slirp/ip6.h +++ b/src/network/slirp/ip6.h @@ -176,7 +176,7 @@ static inline void in6_compute_ethaddr(struct in6_addr ip, * Structure of an internet header, naked of options. */ struct ip6 { -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint32_t ip_v : 4, /* version */ ip_tc_hi : 4, /* traffic class */ ip_tc_lo : 4, ip_fl_hi : 4, /* flow label */ diff --git a/src/network/slirp/ip6_icmp.c b/src/network/slirp/ip6_icmp.c index d9c872bc9..0d7ee69ca 100644 --- a/src/network/slirp/ip6_icmp.c +++ b/src/network/slirp/ip6_icmp.c @@ -10,25 +10,14 @@ #define NDP_Interval \ g_rand_int_range(slirp->grand, NDP_MinRtrAdvInterval, NDP_MaxRtrAdvInterval) -static void ra_timer_handler(void *opaque) -{ - Slirp *slirp = opaque; - - slirp->cb->timer_mod(slirp->ra_timer, - slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + - NDP_Interval, - slirp->opaque); - ndp_send_ra(slirp); -} - -void icmp6_init(Slirp *slirp) +void icmp6_post_init(Slirp *slirp) { if (!slirp->in6_enabled) { return; } slirp->ra_timer = - slirp->cb->timer_new(ra_timer_handler, slirp, slirp->opaque); + slirp_timer_new(slirp, SLIRP_TIMER_RA, NULL); slirp->cb->timer_mod(slirp->ra_timer, slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + NDP_Interval, @@ -69,7 +58,7 @@ static void icmp6_send_echoreply(struct mbuf *m, Slirp *slirp, struct ip6 *ip, ip6_output(NULL, t, 0); } -void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code) +void icmp6_forward_error(struct mbuf *m, uint8_t type, uint8_t code, struct in6_addr *src) { Slirp *slirp = m->slirp; struct mbuf *t; @@ -88,7 +77,7 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code) /* IPv6 packet */ struct ip6 *rip = mtod(t, struct ip6 *); - rip->ip_src = (struct in6_addr)LINKLOCAL_ADDR; + rip->ip_src = *src; rip->ip_dst = ip->ip_src; inet_ntop(AF_INET6, &rip->ip_dst, addrstr, INET6_ADDRSTRLEN); DEBUG_ARG("target = %s", addrstr); @@ -131,10 +120,16 @@ void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code) ip6_output(NULL, t, 0); } +void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code) +{ + struct in6_addr src = LINKLOCAL_ADDR; + icmp6_forward_error(m, type, code, &src); +} + /* * Send NDP Router Advertisement */ -void ndp_send_ra(Slirp *slirp) +static void ndp_send_ra(Slirp *slirp) { DEBUG_CALL("ndp_send_ra"); @@ -213,6 +208,15 @@ void ndp_send_ra(Slirp *slirp) ip6_output(NULL, t, 0); } +void ra_timer_handler(Slirp *slirp, void *unused) +{ + slirp->cb->timer_mod(slirp->ra_timer, + slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + + NDP_Interval, + slirp->opaque); + ndp_send_ra(slirp); +} + /* * Send NDP Neighbor Solitication */ @@ -315,6 +319,8 @@ static void ndp_send_na(Slirp *slirp, struct ip6 *ip, struct icmp6 *icmp) static void ndp_input(struct mbuf *m, Slirp *slirp, struct ip6 *ip, struct icmp6 *icmp) { + g_assert(M_ROOMBEFORE(m) >= ETH_HLEN); + m->m_len += ETH_HLEN; m->m_data -= ETH_HLEN; struct ethhdr *eth = mtod(m, struct ethhdr *); @@ -377,9 +383,12 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, struct ip6 *ip, */ void icmp6_input(struct mbuf *m) { + Slirp *slirp = m->slirp; + /* NDP reads the ethernet header for gratuitous NDP */ + M_DUP_DEBUG(slirp, m, 1, ETH_HLEN); + struct icmp6 *icmp; struct ip6 *ip = mtod(m, struct ip6 *); - Slirp *slirp = m->slirp; int hlen = sizeof(struct ip6); DEBUG_CALL("icmp6_input"); diff --git a/src/network/slirp/ip6_icmp.h b/src/network/slirp/ip6_icmp.h index 77772a76b..02761b726 100644 --- a/src/network/slirp/ip6_icmp.h +++ b/src/network/slirp/ip6_icmp.h @@ -35,7 +35,7 @@ struct ndp_rs { /* Router Solicitation Message */ struct ndp_ra { /* Router Advertisement Message */ uint8_t chl; /* Cur Hop Limit */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t M : 1, O : 1, reserved : 6; #else uint8_t reserved : 6, O : 1, M : 1; @@ -55,7 +55,7 @@ struct ndp_ns { /* Neighbor Solicitation Message */ G_STATIC_ASSERT(sizeof(struct ndp_ns) == 20); struct ndp_na { /* Neighbor Advertisement Message */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint32_t R : 1, /* Router Flag */ S : 1, /* Solicited Flag */ O : 1, /* Override Flag */ @@ -124,9 +124,12 @@ struct ndpopt { union { unsigned char linklayer_addr[6]; /* Source/Target Link-layer */ #define ndpopt_linklayer ndpopt_body.linklayer_addr +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct prefixinfo { /* Prefix Information */ uint8_t prefix_length; -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t L : 1, A : 1, reserved1 : 6; #else uint8_t reserved1 : 6, A : 1, L : 1; @@ -136,12 +139,21 @@ struct ndpopt { uint32_t reserved2; struct in6_addr prefix; } SLIRP_PACKED prefixinfo; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif #define ndpopt_prefixinfo ndpopt_body.prefixinfo +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct rdnss { uint16_t reserved; uint32_t lifetime; struct in6_addr addr; } SLIRP_PACKED rdnss; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif #define ndpopt_rdnss ndpopt_body.rdnss } ndpopt_body; } SLIRP_PACKED; @@ -215,11 +227,12 @@ struct ndpopt { #define NDP_AdvPrefLifetime 14400 #define NDP_AdvAutonomousFlag 1 -void icmp6_init(Slirp *slirp); +void icmp6_post_init(Slirp *slirp); void icmp6_cleanup(Slirp *slirp); void icmp6_input(struct mbuf *); +void icmp6_forward_error(struct mbuf *m, uint8_t type, uint8_t code, struct in6_addr *src); void icmp6_send_error(struct mbuf *m, uint8_t type, uint8_t code); -void ndp_send_ra(Slirp *slirp); void ndp_send_ns(Slirp *slirp, struct in6_addr addr); +void ra_timer_handler(Slirp *slirp, void *unused); #endif diff --git a/src/network/slirp/ip6_input.c b/src/network/slirp/ip6_input.c index a83e4f8e3..4aca08285 100644 --- a/src/network/slirp/ip6_input.c +++ b/src/network/slirp/ip6_input.c @@ -11,9 +11,9 @@ * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. */ -void ip6_init(Slirp *slirp) +void ip6_post_init(Slirp *slirp) { - icmp6_init(slirp); + icmp6_post_init(slirp); } void ip6_cleanup(Slirp *slirp) @@ -23,8 +23,11 @@ void ip6_cleanup(Slirp *slirp) void ip6_input(struct mbuf *m) { - struct ip6 *ip6; Slirp *slirp = m->slirp; + /* NDP reads the ethernet header for gratuitous NDP */ + M_DUP_DEBUG(slirp, m, 1, TCPIPHDR_DELTA + 2 + ETH_HLEN); + + struct ip6 *ip6; if (!slirp->in6_enabled) { goto bad; diff --git a/src/network/slirp/ip6_output.c b/src/network/slirp/ip6_output.c index b86110662..834f1c0a3 100644 --- a/src/network/slirp/ip6_output.c +++ b/src/network/slirp/ip6_output.c @@ -15,6 +15,9 @@ */ int ip6_output(struct socket *so, struct mbuf *m, int fast) { + Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + struct ip6 *ip = mtod(m, struct ip6 *); DEBUG_CALL("ip6_output"); @@ -30,7 +33,10 @@ int ip6_output(struct socket *so, struct mbuf *m, int fast) ip->ip_fl_lo = 0; if (fast) { + /* We cannot fast-send non-multicast, we'd need a NDP NS */ + assert(IN6_IS_ADDR_MULTICAST(&ip->ip_dst)); if_encap(m->slirp, m); + m_free(m); } else { if_output(so, m); } diff --git a/src/network/slirp/ip_icmp.c b/src/network/slirp/ip_icmp.c index 13a0e5508..6ae523c69 100644 --- a/src/network/slirp/ip_icmp.c +++ b/src/network/slirp/ip_icmp.c @@ -85,13 +85,41 @@ void icmp_cleanup(Slirp *slirp) static int icmp_send(struct socket *so, struct mbuf *m, int hlen) { + Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + struct ip *ip = mtod(m, struct ip *); struct sockaddr_in addr; + /* + * The behavior of reading SOCK_DGRAM+IPPROTO_ICMP sockets is inconsistent + * between host OSes. On Linux, only the ICMP header and payload is + * included. On macOS/Darwin, the socket acts like a raw socket and + * includes the IP header as well. On other BSDs, SOCK_DGRAM+IPPROTO_ICMP + * sockets aren't supported at all, so we treat them like raw sockets. It + * isn't possible to detect this difference at runtime, so we must use an + * #ifdef to determine if we need to remove the IP header. + */ +#ifdef CONFIG_BSD + so->so_type = IPPROTO_IP; +#else + so->so_type = IPPROTO_ICMP; +#endif + so->s = slirp_socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP); + if (so->s == -1) { + if (errno == EAFNOSUPPORT + || errno == EPROTONOSUPPORT + || errno == EACCES) { + /* Kernel doesn't support or allow ping sockets. */ + so->so_type = IPPROTO_IP; + so->s = slirp_socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); + } + } if (so->s == -1) { return -1; } + so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); if (slirp_bind_outbound(so, AF_INET) != 0) { // bind failed - close socket @@ -104,14 +132,13 @@ static int icmp_send(struct socket *so, struct mbuf *m, int hlen) so->so_faddr = ip->ip_dst; so->so_laddr = ip->ip_src; so->so_iptos = ip->ip_tos; - so->so_type = IPPROTO_ICMP; so->so_state = SS_ISFCONNECTED; so->so_expire = curtime + SO_EXPIRE; addr.sin_family = AF_INET; addr.sin_addr = so->so_faddr; - insque(so, &so->slirp->icmp); + slirp_insque(so, &so->slirp->icmp); if (sendto(so->s, m->m_data + hlen, m->m_len - hlen, 0, (struct sockaddr *)&addr, sizeof(addr)) == -1) { @@ -136,10 +163,12 @@ void icmp_detach(struct socket *so) */ void icmp_input(struct mbuf *m, int hlen) { + Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + register struct icmp *icp; register struct ip *ip = mtod(m, struct ip *); int icmplen = ip->ip_len; - Slirp *slirp = m->slirp; DEBUG_CALL("icmp_input"); DEBUG_ARG("m = %p", m); @@ -176,10 +205,17 @@ void icmp_input(struct mbuf *m, int hlen) } else { struct socket *so; struct sockaddr_storage addr; - so = socreate(slirp); + int ttl; + + so = socreate(slirp, IPPROTO_ICMP); if (icmp_send(so, m, hlen) == 0) { + /* We could send this as ICMP, good! */ return; } + + /* We could not send this as ICMP, try to send it on UDP echo + * service (7), wishfully hoping that it is open there. */ + if (udp_attach(so, AF_INET) == -1) { DEBUG_MISC("icmp_input udp_attach errno = %d-%s", errno, strerror(errno)); @@ -195,7 +231,6 @@ void icmp_input(struct mbuf *m, int hlen) so->so_laddr = ip->ip_src; so->so_lport = htons(9); so->so_iptos = ip->ip_tos; - so->so_type = IPPROTO_ICMP; so->so_state = SS_ISFCONNECTED; /* Send the packet */ @@ -207,6 +242,19 @@ void icmp_input(struct mbuf *m, int hlen) return; } + /* + * Check for TTL + */ + ttl = ip->ip_ttl-1; + if (ttl <= 0) { + DEBUG_MISC("udp ttl exceeded"); + icmp_send_error(m, ICMP_TIMXCEED, ICMP_TIMXCEED_INTRANS, 0, + NULL); + udp_detach(so); + break; + } + setsockopt(so->s, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); + if (sendto(so->s, icmp_ping_msg, strlen(icmp_ping_msg), 0, (struct sockaddr *)&addr, sockaddr_size(&addr)) == -1) { DEBUG_MISC("icmp_input udp sendto tx errno = %d-%s", errno, @@ -230,7 +278,7 @@ void icmp_input(struct mbuf *m, int hlen) default: m_free(m); - } /* swith */ + } /* switch */ end_error: /* m is m_free()'d xor put in a socket xor or given to ip_send */ @@ -256,8 +304,8 @@ end_error: */ #define ICMP_MAXDATALEN (IP_MSS - 28) -void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, - const char *message) +void icmp_forward_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, + const char *message, struct in_addr *src) { unsigned hlen, shlen, s_ip_len; register struct ip *ip; @@ -276,10 +324,12 @@ void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, goto end_error; ip = mtod(msrc, struct ip *); if (slirp_debug & DBG_MISC) { - char bufa[20], bufb[20]; - slirp_pstrcpy(bufa, sizeof(bufa), inet_ntoa(ip->ip_src)); - slirp_pstrcpy(bufb, sizeof(bufb), inet_ntoa(ip->ip_dst)); - DEBUG_MISC(" %.16s to %.16s", bufa, bufb); + char addr_src[INET_ADDRSTRLEN]; + char addr_dst[INET_ADDRSTRLEN]; + + inet_ntop(AF_INET, &ip->ip_src, addr_src, sizeof(addr_src)); + inet_ntop(AF_INET, &ip->ip_dst, addr_dst, sizeof(addr_dst)); + DEBUG_MISC(" %.16s to %.16s", addr_src, addr_dst); } if (ip->ip_off & IP_OFFMASK) goto end_error; /* Only reply to fragment 0 */ @@ -372,15 +422,21 @@ void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, ip->ip_ttl = MAXTTL; ip->ip_p = IPPROTO_ICMP; ip->ip_dst = ip->ip_src; /* ip addresses */ - ip->ip_src = m->slirp->vhost_addr; + ip->ip_src = *src; - (void)ip_output((struct socket *)NULL, m); + ip_output((struct socket *)NULL, m); end_error: return; } #undef ICMP_MAXDATALEN +void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, + const char *message) +{ + icmp_forward_error(msrc, type, code, minsize, message, &msrc->slirp->vhost_addr); +} + /* * Reflect the ip packet back to the source */ @@ -428,7 +484,7 @@ void icmp_reflect(struct mbuf *m) ip->ip_src = icmp_dst; } - (void)ip_output((struct socket *)NULL, m); + ip_output((struct socket *)NULL, m); } void icmp_receive(struct socket *so) @@ -446,31 +502,24 @@ void icmp_receive(struct socket *so) id = icp->icmp_id; len = recv(so->s, icp, M_ROOM(m), 0); - /* - * The behavior of reading SOCK_DGRAM+IPPROTO_ICMP sockets is inconsistent - * between host OSes. On Linux, only the ICMP header and payload is - * included. On macOS/Darwin, the socket acts like a raw socket and - * includes the IP header as well. On other BSDs, SOCK_DGRAM+IPPROTO_ICMP - * sockets aren't supported at all, so we treat them like raw sockets. It - * isn't possible to detect this difference at runtime, so we must use an - * #ifdef to determine if we need to remove the IP header. - */ -#ifdef CONFIG_BSD - if (len >= sizeof(struct ip)) { - struct ip *inner_ip = mtod(m, struct ip *); - int inner_hlen = inner_ip->ip_hl << 2; - if (inner_hlen > len) { + + if (so->so_type == IPPROTO_IP) { + if (len >= sizeof(struct ip)) { + struct ip *inner_ip = mtod(m, struct ip *); + int inner_hlen = inner_ip->ip_hl << 2; + if (inner_hlen > len) { + len = -1; + errno = -EINVAL; + } else { + len -= inner_hlen; + memmove(icp, (unsigned char *)icp + inner_hlen, len); + } + } else { len = -1; errno = -EINVAL; - } else { - len -= inner_hlen; - memmove(icp, (unsigned char *)icp + inner_hlen, len); } - } else { - len = -1; - errno = -EINVAL; } -#endif + icp->icmp_id = id; m->m_data -= hlen; diff --git a/src/network/slirp/ip_icmp.h b/src/network/slirp/ip_icmp.h index 84707db24..569a08306 100644 --- a/src/network/slirp/ip_icmp.h +++ b/src/network/slirp/ip_icmp.h @@ -157,6 +157,8 @@ struct icmp { void icmp_init(Slirp *slirp); void icmp_cleanup(Slirp *slirp); void icmp_input(struct mbuf *, int); +void icmp_forward_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, + const char *message, struct in_addr *src); void icmp_send_error(struct mbuf *msrc, uint8_t type, uint8_t code, int minsize, const char *message); void icmp_reflect(struct mbuf *); diff --git a/src/network/slirp/ip_input.c b/src/network/slirp/ip_input.c index e04d1506d..b0a64da19 100644 --- a/src/network/slirp/ip_input.c +++ b/src/network/slirp/ip_input.c @@ -71,6 +71,8 @@ void ip_cleanup(Slirp *slirp) void ip_input(struct mbuf *m) { Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, TCPIPHDR_DELTA); + register struct ip *ip; int hlen; @@ -251,7 +253,7 @@ static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp) goto dropfrag; } fp = mtod(t, struct ipq *); - insque(&fp->ip_link, &slirp->ipq.ip_link); + slirp_insque(&fp->ip_link, &slirp->ipq.ip_link); fp->ipq_ttl = IPFRAGTTL; fp->ipq_p = ip->ip_p; fp->ipq_id = ip->ip_id; @@ -348,7 +350,7 @@ insert: /* * If the fragments concatenated to an mbuf that's bigger than the total * size of the fragment and the mbuf was not already using an m_ext buffer, - * then an m_ext buffer was alloced. But fp->ipq_next points to the old + * then an m_ext buffer was allocated. But fp->ipq_next points to the old * buffer (in the mbuf), so we must point ip into the new buffer. */ if (m->m_flags & M_EXT) { @@ -360,8 +362,8 @@ insert: ip->ip_tos &= ~1; ip->ip_src = fp->ipq_src; ip->ip_dst = fp->ipq_dst; - remque(&fp->ip_link); - (void)m_free(dtom(slirp, fp)); + slirp_remque(&fp->ip_link); + m_free(dtom(slirp, fp)); m->m_len += (ip->ip_hl << 2); m->m_data -= (ip->ip_hl << 2); @@ -386,13 +388,13 @@ static void ip_freef(Slirp *slirp, struct ipq *fp) ip_deq(q); m_free(dtom(slirp, q)); } - remque(&fp->ip_link); - (void)m_free(dtom(slirp, fp)); + slirp_remque(&fp->ip_link); + m_free(dtom(slirp, fp)); } /* * Put an ip fragment on a reassembly chain. - * Like insque, but pointers in middle of structure. + * Like slirp_insque, but pointers in middle of structure. */ static void ip_enq(register struct ipasfrag *p, register struct ipasfrag *prev) { @@ -405,7 +407,7 @@ static void ip_enq(register struct ipasfrag *p, register struct ipasfrag *prev) } /* - * To ip_enq as remque is to insque. + * To ip_enq as slirp_remque is to slirp_insque. */ static void ip_deq(register struct ipasfrag *p) { diff --git a/src/network/slirp/ip_output.c b/src/network/slirp/ip_output.c index 22916a37d..4f6260591 100644 --- a/src/network/slirp/ip_output.c +++ b/src/network/slirp/ip_output.c @@ -51,6 +51,8 @@ int ip_output(struct socket *so, struct mbuf *m0) { Slirp *slirp = m0->slirp; + M_DUP_DEBUG(slirp, m0, 0, 0); + register struct ip *ip; register struct mbuf *m = m0; register int hlen = sizeof(struct ip); diff --git a/src/network/slirp/libslirp-version.h b/src/network/slirp/libslirp-version.h index 1599206a5..b68906957 100644 --- a/src/network/slirp/libslirp-version.h +++ b/src/network/slirp/libslirp-version.h @@ -7,9 +7,9 @@ extern "C" { #endif #define SLIRP_MAJOR_VERSION 4 -#define SLIRP_MINOR_VERSION 3 -#define SLIRP_MICRO_VERSION 1 -#define SLIRP_VERSION_STRING "4.3.1-git-86Box" +#define SLIRP_MINOR_VERSION 7 +#define SLIRP_MICRO_VERSION 0 +#define SLIRP_VERSION_STRING "4.7.0-86Box" #define SLIRP_CHECK_VERSION(major,minor,micro) \ (SLIRP_MAJOR_VERSION > (major) || \ diff --git a/src/network/slirp/libslirp.h b/src/network/slirp/libslirp.h index 7c4340390..7a6c9a4da 100644 --- a/src/network/slirp/libslirp.h +++ b/src/network/slirp/libslirp.h @@ -8,6 +8,7 @@ #ifdef _WIN32 #include +#include #include #else #include @@ -31,8 +32,10 @@ extern "C" { #endif +/* Opaque structure containing the slirp state */ typedef struct Slirp Slirp; +/* Flags passed to SlirpAddPollCb and to be returned by SlirpGetREventsCb. */ enum { SLIRP_POLL_IN = 1 << 0, SLIRP_POLL_OUT = 1 << 1, @@ -47,38 +50,58 @@ typedef void (*SlirpTimerCb)(void *opaque); typedef int (*SlirpAddPollCb)(int fd, int events, void *opaque); typedef int (*SlirpGetREventsCb)(int idx, void *opaque); +typedef enum SlirpTimerId { + SLIRP_TIMER_RA, + SLIRP_TIMER_NUM, +} SlirpTimerId; + /* - * Callbacks from slirp + * Callbacks from slirp, to be set by the application. + * + * The opaque parameter is set to the opaque pointer given in the slirp_new / + * slirp_init call. */ typedef struct SlirpCb { /* - * Send an ethernet frame to the guest network. The opaque - * parameter is the one given to slirp_init(). The function - * doesn't need to send all the data and may return m_usedlist.qh_link = slirp->m_usedlist.qh_rlink = &slirp->m_usedlist; } -void m_cleanup(Slirp *slirp) +static void m_cleanup_list(struct slirp_quehead *list_head) { struct mbuf *m, *next; - m = (struct mbuf *)slirp->m_usedlist.qh_link; - while ((struct quehead *)m != &slirp->m_usedlist) { + m = (struct mbuf *)list_head->qh_link; + while ((struct slirp_quehead *)m != list_head) { next = m->m_next; if (m->m_flags & M_EXT) { g_free(m->m_ext); @@ -43,12 +43,16 @@ void m_cleanup(Slirp *slirp) g_free(m); m = next; } - m = (struct mbuf *)slirp->m_freelist.qh_link; - while ((struct quehead *)m != &slirp->m_freelist) { - next = m->m_next; - g_free(m); - m = next; - } + list_head->qh_link = list_head; + list_head->qh_rlink = list_head; +} + +void m_cleanup(Slirp *slirp) +{ + m_cleanup_list(&slirp->m_usedlist); + m_cleanup_list(&slirp->m_freelist); + m_cleanup_list(&slirp->if_batchq); + m_cleanup_list(&slirp->if_fastq); } /* @@ -66,19 +70,19 @@ struct mbuf *m_get(Slirp *slirp) DEBUG_CALL("m_get"); - if (slirp->m_freelist.qh_link == &slirp->m_freelist) { + if (MBUF_DEBUG || slirp->m_freelist.qh_link == &slirp->m_freelist) { m = g_malloc(SLIRP_MSIZE(slirp->if_mtu)); slirp->mbuf_alloced++; - if (slirp->mbuf_alloced > MBUF_THRESH) + if (MBUF_DEBUG || slirp->mbuf_alloced > MBUF_THRESH) flags = M_DOFREE; m->slirp = slirp; } else { m = (struct mbuf *)slirp->m_freelist.qh_link; - remque(m); + slirp_remque(m); } /* Insert it in the used list */ - insque(m, &slirp->m_usedlist); + slirp_insque(m, &slirp->m_usedlist); m->m_flags = (flags | M_USEDLIST); /* Initialise it */ @@ -101,11 +105,12 @@ void m_free(struct mbuf *m) if (m) { /* Remove from m_usedlist */ if (m->m_flags & M_USEDLIST) - remque(m); + slirp_remque(m); /* If it's M_EXT, free() it */ if (m->m_flags & M_EXT) { g_free(m->m_ext); + m->m_flags &= ~M_EXT; } /* * Either free() it or put it on the free list @@ -114,7 +119,7 @@ void m_free(struct mbuf *m) m->slirp->mbuf_alloced--; g_free(m); } else if ((m->m_flags & M_FREELIST) == 0) { - insque(m, &m->slirp->m_freelist); + slirp_insque(m, &m->slirp->m_freelist); m->m_flags = M_FREELIST; /* Clobber other flags */ } } /* if(m) */ @@ -209,7 +214,7 @@ struct mbuf *dtom(Slirp *slirp, void *dat) /* bug corrected for M_EXT buffers */ for (m = (struct mbuf *)slirp->m_usedlist.qh_link; - (struct quehead *)m != &slirp->m_usedlist; m = m->m_next) { + (struct slirp_quehead *)m != &slirp->m_usedlist; m = m->m_next) { if (m->m_flags & M_EXT) { if ((char *)dat >= m->m_ext && (char *)dat < (m->m_ext + m->m_size)) return m; @@ -223,3 +228,55 @@ struct mbuf *dtom(Slirp *slirp, void *dat) return (struct mbuf *)0; } + +/* + * Duplicate the mbuf + * + * copy_header specifies whether the bytes before m_data should also be copied. + * header_size specifies how many bytes are to be reserved before m_data. + */ +struct mbuf *m_dup(Slirp *slirp, struct mbuf *m, + bool copy_header, + size_t header_size) +{ + struct mbuf *n; + int mcopy_result; + + /* The previous mbuf was supposed to have it already, we can check it along + * the way */ + assert(M_ROOMBEFORE(m) >= header_size); + + n = m_get(slirp); + m_inc(n, m->m_len + header_size); + + if (copy_header) { + m->m_len += header_size; + m->m_data -= header_size; + mcopy_result = m_copy(n, m, 0, m->m_len + header_size); + n->m_data += header_size; + m->m_len -= header_size; + m->m_data += header_size; + } else { + n->m_data += header_size; + mcopy_result = m_copy(n, m, 0, m->m_len); + } + g_assert(mcopy_result == 0); + + return n; +} + +void *mtod_check(struct mbuf *m, size_t len) +{ + if (m->m_len >= len) { + return m->m_data; + } + + DEBUG_ERROR("mtod failed"); + + return NULL; +} + +void *m_end(struct mbuf *m) +{ + return m->m_data + m->m_len; +} diff --git a/src/network/slirp/mbuf.h b/src/network/slirp/mbuf.h index 546e7852c..aedfc712e 100644 --- a/src/network/slirp/mbuf.h +++ b/src/network/slirp/mbuf.h @@ -73,6 +73,13 @@ */ #define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len) +/* + * How much free room there is before m_data + */ +#define M_ROOMBEFORE(m) \ + (((m)->m_flags & M_EXT) ? (m)->m_data - (m)->m_ext \ + : (m)->m_data - (m)->m_dat) + struct mbuf { /* XXX should union some of these! */ /* header at beginning of each mbuf: */ @@ -117,11 +124,69 @@ void m_cat(register struct mbuf *, register struct mbuf *); void m_inc(struct mbuf *, int); void m_adj(struct mbuf *, int); int m_copy(struct mbuf *, struct mbuf *, int, int); +struct mbuf *m_dup(Slirp *slirp, struct mbuf *m, bool copy_header, size_t header_size); struct mbuf *dtom(Slirp *, void *); +void *mtod_check(struct mbuf *, size_t len); +void *m_end(struct mbuf *); static inline void ifs_init(struct mbuf *ifm) { ifm->ifs_next = ifm->ifs_prev = ifm; } +#ifdef SLIRP_DEBUG +# define MBUF_DEBUG 1 +#else +# ifdef HAVE_VALGRIND +# include +# define MBUF_DEBUG RUNNING_ON_VALGRIND +# else +# define MBUF_DEBUG 0 +# endif +#endif + +/* + * When a function is given an mbuf as well as the responsibility to free it, we + * want valgrind etc. to properly identify the new responsible for the + * free. Achieve this by making a new copy. For instance: + * + * f0(void) { + * struct mbuf *m = m_get(slirp); + * [...] + * switch (something) { + * case 1: + * f1(m); + * break; + * case 2: + * f2(m); + * break; + * [...] + * } + * } + * + * f1(struct mbuf *m) { + * M_DUP_DEBUG(m->slirp, m); + * [...] + * m_free(m); // but author of f1 might be forgetting this + * } + * + * f0 transfers the freeing responsibility to f1, f2, etc. Without the + * M_DUP_DEBUG call in f1, valgrind would tell us that it is f0 where the buffer + * was allocated, but it's difficult to know whether a leak is actually in f0, + * or in f1, or in f2, etc. Duplicating the mbuf in M_DUP_DEBUG each time the + * responsibility is transferred allows to immediately know where the leak + * actually is. + */ +#define M_DUP_DEBUG(slirp, m, copy_header, header_size) do { \ + if (MBUF_DEBUG) { \ + struct mbuf *__n; \ + __n = m_dup((slirp), (m), (copy_header), (header_size)); \ + m_free(m); \ + (m) = __n; \ + } else { \ + (void) (slirp); (void) (copy_header); \ + g_assert(M_ROOMBEFORE(m) >= (header_size)); \ + } \ +} while(0) + #endif diff --git a/src/network/slirp/misc.c b/src/network/slirp/misc.c index 3bea32ac1..220506328 100644 --- a/src/network/slirp/misc.c +++ b/src/network/slirp/misc.c @@ -15,22 +15,26 @@ extern gsize g_strlcpy(gchar* dest, const gchar* src, gsize dest_size); #endif #endif -extern inline void insque(void *a, void *b) +#ifdef __APPLE__ +#include +#endif + +extern inline void slirp_insque(void *a, void *b) { - register struct quehead *element = (struct quehead *)a; - register struct quehead *head = (struct quehead *)b; + register struct slirp_quehead *element = (struct slirp_quehead *)a; + register struct slirp_quehead *head = (struct slirp_quehead *)b; element->qh_link = head->qh_link; - head->qh_link = (struct quehead *)element; - element->qh_rlink = (struct quehead *)head; - ((struct quehead *)(element->qh_link))->qh_rlink = - (struct quehead *)element; + head->qh_link = (struct slirp_quehead *)element; + element->qh_rlink = (struct slirp_quehead *)head; + ((struct slirp_quehead *)(element->qh_link))->qh_rlink = + (struct slirp_quehead *)element; } -extern inline void remque(void *a) +extern inline void slirp_remque(void *a) { - register struct quehead *element = (struct quehead *)a; - ((struct quehead *)(element->qh_link))->qh_rlink = element->qh_rlink; - ((struct quehead *)(element->qh_rlink))->qh_link = element->qh_link; + register struct slirp_quehead *element = (struct slirp_quehead *)a; + ((struct slirp_quehead *)(element->qh_link))->qh_rlink = element->qh_rlink; + ((struct slirp_quehead *)(element->qh_rlink))->qh_link = element->qh_link; element->qh_rlink = NULL; } @@ -89,7 +93,7 @@ static int slirp_socketpair_with_oob(int sv[2]) struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = 0, - .sin_addr.s_addr = INADDR_ANY, + .sin_addr.s_addr = htonl(INADDR_LOOPBACK), }; socklen_t addrlen = sizeof(addr); int ret, s; @@ -143,11 +147,21 @@ static void fork_exec_child_setup(gpointer data) { #ifndef _WIN32 setsid(); + + /* Unblock all signals and leave our exec()-ee to block what it wants */ + sigset_t ss; + sigemptyset(&ss); + sigprocmask(SIG_SETMASK, &ss, NULL); + + /* POSIX is obnoxious about SIGCHLD specifically across exec() */ + signal(SIGCHLD, SIG_DFL); #endif } +#ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif #if !GLIB_CHECK_VERSION(2, 58, 0) typedef struct SlirpGSpawnFds { @@ -197,7 +211,9 @@ g_spawn_async_with_fds_slirp(const gchar *working_directory, gchar **argv, #define g_spawn_async_with_fds(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) \ g_spawn_async_with_fds_slirp(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) +#ifdef __GNUC__ #pragma GCC diagnostic pop +#endif int fork_exec(struct socket *so, const char *ex) { @@ -300,6 +316,7 @@ char *slirp_connection_info(Slirp *slirp) uint16_t dst_port; struct socket *so; const char *state; + char addr[INET_ADDRSTRLEN]; char buf[20]; g_string_append_printf(str, @@ -329,10 +346,11 @@ char *slirp_connection_info(Slirp *slirp) } slirp_fmt0(buf, sizeof(buf), " TCP[%s]", state); g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s, - src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : - "*", + src.sin_addr.s_addr ? + inet_ntop(AF_INET, &src.sin_addr, addr, sizeof(addr)) : "*", ntohs(src.sin_port)); - g_string_append_printf(str, "%15s %5d %5d %5d\n", inet_ntoa(dst_addr), + g_string_append_printf(str, "%15s %5d %5d %5d\n", + inet_ntop(AF_INET, &dst_addr, addr, sizeof(addr)), ntohs(dst_port), so->so_rcv.sb_cc, so->so_snd.sb_cc); } @@ -353,10 +371,11 @@ char *slirp_connection_info(Slirp *slirp) dst_port = so->so_fport; } g_string_append_printf(str, "%-19s %3d %15s %5d ", buf, so->s, - src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : - "*", + src.sin_addr.s_addr ? + inet_ntop(AF_INET, &src.sin_addr, addr, sizeof(addr)) : "*", ntohs(src.sin_port)); - g_string_append_printf(str, "%15s %5d %5d %5d\n", inet_ntoa(dst_addr), + g_string_append_printf(str, "%15s %5d %5d %5d\n", + inet_ntop(AF_INET, &dst_addr, addr, sizeof(addr)), ntohs(dst_port), so->so_rcv.sb_cc, so->so_snd.sb_cc); } @@ -367,15 +386,58 @@ char *slirp_connection_info(Slirp *slirp) src.sin_addr = so->so_laddr; dst_addr = so->so_faddr; g_string_append_printf(str, "%-19s %3d %15s - ", buf, so->s, - src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : - "*"); - g_string_append_printf(str, "%15s - %5d %5d\n", inet_ntoa(dst_addr), + src.sin_addr.s_addr ? + inet_ntop(AF_INET, &src.sin_addr, addr, sizeof(addr)) : "*"); + g_string_append_printf(str, "%15s - %5d %5d\n", + inet_ntop(AF_INET, &dst_addr, addr, sizeof(addr)), so->so_rcv.sb_cc, so->so_snd.sb_cc); } return g_string_free(str, false); } +char *slirp_neighbor_info(Slirp *slirp) +{ + GString *str = g_string_new(NULL); + ArpTable *arp_table = &slirp->arp_table; + NdpTable *ndp_table = &slirp->ndp_table; + char ip_addr[INET6_ADDRSTRLEN]; + char eth_addr[ETH_ADDRSTRLEN]; + const char *ip; + + g_string_append_printf(str, " %5s %-17s %s\n", + "Table", "MacAddr", "IP Address"); + + for (int i = 0; i < ARP_TABLE_SIZE; ++i) { + struct in_addr addr; + addr.s_addr = arp_table->table[i].ar_sip; + if (!addr.s_addr) { + continue; + } + ip = inet_ntop(AF_INET, &addr, ip_addr, sizeof(ip_addr)); + g_assert(ip != NULL); + g_string_append_printf(str, " %5s %-17s %s\n", "ARP", + slirp_ether_ntoa(arp_table->table[i].ar_sha, + eth_addr, sizeof(eth_addr)), + ip); + } + + for (int i = 0; i < NDP_TABLE_SIZE; ++i) { + if (in6_zero(&ndp_table->table[i].ip_addr)) { + continue; + } + ip = inet_ntop(AF_INET6, &ndp_table->table[i].ip_addr, ip_addr, + sizeof(ip_addr)); + g_assert(ip != NULL); + g_string_append_printf(str, " %5s %-17s %s\n", "NDP", + slirp_ether_ntoa(ndp_table->table[i].eth_addr, + eth_addr, sizeof(eth_addr)), + ip); + } + + return g_string_free(str, false); +} + int slirp_bind_outbound(struct socket *so, unsigned short af) { int ret = 0; diff --git a/src/network/slirp/ncsi-pkt.h b/src/network/slirp/ncsi-pkt.h index 7795ad83e..7694e68ff 100644 --- a/src/network/slirp/ncsi-pkt.h +++ b/src/network/slirp/ncsi-pkt.h @@ -40,6 +40,9 @@ #define __be32 uint32_t #define __be16 uint16_t +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_pkt_hdr { unsigned char mc_id; /* Management controller ID */ unsigned char revision; /* NCSI version - 0x01 */ @@ -49,64 +52,118 @@ struct ncsi_pkt_hdr { unsigned char channel; /* Network controller ID */ __be16 length; /* Payload length */ __be32 reserved1[2]; /* Reserved */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_pkt_hdr { struct ncsi_pkt_hdr common; /* Common NCSI packet header */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_pkt_hdr { struct ncsi_pkt_hdr common; /* Common NCSI packet header */ __be16 code; /* Response code */ __be16 reason; /* Response reason */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_aen_pkt_hdr { struct ncsi_pkt_hdr common; /* Common NCSI packet header */ unsigned char reserved2[3]; /* Reserved */ unsigned char type; /* AEN packet type */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* NCSI common command packet */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 checksum; /* Checksum */ unsigned char pad[26]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Select Package */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_sp_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char reserved[3]; /* Reserved */ unsigned char hw_arbitration; /* HW arbitration */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Disable Channel */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_dc_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char reserved[3]; /* Reserved */ unsigned char ald; /* Allow link down */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Reset Channel */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_rc_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 reserved; /* Reserved */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* AEN Enable */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_ae_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char reserved[3]; /* Reserved */ @@ -114,18 +171,30 @@ struct ncsi_cmd_ae_pkt { __be32 mode; /* AEN working mode */ __be32 checksum; /* Checksum */ unsigned char pad[18]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Set Link */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_sl_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 mode; /* Link working mode */ __be32 oem_mode; /* OEM link mode */ __be32 checksum; /* Checksum */ unsigned char pad[18]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Set VLAN Filter */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_svf_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be16 reserved; /* Reserved */ @@ -135,18 +204,30 @@ struct ncsi_cmd_svf_pkt { unsigned char enable; /* Enable or disable */ __be32 checksum; /* Checksum */ unsigned char pad[14]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Enable VLAN */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_ev_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char reserved[3]; /* Reserved */ unsigned char mode; /* VLAN filter mode */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Set MAC Address */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_sma_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ unsigned char mac[6]; /* MAC address */ @@ -154,23 +235,38 @@ struct ncsi_cmd_sma_pkt { unsigned char at_e; /* Addr type and operation */ __be32 checksum; /* Checksum */ unsigned char pad[18]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Enable Broadcast Filter */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_ebf_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 mode; /* Filter mode */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Enable Global Multicast Filter */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_cmd_egmf_pkt { struct ncsi_cmd_pkt_hdr cmd; /* Command header */ __be32 mode; /* Global MC mode */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Set NCSI Flow Control */ struct ncsi_cmd_snfc_pkt { @@ -179,9 +275,15 @@ struct ncsi_cmd_snfc_pkt { unsigned char mode; /* Flow control mode */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Link Status */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gls_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 status; /* Link status */ @@ -189,9 +291,15 @@ struct ncsi_rsp_gls_pkt { __be32 oem_status; /* OEM link status */ __be32 checksum; unsigned char pad[10]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Version ID */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gvi_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 ncsi_version; /* NCSI version */ @@ -202,9 +310,15 @@ struct ncsi_rsp_gvi_pkt { __be16 pci_ids[4]; /* PCI IDs */ __be32 mf_id; /* Manufacture ID */ __be32 checksum; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Capabilities */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gc_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 cap; /* Capabilities */ @@ -220,9 +334,15 @@ struct ncsi_rsp_gc_pkt { unsigned char vlan_mode; /* VLAN mode */ unsigned char channel_cnt; /* Channel count */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Parameters */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gp_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ unsigned char mac_cnt; /* Number of MAC addr */ @@ -241,9 +361,15 @@ struct ncsi_rsp_gp_pkt { unsigned char mac[6]; /* Supported MAC addr */ __be16 vlan; /* Supported VLAN tags */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get Controller Packet Statistics */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gcps_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 cnt_hi; /* Counter cleared */ @@ -288,9 +414,15 @@ struct ncsi_rsp_gcps_pkt { __be32 rx_runt_pkts; /* Rx error runt packets */ __be32 rx_jabber_pkts; /* Rx error jabber packets */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get NCSI Statistics */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gns_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 rx_cmds; /* Rx NCSI commands */ @@ -301,9 +433,15 @@ struct ncsi_rsp_gns_pkt { __be32 tx_pkts; /* Tx NCSI packets */ __be32 tx_aen_pkts; /* Tx AEN packets */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get NCSI Pass-through Statistics */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gnpts_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 tx_pkts; /* Tx packets */ @@ -316,45 +454,78 @@ struct ncsi_rsp_gnpts_pkt { __be32 rx_us_err; /* Rx undersize errors */ __be32 rx_os_err; /* Rx oversize errors */ __be32 checksum; /* Checksum */ -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get package status */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gps_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ __be32 status; /* Hardware arbitration status */ __be32 checksum; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* Get package UUID */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_rsp_gpuuid_pkt { struct ncsi_rsp_pkt_hdr rsp; /* Response header */ unsigned char uuid[16]; /* UUID */ __be32 checksum; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* AEN: Link State Change */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_aen_lsc_pkt { struct ncsi_aen_pkt_hdr aen; /* AEN header */ __be32 status; /* Link status */ __be32 oem_status; /* OEM link status */ __be32 checksum; /* Checksum */ unsigned char pad[14]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* AEN: Configuration Required */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_aen_cr_pkt { struct ncsi_aen_pkt_hdr aen; /* AEN header */ __be32 checksum; /* Checksum */ unsigned char pad[22]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* AEN: Host Network Controller Driver Status Change */ +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif struct ncsi_aen_hncdsc_pkt { struct ncsi_aen_pkt_hdr aen; /* AEN header */ __be32 status; /* Status */ __be32 checksum; /* Checksum */ unsigned char pad[18]; -}; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif /* NCSI packet revision */ #define NCSI_PKT_REVISION 0x01 diff --git a/src/network/slirp/ncsi.c b/src/network/slirp/ncsi.c index 3c1dfef1f..f3427bd66 100644 --- a/src/network/slirp/ncsi.c +++ b/src/network/slirp/ncsi.c @@ -38,7 +38,7 @@ #include "ncsi-pkt.h" -static uint32_t ncsi_calculate_checksum(uint16_t *data, int len) +static uint32_t ncsi_calculate_checksum(uint8_t *data, int len) { uint32_t checksum = 0; int i; @@ -47,8 +47,8 @@ static uint32_t ncsi_calculate_checksum(uint16_t *data, int len) * 32-bit unsigned sum of the NC-SI packet header and NC-SI packet * payload interpreted as a series of 16-bit unsigned integer values. */ - for (i = 0; i < len / 2; i++) { - checksum += htons(data[i]); + for (i = 0; i < len; i += 2) { + checksum += (((uint16_t) data[i]) << 8) + data[i+1]; } checksum = (~checksum + 1); @@ -148,6 +148,10 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) uint32_t checksum; uint32_t *pchecksum; + if (pkt_len < ETH_HLEN + sizeof(struct ncsi_pkt_hdr)) { + return; /* packet too short */ + } + memset(ncsi_reply, 0, sizeof(ncsi_reply)); memset(reh->h_dest, 0xff, ETH_ALEN); @@ -184,7 +188,7 @@ void ncsi_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) } /* Add the optional checksum at the end of the frame. */ - checksum = ncsi_calculate_checksum((uint16_t *)rnh, ncsi_rsp_len); + checksum = ncsi_calculate_checksum((uint8_t *)rnh, ncsi_rsp_len); pchecksum = (uint32_t *)((void *)rnh + ncsi_rsp_len); *pchecksum = htonl(checksum); ncsi_rsp_len += 4; diff --git a/src/network/slirp/ndp_table.c b/src/network/slirp/ndp_table.c index 110d6ea0e..fdb189d59 100644 --- a/src/network/slirp/ndp_table.c +++ b/src/network/slirp/ndp_table.c @@ -12,13 +12,14 @@ void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr, char addrstr[INET6_ADDRSTRLEN]; NdpTable *ndp_table = &slirp->ndp_table; int i; + char ethaddr_str[ETH_ADDRSTRLEN]; inet_ntop(AF_INET6, &(ip_addr), addrstr, INET6_ADDRSTRLEN); DEBUG_CALL("ndp_table_add"); DEBUG_ARG("ip = %s", addrstr); - DEBUG_ARG("hw addr = %02x:%02x:%02x:%02x:%02x:%02x", ethaddr[0], ethaddr[1], - ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]); + DEBUG_ARG("hw addr = %s", slirp_ether_ntoa(ethaddr, ethaddr_str, + sizeof(ethaddr_str))); if (IN6_IS_ADDR_MULTICAST(&ip_addr) || in6_zero(&ip_addr)) { /* Do not register multicast or unspecified addresses */ @@ -38,6 +39,10 @@ void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr, /* No entry found, create a new one */ DEBUG_CALL(" create new entry"); + /* Save the first entry, it is the guest. */ + if (in6_zero(&ndp_table->guest_in6_addr)) { + ndp_table->guest_in6_addr = ip_addr; + } ndp_table->table[ndp_table->next_victim].ip_addr = ip_addr; memcpy(ndp_table->table[ndp_table->next_victim].eth_addr, ethaddr, ETH_ALEN); @@ -50,13 +55,19 @@ bool ndp_table_search(Slirp *slirp, struct in6_addr ip_addr, char addrstr[INET6_ADDRSTRLEN]; NdpTable *ndp_table = &slirp->ndp_table; int i; + char ethaddr_str[ETH_ADDRSTRLEN]; inet_ntop(AF_INET6, &(ip_addr), addrstr, INET6_ADDRSTRLEN); DEBUG_CALL("ndp_table_search"); DEBUG_ARG("ip = %s", addrstr); - assert(!in6_zero(&ip_addr)); + /* If unspecified address */ + if (in6_zero(&ip_addr)) { + /* return Ethernet broadcast address */ + memset(out_ethaddr, 0xff, ETH_ALEN); + return 1; + } /* Multicast address: fec0::abcd:efgh/8 -> 33:33:ab:cd:ef:gh */ if (IN6_IS_ADDR_MULTICAST(&ip_addr)) { @@ -66,18 +77,18 @@ bool ndp_table_search(Slirp *slirp, struct in6_addr ip_addr, out_ethaddr[3] = ip_addr.s6_addr[13]; out_ethaddr[4] = ip_addr.s6_addr[14]; out_ethaddr[5] = ip_addr.s6_addr[15]; - DEBUG_ARG("multicast addr = %02x:%02x:%02x:%02x:%02x:%02x", - out_ethaddr[0], out_ethaddr[1], out_ethaddr[2], - out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]); + DEBUG_ARG("multicast addr = %s", + slirp_ether_ntoa(out_ethaddr, ethaddr_str, + sizeof(ethaddr_str))); return 1; } for (i = 0; i < NDP_TABLE_SIZE; i++) { if (in6_equal(&ndp_table->table[i].ip_addr, &ip_addr)) { memcpy(out_ethaddr, ndp_table->table[i].eth_addr, ETH_ALEN); - DEBUG_ARG("found hw addr = %02x:%02x:%02x:%02x:%02x:%02x", - out_ethaddr[0], out_ethaddr[1], out_ethaddr[2], - out_ethaddr[3], out_ethaddr[4], out_ethaddr[5]); + DEBUG_ARG("found hw addr = %s", + slirp_ether_ntoa(out_ethaddr, ethaddr_str, + sizeof(ethaddr_str))); return 1; } } diff --git a/src/network/slirp/sbuf.c b/src/network/slirp/sbuf.c index 2fb917614..b35709170 100644 --- a/src/network/slirp/sbuf.c +++ b/src/network/slirp/sbuf.c @@ -68,7 +68,7 @@ void sbappend(struct socket *so, struct mbuf *m) if (so->so_urgc) { sbappendsb(&so->so_rcv, m); m_free(m); - (void)sosendoob(so); + sosendoob(so); return; } diff --git a/src/network/slirp/slirp.c b/src/network/slirp/slirp.c index 021324cdb..0c2a20a9b 100644 --- a/src/network/slirp/slirp.c +++ b/src/network/slirp/slirp.c @@ -34,6 +34,37 @@ #undef if_mtu #endif +#if defined(_WIN32) + +#define INITIAL_DNS_ADDR_BUF_SIZE 32 * 1024 +#define REALLOC_RETRIES 5 + +// Broadcast site local DNS resolvers. We do not use these because they are +// highly unlikely to be valid. +// https://www.ietf.org/proceedings/52/I-D/draft-ietf-ipngwg-dns-discovery-03.txt +static const struct in6_addr SITE_LOCAL_DNS_BROADCAST_ADDRS[] = { + { + {{ + 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + }} + }, + { + {{ + 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 + }} + }, + { + {{ + 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }} + }, +}; + +#endif + int slirp_debug; /* Define to 1 if you want KEEPALIVE timers */ @@ -51,20 +82,17 @@ static const uint8_t special_ethaddr[ETH_ALEN] = { 0x52, 0x55, 0x00, unsigned curtime; static struct in_addr dns_addr; -#ifndef _WIN32 static struct in6_addr dns6_addr; -#endif +static uint32_t dns6_scope_id; static unsigned dns_addr_time; -#ifndef _WIN32 static unsigned dns6_addr_time; -#endif #define TIMEOUT_FAST 2 /* milliseconds */ #define TIMEOUT_SLOW 499 /* milliseconds */ /* for the aging of certain requests like DNS */ #define TIMEOUT_DEFAULT 1000 /* milliseconds */ -#ifdef _WIN32 +#if defined(_WIN32) int get_dns_addr(struct in_addr *pdns_addr) { @@ -111,8 +139,108 @@ int get_dns_addr(struct in_addr *pdns_addr) return 0; } +int is_site_local_dns_broadcast(struct in6_addr *address) +{ + int i; + for (i = 0; i < G_N_ELEMENTS(SITE_LOCAL_DNS_BROADCAST_ADDRS); i++) { + if (in6_equal(address, &SITE_LOCAL_DNS_BROADCAST_ADDRS[i])) { + return 1; + } + } + return 0; +} + +void print_dns_v6_address(struct in6_addr address) +{ + char address_str[INET6_ADDRSTRLEN] = ""; + if (inet_ntop(AF_INET6, &address, address_str, INET6_ADDRSTRLEN) + == NULL) { + DEBUG_ERROR("Failed to stringify IPv6 address for logging."); + return; + } + DEBUG_CALL("IPv6 DNS server found: %s", address_str); +} + +// Gets the first valid DNS resolver with an IPv6 address. +// Ignores any site local broadcast DNS servers, as these +// are on deprecated addresses and not generally expected +// to work. Further details at: +// https://www.ietf.org/proceedings/52/I-D/draft-ietf-ipngwg-dns-discovery-03.txt +int get_ipv6_dns_server(struct in6_addr *dns_server_address, uint32_t *scope_id) +{ + PIP_ADAPTER_ADDRESSES addresses = NULL; + PIP_ADAPTER_ADDRESSES address = NULL; + IP_ADAPTER_DNS_SERVER_ADDRESS *dns_server = NULL; + struct sockaddr_in6 *dns_v6_addr = NULL; + + ULONG buf_size = INITIAL_DNS_ADDR_BUF_SIZE; + DWORD res = ERROR_BUFFER_OVERFLOW; + int i; + + for (i = 0; i < REALLOC_RETRIES; i++) { + // If non null, we hit buffer overflow, free it so we can try again. + if (addresses != NULL) { + g_free(addresses); + } + + addresses = g_malloc(buf_size); + res = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, + addresses, &buf_size); + + if (res != ERROR_BUFFER_OVERFLOW) { + break; + } + } + + if (res != NO_ERROR) { + DEBUG_ERROR("Failed to get IPv6 DNS addresses due to error %lX", res); + goto failure; + } + + address = addresses; + for (address = addresses; address != NULL; address = address->Next) { + for (dns_server = address->FirstDnsServerAddress; + dns_server != NULL; + dns_server = dns_server->Next) { + + if (dns_server->Address.lpSockaddr->sa_family != AF_INET6) { + continue; + } + + dns_v6_addr = (struct sockaddr_in6 *)dns_server->Address.lpSockaddr; + if (is_site_local_dns_broadcast(&dns_v6_addr->sin6_addr) == 0) { + print_dns_v6_address(dns_v6_addr->sin6_addr); + *dns_server_address = dns_v6_addr->sin6_addr; + *scope_id = dns_v6_addr->sin6_scope_id; + + g_free(addresses); + return 0; + } + } + } + + DEBUG_ERROR("No IPv6 DNS servers found.\n"); + +failure: + g_free(addresses); + return -1; +} + int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) { + if (!in6_zero(&dns6_addr) && (curtime - dns6_addr_time) < TIMEOUT_DEFAULT) { + *pdns6_addr = dns6_addr; + *scope_id = dns6_scope_id; + return 0; + } + + if (get_ipv6_dns_server(pdns6_addr, scope_id) == 0) { + dns6_addr = *pdns6_addr; + dns6_addr_time = curtime; + dns6_scope_id = *scope_id; + return 0; + } + return -1; } @@ -121,7 +249,122 @@ static void winsock_cleanup(void) WSACleanup(); } +#elif defined(__APPLE__) + +#include + +static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, + socklen_t addrlen, unsigned *cached_time) +{ + if (curtime - *cached_time < TIMEOUT_DEFAULT) { + memcpy(pdns_addr, cached_addr, addrlen); + return 0; + } + return 1; +} + +static int get_dns_addr_libresolv(int af, void *pdns_addr, void *cached_addr, + socklen_t addrlen, + uint32_t *scope_id, uint32_t *cached_scope_id, + unsigned *cached_time) +{ + struct __res_state state; + union res_sockaddr_union servers[NI_MAXSERV]; + int count; + int found; + void *addr; + + // we only support IPv4 and IPv4, we assume it's one or the other + assert(af == AF_INET || af == AF_INET6); + + if (res_ninit(&state) != 0) { + return -1; + } + + count = res_getservers(&state, servers, NI_MAXSERV); + found = 0; + DEBUG_MISC("IP address of your DNS(s):"); + for (int i = 0; i < count; i++) { + if (af == servers[i].sin.sin_family) { + found++; + } + if (af == AF_INET) { + addr = &servers[i].sin.sin_addr; + } else { // af == AF_INET6 + addr = &servers[i].sin6.sin6_addr; + } + + // we use the first found entry + if (found == 1) { + memcpy(pdns_addr, addr, addrlen); + memcpy(cached_addr, addr, addrlen); + if (scope_id) { + *scope_id = 0; + } + if (cached_scope_id) { + *cached_scope_id = 0; + } + *cached_time = curtime; + } + + if (found > 3) { + DEBUG_MISC(" (more)"); + break; + } else if (slirp_debug & DBG_MISC) { + char s[INET6_ADDRSTRLEN]; + const char *res = inet_ntop(af, addr, s, sizeof(s)); + if (!res) { + res = " (string conversion error)"; + } + DEBUG_MISC(" %s", res); + } + } + + res_ndestroy(&state); + if (!found) + return -1; + return 0; +} + +int get_dns_addr(struct in_addr *pdns_addr) +{ + if (dns_addr.s_addr != 0) { + int ret; + ret = get_dns_addr_cached(pdns_addr, &dns_addr, sizeof(dns_addr), + &dns_addr_time); + if (ret <= 0) { + return ret; + } + } + return get_dns_addr_libresolv(AF_INET, pdns_addr, &dns_addr, + sizeof(dns_addr), NULL, NULL, &dns_addr_time); +} + +int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) +{ + if (!in6_zero(&dns6_addr)) { + int ret; + ret = get_dns_addr_cached(pdns6_addr, &dns6_addr, sizeof(dns6_addr), + &dns6_addr_time); + if (ret == 0) { + *scope_id = dns6_scope_id; + } + if (ret <= 0) { + return ret; + } + } + return get_dns_addr_libresolv(AF_INET6, pdns6_addr, &dns6_addr, + sizeof(dns6_addr), + scope_id, &dns6_scope_id, &dns6_addr_time); +} + +#else // !defined(_WIN32) && !defined(__APPLE__) + +#if defined(__HAIKU__) +#define RESOLV_CONF_PATH "/boot/system/settings/network/resolv.conf" #else +#define RESOLV_CONF_PATH "/etc/resolv.conf" +#endif static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, socklen_t addrlen, struct stat *cached_stat, @@ -133,7 +376,7 @@ static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, return 0; } old_stat = *cached_stat; - if (stat("/etc/resolv.conf", cached_stat) != 0) { + if (stat(RESOLV_CONF_PATH, cached_stat) != 0) { return -1; } if (cached_stat->st_dev == old_stat.st_dev && @@ -147,17 +390,22 @@ static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, } static int get_dns_addr_resolv_conf(int af, void *pdns_addr, void *cached_addr, - socklen_t addrlen, uint32_t *scope_id, + socklen_t addrlen, + uint32_t *scope_id, uint32_t *cached_scope_id, unsigned *cached_time) { char buff[512]; char buff2[257]; FILE *f; int found = 0; - void *tmp_addr = alloca(addrlen); + union { + struct in_addr dns_addr; + struct in6_addr dns6_addr; + } tmp_addr; unsigned if_index; - f = fopen("/etc/resolv.conf", "r"); + assert(sizeof(tmp_addr) >= addrlen); + f = fopen(RESOLV_CONF_PATH, "r"); if (!f) return -1; @@ -172,16 +420,19 @@ static int get_dns_addr_resolv_conf(int af, void *pdns_addr, void *cached_addr, if_index = 0; } - if (!inet_pton(af, buff2, tmp_addr)) { + if (!inet_pton(af, buff2, &tmp_addr)) { continue; } /* If it's the first one, set it to dns_addr */ if (!found) { - memcpy(pdns_addr, tmp_addr, addrlen); - memcpy(cached_addr, tmp_addr, addrlen); + memcpy(pdns_addr, &tmp_addr, addrlen); + memcpy(cached_addr, &tmp_addr, addrlen); if (scope_id) { *scope_id = if_index; } + if (cached_scope_id) { + *cached_scope_id = if_index; + } *cached_time = curtime; } @@ -190,7 +441,7 @@ static int get_dns_addr_resolv_conf(int af, void *pdns_addr, void *cached_addr, break; } else if (slirp_debug & DBG_MISC) { char s[INET6_ADDRSTRLEN]; - const char *res = inet_ntop(af, tmp_addr, s, sizeof(s)); + const char *res = inet_ntop(af, &tmp_addr, s, sizeof(s)); if (!res) { res = " (string conversion error)"; } @@ -217,7 +468,8 @@ int get_dns_addr(struct in_addr *pdns_addr) } } return get_dns_addr_resolv_conf(AF_INET, pdns_addr, &dns_addr, - sizeof(dns_addr), NULL, &dns_addr_time); + sizeof(dns_addr), + NULL, NULL, &dns_addr_time); } int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) @@ -228,13 +480,16 @@ int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) int ret; ret = get_dns_addr_cached(pdns6_addr, &dns6_addr, sizeof(dns6_addr), &dns6_addr_stat, &dns6_addr_time); + if (ret == 0) { + *scope_id = dns6_scope_id; + } if (ret <= 0) { return ret; } } return get_dns_addr_resolv_conf(AF_INET6, pdns6_addr, &dns6_addr, - sizeof(dns6_addr), scope_id, - &dns6_addr_time); + sizeof(dns6_addr), + scope_id, &dns6_scope_id, &dns6_addr_time); } #endif @@ -267,11 +522,49 @@ static void slirp_init_once(void) { "misc", DBG_MISC }, { "error", DBG_ERROR }, { "tftp", DBG_TFTP }, + { "verbose_call", DBG_VERBOSE_CALL }, }; slirp_debug = g_parse_debug_string(debug, keys, G_N_ELEMENTS(keys)); } } +static void ra_timer_handler_cb(void *opaque) +{ + Slirp *slirp = opaque; + + return ra_timer_handler(slirp, NULL); +} + +void slirp_handle_timer(Slirp *slirp, SlirpTimerId id, void *cb_opaque) +{ +// g_return_if_fail(id >= 0 && id < SLIRP_TIMER_NUM); + + switch (id) { + case SLIRP_TIMER_RA: + return ra_timer_handler(slirp, cb_opaque); + default: + abort(); + } +} + +void *slirp_timer_new(Slirp *slirp, SlirpTimerId id, void *cb_opaque) +{ + g_return_val_if_fail(id >= 0 && id < SLIRP_TIMER_NUM, NULL); + + if (slirp->cfg_version >= 4 && slirp->cb->timer_new_opaque) { + return slirp->cb->timer_new_opaque(id, cb_opaque, slirp->opaque); + } + + switch (id) { + case SLIRP_TIMER_RA: + g_return_val_if_fail(cb_opaque == NULL, NULL); + return slirp->cb->timer_new(ra_timer_handler_cb, slirp, slirp->opaque); + + default: + abort(); + } +} + Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque) { Slirp *slirp; @@ -291,6 +584,7 @@ Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque) slirp_init_once(); + slirp->cfg_version = cfg->version; slirp->opaque = opaque; slirp->cb = callbacks; slirp->grand = g_rand_new(); @@ -301,7 +595,6 @@ Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque) if_init(slirp); ip_init(slirp); - ip6_init(slirp); m_init(slirp); @@ -345,6 +638,17 @@ Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, void *opaque) slirp->disable_dns = false; } + if (cfg->version >= 4) { + slirp->disable_dhcp = cfg->disable_dhcp; + } else { + slirp->disable_dhcp = false; + } + + if (slirp->cfg_version >= 4 && slirp->cb->init_completed) { + slirp->cb->init_completed(slirp, slirp->opaque); + } + + ip6_post_init(slirp); return slirp; } @@ -501,7 +805,10 @@ void slirp_pollfds_fill(Slirp *slirp, uint32_t *timeout, /* * Set for reading (and urgent data) if we are connected, can - * receive more, and we have room for it XXX /2 ? + * receive more, and we have room for it. + * + * If sb is already half full, we will wait for the guest to consume it, + * and notify again in sbdrop() when the sb becomes less than half full. */ if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen / 2))) { @@ -623,10 +930,16 @@ void slirp_pollfds_poll(Slirp *slirp, int select_error, continue; } +#ifndef __APPLE__ /* * Check for URG data * This will soread as well, so no need to - * test for SLIRP_POLL_IN below if this succeeds + * test for SLIRP_POLL_IN below if this succeeds. + * + * This is however disabled on MacOS, which apparently always + * reports data as PRI when it is the last data of the + * connection. We would then report it out of band, which the guest + * would most probably not be ready for. */ if (revents & SLIRP_POLL_PRI) { ret = sorecvoob(so); @@ -639,8 +952,10 @@ void slirp_pollfds_poll(Slirp *slirp, int select_error, /* * Check sockets for reading */ - else if (revents & - (SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ERR)) { + else +#endif + if (revents & + (SLIRP_POLL_IN | SLIRP_POLL_HUP | SLIRP_POLL_ERR | SLIRP_POLL_PRI)) { /* * Check for incoming connections */ @@ -763,6 +1078,10 @@ static void arp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) return; } + if (pkt_len < ETH_HLEN + sizeof(struct slirp_arphdr)) { + return; /* packet too short */ + } + ar_op = ntohs(ah->ar_op); switch (ar_op) { case ARPOP_REQUEST: @@ -953,6 +1272,7 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) uint8_t ethaddr[ETH_ALEN]; const struct ip *iph = (const struct ip *)ifm->m_data; int ret; +// char ethaddr_str[ETH_ADDRSTRLEN]; if (ifm->m_len + ETH_HLEN > sizeof(buf)) { return 1; @@ -978,19 +1298,18 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) } memcpy(eh->h_dest, ethaddr, ETH_ALEN); - DEBUG_ARG("src = %02x:%02x:%02x:%02x:%02x:%02x", eh->h_source[0], - eh->h_source[1], eh->h_source[2], eh->h_source[3], - eh->h_source[4], eh->h_source[5]); - DEBUG_ARG("dst = %02x:%02x:%02x:%02x:%02x:%02x", eh->h_dest[0], - eh->h_dest[1], eh->h_dest[2], eh->h_dest[3], eh->h_dest[4], - eh->h_dest[5]); +/* + DEBUG_ARG("src = %s", slirp_ether_ntoa(eh->h_source, ethaddr_str, + sizeof(ethaddr_str))); + DEBUG_ARG("dst = %s", slirp_ether_ntoa(eh->h_dest, ethaddr_str, + sizeof(ethaddr_str))); +*/ memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len); slirp_send_packet_all(slirp, buf, ifm->m_len + ETH_HLEN); return 1; } /* Drop host forwarding rule, return 0 if found. */ -/* TODO: IPv6 */ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, int host_port) { @@ -1004,7 +1323,10 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, addr_len = sizeof(addr); if ((so->so_state & SS_HOSTFWD) && getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 && - addr.sin_addr.s_addr == host_addr.s_addr && addr.sin_port == port) { + addr_len == sizeof(addr) && + addr.sin_family == AF_INET && + addr.sin_addr.s_addr == host_addr.s_addr && + addr.sin_port == port) { so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); closesocket(so->s); sofree(so); @@ -1015,7 +1337,6 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, return -1; } -/* TODO: IPv6 */ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, int host_port, struct in_addr guest_addr, int guest_port) { @@ -1034,6 +1355,83 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, return 0; } +int slirp_remove_hostxfwd(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + int flags) +{ + struct socket *so; + struct socket *head = (flags & SLIRP_HOSTFWD_UDP ? &slirp->udb : &slirp->tcb); + struct sockaddr_storage addr; + socklen_t addr_len; + + for (so = head->so_next; so != head; so = so->so_next) { + addr_len = sizeof(addr); + if ((so->so_state & SS_HOSTFWD) && + getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 && + sockaddr_equal(&addr, (const struct sockaddr_storage *) haddr)) { + so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque); + closesocket(so->s); + sofree(so); + return 0; + } + } + + return -1; +} + +int slirp_add_hostxfwd(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *gaddr, socklen_t gaddrlen, + int flags) +{ + struct sockaddr_in gdhcp_addr; + int fwd_flags = SS_HOSTFWD; + + if (flags & SLIRP_HOSTFWD_V6ONLY) + fwd_flags |= SS_HOSTFWD_V6ONLY; + + if (gaddr->sa_family == AF_INET) { + const struct sockaddr_in *gaddr_in = (const struct sockaddr_in *) gaddr; + + if (gaddrlen < sizeof(struct sockaddr_in)) { + errno = EINVAL; + return -1; + } + + if (!gaddr_in->sin_addr.s_addr) { + gdhcp_addr = *gaddr_in; + gdhcp_addr.sin_addr = slirp->vdhcp_startaddr; + gaddr = (struct sockaddr *) &gdhcp_addr; + gaddrlen = sizeof(gdhcp_addr); + } + } else { + if (gaddrlen < sizeof(struct sockaddr_in6)) { + errno = EINVAL; + return -1; + } + + /* + * Libslirp currently only provides a stateless DHCPv6 server, thus + * we can't translate "addr-any" to the guest here. Instead, we defer + * performing the translation to when it's needed. See + * soassign_guest_addr_if_needed(). + */ + } + + if (flags & SLIRP_HOSTFWD_UDP) { + if (!udpx_listen(slirp, haddr, haddrlen, + gaddr, gaddrlen, + fwd_flags)) + return -1; + } else { + if (!tcpx_listen(slirp, haddr, haddrlen, + gaddr, gaddrlen, + fwd_flags)) + return -1; + } + return 0; +} + /* TODO: IPv6 */ static bool check_guestfwd(Slirp *slirp, struct in_addr *guest_addr, int guest_port) @@ -1158,6 +1556,8 @@ size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr, } if (!CONN_CANFRCV(so) || so->so_snd.sb_cc >= (so->so_snd.sb_datalen / 2)) { + /* If the sb is already half full, we will wait for the guest to consume it, + * and notify again in sbdrop() when the sb becomes less than half full. */ return 0; } diff --git a/src/network/slirp/slirp.h b/src/network/slirp/slirp.h index d996b53ed..e50c2ffe4 100644 --- a/src/network/slirp/slirp.h +++ b/src/network/slirp/slirp.h @@ -6,7 +6,7 @@ /* as defined in sdkddkver.h */ #ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0600 /* Vista */ +#define _WIN32_WINNT 0x0600 /* Windows Vista */ #endif /* reduces the number of implicitly included headers */ #ifndef WIN32_LEAN_AND_MEAN @@ -20,10 +20,8 @@ #include #else -#if !defined(__HAIKU__) #define O_BINARY 0 #endif -#endif #ifndef _WIN32 #include @@ -37,12 +35,6 @@ #include #endif -/* Avoid conflicting with the libc insque() and remque(), which - have different prototypes. */ -#define insque slirp_insque -#define remque slirp_remque -#define quehead slirp_quehead - #include "debug.h" #include "util.h" @@ -88,9 +80,9 @@ struct slirp_arphdr { /* * Ethernet looks like this : This bit is variable sized however... */ - unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ + uint8_t ar_sha[ETH_ALEN]; /* sender hardware address */ uint32_t ar_sip; /* sender IP address */ - unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ + uint8_t ar_tha[ETH_ALEN]; /* target hardware address */ uint32_t ar_tip; /* target IP address */ } SLIRP_PACKED; #if defined(_MSC_VER) && !defined (__clang__) @@ -111,7 +103,7 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr, uint8_t out_ethaddr[ETH_ALEN]); struct ndpentry { - unsigned char eth_addr[ETH_ALEN]; /* sender hardware address */ + uint8_t eth_addr[ETH_ALEN]; /* sender hardware address */ struct in6_addr ip_addr; /* sender IP address */ }; @@ -119,6 +111,12 @@ struct ndpentry { typedef struct NdpTable { struct ndpentry table[NDP_TABLE_SIZE]; + /* + * The table is a cache with old entries overwritten when the table fills. + * Preserve the first entry: it is the guest, which is needed for lazy + * hostfwd guest address assignment. + */ + struct in6_addr guest_in6_addr; int next_victim; } NdpTable; @@ -128,6 +126,8 @@ bool ndp_table_search(Slirp *slirp, struct in6_addr ip_addr, uint8_t out_ethaddr[ETH_ALEN]); struct Slirp { + int cfg_version; + unsigned time_fasttimo; unsigned last_slowtimo; bool do_slowtimo; @@ -141,6 +141,7 @@ struct Slirp { struct in6_addr vprefix_addr6; uint8_t vprefix_len; struct in6_addr vhost_addr6; + bool disable_dhcp; /* slirp will not reply to any DHCP requests */ struct in_addr vdhcp_startaddr; struct in_addr vnameserver_addr; struct in6_addr vnameserver_addr6; @@ -157,13 +158,13 @@ struct Slirp { bool disable_host_loopback; /* mbuf states */ - struct quehead m_freelist; - struct quehead m_usedlist; + struct slirp_quehead m_freelist; + struct slirp_quehead m_usedlist; int mbuf_alloced; /* if states */ - struct quehead if_fastq; /* fast queue (for interactive data) */ - struct quehead if_batchq; /* queue for non-interactive data */ + struct slirp_quehead if_fastq; /* fast queue (for interactive data) */ + struct slirp_quehead if_batchq; /* queue for non-interactive data */ bool if_start_busy; /* avoid if_start recursion */ /* ip states */ @@ -251,7 +252,7 @@ void ip_stripoptions(register struct mbuf *, struct mbuf *); int ip_output(struct socket *, struct mbuf *); /* ip6_input.c */ -void ip6_init(Slirp *); +void ip6_post_init(Slirp *); void ip6_cleanup(Slirp *); void ip6_input(struct mbuf *); @@ -287,5 +288,6 @@ struct socket *slirp_find_ctl_socket(Slirp *slirp, struct in_addr guest_addr, int guest_port); void slirp_send_packet_all(Slirp *slirp, const void *buf, size_t len); +void *slirp_timer_new(Slirp *slirp, SlirpTimerId id, void *cb_opaque); #endif diff --git a/src/network/slirp/socket.c b/src/network/slirp/socket.c index 36d005192..22144ffb8 100644 --- a/src/network/slirp/socket.c +++ b/src/network/slirp/socket.c @@ -8,6 +8,9 @@ #ifdef __sun__ #include #endif +#ifdef __linux__ +#include +#endif static void sofcantrcvmore(struct socket *so); static void sofcantsendmore(struct socket *so); @@ -38,15 +41,17 @@ struct socket *solookup(struct socket **last, struct socket *head, /* * Create a new socket, initialise the fields * It is the responsibility of the caller to - * insque() it into the correct linked-list + * slirp_insque() it into the correct linked-list */ -struct socket *socreate(Slirp *slirp) +struct socket *socreate(Slirp *slirp, int type) { struct socket *so = g_new(struct socket, 1); memset(so, 0, sizeof(struct socket)); + so->so_type = type; so->so_state = SS_NOFDREF; so->s = -1; + so->s_aux = -1; so->slirp = slirp; so->pollfds_idx = -1; @@ -56,11 +61,11 @@ struct socket *socreate(Slirp *slirp) /* * Remove references to so from the given message queue. */ -static void soqfree(struct socket *so, struct quehead *qh) +static void soqfree(struct socket *so, struct slirp_quehead *qh) { struct mbuf *ifq; - for (ifq = (struct mbuf *)qh->qh_link; (struct quehead *)ifq != qh; + for (ifq = (struct mbuf *)qh->qh_link; (struct slirp_quehead *)ifq != qh; ifq = ifq->ifq_next) { if (ifq->ifq_so == so) { struct mbuf *ifm; @@ -73,12 +78,16 @@ static void soqfree(struct socket *so, struct quehead *qh) } /* - * remque and free a socket, clobber cache + * slirp_remque and free a socket, clobber cache */ void sofree(struct socket *so) { Slirp *slirp = so->slirp; + if (so->s_aux != -1) { + closesocket(so->s_aux); + } + soqfree(so, &slirp->if_fastq); soqfree(so, &slirp->if_batchq); @@ -92,7 +101,7 @@ void sofree(struct socket *so) m_free(so->so_m); if (so->so_next && so->so_prev) - remque(so); /* crashes if so is not in a queue */ + slirp_remque(so); /* crashes if so is not in a queue */ if (so->so_tcpcb) { g_free(so->so_tcpcb); @@ -208,8 +217,8 @@ int soread(struct socket *so) errno, strerror(errno)); sofcantrcvmore(so); - if (err == ECONNRESET || err == ECONNREFUSED || err == ENOTCONN || - err == EPIPE) { + if (err == ECONNABORTED || err == ECONNRESET || err == ECONNREFUSED || + err == ENOTCONN || err == EPIPE) { tcp_drop(sototcpcb(so), err); } else { tcp_sockclosed(sototcpcb(so)); @@ -336,8 +345,8 @@ int sosendoob(struct socket *so) DEBUG_ARG("so = %p", so); DEBUG_ARG("sb->sb_cc = %d", sb->sb_cc); - if (so->so_urgc > 2048) - so->so_urgc = 2048; /* XXXX */ + if (so->so_urgc > sizeof(buff)) + so->so_urgc = sizeof(buff); /* XXXX */ if (sb->sb_rptr < sb->sb_wptr) { /* We can send it directly */ @@ -349,7 +358,7 @@ int sosendoob(struct socket *so) * we must copy all data to a linear buffer then * send it all */ - uint32_t urgc = so->so_urgc; + uint32_t urgc = so->so_urgc; /* Amount of room left in buff */ int len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr; if (len > urgc) { len = urgc; @@ -357,6 +366,7 @@ int sosendoob(struct socket *so) memcpy(buff, sb->sb_rptr, len); urgc -= len; if (urgc) { + /* We still have some room for the rest */ n = sb->sb_wptr - sb->sb_data; if (n > urgc) { n = urgc; @@ -365,7 +375,7 @@ int sosendoob(struct socket *so) len += n; } n = slirp_send(so, buff, len, (MSG_OOB)); /* |MSG_DONTWAIT)); */ -#ifdef DEBUG +#ifdef SLIRP_DEBUG if (n != len) { DEBUG_ERROR("Didn't send all data urgently XXXXX"); } @@ -493,12 +503,67 @@ void sorecvfrom(struct socket *so) struct sockaddr_storage addr; struct sockaddr_storage saddr, daddr; socklen_t addrlen = sizeof(struct sockaddr_storage); + char buff[256]; + +#ifdef __linux__ + ssize_t size; + struct msghdr msg; + struct iovec iov; + char control[1024]; + + /* First look for errors */ + memset(&msg, 0, sizeof(msg)); + msg.msg_name = &saddr; + msg.msg_namelen = sizeof(saddr); + msg.msg_control = control; + msg.msg_controllen = sizeof(control); + iov.iov_base = buff; + iov.iov_len = sizeof(buff); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + size = recvmsg(so->s, &msg, MSG_ERRQUEUE); + if (size >= 0) { + struct cmsghdr *cmsg; + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { + + if (cmsg->cmsg_level == IPPROTO_IP && + cmsg->cmsg_type == IP_RECVERR) { + struct sock_extended_err *ee = + (struct sock_extended_err *) CMSG_DATA(cmsg); + + if (ee->ee_origin == SO_EE_ORIGIN_ICMP) { + /* Got an ICMP error, forward it */ + struct sockaddr_in *sin; + + sin = (struct sockaddr_in *) SO_EE_OFFENDER(ee); + icmp_forward_error(so->so_m, ee->ee_type, ee->ee_code, + 0, NULL, &sin->sin_addr); + } + } + else if (cmsg->cmsg_level == IPPROTO_IPV6 && + cmsg->cmsg_type == IPV6_RECVERR) { + struct sock_extended_err *ee = + (struct sock_extended_err *) CMSG_DATA(cmsg); + + if (ee->ee_origin == SO_EE_ORIGIN_ICMP6) { + /* Got an ICMPv6 error, forward it */ + struct sockaddr_in6 *sin6; + + sin6 = (struct sockaddr_in6 *) SO_EE_OFFENDER(ee); + icmp6_forward_error(so->so_m, ee->ee_type, ee->ee_code, + &sin6->sin6_addr); + } + } + } + return; + } +#endif DEBUG_CALL("sorecvfrom"); DEBUG_ARG("so = %p", so); if (so->so_type == IPPROTO_ICMP) { /* This is a "ping" reply */ - char buff[256]; int len; len = recvfrom(so->s, buff, 256, 0, (struct sockaddr *)&addr, &addrlen); @@ -533,9 +598,6 @@ void sorecvfrom(struct socket *so) DEBUG_MISC(" ioctlsocket errno = %d-%s\n", errno, strerror(errno)); return; } - if (n == 0) { - return; - } m = m_get(so->slirp); if (!m) { @@ -624,6 +686,28 @@ void sorecvfrom(struct socket *so) */ saddr = addr; sotranslate_in(so, &saddr); + + /* Perform lazy guest IP address resolution if needed. */ + if (so->so_state & SS_HOSTFWD) { + if (soassign_guest_addr_if_needed(so) < 0) { + DEBUG_MISC(" guest address not available yet"); + switch (so->so_lfamily) { + case AF_INET: + icmp_send_error(so->so_m, ICMP_UNREACH, + ICMP_UNREACH_HOST, 0, + "guest address not available yet"); + break; + case AF_INET6: + icmp6_send_error(so->so_m, ICMP6_UNREACH, + ICMP6_UNREACH_ADDRESS); + break; + default: + g_assert_not_reached(); + } + m_free(m); + return; + } + } daddr = so->lhost.ss; switch (so->so_ffamily) { @@ -679,32 +763,67 @@ int sosendto(struct socket *so, struct mbuf *m) /* * Listen for incoming TCP connections + * On failure errno contains the reason. */ -struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, - uint32_t laddr, unsigned lport, int flags) +struct socket *tcpx_listen(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *laddr, socklen_t laddrlen, + int flags) { - /* TODO: IPv6 */ - struct sockaddr_in addr; struct socket *so; int s, opt = 1; - socklen_t addrlen = sizeof(addr); - memset(&addr, 0, addrlen); + socklen_t addrlen; - DEBUG_CALL("tcp_listen"); - DEBUG_ARG("haddr = %s", inet_ntoa((struct in_addr){ .s_addr = haddr })); - DEBUG_ARG("hport = %d", ntohs(hport)); - DEBUG_ARG("laddr = %s", inet_ntoa((struct in_addr){ .s_addr = laddr })); - DEBUG_ARG("lport = %d", ntohs(lport)); + DEBUG_CALL("tcpx_listen"); + /* AF_INET6 addresses are bigger than AF_INET, so this is big enough. */ + char addrstr[INET6_ADDRSTRLEN]; + char portstr[6]; + int ret; + switch (haddr->sa_family) { + case AF_INET: + case AF_INET6: + ret = getnameinfo(haddr, haddrlen, addrstr, sizeof(addrstr), portstr, sizeof(portstr), NI_NUMERICHOST|NI_NUMERICSERV); + g_assert(ret == 0); + DEBUG_ARG("hfamily = INET"); + DEBUG_ARG("haddr = %s", addrstr); + DEBUG_ARG("hport = %s", portstr); + break; +#ifndef _WIN32 + case AF_UNIX: + DEBUG_ARG("hfamily = UNIX"); + DEBUG_ARG("hpath = %s", ((struct sockaddr_un *) haddr)->sun_path); + break; +#endif + default: + g_assert_not_reached(); + } + switch (laddr->sa_family) { + case AF_INET: + case AF_INET6: + ret = getnameinfo(laddr, laddrlen, addrstr, sizeof(addrstr), portstr, sizeof(portstr), NI_NUMERICHOST|NI_NUMERICSERV); + g_assert(ret == 0); + DEBUG_ARG("laddr = %s", addrstr); + DEBUG_ARG("lport = %s", portstr); + break; + default: + g_assert_not_reached(); + } DEBUG_ARG("flags = %x", flags); - so = socreate(slirp); + /* + * SS_HOSTFWD sockets can be accepted multiple times, so they can't be + * SS_FACCEPTONCE. Also, SS_HOSTFWD connections can be accepted and + * immediately closed if the guest address isn't available yet, which is + * incompatible with the "accept once" concept. Correct code will never + * request both, so disallow their combination by assertion. + */ + g_assert(!((flags & SS_HOSTFWD) && (flags & SS_FACCEPTONCE))); + + so = socreate(slirp, IPPROTO_TCP); /* Don't tcp_attach... we don't need so_snd nor so_rcv */ - if ((so->so_tcpcb = tcp_newtcpcb(so)) == NULL) { - g_free(so); - return NULL; - } - insque(so, &slirp->tcb); + so->so_tcpcb = tcp_newtcpcb(so); + slirp_insque(so, &slirp->tcb); /* * SS_FACCEPTONCE sockets must time out. @@ -714,20 +833,16 @@ struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, so->so_state &= SS_PERSISTENT_MASK; so->so_state |= (SS_FACCEPTCONN | flags); - so->so_lfamily = AF_INET; - so->so_lport = lport; /* Kept in network format */ - so->so_laddr.s_addr = laddr; /* Ditto */ - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = haddr; - addr.sin_port = hport; + sockaddr_copy(&so->lhost.sa, sizeof(so->lhost), laddr, laddrlen); - if (((s = slirp_socket(AF_INET, SOCK_STREAM, 0)) < 0) || + s = slirp_socket(haddr->sa_family, SOCK_STREAM, 0); + if ((s < 0) || + (haddr->sa_family == AF_INET6 && slirp_socket_set_v6only(s, (flags & SS_HOSTFWD_V6ONLY) != 0) < 0) || (slirp_socket_set_fast_reuse(s) < 0) || - (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) || + (bind(s, haddr, haddrlen) < 0) || (listen(s, 1) < 0)) { int tmperrno = errno; /* Don't clobber the real reason we failed */ - if (s >= 0) { closesocket(s); } @@ -741,22 +856,34 @@ struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, return NULL; } setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); - opt = 1; - setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)); + slirp_socket_set_nodelay(s); - getsockname(s, (struct sockaddr *)&addr, &addrlen); - so->so_ffamily = AF_INET; - so->so_fport = addr.sin_port; - if (addr.sin_addr.s_addr == 0 || - addr.sin_addr.s_addr == loopback_addr.s_addr) - so->so_faddr = slirp->vhost_addr; - else - so->so_faddr = addr.sin_addr; + addrlen = sizeof(so->fhost); + getsockname(s, &so->fhost.sa, &addrlen); + sotranslate_accept(so); so->s = s; return so; } +struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, + uint32_t laddr, unsigned lport, int flags) +{ + struct sockaddr_in hsa, lsa; + + memset(&hsa, 0, sizeof(hsa)); + hsa.sin_family = AF_INET; + hsa.sin_addr.s_addr = haddr; + hsa.sin_port = hport; + + memset(&lsa, 0, sizeof(lsa)); + lsa.sin_family = AF_INET; + lsa.sin_addr.s_addr = laddr; + lsa.sin_port = lport; + + return tcpx_listen(slirp, (const struct sockaddr *) &hsa, sizeof(hsa), (struct sockaddr *) &lsa, sizeof(lsa), flags); +} + /* * Various session state calls * XXX Should be #define's @@ -941,6 +1068,108 @@ void sotranslate_accept(struct socket *so) } break; + case AF_UNIX: { + /* Translate Unix socket to random ephemeral source port. We obtain + * this source port by binding to port 0 so that the OS allocates a + * port for us. If this fails, we fall back to choosing a random port + * with a random number generator. */ + int s; + struct sockaddr_in in_addr; + struct sockaddr_in6 in6_addr; + socklen_t in_addr_len; + + if (so->slirp->in_enabled) { + so->so_ffamily = AF_INET; + so->so_faddr = slirp->vhost_addr; + so->so_fport = 0; + + switch (so->so_type) { + case IPPROTO_TCP: + s = slirp_socket(PF_INET, SOCK_STREAM, 0); + break; + case IPPROTO_UDP: + s = slirp_socket(PF_INET, SOCK_DGRAM, 0); + break; + default: + g_assert_not_reached(); + break; + } + if (s < 0) { + g_error("Ephemeral slirp_socket() allocation failed"); + goto unix2inet_cont; + } + memset(&in_addr, 0, sizeof(in_addr)); + in_addr.sin_family = AF_INET; + in_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + in_addr.sin_port = htons(0); + if (bind(s, (struct sockaddr *) &in_addr, sizeof(in_addr))) { + g_error("Ephemeral bind() failed"); + closesocket(s); + goto unix2inet_cont; + } + in_addr_len = sizeof(in_addr); + if (getsockname(s, (struct sockaddr *) &in_addr, &in_addr_len)) { + g_error("Ephemeral getsockname() failed"); + closesocket(s); + goto unix2inet_cont; + } + so->s_aux = s; + so->so_fport = in_addr.sin_port; + +unix2inet_cont: + if (!so->so_fport) { + g_warning("Falling back to random port allocation"); + so->so_fport = htons(g_rand_int_range(slirp->grand, 49152, 65536)); + } + } else if (so->slirp->in6_enabled) { + so->so_ffamily = AF_INET6; + so->so_faddr6 = slirp->vhost_addr6; + so->so_fport6 = 0; + + switch (so->so_type) { + case IPPROTO_TCP: + s = slirp_socket(PF_INET6, SOCK_STREAM, 0); + break; + case IPPROTO_UDP: + s = slirp_socket(PF_INET6, SOCK_DGRAM, 0); + break; + default: + g_assert_not_reached(); + break; + } + if (s < 0) { + g_error("Ephemeral slirp_socket() allocation failed"); + goto unix2inet6_cont; + } + memset(&in6_addr, 0, sizeof(in6_addr)); + in6_addr.sin6_family = AF_INET6; + in6_addr.sin6_addr = in6addr_loopback; + in6_addr.sin6_port = htons(0); + if (bind(s, (struct sockaddr *) &in6_addr, sizeof(in6_addr))) { + g_error("Ephemeral bind() failed"); + closesocket(s); + goto unix2inet6_cont; + } + in_addr_len = sizeof(in6_addr); + if (getsockname(s, (struct sockaddr *) &in6_addr, &in_addr_len)) { + g_error("Ephemeral getsockname() failed"); + closesocket(s); + goto unix2inet6_cont; + } + so->s_aux = s; + so->so_fport6 = in6_addr.sin6_port; + +unix2inet6_cont: + if (!so->so_fport6) { + g_warning("Falling back to random port allocation"); + so->so_fport6 = htons(g_rand_int_range(slirp->grand, 49152, 65536)); + } + } else { + g_assert_not_reached(); + } + break; + } /* case AF_UNIX */ + default: break; } @@ -952,3 +1181,53 @@ void sodrop(struct socket *s, int num) s->slirp->cb->notify(s->slirp->opaque); } } + +/* + * Translate "addr-any" in so->lhost to the guest's actual address. + * Returns 0 for success, or -1 if the guest doesn't have an address yet + * with errno set to EHOSTUNREACH. + * + * The guest address is taken from the first entry in the ARP table for IPv4 + * and the first entry in the NDP table for IPv6. + * Note: The IPv4 path isn't exercised yet as all hostfwd "" guest translations + * are handled immediately by using slirp->vdhcp_startaddr. + */ +int soassign_guest_addr_if_needed(struct socket *so) +{ + Slirp *slirp = so->slirp; + /* AF_INET6 addresses are bigger than AF_INET, so this is big enough. */ + char addrstr[INET6_ADDRSTRLEN]; + char portstr[6]; + + g_assert(so->so_state & SS_HOSTFWD); + + switch (so->so_ffamily) { + case AF_INET: + if (so->so_laddr.s_addr == INADDR_ANY) { + g_assert_not_reached(); + } + break; + + case AF_INET6: + if (in6_zero(&so->so_laddr6)) { + int ret; + if (in6_zero(&slirp->ndp_table.guest_in6_addr)) { + errno = EHOSTUNREACH; + return -1; + } + so->so_laddr6 = slirp->ndp_table.guest_in6_addr; + ret = getnameinfo((const struct sockaddr *) &so->lhost.ss, + sizeof(so->lhost.ss), addrstr, sizeof(addrstr), + portstr, sizeof(portstr), + NI_NUMERICHOST|NI_NUMERICSERV); + g_assert(ret == 0); + DEBUG_MISC("%s: new ip = [%s]:%s", __func__, addrstr, portstr); + } + break; + + default: + break; + } + + return 0; +} diff --git a/src/network/slirp/socket.h b/src/network/slirp/socket.h index a6a1e5e21..ca8c103ec 100644 --- a/src/network/slirp/socket.h +++ b/src/network/slirp/socket.h @@ -6,16 +6,31 @@ #ifndef SLIRP_SOCKET_H #define SLIRP_SOCKET_H +#include + +#ifndef _WIN32 +#include +#endif + #include "misc.h" +#include "sbuf.h" #define SO_EXPIRE 240000 #define SO_EXPIREFAST 10000 +/* Helps unify some in/in6 routines. */ +union in4or6_addr { + struct in_addr addr4; + struct in6_addr addr6; +}; +typedef union in4or6_addr in4or6_addr; + /* * Our socket structure */ union slirp_sockaddr { + struct sockaddr sa; struct sockaddr_storage ss; struct sockaddr_in sin; struct sockaddr_in6 sin6; @@ -25,6 +40,8 @@ struct socket { struct socket *so_next, *so_prev; /* For a linked list of sockets */ int s; /* The actual socket */ + int s_aux; /* An auxiliary socket for miscellaneous use. Currently used to + * reserve OS ports in UNIX-to-inet translation. */ struct gfwd_list *guestfwd; int pollfds_idx; /* GPollFD GArray index */ @@ -55,7 +72,8 @@ struct socket { uint8_t so_iptos; /* Type of service */ uint8_t so_emu; /* Is the socket emulated? */ - uint8_t so_type; /* Type of socket, UDP or TCP */ + uint8_t so_type; /* Protocol of the socket. May be 0 if loading old + * states. */ int32_t so_state; /* internal state flags SS_*, below */ struct tcpcb *so_tcpcb; /* pointer to TCP protocol control block */ @@ -97,9 +115,10 @@ struct socket { #define SS_HOSTFWD 0x1000 /* Socket describes host->guest forwarding */ #define SS_INCOMING \ 0x2000 /* Connection was initiated by a host on the internet */ +#define SS_HOSTFWD_V6ONLY 0x4000 /* Only bind on v6 addresses */ -static inline int sockaddr_equal(struct sockaddr_storage *a, - struct sockaddr_storage *b) +static inline int sockaddr_equal(const struct sockaddr_storage *a, + const struct sockaddr_storage *b) { if (a->ss_family != b->ss_family) { return 0; @@ -107,17 +126,24 @@ static inline int sockaddr_equal(struct sockaddr_storage *a, switch (a->ss_family) { case AF_INET: { - struct sockaddr_in *a4 = (struct sockaddr_in *)a; - struct sockaddr_in *b4 = (struct sockaddr_in *)b; + const struct sockaddr_in *a4 = (const struct sockaddr_in *)a; + const struct sockaddr_in *b4 = (const struct sockaddr_in *)b; return a4->sin_addr.s_addr == b4->sin_addr.s_addr && a4->sin_port == b4->sin_port; } case AF_INET6: { - struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)a; - struct sockaddr_in6 *b6 = (struct sockaddr_in6 *)b; + const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *)a; + const struct sockaddr_in6 *b6 = (const struct sockaddr_in6 *)b; return (in6_equal(&a6->sin6_addr, &b6->sin6_addr) && a6->sin6_port == b6->sin6_port); } +#ifndef _WIN32 + case AF_UNIX: { + const struct sockaddr_un *aun = (const struct sockaddr_un *)a; + const struct sockaddr_un *bun = (const struct sockaddr_un *)b; + return strncmp(aun->sun_path, bun->sun_path, sizeof(aun->sun_path)) == 0; + } +#endif default: g_assert_not_reached(); } @@ -125,21 +151,33 @@ static inline int sockaddr_equal(struct sockaddr_storage *a, return 0; } -static inline socklen_t sockaddr_size(struct sockaddr_storage *a) +static inline socklen_t sockaddr_size(const struct sockaddr_storage *a) { switch (a->ss_family) { case AF_INET: return sizeof(struct sockaddr_in); case AF_INET6: return sizeof(struct sockaddr_in6); +#ifndef _WIN32 + case AF_UNIX: + return sizeof(struct sockaddr_un); +#endif default: g_assert_not_reached(); } } +static inline void sockaddr_copy(struct sockaddr *dst, socklen_t dstlen, const struct sockaddr *src, socklen_t srclen) +{ + socklen_t len = sockaddr_size((const struct sockaddr_storage *) src); + g_assert(len <= srclen); + g_assert(len <= dstlen); + memcpy(dst, src, len); +} + struct socket *solookup(struct socket **, struct socket *, struct sockaddr_storage *, struct sockaddr_storage *); -struct socket *socreate(Slirp *); +struct socket *socreate(Slirp *, int); void sofree(struct socket *); int soread(struct socket *); int sorecvoob(struct socket *); @@ -148,6 +186,10 @@ int sowrite(struct socket *); void sorecvfrom(struct socket *); int sosendto(struct socket *, struct mbuf *); struct socket *tcp_listen(Slirp *, uint32_t, unsigned, uint32_t, unsigned, int); +struct socket *tcpx_listen(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *laddr, socklen_t laddrlen, + int flags); void soisfconnecting(register struct socket *); void soisfconnected(register struct socket *); void sofwdrain(struct socket *); @@ -159,6 +201,6 @@ int sotranslate_out(struct socket *, struct sockaddr_storage *); void sotranslate_in(struct socket *, struct sockaddr_storage *); void sotranslate_accept(struct socket *); void sodrop(struct socket *, int num); - +int soassign_guest_addr_if_needed(struct socket *so); #endif /* SLIRP_SOCKET_H */ diff --git a/src/network/slirp/state.c b/src/network/slirp/state.c index 22af77b25..870854747 100644 --- a/src/network/slirp/state.c +++ b/src/network/slirp/state.c @@ -344,7 +344,7 @@ int slirp_state_load(Slirp *slirp, int version_id, SlirpReadCb read_cb, while (slirp_istream_read_u8(&f)) { int ret; - struct socket *so = socreate(slirp); + struct socket *so = socreate(slirp, -1); ret = slirp_vmstate_load_state(&f, &vmstate_slirp_socket, so, version_id); diff --git a/src/network/slirp/tcp.h b/src/network/slirp/tcp.h index 9c4a6b693..211dfec39 100644 --- a/src/network/slirp/tcp.h +++ b/src/network/slirp/tcp.h @@ -55,7 +55,7 @@ struct tcphdr { uint16_t th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ -#if G_BYTE_ORDER == G_BIG_ENDIAN +#if (G_BYTE_ORDER == G_BIG_ENDIAN) && !defined(_MSC_VER) uint8_t th_off : 4, /* data offset */ th_x2 : 4; /* (unused) */ #else diff --git a/src/network/slirp/tcp_input.c b/src/network/slirp/tcp_input.c index d55b0c81d..ecca972ee 100644 --- a/src/network/slirp/tcp_input.c +++ b/src/network/slirp/tcp_input.c @@ -146,14 +146,14 @@ static int tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti, } q = tcpiphdr_next(q); m = tcpiphdr_prev(q)->ti_mbuf; - remque(tcpiphdr2qlink(tcpiphdr_prev(q))); + slirp_remque(tcpiphdr2qlink(tcpiphdr_prev(q))); m_free(m); } /* * Stick new segment in its place. */ - insque(tcpiphdr2qlink(ti), tcpiphdr2qlink(tcpiphdr_prev(q))); + slirp_insque(tcpiphdr2qlink(ti), tcpiphdr2qlink(tcpiphdr_prev(q))); present: /* @@ -170,7 +170,7 @@ present: do { tp->rcv_nxt += ti->ti_len; flags = ti->ti_flags & TH_FIN; - remque(tcpiphdr2qlink(ti)); + slirp_remque(tcpiphdr2qlink(ti)); m = ti->ti_mbuf; ti = tcpiphdr_next(ti); if (so->so_state & SS_FCANTSENDMORE) @@ -215,6 +215,9 @@ void tcp_input(struct mbuf *m, int iphlen, struct socket *inso, DEBUG_CALL("tcp_input"); DEBUG_ARG("m = %p iphlen = %2d inso = %p", m, iphlen, inso); + memset(&lhost, 0, sizeof(struct sockaddr_storage)); + memset(&fhost, 0, sizeof(struct sockaddr_storage)); + /* * If called with m == 0, then we're continuing the connect */ @@ -233,6 +236,16 @@ void tcp_input(struct mbuf *m, int iphlen, struct socket *inso, goto cont_conn; } slirp = m->slirp; + switch (af) { + case AF_INET: + M_DUP_DEBUG(slirp, m, 0, + sizeof(struct tcpiphdr) - sizeof(struct ip) - sizeof(struct tcphdr)); + break; + case AF_INET6: + M_DUP_DEBUG(slirp, m, 0, + sizeof(struct tcpiphdr) - sizeof(struct ip6) - sizeof(struct tcphdr)); + break; + } ip = mtod(m, struct ip *); ip6 = mtod(m, struct ip6 *); @@ -407,7 +420,7 @@ findso: if ((tiflags & (TH_SYN | TH_FIN | TH_RST | TH_URG | TH_ACK)) != TH_SYN) goto dropwithreset; - so = socreate(slirp); + so = socreate(slirp, IPPROTO_TCP); tcp_attach(so); sbreserve(&so->so_snd, TCP_SNDSPACE); @@ -524,7 +537,7 @@ findso: * we don't need this.. XXX??? */ if (so->so_snd.sb_cc) - (void)tcp_output(tp); + tcp_output(tp); return; } @@ -775,7 +788,7 @@ findso: soisfconnected(so); tp->t_state = TCPS_ESTABLISHED; - (void)tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); + tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); /* * if we didn't have to retransmit the SYN, * use its rtt as our initial srtt & rtt var. @@ -977,7 +990,7 @@ findso: soisfconnected(so); } - (void)tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); + tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); tp->snd_wl1 = ti->ti_seq - 1; /* Avoid ack processing; snd_una==ti_ack => dup ack */ goto synrx_to_est; @@ -1040,7 +1053,7 @@ findso: tp->t_rtt = 0; tp->snd_nxt = ti->ti_ack; tp->snd_cwnd = tp->t_maxseg; - (void)tcp_output(tp); + tcp_output(tp); tp->snd_cwnd = tp->snd_ssthresh + tp->t_maxseg * tp->t_dupacks; if (SEQ_GT(onxt, tp->snd_nxt)) @@ -1048,7 +1061,7 @@ findso: goto drop; } else if (tp->t_dupacks > TCPREXMTTHRESH) { tp->snd_cwnd += tp->t_maxseg; - (void)tcp_output(tp); + tcp_output(tp); goto drop; } } else @@ -1332,7 +1345,7 @@ dodata: * Return any desired output. */ if (needoutput || (tp->t_flags & TF_ACKNOW)) { - (void)tcp_output(tp); + tcp_output(tp); } return; @@ -1345,7 +1358,7 @@ dropafterack: goto drop; m_free(m); tp->t_flags |= TF_ACKNOW; - (void)tcp_output(tp); + tcp_output(tp); return; dropwithreset: @@ -1399,7 +1412,7 @@ static void tcp_dooptions(struct tcpcb *tp, uint8_t *cp, int cnt, continue; memcpy((char *)&mss, (char *)cp + 2, sizeof(mss)); NTOHS(mss); - (void)tcp_mss(tp, mss); /* sets t_maxseg */ + tcp_mss(tp, mss); /* sets t_maxseg */ break; } } diff --git a/src/network/slirp/tcp_subr.c b/src/network/slirp/tcp_subr.c index a1016d90d..112448483 100644 --- a/src/network/slirp/tcp_subr.c +++ b/src/network/slirp/tcp_subr.c @@ -303,7 +303,7 @@ struct tcpcb *tcp_drop(struct tcpcb *tp, int err) if (TCPS_HAVERCVDSYN(tp->t_state)) { tp->t_state = TCPS_CLOSED; - (void)tcp_output(tp); + tcp_output(tp); } return (tcp_close(tp)); } @@ -329,7 +329,7 @@ struct tcpcb *tcp_close(struct tcpcb *tp) while (!tcpfrag_list_end(t, tp)) { t = tcpiphdr_next(t); m = tcpiphdr_prev(t)->ti_mbuf; - remque(tcpiphdr2qlink(tcpiphdr_prev(t))); + slirp_remque(tcpiphdr2qlink(tcpiphdr_prev(t))); m_free(m); } g_free(tp); @@ -421,7 +421,7 @@ int tcp_fconnect(struct socket *so, unsigned short af) struct sockaddr_storage addr; slirp_set_nonblock(s); - so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); + so->slirp->cb->register_poll_fd(s, so->slirp->opaque); slirp_socket_set_fast_reuse(s); opt = 1; setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt)); @@ -464,12 +464,54 @@ void tcp_connect(struct socket *inso) Slirp *slirp = inso->slirp; struct socket *so; struct sockaddr_storage addr; - socklen_t addrlen = sizeof(struct sockaddr_storage); + socklen_t addrlen; struct tcpcb *tp; - int s, opt; + int s, opt, ret; + /* AF_INET6 addresses are bigger than AF_INET, so this is big enough. */ + char addrstr[INET6_ADDRSTRLEN]; + char portstr[6]; DEBUG_CALL("tcp_connect"); DEBUG_ARG("inso = %p", inso); + switch (inso->lhost.ss.ss_family) { + case AF_INET: + addrlen = sizeof(struct sockaddr_in); + break; + case AF_INET6: + addrlen = sizeof(struct sockaddr_in6); + break; + default: + g_assert_not_reached(); + } + ret = getnameinfo((const struct sockaddr *) &inso->lhost.ss, addrlen, addrstr, sizeof(addrstr), portstr, sizeof(portstr), NI_NUMERICHOST|NI_NUMERICSERV); + g_assert(ret == 0); + DEBUG_ARG("ip = [%s]:%s", addrstr, portstr); + DEBUG_ARG("so_state = 0x%x", inso->so_state); + + /* Perform lazy guest IP address resolution if needed. */ + if (inso->so_state & SS_HOSTFWD) { + /* + * We can only reject the connection request by accepting it and + * then immediately closing it. Note that SS_FACCEPTONCE sockets can't + * get here. + */ + if (soassign_guest_addr_if_needed(inso) < 0) { + /* + * Guest address isn't available yet. We could either try to defer + * completing this connection request until the guest address is + * available, or punt. It's easier to punt. Otherwise we need to + * complicate the mechanism by which we're called to defer calling + * us again until the guest address is available. + */ + DEBUG_MISC(" guest address not available yet"); + addrlen = sizeof(addr); + s = accept(inso->s, (struct sockaddr *)&addr, &addrlen); + if (s >= 0) { + closesocket(s); + } + return; + } + } /* * If it's an SS_ACCEPTONCE socket, no need to socreate() @@ -479,7 +521,7 @@ void tcp_connect(struct socket *inso) /* FACCEPTONCE already have a tcpcb */ so = inso; } else { - so = socreate(slirp); + so = socreate(slirp, IPPROTO_TCP); tcp_attach(so); so->lhost = inso->lhost; so->so_ffamily = inso->so_ffamily; @@ -487,13 +529,14 @@ void tcp_connect(struct socket *inso) tcp_mss(sototcpcb(so), 0); + addrlen = sizeof(addr); s = accept(inso->s, (struct sockaddr *)&addr, &addrlen); if (s < 0) { tcp_close(sototcpcb(so)); /* This will sofree() as well */ return; } slirp_set_nonblock(s); - so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); + so->slirp->cb->register_poll_fd(s, so->slirp->opaque); slirp_socket_set_fast_reuse(s); opt = 1; setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); @@ -534,7 +577,7 @@ void tcp_connect(struct socket *inso) void tcp_attach(struct socket *so) { so->so_tcpcb = tcp_newtcpcb(so); - insque(so, &so->slirp->tcb); + slirp_insque(so, &so->slirp->tcb); } /* diff --git a/src/network/slirp/tcp_timer.c b/src/network/slirp/tcp_timer.c index 102023e7c..bc4db2d15 100644 --- a/src/network/slirp/tcp_timer.c +++ b/src/network/slirp/tcp_timer.c @@ -52,7 +52,7 @@ void tcp_fasttimo(Slirp *slirp) (tp->t_flags & TF_DELACK)) { tp->t_flags &= ~TF_DELACK; tp->t_flags |= TF_ACKNOW; - (void)tcp_output(tp); + tcp_output(tp); } } @@ -233,7 +233,7 @@ static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer) tp->snd_ssthresh = win * tp->t_maxseg; tp->t_dupacks = 0; } - (void)tcp_output(tp); + tcp_output(tp); break; /* @@ -243,7 +243,7 @@ static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer) case TCPT_PERSIST: tcp_setpersist(tp); tp->t_force = 1; - (void)tcp_output(tp); + tcp_output(tp); tp->t_force = 0; break; diff --git a/src/network/slirp/tcpip.h b/src/network/slirp/tcpip.h index d3df02149..a0fb2282f 100644 --- a/src/network/slirp/tcpip.h +++ b/src/network/slirp/tcpip.h @@ -88,8 +88,8 @@ struct tcpiphdr { /* This is the difference between the size of a tcpiphdr structure, and the * size of actual ip+tcp headers, rounded up since we need to align data. */ #define TCPIPHDR_DELTA \ - (MAX(0, (sizeof(struct tcpiphdr) - sizeof(struct ip) - \ - sizeof(struct tcphdr) + 3) & \ + (MAX(0, ((int) sizeof(struct tcpiphdr) - (int) sizeof(struct ip) - \ + (int) sizeof(struct tcphdr) + 3) & \ ~3)) /* diff --git a/src/network/slirp/tftp.c b/src/network/slirp/tftp.c index c6950ee10..a19c889d3 100644 --- a/src/network/slirp/tftp.c +++ b/src/network/slirp/tftp.c @@ -50,7 +50,7 @@ static void tftp_session_terminate(struct tftp_session *spt) } static int tftp_session_allocate(Slirp *slirp, struct sockaddr_storage *srcsas, - struct tftp_t *tp) + struct tftphdr *hdr) { struct tftp_session *spt; int k; @@ -75,7 +75,7 @@ found: memcpy(&spt->client_addr, srcsas, sockaddr_size(srcsas)); spt->fd = -1; spt->block_size = 512; - spt->client_port = tp->udp.uh_sport; + spt->client_port = hdr->udp.uh_sport; spt->slirp = slirp; tftp_session_update(spt); @@ -84,7 +84,7 @@ found: } static int tftp_session_find(Slirp *slirp, struct sockaddr_storage *srcsas, - struct tftp_t *tp) + struct tftphdr *hdr) { struct tftp_session *spt; int k; @@ -94,7 +94,7 @@ static int tftp_session_find(Slirp *slirp, struct sockaddr_storage *srcsas, if (tftp_session_in_use(spt)) { if (sockaddr_equal(&spt->client_addr, srcsas)) { - if (spt->client_port == tp->udp.uh_sport) { + if (spt->client_port == hdr->udp.uh_sport) { return k; } } @@ -148,13 +148,13 @@ static struct tftp_t *tftp_prep_mbuf_data(struct tftp_session *spt, } static void tftp_udp_output(struct tftp_session *spt, struct mbuf *m, - struct tftp_t *recv_tp) + struct tftphdr *hdr) { if (spt->client_addr.ss_family == AF_INET6) { struct sockaddr_in6 sa6, da6; sa6.sin6_addr = spt->slirp->vhost_addr6; - sa6.sin6_port = recv_tp->udp.uh_dport; + sa6.sin6_port = hdr->udp.uh_dport; da6.sin6_addr = ((struct sockaddr_in6 *)&spt->client_addr)->sin6_addr; da6.sin6_port = spt->client_port; @@ -163,7 +163,7 @@ static void tftp_udp_output(struct tftp_session *spt, struct mbuf *m, struct sockaddr_in sa4, da4; sa4.sin_addr = spt->slirp->vhost_addr; - sa4.sin_port = recv_tp->udp.uh_dport; + sa4.sin_port = hdr->udp.uh_dport; da4.sin_addr = ((struct sockaddr_in *)&spt->client_addr)->sin_addr; da4.sin_port = spt->client_port; @@ -185,14 +185,14 @@ static int tftp_send_oack(struct tftp_session *spt, const char *keys[], tp = tftp_prep_mbuf_data(spt, m); - tp->tp_op = htons(TFTP_OACK); + tp->hdr.tp_op = htons(TFTP_OACK); for (i = 0; i < nb; i++) { n += slirp_fmt0(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%s", keys[i]); n += slirp_fmt0(tp->x.tp_buf + n, sizeof(tp->x.tp_buf) - n, "%u", values[i]); } - m->m_len = G_SIZEOF_MEMBER(struct tftp_t, tp_op) + n; - tftp_udp_output(spt, m, recv_tp); + m->m_len = G_SIZEOF_MEMBER(struct tftp_t, hdr.tp_op) + n; + tftp_udp_output(spt, m, &recv_tp->hdr); return 0; } @@ -213,21 +213,21 @@ static void tftp_send_error(struct tftp_session *spt, uint16_t errorcode, tp = tftp_prep_mbuf_data(spt, m); - tp->tp_op = htons(TFTP_ERROR); + tp->hdr.tp_op = htons(TFTP_ERROR); tp->x.tp_error.tp_error_code = htons(errorcode); slirp_pstrcpy((char *)tp->x.tp_error.tp_msg, sizeof(tp->x.tp_error.tp_msg), msg); m->m_len = sizeof(struct tftp_t) - (TFTP_BLOCKSIZE_MAX + 2) + 3 + strlen(msg) - sizeof(struct udphdr); - tftp_udp_output(spt, m, recv_tp); + tftp_udp_output(spt, m, &recv_tp->hdr); out: tftp_session_terminate(spt); } static void tftp_send_next_block(struct tftp_session *spt, - struct tftp_t *recv_tp) + struct tftphdr *hdr) { struct mbuf *m; struct tftp_t *tp; @@ -241,7 +241,7 @@ static void tftp_send_next_block(struct tftp_session *spt, tp = tftp_prep_mbuf_data(spt, m); - tp->tp_op = htons(TFTP_DATA); + tp->hdr.tp_op = htons(TFTP_DATA); tp->x.tp_data.tp_block_nr = htons((spt->block_nr + 1) & 0xffff); nobytes = tftp_read_data(spt, spt->block_nr, tp->x.tp_data.tp_buf, @@ -259,7 +259,7 @@ static void tftp_send_next_block(struct tftp_session *spt, m->m_len = sizeof(struct tftp_t) - (TFTP_BLOCKSIZE_MAX - nobytes) - sizeof(struct udphdr); - tftp_udp_output(spt, m, recv_tp); + tftp_udp_output(spt, m, hdr); if (nobytes == spt->block_size) { tftp_session_update(spt); @@ -282,12 +282,12 @@ static void tftp_handle_rrq(Slirp *slirp, struct sockaddr_storage *srcsas, int nb_options = 0; /* check if a session already exists and if so terminate it */ - s = tftp_session_find(slirp, srcsas, tp); + s = tftp_session_find(slirp, srcsas, &tp->hdr); if (s >= 0) { tftp_session_terminate(&slirp->tftp_sessions[s]); } - s = tftp_session_allocate(slirp, srcsas, tp); + s = tftp_session_allocate(slirp, srcsas, &tp->hdr); if (s < 0) { return; @@ -413,29 +413,29 @@ static void tftp_handle_rrq(Slirp *slirp, struct sockaddr_storage *srcsas, } spt->block_nr = 0; - tftp_send_next_block(spt, tp); + tftp_send_next_block(spt, &tp->hdr); } static void tftp_handle_ack(Slirp *slirp, struct sockaddr_storage *srcsas, - struct tftp_t *tp, int pktlen) + struct tftphdr *hdr) { int s; - s = tftp_session_find(slirp, srcsas, tp); + s = tftp_session_find(slirp, srcsas, hdr); if (s < 0) { return; } - tftp_send_next_block(&slirp->tftp_sessions[s], tp); + tftp_send_next_block(&slirp->tftp_sessions[s], hdr); } static void tftp_handle_error(Slirp *slirp, struct sockaddr_storage *srcsas, - struct tftp_t *tp, int pktlen) + struct tftphdr *hdr) { int s; - s = tftp_session_find(slirp, srcsas, tp); + s = tftp_session_find(slirp, srcsas, hdr); if (s < 0) { return; @@ -446,19 +446,25 @@ static void tftp_handle_error(Slirp *slirp, struct sockaddr_storage *srcsas, void tftp_input(struct sockaddr_storage *srcsas, struct mbuf *m) { - struct tftp_t *tp = (struct tftp_t *)m->m_data; + struct tftphdr *hdr = mtod_check(m, sizeof(struct tftphdr)); - switch (ntohs(tp->tp_op)) { + if (hdr == NULL) { + return; + } + + switch (ntohs(hdr->tp_op)) { case TFTP_RRQ: - tftp_handle_rrq(m->slirp, srcsas, tp, m->m_len); + tftp_handle_rrq(m->slirp, srcsas, + mtod(m, struct tftp_t *), + m->m_len); break; case TFTP_ACK: - tftp_handle_ack(m->slirp, srcsas, tp, m->m_len); + tftp_handle_ack(m->slirp, srcsas, hdr); break; case TFTP_ERROR: - tftp_handle_error(m->slirp, srcsas, tp, m->m_len); + tftp_handle_error(m->slirp, srcsas, hdr); break; } } diff --git a/src/network/slirp/tftp.h b/src/network/slirp/tftp.h index 663485328..a0784885c 100644 --- a/src/network/slirp/tftp.h +++ b/src/network/slirp/tftp.h @@ -23,9 +23,19 @@ #if defined(_MSC_VER) && !defined (__clang__) #pragma pack(push, 1) #endif -struct tftp_t { +struct tftphdr { struct udphdr udp; uint16_t tp_op; +} SLIRP_PACKED; +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(pop) +#endif + +#if defined(_MSC_VER) && !defined (__clang__) +#pragma pack(push, 1) +#endif +struct tftp_t { + struct tftphdr hdr; union { struct { uint16_t tp_block_nr; diff --git a/src/network/slirp/tinyglib.c b/src/network/slirp/tinyglib.c index 702c39ad7..7b1e27bc5 100644 --- a/src/network/slirp/tinyglib.c +++ b/src/network/slirp/tinyglib.c @@ -16,6 +16,7 @@ */ #include #include +#include /* Must be a function, as libslirp redefines it as a macro. */ gboolean @@ -28,6 +29,17 @@ g_spawn_async_with_fds(const gchar *working_directory, gchar **argv, return 0; } +/* Implementation borrowed from GLib itself. */ +gboolean +g_str_has_prefix (const gchar *str, + const gchar *prefix) +{ + g_return_val_if_fail (str != NULL, false); + g_return_val_if_fail (prefix != NULL, false); + + return strncmp (str, prefix, strlen (prefix)) == 0; +} + /* Needs bounds checking, but not really used by libslirp. */ GString * g_string_new(gchar *base) diff --git a/src/network/slirp/udp.c b/src/network/slirp/udp.c index 0ad44d7c0..bd4dbebde 100644 --- a/src/network/slirp/udp.c +++ b/src/network/slirp/udp.c @@ -67,6 +67,8 @@ void udp_cleanup(Slirp *slirp) void udp_input(register struct mbuf *m, int iphlen) { Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + register struct ip *ip; register struct udphdr *uh; int len; @@ -74,6 +76,7 @@ void udp_input(register struct mbuf *m, int iphlen) struct socket *so; struct sockaddr_storage lhost; struct sockaddr_in *lhost4; + int ttl; DEBUG_CALL("udp_input"); DEBUG_ARG("m = %p", m); @@ -93,7 +96,10 @@ void udp_input(register struct mbuf *m, int iphlen) /* * Get IP and UDP header together in first mbuf. */ - ip = mtod(m, struct ip *); + ip = mtod_check(m, iphlen + sizeof(struct udphdr)); + if (ip == NULL) { + goto bad; + } uh = (struct udphdr *)((char *)ip + iphlen); /* @@ -171,7 +177,7 @@ void udp_input(register struct mbuf *m, int iphlen) * If there's no socket for this packet, * create one */ - so = socreate(slirp); + so = socreate(slirp, IPPROTO_UDP); if (udp_attach(so, AF_INET) == -1) { DEBUG_MISC(" udp_attach errno = %d-%s", errno, strerror(errno)); sofree(so); @@ -202,6 +208,20 @@ void udp_input(register struct mbuf *m, int iphlen) m->m_len -= iphlen; m->m_data += iphlen; + /* + * Check for TTL + */ + ttl = save_ip.ip_ttl-1; + if (ttl <= 0) { + m->m_len += iphlen; + m->m_data -= iphlen; + *ip = save_ip; + DEBUG_MISC("udp ttl exceeded"); + icmp_send_error(m, ICMP_TIMXCEED, ICMP_TIMXCEED_INTRANS, 0, NULL); + goto bad; + } + setsockopt(so->s, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); + /* * Now we sendto() the packet. */ @@ -230,14 +250,21 @@ bad: int udp_output(struct socket *so, struct mbuf *m, struct sockaddr_in *saddr, struct sockaddr_in *daddr, int iptos) { + Slirp *slirp = m->slirp; +// char addr[INET_ADDRSTRLEN]; + + M_DUP_DEBUG(slirp, m, 0, sizeof(struct udpiphdr)); + register struct udpiphdr *ui; int error = 0; +/* DEBUG_CALL("udp_output"); DEBUG_ARG("so = %p", so); DEBUG_ARG("m = %p", m); - DEBUG_ARG("saddr = %s", inet_ntoa(saddr->sin_addr)); - DEBUG_ARG("daddr = %s", inet_ntoa(daddr->sin_addr)); + DEBUG_ARG("saddr = %s", inet_ntop(AF_INET, &saddr->sin_addr, addr, sizeof(addr))); + DEBUG_ARG("daddr = %s", inet_ntop(AF_INET, &daddr->sin_addr, addr, sizeof(addr))); +*/ /* * Adjust for header @@ -288,9 +315,27 @@ int udp_attach(struct socket *so, unsigned short af) so->s = -1; return -1; } + +#ifdef __linux__ + { + int opt = 1; + switch (af) { + case AF_INET: + setsockopt(so->s, IPPROTO_IP, IP_RECVERR, &opt, sizeof(opt)); + break; + case AF_INET6: + setsockopt(so->s, IPPROTO_IPV6, IPV6_RECVERR, &opt, sizeof(opt)); + break; + default: + g_assert_not_reached(); + } + } +#endif + so->so_expire = curtime + SO_EXPIRE; - insque(so, &so->slirp->udb); + slirp_insque(so, &so->slirp->udb); } + so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque); return (so->s); } @@ -321,45 +366,64 @@ static uint8_t udp_tos(struct socket *so) return 0; } -struct socket *udp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, - uint32_t laddr, unsigned lport, int flags) +struct socket *udpx_listen(Slirp *slirp, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *laddr, socklen_t laddrlen, + int flags) { - /* TODO: IPv6 */ - struct sockaddr_in addr; struct socket *so; - socklen_t addrlen = sizeof(struct sockaddr_in); + socklen_t addrlen; + int save_errno; - memset(&addr, 0, sizeof(addr)); - so = socreate(slirp); - so->s = slirp_socket(AF_INET, SOCK_DGRAM, 0); + so = socreate(slirp, IPPROTO_UDP); + so->s = slirp_socket(haddr->sa_family, SOCK_DGRAM, 0); if (so->s < 0) { + save_errno = errno; sofree(so); + errno = save_errno; return NULL; } + if (haddr->sa_family == AF_INET6) + slirp_socket_set_v6only(so->s, (flags & SS_HOSTFWD_V6ONLY) != 0); so->so_expire = curtime + SO_EXPIRE; - insque(so, &slirp->udb); + slirp_insque(so, &slirp->udb); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = haddr; - addr.sin_port = hport; - - if (bind(so->s, (struct sockaddr *)&addr, addrlen) < 0) { + if (bind(so->s, haddr, haddrlen) < 0) { + save_errno = errno; udp_detach(so); + errno = save_errno; return NULL; } slirp_socket_set_fast_reuse(so->s); - getsockname(so->s, (struct sockaddr *)&addr, &addrlen); - so->fhost.sin = addr; + addrlen = sizeof(so->fhost); + getsockname(so->s, &so->fhost.sa, &addrlen); sotranslate_accept(so); - so->so_lfamily = AF_INET; - so->so_lport = lport; - so->so_laddr.s_addr = laddr; + + sockaddr_copy(&so->lhost.sa, sizeof(so->lhost), laddr, laddrlen); + if (flags != SS_FACCEPTONCE) so->so_expire = 0; - so->so_state &= SS_PERSISTENT_MASK; so->so_state |= SS_ISFCONNECTED | flags; return so; } + +struct socket *udp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, + uint32_t laddr, unsigned lport, int flags) +{ + struct sockaddr_in hsa, lsa; + + memset(&hsa, 0, sizeof(hsa)); + hsa.sin_family = AF_INET; + hsa.sin_addr.s_addr = haddr; + hsa.sin_port = hport; + + memset(&lsa, 0, sizeof(lsa)); + lsa.sin_family = AF_INET; + lsa.sin_addr.s_addr = laddr; + lsa.sin_port = lport; + + return udpx_listen(slirp, (const struct sockaddr *) &hsa, sizeof(hsa), (struct sockaddr *) &lsa, sizeof(lsa), flags); +} diff --git a/src/network/slirp/udp.h b/src/network/slirp/udp.h index c3b83fdc5..47f4ed34d 100644 --- a/src/network/slirp/udp.h +++ b/src/network/slirp/udp.h @@ -34,6 +34,8 @@ #ifndef UDP_H #define UDP_H +#include "socket.h" + #define UDP_TTL 0x60 #define UDP_UDPDATALEN 16192 @@ -80,6 +82,10 @@ void udp_input(register struct mbuf *, int); int udp_attach(struct socket *, unsigned short af); void udp_detach(struct socket *); struct socket *udp_listen(Slirp *, uint32_t, unsigned, uint32_t, unsigned, int); +struct socket *udpx_listen(Slirp *, + const struct sockaddr *haddr, socklen_t haddrlen, + const struct sockaddr *laddr, socklen_t laddrlen, + int flags); int udp_output(struct socket *so, struct mbuf *m, struct sockaddr_in *saddr, struct sockaddr_in *daddr, int iptos); diff --git a/src/network/slirp/udp6.c b/src/network/slirp/udp6.c index 6f9486bbc..effdf77d0 100644 --- a/src/network/slirp/udp6.c +++ b/src/network/slirp/udp6.c @@ -11,12 +11,15 @@ void udp6_input(struct mbuf *m) { Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, 0); + struct ip6 *ip, save_ip; struct udphdr *uh; int iphlen = sizeof(struct ip6); int len; struct socket *so; struct sockaddr_in6 lhost; + int hop_limit; DEBUG_CALL("udp6_input"); DEBUG_ARG("m = %p", m); @@ -28,7 +31,10 @@ void udp6_input(struct mbuf *m) ip = mtod(m, struct ip6 *); m->m_len -= iphlen; m->m_data += iphlen; - uh = mtod(m, struct udphdr *); + uh = mtod_check(m, sizeof(struct udphdr)); + if (uh == NULL) { + goto bad; + } m->m_len += iphlen; m->m_data -= iphlen; @@ -89,7 +95,7 @@ void udp6_input(struct mbuf *m) if (so == NULL) { /* If there's no socket for this packet, create one. */ - so = socreate(slirp); + so = socreate(slirp, IPPROTO_UDP); if (udp_attach(so, AF_INET6) == -1) { DEBUG_MISC(" udp6_attach errno = %d-%s", errno, strerror(errno)); sofree(so); @@ -110,6 +116,20 @@ void udp6_input(struct mbuf *m) m->m_len -= iphlen; m->m_data += iphlen; + /* + * Check for TTL + */ + hop_limit = save_ip.ip_hl-1; + if (hop_limit <= 0) { + m->m_len += iphlen; + m->m_data -= iphlen; + *ip = save_ip; + DEBUG_MISC("udp ttl exceeded"); + icmp6_send_error(m, ICMP6_TIMXCEED, ICMP6_TIMXCEED_INTRANS); + goto bad; + } + setsockopt(so->s, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hop_limit, sizeof(hop_limit)); + /* * Now we sendto() the packet. */ @@ -138,6 +158,9 @@ bad: int udp6_output(struct socket *so, struct mbuf *m, struct sockaddr_in6 *saddr, struct sockaddr_in6 *daddr) { + Slirp *slirp = m->slirp; + M_DUP_DEBUG(slirp, m, 0, sizeof(struct ip6) + sizeof(struct udphdr)); + struct ip6 *ip; struct udphdr *uh; diff --git a/src/network/slirp/util.c b/src/network/slirp/util.c index 8478c48d6..7297e5022 100644 --- a/src/network/slirp/util.c +++ b/src/network/slirp/util.c @@ -72,6 +72,7 @@ static void slirp_set_cloexec(int fd) /* * Opens a socket with FD_CLOEXEC set + * On failure errno contains the reason. */ int slirp_socket(int domain, int type, int protocol) { @@ -366,6 +367,7 @@ void slirp_pstrcpy(char *buf, int buf_size, const char *str) *q = '\0'; } +G_GNUC_PRINTF(3, 0) static int slirp_vsnprintf(char *str, size_t size, const char *format, va_list args) { @@ -427,3 +429,14 @@ int slirp_fmt0(char *str, size_t size, const char *format, ...) return rv; } + +const char *slirp_ether_ntoa(const uint8_t *addr, char *out_str, + size_t out_str_size) +{ + assert(out_str_size >= ETH_ADDRSTRLEN); + + slirp_fmt0(out_str, out_str_size, "%02x:%02x:%02x:%02x:%02x:%02x", + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); + + return out_str; +} diff --git a/src/network/slirp/util.h b/src/network/slirp/util.h index 951bfc57d..0f0123a34 100644 --- a/src/network/slirp/util.h +++ b/src/network/slirp/util.h @@ -30,9 +30,6 @@ #include #include #include -#ifndef _WIN32 -#include -#endif #include #include #include @@ -40,7 +37,9 @@ #ifdef _WIN32 #include #include +#include #else +#include #include #include #include @@ -49,7 +48,7 @@ #if defined(_MSC_VER) && !defined(__clang__) #define SLIRP_PACKED #elif defined(_WIN32) && (defined(__x86_64__) || defined(__i386__)) && !defined(__clang__) -#define SLIRP_PACKED __attribute__((gcc_struct, packed)) +#define SLIRP_PACKED __attribute__((gcc_struct, packed)) #else #define SLIRP_PACKED __attribute__((packed)) #endif @@ -59,7 +58,8 @@ #endif #ifndef container_of -#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member))); +#define container_of(ptr, type, member) \ + ((type *) (((char *)(ptr)) - offsetof(type, member))); #endif #ifndef G_SIZEOF_MEMBER @@ -83,6 +83,7 @@ struct iovec { #define SCALE_MS 1000000 #define ETH_ALEN 6 +#define ETH_ADDRSTRLEN 18 /* "xx:xx:xx:xx:xx:xx", with trailing NUL */ #define ETH_HLEN 14 #define ETH_P_IP (0x0800) /* Internet Protocol packet */ #define ETH_P_ARP (0x0806) /* Address Resolution packet */ @@ -159,6 +160,11 @@ int slirp_inet_aton(const char *cp, struct in_addr *ia); int slirp_socket(int domain, int type, int protocol); void slirp_set_nonblock(int fd); +static inline int slirp_socket_set_v6only(int fd, int v) +{ + return setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &v, sizeof(v)); +} + static inline int slirp_socket_set_nodelay(int fd) { int v = 1; @@ -185,4 +191,11 @@ void slirp_pstrcpy(char *buf, int buf_size, const char *str); int slirp_fmt(char *str, size_t size, const char *format, ...) G_GNUC_PRINTF(3, 4); int slirp_fmt0(char *str, size_t size, const char *format, ...) G_GNUC_PRINTF(3, 4); +/* + * Pretty print a MAC address into out_str. + * As a convenience returns out_str. + */ +const char *slirp_ether_ntoa(const uint8_t *addr, char *out_str, + size_t out_str_len); + #endif diff --git a/src/network/slirp/vmstate.h b/src/network/slirp/vmstate.h index e6bed53a6..b1d40e892 100644 --- a/src/network/slirp/vmstate.h +++ b/src/network/slirp/vmstate.h @@ -175,6 +175,9 @@ enum VMStateFlags { * VMStateField.struct_version_id to tell which version of the * structure we are referencing to use. */ VMS_VSTRUCT = 0x8000, + + /* Marker for end of list */ + VMS_END = 0x10000 }; struct VMStateField { @@ -216,10 +219,17 @@ extern const VMStateInfo slirp_vmstate_info_nullptr; extern const VMStateInfo slirp_vmstate_info_buffer; extern const VMStateInfo slirp_vmstate_info_tmp; +#ifdef __GNUC__ #define type_check_array(t1, t2, n) ((t1(*)[n])0 - (t2 *)0) #define type_check_pointer(t1, t2) ((t1 **)0 - (t2 *)0) #define typeof_field(type, field) typeof(((type *)0)->field) #define type_check(t1, t2) ((t1 *)0 - (t2 *)0) +#else +#define type_check_array(t1, t2, n) 0 +#define type_check_pointer(t1, t2) 0 +#define typeof_field(type, field) (((type *)0)->field) +#define type_check(t1, t2) 0 +#endif #define vmstate_offset_value(_state, _field, _type) \ (offsetof(_state, _field) + type_check(_type, typeof_field(_state, _field))) @@ -388,6 +398,7 @@ extern const VMStateInfo slirp_vmstate_info_tmp; #define VMSTATE_END_OF_LIST() \ { \ + .flags = VMS_END, \ } -#endif +#endif /* VMSTATE_H_ */ diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 4ba9f4745..0c34aeaa4 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -637,16 +637,17 @@ SCSIOBJ := scsi.o scsi_device.o \ scsi_ncr5380.o scsi_ncr53c8xx.o \ scsi_pcscsi.o scsi_spock.o -SLIRPOBJ := arp_table.o bootp.o cksum.o dnssearch.o if.o \ - ip_icmp.o ip_input.o ip_output.o \ - mbuf.o misc.o sbuf.o slirp.o socket.o \ - tcp_input.o tcp_output.o tcp_subr.o tcp_timer.o \ - udp.o \ - util.o version.o \ +SLIRPOBJ := net_slirp.o tinyglib.o \ + arp_table.o bootp.o cksum.o dhcpv6.o dnssearch.o if.o \ + ip_icmp.o ip_input.o ip_output.o \ + ip6_icmp.o ip6_input.o ip6_output.o \ + mbuf.o misc.o sbuf.o slirp.o socket.o \ + tcp_input.o tcp_output.o tcp_subr.o tcp_timer.o \ + udp.o udp6.o \ + util.o version.o \ NETOBJ := network.o \ net_pcap.o \ - net_slirp.o tinyglib.o \ ${SLIRPOBJ} \ net_dp8390.o net_3c501.o \ net_3c503.o net_ne2000.o \ From 75b52274ec4c02259253dde56557ead57918369d Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 13:53:46 -0500 Subject: [PATCH 12/29] Add APM flags to 386 & later, ACPI flag to Pentium and later This isn't a perfect solution, but it'll be less false positives than elsewise. --- src/machine/machine_table.c | 412 ++++++++++++++++++------------------ 1 file changed, 206 insertions(+), 206 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index a5f51a8bf..c65884b7e 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -4312,7 +4312,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, @@ -4350,7 +4350,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, @@ -4387,7 +4387,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, @@ -4424,7 +4424,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = 0, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4462,7 +4462,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 14336, @@ -4499,7 +4499,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 14336, @@ -4536,7 +4536,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 512, .max = 8192, @@ -4573,7 +4573,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4612,7 +4612,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_MCA, - .flags = MACHINE_VIDEO, + .flags = MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4652,7 +4652,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4689,7 +4689,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4726,7 +4726,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4763,7 +4763,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_MCA, - .flags = MACHINE_VIDEO, + .flags = MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 2048, .max = 65536, @@ -4800,7 +4800,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_MCA, - .flags = MACHINE_VIDEO, + .flags = MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 2048, .max = 65536, @@ -4843,7 +4843,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -4882,7 +4882,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4920,7 +4920,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4957,7 +4957,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -4994,7 +4994,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5032,7 +5032,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5069,7 +5069,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -5109,7 +5109,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 64512, @@ -5148,7 +5148,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 2048, .max = 32768, @@ -5185,7 +5185,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 2048, .max = 32768, @@ -5226,7 +5226,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 4096, .max = 36864, @@ -5263,7 +5263,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 4096, .max = 36864, @@ -5300,7 +5300,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -5337,7 +5337,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -5374,7 +5374,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 32768, @@ -5412,7 +5412,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2, - .flags = MACHINE_IDE | MACHINE_VIDEO, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5451,7 +5451,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5491,7 +5491,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5528,7 +5528,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5565,7 +5565,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5602,7 +5602,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5639,7 +5639,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5676,7 +5676,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_VLB, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5713,7 +5713,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5750,7 +5750,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5787,7 +5787,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5826,7 +5826,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -5863,7 +5863,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -5900,7 +5900,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5938,7 +5938,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -5979,7 +5979,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6020,7 +6020,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6057,7 +6057,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6094,7 +6094,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6131,7 +6131,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6168,7 +6168,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6205,7 +6205,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_SCSI, + .flags = MACHINE_IDE_DUAL | MACHINE_SCSI | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6242,7 +6242,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 2048, .max = 131072, @@ -6280,7 +6280,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_SCSI, + .flags = MACHINE_IDE_DUAL | MACHINE_SCSI | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6317,7 +6317,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 2048, .max = 131072, @@ -6354,7 +6354,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 2048, .max = 131072, @@ -6391,7 +6391,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 261120, @@ -6428,7 +6428,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6465,7 +6465,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6502,7 +6502,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 261120, @@ -6540,7 +6540,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 261120, @@ -6578,7 +6578,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 261120, @@ -6615,7 +6615,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 65536, @@ -6652,7 +6652,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6689,7 +6689,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 262144, @@ -6727,7 +6727,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6764,7 +6764,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6801,7 +6801,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 262144, @@ -6838,7 +6838,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6875,7 +6875,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCIV, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 1024, .max = 131072, @@ -6916,7 +6916,7 @@ const machine_t machines[] = { .max_multi = 1.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 8192, .max = 131072, @@ -6954,7 +6954,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 32768, .max = 163840, @@ -6992,7 +6992,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 32768, .max = 163840, @@ -7030,7 +7030,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 32768, .max = 98304, @@ -7068,7 +7068,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 32768, .max = 131072, @@ -7112,7 +7112,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7149,7 +7149,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 196608, @@ -7186,7 +7186,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7223,7 +7223,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7262,7 +7262,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7299,7 +7299,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7336,7 +7336,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7373,7 +7373,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7410,7 +7410,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 139264, @@ -7451,7 +7451,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 65536, @@ -7490,7 +7490,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PCIV, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7529,7 +7529,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7566,7 +7566,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7606,7 +7606,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7644,7 +7644,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 131072, @@ -7681,7 +7681,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 262144, @@ -7720,7 +7720,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7757,7 +7757,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7796,7 +7796,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7833,7 +7833,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7870,7 +7870,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7911,7 +7911,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM | MACHINE_ACPI, .ram = { .min = 2048, .max = 65536, @@ -7949,7 +7949,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PCIV, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -7988,7 +7988,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8025,7 +8025,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8062,7 +8062,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8102,7 +8102,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8139,7 +8139,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8176,7 +8176,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT, + .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8215,7 +8215,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8253,7 +8253,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8292,7 +8292,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8331,7 +8331,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8370,7 +8370,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8407,7 +8407,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8445,7 +8445,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8482,7 +8482,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8519,7 +8519,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8560,7 +8560,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 196608, @@ -8597,7 +8597,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -8634,7 +8634,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -8672,7 +8672,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -8711,7 +8711,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8750,7 +8750,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8789,7 +8789,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -8826,7 +8826,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -8866,7 +8866,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 196608, @@ -8903,7 +8903,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -8940,7 +8940,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -8979,7 +8979,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9018,7 +9018,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 196608, @@ -9058,7 +9058,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 196608, @@ -9095,7 +9095,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -9134,7 +9134,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_SCSI, + .flags = MACHINE_IDE_DUAL | MACHINE_SCSI | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9171,7 +9171,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9209,7 +9209,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9246,7 +9246,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9284,7 +9284,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9321,7 +9321,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9358,7 +9358,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9395,7 +9395,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9434,7 +9434,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9471,7 +9471,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9509,7 +9509,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9547,7 +9547,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT, + .flags = MACHINE_IDE_DUAL | MACHINE_GAMEPORT | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -9586,7 +9586,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9623,7 +9623,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9661,7 +9661,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9699,7 +9699,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9736,7 +9736,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9773,7 +9773,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9810,7 +9810,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -9850,7 +9850,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -9890,7 +9890,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -9929,7 +9929,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 393216, @@ -9966,7 +9966,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, @@ -10005,7 +10005,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10042,7 +10042,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10082,7 +10082,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10120,7 +10120,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10157,7 +10157,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10194,7 +10194,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10234,7 +10234,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10272,7 +10272,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10310,7 +10310,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_A97, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10348,7 +10348,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10388,7 +10388,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10427,7 +10427,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10464,7 +10464,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10502,7 +10502,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10538,7 +10538,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10577,7 +10577,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 131072, @@ -10616,7 +10616,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10653,7 +10653,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10692,7 +10692,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10732,7 +10732,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 1024, .max = 1572864, @@ -10771,7 +10771,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10809,7 +10809,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -10849,7 +10849,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10887,7 +10887,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -10927,7 +10927,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -10967,7 +10967,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11005,7 +11005,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11043,7 +11043,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11081,7 +11081,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11119,7 +11119,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11157,7 +11157,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11195,7 +11195,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11233,7 +11233,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11273,7 +11273,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_AV, + .flags = MACHINE_IDE_DUAL | MACHINE_AV | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11311,7 +11311,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_AV, + .flags = MACHINE_IDE_DUAL | MACHINE_AV | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11351,7 +11351,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11391,7 +11391,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11429,7 +11429,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1572864, @@ -11467,7 +11467,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 2097152, @@ -11505,7 +11505,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 3145728, @@ -11546,7 +11546,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_NOISA, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 2097152, @@ -11587,7 +11587,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11626,7 +11626,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11667,7 +11667,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 2097152, @@ -11705,7 +11705,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 2097152, @@ -11746,7 +11746,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED, }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11786,7 +11786,7 @@ const machine_t machines[] = { .max_multi = 8.0 /* limits assumed */ }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11824,7 +11824,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11862,7 +11862,7 @@ const machine_t machines[] = { .max_multi = 8.0 /* limits assumed */ }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -11902,7 +11902,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 524288, @@ -11942,7 +11942,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, @@ -11982,7 +11982,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 786432, @@ -12020,7 +12020,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1572864, @@ -12058,7 +12058,7 @@ const machine_t machines[] = { .max_multi = MACHINE_MULTIPLIER_FIXED }, .bus_flags = MACHINE_PS2_A97, - .flags = MACHINE_IDE_DUAL | MACHINE_AG, + .flags = MACHINE_IDE_DUAL | MACHINE_AG | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 3145728, @@ -12096,7 +12096,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_NOI97, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND, + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 16384, .max = 4194304, @@ -12136,7 +12136,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 1048576, From cd2abb2454e407c98dd9d5783ee9250393d6a717 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 14:16:58 -0500 Subject: [PATCH 13/29] Ability to build with CLANG and Regular builds --- .github/workflows/c-cpp.yml | 19 +++++++++++++++++++ .github/workflows/cmake.yml | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 5b2573dde..e91259189 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -28,6 +28,9 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# debug: n +# dev: n - name: Debug debug: y dev: n @@ -44,14 +47,28 @@ jobs: new: y slug: -NDR environment: +# - msystem: MSYS +# clang: n +# x64: y - msystem: MINGW32 prefix: mingw-w64-i686 + clang: n x64: n - msystem: MINGW64 prefix: mingw-w64-x86_64 + clang: n x64: y +# - msystem: CLANG32 +# prefix: mingw-w64-clang-i686 +# clang: y +# x64: n +# - msystem: CLANG64 +# prefix: mingw-w64-clang-x86_64 +# clang: y +# x64: y - msystem: UCRT64 prefix: mingw-w64-ucrt-x86_64 + clang: n x64: y steps: @@ -65,6 +82,7 @@ jobs: make pacboy: >- gcc:p + clang:p pkg-config:p freetype:p SDL2:p @@ -80,6 +98,7 @@ jobs: DEV_BUILD=${{ matrix.build.dev }} DEBUG=${{ matrix.build.debug }} NEW_DYNAREC=${{ matrix.dynarec.new }} + CLANG=${{ matrix.environment.clang }} X64=${{ matrix.environment.x64 }} working-directory: ./src - uses: actions/upload-artifact@v3 diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 4596b51b8..be42cbae6 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -37,6 +37,8 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# preset: regular - name: Debug preset: debug slug: -Debug @@ -62,12 +64,20 @@ jobs: qt5-base:p qt5-tools:p environment: +# - msystem: MSYS +# toolchain: ./cmake/flags-gcc-x86_64.cmake - msystem: MINGW32 prefix: mingw-w64-i686 toolchain: ./cmake/flags-gcc-i686.cmake - msystem: MINGW64 prefix: mingw-w64-x86_64 toolchain: ./cmake/flags-gcc-x86_64.cmake +# - msystem: CLANG32 +# prefix: mingw-w64-clang-i686 +# toolchain: ./cmake/llvm-win32-i686.cmake +# - msystem: CLANG64 +# prefix: mingw-w64-clang-x86_64 +# toolchain: ./cmake/llvm-win32-x86_64.cmake - msystem: UCRT64 prefix: mingw-w64-ucrt-x86_64 toolchain: ./cmake/flags-gcc-x86_64.cmake @@ -122,6 +132,8 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# preset: regular - name: Debug preset: debug slug: -Debug @@ -219,6 +231,8 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# preset: regular - name: Debug preset: debug slug: -Debug @@ -280,6 +294,8 @@ jobs: fail-fast: true matrix: build: +# - name: Regular +# preset: regular - name: Debug preset: debug slug: -Debug From b18ed9e20e0568451f516ff546fdc0dd280fb6cd Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 13 Jan 2023 01:21:53 -0500 Subject: [PATCH 14/29] Make CMakePresets.json better --- CMakePresets.json | 48 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 2cb84ee6f..d2980ed87 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -1,36 +1,52 @@ { - "version": 3, + "version": 2, "cmakeMinimumRequired": { "major": 3, - "minor": 21 + "minor": 20 }, "configurePresets": [ + { + "name": "base", + "binaryDir": "${sourceDir}/build/${presetName}", + "cacheVariables": { + "CMAKE_INSTALL_PREFIX": "${sourceDir}/build/artifacts", + "CMAKE_EXPORT_COMPILE_COMMANDS": true, + "DEV_BRANCH": "OFF", + "NEW_DYNAREC": "OFF", + "QT": "ON" + }, + "generator": "Ninja", + "hidden": true + }, { "name": "regular", "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release", - "DEV_BRANCH": "OFF", - "NEW_DYNAREC": "OFF" + "CMAKE_BUILD_TYPE": "Release" }, - "generator": "Ninja" + "inherits": "base" }, { "name": "optimized", "cacheVariables": { - "CMAKE_BUILD_TYPE": "Optimized", - "DEV_BRANCH": "OFF", - "NEW_DYNAREC": "OFF" + "CMAKE_BUILD_TYPE": "Optimized" }, - "generator": "Ninja" + "inherits": "base" }, { "name": "debug", "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "DEV_BRANCH": "OFF", + "CMAKE_BUILD_TYPE": "Debug" + }, + "inherits": "base" + }, + { + "name": "development", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "DEV_BRANCH": "ON", "NEW_DYNAREC": "OFF" }, - "generator": "Ninja" + "inherits": "base" }, { "name": "experimental", @@ -39,7 +55,9 @@ "DEV_BRANCH": "ON", "NEW_DYNAREC": "ON" }, - "generator": "Ninja" + "inherits": "base" } - ] + ], + "buildPresets": [], + "testPresets": [] } From 0e53a29e3d733414a0effd37b6e96736661818b1 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 6 Feb 2023 14:28:59 -0500 Subject: [PATCH 15/29] Fix build when ENABLE_CDROM_LOG is set --- src/cdrom/cdrom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 062e3bf72..31c5d2165 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -802,7 +802,7 @@ cdrom_get_current_subchannel_sony(cdrom_t *dev, uint8_t *b, int msf) dev->ops->get_subchannel(dev, dev->seek_pos, &subc); - cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, ret = %02x, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, ret, dev->seek_pos, dev->cd_end); + cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i, seek pos = %08x, cd_end = %08x.\n", dev->id, subc.abs_m, subc.abs_s, subc.abs_f, dev->seek_pos, dev->cd_end); b[pos++] = subc.attr; b[pos++] = subc.track; From 8910c10d94e8bb0e52d82f1316f96bf88f71fa0b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 6 Feb 2023 19:37:51 -0300 Subject: [PATCH 16/29] Jenkins: Don't create AppImage workaround symlink if it already exists (also: introducing new Windows node) --- .ci/build.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 63a957477..85420a3c6 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -1175,8 +1175,11 @@ EOF do for loader_copy in "$loader" "/lib/$(basename "$loader")" do - mkdir -p "/runtime/compat$(dirname "$loader_copy")" - ln -s "$loader" "/runtime/compat$loader_copy" + if [ ! -e "/runtime/compat$loader_copy" ] + then + mkdir -p "/runtime/compat$(dirname "$loader_copy")" + ln -s "$loader" "/runtime/compat$loader_copy" + fi echo " - /runtime/compat$loader_copy" >> AppImageBuilder-generated.yml done done From 64ad9e5fbaea9b218c5c165397673dee18614a3c Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 06:48:06 -0500 Subject: [PATCH 17/29] Some escaped standardization in machine table --- src/machine/machine_table.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c65884b7e..587e854c9 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -8016,7 +8016,7 @@ const machine_t machines[] = { .pad2 = 0, .cpu = { .package = CPU_PKG_SOCKET5_7, - CPU_BLOCK(CPU_PENTIUMMMX), + .block = CPU_BLOCK(CPU_PENTIUMMMX), .min_bus = 50000000, .max_bus = 66666667, .min_voltage = 3520, @@ -9763,14 +9763,14 @@ const machine_t machines[] = { .pad1 = MACHINE_AVAILABLE, .pad2 = 0, .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 55000000, - .max_bus = 75000000, - .min_voltage = 2800, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 5.5 + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 55000000, + .max_bus = 75000000, + .min_voltage = 2800, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI, .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, From 22c0fd29a360f8dde4180e744038e5989e2e29d2 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 7 Feb 2023 13:12:34 -0300 Subject: [PATCH 18/29] Jenkins: Overhaul MSYS2 package handling to remove the version pinning hack --- .ci/build.sh | 108 +++++++------------------------------- .ci/dependencies_msys.txt | 36 +++++-------- 2 files changed, 30 insertions(+), 114 deletions(-) diff --git a/.ci/build.sh b/.ci/build.sh index 85420a3c6..56199d3e6 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -26,7 +26,6 @@ # - Packaging the Ghostscript DLL requires 32-bit and/or 64-bit Ghostscript on Program Files # - Packaging the FluidSynth DLL requires it to be at /home/86Box/dll32/libfluidsynth.dll # and/or /home/86Box/dll64/libfluidsynth64.dll (for 32-bit and 64-bit builds respectively) -# - Packaging the Discord DLL requires wget (MSYS should come with it) # - For Linux builds: # - Only Debian and derivatives are supported # - dpkg and apt-get are called through sudo to manage dependencies; make sure those @@ -284,7 +283,7 @@ then then # Update keyring as well, since the package signing keys sometimes change. echo [-] Updating package databases and keyring - yes | pacman -Sy --needed msys2-keyring + pacman -Sy --needed --noconfirm msys2-keyring # Save build tag to skip pacman sync/keyring later. save_buildtag pacmansync @@ -292,100 +291,29 @@ then echo [-] Not updating package databases and keyring again fi - # Query installed packages. - pacman -Qe > "$cache_dir/pacman.txt" - - # Download the specified versions of architecture-specific dependencies. - echo -n [-] Downloading dependencies: - pkg_dir="/var/cache/pacman/pkg" - repo_base="https://repo.msys2.org/mingw/$(echo $MSYSTEM | tr '[:upper:]' '[:lower:]')" - cat .ci/dependencies_msys.txt | tr -d '\r' > "$cache_dir/deps.txt" - pkgs="" - while IFS=" " read pkg version - do - prefixed_pkg="$MINGW_PACKAGE_PREFIX-$pkg" - installed_version=$(grep -E "^$prefixed_pkg " "$cache_dir/pacman.txt" | cut -d " " -f 2) - if [ "$installed_version" != "$version" ] # installed_version will be empty if not installed - then - echo -n " [$pkg" - - # Download package if not already present in the local cache. - pkg_tar="$prefixed_pkg-$version-any.pkg.tar" - if [ -s "$pkg_dir/$pkg_tar.xz" ] - then - pkg_fn="$pkg_tar.xz" - pkg_dest="$pkg_dir/$pkg_fn" - else - pkg_fn="$pkg_tar.zst" - pkg_dest="$pkg_dir/$pkg_fn" - if [ ! -s "$pkg_dest" ] - then - if ! wget -qO "$pkg_dest" "$repo_base/$pkg_fn" - then - rm -f "$pkg_dest" - pkg_fn="$pkg_tar.xz" - pkg_dest="$pkg_dir/$pkg_fn" - wget -qO "$pkg_dest" "$repo_base/$pkg_fn" || rm -f "$pkg_dest" - fi - if [ -s "$pkg_dest" ] - then - wget -qO "$pkg_dest.sig" "$repo_base/$pkg_fn.sig" || rm -f "$pkg_dest.sig" - [ ! -s "$pkg_dest.sig" ] && rm -f "$pkg_dest.sig" - fi - fi - fi - - # Check if the cached package is valid. - if [ -s "$pkg_dest" ] - then - # Add cached zst package. - pkgs="$pkgs $pkg_fn" - else - # Not valid, remove if it exists. - rm -f "$pkg_dest" "$pkg_dest.sig" - echo -n " FAIL" - fi - echo -n "]" - fi - done < "$cache_dir/deps.txt" - [ -z "$pkgs" ] && echo -n ' none required' - echo - - # Install the downloaded architecture-specific dependencies. - echo [-] Installing dependencies through pacman - if [ -n "$pkgs" ] - then - pushd "$pkg_dir" - yes | pacman -U --needed $pkgs - if [ $? -ne 0 ] - then - # Install packages individually if installing them all together failed. - for pkg in $pkgs - do - yes | pacman -U --needed "$pkg" - done - fi - popd - - # Query installed packages again. - pacman -Qe > "$cache_dir/pacman.txt" - fi - - # Install the latest versions for any missing packages (if the specified version couldn't be installed). + # Establish general dependencies. pkgs="git" - while IFS=" " read pkg version + + # Gather installed architecture-specific packages for updating. + # This prevents outdated shared libraries, unmet dependencies + # and potentially other issues caused by the fact pacman doesn't + # update a package's dependencies unless explicitly told to. + pkgs="$pkgs $(pacman -Quq | grep -E "^$MINGW_PACKAGE_PREFIX-")" + + # Establish architecture-specific dependencies. + while read pkg rest do - prefixed_pkg="$MINGW_PACKAGE_PREFIX-$pkg" - grep -qE "^$prefixed_pkg " "$cache_dir/pacman.txt" || pkgs="$pkgs $prefixed_pkg" - done < "$cache_dir/deps.txt" - rm -f "$cache_dir/pacman.txt" "$cache_dir/deps.txt" - yes | pacman -S --needed $pkgs - if [ $? -ne 0 ] + pkgs="$pkgs $MINGW_PACKAGE_PREFIX-$(echo "$pkg" | tr -d '\r')" # CR removal required + done < .ci/dependencies_msys.txt + + # Install or update dependencies. + echo [-] Installing dependencies through pacman + if ! pacman -S --needed --noconfirm $pkgs then # Install packages individually if installing them all together failed. for pkg in $pkgs do - yes | pacman -S --needed "$pkg" + pacman -S --needed --noconfirm "$pkg" done fi diff --git a/.ci/dependencies_msys.txt b/.ci/dependencies_msys.txt index 35e3506fd..df4932352 100644 --- a/.ci/dependencies_msys.txt +++ b/.ci/dependencies_msys.txt @@ -1,24 +1,12 @@ -zlib 1.2.11-9 -binutils 2.37-4 -headers-git 9.0.0.6357.eac8c38c1-1 -crt-git 9.0.0.6357.eac8c38c1-2 -libwinpthread-git 9.0.0.6357.eac8c38c1-1 -winpthreads-git 9.0.0.6357.eac8c38c1-1 -winstorecompat-git 9.0.0.6357.eac8c38c1-1 -gcc-libs 11.2.0-4 -gcc-ada 11.2.0-4 -gcc-fortran 11.2.0-4 -gcc-libgfortran 11.2.0-4 -gcc-objc 11.2.0-4 -gcc 11.2.0-4 -libgccjit 11.2.0-4 -tools-git 9.0.0.6357.eac8c38c1-1 -ninja 1.10.2-3 -pkgconf 1.8.0-2 -openal 1.21.1-3 -libpng 1.6.37-6 -freetype 2.11.1-1 -SDL2 2.0.18-2 -rtmidi 4.0.0-1 -cmake 3.22.1-1 -qt5-static 5.15.2-4 +ninja +cmake +gcc +pkgconf +openal +freetype +SDL2 +zlib +libpng +rtmidi +qt5-static +qt5-translations From 9ceec90d7926c8e5471c2db99b30c644673618b1 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 7 Feb 2023 21:17:14 +0100 Subject: [PATCH 19/29] Added more ATAPI CD-ROM types (including the NEC CDR-273 4.20 drive used to be there at some point) and removed some non-working types. --- src/include/86box/cdrom.h | 67 +++++++++++++++++++++------------------ src/scsi/scsi_cdrom.c | 19 +++++++++-- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 28e9cf14b..d2f032280 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -60,7 +60,7 @@ enum { CDROM_BUS_USB }; -#define KNOWN_CDROM_DRIVE_TYPES 30 +#define KNOWN_CDROM_DRIVE_TYPES 35 #define BUS_TYPE_ALL 0 #define BUS_TYPE_IDE 1 #define BUS_TYPE_SCSI 2 @@ -75,36 +75,41 @@ static const struct const int bus_type; } cdrom_drive_types[] = { - { "86BOX", "CD-ROM", "1.00", "(ATAPI/SCSI) 86BOX CD-ROM 1.00", "86BOX_CD-ROM_1.00", BUS_TYPE_ALL}, - { "AZT", "CDA46802I", "1.15", "(ATAPI) AZT CDA46802I 1.15", "AZT_CDA46802I_1.15", BUS_TYPE_IDE}, - { "BTC", "CD-ROM BCD36XH", "U1.0", "(ATAPI) BTC CD-ROM BCD36XH U1.0", "BTC_CD-ROM_BCD36XH_U1.0", BUS_TYPE_IDE}, - { "GOLDSTAR", "CRD-8160B", "3.14", "(ATAPI) GOLDSTAR CRD-8160B 3.14", "GOLDSTAR_CRD-8160B_3.14", BUS_TYPE_IDE}, - { "HITACHI", "CDR-8130", "0020", "(ATAPI) HITACHI CDR-8130 0020", "HITACHI_CDR-8130_0020", BUS_TYPE_IDE}, - { "KENWOOD", "CD-ROM UCR-421", "208E", "(ATAPI) KENWOOD CD-ROM UCR-421 208E", "KENWOOD_CD-ROM_UCR-421_208E", BUS_TYPE_IDE}, - { "MATSHITA", "CD-ROM CR-587", "7S13", "(ATAPI) MATSHITA CD-ROM CR-587 7S13", "MATSHITA_CD-ROM_CR-587_7S13", BUS_TYPE_IDE}, - { "MATSHITA", "CD-ROM CR-588", "LS15", "(ATAPI) MATSHITA CD-ROM CR-588 LS15", "MATSHITA_CD-ROM_CR-588_LS15", BUS_TYPE_IDE}, - { "MITSUMI", "CRMC-FX4820T", "D02A", "(ATAPI) MITSUMI CRMC-FX4820T D02A", "MITSUMI_CRMC-FX4820T_D02A", BUS_TYPE_IDE}, - { "NEC", "CD-ROM DRIVE:260", "1.00", "(ATAPI) NEC CD-ROM DRIVE:260 1.00", "NEC_CD-ROM_DRIVE260_1.00", BUS_TYPE_IDE}, - { "NEC", "CD-ROM DRIVE:260", "1.01", "(ATAPI) NEC CD-ROM DRIVE:260 1.01", "NEC_CD-ROM_DRIVE260_1.01", BUS_TYPE_IDE}, - { "NEC", "CDR-1300A", "1.05", "(ATAPI) NEC CDR-1300A 1.05", "NEC_CDR-1300A_1.05", BUS_TYPE_IDE}, - { "PHILIPS", "CD-ROM PCA403CD", "U31P", "(ATAPI) PHILIPS CD-ROM PCA403CD U31P", "PHILIPS_CD-ROM_PCA403CD_U31P", BUS_TYPE_IDE}, - { "SONY", "CD-ROM CDU76", "1.0i", "(ATAPI) SONY CD-ROM CDU76 1.0i", "SONY_CD-ROM_CDU76_1.0i", BUS_TYPE_IDE}, - { "SONY", "CD-ROM CDU311", "3.0h", "(ATAPI) SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE}, - { "TOSHIBA", "CD-ROM XM-5702B", "TA70", "(ATAPI) TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE}, - { "CHINON", "CD-ROM CDS-431", "H42 ", "(SCSI) CHINON CD-ROM CDS-431 H42", "CHINON_CD-ROM_CDS-431_H42", BUS_TYPE_SCSI}, - { "DEC", "RRD45 (C) DEC", "0436", "(SCSI) DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI}, - { "MATSHITA", "CD-ROM CR-501", "1.0b", "(SCSI) MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI}, - { "NEC", "CD-ROM DRIVE:74", "1.00", "(SCSI) NEC CD-ROM DRIVE:74 1.00", "NEC_CD-ROM_DRIVE74_1.00", BUS_TYPE_SCSI}, - { "NEC", "CD-ROM DRIVE:464", "1.05", "(SCSI) NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI}, - { "SONY", "CD-ROM CDU-541", "1.0i", "(SCSI) SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI}, - { "SONY", "CD-ROM CDU-76S", "1.00", "(SCSI) SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI}, - { "PHILIPS", "CDD2600", "1.07", "(SCSI) PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI}, - { "PIONEER", "CD-ROM DRM-604X", "2403", "(SCSI) PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI}, - { "PLEXTOR", "CD-ROM PX-32TS", "1.03", "(SCSI) PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI}, - { "TEAC", "CD-R55S", "1.0R", "(SCSI) TEAC CD-R55S 1.0R", "TEAC_CD-R55S_1.0R", BUS_TYPE_SCSI}, - { "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "(SCSI) TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI}, - { "TOSHIBA", "CD-ROM XM-3301TA", "0272", "(SCSI) TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI}, - { "TOSHIBA", "CD-ROM XM-5701TA", "3136", "(SCSI) TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI}, + { "86BOX", "CD-ROM", "1.00", "(ATAPI/SCSI) 86BOX CD-ROM 1.00", "86BOX_CD-ROM_1.00", BUS_TYPE_ALL}, /*1*/ + { "AZT", "CDA46802I", "1.15", "(ATAPI) AZT CDA46802I 1.15", "AZT_CDA46802I_1.15", BUS_TYPE_IDE}, /*2*/ + { "BTC", "CD-ROM BCD36XH", "U1.0", "(ATAPI) BTC CD-ROM BCD36XH U1.0", "BTC_CD-ROM_BCD36XH_U1.0", BUS_TYPE_IDE}, /*3*/ + { "GOLDSTAR", "CRD-8160B", "3.14", "(ATAPI) GOLDSTAR CRD-8160B 3.14", "GOLDSTAR_CRD-8160B_3.14", BUS_TYPE_IDE}, /*4*/ + { "HITACHI", "CDR-8130", "0020", "(ATAPI) HITACHI CDR-8130 0020", "HITACHI_CDR-8130_0020", BUS_TYPE_IDE}, /*5*/ + { "KENWOOD", "CD-ROM UCR-421", "208E", "(ATAPI) KENWOOD CD-ROM UCR-421 208E", "KENWOOD_CD-ROM_UCR-421_208E", BUS_TYPE_IDE}, /*6*/ + { "MATSHITA", "CD-ROM CR-587", "7S13", "(ATAPI) MATSHITA CD-ROM CR-587 7S13", "MATSHITA_CD-ROM_CR-587_7S13", BUS_TYPE_IDE}, /*7*/ + { "MATSHITA", "CD-ROM CR-588", "LS15", "(ATAPI) MATSHITA CD-ROM CR-588 LS15", "MATSHITA_CD-ROM_CR-588_LS15", BUS_TYPE_IDE}, /*8*/ + { "MATSHITA", "CR-571", "1.0e", "(ATAPI) MATSHITA CR-571 1.0e", "MATSHITA_CR-571_1.0e", BUS_TYPE_IDE}, /*9*/ + { "MATSHITA", "CR-572", "1.0j", "(ATAPI) MATSHITA CR-572 1.0j", "MATSHITA_CR-572_1.0j", BUS_TYPE_IDE}, /*10*/ + { "MITSUMI", "CRMC-FX4820T", "D02A", "(ATAPI) MITSUMI CRMC-FX4820T D02A", "MITSUMI_CRMC-FX4820T_D02A", BUS_TYPE_IDE}, /*11*/ + { "NEC", "CD-ROM DRIVE:260", "1.00", "(ATAPI) NEC CD-ROM DRIVE:260 1.00", "NEC_CD-ROM_DRIVE260_1.00", BUS_TYPE_IDE}, /*12*/ + { "NEC", "CD-ROM DRIVE:260", "1.01", "(ATAPI) NEC CD-ROM DRIVE:260 1.01", "NEC_CD-ROM_DRIVE260_1.01", BUS_TYPE_IDE}, /*13*/ + { "NEC", "CD-ROM DRIVE:273", "4.20", "(ATAPI) NEC CD-ROM DRIVE:273 4.20", "NEC_CD-ROM_DRIVE273_4.20", BUS_TYPE_IDE}, /*14*/ + { "NEC", "CD-ROM DRIVE:280", "1.05", "(ATAPI) NEC CD-ROM DRIVE:280 1.05", "NEC_CD-ROM_DRIVE280_1.05", BUS_TYPE_IDE}, /*15*/ + { "NEC", "CD-ROM DRIVE:280", "3.08", "(ATAPI) NEC CD-ROM DRIVE:280 3.08", "NEC_CD-ROM_DRIVE280_3.08", BUS_TYPE_IDE}, /*16*/ + { "PHILIPS", "CD-ROM PCA403CD", "U31P", "(ATAPI) PHILIPS CD-ROM PCA403CD U31P", "PHILIPS_CD-ROM_PCA403CD_U31P", BUS_TYPE_IDE}, /*17*/ + { "SONY", "CD-ROM CDU76", "1.0i", "(ATAPI) SONY CD-ROM CDU76 1.0i", "SONY_CD-ROM_CDU76_1.0i", BUS_TYPE_IDE}, /*18*/ + { "SONY", "CD-ROM CDU311", "3.0h", "(ATAPI) SONY CD-ROM CDU311 3.0h", "SONY_CD-ROM_CDU311_3.0h", BUS_TYPE_IDE}, /*19*/ + { "TOSHIBA", "CD-ROM XM-5302TA", "0305", "(ATAPI) TOSHIBA CD-ROM XM-5302TA 0305", "TOSHIBA_CD-ROM_XM-5302TA_0305", BUS_TYPE_IDE}, /*20*/ + { "TOSHIBA", "CD-ROM XM-5702B", "TA70", "(ATAPI) TOSHIBA CD-ROM XM-5702B TA70", "TOSHIBA_CD-ROM_XM-5702B_TA70", BUS_TYPE_IDE}, /*21*/ + { "CHINON", "CD-ROM CDS-431", "H42 ", "(SCSI) CHINON CD-ROM CDS-431 H42", "CHINON_CD-ROM_CDS-431_H42", BUS_TYPE_SCSI}, /*22*/ + { "DEC", "RRD45 (C) DEC", "0436", "(SCSI) DEC RRD45 0436", "DEC_RRD45_0436", BUS_TYPE_SCSI}, /*23*/ + { "MATSHITA", "CD-ROM CR-501", "1.0b", "(SCSI) MATSHITA CD-ROM CR-501 1.0b", "MATSHITA_CD-ROM_CR-501_1.0b", BUS_TYPE_SCSI}, /*24*/ + { "NEC", "CD-ROM DRIVE:74", "1.00", "(SCSI) NEC CD-ROM DRIVE:74 1.00", "NEC_CD-ROM_DRIVE74_1.00", BUS_TYPE_SCSI}, /*25*/ + { "NEC", "CD-ROM DRIVE:464", "1.05", "(SCSI) NEC CD-ROM DRIVE:464 1.05", "NEC_CD-ROM_DRIVE464_1.05", BUS_TYPE_SCSI}, /*26*/ + { "SONY", "CD-ROM CDU-541", "1.0i", "(SCSI) SONY CD-ROM CDU-541 1.0i", "SONY_CD-ROM_CDU-541_1.0i", BUS_TYPE_SCSI}, /*27*/ + { "SONY", "CD-ROM CDU-76S", "1.00", "(SCSI) SONY CD-ROM CDU-76S 1.00", "SONY_CD-ROM_CDU-76S_1.00", BUS_TYPE_SCSI}, /*28*/ + { "PHILIPS", "CDD2600", "1.07", "(SCSI) PHILIPS CDD2600 1.07", "PHILIPS_CDD2600_1.07", BUS_TYPE_SCSI}, /*29*/ + { "PIONEER", "CD-ROM DRM-604X", "2403", "(SCSI) PIONEER CD-ROM DRM-604X 2403", "PIONEER_CD-ROM_DRM-604X_2403", BUS_TYPE_SCSI}, /*30*/ + { "PLEXTOR", "CD-ROM PX-32TS", "1.03", "(SCSI) PLEXTOR CD-ROM PX-32TS 1.03", "PLEXTOR_CD-ROM_PX-32TS_1.03", BUS_TYPE_SCSI}, /*31*/ + { "TEAC", "CD-R55S", "1.0R", "(SCSI) TEAC CD-R55S 1.0R", "TEAC_CD-R55S_1.0R", BUS_TYPE_SCSI}, /*32*/ + { "TOSHIBA", "CD-ROM DRIVE:XM", "3433", "(SCSI) TOSHIBA CD-ROM DRIVE:XM 3433", "TOSHIBA_CD-ROM_DRIVEXM_3433", BUS_TYPE_SCSI}, /*33*/ + { "TOSHIBA", "CD-ROM XM-3301TA", "0272", "(SCSI) TOSHIBA CD-ROM XM-3301TA 0272", "TOSHIBA_CD-ROM_XM-3301TA_0272", BUS_TYPE_SCSI}, /*34*/ + { "TOSHIBA", "CD-ROM XM-5701TA", "3136", "(SCSI) TOSHIBA CD-ROM XM-5701TA 3136", "TOSHIBA_CD-ROM_XM-5701TA_3136", BUS_TYPE_SCSI}, /*35*/ { "", "", "", "", "", -1}, }; diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 38693f590..25939f06e 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -3519,15 +3519,30 @@ scsi_cdrom_identify(ide_t *ide, int ide_has_dma) } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU311_3.0h"))) { ide_padstr((char *) (ide->buffer + 23), "3.0h ", 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), "SONY CD-ROM CDU311 ", 40); /* Model */ - } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CDR-1300A_1.05"))) { + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE280_1.05"))) { ide_padstr((char *) (ide->buffer + 23), "1.05 ", 8); /* Firmware */ - ide_padstr((char *) (ide->buffer + 27), "NEC CDR-1300A ", 40); /* Model */ + ide_padstr((char *) (ide->buffer + 27), "NEC CD-ROM DRIVE:280 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE280_3.08"))) { + ide_padstr((char *) (ide->buffer + 23), "3.08 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "NEC CD-ROM DRIVE:280 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE273_4.20"))) { + ide_padstr((char *) (ide->buffer + 23), "4.20 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "NEC CD-ROM DRIVE:273 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5302TA_0305"))) { + ide_padstr((char *) (ide->buffer + 23), "0305 ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "TOSHIBA CD-ROM XM-5302TA ", 40); /* Model */ } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5702B_TA70"))) { ide_padstr((char *) (ide->buffer + 23), "TA70 ", 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), "TOSHIBA CD-ROM XM-5702B ", 40); /* Model */ } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "GOLDSTAR_CRD-8160B_3.14"))) { ide_padstr((char *) (ide->buffer + 23), "3.14 ", 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), "GOLDSTAR CRD-8160B ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CR-571_1.0e"))) { + ide_padstr((char *) (ide->buffer + 23), "1.0e ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "MATSHITA CR-571 ", 40); /* Model */ + } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CR-572_1.0j"))) { + ide_padstr((char *) (ide->buffer + 23), "1.0j ", 8); /* Firmware */ + ide_padstr((char *) (ide->buffer + 27), "MATSHITA CR-572 ", 40); /* Model */ } else if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "MATSHITA_CD-ROM_CR-587_7S13"))) { ide_padstr((char *) (ide->buffer + 23), "7S13 ", 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 27), "MATSHITA CD-ROM CR-587 ", 40); /* Model */ From fea5ac681b99705754e293e10a3c21cb5da3fdb2 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 18:06:50 -0500 Subject: [PATCH 20/29] Handful of function renames --- src/device.c | 4 ++-- src/include/86box/machine.h | 8 ++++---- src/machine/machine.c | 2 +- src/machine/machine_table.c | 8 ++++---- src/qt/qt_settingsmachine.cpp | 4 ++-- src/win/win_settings.c | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/device.c b/src/device.c index 81e19e2dc..12d06580a 100644 --- a/src/device.c +++ b/src/device.c @@ -748,7 +748,7 @@ device_is_valid(const device_t *device, int m) int machine_get_config_int(char *s) { - const device_t *d = machine_getdevice(machine); + const device_t *d = machine_get_device(machine); const device_config_t *c; if (d == NULL) @@ -768,7 +768,7 @@ machine_get_config_int(char *s) char * machine_get_config_string(char *s) { - const device_t *d = machine_getdevice(machine); + const device_t *d = machine_get_device(machine); const device_config_t *c; if (d == NULL) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index a6571a1fd..a2417a1bc 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -324,10 +324,10 @@ extern char *machine_get_internal_name(void); extern int machine_get_machine_from_internal_name(char *s); extern void machine_init(void); #ifdef EMU_DEVICE_H -extern const device_t *machine_getdevice(int m); -extern const device_t *machine_getviddevice(int m); -extern const device_t *machine_getsnddevice(int m); -extern const device_t *machine_getnetdevice(int m); +extern const device_t *machine_get_device(int m); +extern const device_t *machine_get_vid_device(int m); +extern const device_t *machine_get_snd_device(int m); +extern const device_t *machine_get_net_device(int m); #endif extern char *machine_get_internal_name_ex(int m); extern int machine_get_nvrmask(int m); diff --git a/src/machine/machine.c b/src/machine/machine.c index 7a69f4879..893700c7e 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -138,7 +138,7 @@ int machine_available(int m) { int ret; - device_t *d = (device_t *) machine_getdevice(m); + device_t *d = (device_t *) machine_get_device(m); bios_only = 1; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 587e854c9..c489889a3 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -12245,7 +12245,7 @@ machine_getname_ex(int m) } const device_t * -machine_getdevice(int m) +machine_get_device(int m) { if (machines[m].device) return (machines[m].device); @@ -12254,7 +12254,7 @@ machine_getdevice(int m) } const device_t * -machine_getviddevice(int m) +machine_get_vid_device(int m) { if (machines[m].vid_device) return (machines[m].vid_device); @@ -12263,7 +12263,7 @@ machine_getviddevice(int m) } const device_t * -machine_getsnddevice(int m) +machine_get_snd_device(int m) { if (machines[m].snd_device) return (machines[m].snd_device); @@ -12272,7 +12272,7 @@ machine_getsnddevice(int m) } const device_t * -machine_getnetdevice(int m) +machine_get_net_device(int m) { if (machines[m].net_device) return (machines[m].net_device); diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index b88397e30..e08b07997 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -169,7 +169,7 @@ SettingsMachine::on_comboBoxMachine_currentIndexChanged(int index) } int machineId = ui->comboBoxMachine->currentData().toInt(); - const auto *device = machine_getdevice(machineId); + const auto *device = machine_get_device(machineId); ui->pushButtonConfigure->setEnabled((device != nullptr) && (device->config != nullptr)); auto *modelCpu = ui->comboBoxCPU->model(); @@ -304,6 +304,6 @@ SettingsMachine::on_pushButtonConfigure_clicked() { // deviceconfig_inst_open int machineId = ui->comboBoxMachine->currentData().toInt(); - const auto *device = machine_getdevice(machineId); + const auto *device = machine_get_device(machineId); DeviceConfig::ConfigureDevice(device, 0, qobject_cast(Settings::settings)); } diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 37a8aafb0..07822f28b 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -755,7 +755,7 @@ win_settings_machine_recalc_machine(HWND hdlg) lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR)); - d = (device_t *) machine_getdevice(temp_machine); + d = (device_t *) machine_get_device(temp_machine); settings_enable_window(hdlg, IDC_CONFIGURE_MACHINE, d && d->config); settings_reset_content(hdlg, IDC_COMBO_CPU_TYPE); @@ -987,7 +987,7 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_CONFIGURE_MACHINE: temp_machine = listtomachine[settings_get_cur_sel(hdlg, IDC_COMBO_MACHINE)]; - temp_deviceconfig |= deviceconfig_open(hdlg, (void *) machine_getdevice(temp_machine)); + temp_deviceconfig |= deviceconfig_open(hdlg, (void *) machine_get_device(temp_machine)); break; } From 118ab005f0a22a106b31dd73fbc582965c7eb354 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 18:08:11 -0500 Subject: [PATCH 21/29] Switch kbc to device_t kbd_device --- src/include/86box/keyboard.h | 2 - src/include/86box/machine.h | 7 +- src/machine/machine_table.c | 662 ++++++++++++++++++----------------- 3 files changed, 342 insertions(+), 329 deletions(-) diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index db18ac789..1f7d8860c 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -39,8 +39,6 @@ typedef struct { #define RSHIFT_OFF 0x105 /* KBC #define's */ -#define KBC_UNKNOWN 0x0000 /* As yet unknown keyboard */ - /* IBM-style controllers */ #define KBC_IBM_PC_XT 0x0000 /* IBM PC/XT */ #define KBC_IBM_PCJR 0x0001 /* IBM PCjr */ diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index a2417a1bc..694552c50 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -288,7 +288,11 @@ typedef struct _machine_ { const machine_memory_t ram; int ram_granularity; int nvrmask; - uint16_t kbc; +#ifdef EMU_DEVICE_H + const device_t *kbc_device; +#else + void *kbc_device; +#endif /* EMU_DEVICE_H */ /* Bits: 7-0 Set bits are forced set on P1 (no forced set = 0x00); 15-8 Clear bits are forced clear on P1 (no foced clear = 0xff). */ @@ -324,6 +328,7 @@ extern char *machine_get_internal_name(void); extern int machine_get_machine_from_internal_name(char *s); extern void machine_init(void); #ifdef EMU_DEVICE_H +extern const device_t *machine_get_kbc_device(int m); extern const device_t *machine_get_device(int m); extern const device_t *machine_get_vid_device(int m); extern const device_t *machine_get_snd_device(int m); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c489889a3..a8f8643c0 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -230,7 +230,7 @@ const machine_t machines[] = { .step = 16 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -266,7 +266,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc82_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -302,7 +302,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PCJR, + .kbc_device = NULL, /* TODO: No specific kbd_device yet */ .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &pcjr_device, @@ -338,7 +338,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -374,7 +374,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt86_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -410,7 +410,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -446,7 +446,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -482,7 +482,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -518,7 +518,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc82_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -554,7 +554,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_compaq_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -590,7 +590,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -626,7 +626,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc82_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -662,7 +662,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -698,7 +698,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -734,7 +734,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -770,7 +770,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -806,7 +806,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -842,7 +842,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -878,7 +878,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -914,7 +914,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -950,7 +950,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -986,7 +986,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1022,7 +1022,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_OLIVETTI_XT, + .kbc_device = &keyboard_xt_olivetti_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &m19_vid_device, @@ -1058,7 +1058,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1094,7 +1094,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1130,7 +1130,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1166,7 +1166,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1202,7 +1202,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pravetz_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1238,7 +1238,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1274,7 +1274,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 15, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1310,7 +1310,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1346,7 +1346,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_TANDY, + .kbc_device = &keyboard_tandy_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device, @@ -1382,7 +1382,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_TANDY, + .kbc_device = &keyboard_tandy_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device_hx, @@ -1418,7 +1418,7 @@ const machine_t machines[] = { .step = 768 }, .nvrmask = 63, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_t1x00_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &t1000_video_device, @@ -1454,7 +1454,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1491,7 +1491,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1499,7 +1499,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_LASERXT) */ /* Has a standard PS/2 KBC (so, use IBM PS/2 Type 1). */ { .name = "[8088] Xi8088", @@ -1529,7 +1529,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_VIA_VT82C4XN_XI8088, + .kbc_device = &keyboard_ps2_xi8088_device, .kbc_p1 = 0xff04, .gpio = 0xffffffff, .device = &xi8088_device, @@ -1565,7 +1565,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1601,7 +1601,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_zenith_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1637,7 +1637,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_zenith_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1673,7 +1673,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_zenith_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &cga_device, @@ -1709,7 +1709,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_pc_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1745,7 +1745,7 @@ const machine_t machines[] = { .step = 64 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -1783,7 +1783,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_1512_device, @@ -1819,7 +1819,7 @@ const machine_t machines[] = { .step = 640 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_1640_device, @@ -1855,7 +1855,7 @@ const machine_t machines[] = { .step = 640 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_pc2086_device, @@ -1891,7 +1891,7 @@ const machine_t machines[] = { .step = 640 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_pc3086_device, @@ -1927,7 +1927,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_200_device, @@ -1963,7 +1963,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_AMSTRAD, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_ppc512_device, @@ -1999,7 +1999,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_compaq_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2035,7 +2035,7 @@ const machine_t machines[] = { .step = 640 }, .nvrmask = 0x3f, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2071,7 +2071,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 15, - .kbc = KBC_OLIVETTI_XT, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &ogc_m24_device, @@ -2108,7 +2108,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 15, - .kbc = KBC_OLIVETTI, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff04, .gpio = 0xffffffff, .device = NULL, @@ -2144,7 +2144,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xtclone_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2180,7 +2180,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_TANDY_SL2, + .kbc_device = NULL /* TODO: No specific kbd_device yet */, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device_sl, @@ -2216,7 +2216,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_t1x00_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &t1200_video_device, @@ -2252,7 +2252,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2290,7 +2290,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 0, - .kbc = KBC_IBM_PC_XT, + .kbc_device = &keyboard_xt_lxt3_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, @@ -2298,7 +2298,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_LASERXT) */ /* 286 AT machines */ /* Has IBM AT KBC firmware. */ @@ -2330,7 +2330,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2367,7 +2367,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2404,7 +2404,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2441,7 +2441,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2478,7 +2478,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2516,7 +2516,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2553,7 +2553,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2590,7 +2590,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, @@ -2627,7 +2627,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2664,7 +2664,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2702,7 +2702,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2710,7 +2710,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_OLIVETTI) */ #if defined(DEV_BRANCH) && defined(USE_OPEN_AT) /* Has IBM AT KBC firmware. */ { @@ -2741,7 +2741,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2749,7 +2749,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_OPEN_AT) */ /* Has IBM AT KBC firmware. */ { .name = "[ISA] Phoenix IBM AT", @@ -2779,7 +2779,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2816,7 +2816,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2853,7 +2853,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2890,7 +2890,7 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2927,7 +2927,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -2964,7 +2964,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3001,7 +3001,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3038,7 +3038,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3075,7 +3075,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3112,7 +3112,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3149,7 +3149,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3186,7 +3186,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3223,7 +3223,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3260,7 +3260,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3297,7 +3297,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3334,7 +3334,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3371,7 +3371,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3410,7 +3410,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3447,7 +3447,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3487,7 +3487,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3524,7 +3524,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3561,7 +3561,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3598,7 +3598,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3635,7 +3635,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3674,7 +3674,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &tvga8900d_device, @@ -3712,7 +3712,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3749,7 +3749,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3786,7 +3786,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3825,7 +3825,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &oti067_ama932j_device, @@ -3864,7 +3864,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3900,7 +3900,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3939,7 +3939,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -3976,7 +3976,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4013,7 +4013,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4052,7 +4052,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5402_onboard_device, @@ -4091,7 +4091,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4128,7 +4128,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &ati28800k_spc6033p_device, @@ -4166,7 +4166,7 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4203,7 +4203,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4242,7 +4242,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4279,7 +4279,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4319,7 +4319,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4357,7 +4357,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4394,7 +4394,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4431,7 +4431,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4469,7 +4469,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4477,7 +4477,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_DESKPRO386) */ { .name = "[ISA] Compaq Portable III (386)", .internal_name = "portableiii386", @@ -4506,7 +4506,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, @@ -4543,7 +4543,7 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4580,7 +4580,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4619,7 +4619,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4659,7 +4659,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4696,7 +4696,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4733,7 +4733,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4770,7 +4770,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4807,7 +4807,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4850,7 +4850,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4889,7 +4889,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4927,7 +4927,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -4964,7 +4964,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5001,7 +5001,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5039,7 +5039,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5076,7 +5076,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5116,7 +5116,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5155,7 +5155,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, @@ -5192,7 +5192,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, @@ -5233,7 +5233,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5270,7 +5270,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, @@ -5307,7 +5307,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5344,7 +5344,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_86c805_onboard_vlb_device, @@ -5381,7 +5381,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5419,7 +5419,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5458,7 +5458,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5498,7 +5498,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5535,7 +5535,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5572,7 +5572,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5609,7 +5609,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5646,7 +5646,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5683,7 +5683,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5720,7 +5720,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5757,7 +5757,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5794,7 +5794,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5833,7 +5833,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5870,7 +5870,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5907,7 +5907,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &tgui9440_onboard_pci_device, @@ -5945,7 +5945,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -5986,7 +5986,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6027,7 +6027,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6064,7 +6064,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6101,7 +6101,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6138,7 +6138,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6175,7 +6175,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6212,7 +6212,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6249,7 +6249,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6287,7 +6287,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6324,7 +6324,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6361,7 +6361,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6398,7 +6398,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6435,7 +6435,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6472,7 +6472,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6509,7 +6509,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6547,7 +6547,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6585,7 +6585,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6622,7 +6622,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6659,7 +6659,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6696,7 +6696,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6734,7 +6734,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6771,7 +6771,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6808,7 +6808,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6845,7 +6845,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6882,7 +6882,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6923,7 +6923,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6961,7 +6961,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -6999,7 +6999,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7037,7 +7037,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7075,7 +7075,7 @@ const machine_t machines[] = { .step = 32768 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7119,7 +7119,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7156,7 +7156,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7193,7 +7193,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7230,7 +7230,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7269,7 +7269,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7306,7 +7306,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7343,7 +7343,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7380,7 +7380,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7417,7 +7417,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5434_onboard_pci_device, @@ -7458,7 +7458,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7497,7 +7497,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7536,7 +7536,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7573,7 +7573,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7613,7 +7613,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7651,7 +7651,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7688,7 +7688,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7727,7 +7727,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7764,7 +7764,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7803,7 +7803,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7840,7 +7840,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7877,7 +7877,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7918,7 +7918,7 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7956,7 +7956,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -7995,7 +7995,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8032,7 +8032,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8069,7 +8069,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_JETKEY_5_W83C42, + .kbc_device = &keyboard_at_ami_device, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8109,7 +8109,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8146,7 +8146,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8158,7 +8158,7 @@ const machine_t machines[] = { { .name = "[i430FX] DataExpert EXP8551", .internal_name = "exp8551", - .type = MACHINE_TYPE_SOCKET7_3V, + .type = MACHINE_TYPE_SOCKET5, .chipset = MACHINE_CHIPSET_INTEL_430FX, .init = machine_at_exp8551_init, .pad = 0, @@ -8183,7 +8183,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8222,7 +8222,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8260,7 +8260,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, @@ -8299,7 +8299,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, @@ -8338,7 +8338,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, @@ -8377,7 +8377,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, @@ -8414,7 +8414,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8452,7 +8452,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5440_onboard_pci_device, @@ -8464,7 +8464,7 @@ const machine_t machines[] = { { .name = "[i430FX] PC Partner MB500N", .internal_name = "mb500n", - .type = MACHINE_TYPE_SOCKET7_3V, + .type = MACHINE_TYPE_SOCKET5, .chipset = MACHINE_CHIPSET_INTEL_430FX, .init = machine_at_mb500n_init, .pad = 0, @@ -8489,7 +8489,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8526,7 +8526,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8567,7 +8567,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8604,7 +8604,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8641,7 +8641,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8679,7 +8679,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8718,7 +8718,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8757,7 +8757,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8796,7 +8796,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8833,7 +8833,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8873,7 +8873,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8910,7 +8910,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8947,7 +8947,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -8986,7 +8986,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9025,7 +9025,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9065,7 +9065,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9102,7 +9102,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9141,7 +9141,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9178,7 +9178,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9216,7 +9216,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9253,7 +9253,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9291,7 +9291,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, @@ -9328,7 +9328,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, @@ -9365,7 +9365,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9402,7 +9402,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9441,7 +9441,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9478,7 +9478,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9516,7 +9516,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9554,7 +9554,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9593,7 +9593,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9630,7 +9630,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9668,7 +9668,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9676,7 +9676,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_AN430TX) */ /* This has the AMIKey KBC firmware, which is an updated 'F' type. */ { .name = "[i430TX] Intel YM430TX", @@ -9706,7 +9706,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9743,7 +9743,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9780,7 +9780,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9817,7 +9817,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9857,7 +9857,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9897,7 +9897,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9936,7 +9936,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -9973,7 +9973,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10012,7 +10012,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10049,7 +10049,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10089,7 +10089,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10127,7 +10127,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10164,7 +10164,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10201,7 +10201,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10241,7 +10241,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10279,7 +10279,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10317,7 +10317,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10355,7 +10355,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10395,7 +10395,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10434,7 +10434,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10471,7 +10471,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10509,7 +10509,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10545,7 +10545,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10584,7 +10584,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10623,7 +10623,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10660,7 +10660,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10699,7 +10699,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10739,7 +10739,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10778,7 +10778,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10816,7 +10816,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10856,7 +10856,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10894,7 +10894,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10934,7 +10934,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -10974,7 +10974,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11012,7 +11012,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11050,7 +11050,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11088,7 +11088,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11126,7 +11126,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11164,7 +11164,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11202,7 +11202,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, @@ -11240,7 +11240,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11280,7 +11280,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, @@ -11318,7 +11318,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, @@ -11358,7 +11358,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11398,7 +11398,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11436,7 +11436,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11474,7 +11474,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11512,7 +11512,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, @@ -11553,7 +11553,7 @@ const machine_t machines[] = { .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11594,7 +11594,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, @@ -11633,7 +11633,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, @@ -11674,7 +11674,7 @@ const machine_t machines[] = { .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11712,7 +11712,7 @@ const machine_t machines[] = { .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11753,7 +11753,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11793,7 +11793,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11831,7 +11831,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11869,7 +11869,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11909,7 +11909,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11949,7 +11949,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -11989,7 +11989,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12027,7 +12027,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12065,7 +12065,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12103,7 +12103,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, @@ -12143,7 +12143,7 @@ const machine_t machines[] = { .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12180,7 +12180,7 @@ const machine_t machines[] = { .step = 0 }, .nvrmask = 0, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, @@ -12244,6 +12244,16 @@ machine_getname_ex(int m) return ((char *) machines[m].name); } +const device_t * +machine_get_kbc_device(int m) +{ + if (machines[m].kbc_device) + return (machines[m].kbc_device); + + return (NULL); +} + + const device_t * machine_get_device(int m) { From 01749a6de65859d9fb85bce173ac260a5aa7d8ce Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 18:08:42 -0500 Subject: [PATCH 22/29] Add fdc_device to machine table --- src/include/86box/machine.h | 3 + src/machine/machine_table.c | 326 ++++++++++++++++++++++++++++++++++++ 2 files changed, 329 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 694552c50..2d9dfbc96 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -301,11 +301,13 @@ typedef struct _machine_ { uint32_t gpio_acpi; #ifdef EMU_DEVICE_H const device_t *device; + const device_t *fdc_device; const device_t *vid_device; const device_t *snd_device; const device_t *net_device; #else void *device; + void *fdc_device; void *vid_device; void *snd_device; void *net_device; @@ -330,6 +332,7 @@ extern void machine_init(void); #ifdef EMU_DEVICE_H extern const device_t *machine_get_kbc_device(int m); extern const device_t *machine_get_device(int m); +extern const device_t *machine_get_fdc_device(int m); extern const device_t *machine_get_vid_device(int m); extern const device_t *machine_get_snd_device(int m); extern const device_t *machine_get_net_device(int m); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index a8f8643c0..eb31fc91c 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -234,6 +234,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -270,6 +271,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -306,6 +308,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &pcjr_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -342,6 +345,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -378,6 +382,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -414,6 +419,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -450,6 +456,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -486,6 +493,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -522,6 +530,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -558,6 +567,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -594,6 +604,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -630,6 +641,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -666,6 +678,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -702,6 +715,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -738,6 +752,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -774,6 +789,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -810,6 +826,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -846,6 +863,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -882,6 +900,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -918,6 +937,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -954,6 +974,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -990,6 +1011,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1026,6 +1048,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &m19_vid_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1062,6 +1085,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1098,6 +1122,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1134,6 +1159,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1170,6 +1196,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1206,6 +1233,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1242,6 +1270,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1278,6 +1307,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1314,6 +1344,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1350,6 +1381,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1386,6 +1418,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device_hx, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1422,6 +1455,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &t1000_video_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1458,6 +1492,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1495,6 +1530,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1533,6 +1569,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff04, .gpio = 0xffffffff, .device = &xi8088_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1569,6 +1606,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1605,6 +1643,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1641,6 +1680,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1677,6 +1717,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &cga_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1713,6 +1754,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1749,6 +1791,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1787,6 +1830,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_1512_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1823,6 +1867,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_1640_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1859,6 +1904,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_pc2086_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1895,6 +1941,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_pc3086_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1931,6 +1978,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_200_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1967,6 +2015,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_ppc512_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2003,6 +2052,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2039,6 +2089,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2075,6 +2126,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &ogc_m24_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2112,6 +2164,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff04, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2148,6 +2201,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2184,6 +2238,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device_sl, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2220,6 +2275,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &t1200_video_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2256,6 +2312,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2294,6 +2351,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2334,6 +2392,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2371,6 +2430,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2408,6 +2468,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2445,6 +2506,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2482,6 +2544,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2520,6 +2583,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2557,6 +2621,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2594,6 +2659,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2631,6 +2697,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2668,6 +2735,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2706,6 +2774,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2745,6 +2814,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2783,6 +2853,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2820,6 +2891,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2857,6 +2929,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2894,6 +2967,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2931,6 +3005,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2968,6 +3043,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3005,6 +3081,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3042,6 +3119,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3079,6 +3157,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3116,6 +3195,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3153,6 +3233,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3190,6 +3271,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3227,6 +3309,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3264,6 +3347,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3301,6 +3385,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3338,6 +3423,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3375,6 +3461,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3414,6 +3501,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3451,6 +3539,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3491,6 +3580,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3528,6 +3618,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3565,6 +3656,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3602,6 +3694,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3639,6 +3732,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3678,6 +3772,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &tvga8900d_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3716,6 +3811,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3753,6 +3849,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3790,6 +3887,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3829,6 +3927,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &oti067_ama932j_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3868,6 +3967,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3904,6 +4004,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3943,6 +4044,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3980,6 +4082,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4017,6 +4120,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4056,6 +4160,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5402_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4095,6 +4200,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4132,6 +4238,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &ati28800k_spc6033p_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4170,6 +4277,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4207,6 +4315,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4246,6 +4355,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4283,6 +4393,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4323,6 +4434,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4361,6 +4473,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4398,6 +4511,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4435,6 +4549,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4473,6 +4588,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4510,6 +4626,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4547,6 +4664,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4584,6 +4702,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4623,6 +4742,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4663,6 +4783,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4700,6 +4821,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4737,6 +4859,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4774,6 +4897,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4811,6 +4935,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4854,6 +4979,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4893,6 +5019,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4931,6 +5058,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4968,6 +5096,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5005,6 +5134,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5043,6 +5173,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5080,6 +5211,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5120,6 +5252,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5159,6 +5292,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5196,6 +5330,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5237,6 +5372,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5274,6 +5410,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5311,6 +5448,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5349,6 +5487,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_86c805_onboard_vlb_device, .vid_device = NULL, + .fdc_device = NULL, .snd_device = NULL, .net_device = NULL }, @@ -5385,6 +5524,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5423,6 +5563,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5462,6 +5603,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5502,6 +5644,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5539,6 +5682,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5576,6 +5720,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5613,6 +5758,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5650,6 +5796,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5687,6 +5834,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5724,6 +5872,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5761,6 +5910,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5798,6 +5948,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5837,6 +5988,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5874,6 +6026,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5911,6 +6064,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &tgui9440_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5949,6 +6103,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5990,6 +6145,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6031,6 +6187,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6068,6 +6225,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6105,6 +6263,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6142,6 +6301,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6179,6 +6339,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6216,6 +6377,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6253,6 +6415,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6291,6 +6454,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6328,6 +6492,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6365,6 +6530,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6402,6 +6568,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6439,6 +6606,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6476,6 +6644,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6513,6 +6682,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6551,6 +6721,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6589,6 +6760,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6626,6 +6798,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6663,6 +6836,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6700,6 +6874,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6738,6 +6913,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6775,6 +6951,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6812,6 +6989,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6849,6 +7027,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6886,6 +7065,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6927,6 +7107,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6965,6 +7146,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7003,6 +7185,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7041,6 +7224,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7079,6 +7263,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7123,6 +7308,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7160,6 +7346,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7197,6 +7384,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7234,6 +7422,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7273,6 +7462,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7310,6 +7500,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7347,6 +7538,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7384,6 +7576,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7421,6 +7614,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5434_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7462,6 +7656,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7501,6 +7696,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7540,6 +7736,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7577,6 +7774,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7617,6 +7815,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7655,6 +7854,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7692,6 +7892,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7731,6 +7932,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7768,6 +7970,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7807,6 +8010,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7844,6 +8048,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7881,6 +8086,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7922,6 +8128,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7960,6 +8167,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7999,6 +8207,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8036,6 +8245,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8073,6 +8283,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8113,6 +8324,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8150,6 +8362,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8187,6 +8400,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8226,6 +8440,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8264,6 +8479,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8303,6 +8519,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8342,6 +8559,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8381,6 +8599,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8418,6 +8637,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8456,6 +8676,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &gd5440_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8493,6 +8714,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8530,6 +8752,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8571,6 +8794,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8608,6 +8832,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8645,6 +8870,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8683,6 +8909,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8722,6 +8949,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8761,6 +8989,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8800,6 +9029,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8837,6 +9067,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8877,6 +9108,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8914,6 +9146,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8951,6 +9184,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8990,6 +9224,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9029,6 +9264,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9069,6 +9305,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9106,6 +9343,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9145,6 +9383,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9182,6 +9421,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9220,6 +9460,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9257,6 +9498,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9295,6 +9537,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9332,6 +9575,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9369,6 +9613,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9406,6 +9651,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9445,6 +9691,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9482,6 +9729,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9520,6 +9768,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9558,6 +9807,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9597,6 +9847,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9634,6 +9885,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9672,6 +9924,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9710,6 +9963,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9747,6 +10001,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9784,6 +10039,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9821,6 +10077,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9861,6 +10118,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9901,6 +10159,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9940,6 +10199,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9977,6 +10237,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10016,6 +10277,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10053,6 +10315,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10093,6 +10356,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10131,6 +10395,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10168,6 +10433,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10205,6 +10471,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10245,6 +10512,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10283,6 +10551,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10321,6 +10590,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10359,6 +10629,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10399,6 +10670,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10438,6 +10710,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10475,6 +10748,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10513,6 +10787,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10549,6 +10824,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10588,6 +10864,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10627,6 +10904,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10664,6 +10942,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10703,6 +10982,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10743,6 +11023,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10782,6 +11063,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10820,6 +11102,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10860,6 +11143,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10898,6 +11182,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10938,6 +11223,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10978,6 +11264,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11016,6 +11303,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11054,6 +11342,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11092,6 +11381,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11130,6 +11420,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11168,6 +11459,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11206,6 +11498,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11244,6 +11537,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11284,6 +11578,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11322,6 +11617,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11362,6 +11658,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11402,6 +11699,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11440,6 +11738,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11478,6 +11777,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11516,6 +11816,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11557,6 +11858,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11598,6 +11900,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11637,6 +11940,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11678,6 +11982,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11716,6 +12021,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11757,6 +12063,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11797,6 +12104,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11835,6 +12143,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11873,6 +12182,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11913,6 +12223,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11953,6 +12264,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11993,6 +12305,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12031,6 +12344,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12069,6 +12383,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12107,6 +12422,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12147,6 +12463,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12184,6 +12501,7 @@ const machine_t machines[] = { .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12263,6 +12581,14 @@ machine_get_device(int m) return (NULL); } +const device_t * +machine_get_fdc_device(int m) +{ + if (machines[m].fdc_device) + return (machines[m].fdc_device); + + return (NULL); +} const device_t * machine_get_vid_device(int m) { From fa9e05a3177484a2e736001120c0dd3360042d73 Mon Sep 17 00:00:00 2001 From: "Joakim L. Gilje" Date: Wed, 8 Feb 2023 22:11:22 +0100 Subject: [PATCH 23/29] add command 0xea - set stream mode --- src/device/mouse_ps2.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index 42e2211b9..c2f996b22 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -191,6 +191,12 @@ ps2_write(uint8_t val, void *priv) keyboard_at_adddata_mouse(dev->sample_rate); break; + case 0xea: /* set stream */ + dev->flags &= ~FLAG_CTRLDAT; + mouse_scan = 1; + keyboard_at_adddata_mouse(0xfa); /* ACK for command byte */ + break; + case 0xeb: /* Get mouse data */ keyboard_at_adddata_mouse(0xfa); From 947e511d72bd02723591be6b40965f6ca2473f52 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 7 Feb 2023 18:09:00 -0500 Subject: [PATCH 24/29] Add sio_device to machine table --- src/include/86box/machine.h | 3 + src/machine/machine_table.c | 328 ++++++++++++++++++++++++++++++++++++ 2 files changed, 331 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 2d9dfbc96..165e37cb2 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -302,12 +302,14 @@ typedef struct _machine_ { #ifdef EMU_DEVICE_H const device_t *device; const device_t *fdc_device; + const device_t *sio_device; const device_t *vid_device; const device_t *snd_device; const device_t *net_device; #else void *device; void *fdc_device; + void *sio_device; void *vid_device; void *snd_device; void *net_device; @@ -333,6 +335,7 @@ extern void machine_init(void); extern const device_t *machine_get_kbc_device(int m); extern const device_t *machine_get_device(int m); extern const device_t *machine_get_fdc_device(int m); +extern const device_t *machine_get_sio_device(int m); extern const device_t *machine_get_vid_device(int m); extern const device_t *machine_get_snd_device(int m); extern const device_t *machine_get_net_device(int m); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index eb31fc91c..032975672 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -235,6 +235,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -272,6 +273,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -309,6 +311,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &pcjr_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -346,6 +349,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -383,6 +387,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -420,6 +425,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -457,6 +463,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -494,6 +501,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -531,6 +539,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -568,6 +577,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -605,6 +615,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -642,6 +653,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -679,6 +691,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -716,6 +729,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -753,6 +767,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -790,6 +805,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -827,6 +843,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -864,6 +881,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -901,6 +919,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -938,6 +957,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -975,6 +995,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1012,6 +1033,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1049,6 +1071,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &m19_vid_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1086,6 +1109,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1123,6 +1147,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1160,6 +1185,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1197,6 +1223,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1234,6 +1261,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1271,6 +1299,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1308,6 +1337,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1345,6 +1375,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1382,6 +1413,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1419,6 +1451,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_device_hx, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1456,6 +1489,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &t1000_video_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1493,6 +1527,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1531,6 +1566,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1570,6 +1606,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &xi8088_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1607,6 +1644,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1644,6 +1682,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1681,6 +1720,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1718,6 +1758,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &cga_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1755,6 +1796,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1792,6 +1834,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1831,6 +1874,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_1512_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1868,6 +1912,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_1640_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1905,6 +1950,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_pc2086_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1942,6 +1988,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_pc3086_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1979,6 +2026,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_200_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2016,6 +2064,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_ppc512_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2053,6 +2102,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2090,6 +2140,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2127,6 +2178,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &ogc_m24_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2165,6 +2217,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2202,6 +2255,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2239,6 +2293,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &vid_device_sl, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2276,6 +2331,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = &t1200_video_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2313,6 +2369,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2352,6 +2409,7 @@ const machine_t machines[] = { .gpio = 0xffffffff, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2393,6 +2451,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2431,6 +2490,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2469,6 +2529,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2507,6 +2568,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2545,6 +2607,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2584,6 +2647,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2622,6 +2686,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2660,6 +2725,7 @@ const machine_t machines[] = { .gpio = 0, .device = &compaq_plasma_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2698,6 +2764,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2736,6 +2803,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2775,6 +2843,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2815,6 +2884,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2854,6 +2924,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2892,6 +2963,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2930,6 +3002,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2968,6 +3041,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3006,6 +3080,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3044,6 +3119,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3082,6 +3158,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3120,6 +3197,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3158,6 +3236,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3196,6 +3275,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3234,6 +3314,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3272,6 +3353,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3310,6 +3392,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3348,6 +3431,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3386,6 +3470,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3424,6 +3509,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3462,6 +3548,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3502,6 +3589,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3540,6 +3628,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3581,6 +3670,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3619,6 +3709,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3657,6 +3748,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3695,6 +3787,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3733,6 +3826,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3773,6 +3867,7 @@ const machine_t machines[] = { .gpio = 0, .device = &tvga8900d_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3812,6 +3907,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3850,6 +3946,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3888,6 +3985,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3928,6 +4026,7 @@ const machine_t machines[] = { .gpio = 0, .device = &oti067_ama932j_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3968,6 +4067,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4005,6 +4105,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4045,6 +4146,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4083,6 +4185,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4121,6 +4224,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4161,6 +4265,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5402_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4201,6 +4306,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4239,6 +4345,7 @@ const machine_t machines[] = { .gpio = 0, .device = &ati28800k_spc6033p_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4278,6 +4385,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4316,6 +4424,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4356,6 +4465,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4394,6 +4504,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4435,6 +4546,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4474,6 +4586,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4512,6 +4625,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4550,6 +4664,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4589,6 +4704,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4627,6 +4743,7 @@ const machine_t machines[] = { .gpio = 0, .device = &compaq_plasma_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4665,6 +4782,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4703,6 +4821,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4743,6 +4862,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4784,6 +4904,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4822,6 +4943,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4860,6 +4982,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4898,6 +5021,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4936,6 +5060,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4980,6 +5105,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5020,6 +5146,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5059,6 +5186,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5097,6 +5225,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5135,6 +5264,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5174,6 +5304,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5212,6 +5343,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5253,6 +5385,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5293,6 +5426,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5428_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5331,6 +5465,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5428_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5373,6 +5508,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5411,6 +5547,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5428_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5449,6 +5586,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5488,6 +5626,7 @@ const machine_t machines[] = { .device = &s3_86c805_onboard_vlb_device, .vid_device = NULL, .fdc_device = NULL, + .sio_device = NULL, .snd_device = NULL, .net_device = NULL }, @@ -5525,6 +5664,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5564,6 +5704,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5604,6 +5745,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5645,6 +5787,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5683,6 +5826,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5721,6 +5865,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5759,6 +5904,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5797,6 +5943,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5835,6 +5982,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5873,6 +6021,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5911,6 +6060,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5949,6 +6099,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5989,6 +6140,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6027,6 +6179,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6065,6 +6218,7 @@ const machine_t machines[] = { .gpio = 0, .device = &tgui9440_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6104,6 +6258,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6146,6 +6301,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6188,6 +6344,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6226,6 +6383,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6264,6 +6422,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6302,6 +6461,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6340,6 +6500,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6378,6 +6539,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6416,6 +6578,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6455,6 +6618,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6493,6 +6657,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6531,6 +6696,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6569,6 +6735,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6607,6 +6774,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6645,6 +6813,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6683,6 +6852,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6722,6 +6892,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6761,6 +6932,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6799,6 +6971,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6837,6 +7010,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6875,6 +7049,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6914,6 +7089,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6952,6 +7128,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6990,6 +7167,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7028,6 +7206,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7066,6 +7245,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7108,6 +7288,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7147,6 +7328,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7186,6 +7368,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7225,6 +7408,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7264,6 +7448,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7309,6 +7494,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7347,6 +7533,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7385,6 +7572,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7423,6 +7611,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7463,6 +7652,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7501,6 +7691,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7539,6 +7730,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7577,6 +7769,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7615,6 +7808,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5434_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7657,6 +7851,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7697,6 +7892,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7737,6 +7933,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7775,6 +7972,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7816,6 +8014,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7855,6 +8054,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7893,6 +8093,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7933,6 +8134,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7971,6 +8173,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8011,6 +8214,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8049,6 +8253,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8087,6 +8292,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8129,6 +8335,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8168,6 +8375,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8208,6 +8416,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8246,6 +8455,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8284,6 +8494,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8325,6 +8536,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8363,6 +8575,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8401,6 +8614,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8441,6 +8655,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8480,6 +8695,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8520,6 +8736,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8560,6 +8777,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8600,6 +8818,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8638,6 +8857,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8677,6 +8897,7 @@ const machine_t machines[] = { .gpio = 0, .device = &gd5440_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8715,6 +8936,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8753,6 +8975,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8795,6 +9018,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8833,6 +9057,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8871,6 +9096,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8910,6 +9136,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8950,6 +9177,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8990,6 +9218,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9030,6 +9259,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9068,6 +9298,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9109,6 +9340,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9147,6 +9379,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9185,6 +9418,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9225,6 +9459,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9265,6 +9500,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9306,6 +9542,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9344,6 +9581,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9384,6 +9622,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9422,6 +9661,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9461,6 +9701,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9499,6 +9740,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9538,6 +9780,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9576,6 +9819,7 @@ const machine_t machines[] = { .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9614,6 +9858,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9652,6 +9897,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9692,6 +9938,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9730,6 +9977,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9769,6 +10017,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9808,6 +10057,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9848,6 +10098,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9886,6 +10137,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9925,6 +10177,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9964,6 +10217,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10002,6 +10256,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10040,6 +10295,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10078,6 +10334,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10119,6 +10376,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10160,6 +10418,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10200,6 +10459,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10238,6 +10498,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10278,6 +10539,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10316,6 +10578,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10357,6 +10620,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10396,6 +10660,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10434,6 +10699,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10472,6 +10738,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10513,6 +10780,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10552,6 +10820,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10591,6 +10860,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10630,6 +10900,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10671,6 +10942,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10711,6 +10983,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10749,6 +11022,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10788,6 +11062,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10825,6 +11100,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10865,6 +11141,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10905,6 +11182,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10943,6 +11221,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10983,6 +11262,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11024,6 +11304,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11064,6 +11345,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11103,6 +11385,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11144,6 +11427,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11183,6 +11467,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11224,6 +11509,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11265,6 +11551,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11304,6 +11591,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11343,6 +11631,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11382,6 +11671,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11421,6 +11711,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11460,6 +11751,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11499,6 +11791,7 @@ const machine_t machines[] = { .gpio = 0, .device = &es1371_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11538,6 +11831,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11579,6 +11873,7 @@ const machine_t machines[] = { .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11618,6 +11913,7 @@ const machine_t machines[] = { .gpio = 0, .device = &voodoo_3_2000_agp_onboard_8m_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11659,6 +11955,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11700,6 +11997,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11739,6 +12037,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11778,6 +12077,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11817,6 +12117,7 @@ const machine_t machines[] = { .gpio = 0, .device = &es1371_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11859,6 +12160,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11901,6 +12203,7 @@ const machine_t machines[] = { .gpio = 0, .device = &es1371_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11941,6 +12244,7 @@ const machine_t machines[] = { .gpio = 0, .device = &cmi8738_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11983,6 +12287,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12022,6 +12327,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12064,6 +12370,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12105,6 +12412,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12144,6 +12452,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12183,6 +12492,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12224,6 +12534,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12265,6 +12576,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12306,6 +12618,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12345,6 +12658,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12384,6 +12698,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12423,6 +12738,7 @@ const machine_t machines[] = { .gpio = 0, .device = &cmi8738_onboard_device, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12464,6 +12780,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12502,6 +12819,7 @@ const machine_t machines[] = { .gpio = 0, .device = NULL, .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12589,6 +12907,16 @@ machine_get_fdc_device(int m) return (NULL); } + +const device_t * +machine_get_sio_device(int m) +{ + if (machines[m].sio_device) + return (machines[m].sio_device); + + return (NULL); +} + const device_t * machine_get_vid_device(int m) { From 3f62a95ca18a8f7550e0dd28114cadeb1c5a3d30 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 11 Feb 2023 14:34:35 -0300 Subject: [PATCH 25/29] VIA PIPC: Poll legacy audio only if enabled, improves performance on 686A/B machines --- src/chipset/via_pipc.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index 4f640920e..a568032b4 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -851,9 +851,28 @@ pipc_sb_handlers(pipc_t *dev, uint8_t modem) if (dev->ac97_regs[0][0x42] & 0x04) { io_sethandler(0x388, 4, pipc_fm_read, NULL, NULL, pipc_fm_write, NULL, NULL, dev); +#ifndef VIA_PIPC_FM_EMULATION + dev->sb->opl_enabled = 1; + } else { + dev->sb->opl_enabled = 0; +#endif } } +static void +pipc_sb_get_buffer(int32_t *buffer, int len, void *priv) +{ + pipc_t *dev = (pipc_t *) priv; + + /* Poll SB audio only if the legacy block is enabled. */ +#ifdef VIA_PIPC_FM_EMULATION + if (dev->ac97_regs[0][0x42] & 0x01) +#else + if (dev->ac97_regs[0][0x42] & 0x05) +#endif + sb_get_buffer_sbpro(buffer, len, dev->sb); +} + static uint8_t pipc_read(int func, int addr, void *priv) { @@ -1599,10 +1618,7 @@ pipc_init(const device_t *info) ac97_via_set_slot(dev->ac97, dev->slot, PCI_INTC); dev->sb = device_add_inst(&sb_pro_compat_device, 2); -#ifndef VIA_PIPC_FM_EMULATION - dev->sb->opl_enabled = 1; -#endif - sound_add_handler(sb_get_buffer_sbpro, dev->sb); + sound_add_handler(pipc_sb_get_buffer, dev); dev->gameport = gameport_add(&gameport_sio_device); From 476e8eeead02f7283d041039a1865db7c4050285 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 21:39:21 +0100 Subject: [PATCH 26/29] Fixes to pci_dummy.c. --- src/pci_dummy.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/pci_dummy.c b/src/pci_dummy.c index 22ed1522d..03141fa2c 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -18,11 +18,10 @@ static uint8_t card = 0; static void pci_dummy_interrupt(int set) { - if (set) { + if (set) pci_set_irq(card, pci_regs[0x3D]); - } else { + else pci_clear_irq(card, pci_regs[0x3D]); - } } static uint8_t @@ -111,7 +110,7 @@ pci_dummy_pci_read(int func, int addr, void *priv) { pclog("AB0B:071A: PCI_Read(%d, %04x)\n", func, addr); - switch (addr) { + if (func == 0x00) switch (addr) { case 0x00: return 0x1A; case 0x01: @@ -168,7 +167,8 @@ pci_dummy_pci_read(int func, int addr, void *priv) default: return 0x00; - } + } else + return 0xff; } static void @@ -178,7 +178,7 @@ pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) pclog("AB0B:071A: PCI_Write(%d, %04x, %02x)\n", func, addr, val); - switch (addr) { + if (func == 0x00) switch (addr) { case 0x04: /* PCI_COMMAND_LO */ valxor = (val & 0x03) ^ pci_regs[addr]; if (valxor & PCI_COMMAND_IO) { @@ -212,9 +212,8 @@ pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) /* We're done, so get out of the here. */ if (pci_regs[4] & PCI_COMMAND_IO) { - if ((pci_bar[0].addr) != 0) { + if ((pci_bar[0].addr) != 0) pci_dummy_io_set(); - } } break; @@ -233,5 +232,5 @@ pci_dummy_init(void) pci_bar[0].addr_regs[0] = 0x01; pci_regs[0x04] = 0x03; - pci_regs[0x3D] = PCI_INTD; + pci_regs[0x3D] = PCI_INTA; } From c6359517c160ec11d4177b47cebec8cf5c22ae4f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 22:15:50 +0100 Subject: [PATCH 27/29] More pci_dummy.c fixes and it's now instantiable and the exposed init function initializes it for PCI slot brute force purposes. --- src/include/86box/pci_dummy.h | 2 +- src/pci_dummy.c | 243 ++++++++++++++++++++-------------- 2 files changed, 147 insertions(+), 98 deletions(-) diff --git a/src/include/86box/pci_dummy.h b/src/include/86box/pci_dummy.h index d221ddd2e..104437b6e 100644 --- a/src/include/86box/pci_dummy.h +++ b/src/include/86box/pci_dummy.h @@ -1,6 +1,6 @@ #ifndef EMU_PCI_DUMMY_H #define EMU_PCI_DUMMY_H -extern void pci_dummy_init(void); +extern void pci_dummy_init(int min_slot, int max_slot, int nb_slot, int sb_slot); #endif /*EMU_PCI_DUMMY_H*/ diff --git a/src/pci_dummy.c b/src/pci_dummy.c index 03141fa2c..a54b63260 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -1,57 +1,68 @@ /* This can also serve as a sample PCI device. */ #include #include +#include #include #include #include <86box/86box.h> +#include <86box/device.h> #include <86box/io.h> #include <86box/pci.h> #include <86box/pci_dummy.h> -static uint8_t pci_regs[256]; +typedef struct +{ + uint8_t pci_regs[256]; -static bar_t pci_bar[2]; + bar_t pci_bar[2]; -static uint8_t interrupt_on = 0x00; -static uint8_t card = 0; + uint8_t card, interrupt_on; +} pci_dummy_t; static void -pci_dummy_interrupt(int set) +pci_dummy_interrupt(int set, pci_dummy_t *dev) { if (set) - pci_set_irq(card, pci_regs[0x3D]); + pci_set_irq(dev->card, dev->pci_regs[0x3D]); else - pci_clear_irq(card, pci_regs[0x3D]); + pci_clear_irq(dev->card, dev->pci_regs[0x3D]); } static uint8_t pci_dummy_read(uint16_t Port, void *p) { - uint8_t ret = 0; + pci_dummy_t *dev = (pci_dummy_t *) p; + uint8_t ret = 0xff; switch (Port & 0x20) { case 0x00: - return 0x1A; + ret = 0x1a; + break; case 0x01: - return 0x07; + ret = 0x07; + break; case 0x02: - return 0x0B; + ret = 0x0b; + break; case 0x03: - return 0xAB; + ret = 0xab; + break; case 0x04: - return pci_regs[0x3C]; + ret = dev->pci_regs[0x3c]; + break; case 0x05: - return pci_regs[0x3D]; + ret = dev->pci_regs[0x3d]; + break; case 0x06: - ret = interrupt_on; - if (interrupt_on) { - pci_dummy_interrupt(0); - interrupt_on = 0; + ret = dev->interrupt_on; + if (dev->interrupt_on) { + pci_dummy_interrupt(0, dev); + dev->interrupt_on = 0; } - return ret; - default: - return 0x00; + break; } + + return ret; } static uint16_t @@ -69,11 +80,13 @@ pci_dummy_readl(uint16_t Port, void *p) static void pci_dummy_write(uint16_t Port, uint8_t Val, void *p) { + pci_dummy_t *dev = (pci_dummy_t *) p; + switch (Port & 0x20) { case 0x06: - if (!interrupt_on) { - interrupt_on = 1; - pci_dummy_interrupt(1); + if (!dev->interrupt_on) { + dev->interrupt_on = 1; + pci_dummy_interrupt(1, dev); } return; default: @@ -94,143 +107,179 @@ pci_dummy_writel(uint16_t Port, uint32_t Val, void *p) } static void -pci_dummy_io_remove(void) +pci_dummy_io_remove(pci_dummy_t *dev) { - io_removehandler(pci_bar[0].addr, 0x0020, pci_dummy_read, pci_dummy_readw, pci_dummy_readl, pci_dummy_write, pci_dummy_writew, pci_dummy_writel, NULL); + io_removehandler(dev->pci_bar[0].addr, 0x0020, pci_dummy_read, pci_dummy_readw, pci_dummy_readl, pci_dummy_write, pci_dummy_writew, pci_dummy_writel, dev); } static void -pci_dummy_io_set(void) +pci_dummy_io_set(pci_dummy_t *dev) { - io_sethandler(pci_bar[0].addr, 0x0020, pci_dummy_read, pci_dummy_readw, pci_dummy_readl, pci_dummy_write, pci_dummy_writew, pci_dummy_writel, NULL); + io_sethandler(dev->pci_bar[0].addr, 0x0020, pci_dummy_read, pci_dummy_readw, pci_dummy_readl, pci_dummy_write, pci_dummy_writew, pci_dummy_writel, dev); } static uint8_t pci_dummy_pci_read(int func, int addr, void *priv) { - pclog("AB0B:071A: PCI_Read(%d, %04x)\n", func, addr); + pci_dummy_t *dev = (pci_dummy_t *) priv; + uint8_t ret = 0xff; if (func == 0x00) switch (addr) { - case 0x00: - return 0x1A; - case 0x01: - return 0x07; + case 0x00: case 0x2c: + ret = 0x1a; + break; + case 0x01: case 0x2d: + ret = 0x07; break; - case 0x02: - return 0x0B; - case 0x03: - return 0xAB; + case 0x02: case 0x2e: + ret = 0x0b; + break; + case 0x03: case 0x2f: + ret = 0xab; + break; case 0x04: /* PCI_COMMAND_LO */ case 0x05: /* PCI_COMMAND_HI */ - return pci_regs[addr]; - case 0x06: /* PCI_STATUS_LO */ case 0x07: /* PCI_STATUS_HI */ - return pci_regs[addr]; + case 0x0a: case 0x0b: + case 0x3c: /* PCI_ILR */ + ret = dev->pci_regs[addr]; + break; - case 0x08: - case 0x09: - return 0x00; - - case 0x0A: - return pci_regs[addr]; - - case 0x0B: - return pci_regs[addr]; + case 0x08: /* Techncially, revision, but we return the card (slot) here. */ + ret = dev->card; + break; case 0x10: /* PCI_BAR 7:5 */ - return (pci_bar[0].addr_regs[0] & 0xe0) | 0x01; + ret = (dev->pci_bar[0].addr_regs[0] & 0xe0) | 0x01; + break; case 0x11: /* PCI_BAR 15:8 */ - return pci_bar[0].addr_regs[1]; - case 0x12: /* PCI_BAR 23:16 */ - return pci_bar[0].addr_regs[2]; - case 0x13: /* PCI_BAR 31:24 */ - return pci_bar[0].addr_regs[3]; + ret = dev->pci_bar[0].addr_regs[1]; + break; - case 0x2C: - return 0x1A; - case 0x2D: - return 0x07; - - case 0x2E: - return 0x0B; - case 0x2F: - return 0xAB; - - case 0x3C: /* PCI_ILR */ - return pci_regs[addr]; - - case 0x3D: /* PCI_IPR */ - return pci_regs[addr]; + case 0x3d: /* PCI_IPR */ + ret = PCI_INTA; + break; default: - return 0x00; - } else - return 0xff; + ret = 0x00; + break; + } + + pclog("AB0B:071A: PCI_Read(%d, %04X) = %02X\n", func, addr, ret); + + return ret; } static void pci_dummy_pci_write(int func, int addr, uint8_t val, void *priv) { + pci_dummy_t *dev = (pci_dummy_t *) priv; uint8_t valxor; pclog("AB0B:071A: PCI_Write(%d, %04x, %02x)\n", func, addr, val); if (func == 0x00) switch (addr) { case 0x04: /* PCI_COMMAND_LO */ - valxor = (val & 0x03) ^ pci_regs[addr]; + valxor = (val & 0x03) ^ dev->pci_regs[addr]; if (valxor & PCI_COMMAND_IO) { - pci_dummy_io_remove(); - if (((pci_bar[0].addr & 0xffe0) != 0) && (val & PCI_COMMAND_IO)) { - pci_dummy_io_set(); - } + pci_dummy_io_remove(dev); + if ((dev->pci_bar[0].addr != 0) && (val & PCI_COMMAND_IO)) + pci_dummy_io_set(dev); } - pci_regs[addr] = val & 0x03; + dev->pci_regs[addr] = val & 0x03; break; case 0x10: /* PCI_BAR */ val &= 0xe0; /* 0xe0 acc to RTL DS */ - val |= 0x01; /* re-enable IOIN bit */ /*FALLTHROUGH*/ case 0x11: /* PCI_BAR */ - case 0x12: /* PCI_BAR */ - case 0x13: /* PCI_BAR */ /* Remove old I/O. */ - pci_dummy_io_remove(); + pci_dummy_io_remove(dev); /* Set new I/O as per PCI request. */ - pci_bar[0].addr_regs[addr & 3] = val; + dev->pci_bar[0].addr_regs[addr & 3] = val; /* Then let's calculate the new I/O base. */ - pci_bar[0].addr &= 0xffe0; + dev->pci_bar[0].addr &= 0xffe0; /* Log the new base. */ - pclog("AB0B:071A: PCI: new I/O base is %04X\n", pci_bar[0].addr); + pclog("AB0B:071A: PCI: new I/O base is %04X\n", dev->pci_bar[0].addr); /* We're done, so get out of the here. */ - if (pci_regs[4] & PCI_COMMAND_IO) { - if ((pci_bar[0].addr) != 0) - pci_dummy_io_set(); + if (dev->pci_regs[4] & PCI_COMMAND_IO) { + if ((dev->pci_bar[0].addr) != 0) + pci_dummy_io_set(dev); } break; - case 0x3C: /* PCI_ILR */ + case 0x3c: /* PCI_ILR */ pclog("AB0B:071A: IRQ now: %i\n", val); - pci_regs[addr] = val; + dev->pci_regs[addr] = val; return; } } -void -pci_dummy_init(void) +static void +pci_dummy_reset(void *priv) { - card = pci_add_card(PCI_ADD_NORMAL, pci_dummy_pci_read, pci_dummy_pci_write, NULL); + pci_dummy_t *dev = (pci_dummy_t *) priv; - pci_bar[0].addr_regs[0] = 0x01; - pci_regs[0x04] = 0x03; + /* Lower the IRQ. */ + pci_dummy_interrupt(0, dev); - pci_regs[0x3D] = PCI_INTA; + /* Disable I/O and memory accesses. */ + pci_dummy_pci_write(0x00, 0x04, 0x00, dev); + + /* Zero all the registers. */ + memset(dev, 0x00, sizeof(pci_dummy_t)); +} + +static void +pci_dummy_close(void *priv) +{ + pci_dummy_t *dev = (pci_dummy_t *) priv; + + free(dev); +} + +static void * +pci_dummy_card_init(const device_t *info) +{ + pci_dummy_t *dev = (pci_dummy_t *) calloc(1, sizeof(pci_dummy_t)); + + dev->card = pci_add_card(PCI_ADD_NORMAL, pci_dummy_pci_read, pci_dummy_pci_write, dev); + + return dev; +} + +const device_t pci_dummy_device = { + .name = "Dummy Device (PCI)", + .internal_name = "pci_dummy", + .flags = DEVICE_PCI, + .local = 0, + .init = pci_dummy_card_init, + .close = pci_dummy_close, + .reset = pci_dummy_reset, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +void +pci_dummy_init(int min_slot, int max_slot, int nb_slot, int sb_slot) +{ + int i = 0, j = 1; + + for (i = min_slot; i <= max_slot; i++) { + if ((i != nb_slot) && (i != sb_slot)) { + pci_register_slot(j, PCI_CARD_NORMAL, 1, 3, 2, 4); + device_add_inst(&pci_dummy_device, j); + j++; + } + } } From 050c0c0e18d5d3df36996415e992863ec968d985 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 22:17:41 +0100 Subject: [PATCH 28/29] Added PCI_DUMMY flag to the Mingw makefile. --- src/win/Makefile.mingw | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 0c34aeaa4..9c32a77da 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -76,6 +76,9 @@ ifeq ($(DEV_BUILD), y) ifndef PAS16 PAS16 := y endif + ifndef PCI_DUMMY + PCI_DUMMY := y + endif ifndef SIO_DETECT SIO_DETECT := y endif @@ -137,6 +140,9 @@ else ifndef PAS16 PAS16 := n endif + ifndef PCI_DUMMY + PCI_DUMMY := n + endif ifndef SIO_DETECT SIO_DETECT := n endif @@ -476,6 +482,11 @@ ifeq ($(DEV_BRANCH), y) DEVBROBJ += snd_pas16.o endif + ifeq ($(PCI_DUMMY), y) + OPTS += -DUSE_PCI_DUMMY + DEVBROBJ += pci_dummy.o + endif + ifeq ($(SIO_DETECT), y) OPTS += -DUSE_SIO_DETECT DEVBROBJ += sio_detect.o From e395c59254c22fcdb0855020680098999467ef05 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 11 Feb 2023 22:51:00 +0100 Subject: [PATCH 29/29] Very small fix to pci_dummy.c. --- src/pci_dummy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pci_dummy.c b/src/pci_dummy.c index a54b63260..abc7639b4 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -277,7 +277,7 @@ pci_dummy_init(int min_slot, int max_slot, int nb_slot, int sb_slot) for (i = min_slot; i <= max_slot; i++) { if ((i != nb_slot) && (i != sb_slot)) { - pci_register_slot(j, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(i, PCI_CARD_NORMAL, 1, 3, 2, 4); device_add_inst(&pci_dummy_device, j); j++; }