diff --git a/.ci/build.sh b/.ci/build.sh index 63a957477..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 @@ -1175,8 +1103,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 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 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 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": [] } diff --git a/src/86box.c b/src/86box.c index fba67ca55..fb96ed87e 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__ @@ -164,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 */ @@ -867,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; @@ -1016,6 +1017,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/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; 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; 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)) { 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); 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.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/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/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); 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/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/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/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 a6571a1fd..165e37cb2 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). */ @@ -297,11 +301,15 @@ typedef struct _machine_ { uint32_t gpio_acpi; #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; @@ -324,10 +332,13 @@ 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_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); #endif extern char *machine_get_internal_name_ex(int m); extern int machine_get_nvrmask(int m); 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/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/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/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 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 73a8a98a6..bb99e5819 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); @@ -331,7 +331,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; @@ -352,7 +352,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); @@ -376,7 +376,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); @@ -399,7 +399,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); @@ -449,7 +449,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 */ @@ -1386,7 +1386,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_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); } 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..893700c7e 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; } @@ -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 1b8fcc712..3e352be14 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -230,10 +230,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -266,10 +268,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -302,10 +306,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -338,10 +344,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -374,10 +382,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -410,10 +420,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -446,10 +458,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -482,10 +496,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -518,10 +534,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -554,10 +572,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -590,10 +610,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -626,10 +648,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -662,10 +686,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -698,10 +724,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -734,10 +762,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -770,10 +800,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -806,10 +838,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -842,10 +876,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -878,10 +914,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -914,10 +952,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -950,10 +990,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -986,10 +1028,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1022,10 +1066,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1058,10 +1104,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1094,10 +1142,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1130,10 +1180,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1166,10 +1218,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1202,10 +1256,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1238,10 +1294,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1274,10 +1332,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1310,10 +1370,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1346,10 +1408,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 0, - .kbc = KBC_TANDY, + .kbc_device = &keyboard_tandy_device, .kbc_p1 = 0xff00, .gpio = 0xffffffff, .device = &vid_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1382,10 +1446,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1418,10 +1484,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1454,10 +1522,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1491,15 +1561,17 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .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,10 +1601,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1565,10 +1639,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1601,10 +1677,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1637,10 +1715,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1673,10 +1753,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1709,10 +1791,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1745,10 +1829,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1783,10 +1869,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1819,10 +1907,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1855,10 +1945,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1891,10 +1983,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1927,10 +2021,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1963,10 +2059,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -1999,10 +2097,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2035,10 +2135,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2071,10 +2173,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2108,10 +2212,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2144,10 +2250,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2180,10 +2288,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2216,10 +2326,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2252,10 +2364,12 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2290,15 +2404,17 @@ 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, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_LASERXT) */ /* 286 AT machines */ /* Has IBM AT KBC firmware. */ @@ -2330,10 +2446,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2367,10 +2485,12 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2404,10 +2524,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2441,10 +2563,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2478,10 +2602,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2516,10 +2642,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2553,10 +2681,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2590,10 +2720,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2627,10 +2759,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2664,10 +2798,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2702,15 +2838,17 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .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,15 +2879,17 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .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,10 +2919,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2816,10 +2958,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2853,10 +2997,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2890,10 +3036,12 @@ const machine_t machines[] = { .step = 256 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2927,10 +3075,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -2964,10 +3114,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3001,10 +3153,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3038,10 +3192,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3075,10 +3231,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3112,10 +3270,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3149,10 +3309,12 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3186,10 +3348,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3223,10 +3387,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3260,10 +3426,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3297,10 +3465,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3334,10 +3504,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3371,10 +3543,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3410,10 +3584,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3447,10 +3623,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3487,10 +3665,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3524,10 +3704,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3561,10 +3743,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3598,10 +3782,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3635,10 +3821,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3674,10 +3862,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &tvga8900d_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3712,10 +3902,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3749,10 +3941,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3786,10 +3980,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3825,10 +4021,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &oti067_ama932j_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3864,10 +4062,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3900,10 +4100,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3939,10 +4141,12 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -3976,10 +4180,12 @@ const machine_t machines[] = { .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4013,10 +4219,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4052,10 +4260,12 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5402_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4091,10 +4301,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4128,10 +4340,12 @@ const machine_t machines[] = { .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &ati28800k_spc6033p_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4166,10 +4380,12 @@ const machine_t machines[] = { .step = 512 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4203,10 +4419,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4242,10 +4460,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4279,10 +4499,12 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4312,17 +4534,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4350,17 +4574,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4387,17 +4613,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 16384, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4424,17 +4652,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = 0, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 32768, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4462,22 +4692,24 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 14336, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL }, -#endif +#endif /* defined(DEV_BRANCH) && defined(USE_DESKPRO386) */ { .name = "[ISA] Compaq Portable III (386)", .internal_name = "portableiii386", @@ -4499,17 +4731,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &compaq_plasma_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4536,17 +4770,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 512, .max = 8192, .step = 128 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4610,17 +4846,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4649,17 +4887,19 @@ 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, .step = 1024 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4689,17 +4929,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4726,17 +4968,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4763,17 +5007,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4800,17 +5046,19 @@ 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, .step = 2048 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4837,17 +5085,19 @@ 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, .step = 2048 }, .nvrmask = 63, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4880,17 +5130,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4919,17 +5171,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4957,17 +5211,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -4994,17 +5250,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5031,17 +5289,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5069,17 +5329,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5106,17 +5368,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 131072, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5146,17 +5410,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 64512, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5185,17 +5451,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5222,17 +5490,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5263,17 +5533,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5300,17 +5572,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5428_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5337,17 +5611,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 32768, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5374,18 +5650,20 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_86c805_onboard_vlb_device, .vid_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .snd_device = NULL, .net_device = NULL }, @@ -5411,17 +5689,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5449,17 +5729,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5488,17 +5770,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5528,17 +5812,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5565,17 +5851,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5602,17 +5890,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5639,17 +5929,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5676,17 +5968,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5713,17 +6007,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5750,17 +6046,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5787,17 +6085,19 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_IDE, + .flags = MACHINE_IDE | MACHINE_APM, .ram = { .min = 1024, .max = 65536, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5824,17 +6124,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5863,17 +6165,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5900,17 +6204,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5937,17 +6243,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &tgui9440_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -5975,17 +6283,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6016,17 +6326,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6057,17 +6369,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6094,17 +6408,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6131,17 +6447,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6168,17 +6486,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6205,17 +6525,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6242,17 +6564,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6279,17 +6603,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6317,17 +6643,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6354,17 +6682,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6391,17 +6721,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6428,17 +6760,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6465,17 +6799,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6502,17 +6838,19 @@ 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, .step = 1024 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6539,17 +6877,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6577,17 +6917,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6615,17 +6957,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6652,17 +6996,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6689,17 +7035,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6726,17 +7074,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6764,17 +7114,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6801,17 +7153,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6838,17 +7192,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6875,17 +7231,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6912,17 +7270,19 @@ 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, .step = 1024 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6953,17 +7313,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -6991,17 +7353,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7029,17 +7393,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7067,17 +7433,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7105,17 +7473,19 @@ 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, .step = 32768 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7149,17 +7519,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7186,17 +7558,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7223,17 +7597,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7260,17 +7636,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7299,17 +7677,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7336,17 +7716,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7373,17 +7755,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7410,17 +7794,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7447,17 +7833,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5434_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7488,17 +7876,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7527,17 +7917,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7566,17 +7958,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7603,17 +7997,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7643,17 +8039,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7681,17 +8079,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7718,17 +8118,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7757,17 +8159,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7794,17 +8198,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7833,17 +8239,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7870,17 +8278,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7907,17 +8317,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7948,17 +8360,19 @@ 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, .step = 2048 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -7986,17 +8400,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8025,17 +8441,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8053,7 +8471,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, @@ -8062,17 +8480,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8099,17 +8519,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_JETKEY_5_W83C42, + .kbc_device = &keyboard_at_ami_device, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8139,17 +8561,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8176,17 +8600,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8195,7 +8621,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, @@ -8213,17 +8639,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8252,17 +8680,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8290,17 +8720,19 @@ 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, .step = 8192 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8329,17 +8761,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8368,17 +8802,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64vplus_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8407,17 +8843,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_phoenix_trio64_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8444,17 +8882,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8482,17 +8922,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &gd5440_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8501,7 +8943,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, @@ -8519,17 +8961,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8556,17 +9000,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8597,17 +9043,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8634,17 +9082,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8671,17 +9121,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8709,17 +9161,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8748,17 +9202,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8787,17 +9243,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8826,17 +9284,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8863,17 +9323,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8903,17 +9365,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8940,17 +9404,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -8977,17 +9443,19 @@ 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, .step = 8192 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9016,17 +9484,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9055,17 +9525,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9095,17 +9567,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9132,17 +9606,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9171,17 +9647,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9208,17 +9686,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9246,17 +9726,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9283,17 +9765,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9321,17 +9805,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9358,17 +9844,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &s3_trio64v2_dx_onboard_pci_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9395,17 +9883,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9432,17 +9922,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9471,17 +9963,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9508,17 +10002,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9546,17 +10042,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9584,17 +10082,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9623,17 +10123,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9660,17 +10162,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9698,22 +10202,24 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .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", @@ -9736,17 +10242,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9773,17 +10281,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9800,27 +10310,29 @@ 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, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, .ram = { .min = 8192, .max = 262144, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9847,17 +10359,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9887,17 +10401,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9927,17 +10443,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -9966,17 +10484,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10003,17 +10523,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10042,17 +10564,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10079,17 +10603,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10119,17 +10645,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10157,17 +10685,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10194,17 +10724,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10231,17 +10763,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10271,17 +10805,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10309,17 +10845,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10347,17 +10885,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10385,17 +10925,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10425,17 +10967,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10464,17 +11008,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10501,17 +11047,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10539,17 +11087,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10575,17 +11125,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10614,17 +11166,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10653,17 +11207,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10690,17 +11246,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10729,17 +11287,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10769,17 +11329,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10808,17 +11370,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10846,17 +11410,19 @@ 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, .step = 8192 }, .nvrmask = 127, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10886,17 +11452,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10924,17 +11492,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -10964,17 +11534,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11004,17 +11576,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11042,17 +11616,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11080,17 +11656,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11118,17 +11696,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11156,17 +11736,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11194,17 +11776,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11232,17 +11816,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11270,17 +11856,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11310,17 +11898,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .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 @@ -11348,17 +11938,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .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 @@ -11388,17 +11980,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11428,17 +12022,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11466,17 +12062,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11504,17 +12102,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11542,17 +12142,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11583,17 +12185,19 @@ 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, .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11624,17 +12228,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &es1371_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11663,17 +12269,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11704,17 +12312,19 @@ 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, .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11742,17 +12352,19 @@ 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, .step = 16384 }, .nvrmask = 511, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11783,17 +12395,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11823,17 +12437,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11861,17 +12477,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11899,17 +12517,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11939,17 +12559,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -11979,17 +12601,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12019,17 +12643,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12057,17 +12683,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12095,17 +12723,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12133,17 +12763,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = &cmi8738_onboard_device, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12173,17 +12805,19 @@ 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, .step = 8192 }, .nvrmask = 255, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12217,10 +12851,12 @@ const machine_t machines[] = { .step = 0 }, .nvrmask = 0, - .kbc = KBC_UNKNOWN, + .kbc_device = NULL, .kbc_p1 = 0, .gpio = 0, .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL @@ -12282,7 +12918,17 @@ machine_getname_ex(int m) } const device_t * -machine_getdevice(int m) +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) { if (machines[m].device) return (machines[m].device); @@ -12291,7 +12937,25 @@ machine_getdevice(int m) } const device_t * -machine_getviddevice(int m) +machine_get_fdc_device(int m) +{ + if (machines[m].fdc_device) + return (machines[m].fdc_device); + + 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) { if (machines[m].vid_device) return (machines[m].vid_device); @@ -12300,7 +12964,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); @@ -12309,7 +12973,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/network/net_slirp.c b/src/network/net_slirp.c index 35dfb52bb..7651464a2 100644 --- a/src/network/net_slirp.c +++ b/src/network/net_slirp.c @@ -493,15 +493,11 @@ const netdrv_t net_slirp_drv = { /* Stubs to stand in for the parts of libslirp we skip compiling. */ void ncsi_input(void *slirp, const uint8_t *pkt, int pkt_len) {} void ip6_init(void *slirp) {} -void ip6_cleanup(void *slirp) {} -void ip6_input(void *m) {} -int ip6_output(void *so, void *m, int fast) { return 0; } void in6_compute_ethaddr(struct in6_addr ip, uint8_t *eth) {} bool in6_equal(const void *a, const void *b) { return 0; } const struct in6_addr in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }; const struct in6_addr in6addr_loopback = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }; -int udp6_output(void *so, void *m, void *saddr, void *daddr) { return 0; } -void icmp6_send_error(void *m, uint8_t type, uint8_t code) {} -void ndp_send_ns(void *slirp, struct in6_addr addr) {} +void ndp_table_add(Slirp *slirp, struct in6_addr ip_addr, + uint8_t ethaddr[6]) {} /* IPv6 */ bool ndp_table_search(void *slirp, struct in6_addr ip_addr, uint8_t *out_ethaddr) { return 0; } void tftp_input(void *srcsas, void *m) {} diff --git a/src/network/slirp/CMakeLists.txt b/src/network/slirp/CMakeLists.txt index 29da352e9..60993ad84 100644 --- a/src/network/slirp/CMakeLists.txt +++ b/src/network/slirp/CMakeLists.txt @@ -13,17 +13,22 @@ # Copyright 2020-2021 David Hrdlička. # -add_library(slirp STATIC arp_table.c bootp.c cksum.c dnssearch.c if.c +add_library(slirp STATIC arp_table.c bootp.c cksum.c dhcpv6.c dnssearch.c if.c ip_icmp.c ip_input.c ip_output.c + ip6_icmp.c ip6_input.c ip6_output.c mbuf.c misc.c sbuf.c slirp.c socket.c tcp_input.c tcp_output.c tcp_subr.c tcp_timer.c - udp.c + udp.c udp6.c util.c version.c) if(WIN32) target_link_libraries(slirp wsock32 iphlpapi) endif() +if(APPLE) + target_link_libraries(slirp resolv) +endif() + # tinyglib conflicts with the real GLib used by Qt, let's just be safe if(QT AND UNIX AND NOT APPLE) set(SLIRP_TINYGLIB OFF) diff --git a/src/network/slirp/arp_table.c b/src/network/slirp/arp_table.c index 959e5b9ec..d0c9111d6 100644 --- a/src/network/slirp/arp_table.c +++ b/src/network/slirp/arp_table.c @@ -34,11 +34,16 @@ void arp_table_add(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_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/pci_dummy.c b/src/pci_dummy.c index 22ed1522d..abc7639b4 100644 --- a/src/pci_dummy.c +++ b/src/pci_dummy.c @@ -1,58 +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]); - } else { - pci_clear_irq(card, pci_regs[0x3D]); - } + if (set) + pci_set_irq(dev->card, dev->pci_regs[0x3D]); + else + 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 @@ -70,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: @@ -95,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; - switch (addr) { - case 0x00: - return 0x1A; - case 0x01: - return 0x07; + if (func == 0x00) switch (addr) { + 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; + 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); - switch (addr) { + 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_INTD; + /* 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(i, PCI_CARD_NORMAL, 1, 3, 2, 4); + device_add_inst(&pci_dummy_device, j); + j++; + } + } } 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; 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 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/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_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 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/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 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 */ 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_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]; 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/Makefile.mingw b/src/win/Makefile.mingw index 4ba9f4745..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 @@ -637,16 +648,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 \ 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.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..07822f28b 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; @@ -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; } @@ -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; 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);