- it works only on x86 with gcc2.95+
- uses the GCC function atribute "regparm(n)" to declare that certain
functions use the register calling convention
- performance improvement is about 6%
1) fixed the type of "hostPageAddr" and associated typecasts.
2) fixed the type of "pages" and associated typecasts (overloaded variable)
3) patch to cpu.cc to calculate "eipPageBias" correctly in 64 bit mode
1) fixed some errors running 32 bit compat mode. IMPORTANT FIX.
2) added IST processing (uses IST1-IST7 in 64 bit TSS)
3) cosmetic - debugging stuff to console.
a minor optimization. Also in transition from compat mode to 64 bit mode (e.g. interrupt to inner
privelege with mode change), SS may not be properly defined - this avoids other messiness.
DEV_kbd_gen_scancode() is called instead of DEV_kbd_put_scancode(). This
change enables the support for different scancode sets. The win32 scancodes
are now converted to bx_key values.
* renamed CPU_ID to BX_CPU_ID.
with this new name there is no possibility for name contentions and BX_CPU_ID
definition could be moved out to NEED_CPU_REG_SHORTCUTS block
* returned back `unsigned BX_CPU::which_cpu(void)` function
* added BX_CPU_ID parameter for
BX_INSTR_PHY_READ(a20addr, len);
BX_INSTR_PHY_WRITE(a20addr, len);
now it will be
BX_INSTR_PHY_READ(cpu_id, a20addr, len);
BX_INSTR_PHY_WRITE(cpu_id, a20addr, len);
It uses special gcc attribute regparm, available on gcc3.2 on x86.
I get about 7% increase when booting windows 95.
The patch still need some integration work before being included
in the main code.
- function userbutton_handler(): stop parsing the shortcut string if the
key name is invalid
- function userbutton_handler(): incrementing variable 'len' simplified
- function snapshot_checker(): fixed a warning
> CPU_ID is defined as
> #define CPU_ID (BX_CPU_THIS_PTR local_apic.get_id())
> This is not true when the APIC name is changed (true in Linux). Please
> change this to:
> #define CPU_ID (BX_CPU_THIS - BX_CPU(0))
and improved by Christophe Bothamy and Volker Ruppert)
Comment from the author:
Attached is a "patch" file detailing what you need to do
to add USB support (UHCI only for now) to your existing
Bochs (2.0.xx) source code.
I use Win32 and VC++ but the source and modifications
should be platform and compiler independant.
Please let me know if this patch some how breaks the
build process of your compilation (Bochs 2.0.0 or above
only).
I would also like any feedback on how this code works
(or doesn't work) on your platform and within your
images. If you explain in as much detail as you can on
how it did or did not work, I will try to add to the source
to help it work on all platforms and images.
- added "ioaddr" and "irq" to the "usb1" bochsrc option
- number of ports is limited to 2 for a USB UHCI root hub
- the PCI configuration space is now a part of the usb hub structure
- new symbol BX_USE_PCIVGA_SMF for the experimental PCI VGA device
- pcivga.cc: removed unnecessary include statement
- pcivga.cc: fixed two warnings
- pcivga.h: removed unnecessary symbol BX_IODEV_PCIVGA_H
From the author:
I've implemented functions ALOb(), ObAL(), YbAL(),
ALXb() and eAXXv() from dis_groups.cc.
I've also changed dis_decode.cc to print cmpsd if code
is 32 bits and cmpsw if code is 16 bits. The same with
stosd, lodsd and scasd.
appears with the right dimensions. Font sizes other than 16 are working now.
The maximum font height in text mode is 32.
- the text mode cursor is now drawn with the right colors
The 64 bit variant of MOVNTI was not decoded. The proper fix for this is to work on
fetchdecode64.cc to call a 64 bit variant of SSE instructions or fail it with a
invalid op. A careful check needs to be done with the AMD manuals to determine if
there are any other SSE instructions that have a special 64 bit decoding.
into the host-specific files and wrapped access to them
with atomic operations since that's a structure global to
all the VMs. I think all the other globals are SMP clean
since they are only written once during module init time,
and read thereafter my all VMs.
Renamed all host OS specific functions to hostOS*(). All host
independent functions to host*().
I'd like to rename all monitor space functions to mon*() next.
bablokb says in [ 664926 ]
please remove the patch patches/patch.bochs.sh. This
patch was developed for 1.4.x and does not work
anymore with 2.0.x.
It has been superseded by bxtstart in Bochs-Tools (see
http://www.bablokb.de/bochs-tools/).
all the memory it needs, and the plex86 kernel module uses
get_user_pages() from the Linux kernel to get at them and
pin the few that are needed statically (and later up to
a watermark of pages that are needed dynamically).
Guest physical memory pages are now dynamically pinned/unpinned.
For now, I use a hard limit of 4Megs of pinned pages and
a really primitive algorithm to decide which one to unpin
when the limit is reached and one needs to be bumped. Seems
to work. Though I haven't run into the limit yet since I'm using
just a small test program.
and pinning user pages from the plex86 kernel module. The
guest physical memory array is no longer mmap()'d from kernel
space where it used to be allocated.
in the plex86 module and mmap()'ing it into user space (bochs),
to letting bochs malloc() it normally and using the
Linux kernel facility get_user_pages() to get the associated
physical pages and pin them in memory. I only have code for
Linux kernel 2.4.20 and up, as that's the first version to
export the get_user_pages() symbol so modules can use it.
- add int75_handler, for msdos compatbility fpu exception
This handler calls int 2 (nmi). The NMI handler should really be aware
of this and should iret in case of FPU exception (to be implemented)
a region of virtual memory. Now the same one works for getting
the pages of the kernel driver and memory objects allocated via
vmalloc().
Converted to using Linux interfaces to walk the page tables to
get at the physical memory addresses above. The old code was
digging up this info starting with looking at CR3. Linux has
functions/macros to do this, which can handle 2/3-level cases.
Wrapped the page table walk with proper locks. A spin lock
for new Linuxes, a big kernel lock for old ones.
- implementation of the UIP bit using a new timer handler. The one_second_timer()
function only sets the UIP bit and starts the UIP timer. The uip_timer()
function handles the date / time update, the alarm check and finally clears
the UIP bit.
- writing to control register A doesn't change the UIP bit
Here are comments from the anonymous patch author :
I found bug when using the FPU in 16 bit protected
mode. When using the fsave command the 32bit
structures were used instead of the 16bit ones.
It now distinguishes between 16 and 32 bit protected mode
which wasn't the case before.
Now Ultima8 runs fine:)
new experimental stripped-down version of plex86, which is now
a user-code-only VM. I ripped out all the fancy stuff in plex86,
such that under that right conditions, user-code (protection level 3)
can run at near native speeds inside the plex86 VM.
The general idea is that bochs emulates all the initial real-mode code,
and guest kernel code (protection level 0). When it senses the
right conditions (like the context switches to user-code), a shim
is called to execute the guest inside the plex86 VM. All guest-generated
faults/exceptions are then forwarded back to bochs to be handled in
the emulator.
Actually, I'm not yet adding the mods to the bochs code (other than
the shim code which is in a separate file), until I hear that we're
back in a more development mode with bochs after the 2.0 release.
The plex86 subdirectory is really a separate project. It's just more
convenient to co-develop it with bochs for now. Both projects are
currently LGPL, but each should be taken to be a separate project,
and have their own license file. Plex86 (it's only a kernel driver
now) could ultimately be used with other projects, as it's modular.
I talked with Bryce, and we both agreed it's OK to keep plex86 as
a subdir in bochs for now.
PSRAW_PqQq (MMX)
PSRAD_PqQq (MMX)
PSRAW_PqIb (MMX)
PSRAD_PqIb (MMX)
PSRAW_VdqWdq (SSE)
PSRAD_VdqWdq (SSE)
PSRAW_PdqIb (SSE)
PSRAD_PdqIb (SSE)
When register was shifted by 0 bits the result produced was incorrect.
Now Bochs fully passes MMX test provided by
Hentai Yagi [hentai_yagi@yahoo.com.au] !
the icon problem on Win2000. RegisterClassEx() would be required if we want
to specify a special mini icon.
- the win32 gui now uses the new function/macro DEV_vga_actl_pal_idx() to
determine the text mode colors.