You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
(125) |
Apr
(211) |
May
(44) |
Jun
(90) |
Jul
(57) |
Aug
(186) |
Sep
(724) |
Oct
(885) |
Nov
(340) |
Dec
(331) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(204) |
Feb
(80) |
Mar
(124) |
Apr
(96) |
May
(129) |
Jun
(48) |
Jul
(61) |
Aug
(159) |
Sep
(39) |
Oct
(100) |
Nov
(70) |
Dec
(79) |
2004 |
Jan
(128) |
Feb
(189) |
Mar
(117) |
Apr
(78) |
May
(61) |
Jun
(87) |
Jul
(54) |
Aug
(101) |
Sep
(67) |
Oct
(60) |
Nov
(61) |
Dec
(82) |
2005 |
Jan
(55) |
Feb
(82) |
Mar
(105) |
Apr
(86) |
May
(51) |
Jun
(55) |
Jul
(154) |
Aug
(63) |
Sep
(70) |
Oct
(105) |
Nov
(110) |
Dec
(63) |
2006 |
Jan
(181) |
Feb
(123) |
Mar
(118) |
Apr
(124) |
May
(171) |
Jun
(101) |
Jul
(28) |
Aug
(65) |
Sep
(83) |
Oct
(70) |
Nov
(28) |
Dec
(35) |
2007 |
Jan
(35) |
Feb
(15) |
Mar
(49) |
Apr
(48) |
May
(9) |
Jun
(6) |
Jul
(12) |
Aug
(27) |
Sep
(83) |
Oct
(81) |
Nov
(105) |
Dec
(129) |
2008 |
Jan
(78) |
Feb
(81) |
Mar
(82) |
Apr
(161) |
May
(128) |
Jun
(66) |
Jul
(48) |
Aug
(68) |
Sep
(41) |
Oct
(43) |
Nov
(27) |
Dec
(100) |
2009 |
Jan
(141) |
Feb
(139) |
Mar
(136) |
Apr
(170) |
May
(81) |
Jun
(43) |
Jul
(19) |
Aug
(39) |
Sep
(16) |
Oct
(105) |
Nov
(86) |
Dec
(66) |
2010 |
Jan
(32) |
Feb
(78) |
Mar
(117) |
Apr
(110) |
May
(58) |
Jun
(14) |
Jul
(21) |
Aug
(6) |
Sep
(20) |
Oct
(11) |
Nov
(36) |
Dec
(50) |
2011 |
Jan
(101) |
Feb
(24) |
Mar
(61) |
Apr
(52) |
May
(36) |
Jun
(64) |
Jul
(84) |
Aug
(122) |
Sep
(66) |
Oct
(42) |
Nov
(55) |
Dec
(106) |
2012 |
Jan
(95) |
Feb
(57) |
Mar
(49) |
Apr
(37) |
May
(44) |
Jun
(50) |
Jul
(55) |
Aug
(83) |
Sep
(80) |
Oct
(52) |
Nov
(28) |
Dec
(11) |
2013 |
Jan
(38) |
Feb
(40) |
Mar
(17) |
Apr
(20) |
May
(20) |
Jun
(31) |
Jul
(27) |
Aug
(34) |
Sep
(47) |
Oct
(75) |
Nov
(60) |
Dec
(111) |
2014 |
Jan
(70) |
Feb
(58) |
Mar
(49) |
Apr
(35) |
May
(45) |
Jun
(44) |
Jul
(57) |
Aug
(34) |
Sep
(13) |
Oct
(29) |
Nov
(35) |
Dec
(22) |
2015 |
Jan
(35) |
Feb
(49) |
Mar
(26) |
Apr
(28) |
May
(44) |
Jun
(8) |
Jul
(19) |
Aug
(17) |
Sep
(32) |
Oct
(24) |
Nov
(11) |
Dec
(5) |
2016 |
Jan
(1) |
Feb
(4) |
Mar
(9) |
Apr
(8) |
May
(11) |
Jun
(4) |
Jul
(8) |
Aug
(7) |
Sep
(4) |
Oct
(3) |
Nov
(22) |
Dec
(49) |
2017 |
Jan
(37) |
Feb
(34) |
Mar
(77) |
Apr
(44) |
May
(32) |
Jun
(18) |
Jul
(4) |
Aug
(19) |
Sep
(14) |
Oct
(34) |
Nov
(29) |
Dec
(60) |
2018 |
Jan
(32) |
Feb
(10) |
Mar
(8) |
Apr
(12) |
May
(26) |
Jun
(3) |
Jul
(1) |
Aug
(5) |
Sep
|
Oct
(5) |
Nov
(2) |
Dec
(2) |
2019 |
Jan
(9) |
Feb
(9) |
Mar
|
Apr
(4) |
May
(6) |
Jun
|
Jul
(1) |
Aug
(2) |
Sep
(1) |
Oct
(17) |
Nov
(38) |
Dec
(129) |
2020 |
Jan
(49) |
Feb
(15) |
Mar
(12) |
Apr
(5) |
May
(31) |
Jun
(29) |
Jul
(12) |
Aug
(16) |
Sep
(28) |
Oct
(37) |
Nov
(19) |
Dec
(33) |
2021 |
Jan
(69) |
Feb
(51) |
Mar
(42) |
Apr
(29) |
May
(24) |
Jun
(30) |
Jul
(32) |
Aug
(12) |
Sep
(4) |
Oct
(4) |
Nov
(1) |
Dec
|
From: Bryce D. <bd...@us...> - 2002-09-17 22:14:37
|
Update of /cvsroot/bochs/bochs/cpu In directory usw-pr-cvs1:/tmp/cvs-serv21960/cpu Modified Files: cpu.h proc_ctrl.cc Log Message: - add #if BX_CPU_LEVEL>=4 around cr0.wp and cr4 so that i386 will compile Index: cpu.h =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/cpu.h,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- cpu.h 17 Sep 2002 14:36:38 -0000 1.59 +++ cpu.h 17 Sep 2002 22:14:33 -0000 1.60 @@ -1907,7 +1907,9 @@ BX_SMF void RDTSC(BxInstruction_t *); BX_SMF void RDMSR(BxInstruction_t *); BX_SMF void SetCR0(Bit32u val_32); +#if BX_CPU_LEVEL >= 4 BX_SMF void SetCR4(Bit32u val_32); +#endif BX_SMF void dynamic_translate(void); BX_SMF void dynamic_init(void); BX_SMF unsigned FetchDecode(Bit8u *, BxInstruction_t *, unsigned, Boolean); Index: proc_ctrl.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/proc_ctrl.cc,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- proc_ctrl.cc 15 Sep 2002 15:10:21 -0000 1.38 +++ proc_ctrl.cc 17 Sep 2002 22:14:33 -0000 1.39 @@ -1481,14 +1481,13 @@ // from either MOV_CdRd() or debug functions // protection checks made already or forcing from debug Boolean prev_pe, prev_pg; -#if BX_CPU_LEVEL >= 4 - Boolean prev_wp; -#endif Bit32u oldCR0 = BX_CPU_THIS_PTR cr0.val32, newCR0; prev_pe = BX_CPU_THIS_PTR cr0.pe; prev_pg = BX_CPU_THIS_PTR cr0.pg; - prev_wp = BX_CPU_THIS_PTR cr0.wp; +#if BX_CPU_LEVEL >= 4 + Boolean prev_wp = BX_CPU_THIS_PTR cr0.wp; +#endif BX_CPU_THIS_PTR cr0.pe = val_32 & 0x01; BX_CPU_THIS_PTR cr0.mp = (val_32 >> 1) & 0x01; @@ -1561,6 +1560,7 @@ pagingCR0Changed(oldCR0, newCR0); } +#if BX_CPU_LEVEL >= 4 void BX_CPU_C::SetCR4(Bit32u val_32) { @@ -1600,6 +1600,7 @@ BX_CPU_THIS_PTR cr4.setRegister(val_32); pagingCR4Changed(oldCR4, BX_CPU_THIS_PTR cr4.getRegister()); } +#endif void |
From: Bryce D. <bd...@us...> - 2002-09-17 21:45:56
|
Update of /cvsroot/bochs/bochs In directory usw-pr-cvs1:/tmp/cvs-serv13085 Modified Files: configure.in configure Log Message: - remove obsolete loader option Index: configure.in =================================================================== RCS file: /cvsroot/bochs/bochs/configure.in,v retrieving revision 1.112 retrieving revision 1.113 diff -u -d -r1.112 -r1.113 --- configure.in 16 Sep 2002 21:55:56 -0000 1.112 +++ configure.in 17 Sep 2002 21:45:48 -0000 1.113 @@ -874,28 +874,6 @@ AC_DEFINE(HAVE_READLINE_HISTORY_H) ) -AC_MSG_CHECKING(for loader support) -AC_ARG_ENABLE(loader, - [ --enable-loader support calling external loader from debugger], - [if test "$enableval" = yes; then - AC_MSG_RESULT(yes) - AC_DEFINE(BX_USE_LOADER, 1) - BX_LOADER_OBJS='bx_loader.o loader.o' - else - AC_MSG_RESULT(no) - AC_DEFINE(BX_USE_LOADER, 0) - BX_LOADER_OBJS='' - fi], - [ - AC_MSG_RESULT(no) - AC_DEFINE(BX_USE_LOADER, 0) - BX_LOADER_OBJS='' - ] - ) -AC_SUBST(BX_LOADER_OBJS) - - - INSTRUMENT_DIR='instrument/stubs' AC_MSG_CHECKING(for instrumentation support) Index: configure =================================================================== RCS file: /cvsroot/bochs/bochs/configure,v retrieving revision 1.110 retrieving revision 1.111 diff -u -d -r1.110 -r1.111 --- configure 16 Sep 2002 21:55:56 -0000 1.110 +++ configure 17 Sep 2002 21:45:48 -0000 1.111 @@ -1,130 +1,311 @@ #! /bin/sh - +# From configure.in Id: configure.in,v 1.112 2002/09/16 21:55:56 kevinlawton Exp . # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# Generated by GNU Autoconf 2.53. # +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation [...15614 lines suppressed...] + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL $CONFIG_STATUS || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi |
From: Bryce D. <bd...@us...> - 2002-09-17 21:45:56
|
Update of /cvsroot/bochs/bochs/doc/docbook/user In directory usw-pr-cvs1:/tmp/cvs-serv13085/doc/docbook/user Modified Files: user.dbk Log Message: - remove obsolete loader option Index: user.dbk =================================================================== RCS file: /cvsroot/bochs/bochs/doc/docbook/user/user.dbk,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- user.dbk 24 Aug 2002 10:20:34 -0000 1.45 +++ user.dbk 17 Sep 2002 21:45:51 -0000 1.46 @@ -2144,12 +2144,6 @@ </entry> </row> <row> - <entry>--enable-loader</entry> - <entry>no</entry> - <entry>Support calling external loader from debugger. This - is an unsupported option. Don't use it.</entry> - </row> - <row> <entry>--enable-instrumentation=<option>directory</option></entry> <entry>no</entry> <entry> |
From: Bryce D. <bd...@us...> - 2002-09-17 18:11:16
|
Update of /cvsroot/bochs/bochs/patches In directory usw-pr-cvs1:/tmp/cvs-serv27834/patches Modified Files: patch.4ata-channels.bbd Log Message: - with this version of my patch, 4ata works in wxWindows Index: patch.4ata-channels.bbd =================================================================== RCS file: /cvsroot/bochs/bochs/patches/patch.4ata-channels.bbd,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- patch.4ata-channels.bbd 17 Sep 2002 14:36:23 -0000 1.1 +++ patch.4ata-channels.bbd 17 Sep 2002 18:11:12 -0000 1.2 @@ -1,17 +1,14 @@ ---------------------------------------------------------------------- Patch name: patches/patch.4ata-channels.bbd Author: Bryce Denney -Date: Tue Sep 17 09:44:40 EDT 2002 +Date: Tue Sep 17 14:09:33 EDT 2002 This patch applies on top of Christophe Bothamy's 4ata-channels patch. I'm keeping a separate patch in case Christophe wants to make revisions to his patch without my changes getting in the way. -I have just been working on the configuration interface part, for [...963 lines suppressed...] + + switch(opt->Otranslation->get()) { +@@ -3014,7 +2916,7 @@ + } + } + else if (opt->Otype->get() == BX_ATA_DEVICE_CDROM) { +- fprintf (fp, ", type=cdrom, path=\"%s\", status=%s", ++ fprintf (fp, "type=cdrom, path=\"%s\", status=%s", + opt->Opath->getptr(), + opt->Ostatus->get ()==BX_EJECTED ? "ejected" : "inserted"); + } +@@ -3031,7 +2933,7 @@ + break; + } + if (strlen(opt->Omodel->getptr())>0) { +- fprintf (fp, " model=\"%s\"", opt->Omodel->getptr()); ++ fprintf (fp, ", model=\"%s\"", opt->Omodel->getptr()); + } + + fprintf (fp, "\n"); |
From: Stanislav S. <ssh...@us...> - 2002-09-17 14:36:43
|
Update of /cvsroot/bochs/bochs/cpu In directory usw-pr-cvs1:/tmp/cvs-serv3335 Modified Files: cpu.h ctrl_xfer16.cc ctrl_xfer32.cc ctrl_xfer64.cc Log Message: just little clean of the code Index: cpu.h =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/cpu.h,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- cpu.h 17 Sep 2002 04:20:42 -0000 1.58 +++ cpu.h 17 Sep 2002 14:36:38 -0000 1.59 @@ -261,6 +261,8 @@ #define BX_PF_EXCEPTION 14 #define BX_MF_EXCEPTION 16 #define BX_AC_EXCEPTION 17 +#define BX_MC_EXCEPTION 18 +#define BX_XF_EXCEPTION 19 /* MSR registers */ #define BX_MSR_P5_MC_ADDR 0x0000 Index: ctrl_xfer16.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/ctrl_xfer16.cc,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- ctrl_xfer16.cc 13 Sep 2002 00:15:23 -0000 1.7 +++ ctrl_xfer16.cc 17 Sep 2002 14:36:39 -0000 1.8 @@ -173,7 +173,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_RET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } void @@ -202,7 +201,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_RET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } @@ -264,7 +262,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_CALL, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } void @@ -346,7 +343,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_CALL, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } @@ -492,7 +488,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_JMP, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } void @@ -532,5 +527,4 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_IRET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } Index: ctrl_xfer32.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/ctrl_xfer32.cc,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- ctrl_xfer32.cc 16 Sep 2002 16:58:35 -0000 1.10 +++ ctrl_xfer32.cc 17 Sep 2002 14:36:39 -0000 1.11 @@ -175,7 +175,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_RET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } void @@ -205,7 +204,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_RET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } @@ -265,7 +263,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_CALL, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } void @@ -344,7 +341,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_CALL, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } @@ -449,7 +445,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_JMP, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } @@ -517,7 +512,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_JMP, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } void @@ -561,5 +555,4 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_IRET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, EIP); - return; } Index: ctrl_xfer64.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/ctrl_xfer64.cc,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- ctrl_xfer64.cc 16 Sep 2002 16:58:35 -0000 1.3 +++ ctrl_xfer64.cc 17 Sep 2002 14:36:39 -0000 1.4 @@ -132,7 +132,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_RET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, BX_CPU_THIS_PTR rip); - return; } void @@ -162,7 +161,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_RET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, BX_CPU_THIS_PTR rip); - return; } @@ -215,7 +213,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_CALL, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, BX_CPU_THIS_PTR rip); - return; } void @@ -285,7 +282,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_CALL, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, BX_CPU_THIS_PTR rip); - return; } @@ -370,7 +366,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_JMP, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, BX_CPU_THIS_PTR rip); - return; } #endif @@ -429,7 +424,6 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_JMP, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, RIP); - return; } void @@ -455,5 +449,4 @@ done: BX_INSTR_FAR_BRANCH(BX_INSTR_IS_IRET, BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value, BX_CPU_THIS_PTR rip); - return; } |
From: Bryce D. <bd...@us...> - 2002-09-17 14:36:26
|
Update of /cvsroot/bochs/bochs/patches In directory usw-pr-cvs1:/tmp/cvs-serv2710/patches Added Files: patch.4ata-channels.bbd Log Message: This patch applies on top of Christophe Bothamy's 4ata-channels patch. I'm keeping a separate patch in case Christophe wants to make revisions to his patch without my changes getting in the way. I have just been working on the configuration interface part, for example making it so that when you disable the ata[0123] channel, all the devices controlled by that channel will be disabled as well. I haven't gotten around to the wxWindows part, but these changes will make the wxWindows work much easier. I will update this patch as my work progresses. --- NEW FILE: patch.4ata-channels.bbd --- ---------------------------------------------------------------------- Patch name: patches/patch.4ata-channels.bbd Author: Bryce Denney Date: Tue Sep 17 09:44:40 EDT 2002 This patch applies on top of Christophe Bothamy's 4ata-channels patch. I'm keeping a separate patch in case Christophe wants to make revisions to his patch without my changes getting in the way. I have just been working on the configuration interface part, for example making it so that when you disable the ata[0123] channel, all the devices controlled by that channel will be disabled as well. I haven't gotten around to the wxWindows part, but these changes will make the wxWindows work much easier. - set default I/O address for all ata channels, even the ones which are disabled by default. It's easier to configure from scratch if we have reasonable defaults already. (I know many options default to zero instead of reasonable defaults, but I don't like that either.) - eliminate huge initialization lists atachannel_init_list[][] and atadevice_init_list[][] by creating the bx_list_c and calling the add() method from inside a loop. - Also I'm using a trick: since the dependent_list and the menus contain almost the same items, I build just one list at first. Then since I need to add a few more items to the dependent list (but I don't want them to show on the menu) I call bx_list_c::clone() to make a copy to use as the dependent list. Example: BXP_ATA0 menu: BXP_ATA0_PRESENT, BXP_ATA0_IOADDR1, BXP_ATA0_IOADDR2, BXP_ATA0_IRQ dependent list for BXP_ATA0_PRESENT: BXP_ATA0_PRESENT, BXP_ATA0_IOADDR1, BXP_ATA0_IOADDR2, BXP_ATA0_IRQ, BXP_ATA0_MASTER, BXP_ATA0_SLAVE - the ata devices have both a "present" boolean parameter and a "type" enum parameter. I removed the "none" value in the type enum, because it was the same as having present=false. This made the enable/disable logic somewhat easier. - Now the ATA channel present parameters have a dependent_list which includes both the ATA channel parameters and also the ATA device parameters that are on that channel. This way, when you disable the ATA channel, the devices on the channel will be disabled too. I am using the dependent_list instead of the callback function that calls set_enable because it allows wxWindows to do the enable/disables without any special code to handle each case. - a few changes relating to bx_param_num_c::update_dependents(): - don't allow a parameter to disable itself. This allows the "present" param to be included in its own dependency list without danger of disabling itself forever. - before, if a param with dependents had a value of zero, it would disable its dependent parameters. Now it will also disable its dependents if the param itself is disabled. - when a parameter with dependents is enabled/disabled, it now calls update_dependents() as well. Before this only happened when the value was changed. - add clone() method of bx_list_c, which makes a copy. I could not use the dependent_list trick to handle the "type" field of the ATA devices. When type=disk, it's supposed to enable cylinders, heads, and spt, but when type=cdrom, it's supposed to disable C/H/S and enable the inserted/ejected param instead. There's currently no way to do this with dependent_list, so I left this behavior in the bx_param_handler callback function. The problem with using callback functions to handle the enabling of other parameters (and the reason that I've been moving away from them for this purpose) is that in a GUI dialog box, you don't want to change any parameter value until the user presses "Ok". If callback functions control the enabling of other parameters, I cannot know which parts of the dialog to enable/disable without modifying the parameter with set(). Possible solutions: 1) have the dialog box code remember the old value of every param, to be able to implement Cancel. 2) in each param structure, remember the new value and the previous value. Then if the user presses cancel, I can revert each param back to its previous value. 3) for special cases such as enabling C/H/S when type=disk, duplicate the enable/disable code in each implementation of the user interface. Patch was created with: diff -ur between two directories Apply patch to what version: current cvs, with Christophe Bothamy's patch.4ata-channels already applied Instructions: To patch, go to main bochs directory. Type "patch -p1 < THIS_PATCH_FILE". ---------------------------------------------------------------------- diff -ur -x *CVS* -x .conf* -x .#* fourata-clean/gui/siminterface.cc fourata/gui/siminterface.cc --- fourata-clean/gui/siminterface.cc Tue Sep 17 09:21:00 2002 +++ fourata/gui/siminterface.cc Tue Sep 17 09:35:03 2002 @@ -354,8 +354,8 @@ int n_loader_os_names = 3; char *keyboard_type_names[] = { "xt", "at", "mf", NULL }; int n_keyboard_type_names = 3; -char *atadevice_type_names[] = { "none", "disk", "cdrom", NULL }; -int n_atadevice_type_names = 3; +char *atadevice_type_names[] = { "disk", "cdrom", NULL }; +int n_atadevice_type_names = 2; char *atadevice_status_names[] = { "ejected", "inserted", NULL }; int n_atadevice_status_names = 2; char *atadevice_biosdetect_names[] = { "none", "auto", "cmos", NULL }; @@ -692,12 +692,22 @@ void bx_param_num_c::update_dependents () { if (dependent_list) { - int en = val.number? 1 : 0; - for (int i=0; i<dependent_list->get_size (); i++) - dependent_list->get (i)->set_enabled (en); + int en = val.number && enabled; + for (int i=0; i<dependent_list->get_size (); i++) { + bx_param_c *param = dependent_list->get (i); + if (param != this) + param->set_enabled (en); + } } } +void +bx_param_num_c::set_enabled (int en) +{ + bx_param_c::set_enabled (en); + update_dependents (); +} + bx_shadow_num_c::bx_shadow_num_c (bx_id id, char *name, char *description, @@ -1046,6 +1056,17 @@ this->parent = NULL; } +bx_list_c * +bx_list_c::clone () +{ + bx_list_c *newlist = new bx_list_c (BXP_NULL, name, description, maxsize); + for (int i=0; i<get_size (); i++) + newlist->add (get(i)); + newlist->set_options (get_options ()); + newlist->set_parent (get_parent ()); + return newlist; +} + void bx_list_c::add (bx_param_c *param) { @@ -1062,8 +1083,3 @@ return list[index]; } -void -bx_list_c::set_parent (bx_param_c *parent) -{ - this->parent = parent; -} diff -ur -x *CVS* -x .conf* -x .#* fourata-clean/gui/siminterface.h fourata/gui/siminterface.h --- fourata-clean/gui/siminterface.h Tue Sep 17 09:21:01 2002 +++ fourata/gui/siminterface.h Tue Sep 17 09:34:08 2002 @@ -145,7 +145,6 @@ BXP_FLOPPYB_TYPE, BXP_FLOPPYB_STATUS, BXP_FLOPPYB, - BXP_ATA0, BXP_ATA1, BXP_ATA2, @@ -254,7 +253,6 @@ BXP_ATA2_SLAVE_TRANSLATION, BXP_ATA3_MASTER_TRANSLATION, BXP_ATA3_SLAVE_TRANSLATION, - #define BXP_PARAMS_PER_SERIAL_PORT 2 BXP_COM1_ENABLED, BXP_COM1_PATH, @@ -760,7 +758,7 @@ char *get_name () { return name; } char *get_description () { return description; } int get_enabled () { return enabled; } - void set_enabled (int enabled) { this->enabled = enabled; } + virtual void set_enabled (int enabled) { this->enabled = enabled; } void reset () {} int getint () {return -1;} static const char* set_default_format (const char *f); @@ -804,6 +802,7 @@ dependent_list = l; update_dependents (); } + virtual void set_enabled (int enabled); virtual Bit32s get (); virtual void set (Bit32s val); void set_base (int base) { this->base = base; } @@ -988,13 +987,16 @@ bx_list_c (bx_id id, char *name, char *description, bx_param_c **init_list); bx_list_c (bx_id id, char *name, char *description, int maxsize); virtual ~bx_list_c(); + bx_list_c *clone (); void add (bx_param_c *param); bx_param_c *get (int index); int get_size () { return size; } bx_param_num_c *get_options () { return options; } + void set_options (bx_param_num_c *newopt) { options = newopt; } bx_param_num_c *get_choice () { return choice; } bx_param_string_c *get_title () { return title; } - void set_parent (bx_param_c *parent); + void set_parent (bx_param_c *newparent) { parent = newparent; } + bx_param_c *get_parent () { return parent; } #if BX_UI_TEXT virtual void text_print (FILE *); virtual int text_ask (FILE *fpin, FILE *fpout); @@ -1013,10 +1015,9 @@ #define BX_FLOPPY_LAST 15 // last legal value of floppy type #define BX_FLOPPY_GUESS 20 // decide based on image size -#define BX_ATA_DEVICE_NONE 0 -#define BX_ATA_DEVICE_DISK 1 -#define BX_ATA_DEVICE_CDROM 2 -#define BX_ATA_DEVICE_LAST 2 +#define BX_ATA_DEVICE_DISK 0 +#define BX_ATA_DEVICE_CDROM 1 +#define BX_ATA_DEVICE_LAST 1 #define BX_ATA_BIOSDETECT_NONE 0 #define BX_ATA_BIOSDETECT_AUTO 1 diff -ur -x *CVS* -x .conf* -x .#* fourata-clean/main.cc fourata/main.cc --- fourata-clean/main.cc Mon Sep 16 23:23:45 2002 +++ fourata/main.cc Tue Sep 17 09:37:26 2002 @@ -153,20 +153,6 @@ case BXP_KBD_PASTE_DELAY: if (set) bx_keyboard.paste_delay_changed (); break; - case BXP_ATA0_PRESENT: - case BXP_ATA1_PRESENT: - case BXP_ATA2_PRESENT: - case BXP_ATA3_PRESENT: - if (set) { - int channel = id - BXP_ATA0_PRESENT; - int enable = (val != 0); - - SIM->get_param ((bx_id)(BXP_ATA0_IOADDR1 + channel))->set_enabled (enable); - SIM->get_param ((bx_id)(BXP_ATA0_IOADDR2 + channel))->set_enabled (enable); - SIM->get_param ((bx_id)(BXP_ATA0_IRQ + channel))->set_enabled (enable); - } - break; - case BXP_ATA0_MASTER_TYPE: case BXP_ATA0_SLAVE_TYPE: case BXP_ATA1_MASTER_TYPE: @@ -178,17 +164,6 @@ if (set) { int device = id - BXP_ATA0_MASTER_TYPE; switch (val) { - case BX_ATA_DEVICE_NONE: - SIM->get_param_num ((bx_id)(BXP_ATA0_MASTER_PRESENT + device))->set (0); - SIM->get_param ((bx_id)(BXP_ATA0_MASTER_PATH + device))->set_enabled (0); - SIM->get_param ((bx_id)(BXP_ATA0_MASTER_CYLINDERS + device))->set_enabled (0); - SIM->get_param ((bx_id)(BXP_ATA0_MASTER_HEADS + device))->set_enabled (0); - SIM->get_param ((bx_id)(BXP_ATA0_MASTER_SPT + device))->set_enabled (0); - SIM->get_param ((bx_id)(BXP_ATA0_MASTER_STATUS + device))->set_enabled (0); - SIM->get_param ((bx_id)(BXP_ATA0_MASTER_MODEL + device))->set_enabled (0); - SIM->get_param ((bx_id)(BXP_ATA0_MASTER_BIOSDETECT + device))->set_enabled (0); - SIM->get_param ((bx_id)(BXP_ATA0_MASTER_TRANSLATION + device))->set_enabled (0); - break; case BX_ATA_DEVICE_DISK: SIM->get_param_num ((bx_id)(BXP_ATA0_MASTER_PRESENT + device))->set (1); SIM->get_param ((bx_id)(BXP_ATA0_MASTER_PATH + device))->set_enabled (1); @@ -445,249 +420,148 @@ bx_options.floppyb.Ostatus->set_handler (bx_param_handler); // disk options + + // FIXME use descr and name + char *s_atachannel[] = { + "ATA channel 0", + "ATA channel 1", + "ATA channel 2", + "ATA channel 3", + }; + char *s_atadevice[4][2] = { + { "Master ATA device on channel 0", + "Slave ATA device on channel 0" }, + { "Master ATA device on channel 1", + "Slave ATA device on channel 1" }, + { "Master ATA device on channel 2", + "Slave ATA device on channel 2" }, + { "Master ATA device on channel 3", + "Slave ATA device on channel 3" } + }; + Bit16u ata_default_ioaddr1[BX_MAX_ATA_CHANNEL] = { + 0x1f0, 0x170, 0x1e8, 0x168 + }; + Bit8u ata_default_irq[BX_MAX_ATA_CHANNEL] = { + 14, 15, 12, 11 + }; + + bx_list_c *ata[BX_MAX_ATA_CHANNEL]; + for (Bit8u channel=0; channel<BX_MAX_ATA_CHANNEL; channel ++) { - bx_options.ata[channel].Opresent = new bx_param_bool_c ((bx_id)(BXP_ATA0_PRESENT+channel), + ata[channel] = new bx_list_c ((bx_id)(BXP_ATA0+channel), s_atachannel[channel], s_atachannel[channel], 8); + ata[channel]->get_options ()->set (ata[channel]->BX_SERIES_ASK); + + ata[channel]->add (bx_options.ata[channel].Opresent = new bx_param_bool_c ((bx_id)(BXP_ATA0_PRESENT+channel), "ata:present", "Controls whether ata channel is installed or not", - 0); + 0)); - bx_options.ata[channel].Oioaddr1 = new bx_param_num_c ((bx_id)(BXP_ATA0_IOADDR1+channel), + ata[channel]->add (bx_options.ata[channel].Oioaddr1 = new bx_param_num_c ((bx_id)(BXP_ATA0_IOADDR1+channel), "ata:ioaddr1", "IO adress of ata command block", 0, 0xffff, - 0); + ata_default_ioaddr1[channel])); - bx_options.ata[channel].Oioaddr2 = new bx_param_num_c ((bx_id)(BXP_ATA0_IOADDR2+channel), + ata[channel]->add (bx_options.ata[channel].Oioaddr2 = new bx_param_num_c ((bx_id)(BXP_ATA0_IOADDR2+channel), "ata:ioaddr2", "IO adress of ata control block", 0, 0xffff, - 0); + ata_default_ioaddr1[channel] + 0x200)); - bx_options.ata[channel].Oirq = new bx_param_num_c ((bx_id)(BXP_ATA0_IRQ+channel), + ata[channel]->add (bx_options.ata[channel].Oirq = new bx_param_num_c ((bx_id)(BXP_ATA0_IRQ+channel), "ata:irq", "IRQ of ata ", 0, 15, - 0); + ata_default_irq[channel])); + + // all items in the ata[channel] menu depend on the present flag. + // The menu list is complete, but a few dependent_list items will + // be added later. Use clone() to make a copy of the dependent_list + // so that it can be changed without affecting the menu. + bx_options.ata[channel].Opresent->set_dependent_list ( + ata[channel]->clone()); for (Bit8u slave=0; slave<2; slave++) { - bx_options.atadevice[channel][slave].Otype = new bx_param_enum_c ((bx_id)(BXP_ATA0_MASTER_TYPE+channel*2+slave), - "ata-device:type", - "Type of ATA device", - atadevice_type_names, - BX_ATA_DEVICE_NONE, - BX_ATA_DEVICE_NONE); + menu = new bx_list_c ((bx_id)(BXP_ATA0_MASTER+channel*2+slave), s_atadevice[channel][slave], + s_atadevice[channel][slave], 12); + menu->get_options ()->set (menu->BX_SERIES_ASK); - bx_options.atadevice[channel][slave].Opresent = new bx_param_bool_c ((bx_id)(BXP_ATA0_MASTER_PRESENT+channel*2+slave), + menu->add (bx_options.atadevice[channel][slave].Opresent = new bx_param_bool_c ((bx_id)(BXP_ATA0_MASTER_PRESENT+channel*2+slave), "ata-device:present", "Controls whether ata device is installed or not", - 0); + 0)); + + menu->add (bx_options.atadevice[channel][slave].Otype = new bx_param_enum_c ((bx_id)(BXP_ATA0_MASTER_TYPE+channel*2+slave), + "ata-device:type", + "Type of ATA device", + atadevice_type_names, + BX_ATA_DEVICE_DISK, + BX_ATA_DEVICE_DISK)); - bx_options.atadevice[channel][slave].Opath = new bx_param_filename_c ((bx_id)(BXP_ATA0_MASTER_PATH+channel*2+slave), + menu->add (bx_options.atadevice[channel][slave].Opath = new bx_param_filename_c ((bx_id)(BXP_ATA0_MASTER_PATH+channel*2+slave), "ata-device:path", "Pathname of the image", - "", BX_PATHNAME_LEN); + "", BX_PATHNAME_LEN)); - bx_options.atadevice[channel][slave].Ocylinders = new bx_param_num_c ((bx_id)(BXP_ATA0_MASTER_CYLINDERS+channel*2+slave), + menu->add (bx_options.atadevice[channel][slave].Ocylinders = new bx_param_num_c ((bx_id)(BXP_ATA0_MASTER_CYLINDERS+channel*2+slave), "ata-device:cylinders", "Number of cylinders", 0, 65535, - 0); - bx_options.atadevice[channel][slave].Oheads = new bx_param_num_c ((bx_id)(BXP_ATA0_MASTER_HEADS+channel*2+slave), + 0)); + menu->add (bx_options.atadevice[channel][slave].Oheads = new bx_param_num_c ((bx_id)(BXP_ATA0_MASTER_HEADS+channel*2+slave), "ata-device:heads", "Number of heads", 0, 65535, - 0); - bx_options.atadevice[channel][slave].Ospt = new bx_param_num_c ((bx_id)(BXP_ATA0_MASTER_SPT+channel*2+slave), + 0)); + menu->add (bx_options.atadevice[channel][slave].Ospt = new bx_param_num_c ((bx_id)(BXP_ATA0_MASTER_SPT+channel*2+slave), "ata-device:spt", "Number of sectors per track", 0, 65535, - 0); + 0)); - bx_options.atadevice[channel][slave].Ostatus = new bx_param_enum_c ((bx_id)(BXP_ATA0_MASTER_STATUS+channel*2+slave), + menu->add (bx_options.atadevice[channel][slave].Ostatus = new bx_param_enum_c ((bx_id)(BXP_ATA0_MASTER_STATUS+channel*2+slave), "ata-device:status", "Inserted or ejected", atadevice_status_names, BX_INSERTED, - BX_EJECTED); + BX_EJECTED)); - bx_options.atadevice[channel][slave].Omodel = new bx_param_string_c ((bx_id)(BXP_ATA0_MASTER_MODEL+channel*2+slave), + menu->add (bx_options.atadevice[channel][slave].Omodel = new bx_param_string_c ((bx_id)(BXP_ATA0_MASTER_MODEL+channel*2+slave), "ata-device:model", "Model name", - "Generic 1234", 40); + "Generic 1234", 40)); - bx_options.atadevice[channel][slave].Obiosdetect = new bx_param_enum_c ((bx_id)(BXP_ATA0_MASTER_BIOSDETECT+channel*2+slave), + menu->add (bx_options.atadevice[channel][slave].Obiosdetect = new bx_param_enum_c ((bx_id)(BXP_ATA0_MASTER_BIOSDETECT+channel*2+slave), "ata-device:biosdetect", "Type of bios detection", atadevice_biosdetect_names, BX_ATA_BIOSDETECT_AUTO, - BX_ATA_BIOSDETECT_NONE); + BX_ATA_BIOSDETECT_NONE)); - bx_options.atadevice[channel][slave].Otranslation = new bx_param_enum_c ((bx_id)(BXP_ATA0_MASTER_TRANSLATION+channel*2+slave), + menu->add (bx_options.atadevice[channel][slave].Otranslation = new bx_param_enum_c ((bx_id)(BXP_ATA0_MASTER_TRANSLATION+channel*2+slave), "How the ata-disk translation is done by the bios", "Type of translation", atadevice_translation_names, BX_ATA_TRANSLATION_LBA, - BX_ATA_TRANSLATION_NONE); + BX_ATA_TRANSLATION_NONE)); + bx_options.atadevice[channel][slave].Opresent->set_dependent_list (menu); + bx_options.ata[channel].Opresent->get_dependent_list()->add (menu); + //bx_options.ata[channel].Opresent->get_dependent_list()->add ( + //bx_options.atadevice[channel][slave].Opresent); } } - // Set initial values (enabled, std ports & irq) for first ata interface + // Enable first ata interface by default, disable the others. bx_options.ata[0].Opresent->set_initial_val(1); - bx_options.ata[0].Oioaddr1->set_initial_val(0x1f0); - bx_options.ata[0].Oioaddr2->set_initial_val(0x3f0); - bx_options.ata[0].Oirq->set_initial_val(14); - - // FIXME use descr and name - char *s_atachannel[] = { - "ATA channel 0", - "ATA channel 1", - "ATA channel 2", - "ATA channel 3", - }; - char *s_atadevice[][2] = { - "Master ATA device on channel 0", - "Slave ATA device on channel 0", - "Master ATA device on channel 1", - "Slave ATA device on channel 1", - "Master ATA device on channel 2", - "Slave ATA device on channel 2", - "Master ATA device on channel 3", - "Slave ATA device on channel 3", - }; - bx_param_c *atachannel_init_list[BX_MAX_ATA_CHANNEL][5] = { - { bx_options.ata[0].Opresent, - bx_options.ata[0].Oioaddr1, - bx_options.ata[0].Oioaddr2, - bx_options.ata[0].Oirq, - NULL - }, -#if BX_MAX_ATA_CHANNEL>1 - { bx_options.ata[1].Opresent, - bx_options.ata[1].Oioaddr1, - bx_options.ata[1].Oioaddr2, - bx_options.ata[1].Oirq, - NULL - }, -#endif -#if BX_MAX_ATA_CHANNEL>2 - { bx_options.ata[2].Opresent, - bx_options.ata[2].Oioaddr1, - bx_options.ata[2].Oioaddr2, - bx_options.ata[2].Oirq, - NULL - }, -#endif -#if BX_MAX_ATA_CHANNEL>3 - { bx_options.ata[3].Opresent, - bx_options.ata[3].Oioaddr1, - bx_options.ata[3].Oioaddr2, - bx_options.ata[3].Oirq, - NULL - }, -#endif - }; + // now that the dependence relationships are established, call set() on + // the ata device present params to set all enables correctly. + for (i=0; i<BX_MAX_ATA_CHANNEL; i++) + bx_options.ata[i].Opresent->set (i==0); - bx_param_c *atadevice_init_list[BX_MAX_ATA_CHANNEL*2][10] = { - { bx_options.atadevice[0][0].Otype, - bx_options.atadevice[0][0].Opath, - bx_options.atadevice[0][0].Ocylinders, - bx_options.atadevice[0][0].Oheads, - bx_options.atadevice[0][0].Ospt, - bx_options.atadevice[0][0].Ostatus, - bx_options.atadevice[0][0].Omodel, - bx_options.atadevice[0][0].Obiosdetect, - bx_options.atadevice[0][0].Otranslation, - NULL - }, - { bx_options.atadevice[0][1].Otype, - bx_options.atadevice[0][1].Opath, - bx_options.atadevice[0][1].Ocylinders, - bx_options.atadevice[0][1].Oheads, - bx_options.atadevice[0][1].Ospt, - bx_options.atadevice[0][1].Ostatus, - bx_options.atadevice[0][1].Omodel, - bx_options.atadevice[0][1].Obiosdetect, - bx_options.atadevice[0][1].Otranslation, - NULL - }, -#if BX_MAX_ATA_CHANNEL>1 - { bx_options.atadevice[1][0].Otype, - bx_options.atadevice[1][0].Opath, - bx_options.atadevice[1][0].Ocylinders, - bx_options.atadevice[1][0].Oheads, - bx_options.atadevice[1][0].Ospt, - bx_options.atadevice[1][0].Ostatus, - bx_options.atadevice[1][0].Omodel, - bx_options.atadevice[1][0].Obiosdetect, - bx_options.atadevice[1][0].Otranslation, - NULL - }, - { bx_options.atadevice[1][1].Otype, - bx_options.atadevice[1][1].Opath, - bx_options.atadevice[1][1].Ocylinders, - bx_options.atadevice[1][1].Oheads, - bx_options.atadevice[1][1].Ospt, - bx_options.atadevice[1][1].Ostatus, - bx_options.atadevice[1][1].Omodel, - bx_options.atadevice[1][1].Obiosdetect, - bx_options.atadevice[1][1].Otranslation, - NULL - }, -#endif -#if BX_MAX_ATA_CHANNEL>2 - { bx_options.atadevice[2][0].Otype, - bx_options.atadevice[2][0].Opath, - bx_options.atadevice[2][0].Ocylinders, - bx_options.atadevice[2][0].Oheads, - bx_options.atadevice[2][0].Ospt, - bx_options.atadevice[2][0].Ostatus, - bx_options.atadevice[2][0].Omodel, - bx_options.atadevice[2][0].Obiosdetect, - bx_options.atadevice[2][0].Otranslation, - NULL - }, - { bx_options.atadevice[2][1].Otype, - bx_options.atadevice[2][1].Opath, - bx_options.atadevice[2][1].Ocylinders, - bx_options.atadevice[2][1].Oheads, - bx_options.atadevice[2][1].Ospt, - bx_options.atadevice[2][1].Ostatus, - bx_options.atadevice[2][1].Omodel, - bx_options.atadevice[2][1].Obiosdetect, - bx_options.atadevice[2][1].Otranslation, - NULL - }, -#endif -#if BX_MAX_ATA_CHANNEL>3 - { bx_options.atadevice[3][0].Otype, - bx_options.atadevice[3][0].Opath, - bx_options.atadevice[3][0].Ocylinders, - bx_options.atadevice[3][0].Oheads, - bx_options.atadevice[3][0].Ospt, - bx_options.atadevice[3][0].Ostatus, - bx_options.atadevice[3][0].Omodel, - bx_options.atadevice[3][0].Obiosdetect, - bx_options.atadevice[3][0].Otranslation, - NULL - }, - { bx_options.atadevice[3][1].Otype, - bx_options.atadevice[3][1].Opath, - bx_options.atadevice[3][1].Ocylinders, - bx_options.atadevice[3][1].Oheads, - bx_options.atadevice[3][1].Ospt, - bx_options.atadevice[3][1].Ostatus, - bx_options.atadevice[3][1].Omodel, - bx_options.atadevice[3][1].Obiosdetect, - bx_options.atadevice[3][1].Otranslation, - NULL - }, -#endif - }; - for (Bit8u channel=0; channel<BX_MAX_ATA_CHANNEL; channel ++) { bx_options.ata[channel].Opresent->set_ask_format ("Channel is enabled: [%s] "); @@ -701,14 +575,10 @@ bx_options.ata[channel].Oioaddr1->set_base (16); bx_options.ata[channel].Oioaddr2->set_base (16); - menu = new bx_list_c ((bx_id)(BXP_ATA0+channel), s_atachannel[channel], s_atachannel[channel], atachannel_init_list[channel]); - menu->get_options ()->set (menu->BX_SERIES_ASK); - - bx_options.ata[channel].Opresent->set_handler (bx_param_handler); - for (Bit8u slave=0; slave<2; slave++) { - bx_options.atadevice[channel][slave].Otype->set_ask_format ("Enter type of ATA device or 'none' for no device: [%s] "); + bx_options.atadevice[channel][slave].Opresent->set_ask_format ("Device is enabled: [%s] "); + bx_options.atadevice[channel][slave].Otype->set_ask_format ("Enter type of ATA device, disk or cdrom: [%s] "); bx_options.atadevice[channel][slave].Opath->set_ask_format ("Enter new filename: [%s] "); bx_options.atadevice[channel][slave].Ocylinders->set_ask_format ("Enter number of cylinders: [%d] "); bx_options.atadevice[channel][slave].Oheads->set_ask_format ("Enter number of heads: [%d] "); @@ -718,8 +588,9 @@ bx_options.atadevice[channel][slave].Otranslation->set_ask_format ("Enter translation type: [%s]"); bx_options.atadevice[channel][slave].Obiosdetect->set_ask_format ("Enter bios detection type: [%s]"); - bx_options.atadevice[channel][slave].Otype->set_format ("%s"); - bx_options.atadevice[channel][slave].Opath->set_format (" on %s"); + bx_options.atadevice[channel][slave].Opresent->set_format ("enabled: %s"); + bx_options.atadevice[channel][slave].Otype->set_format (", %s"); + bx_options.atadevice[channel][slave].Opath->set_format (" on '%s'"); bx_options.atadevice[channel][slave].Ocylinders->set_format (", %d cylinders"); bx_options.atadevice[channel][slave].Oheads->set_format (", %d heads"); bx_options.atadevice[channel][slave].Ospt->set_format (", %d sectors/track"); @@ -728,12 +599,7 @@ bx_options.atadevice[channel][slave].Otranslation->set_format (", translation '%s'"); bx_options.atadevice[channel][slave].Obiosdetect->set_format (", biosdetect '%s'"); - menu = new bx_list_c ((bx_id)(BXP_ATA0_MASTER+channel*2+slave), s_atadevice[channel][slave], - s_atadevice[channel][slave], atadevice_init_list[channel*2+slave]); - menu->get_options ()->set (menu->BX_SERIES_ASK); - bx_options.atadevice[channel][slave].Otype->set_handler (bx_param_handler); - bx_options.atadevice[channel][slave].Otype->set(BX_ATA_DEVICE_NONE); bx_options.atadevice[channel][slave].Ostatus->set_handler (bx_param_handler); bx_options.atadevice[channel][slave].Opath->set_handler (bx_param_string_handler); |
From: Bryce D. <bd...@us...> - 2002-09-17 04:47:58
|
Update of /cvsroot/bochs/bochs/gui In directory usw-pr-cvs1:/tmp/cvs-serv26278/gui Modified Files: siminterface.cc siminterface.h Log Message: - move the dependent_list structure up the hierarchy to bx_param_num_c, instead of bx_param_bool_c. There are several cases where I need an enum to enable/disable some fields, and this change should allow that. - modified: gui/siminterface.h gui/siminterface.cc Index: siminterface.cc =================================================================== RCS file: /cvsroot/bochs/bochs/gui/siminterface.cc,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- siminterface.cc 16 Sep 2002 17:00:16 -0000 1.62 +++ siminterface.cc 17 Sep 2002 04:47:54 -0000 1.63 @@ -615,6 +615,9 @@ this->val.number = initial_val; this->handler = NULL; this->base = default_base; + // dependent_list must be initialized before the set(), + // because set calls update_dependents(). + dependent_list = NULL; set (initial_val); } @@ -665,6 +668,16 @@ } if (val.number < min || val.number > max) BX_PANIC (("numerical parameter %s was set to %d, which is out of range %d to %d", get_name (), val.number, min, max)); + if (dependent_list != NULL) update_dependents (); +} + +void bx_param_num_c::update_dependents () +{ + if (dependent_list) { + int en = val.number? 1 : 0; + for (int i=0; i<dependent_list->get_size (); i++) + dependent_list->get (i)->set_enabled (en); + } } bx_shadow_num_c::bx_shadow_num_c (bx_id id, @@ -790,19 +803,7 @@ : bx_param_num_c (id, name, description, 0, 1, initial_val) { set_type (BXT_PARAM_BOOL); - // dependent_list must be initialized before the set(), - // because set calls update_dependents(). - dependent_list = NULL; set (initial_val); -} - -void bx_param_bool_c::update_dependents () -{ - if (dependent_list) { - int en = val.number? 1 : 0; - for (int i=0; i<dependent_list->get_size (); i++) - dependent_list->get (i)->set_enabled (en); - } } bx_shadow_bool_c::bx_shadow_bool_c (bx_id id, Index: siminterface.h =================================================================== RCS file: /cvsroot/bochs/bochs/gui/siminterface.h,v retrieving revision 1.65 retrieving revision 1.66 diff -u -d -r1.65 -r1.66 --- siminterface.h 16 Sep 2002 15:28:18 -0000 1.65 +++ siminterface.h 17 Sep 2002 04:47:55 -0000 1.66 @@ -681,6 +681,12 @@ class bx_param_num_c : public bx_param_c { static Bit32u default_base; + // The dependent_list is initialized to NULL. If dependent_list is modified + // to point to a bx_list_c of other parameters, the set() method of + // bx_param_bool_c will enable those parameters when this bool is true, and + // disable them when this bool is false. + bx_list_c *dependent_list; + void update_dependents (); protected: Bit32s min, max, initial_val; union _uval_ { @@ -699,6 +705,11 @@ Bit32s min, Bit32s max, Bit32s initial_val); void reset (); void set_handler (param_event_handler handler); + bx_list_c *get_dependent_list () { return dependent_list; } + void set_dependent_list (bx_list_c *l) { + dependent_list = l; + update_dependents (); + } virtual Bit32s get (); virtual void set (Bit32s val); void set_base (int base) { this->base = base; } @@ -758,23 +769,11 @@ // many boolean variables are used to enable/disable modules. In the // user interface, the enable variable should enable/disable all the // other parameters associated with that module. - // The dependent_list is initialized to NULL. If dependent_list is modified - // to point to a bx_list_c of other parameters, the set() method of - // bx_param_bool_c will enable those parameters when this bool is true, and - // disable them when this bool is false. - bx_list_c *dependent_list; - void update_dependents (); public: bx_param_bool_c (bx_id id, char *name, char *description, Bit32s initial_val); - bx_list_c *get_dependent_list () { return dependent_list; } - void set_dependent_list (bx_list_c *l) { - dependent_list = l; - update_dependents (); - } - void set (Bit32s val) { bx_param_num_c::set (val); update_dependents (); } #if BX_UI_TEXT virtual void text_print (FILE *fp); virtual int text_ask (FILE *fpin, FILE *fpout); |
From: Kevin P L. <kev...@us...> - 2002-09-17 04:20:45
|
Update of /cvsroot/bochs/bochs/cpu In directory usw-pr-cvs1:/tmp/cvs-serv20538/cpu Modified Files: cpu.h fetchdecode.cc fetchdecode64.cc Log Message: Got rid of a couple fields in BxInstruction_t that were no longer used. Also rearranged that struct a little to be more compressed. Over time, I'm going to reduce it further, for use with future accelerations. Index: cpu.h =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/cpu.h,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- cpu.h 16 Sep 2002 20:23:38 -0000 1.57 +++ cpu.h 17 Sep 2002 04:20:42 -0000 1.58 @@ -645,6 +645,7 @@ typedef void * (*BxVoidFPtr_t)(void); class BX_CPU_C; + typedef struct BxInstruction_tag { // prefix stuff here... unsigned attr; // attribute from fetchdecode @@ -652,33 +653,40 @@ unsigned os_32, as_32; // OperandSize/AddressSize is 32bit unsigned rep_used; unsigned seg; +#if BX_SUPPORT_X86_64 + unsigned os_64, as_64; // OperandSize/AddressSize is 64bit (overrides os_32/as_32) + unsigned extend8bit; +#else + enum { os_64=0, as_64=0 }; // x86-32: hardcode to 0. +#endif + unsigned modrm; // mod-nnn-r/m byte unsigned mod; unsigned nnn; unsigned rm; - Bit16u displ16u; // for 16-bit modrm forms - Bit32u displ32u; // for 32-bit modrm forms unsigned sib; // scale-index-base (2nd modrm byte) unsigned scale; unsigned index; unsigned base; - Bit32u addr_displacement; // address displacement - bx_address rm_addr; - Bit32u Id; - Bit16u Iw; - Bit8u Ib; - Bit8u Ib2; // for ENTER_IwIb - Bit16u Iw2; // for JMP_Ap + union { + Bit16u displ16u; // for 16-bit modrm forms + Bit32u displ32u; // for 32-bit modrm forms + }; + union { #if BX_SUPPORT_X86_64 - Bit64u Iq; // for MOV Rx,imm64 - unsigned os_64, as_64; // OperandSize/AddressSize is 64bit (overrides os_32/as_32) - unsigned extend8bit; -#else - enum { os_64=0, as_64=0 }; // x86-32: hardcode to 0. - //static const unsigned extend8bit=0; // x86-32: hardcode to 0. + Bit64u Iq; // for MOV Rx,imm64 #endif + Bit32u Id; + Bit16u Iw; + Bit8u Ib; + }; + union { + Bit8u Ib2; // for ENTER_IwIb + Bit16u Iw2; // for JMP_Ap + }; + + bx_address rm_addr; unsigned ilen; // instruction length - unsigned flags_in, flags_out; // flags needed, flags modified #if BX_USE_CPU_SMF void (*ResolveModrm)(BxInstruction_tag *); @@ -687,16 +695,8 @@ void (BX_CPU_C::*ResolveModrm)(BxInstruction_tag *); void (BX_CPU_C::*execute)(BxInstruction_tag *); #endif - -#if BX_DYNAMIC_TRANSLATION - BxVoidFPtr_t DTResolveModrm; -#endif -#if BX_DYNAMIC_TRANSLATION - unsigned DTAttr; - Bit8u * (*DTFPtr)(Bit8u *, BxInstruction_tag *); - unsigned DTMemRegsUsed; -#endif } BxInstruction_t; + #if BX_USE_CPU_SMF typedef void (*BxExecutePtr_t)(BxInstruction_t *); Index: fetchdecode.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/fetchdecode.cc,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- fetchdecode.cc 13 Sep 2002 23:59:24 -0000 1.10 +++ fetchdecode.cc 17 Sep 2002 04:20:42 -0000 1.11 @@ -1942,8 +1942,6 @@ instruction->b1 = b1; instruction->ilen = ilen; - //instruction->flags_in = 0; // for now - //instruction->flags_out = 0; // for now return(1); } Index: fetchdecode64.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/fetchdecode64.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- fetchdecode64.cc 13 Sep 2002 15:53:22 -0000 1.1 +++ fetchdecode64.cc 17 Sep 2002 04:20:42 -0000 1.2 @@ -2664,8 +2664,6 @@ instruction->b1 = b1; instruction->ilen = ilen; - //instruction->flags_in = 0; // for now - //instruction->flags_out = 0; // for now return(1); } |
From: Kevin P L. <kev...@us...> - 2002-09-16 21:55:59
|
Update of /cvsroot/bochs/bochs In directory usw-pr-cvs1:/tmp/cvs-serv20672 Modified Files: configure configure.in Log Message: Added a configure option, "--enable-pae". The x86-64 enhancements already had Physical Address Extensions support - we can now compile for PAE support for x86-32 mode as well. Index: configure =================================================================== RCS file: /cvsroot/bochs/bochs/configure,v retrieving revision 1.109 retrieving revision 1.110 diff -u -d -r1.109 -r1.110 --- configure 16 Sep 2002 21:01:45 -0000 1.109 +++ configure 16 Sep 2002 21:55:56 -0000 1.110 @@ -44,6 +44,8 @@ ac_help="$ac_help --enable-4meg-pages support 4Megabyte pages extensions" ac_help="$ac_help + --enable-pae support Physical Address Extensions" +ac_help="$ac_help --enable-guest2host-tlb support guest to host addr TLB for speed" ac_help="$ac_help --enable-repeat-speedups support repeated IO and mem copy speedups" @@ -659,7 +661,7 @@ fi [...2085 lines suppressed...] #define BX_SUPPORT_4MEG_PAGES 1 EOF @@ -6107,7 +6129,7 @@ # Extract the first word of "gzip", so it can be a program name with args. set dummy gzip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:6111: checking for $ac_word" >&5 +echo "configure:6133: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GZIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -6142,7 +6164,7 @@ # Extract the first word of "tar", so it can be a program name with args. set dummy tar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:6146: checking for $ac_word" >&5 +echo "configure:6168: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_TAR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else Index: configure.in =================================================================== RCS file: /cvsroot/bochs/bochs/configure.in,v retrieving revision 1.111 retrieving revision 1.112 diff -u -d -r1.111 -r1.112 --- configure.in 16 Sep 2002 20:39:32 -0000 1.111 +++ configure.in 16 Sep 2002 21:55:56 -0000 1.112 @@ -586,20 +586,38 @@ AC_SUBST(PCI_OBJ) -support_big_pages=0 +support_pse=0 AC_MSG_CHECKING(for 4Meg pages support) AC_ARG_ENABLE(4meg-pages, [ --enable-4meg-pages support 4Megabyte pages extensions], [if test "$enableval" = yes; then AC_MSG_RESULT(yes) - support_big_pages=1 + support_pse=1 else AC_MSG_RESULT(no) - support_big_pages=0 + support_pse=0 fi], [ AC_MSG_RESULT(no) - support_big_pages=0 + support_pse=0 + ] + ) + + +support_pae=0 +AC_MSG_CHECKING(for PAE support) +AC_ARG_ENABLE(pae, + [ --enable-pae support Physical Address Extensions], + [if test "$enableval" = yes; then + AC_MSG_RESULT(yes) + support_pae=1 + else + AC_MSG_RESULT(no) + support_pae=0 + fi], + [ + AC_MSG_RESULT(no) + support_pae=0 ] ) @@ -1660,7 +1678,6 @@ if test ! -d build; then mkdir build; fi if test ! -d build/linux; then mkdir build/linux; fi -support_pae=0 if test "$use_x86_64" = 1; then # For x86-64, force support of the Physical Address Extension (PAE), # and Page Global Extension (PGE. @@ -1669,9 +1686,7 @@ echo 'Because X86-64 is enabled, enabling Page Size Extension (PSE).' support_pae=1 support_global_pages=1 - support_big_pages=1 -else - support_pae=0 # Not an option yet for x86-32. + support_pse=1 fi if test "$support_global_pages" = 1; then @@ -1686,7 +1701,7 @@ AC_DEFINE(BX_SupportPAE, 0) fi -if test "$support_big_pages" = 1; then +if test "$support_pse" = 1; then AC_DEFINE(BX_SUPPORT_4MEG_PAGES, 1) else AC_DEFINE(BX_SUPPORT_4MEG_PAGES, 0) |
From: Kevin P L. <kev...@us...> - 2002-09-16 21:55:59
|
Update of /cvsroot/bochs/bochs/cpu In directory usw-pr-cvs1:/tmp/cvs-serv20672/cpu Modified Files: paging.cc Log Message: Added a configure option, "--enable-pae". The x86-64 enhancements already had Physical Address Extensions support - we can now compile for PAE support for x86-32 mode as well. Index: paging.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/paging.cc,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- paging.cc 16 Sep 2002 21:10:31 -0000 1.25 +++ paging.cc 16 Sep 2002 21:55:57 -0000 1.26 @@ -571,7 +571,7 @@ InstrTLB_Increment(tlbLookups); InstrTLB_Stats(); -#if BX_SUPPORT_X86_64 +#if BX_SupportPAE if (BX_CPU_THIS_PTR cr4.get_PAE()) { Bit32u pdp, pdp_addr; @@ -601,6 +601,7 @@ // note - we assume physical memory < 4gig so for brevity & speed, we'll use // 32 bit entries although cr3 is expanded to 64 bits. +#if BX_SUPPORT_X86_64 if (BX_CPU_THIS_PTR msr.lma) { Bit32u pml4, pml4_addr; // Get PML4 entry @@ -621,7 +622,9 @@ pdp_addr = (pml4 & 0xfffff000) | ((laddr & BX_CONST64(0x0000007fc0000000)) >> 27); } - else { + else +#endif + { pdp_addr = (BX_CPU_THIS_PTR cr3 & 0xfffff000) | ((laddr & 0xc0000000) >> 27); } @@ -769,10 +772,10 @@ return(paddress); } -#endif // #if BX_SUPPORT_X86_64 +#endif // #if BX_SupportPAE - // {CR4.PAE==0, MSR.LMA==0} + // CR4.PAE==0 (and MSR.LMA==0) lpf = laddr & 0xfffff000; // linear page frame poffset = laddr & 0x00000fff; // physical offset |
From: Kevin P L. <kev...@us...> - 2002-09-16 21:10:34
|
Update of /cvsroot/bochs/bochs/cpu In directory usw-pr-cvs1:/tmp/cvs-serv7193/cpu Modified Files: paging.cc Log Message: Fixed cpu/paging.cc for non-global-pages support compile. Index: paging.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/paging.cc,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- paging.cc 16 Sep 2002 21:01:55 -0000 1.24 +++ paging.cc 16 Sep 2002 21:10:31 -0000 1.25 @@ -502,8 +502,9 @@ if (BX_CPU_THIS_PTR TLB.entry[i].lpf != BX_INVALID_TLB_ENTRY) { #if BX_SupportGlobalPages if ( invalidateGlobal || - !(BX_CPU_THIS_PTR TLB.entry[i].accessBits & 0x100) ) { + !(BX_CPU_THIS_PTR TLB.entry[i].accessBits & 0x100) ) #endif + { BX_CPU_THIS_PTR TLB.entry[i].lpf = BX_INVALID_TLB_ENTRY; InstrTLB_Increment(tlbEntryFlushes); // A TLB entry flush occurred. } |
From: Kevin P L. <kev...@us...> - 2002-09-16 21:01:58
|
Update of /cvsroot/bochs/bochs/cpu In directory usw-pr-cvs1:/tmp/cvs-serv4019/cpu Modified Files: paging.cc Log Message: Ooops, cpu/paging.cc was hosed on that last commit. Fixed that. Index: paging.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/paging.cc,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- paging.cc 16 Sep 2002 20:23:38 -0000 1.23 +++ paging.cc 16 Sep 2002 21:01:55 -0000 1.24 @@ -871,11 +871,7 @@ #else // 486+ combined_access = (pde & pte) & 0x06; // U/S and R/W #if BX_SupportGlobalPages -<<<<<<< paging.cc - if (BX_CPU_THIS_PTR cr4.get_PGE()) // PGE==1 -======= - if (BX_CPU_THIS_PTR cr4.get_PGE ()) ->>>>>>> 1.22 + if (BX_CPU_THIS_PTR cr4.get_PGE()) combined_access |= (pte & 0x100); // G #endif #endif @@ -985,144 +981,7 @@ #warning "Fix dbg_xlate_linear2phy for 64-bit and new features." #endif -<<<<<<< paging.cc -======= - priv_index = -#if BX_CPU_LEVEL >= 4 - (BX_CPU_THIS_PTR cr0.wp<<4) | // bit 4 -#endif - (pl<<3) | // bit 3 - (combined_access & 0x06); // bit 2,1 - // bit 0 always 0 (fetch==read) - - if (!priv_check[priv_index]) { - error_code = 0x00000001; // RSVD=0, P=1 - goto page_fault_access; - } - - // make up the physical frame number - ppf = (pde & 0xFFC00000) | (laddr & 0x003FF000); - - // Update PDE if A/D bits if needed. - if ( (pde & 0x20)==0 ) { - pde |= 0x20; // Update A and possibly D bits - BX_CPU_THIS_PTR mem->writePhysicalPage(this, pde_addr, 4, &pde); - } - } - - // Else normal 4Kbyte page... - else -#endif - { - Bit32u pte, pte_addr; - -#if (BX_CPU_LEVEL < 6) - // update PDE if A bit was not set before - if ( !(pde & 0x20) ) { - pde |= 0x20; - BX_CPU_THIS_PTR mem->writePhysicalPage(this, pde_addr, 4, &pde); - } -#endif - - // Get page table entry - pte_addr = (pde & 0xfffff000) | - ((laddr & 0x003ff000) >> 10); - BX_CPU_THIS_PTR mem->readPhysicalPage(this, pte_addr, 4, &pte); - - if ( !(pte & 0x01) ) { - // Page Table Entry NOT present - error_code = 0x00000000; // RSVD=0, P=0 - goto page_fault_not_present; - } - - // 386 and 486+ have different bahaviour for combining - // privilege from PDE and PTE. -#if BX_CPU_LEVEL == 3 - combined_access = (pde | pte) & 0x04; // U/S - combined_access |= (pde & pte) & 0x02; // R/W -#else // 486+ - combined_access = (pde & pte) & 0x06; // U/S and R/W -#if BX_SupportGlobalPages - if (BX_CPU_THIS_PTR cr4.get_PGE ()) - combined_access |= (pte & 0x100); // G -#endif -#endif - priv_index = -#if BX_CPU_LEVEL >= 4 - (BX_CPU_THIS_PTR cr0.wp<<4) | // bit 4 -#endif - (pl<<3) | // bit 3 - (combined_access & 0x06); // bit 2,1 - // bit 0 always 0 (fetch==read) - - if (!priv_check[priv_index]) { - error_code = 0x00000001; // RSVD=0, P=1 - goto page_fault_access; - } - - ppf = pte & 0xfffff000; - -#if (BX_CPU_LEVEL >= 6) - // update PDE if A bit was not set before - if ( !(pde & 0x20) ) { - pde |= 0x20; - BX_CPU_THIS_PTR mem->writePhysicalPage(this, pde_addr, 4, &pde); - } -#endif - - // Update PTE if A/D bits if needed. - if ( (pte & 0x20)==0 ) { - pte |= 0x20; // Update A and possibly D bits - BX_CPU_THIS_PTR mem->writePhysicalPage(this, pte_addr, 4, &pte); - } - } - - // Calculate physical memory address and fill in TLB cache entry - paddress = ppf | poffset; - - BX_CPU_THIS_PTR TLB.entry[TLB_index].lpf = BX_TLB_LPF_VALUE(lpf); - BX_CPU_THIS_PTR TLB.entry[TLB_index].ppf = ppf; - -// 1 << ((W<<1) | U) -// b0: Read Sys OK -// b1: Read User OK -// b2: Write Sys OK -// b3: Write User OK - if ( combined_access & 4 ) { // User - accessBits = 0x3; // User priv; read from {user,sys} OK. - } - else { // System - accessBits = 0x1; // System priv; read from {sys} OK. - } -#if BX_SupportGlobalPages - accessBits |= combined_access & 0x100; // Global bit -#endif - BX_CPU_THIS_PTR TLB.entry[TLB_index].accessBits = accessBits; - -#if BX_SupportGuest2HostTLB - BX_CPU_THIS_PTR TLB.entry[TLB_index].hostPageAddr = - (Bit32u) BX_CPU_THIS_PTR mem->getHostMemAddr(A20ADDR(ppf), BX_READ); -#endif - - return(paddress); - - -page_fault_access: -page_fault_not_present: - - error_code |= (pl << 2); - BX_CPU_THIS_PTR cr2 = laddr; - // Invalidate TLB entry. - BX_CPU_THIS_PTR TLB.entry[TLB_index].lpf = BX_INVALID_TLB_ENTRY; - exception(BX_PF_EXCEPTION, error_code, 0); - return(0); // keep compiler happy -} - - -#if BX_DEBUGGER || BX_DISASM || BX_INSTRUMENTATION - ->>>>>>> 1.22 void BX_CPU_C::dbg_xlate_linear2phy(Bit32u laddr, Bit32u *phy, Boolean *valid) { |
From: Kevin P L. <kev...@us...> - 2002-09-16 21:01:57
|
Update of /cvsroot/bochs/bochs In directory usw-pr-cvs1:/tmp/cvs-serv4019 Modified Files: configure Log Message: Ooops, cpu/paging.cc was hosed on that last commit. Fixed that. Index: configure =================================================================== RCS file: /cvsroot/bochs/bochs/configure,v retrieving revision 1.108 retrieving revision 1.109 diff -u -d -r1.108 -r1.109 --- configure 16 Sep 2002 20:39:30 -0000 1.108 +++ configure 16 Sep 2002 21:01:45 -0000 1.109 @@ -623,7 +623,7 @@ fi -# From configure.in Id: configure.in,v 1.110 2002/09/16 20:23:38 kevinlawton Exp +# From configure.in Id: configure.in,v 1.111 2002/09/16 20:39:32 kevinlawton Exp VERSION="1.4.cvs" |
From: Kevin P L. <kev...@us...> - 2002-09-16 20:41:14
|
Update of /cvsroot/bochs/bochs In directory usw-pr-cvs1:/tmp/cvs-serv29299 Modified Files: Makefile.in Log Message: Removed more references to cpu64 stuff in Makefile.in. Index: Makefile.in =================================================================== RCS file: /cvsroot/bochs/bochs/Makefile.in,v retrieving revision 1.82 retrieving revision 1.83 diff -u -d -r1.82 -r1.83 --- Makefile.in 16 Sep 2002 20:23:37 -0000 1.82 +++ Makefile.in 16 Sep 2002 20:41:11 -0000 1.83 @@ -214,11 +214,6 @@ $(MAKE) $(MDEFINES) libcpu.a @CD_UP_ONE@ -cpu64/libcpu.a:: - cd cpu64 @COMMAND_SEPARATOR@ - $(MAKE) $(MDEFINES) libcpu.a - @CD_UP_ONE@ - memory/libmemory.a:: cd memory @COMMAND_SEPARATOR@ $(MAKE) $(MDEFINES) libmemory.a @@ -404,9 +399,6 @@ cd cpu @COMMAND_SEPARATOR@ $(MAKE) clean @CD_UP_ONE@ - cd cpu64 @COMMAND_SEPARATOR@ - $(MAKE) clean - @CD_UP_ONE@ cd memory @COMMAND_SEPARATOR@ $(MAKE) clean @CD_UP_ONE@ @@ -440,9 +432,6 @@ $(MAKE) dist-clean @CD_UP_ONE@ cd cpu @COMMAND_SEPARATOR@ - $(MAKE) dist-clean - @CD_UP_ONE@ - cd cpu64 @COMMAND_SEPARATOR@ $(MAKE) dist-clean @CD_UP_ONE@ cd memory @COMMAND_SEPARATOR@ |
From: Kevin P L. <kev...@us...> - 2002-09-16 20:39:34
|
Update of /cvsroot/bochs/bochs In directory usw-pr-cvs1:/tmp/cvs-serv28470 Modified Files: configure configure.in Log Message: Removed reference to cpu64/Makefile in the last generation stage of configure. Index: configure =================================================================== RCS file: /cvsroot/bochs/bochs/configure,v retrieving revision 1.107 retrieving revision 1.108 diff -u -d -r1.107 -r1.108 --- configure 16 Sep 2002 20:23:38 -0000 1.107 +++ configure 16 Sep 2002 20:39:30 -0000 1.108 @@ -623,7 +623,7 @@ fi -# From configure.in Id: configure.in,v 1.109 2002/09/16 19:17:51 vruppert Exp +# From configure.in Id: configure.in,v 1.110 2002/09/16 20:23:38 kevinlawton Exp VERSION="1.4.cvs" @@ -5313,11 +5313,7 @@ CXXFP="" CFP="" OFP="-o " -# (KPL) Changed following. Loader was not finding symbols between -# cpu and cpu64 directory due to circular dependencies. MAKELIB="ar rv \$@" -#MAKELIB="ld -i -o \$@" -#RANLIB="echo" RMCOMMAND="rm -f " LINK="\$(CXX) -o \$@ \$(CXXFLAGS)" EXE="" @@ -5329,10 +5325,10 @@ INSTALL_LIST_FOR_PLATFORM= echo $ac_n "checking for default gui on this platform""... $ac_c" 1>&6 -echo "configure:5333: checking for default gui on this platform" >&5 +echo "configure:5329: checking for default gui on this platform" >&5 echo "$ac_t""$DEFAULT_GUI" 1>&6 echo $ac_n "checking for gui library to use""... $ac_c" 1>&6 -echo "configure:5336: checking for gui library to use" >&5 +echo "configure:5332: checking for gui library to use" >&5 # the $with_* variable tells the gui library to use, but does NOT necessarily # indicate the platform. Settings that depend on the platform should be @@ -5542,7 +5538,7 @@ if test "$use_curses" = yes; then echo $ac_n "checking for mvaddch in -lcurses""... $ac_c" 1>&6 -echo "configure:5546: checking for mvaddch in -lcurses" >&5 +echo "configure:5542: checking for mvaddch in -lcurses" >&5 ac_lib_var=`echo curses'_'mvaddch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -5550,7 +5546,7 @@ ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat > conftest.$ac_ext <<EOF -#line 5554 "configure" +#line 5550 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -5561,7 +5557,7 @@ mvaddch() ; return 0; } EOF -if { (eval echo configure:5565: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -5582,7 +5578,7 @@ fi echo $ac_n "checking for mvaddch in -lncurses""... $ac_c" 1>&6 -echo "configure:5586: checking for mvaddch in -lncurses" >&5 +echo "configure:5582: checking for mvaddch in -lncurses" >&5 ac_lib_var=`echo ncurses'_'mvaddch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -5590,7 +5586,7 @@ ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <<EOF -#line 5594 "configure" +#line 5590 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -5601,7 +5597,7 @@ mvaddch() ; return 0; } EOF -if { (eval echo configure:5605: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5601: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -5622,7 +5618,7 @@ fi echo $ac_n "checking for mvaddch in -ltermlib""... $ac_c" 1>&6 -echo "configure:5626: checking for mvaddch in -ltermlib" >&5 +echo "configure:5622: checking for mvaddch in -ltermlib" >&5 ac_lib_var=`echo termlib'_'mvaddch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -5630,7 +5626,7 @@ ac_save_LIBS="$LIBS" LIBS="-ltermlib $LIBS" cat > conftest.$ac_ext <<EOF -#line 5634 "configure" +#line 5630 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -5641,7 +5637,7 @@ mvaddch() ; return 0; } EOF -if { (eval echo configure:5645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5641: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -5683,17 +5679,17 @@ # If it isn't, don't bother looking for the threads libraries. ac_safe=`echo "pthread.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for pthread.h""... $ac_c" 1>&6 -echo "configure:5687: checking for pthread.h" >&5 +echo "configure:5683: checking for pthread.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 5692 "configure" +#line 5688 "configure" #include "confdefs.h" #include <pthread.h> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:5697: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5693: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -5731,9 +5727,9 @@ save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" echo $ac_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS""... $ac_c" 1>&6 -echo "configure:5735: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +echo "configure:5731: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 cat > conftest.$ac_ext <<EOF -#line 5737 "configure" +#line 5733 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -5744,7 +5740,7 @@ pthread_join() ; return 0; } EOF -if { (eval echo configure:5748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* acx_pthread_ok=yes else @@ -5806,18 +5802,18 @@ case $flag in none) echo $ac_n "checking whether pthreads work without any flags""... $ac_c" 1>&6 -echo "configure:5810: checking whether pthreads work without any flags" >&5 +echo "configure:5806: checking whether pthreads work without any flags" >&5 ;; -*) echo $ac_n "checking whether pthreads work with $flag""... $ac_c" 1>&6 -echo "configure:5815: checking whether pthreads work with $flag" >&5 +echo "configure:5811: checking whether pthreads work with $flag" >&5 PTHREAD_CFLAGS="$flag" ;; *) echo $ac_n "checking for the pthreads library -l$flag""... $ac_c" 1>&6 -echo "configure:5821: checking for the pthreads library -l$flag" >&5 +echo "configure:5817: checking for the pthreads library -l$flag" >&5 PTHREAD_LIBS="-l$flag" ;; esac @@ -5837,7 +5833,7 @@ # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat > conftest.$ac_ext <<EOF -#line 5841 "configure" +#line 5837 "configure" #include "confdefs.h" #include <pthread.h> int main() { @@ -5846,7 +5842,7 @@ pthread_create(0,0,0,0); pthread_cleanup_pop(0); ; return 0; } EOF -if { (eval echo configure:5850: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5846: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* acx_pthread_ok=yes else @@ -5878,16 +5874,16 @@ # Detect AIX lossage: threads are created detached by default # and the JOINABLE attribute has a nonstandard name (UNDETACHED). echo $ac_n "checking for joinable pthread attribute""... $ac_c" 1>&6 -echo "configure:5882: checking for joinable pthread attribute" >&5 +echo "configure:5878: checking for joinable pthread attribute" >&5 cat > conftest.$ac_ext <<EOF -#line 5884 "configure" +#line 5880 "configure" #include "confdefs.h" #include <pthread.h> int main() { int attr=PTHREAD_CREATE_JOINABLE; ; return 0; } EOF -if { (eval echo configure:5891: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5887: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ok=PTHREAD_CREATE_JOINABLE else @@ -5899,14 +5895,14 @@ rm -f conftest* if test x"$ok" = xunknown; then cat > conftest.$ac_ext <<EOF -#line 5903 "configure" +#line 5899 "configure" #include "confdefs.h" #include <pthread.h> int main() { int attr=PTHREAD_CREATE_UNDETACHED; ; return 0; } EOF -if { (eval echo configure:5910: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ok=PTHREAD_CREATE_UNDETACHED else @@ -5929,7 +5925,7 @@ fi echo $ac_n "checking if more special flags are required for pthreads""... $ac_c" 1>&6 -echo "configure:5933: checking if more special flags are required for pthreads" >&5 +echo "configure:5929: checking if more special flags are required for pthreads" >&5 flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd*) flag="-D_THREAD_SAFE";; @@ -5947,7 +5943,7 @@ # Extract the first word of "cc_r", so it can be a program name with args. set dummy cc_r; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:5951: checking for $ac_word" >&5 +echo "configure:5947: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_PTHREAD_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -6111,7 +6107,7 @@ # Extract the first word of "gzip", so it can be a program name with args. set dummy gzip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:6115: checking for $ac_word" >&5 +echo "configure:6111: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GZIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -6146,7 +6142,7 @@ # Extract the first word of "tar", so it can be a program name with args. set dummy tar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:6150: checking for $ac_word" >&5 +echo "configure:6146: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_TAR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -6280,7 +6276,7 @@ ac_given_srcdir=$srcdir trap 'rm -fr `echo "Makefile iodev/Makefile debug/Makefile bios/Makefile \ - cpu/Makefile cpu64/Makefile memory/Makefile gui/Makefile \ + cpu/Makefile memory/Makefile gui/Makefile \ disasm/Makefile ${INSTRUMENT_DIR}/Makefile misc/Makefile \ dynamic/Makefile \ fpu/Makefile install-x11-fonts build/linux/bochs-dlx \ @@ -6447,7 +6443,7 @@ cat >> $CONFIG_STATUS <<EOF CONFIG_FILES=\${CONFIG_FILES-"Makefile iodev/Makefile debug/Makefile bios/Makefile \ - cpu/Makefile cpu64/Makefile memory/Makefile gui/Makefile \ + cpu/Makefile memory/Makefile gui/Makefile \ disasm/Makefile ${INSTRUMENT_DIR}/Makefile misc/Makefile \ dynamic/Makefile \ fpu/Makefile install-x11-fonts build/linux/bochs-dlx \ Index: configure.in =================================================================== RCS file: /cvsroot/bochs/bochs/configure.in,v retrieving revision 1.110 retrieving revision 1.111 diff -u -d -r1.110 -r1.111 --- configure.in 16 Sep 2002 20:23:38 -0000 1.110 +++ configure.in 16 Sep 2002 20:39:32 -0000 1.111 @@ -1253,11 +1253,7 @@ CXXFP="" CFP="" OFP="-o " -# (KPL) Changed following. Loader was not finding symbols between -# cpu and cpu64 directory due to circular dependencies. MAKELIB="ar rv \$@" -#MAKELIB="ld -i -o \$@" -#RANLIB="echo" RMCOMMAND="rm -f " LINK="\$(CXX) -o \$@ \$(CXXFLAGS)" EXE="" @@ -1725,7 +1721,7 @@ AC_PATH_PROG(TAR, tar) AC_OUTPUT(Makefile iodev/Makefile debug/Makefile bios/Makefile \ - cpu/Makefile cpu64/Makefile memory/Makefile gui/Makefile \ + cpu/Makefile memory/Makefile gui/Makefile \ disasm/Makefile ${INSTRUMENT_DIR}/Makefile misc/Makefile \ dynamic/Makefile \ fpu/Makefile install-x11-fonts build/linux/bochs-dlx \ |
From: Kevin P L. <kev...@us...> - 2002-09-16 20:25:45
|
Update of /cvsroot/bochs/bochs/cpu64 In directory usw-pr-cvs1:/tmp/cvs-serv24052/cpu64 Removed Files: .cvsignore Makefile.in Log Message: Removed the last couple files in the cpu64 dir. --- .cvsignore DELETED --- --- Makefile.in DELETED --- |
From: Kevin P L. <kev...@us...> - 2002-09-16 20:23:44
|
Update of /cvsroot/bochs/bochs In directory usw-pr-cvs1:/tmp/cvs-serv22211 Modified Files: Makefile.in configure configure.in Log Message: Merged the final filed ("paging.cc") from Peter Tattam's x86-64 enhancement to bochs. You can now configure with --enable-guest2host-tlb. Force the support of big pages (PSE) when x86-64 is configured. Reverted back to only one kind of TLB entry style, since everything is ported. Fixed one bug in io.cc with as_64 and the index registers. There are others, as noticed by Peter. Index: Makefile.in =================================================================== RCS file: /cvsroot/bochs/bochs/Makefile.in,v retrieving revision 1.81 retrieving revision 1.82 diff -u -d -r1.81 -r1.82 --- Makefile.in 15 Sep 2002 15:10:18 -0000 1.81 +++ Makefile.in 16 Sep 2002 20:23:37 -0000 1.82 @@ -74,8 +74,6 @@ SHELL = /bin/sh -CPUDIR = @CPUDIR@ - @SET_MAKE@ CC = @CC@ @@ -167,15 +165,14 @@ @EXTERNAL_DEPENDENCY@ bochs@EXE@: @IODEV_LIB_VAR@ @DEBUGGER_VAR@ \ - $(CPUDIR)/libcpu.a @CPU32LIB@ memory/libmemory.a gui/libgui.a \ + cpu/libcpu.a @CPU32LIB@ memory/libmemory.a gui/libgui.a \ @DISASM_VAR@ @INSTRUMENT_VAR@ @DYNAMIC_VAR@ $(BX_OBJS) \ $(SIMX86_OBJS) \ $(FPU_LIB) @LINK@ $(BX_OBJS) \ $(SIMX86_OBJS) \ iodev/libiodev.a \ - $(CPUDIR)/libcpu.a @CPU32LIB@ \ - $(CPUDIR)/libcpu.a @CPU32LIB@ \ + cpu/libcpu.a @CPU32LIB@ \ memory/libmemory.a gui/libgui.a \ @DEBUGGER_VAR@ @DISASM_VAR@ @INSTRUMENT_VAR@ @DYNAMIC_VAR@ \ $(FPU_LIB) \ @@ -357,7 +354,7 @@ for i in $(MAN_PAGE_5_LIST); do $(RM) -f $(man5dir)/$$i.5.gz; done V6WORKSPACE_ZIP=build/win32/workspace.zip -V6WORKSPACE_FILES=bochs.dsw bochs.dsp bochs.opt $(CPUDIR)/cpu.dsp \ +V6WORKSPACE_FILES=bochs.dsw bochs.dsp bochs.opt cpu/cpu.dsp \ memory/memory.dsp iodev/iodev.dsp instrument/stubs/stubs.dsp \ gui/gui.dsp fpu/fpu.dsp disasm/disasm.dsp debug/debug.dsp \ misc/niclist.dsp bximage.dsp @@ -496,7 +493,7 @@ ########################################### # dependencies generated by -# gcc -MM -I. -Iinstrument/stubs *.cc | sed -e 's/\.cc/.@CPP_SUFFIX@/g' -e 's,cpu/,$(CPUDIR)/,g' +# gcc -MM -I. -Iinstrument/stubs *.cc | sed -e 's/\.cc/.@CPP_SUFFIX@/g' -e 's,cpu/,cpu/,g' ########################################### load32bitOShack.o: load32bitOShack.@CPP_SUFFIX@ bochs.h config.h osdep.h \ debug/debug.h bxversion.h gui/siminterface.h state_file.h cpu/cpu.h \ Index: configure =================================================================== RCS file: /cvsroot/bochs/bochs/configure,v retrieving revision 1.106 retrieving revision 1.107 diff -u -d -r1.106 -r1.107 --- configure 16 Sep 2002 19:17:48 -0000 1.106 +++ configure 16 Sep 2002 20:23:38 -0000 1.107 @@ -1,311 +1,128 @@ #! /bin/sh -# From configure.in Id: configure.in,v 1.107 2002/09/16 12:37:16 bdenney Exp . + # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.53. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # -# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation [...15622 lines suppressed...] -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - exec 5>/dev/null - $SHELL $CONFIG_STATUS || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } -fi +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 Index: configure.in =================================================================== RCS file: /cvsroot/bochs/bochs/configure.in,v retrieving revision 1.109 retrieving revision 1.110 diff -u -d -r1.109 -r1.110 --- configure.in 16 Sep 2002 19:17:51 -0000 1.109 +++ configure.in 16 Sep 2002 20:23:38 -0000 1.110 @@ -312,7 +312,6 @@ [ --enable-x86-64 compile in support for x86-64 instructions], [if test "$enableval" = yes; then AC_MSG_RESULT(yes) - CPUDIR=cpu64 OBJS32='' OBJS64='$(OBJS64)' CPU32LIB='cpu/libcpu.a' @@ -321,7 +320,6 @@ use_x86_64=1 else AC_MSG_RESULT(no) - CPUDIR=cpu OBJS32='$(OBJS32)' OBJS64='' CPU32LIB='' @@ -331,7 +329,6 @@ ], [ AC_MSG_RESULT(no) - CPUDIR=cpu OBJS32='$(OBJS32)' OBJS64='' CPU32LIB='' @@ -339,7 +336,6 @@ AC_DEFINE(BX_SUPPORT_X86_64, 0) ] ) -AC_SUBST(CPUDIR) AC_SUBST(OBJS32) AC_SUBST(OBJS64) AC_SUBST(CPU32LIB) @@ -590,22 +586,23 @@ AC_SUBST(PCI_OBJ) +support_big_pages=0 AC_MSG_CHECKING(for 4Meg pages support) AC_ARG_ENABLE(4meg-pages, [ --enable-4meg-pages support 4Megabyte pages extensions], [if test "$enableval" = yes; then AC_MSG_RESULT(yes) - AC_DEFINE(BX_SUPPORT_4MEG_PAGES, 1) + support_big_pages=1 else AC_MSG_RESULT(no) - AC_DEFINE(BX_SUPPORT_4MEG_PAGES, 0) + support_big_pages=0 fi], [ AC_MSG_RESULT(no) - AC_DEFINE(BX_SUPPORT_4MEG_PAGES, 0) + support_big_pages=0 ] ) -AC_SUBST(BX_SUPPORT_4MEG_PAGES) + AC_MSG_CHECKING(for guest to host TLB support) AC_ARG_ENABLE(guest2host-tlb, @@ -1673,8 +1670,10 @@ # and Page Global Extension (PGE. echo 'Because X86-64 is enabled, enabling Physical Address Extension (PAE).' echo 'Because X86-64 is enabled, enabling Page Global Extension (PGE).' + echo 'Because X86-64 is enabled, enabling Page Size Extension (PSE).' support_pae=1 support_global_pages=1 + support_big_pages=1 else support_pae=0 # Not an option yet for x86-32. fi @@ -1689,6 +1688,12 @@ AC_DEFINE(BX_SupportPAE, 1) else AC_DEFINE(BX_SupportPAE, 0) +fi + +if test "$support_big_pages" = 1; then + AC_DEFINE(BX_SUPPORT_4MEG_PAGES, 1) +else + AC_DEFINE(BX_SUPPORT_4MEG_PAGES, 0) fi AC_SUBST(INSTALL_TARGET) |
From: Kevin P L. <kev...@us...> - 2002-09-16 20:23:41
|
Update of /cvsroot/bochs/bochs/cpu In directory usw-pr-cvs1:/tmp/cvs-serv22211/cpu Modified Files: Makefile.in cpu.h extdb.cc io.cc paging.cc Log Message: Merged the final filed ("paging.cc") from Peter Tattam's x86-64 enhancement to bochs. You can now configure with --enable-guest2host-tlb. Force the support of big pages (PSE) when x86-64 is configured. Reverted back to only one kind of TLB entry style, since everything is ported. Fixed one bug in io.cc with as_64 and the index registers. There are others, as noticed by Peter. Index: Makefile.in =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/Makefile.in,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- Makefile.in 15 Sep 2002 15:10:21 -0000 1.41 +++ Makefile.in 16 Sep 2002 20:23:38 -0000 1.42 @@ -50,7 +50,6 @@ # are not used for the x86-64 compile because they have not # been synced yet. OBJS32 = \ - paging.o \ # Objects which are synced between the cpu and cpu64 code and @@ -104,6 +103,7 @@ io.o \ bit.o \ string.o \ + paging.o \ $(EXT_DEBUG_OBJS) \ Index: cpu.h =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/cpu.h,v retrieving revision 1.56 retrieving revision 1.57 diff -u -d -r1.56 -r1.57 --- cpu.h 16 Sep 2002 16:58:35 -0000 1.56 +++ cpu.h 16 Sep 2002 20:23:38 -0000 1.57 @@ -739,16 +739,8 @@ typedef struct { bx_address lpf; // linear page frame Bit32u ppf; // physical page frame -#if BX_SUPPORT_X86_64 - // This is the old style TLB permissions caching. - Bit32u pte_addr; // Page Table Address for updating A & D bits - Bit32u combined_access; -#else - // This is the new style TLB permissions caching. Eventually - // I'll update the cpu64 code to use this. Bit32u accessBits; // Page Table Address for updating A & D bits Bit32u hostPageAddr; -#endif } bx_TLB_entry; #endif // #if BX_USE_TLB @@ -1184,16 +1176,13 @@ __attribute__ ((aligned (16))) #endif ; -#if BX_SUPPORT_X86_64 - Bit16u generation; -#else + #if BX_USE_QUICK_TLB_INVALIDATE # define BX_TLB_LPF_VALUE(lpf) (lpf | BX_CPU_THIS_PTR TLB.tlb_invalidate) Bit32u tlb_invalidate; #else # define BX_TLB_LPF_VALUE(lpf) (lpf) #endif -#endif // #if BX_SUPPORT_X86_64 } TLB; #endif // #if BX_USE_TLB @@ -2109,8 +2098,8 @@ BX_SMF void access_linear(bx_address address, unsigned length, unsigned pl, unsigned rw, void *data); - BX_SMF Bit32u itranslate_linear(bx_address laddress, unsigned pl); - BX_SMF Bit32u dtranslate_linear(bx_address laddress, unsigned pl, unsigned rw); + BX_SMF Bit32u itranslate_linear(bx_address laddr, unsigned pl); + BX_SMF Bit32u dtranslate_linear(bx_address laddr, unsigned pl, unsigned rw); BX_SMF void TLB_flush(Boolean invalidateGlobal); BX_SMF void TLB_init(void); BX_SMF void set_INTR(Boolean value); Index: extdb.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/extdb.cc,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- extdb.cc 15 Sep 2002 14:01:16 -0000 1.5 +++ extdb.cc 16 Sep 2002 20:23:38 -0000 1.6 @@ -3,7 +3,7 @@ #ifdef WIN32 # include <windows.h> #else -# error "extdb.cc only supported in win32 environment" +//# error "extdb.cc only supported in win32 environment" #endif TRegs regs; @@ -15,6 +15,7 @@ void bx_external_debugger(BX_CPU_C *cpu) { +#if 0 //printf("Calling debugger state=%d\n",regs.debug_state); switch (regs.debug_state) { case debug_run: @@ -84,4 +85,5 @@ bx_vga.timer(); call_debugger(®s,cpu->mem->vector,cpu->mem->len); } +#endif } Index: io.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/io.cc,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- io.cc 15 Sep 2002 15:10:21 -0000 1.13 +++ io.cc 16 Sep 2002 20:23:38 -0000 1.14 @@ -366,7 +366,13 @@ BX_OUTP(DX, value8, 1); - if (i->as_32) { + if (i->as_64) { + if (BX_CPU_THIS_PTR get_DF ()) + RSI -= 1; + else + RSI += 1; + } + else if (i->as_32) { if (BX_CPU_THIS_PTR get_DF ()) RSI -= 1; else @@ -584,7 +590,7 @@ #endif #endif - if (i->as_64) { // Was coded as if (i->as_32) + if (i->as_64) { if (BX_CPU_THIS_PTR get_DF ()) RSI = RSI - incr; else Index: paging.cc =================================================================== RCS file: /cvsroot/bochs/bochs/cpu/paging.cc,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- paging.cc 16 Sep 2002 13:14:06 -0000 1.22 +++ paging.cc 16 Sep 2002 20:23:38 -0000 1.23 @@ -25,10 +25,12 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -#if 0 - // - what should the reserved bits in the error code be ? -#endif +// Notes from merge of x86-64 enhancements: (KPL) +// Looks like for x86-64/PAE=1/PTE with PSE=1, the +// CR4.PSE field is not consulted by the processor? +// Fix the PAE case to not update the page table tree entries +// until the final protection check? This is how it is on +// P6 for non-PAE anyways... @@ -42,6 +44,7 @@ + #if 0 // X86 Registers Which Affect Paging: // ================================== @@ -96,7 +99,6 @@ // 1 1 X 1 | 2M 36bits - // Page Directory/Table Entry format when P=0: // =========================================== // @@ -133,7 +135,6 @@ // 1: R/W (386+) // 0: P=1 (386+) - // Page Directory/Table Entry Fields Defined: // ========================================== // G: Global flag @@ -193,7 +194,6 @@ // ========================================== - // Combined page directory/page table protection: // ============================================== // There is one column for the combined effect on a 386 @@ -269,10 +269,13 @@ #if BX_SUPPORT_PAGING #define BX_INVALID_TLB_ENTRY 0xffffffff + #if BX_USE_QUICK_TLB_INVALIDATE #define BX_MAX_TLB_INVALIDATE 0xffe #endif +#define BX_USE_TLB_GENERATION 1 + #if BX_CPU_LEVEL >= 4 # define BX_PRIV_CHECK_SIZE 32 #else @@ -347,6 +350,44 @@ +// === TLB Instrumentation section ============================== + +// Note: this is an approximation of what Peter Tattam had. + +#define InstrumentTLB 0 + +#if InstrumentTLB +static unsigned tlbLookups=0; +static unsigned tlbMisses=0; +static unsigned tlbGlobalFlushes=0; +static unsigned tlbNonGlobalFlushes=0; +static unsigned tlbEntryFlushes=0; +static unsigned tlbEntryInvlpg=0; + +#define InstrTLB_StatsMask 0xfffff + +#define InstrTLB_Stats() {\ + if ((tlbLookups & InstrTLB_StatsMask) == 0) { \ + BX_INFO(("TLB lookup:%8d miss:%8d %6.2f%% flush:%8d %6.2f%%", \ + tlbLookups, \ + tlbMisses, \ + tlbMisses * 100.0 / tlbLookups, \ + (tlbGlobalFlushes+tlbNonGlobalFlushes), \ + (tlbGlobalFlushes+tlbNonGlobalFlushes) * 100.0 / tlbLookups \ + )); \ + tlbLookups = tlbMisses = tlbGlobalFlushes = tlbNonGlobalFlushes = 0; \ + } \ + } +#define InstrTLB_Increment(v) (v)++ + +#else +#define InstrTLB_Stats() +#define InstrTLB_Increment(v) +#endif + +// ============================================================== + + void BX_CPU_C::pagingCR0Changed(Bit32u oldCR0, Bit32u newCR0) { @@ -372,16 +413,16 @@ } void -BX_CPU_C::CR3_change(Bit32u value32) +BX_CPU_C::CR3_change(bx_address value) { if (bx_dbg.paging) { BX_INFO(("CR3_change(): flush TLB cache")); - BX_INFO(("Page Directory Base %08x", (unsigned) value32)); + BX_INFO(("Page Directory Base %08x", (unsigned) value)); } // flush TLB even if value does not change TLB_flush(0); // 0 = Don't flush Global entries. - BX_CPU_THIS_PTR cr3 = value32; + BX_CPU_THIS_PTR cr3 = value; } void @@ -447,29 +488,27 @@ void BX_CPU_C::TLB_flush(Boolean invalidateGlobal) { -#if BX_USE_TLB -#if BX_USE_QUICK_TLB_INVALIDATE - BX_CPU_THIS_PTR TLB.tlb_invalidate--; - - if(BX_CPU_THIS_PTR TLB.tlb_invalidate == 0 ) { +#if InstrumentTLB + if (invalidateGlobal) + InstrTLB_Increment(tlbGlobalFlushes); + else + InstrTLB_Increment(tlbNonGlobalFlushes); #endif - for (unsigned i=0; i<BX_TLB_SIZE; i++) { - // To be conscious of the native cache line usage, only - // write to (invalidate) entries which need it. - if (BX_CPU_THIS_PTR TLB.entry[i].lpf != BX_INVALID_TLB_ENTRY) { +#if BX_USE_TLB + for (unsigned i=0; i<BX_TLB_SIZE; i++) { + // To be conscious of the native cache line usage, only + // write to (invalidate) entries which need it. + if (BX_CPU_THIS_PTR TLB.entry[i].lpf != BX_INVALID_TLB_ENTRY) { #if BX_SupportGlobalPages - if ( invalidateGlobal || - !(BX_CPU_THIS_PTR TLB.entry[i].accessBits & 0x100) ) + if ( invalidateGlobal || + !(BX_CPU_THIS_PTR TLB.entry[i].accessBits & 0x100) ) { #endif - BX_CPU_THIS_PTR TLB.entry[i].lpf = BX_INVALID_TLB_ENTRY; + BX_CPU_THIS_PTR TLB.entry[i].lpf = BX_INVALID_TLB_ENTRY; + InstrTLB_Increment(tlbEntryFlushes); // A TLB entry flush occurred. } } - -#if BX_USE_QUICK_TLB_INVALIDATE - BX_CPU_THIS_PTR TLB.tlb_invalidate = BX_MAX_TLB_INVALIDATE; - } -#endif + } #endif // #if BX_USE_TLB } @@ -478,7 +517,7 @@ { #if BX_CPU_LEVEL >= 4 Bit32u TLB_index; - Bit32u laddr; + bx_address laddr; invalidate_prefetch_q(); @@ -500,10 +539,10 @@ } #if BX_USE_TLB - //TLB_flush(1); // Just clear the entire TLB, ugh! laddr = BX_CPU_THIS_PTR sregs[i->seg].cache.u.segment.base + i->rm_addr; TLB_index = BX_TLB_INDEX_OF(laddr); BX_CPU_THIS_PTR TLB.entry[TLB_index].lpf = BX_INVALID_TLB_ENTRY; + InstrTLB_Increment(tlbEntryInvlpg); #endif // BX_USE_TLB BX_INSTR_TLB_CNTRL(BX_INSTR_INVLPG, 0); @@ -519,14 +558,221 @@ // a data access (D) Bit32u -BX_CPU_C::dtranslate_linear(Bit32u laddr, unsigned pl, unsigned rw) +BX_CPU_C::dtranslate_linear(bx_address laddr, unsigned pl, unsigned rw) { - Bit32u lpf, ppf, poffset, TLB_index, error_code, paddress; + bx_address lpf; + Bit32u ppf, poffset, TLB_index, error_code, paddress; Bit32u pde, pde_addr; Boolean isWrite; Bit32u accessBits, combined_access; unsigned priv_index; + InstrTLB_Increment(tlbLookups); + InstrTLB_Stats(); + +#if BX_SUPPORT_X86_64 + if (BX_CPU_THIS_PTR cr4.get_PAE()) { + Bit32u pdp, pdp_addr; + + lpf = laddr & BX_CONST64(0xfffffffffffff000); // linear page frame + poffset = laddr & 0x00000fff; // physical offset + TLB_index = BX_TLB_INDEX_OF(lpf); + + isWrite = (rw>=BX_WRITE); // write or r-m-w + + //BX_DEBUG (("poffset: %-8x laddr: %-8x lpf: %-8x",poffset,laddr,lpf)); + + if (BX_CPU_THIS_PTR TLB.entry[TLB_index].lpf == BX_TLB_LPF_VALUE(lpf)) { + paddress = BX_CPU_THIS_PTR TLB.entry[TLB_index].ppf | poffset; + accessBits = BX_CPU_THIS_PTR TLB.entry[TLB_index].accessBits; + if (accessBits & (1 << ((isWrite<<1) | pl)) ) { + return(paddress); + } + + // The current access does not have permission according to the info + // in our TLB cache entry. Re-walk the page tables, in case there is + // updated information in the memory image, and let the long path code + // generate an exception if one is warranted. + } + + InstrTLB_Increment(tlbMisses); + + // note - we assume physical memory < 4gig so for brevity & speed, we'll use + // 32 bit entries although cr3 is expanded to 64 bits. + + if (BX_CPU_THIS_PTR msr.lma) { + Bit32u pml4, pml4_addr; + // Get PML4 entry + pml4_addr = (BX_CPU_THIS_PTR cr3 & 0xfffff000) | + ((laddr & BX_CONST64(0x0000ff8000000000)) >> 36); + BX_CPU_THIS_PTR mem->readPhysicalPage(this, pml4_addr, 4, &pml4); + if ( !(pml4 & 0x01) ) { + // PML4 Entry NOT present + error_code = 0x00000000; // RSVD=0, P=0 + goto page_fault_not_present; + } + if ( !(pml4 & 0x20) ) { + pml4 |= 0x20; + BX_CPU_THIS_PTR mem->writePhysicalPage(this, pml4_addr, 4, &pml4); + } + + // Get PDP entry + pdp_addr = (pml4 & 0xfffff000) | + ((laddr & BX_CONST64(0x0000007fc0000000)) >> 27); + } + else { + pdp_addr = (BX_CPU_THIS_PTR cr3 & 0xfffff000) | + ((laddr & 0xc0000000) >> 27); + } + + + BX_CPU_THIS_PTR mem->readPhysicalPage(this, pdp_addr, 4, &pdp); + if ( !(pdp & 0x01) ) { + // PDP Entry NOT present + error_code = 0x00000000; // RSVD=0, P=0 + goto page_fault_not_present; + } + if ( !(pdp & 0x20) ) { + pdp |= 0x20; + BX_CPU_THIS_PTR mem->writePhysicalPage(this, pdp_addr, 4, &pdp); + } + + // Get page dir entry + pde_addr = (pdp & 0xfffff000) | + ((laddr & 0x3fe00000) >> 18); + + BX_CPU_THIS_PTR mem->readPhysicalPage(this, pde_addr, 4, &pde); + if ( !(pde & 0x01) ) { + // Page Directory Entry NOT present + error_code = 0x00000000; // RSVD=0, P=0 + goto page_fault_not_present; + } + +#if BX_SUPPORT_4MEG_PAGES + // (KPL) Weird. I would think the processor would consult CR.PSE? + // if ((pde & 0x80) && (BX_CPU_THIS_PTR cr4.get_PSE())) {} + if (pde & 0x80) { + // 4M pages are enabled, and this is a 4Meg page. + + // Combined access is just access from the pde (no pte involved). + combined_access = pde & 0x06; // U/S and R/W + // Make up the physical page frame address. + ppf = (pde & 0xffe00000) | (laddr & 0x001ff000); + +#if BX_SupportGlobalPages + if (BX_CPU_THIS_PTR cr4.get_PGE()) // PGE==1 + combined_access |= (pde & 0x100); // G +#endif + + priv_index = +#if BX_CPU_LEVEL >= 4 + (BX_CPU_THIS_PTR cr0.wp<<4) | // bit 4 +#endif + (pl<<3) | // bit 3 + (combined_access & 0x06) | // bit 2,1 + isWrite; // bit 0 + + if (!priv_check[priv_index]) { + error_code = 0x00000001; // RSVD=0, P=1 + goto page_fault_access; + } + + // Update PDE if A/D bits if needed. + if ( ((pde & 0x20)==0) || + (isWrite && ((pde&0x40)==0)) ) { + pde |= (0x20 | (isWrite<<6)); // Update A and possibly D bits + BX_CPU_THIS_PTR mem->writePhysicalPage(this, pde_addr, 4, &pde); + } + } + else +#endif + { // 4k pages. + Bit32u pte, pte_addr; + + // Get page table entry + pte_addr = (pde & 0xfffff000) | + ((laddr & 0x001ff000) >> 9); + BX_CPU_THIS_PTR mem->readPhysicalPage(this, pte_addr, 4, &pte); + + combined_access = (pde & pte) & 0x06; // U/S and R/W + // Make up the physical page frame address. + ppf = pte & 0xfffff000; + +#if BX_SupportGlobalPages + if (BX_CPU_THIS_PTR cr4.get_PGE()) // PGE==1 + combined_access |= (pte & 0x100); // G +#endif + + if ( !(pte & 0x01) ) { + // Page Table Entry NOT present + error_code = 0x00000000; // RSVD=0, P=0 + goto page_fault_not_present; + } + + priv_index = +#if BX_CPU_LEVEL >= 4 + (BX_CPU_THIS_PTR cr0.wp<<4) | // bit 4 +#endif + (pl<<3) | // bit 3 + (combined_access & 0x06) | // bit 2,1 + isWrite; // bit 0 + + if (!priv_check[priv_index]) { + error_code = 0x00000001; // RSVD=0, P=1 + goto page_fault_access; + } + + // Update PDE A bit if needed. + if ( (pde & 0x20)==0 ) { + pde |= 0x20; // Update A bit. + BX_CPU_THIS_PTR mem->writePhysicalPage(this, pde_addr, 4, &pde); + } + + // Update PTE A/D bits if needed. + if ( ((pte & 0x20)==0) || + (isWrite && ((pte&0x40)==0)) ) { + pte |= (0x20 | (isWrite<<6)); // Update A and possibly D bits + BX_CPU_THIS_PTR mem->writePhysicalPage(this, pte_addr, 4, &pte); + } + } + + // Calculate physical memory address and fill in TLB cache entry + paddress = ppf | poffset; + BX_CPU_THIS_PTR TLB.entry[TLB_index].lpf = lpf; + BX_CPU_THIS_PTR TLB.entry[TLB_index].ppf = ppf; + + if ( combined_access & 4 ) { // User + accessBits = 0x3; // User priv; read from {user,sys} OK. + if ( isWrite ) { // Current operation is a write (Dirty bit updated) + accessBits |= 0xc; // write from {user,sys} OK. + } + } + else { // System + accessBits = 0x1; // System priv; read from {sys} OK. + if ( isWrite ) { // Current operation is a write (Dirty bit updated) + accessBits |= 4; // write from {sys} OK. + } + } +#if BX_SupportGlobalPages + accessBits |= combined_access & 0x100; // Global bit +#endif + BX_CPU_THIS_PTR TLB.entry[TLB_index].accessBits = accessBits; + +#if BX_SupportGuest2HostTLB + // Attempt to get a host pointer to this physical page. Put that + // pointer in the TLB cache. Note if the request is vetoed, NULL + // will be returned, and it's OK to OR zero in anyways. + BX_CPU_THIS_PTR TLB.entry[TLB_index].hostPageAddr = + (Bit32u) BX_CPU_THIS_PTR mem->getHostMemAddr(A20ADDR(ppf), rw); +#endif + + return(paddress); + } +#endif // #if BX_SUPPORT_X86_64 + + + // {CR4.PAE==0, MSR.LMA==0} + lpf = laddr & 0xfffff000; // linear page frame poffset = laddr & 0x00000fff; // physical offset TLB_index = BX_TLB_INDEX_OF(lpf); @@ -545,10 +791,9 @@ // in our TLB cache entry. Re-walk the page tables, in case there is // updated information in the memory image, and let the long path code // generate an exception if one is warranted. - goto pageTableWalk; // for clarity and in case of future mods } -pageTableWalk: + InstrTLB_Increment(tlbMisses); // Get page dir entry pde_addr = (BX_CPU_THIS_PTR cr3 & 0xfffff000) | @@ -561,8 +806,8 @@ } #if BX_SUPPORT_4MEG_PAGES - // If 4M pages are enabled, and this is a 4Meg page - if ((pde & 0x80) && (BX_CPU_THIS_PTR cr4 & 0x10)) { + if ((pde & 0x80) && (BX_CPU_THIS_PTR cr4.get_PSE())) { + // 4M pages are enabled, and this is a 4Meg page. // Note: when the PSE and PAE flags in CR4 are set, // the processor generates a PF if the reserved bits are not // set to 0. (We don't handle PAE yet, just a note for @@ -570,8 +815,11 @@ // Combined access is just access from the pde (no pte involved). combined_access = pde & 0x006; // {US,RW} + // make up the physical frame number + ppf = (pde & 0xFFC00000) | (laddr & 0x003FF000); + #if BX_SupportGlobalPages - if (BX_CPU_THIS_PTR cr4 & (1<<7)) // PGE==1 + if (BX_CPU_THIS_PTR cr4.get_PGE()) // PGE==1 combined_access |= pde & 0x100; // {G} #endif @@ -588,9 +836,6 @@ goto page_fault_access; } - // make up the physical frame number - ppf = (pde & 0xFFC00000) | (laddr & 0x003FF000); - // Update PDE if A/D bits if needed. if ( ((pde & 0x20)==0) || (isWrite && ((pde&0x40)==0)) ) { @@ -606,11 +851,11 @@ Bit32u pte, pte_addr; #if (BX_CPU_LEVEL < 6) - // update PDE if A bit was not set before - if ( !(pde & 0x20) ) { - pde |= 0x20; - BX_CPU_THIS_PTR mem->writePhysicalPage(this, pde_addr, 4, &pde); - } + // update PDE if A bit was not set before + if ( !(pde & 0x20) ) { + pde |= 0x20; + BX_CPU_THIS_PTR mem->writePhysicalPage(this, pde_addr, 4, &pde); + } #endif // Get page table entry @@ -618,12 +863,6 @@ ((laddr & 0x003ff000) >> 10); BX_CPU_THIS_PTR mem->readPhysicalPage(this, pte_addr, 4, &pte); - if ( !(pte & 0x01) ) { - // Page Table Entry NOT present - error_code = 0x00000000; // RSVD=0, P=0 - goto page_fault_not_present; - } - // 386 and 486+ have different bahaviour for combining // privilege from PDE and PTE. #if BX_CPU_LEVEL == 3 @@ -632,11 +871,24 @@ #else // 486+ combined_access = (pde & pte) & 0x06; // U/S and R/W #if BX_SupportGlobalPages +<<<<<<< paging.cc + if (BX_CPU_THIS_PTR cr4.get_PGE()) // PGE==1 +======= if (BX_CPU_THIS_PTR cr4.get_PGE ()) +>>>>>>> 1.22 combined_access |= (pte & 0x100); // G #endif #endif + // Make up the physical page frame address. + ppf = pte & 0xfffff000; + + if ( !(pte & 0x01) ) { + // Page Table Entry NOT present + error_code = 0x00000000; // RSVD=0, P=0 + goto page_fault_not_present; + } + priv_index = #if BX_CPU_LEVEL >= 4 (BX_CPU_THIS_PTR cr0.wp<<4) | // bit 4 @@ -650,8 +902,6 @@ goto page_fault_access; } - ppf = pte & 0xfffff000; - #if (BX_CPU_LEVEL >= 6) // update PDE if A bit was not set before if ( !(pde & 0x20) ) { @@ -671,7 +921,6 @@ // Calculate physical memory address and fill in TLB cache entry paddress = ppf | poffset; - BX_CPU_THIS_PTR TLB.entry[TLB_index].lpf = BX_TLB_LPF_VALUE(lpf); BX_CPU_THIS_PTR TLB.entry[TLB_index].ppf = ppf; @@ -724,54 +973,20 @@ // an instruction fetch access (I) Bit32u -BX_CPU_C::itranslate_linear(Bit32u laddr, unsigned pl) +BX_CPU_C::itranslate_linear(bx_address laddr, unsigned pl) { - Bit32u lpf, ppf, poffset, TLB_index, error_code, paddress; - Bit32u pde, pde_addr; - Bit32u accessBits, combined_access; - unsigned priv_index; - - lpf = laddr & 0xfffff000; // linear page frame - poffset = laddr & 0x00000fff; // physical offset - TLB_index = BX_TLB_INDEX_OF(lpf); - - - if (BX_CPU_THIS_PTR TLB.entry[TLB_index].lpf == BX_TLB_LPF_VALUE(lpf)) { - paddress = BX_CPU_THIS_PTR TLB.entry[TLB_index].ppf | poffset; - accessBits = BX_CPU_THIS_PTR TLB.entry[TLB_index].accessBits; - if (accessBits & (1 << pl) ) { - return(paddress); - } - - // The current access does not have permission according to the info - // in our TLB cache entry. Re-walk the page tables, in case there is - // updated information in the memory image, and let the long path code - // generate an exception if one is warranted. - goto pageTableWalk; // for clarity and in case of future mods - } + return dtranslate_linear(laddr, pl, BX_READ); +} -pageTableWalk: - // Get page dir entry - pde_addr = (BX_CPU_THIS_PTR cr3 & 0xfffff000) | - ((laddr & 0xffc00000) >> 20); - BX_CPU_THIS_PTR mem->readPhysicalPage(this, pde_addr, 4, &pde); - if ( !(pde & 0x01) ) { - // Page Directory Entry NOT present - error_code = 0x00000000; // RSVD=0, P=0 - goto page_fault_not_present; - } +#if BX_DEBUGGER || BX_DISASM || BX_INSTRUMENTATION -#if BX_SUPPORT_4MEG_PAGES - // If 4M pages are enabled, and this is a 4Meg page - if ((pde & 0x80) && (BX_CPU_THIS_PTR cr4 & 0x10)) { - // combined access is just access from the pde (no pte involved). - combined_access = pde & 0x006; -#if BX_SupportGlobalPages - if (BX_CPU_THIS_PTR cr4 & (1<<7)) // PGE==1 - combined_access |= pde & 0x100; // {G} +#if BX_SUPPORT_X86_64 +#warning "Fix dbg_xlate_linear2phy for 64-bit and new features." #endif +<<<<<<< paging.cc +======= priv_index = #if BX_CPU_LEVEL >= 4 (BX_CPU_THIS_PTR cr0.wp<<4) | // bit 4 @@ -907,6 +1122,7 @@ #if BX_DEBUGGER || BX_DISASM || BX_INSTRUMENTATION +>>>>>>> 1.22 void BX_CPU_C::dbg_xlate_linear2phy(Bit32u laddr, Bit32u *phy, Boolean *valid) { @@ -967,7 +1183,7 @@ void -BX_CPU_C::access_linear(Bit32u laddr, unsigned length, unsigned pl, +BX_CPU_C::access_linear(bx_address laddr, unsigned length, unsigned pl, unsigned rw, void *data) { Bit32u pageOffset; @@ -1102,7 +1318,9 @@ BX_CPU_THIS_PTR address_xlation.paddress1 = laddr; BX_CPU_THIS_PTR address_xlation.pages = 1; if (rw == BX_READ) { +#if BX_SupportGuest2HostTLB Bit32u lpf, tlbIndex; +#endif BX_INSTR_LIN_READ(laddr, laddr, length); #if BX_SupportGuest2HostTLB @@ -1142,7 +1360,9 @@ BX_CPU_THIS_PTR mem->readPhysicalPage(this, laddr, length, data); } else { // Write +#if BX_SupportGuest2HostTLB Bit32u lpf, tlbIndex; +#endif BX_INSTR_LIN_WRITE(laddr, laddr, length); #if BX_SupportGuest2HostTLB |
From: Kevin P L. <kev...@us...> - 2002-09-16 20:23:41
|
Update of /cvsroot/bochs/bochs/cpu64 In directory usw-pr-cvs1:/tmp/cvs-serv22211/cpu64 Modified Files: Makefile.in Removed Files: paging.cc Log Message: Merged the final filed ("paging.cc") from Peter Tattam's x86-64 enhancement to bochs. You can now configure with --enable-guest2host-tlb. Force the support of big pages (PSE) when x86-64 is configured. Reverted back to only one kind of TLB entry style, since everything is ported. Fixed one bug in io.cc with as_64 and the index registers. There are others, as noticed by Peter. Index: Makefile.in =================================================================== RCS file: /cvsroot/bochs/bochs/cpu64/Makefile.in,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- Makefile.in 15 Sep 2002 05:09:18 -0000 1.29 +++ Makefile.in 16 Sep 2002 20:23:38 -0000 1.30 @@ -44,7 +44,6 @@ BX_INCDIRS = -I.. -I$(srcdir)/.. -I../@INSTRUMENT_DIR@ -I$(srcdir)/../@INSTRUMENT_DIR@ OBJS = \ - paging.o BX_INCLUDES = ../bochs.h ../config.h @@ -72,13 +71,3 @@ # dependencies generated by # gcc -MM -I.. -I../instrument/stubs *.c *.cc | sed 's/\.cc/.@CPP_SUFFIX@/g' ########################################### -paging.o: paging.@CPP_SUFFIX@ ../bochs.h ../config.h ../osdep.h ../debug/debug.h \ - ../bxversion.h ../gui/siminterface.h ../state_file.h ../cpu/cpu.h \ - ../cpu/lazy_flags.h ../memory/memory.h ../pc_system.h ../gui/gui.h \ - ../gui/control.h ../iodev/iodev.h ../iodev/pci.h ../iodev/vga.h \ - ../iodev/cmos.h ../iodev/dma.h ../iodev/floppy.h ../iodev/harddrv.h \ - ../iodev/keyboard.h ../iodev/parallel.h ../iodev/pic.h ../iodev/pit.h \ - ../iodev/pit_wrap.h ../iodev/pit82c54.h ../iodev/serial.h \ - ../iodev/unmapped.h ../iodev/eth.h ../iodev/ne2k.h \ - ../iodev/guest2host.h ../iodev/slowdown_timer.h \ - ../instrument/stubs/instrument.h --- paging.cc DELETED --- |
From: Volker R. <vru...@us...> - 2002-09-16 19:19:02
|
Update of /cvsroot/bochs/bochs/iodev In directory usw-pr-cvs1:/tmp/cvs-serv1804 Added Files: pci2isa.cc pci2isa.h Log Message: - implementation of the PCI-to-ISA bridge started. I/O ports and features are not present yet. --- NEW FILE: pci2isa.cc --- ///////////////////////////////////////////////////////////////////////// // $Id: pci2isa.cc,v 1.1 2002/09/16 19:18:58 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. // // MandrakeSoft S.A. // 43, rue d'Aboukir // 75002 Paris - France // http://www.linux-mandrake.com/ // http://www.mandrakesoft.com/ // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "bochs.h" #define LOG_THIS bx_pci2isa. // // i440FX Support - PCI-to-ISA bridge (PIIX3) // bx_pci2isa_c bx_pci2isa; #if BX_USE_P2I_SMF #define this (&bx_pci2isa) #endif bx_pci2isa_c::bx_pci2isa_c(void) { put("PCI"); settype(PCILOG); } bx_pci2isa_c::~bx_pci2isa_c(void) { // nothing for now BX_DEBUG(("Exit.")); } void bx_pci2isa_c::init(bx_devices_c *d) { // called once when bochs initializes BX_P2I_THIS devices = d; if (bx_options.Oi440FXSupport->get ()) { BX_REGISTER_PCI_HANDLERS(this, pci_read_handler, pci_write_handler, 0x08, "440FX PCI-to-ISA bridge"); for (unsigned i=0; i<256; i++) BX_P2I_THIS pci_conf[i] = 0x0; // readonly registers BX_P2I_THIS pci_conf[0x00] = 0x86; BX_P2I_THIS pci_conf[0x01] = 0x80; BX_P2I_THIS pci_conf[0x02] = 0x00; BX_P2I_THIS pci_conf[0x03] = 0x70; BX_P2I_THIS pci_conf[0x0a] = 0x01; BX_P2I_THIS pci_conf[0x0b] = 0x06; BX_P2I_THIS pci_conf[0x0e] = 0x80; } } void bx_pci2isa_c::reset(unsigned type) { BX_P2I_THIS pci_conf[0x04] = 0x07; BX_P2I_THIS pci_conf[0x05] = 0x00; BX_P2I_THIS pci_conf[0x06] = 0x00; BX_P2I_THIS pci_conf[0x07] = 0x02; BX_P2I_THIS pci_conf[0x4c] = 0x4d; } // static IO port read callback handler // redirects to non-static class handler to avoid virtual functions Bit32u bx_pci2isa_c::read_handler(void *this_ptr, Bit32u address, unsigned io_len) { #if !BX_USE_P2I_SMF bx_pci2isa_c *class_ptr = (bx_pci2isa_c *) this_ptr; return( class_ptr->read(address, io_len) ); } Bit32u bx_pci2isa_c::read(Bit32u address, unsigned io_len) { #else UNUSED(this_ptr); #endif // !BX_USE_P2I_SMF return(0xffffffff); } // static IO port write callback handler // redirects to non-static class handler to avoid virtual functions void bx_pci2isa_c::write_handler(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len) { #if !BX_USE_P2I_SMF bx_pci2isa_c *class_ptr = (bx_pci2isa_c *) this_ptr; class_ptr->write(address, value, io_len); } void bx_pci2isa_c::write(Bit32u address, Bit32u value, unsigned io_len) { #else UNUSED(this_ptr); #endif // !BX_USE_P2I_SMF } // static pci configuration space read callback handler // redirects to non-static class handler to avoid virtual functions Bit32u bx_pci2isa_c::pci_read_handler(void *this_ptr, Bit8u address, unsigned io_len) { #if !BX_USE_P2I_SMF bx_pci2isa_c *class_ptr = (bx_pci2isa_c *) this_ptr; return( class_ptr->pci_read(address, io_len) ); } Bit32u bx_pci2isa_c::pci_read(Bit8u address, unsigned io_len) { #else UNUSED(this_ptr); #endif // !BX_USE_P2I_SMF Bit32u value = 0; if (io_len <= 4) { memcpy(&value, &BX_P2I_THIS pci_conf[address], io_len); BX_DEBUG(("440FX PCI-to-ISA read register 0x%02x value 0x%08x", address, value)); return value; } else return(0xffffffff); } // static pci configuration space write callback handler // redirects to non-static class handler to avoid virtual functions void bx_pci2isa_c::pci_write_handler(void *this_ptr, Bit8u address, Bit32u value, unsigned io_len) { #if !BX_USE_P2I_SMF bx_pci2isa_c *class_ptr = (bx_pci2isa_c *) this_ptr; class_ptr->pci_write(address, value, io_len); } void bx_pci2isa_c::pci_write(Bit8u address, Bit32u value, unsigned io_len) { #else UNUSED(this_ptr); #endif // !BX_USE_P2I_SMF Bit8u value8; if (io_len <= 4) { for (unsigned i=0; i<io_len; i++) { value8 = (value >> (i*8)) & 0xFF; switch (address+i) { case 0x06: break; default: BX_P2I_THIS pci_conf[address+i] = value8; BX_DEBUG(("440FX PCI-to-ISA write register 0x%02x value 0x%02x", address, value8)); } } } } --- NEW FILE: pci2isa.h --- ///////////////////////////////////////////////////////////////////////// // $Id: pci2isa.h,v 1.1 2002/09/16 19:18:58 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. // // MandrakeSoft S.A. // 43, rue d'Aboukir // 75002 Paris - France // http://www.linux-mandrake.com/ // http://www.mandrakesoft.com/ // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #if BX_PCI_SUPPORT #if BX_USE_P2I_SMF # define BX_P2I_SMF static # define BX_P2I_THIS bx_pci2isa. #else # define BX_P2I_SMF # define BX_P2I_THIS this-> #endif class bx_pci2isa_c : public logfunctions { public: bx_pci2isa_c(void); ~bx_pci2isa_c(void); BX_PCI_SMF void init(bx_devices_c *); BX_PCI_SMF void reset(unsigned type); private: bx_devices_c *devices; Bit8u pci_conf[256]; static Bit32u read_handler(void *this_ptr, Bit32u address, unsigned io_len); static void write_handler(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len); static Bit32u pci_read_handler(void *this_ptr, Bit8u address, unsigned io_len); static void pci_write_handler(void *this_ptr, Bit8u address, Bit32u value, unsigned io_len); #if !BX_USE_P2I_SMF Bit32u read(Bit32u address, unsigned io_len); void write(Bit32u address, Bit32u value, unsigned io_len); Bit32u pci_read(Bit8u address, unsigned io_len); void pci_write(Bit8u address, Bit32u value, unsigned io_len); #endif }; #if BX_USE_P2I_SMF extern bx_pci2isa_c bx_pci2isa; #endif #endif // #if BX_PCI_SUPPORT |
From: Volker R. <vru...@us...> - 2002-09-16 19:17:56
|
Update of /cvsroot/bochs/bochs/iodev In directory usw-pr-cvs1:/tmp/cvs-serv1143/iodev Modified Files: devices.cc iodev.h Log Message: - implementation of the PCI-to-ISA bridge started. I/O ports and features are not present yet. Index: devices.cc =================================================================== RCS file: /cvsroot/bochs/bochs/iodev/devices.cc,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- devices.cc 9 Sep 2002 16:56:55 -0000 1.30 +++ devices.cc 16 Sep 2002 19:17:51 -0000 1.31 @@ -50,6 +50,7 @@ #if BX_PCI_SUPPORT pci = NULL; + pci2isa = NULL; #endif pit = NULL; keyboard = NULL; @@ -117,6 +118,8 @@ // PCI logic (i440FX) pci = & bx_pci; pci->init(this); + pci2isa = & bx_pci2isa; + pci2isa->init(this); #endif #if BX_SUPPORT_APIC @@ -240,6 +243,7 @@ { #if BX_PCI_SUPPORT pci->reset(type); + pci2isa->reset(type); #endif #if BX_SUPPORT_IOAPIC ioapic->reset (type); Index: iodev.h =================================================================== RCS file: /cvsroot/bochs/bochs/iodev/iodev.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- iodev.h 9 Sep 2002 16:56:56 -0000 1.17 +++ iodev.h 16 Sep 2002 19:17:51 -0000 1.18 @@ -52,6 +52,7 @@ class bx_hard_drive_c; class bx_sb16_c; class bx_pci_c; +class bx_pci2isa_c; class bx_ioapic_c; class bx_ne2k_c; class bx_g2h_c; @@ -102,6 +103,7 @@ bx_biosdev_c *biosdev; bx_ioapic_c *ioapic; bx_pci_c *pci; + bx_pci2isa_c *pci2isa; bx_pit_c *pit; bx_keyb_c *keyboard; bx_dma_c *dma; @@ -163,6 +165,7 @@ #include "iodev/pci.h" +#include "iodev/pci2isa.h" #if BX_SUPPORT_VGA # include "iodev/vga.h" #else |
From: Volker R. <vru...@us...> - 2002-09-16 19:17:55
|
Update of /cvsroot/bochs/bochs In directory usw-pr-cvs1:/tmp/cvs-serv1143 Modified Files: config.h.in configure configure.in Log Message: - implementation of the PCI-to-ISA bridge started. I/O ports and features are not present yet. Index: config.h.in =================================================================== RCS file: /cvsroot/bochs/bochs/config.h.in,v retrieving revision 1.67 retrieving revision 1.68 diff -u -d -r1.67 -r1.68 --- config.h.in 15 Sep 2002 05:29:06 -0000 1.67 +++ config.h.in 16 Sep 2002 19:17:48 -0000 1.68 @@ -233,6 +233,7 @@ #define BX_USE_SB16_SMF 1 // Sound (SB 16) #define BX_USE_DEV_SMF 1 // System Devices (port92) #define BX_USE_PCI_SMF 1 // PCI +#define BX_USE_P2I_SMF 1 // PCI-to-ISA bridge #define BX_USE_NE2K_SMF 1 // NE2K #define BX_SUPPORT_SB16 0 Index: configure =================================================================== RCS file: /cvsroot/bochs/bochs/configure,v retrieving revision 1.105 retrieving revision 1.106 diff -u -d -r1.105 -r1.106 --- configure 16 Sep 2002 18:35:56 -0000 1.105 +++ configure 16 Sep 2002 19:17:48 -0000 1.106 @@ -8882,7 +8882,7 @@ #define BX_PCI_SUPPORT 1 _ACEOF - PCI_OBJ='pci.o' + PCI_OBJ='pci.o pci2isa.o' else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 Index: configure.in =================================================================== RCS file: /cvsroot/bochs/bochs/configure.in,v retrieving revision 1.108 retrieving revision 1.109 diff -u -d -r1.108 -r1.109 --- configure.in 16 Sep 2002 18:36:01 -0000 1.108 +++ configure.in 16 Sep 2002 19:17:51 -0000 1.109 @@ -575,7 +575,7 @@ [if test "$enableval" = yes; then AC_MSG_RESULT(yes) AC_DEFINE(BX_PCI_SUPPORT, 1) - PCI_OBJ='pci.o' + PCI_OBJ='pci.o pci2isa.o' else AC_MSG_RESULT(no) AC_DEFINE(BX_PCI_SUPPORT, 0) |
From: Bryce D. <bd...@us...> - 2002-09-16 18:36:04
|
Update of /cvsroot/bochs/bochs In directory usw-pr-cvs1:/tmp/cvs-serv19370 Modified Files: configure configure.in Log Message: - I screwed up the BX_USE_CONFIG_INTERFACE variable earlier today; fixed. Index: configure =================================================================== RCS file: /cvsroot/bochs/bochs/configure,v retrieving revision 1.104 retrieving revision 1.105 diff -u -d -r1.104 -r1.105 --- configure 16 Sep 2002 12:37:15 -0000 1.104 +++ configure 16 Sep 2002 18:35:56 -0000 1.105 @@ -1,25 +1,23 @@ #! /bin/sh -# From configure.in Id: configure.in,v 1.106 2002/09/16 11:53:35 bdenney Exp . +# From configure.in Id: configure.in,v 1.107 2002/09/16 12:37:16 bdenney Exp . # Guess values for system-dependent variables and create Makefiles. -# Generated by Autoconf 2.52. +# Generated by GNU Autoconf 2.53. # -# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 # Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation [...11888 lines suppressed...] fi @@ -10288,14 +12432,15 @@ rm -f $tmp/config.h fi done -EOF +_ACEOF -cat >>$CONFIG_STATUS <<\EOF +cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } -EOF +_ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save + # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. Index: configure.in =================================================================== RCS file: /cvsroot/bochs/bochs/configure.in,v retrieving revision 1.107 retrieving revision 1.108 diff -u -d -r1.107 -r1.108 --- configure.in 16 Sep 2002 12:37:16 -0000 1.107 +++ configure.in 16 Sep 2002 18:36:01 -0000 1.108 @@ -175,7 +175,12 @@ use_config_interface=1 ] ) -AC_DEFINE(BX_USE_CONFIG_INTERFACE, $use_config_interface) + +if test "$use_config_interface" = 1; then + AC_DEFINE(BX_USE_CONFIG_INTERFACE, 1) +else + AC_DEFINE(BX_USE_CONFIG_INTERFACE, 0) +fi AC_MSG_CHECKING(for new PIT model) AC_ARG_ENABLE(new-pit, @@ -1674,13 +1679,13 @@ support_pae=0 # Not an option yet for x86-32. fi -if test "$support_global_pages"; then +if test "$support_global_pages" = 1; then AC_DEFINE(BX_SupportGlobalPages, 1) else AC_DEFINE(BX_SupportGlobalPages, 0) fi -if test "$support_pae"; then +if test "$support_pae" = 1; then AC_DEFINE(BX_SupportPAE, 1) else AC_DEFINE(BX_SupportPAE, 0) |
From: Bryce D. <bd...@us...> - 2002-09-16 18:23:33
|
Update of /cvsroot/bochs/bochs/patches In directory usw-pr-cvs1:/tmp/cvs-serv14484/patches Modified Files: patch.4ata-channels Log Message: - make the patch apply to current sources (very minor) - now this patch is checked in with -kb flag Index: patch.4ata-channels =================================================================== RCS file: /cvsroot/bochs/bochs/patches/patch.4ata-channels,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- patch.4ata-channels 14 Sep 2002 07:34:41 -0000 1.1 +++ patch.4ata-channels 16 Sep 2002 18:23:29 -0000 1.2 @@ -1559,18 +1559,6 @@ char * bx_real_sim_c::get_floppy_type_name (int type) -@@ -776,9 +794,9 @@ - : bx_param_num_c (id, name, description, 0, 1, initial_val) - { - set_type (BXT_PARAM_BOOL); -- // dependent_list must be initialized before the set(), -- // because set calls update_dependents(). -- dependent_list = NULL; -+ // dependent_list must be initialized before the set(), -+ // because set calls update_dependents(). -+ dependent_list = NULL; - set (initial_val); - } Index: gui/siminterface.h =================================================================== |
From: Bryce D. <bd...@us...> - 2002-09-16 17:09:28
|
Update of /cvsroot/bochs/bochs/build/win32 In directory usw-pr-cvs1:/tmp/cvs-serv18251 Added Files: tattam-external-debugger.zip Log Message: - include Peter Tattam's external debugger in build/win32 since it's win32 specific. --- NEW FILE: tattam-external-debugger.zip --- PK 6:,¯dCÀþxG¥¯ òµâ^êÃÉCÁýÓ îÓ~v B¦?ÑH"Èj^u¸U¿ÓYÕÖhÅq$8ZClPbàÉàØ![K@§¯¢v§BÔQÆ[ÖòG¤QèC¾&¥=h7¨-mÀs¸ô{Îca ¿\Q8æÏý uÆråNr¸f*#]!ÉRÌÙpÊLO #ÕzàFF½!.½ '©¤êí%-gÂ"É1h=ä´± p¹Úë#âÞ×e½Iù±ô×áñ¨" ¥uÏY, òÆ÷&vÌ Lcpî'5d£VuË(®Uo%ÍZÀ·ñÖÚÛp\õ{k^6'ðj)F{K{æ_ØëµL#Üs¸WÚÉ5!!Ô`ª*Y;OAAöÄBäUbºOhÃ6¯¬Q_@ èb<Âÿ¼8xÜùpì«ÄýßTh*môÌ5~à y'&§ÝGã°©h-¬H0;3Ig)Ý·Ù¹Åi°¾µ6ÃNm¤Ýùíd?Û¹çÀ~¿³î °a´ZZXaò¶Æ×Ö@n>UR¢Ú¸Fcý¿æº_|0³äx,lÑ ¬*zåÃÆå, Ф-Ýbµ t5ÖyºéØ_Ø`ã\¹ª|ÜH}ÙÇfj 9vn;,ÃáÄǸëôU[] [Ôè¡Ùë5Åá#C°R)×Ú( Êá¾2ªq¬ýðY<½34¥]h°6Ý ®~·KÉ¡%ß|] e2+rpR0ó°G½*2õõd¶Æ¸{u¸j¶adpéM¬·RÉð¨Ø:X·d¯ÝÅWF+ì7õ%ºFU8ÇÙH+ÝÆ}Ó~/ѽ¥Í`¨lFè¿ÀéQs¨gýG8zKÏÂúÜYÅP6Â@ ä ÃÓ²ìi©ÔÞÛ 7ñÄÛCb÷ØÝÚ Ñ¼ÆfkThYN£ÖAÍq[ÎÓPAâå³2=W!ç=*Üëм±º5÷Ŷа]÷ox<;²eF<pFÓÂ0ª;Õ «4àÞàêLíþQZ;$µê:,T=+«®xa8Ös /÷s>/ÆA¿ûáj8ý$nø6\Âh¶6¨¥sÁX;n£IÊh7h¥¡5ı۰ÎÞ¤$Cr&¸ >cçËv,BTÒc¯ï ÷vì Ýt«d¾5` ÙF¼ÿgf 5å'ÙepcûÆkB¸âA«àëÊbÐÖh¨FÌ[ ^æ ;åkqAÑþÐþ¦yg*ìTØëõÞóWrZT¦ðt[:-ýI=çórE%γûÒIÝNöWÂéé¤;ëÕAâж*q}¯&Póüõò6«F6¡?ÂÎý í·Ü/ö®OqZbëfMPý[;m)%8ÃÄmLÄq´ÆM-*p©dÏÀ nTÓ1·ÖMgÀè¸ÊQþFÒ-z7y¯½vN¼Ï®QH£}=xgýѳ¯×hh µad/áX X6gT@âk߬K°ô;Wq¬÷Ý,ûÅHáÐðz|ËÏÐÜÆoëüÉ^7ysdt x?ßØ nà£'¦ló k,íBÕa2áÄÆpîQÏÎkT¤F{@å9Ööúl/ñm®?ã3;'4aeÆ;âO~µÿ~mÅmé¶[1÷8Û4ÛXK²íÁ\vÒ2Å&N¶Ýê·îîîuã*y¡hú²Öï{Xôå}Aü a ÊIùÎö&/÷ì*ñ˯@¨Ñ[¾³ÝZºZec$kûÛÄA¶[êu-6g0oÞ}÷²>*þ.95 g& pg ´gÉz°3L²Bä'£ÄK3X¢þv'OÖèÉï" ©ÓíÎYqÄútoþzÂÍh±hÂl\£úÕ@<ØíÏÊÌö¯Ç·ÁH_HF QÂ2Mcÿ0<´ BÄùNí5<Î &-MµAû)Þå>¶DR±V Szú楴óÛSRgf6gå,WBëyl=ÈÈwæ° sëö°:>ßéånÎv}#ÛBE¶.Ö6C´ju_:DðÕÝ:D£Q=2%Îß!ç§s× (yÉ´Lî¦ÇÈÞP- mº2®&ì4]Y):# §{pA±`uÖÁ+³ãOsUHFeÞ@2~9g.n y¡ çYa<; øìÄ$àâÈJ YÂ7>È_:»SM÷c´âÎ x Ô¡ ðïPb!ÑÁ ¿8àIïé6C1ââ`'4ùh,ªzlØ}ý¥§µNzêÚÌK<Án\ Q&¾7ÅY&¾¡ya:,'þ$1Ãòøú7Ï,;U®¾×2YÌJ|)Y'þ )'eXdXâÌ¿`ñ;M´ãv6wïlÇí< Þ±óxGî<.ÛyP¼³]¸ók1bç 1lç^¸¦{ÆâáD²´4,ªã×uE7-À/L.qIüû¬½-5²uIRFXFûWÜ(`$´KkN7ñl-½×ä §ï`D-Mkzû(eÀ¦úä,*Od):ñp¨¡ÝÓfOA¿×Þ 6@Fºrôû)>båqÌ«xxòBÑ1p0Û4s¬Ò³¢Ý>û%ùHà!ÙÀC2,ÿU¢4ZÈP̾4¡åóéx|×ÙÏê*^J ,õ;äd@ íYíYCîGeÉâxÇÈÎö(©wϱßXÿÕTø²ýø³ÏâÀó.´@ty8¡£Pa½bODE8Ët ð تòdGmáxæÐ2r°ÊÃÌt PUdoÉÐ/W®¶,[ùì«[½ì©bKÌø'&ÄÄÏ7ã¾Ùÿ"M`Ø8¹¾ ¥àÜÂ&Âåb§fT#ÇÛl÷C%:a¶Ûa®LvÓ©×<|¯ÏqʨFr ÇãW?²*;[ó»óHkñT{´Ý=ò8,*bêvBË,¼»êÊîy4ÉsÝ$¯[qsÆAËpZ3ÜAé&C7iûOÌ9év\**¡îcÙyYfáp¼Ì}Y×UUR÷lëUÍàϦ¾)\Å{3¬ÅAú*pcuÍÏÑ*Ïl7}¶Dó+ /{ÎȺ)\ÍÒ©&ØóPHò»Á-7»dÔ¯7p®Q3Nl¤@WGÃÞoÅ·¢ÈªPµ@²iQ¼¤ep»Ó¾Þ°¶S½®Y8C ËKP «ºøÉ8^h¡0èØÈzè úJÂOôx[S[»ýkí³Ò>3gÑßàÖbqo6ÈB+í-3Õ#o'*ùòñÍÙ³¨d¥%"Daø nº&&å GIΤ¡]µp̪óâyt]$Þ RpÞÃj;OÇ3¨beÝu/®Öª}øD`ÂãÃú*¸TÞãzíÃyl}ú5¾{°Åwv Ôþ*¶SXøí-iæ©Û×~´Ù<ÁÓTV Ñ©9´À{ Nö>Ð|ï{)²¾íPÿßn¶ÍôÈ°ÛëØbL@SÞ ÷Áúa7PzáäX=@Înq<3 Ù¬µñªÆ^ÂÝ`ÖðmÅNëÅ;õ®o1o+"úÎ:|)Ã:Ò~S³zhéM|Å:¤#,iWðXÁi¦;¡nk+ìÓ5«G³J§s <E&Ð"j6ýüü"ûLÍAàkàñ«ßZ!Cë,*É)¬Qð( _ Gþ xËÉei*°ëçÐçÈvÝç;0"Ø Ã\Tj6Ƣƴ3ãWÖa¦¡'ì5Þ¥Ä$°in^bHëXáëMÏ´Ë=N÷0ÃuÄ?DÁ©¯Ìí¦Q=ßÞz?ÀI#ÇúÀïiGçD<©Û%2 O¤¼ÏrÀ-Ò.Á`'§ bvþè\Í d~ô£`|Ôi×ÌËUt×Q¬z¾nØþðB®Ûk5¶á2ÿÆùàÑw´K%U»¨c3N²DHec»µÃ³<-Ѩn6} *} èG%·Å,&T'&õ¢ºÝKÓö3'ÑîEó˶=¤5f¯,²¬[ºúÉÞñ°¹+XºâÉ5ì<ô= ÙÛ¦âyö nÎ2§åû½ÓB¹aè<Ù¼ïáº!CÏÚÒÜÄÛÑÚ(?Üó®x3T#ÅÙpßã(¸¬¹ï÷^Ö+¼øD-ó°ùì6ª±£U$c"ÙÆ"øóDoÌí3)·bz1à;2?:]£à8ëäçV`ñ Ð.È8á63]+¤ëÁX þË$×C é7¶Z<Ä?Co¦1=ú±D'Þ õ&©ßuXá"Üé/Xó$¶°à?fØ`6H2ÃÙQa¦ÝÌ£+Ñõ+ÝÈÿTÑ£Ëéy_Îyî¥hLº24¾1üµ¬ îU3´uKmÿd¼ÉàËT¾O³À óáö´¼2×öE6´¨Lâ\ô±uÈécädy r[[q¤w TúÇ_~CT.ÿ>&él12}ÙÐ n3ZÙèëín¥5ã8À»ÏNhMéljá°¹ä]-âÉÊͨ sª'¬Ñ¤A$0ÇB¾Ñ4â°2¢ !ÃPiÊÀûÞ¯HÞ¬15[ùrá=¬4cóx|¯ºô&jnÕxÌÑ°¤:Ko2u;kB÷ìGÅôATDhGÊYË@ûMåº(gâôd £Â«@+v&fÀµÔÒÁºïwßÝ%Â~Sµ.¤AXÌ{òF°c=ÿz×á ã¨âOµ(Oü²wÕâÚwâãÆÒõlN¬ÈúHÕz|ÌkÖ[7 Sµ±{Ídïµw$ òůZOÄX52N)|Ó=~ÌȲM=qHñ= ü@îñ÷ëÿÖó·Ãw;Þ«>|vÊúßÿ!ÃÄ}2/bÖ°â÷ç¸möUwøÓÖ²HÓÒ̲,SÓ¨ªÏv¬Ük©¹~×}óMeý^v¯1«t¡éBÿÏî=¾eÛÓéGâ4_m~Üôê¥i¦ÝOÞúϪØ÷þ¹ç¯ËLGß=äyhÌúºÃ¦íoìö_IL:óËÖü`íÞKú`ø÷b· ûtpòÓ¹wͨì\u¦$yróýç<¯fUüüâ©®¿Þ7~òÂ=ËFukû<eí¹ýW'ÜSV:.µ-¢ê$w×;«Jþû#ý¹=õ7SÞÜé ³âjaÚkâw³ûÊ¡´Çß~%üöjf¤7þqà»m:·=}¸ÖZú{ëÚæÏÿýO3Ój>¾}aQâEFòÖKóßíØãÈÙñÂ}KÉ|Ò>vÐuò)÷µ»¾z»iÑ·¶gßøsL 2ë±ú±Ö£Ï>>hÚG{ïs29ÍëxÔ|Ácb 1ª;¥?¼ï"ÐàÕtl"g{ÍÌݼàmÜ|®sßq{ßIBþ.ûDä¯ÐÙKÙ´Ãyrôû!iP'÷²A"%©¨Õ( /jT@ÁÑ?Þ 5¡ëÎB¨síuE?èo@ºáµÖíqë}ÏDÊw0Åïvglü¤ät³É©MNKät½ô¸_bOܯl¨9ËlºïcÛrý»÷í>Ôv´ÚìmØÁL«1¼7ºòpö²MêíHQîðòìüU°8î6YlÉPÛöK$D`g ¡.½çë%î/c¼*|áj5Ö5[Ç¡qhñøçì]D©ÅÌâ»ÀJá$jÔ®Þø\jN@¡´Þ é"®â¶ÖÅñëék8Âèè ´Fl{2Û±Tó|Ñ~Ì}Ô°·«j± (¬ðT²AÊ)ÈÃðd ³yº ,i_@ù³÷°ÿ ëp¬ÎúǺIk¼[x¤»{cúßÀNÞ#´çvP°DÌÿü÷òÿñ/ à¿ñgã ?0Ú3x3ü<DÎ¥E¥v ×@Olo 8·ÅN¼ï ;¥ø;£«ÃNü°]ö t¾ÀGËĽ+µÝ [sO£ÂYÉ*«bª`kÕÓ@Wk £új={½/ÞP=Þ ¢ª!±0N1c²©$©NÚËNÄ×òs°7=}!ø uR~³õÕýè~ +Æ×j¤;°Áy£)©>°Ë7OâÔ@8E,|&¢óJëà¾ZYbPf7ÐÖ5~µ²z<¾ntí|uTäél®°ÍðÚ^ûnQe;®\<Âv6\ »ÀV¯)êÊÅøÅÆH¸ò¤aîo½®Ïô0âh¤¤[i úB®øÞFø-~Y{/&yii·[3:!üXûÉ#&´<ÓýkÖ8©ô](H³a«¬ÒoIB¢Ôêt±D ÅZ*ñ6gÓ«UNµN¨rNë à*S2MvÉÊÒÅÌè¥I× ïÔ|Á±ðÉÌâr»Ä¢²Ìð2fOxJª¨H÷!ÉˬõHEÛ{ÏÔPOÿ*Q×KÔnæë·ÔR@ȱÄP| ض·³mû´ËÛjöüjW-}ÍËTj¯^@¤NíR§©øDâTÕZ$ÖXQ½n¨°Ä }e×Ú> ½{8Zña´ÊÃ>htAK9íÃ!Ðb ½Z&"ëú¾ßRùáeé |üd~ÊÏÛüxXÅmÍ@DóÞ} ioDó6¯Ú|hVÝBcmX¯aÿõþõß°>þW|_b½Ó/6Ã/¶ëç ±=boÇþ6¿ØïZÄÆ ØÚô>ÄþØ(öÃVØÖVØçÅþ¡Õ7w/÷Dÿ,6Ëc Õ÷ÒÂVi´UòhcØ5³/ùËäÇùågúå+å÷²¨ ¾%X~ʯMëKþ?þ?þëÁø[ýìÿØ·ûûPp¥ô%vMØi~±óýbûÕMÀþ[ýb¯ ;ÅîOíCl÷¡@±_ò=wÈ'öåkAb_? öìÿ_lI ØÏ¡àÊíKlyØýbWøÅ{G Ø4ì¿Ó/V(6ÅJéCìÀ ±-}b>èûîÕ ±ÿ8 ö jküb_< ö Kl¨bĵ'©úy ª]û}¨¾ÙïÓ¢²#ÕKûQ},ZPÜê??¡£7ªYûCP-Ü*ªª\(»®ú@5&Õwû|¨ÂüZìºê}Á¨¾rm{ª×÷ útß¿¯ôFµl_ªßïA²/Õ&(»¢úBõо@Týý¨&ûµøîrªï÷£ CgP9÷ :³×ÇïÛ˽Qýioª{CP=³7ÕûPv¥ÌêËþï ²ÿ{ýö߯Eÿ`Tú½Á.Óä½!.Ó¥æo0BRéT©ò}%ÉE¤¿½ÜÛ;|¯9Ä;ÜÓâ>ßì~ eWþ}@ÝÜuv³êÊfÔKAPÇ6O`² A¨lÀ1~~ÑzO`[SÈ^i À'BÙõ|b¨>n Deiò¡z½É§ÅìA¨m FµYt¡k Aõ_úÅÞ¨ºCPE ¢:Öj0¢úðþ>P}ÓêF*g£Oê¹Æ`T¯#wª¼ÆTküüV½QEÒë ê~(»û@ª©ÁêRO·~Bµ½Á IS'k¹7|¬¨Fm L> ²©þêç÷}¨°©z5Kô¼ið£±ßÝàÃÎPAÙÅõ jrC ª«{|¨ûµhr¡:°'Õ%(×òA¨>تq_½«7ªßî Aõç=!¨rö£ª²ëî} ¿'U´U_«4Ug}ð ,4o®À#õ!+ð§z¿Ë´÷ |§>dî®YëW`-]93ú@UV*½Þêi¿ÑÁ¨nï * YèPõ8CPòóê 3èAõ3Õy(»6NïÕGÎ@T«>T¯8ý6ë TsÁ¨F#PEæçüCoTîºTCCQµÕ£¨Þ»¯¯û]Ðý¿Îÿ¯óÛ¬ïïÿuÁ¨^A1A¨²êBPôó[ñ}oTw¢Uª{w0ªé@âj»·TÊ Tõ»}¨\»ý6ëBª¿íFõkÇ¡*Ùêu?¿W/ôF5wwªe»CPë êq(»º§õ*nw ªËª!~-êÏ¡jv£rA¹vrªw!¨?ÇùÞ¨ÖþÆÎ.ª¢}üXïÖKE¾*ÞÑ^oÕ®ùæzÁ¼¡¢`^P ¯`¬Ë*Þo¨ h¨¤ ¨°ÞÐEÔ¼Jie½ç´V¨¨èþgÎì9göì/þ|>ó3óÌóÌwfvfΧXEµ¶XE¥/f©R!.´é¡¼kÙ\ɵªå¦Bxï3-×|ûBét-wg+©åR£àå,-§åÚÌÑr/!ÜÖr>×rËc´ÜXWrnÅʦ²?%¡mþiªí§W¥§!béí$^.3£ ±°\#,«@fáGßqÁõ¼HÅÕRÍõ]ËÕ¹öwrÁu»HɵHâ:S$qÅþÀpÍ/RpmÅòQ2׸"kaáº#³ð ·]p½¥æÒ©¸^²\½@E¸ÞÑÃu¶PâúPâÚzáÊ(d7 Å èÙ(,.Tn`-·Àç2¿ã{% jå½Ç } Sóe@Ú¥f £!.<êàðÍB%àý£ h¹Í ·}Ñí WçßÛóåóïòù÷uöüû Âm)D,d·ËnÏBDèÊíªJ·Ãd·se·ÿfÝv8È^ >¨º"òAö¨ÍAö§=×/kÊBËT5D-é²æ7Io¹@+8 D{@BÛz@B|AvEûü Ó%Z/ü4]JËqÌ.ú2åìZy}øÇ_DAâ4, ®ýg]p}²KÅ5s«í.+âÂˮֿ]Ìú·S^ÿd®ÒRvýÛ©àú"î2×,׫³ÜGüõ\swª¸ÖîTqéw²\©Ú¸âµSÉÕRæzw§üÌÊYëq&»6Ù©ZË2U+àïN·îdâwåÞãïY]ÜJJmUÊ·º:/2UåâLÕbÙ;],çB\hî¢U´ÊVqÏZåßR«T0òC¢·9,ßWîí⶷+3{?¹ù_θèíUoïÎPõö䶷·C\èÙÌ×´%WûkhÄű\J®¶¤¼ÌÅï`¹¼E®ér?ò \qåîPq]Þ¡âZ±å* ¸0©©®´J®á;$®y;$®¶V«ã˹¸ºì \«e¾Çi\ÛU\mWqÚÎrýq!¥IoçQkrºÞv b/PÖÐ5=XûÖZ4Q®Ñ>MÈÝ#EË Bø¥$Ð !`ÍNu±F7Þ®lýòmRë?Ý&µþ¾ÓLëÜ&Í!Ùxð-Ä-#Åí &äõâS·VÊv ßü]ôþmJÿ#eÿñ²ÿö¬ÿÎNþ¢ñ?'ÿÐÿO\øoÌø/OùÓeþb?Ýâ?Ý?ù]ù_ÎðËþãeÿíYÿüEQ,¿ÿAèÿ§ q!ÁËEwç®fîïïfïfg¡±ýjã«Åç[FáÆi*F5ciËèxå§b¼¦d\&1æ§Iãô4Ñ&.1ÓTSÒcV>ÃèéÑ[Íøvñ§U,ãë "àHÅÿëNfÜ·JbüvÄÏ0&¯bw£rqò*ãÒU±øÃøFÆ U*Æ~«T/W²½AE(÷puÿa,])ßÿ[)ßÿ;ÄÞÿ[étÿâ;ÌNyè_ùtäÖâóy#>·av~@R+V> ¶Rõä«¢Þq.1 âB»ÆÀJÆÌc=±0a<af¸å>øŬb<j&5¹ã.ÇUñfã;f1â+ƾf%ãËTñ-³ÄXË0ÞJeBÜòa<ªb¼J²q\0ÎOU1®OU1OeWB\hëæêþg*sÿSf|?U¾ÿy½ÿib¡jñIÅø§0v9È0®þÚã:1Ϥbmb÷AÜö!9@{ Ð^qqö%ªÕuzZËJ¢½ÅFßÑ@ãbÂç9 Ê*'£tÇ71-v:ÕA©ÓÊ^(!½k1¿kW*»QBew*{åÃçå§PAådeìtÒüBè¥Abz×®Tv£2ÊîTöà(k0e ¦¬Á5Xüø9:²RÈLY¬ÁÊnTPÙÊDFÒv¤íIÛ9r2´m#iÛFÒ¶¤mIÛ&r²CmIÛ&´ ñLýS?ÁÔ"_$å$|õÆA6ÔÈ"£i<ãq¤zà'JRmÎK,'Ê"£iËA_ÅN÷20ú ¦~©`ê'ýS?¢$Õ%þÅÿ{·¬D[ß»øgk´þ_º·$;Í׶k¹7vh¹vfh¹bnZ® ! ð&;µÜ0³ \ðß]Z.ÂïJ²`Ǻ[ËÕ@xmû ´Üh ¤C(P¡ ßa-× èé0pÀÙÀ2'=ÒÑÀ`ÀÔÿq5äy¾K`æ¡Ò¦ ¥Cn|'¥á¨TÑ·eUþù׬ê¿Qõë¦bÇ*4Ýù«N/ðo½<ç8)U ÒFIÃé¤J½Õ«?õÛçB;Z^ (~'EX"[JaÑX¹<NCS4AÃr®7ó®9åEy]0ïHZÆrh¹!j¬k"VQ(Müg®Í_żO1þûàrþÕÝÒ?úÍO¤÷º`<_ßãϽd 5¨ÐÒQ»×ñÿÇiø8Yg6êT7ë*{Eá²ÊǨrµ1ñ3Sòs5KRh ¹©.ÐG¤Ïøe ÛáðägíWÓê/ Ô ç΢ç ÙðUTùTôüp·Ãó§²B.*¼ÓXj ÿ5 ½8ÿ¤dXL#¼=nBÆ Ööa î¡¥/ývóc¿ Fú{{ã§JO À¾Ñôß*£}=Ú¿÷äo( ^Þ¥(X±LQ°ÜÖÄû¨Ý%Uý/P#/Aλ y¦ó"êMÐû¤ÆV>þEf²ÿOØYËä:Ç+뤬óô*(a»+ VîT´%( ¶Ç¹ë©õ¼Qcessü¾SÒø Qrs|.ç}yú Qc§âÂàNë()>Øé¢ßÅ%*Vj"E|¦cÞ¹»ùßbF rz1òâBbq²ôOàγrø£pJ8ZíÅÊjÆ*,[,ÃaÜM}OÔÂ(+ÇÙÕ8;»gß-R³sã¬âø1ãL ñh"#ÃÄE*ãTñdÚÚzBú ÏØN»6ü ERÃCb\$w&À]à7EG÷L¸pß×¢Cñý·ª(þ^¨¢È_¨¢([H(íp³yÛX¥U éU c² ë!.´ò%kjMR°é*Ù^nwÁöbíU5ÛÍì0{²@9ÌⶫÙ]ì0½@9Ì&-P³sÔg´@ ÑËDO5DèDãªê¼tPé¾W:Û;÷âU½ó2^Õ;ÇâÙÞyqa±ÅÙx%Eì61ñ*Uñ*Áñ*éñb_ºcleAZªAz¨AÍgA:!H73º¢34Õw|ÿÓ]ÌÐ;æ«fèãóU3tü|v±Ü<_9ºZ¤«FÉ®ùÊÑå>_1º¦CDø³3ºÛ[]@|?Oñd ¢`j¹:ôK7ÒüíÍì((W¬1óTkLØ<;³Æl¸¯6f(>§¤h梩¢«â¹* _bðÇè:´±ÌUÜ«Y7)¸0ʽX\*O¿Di?*ueÜù±NJËQÉÏKq5®ðÒÈeÖÌ«ÓTË|Çðè3×é»áfv4Svhà §ø%0´ezyrX"¯|¼{êî¬ ÂjëFsSrc!ÓÓéñÝð©jä F|¿Ð;îd.ÈáL.wIYNCËÝq*÷@#^:>pÊüV#ªeë÷ºdl¿£l¡-%vk§ÜEÔd£ÉH »ïQEõu´Ø`'s5*ìñÊr h¹(§ry(°9eVx RÙ:¦ÉéLôriB#aMÈr$¬¤ ÙÅ4!ÇEr ã<èEµï9/8>¢UÅ8á ½iGvL)óÅï8J@Ü(txâ®,1_øÕ]Qâ7Üé(s8Ë<_(Px-Qì(±)-|¡,ñZ¢ÄQ"õ-èÑ8ï(Ñõ1]xñ1]hHK\rxáÆO¸)ɧwÜÄeIW8C#L.w$@2í ½F Cc ÕøÒ¡A¼ví"Ì¥yÐÔ3Ù¼®ÂX:Íë&¼Gó ùBؼáMG¹h¡×]ðr.<ç¼ÂoËtá.G' ÃPéH8Aî;rhïHØÊÑC7´%¬ ¨mÉöìÉÑQ¶ÙWåÈ$åÅN² ǼjGÞ ñÜ°Ôt¼7ýâÈæ&"oï+ªG |þ[tá˸h.ºË.nF)\<b]ÌP¹Èb\üE\ø1. ¢X¥N.ê©\èX_@ÔtC$"ËJîsò÷®ÆÜ:Ð÷Ág2äeJ¨ÆÎâ°ØÎà÷KßSnsÏuKè¶B÷2e ¦t W:°½TW²9ZBx Æ@©îy!±&ri°R"øK¬ygi#Cx"ßÆðQ"ïmøD¸ ©ü{Q6Vø¢ïVÁ¯¥MÄ·æ%òS ¡Ó\|§ø#ø%ZädÆ'o_PNøVüà&ÜÉT <ñFØ/~ðvâ½Î¢7áË1uöîn)^B*yï?àÖ/¨E77Û"1o -Ƭ+·ä×âæùÞ»Ý bB&è1á¸p Þ'Æz¬â±MÖͳ½ Øznl®ÁO-¼á;~jÜÐ÷+Þ6 4[Ââ@ózp ÷ ã@?bolÂsÿ¸ÎR+dc#ã×&-pY?h~ÞnC³¡:PX%hÝy®ÐòGÑÿ·åóa¤L¶²Ìíéø|£¥'Z_(µIçmÅH5D&3ývFÃyFÍ2Ö¯ÈèÙ$Dq,ò3ívCP÷нÛP¿½{©ÆúEë Á3 zõÞagü8é}¯ß·Y¦|ßfdX ¿gËïÛÄl7«ýíú>Üb*SYHe¹TæPMeT¦S¹ÊJ*ïPYAe9eT^r¼÷( TFSEå4*#¨Dåx*GS9J=©Då Ü2ÞìzíñCÐöðïó<øÀÚaüÆlWf¨pØÑ+x\RX8ÙÄykMÄ>K,©0ݶ¯I|þ¯%Çþ '.×?¶ßÚÖ-ÎícSé¢é_ÍQªiÍJKyÁqK IsbÜj¹À?ooÍ:béM+ë:/ ±1ÿ5Ç 9)rÛVu¦½â1$À¸¸¶k±QWcÔUuU>× {]1ÔÏI¨yÛÐpßGq5ÁºZS2HDÒyóÆ°):[BMÇ8OHÿ>OÀLMï¸úÆ°H9c»k»Û!¡¦S\}H+ÈáÇ1¬ÒwgØp~DÆÂî·»ëÞõvÂb[Ǹúí¾Õ¸] 6Ïúò¢ãsnàã}rz{q5£7ëªy<;ÆwGø ü³2.·c¿OR¼¬EõñX.®¤ëµ'ÎtIxÖ;Æ#áL½ORûÇýfRÒî¡)´2ñY@µÝ7së»]Ííå>{fMx:".©ñð£2ÜyµOMìé6×ßx5ªa«¶}Ðõ¨0¥9þGÎÛz¢ål's@Ìÿ`&«²ß0ÅU«l¾$9ñùÛ`1}RÛgHå<7«iH¥hOCò`v)´É×s¨ñi»!_ï|Fý9]¥7ÔðM¡ÀQ7ûQÎXn?4¼ïðTgèïðt ¡q¾GÂÓOàyò(¯)lÝZÙëÌÜ·-8Õ@^\+ÿ#ÍîÃjklÒUZ<È¡aã¹ 0ar#ô0¢ ü|Ëÿ§ÓÓæ¸+»Uñ{`.må«ìdþ"GL~ä:§¼dÒ+å{ÀÁÞ¤óà7]ïáMÞX__¸åÂÎxãyÂ0ÓïÕ_^åá1GUhgYëKjÀ"|A·Õü ]ðæí*<¨úÖq$ Çá0Húã{@ö©XrM¨!¾>U"7SÑ {£+Ï>÷Uäóg\<üp½Vd$Ça£L¤xraþÀ¡0çôY"àt³>ä¥)¶®öë[Ux¯"~ ÃAR_(di%jT ®*ä¿ü/»}g%(Ê:EIg2êÜÃt¿ù3dîü :YIeô3cé1gd©%ZÂ=¯³å51s3û { /JÃbÿsBH±æÐ*¾ªV$⨠!åT½de+U~Ê¿Âä×Ûòº¨ÕU9êXåÛ9¥ÏÄBÕX(o<m³Ôh'jdQÔXE4jø"«ùàñÊV~[,óÌÁX-=2Ðà×âÝ ÜCéjl>ÁÛ°ìºEÅCãùΰ54}`N~EÝ|ðÈn?S¡åNá/Xûáßq¸Ýóò¦>:\-D=BïØ{Ø;<OåB qOþ«WX Vã¨ßy2Vú5 ¥Fb²Ù Ú ä6¬?R<,u;º¢ì#ïGÿk`{+3fFÛ¹(^5kÎöÅ=ß øøfÛ<ù[P½}XR)^0À%uXxM×í£éoü ï`×?ÌÛ¡µ Aç´N{~ ºû¥:Þ×÷ TWåk\\]ª«´ûzØVvGm îªTB3âÙTGè«W^w°9*ù ¡dëÈÇb³Ü~·ñÒ×ÌÐÇRïêIØ?¾rÿôEǦIþ@ÇAà·U8ÞwGìwâ0z(éò½1qï®á¸â¥cÞ]Ft[líø%ô¡ï à [¨ççvûû¸O 1üÇöá»P³¡Gǵ¨Ùv¡É Cs[ç/0úv"ÿ®á5Û¹Ö\5×ÓëeÍgÍõ¶æúXs}¹~ÖÜÖÜÖÜæÖ4~!´0ÙªÄÎt¬ °Gqr8âo]-6ÿ£t¥§ó6®M\ص:íÖÅ}XÑÙ¸m «®Roêï§ç+ïÂ겸 ÿä|\ØÄ%äöKrqz_Ïoäbÿ$<|"0÷¾$s/üö4ª×£väÓ¡UM4+Ë·x b½IIüÊøâ0J>Oâ0n<\F"å¢Yô¡áa^ `ÇͬÉqèÛ.pÛô|gÇZm"ÅÓ±8±AâY¢ílÉmo"¶ÝÅú®ÃvEl(l?ÀýL 4hþfaÉÑ s´1_BÑÖÔQ|IR¨4{jYek×ÕsKth ~NñïEÛÍÝduw[×}ÔrÍrpXP³"µB¥$sëâ¡¢ó|Ϲ¿_öy>>æÞ9çÜsÏ}ùsî¹÷þFñÉå|ÎZgAä·ªÃô§ãáaê¯\skÏe×)ýb½½?ëØ%ÂñÛ°#Yÿ¤|qe& E+Wè&õ¡kã¹ßZJ]ôÒ<ûhÃ.lÏ¡\z#;>Ô¿A QhYòßÌè¢D ±£g©/Ò>àM0±8Ùé24õ¢UHGtLhÏÁU+vè'MºÖBúè°¶ú\]úÀñ8=Æò(w|¤;Ú$Yi°hmîNèÔX;7ºh¸(;Æ í5_ù£zHnÉsU ¢ü+rÆDW<2&fxãâ³Ëu&dçý=æÎtåCÇW]¤ëJ|q,QÆæqpÕ¦Ìýù^']¢¢Uݽw dÈÉ<-ý:@1Ïj+R~fymF´i<Ò¤:¤{ÄóäEÚ´éa¤[®EúÒ H×!Ýôu¤¤Ò*®BZt9R'R;ÒeHDºé|¤>ô1¤³>tÒ<¤9H§"ÍBjA:éXiÉt(µ)ùRITÆé { ç7<êÃ6½Å2ÜÙáFd³¤ÆNÃÓn§Ó °t¢N§rȤú@áé@Å÷aCÆÙ"'2ôöõ9/^¢³÷UîÓÕ´ð÷2l¢cPaû}úXEîåá%u ámGlU( <õi·ÁýÔ mÕk¯qÚo±¬ÄÐ%ÃhßK³¢/L*ÒÀ¬¬Áú×?ÐYìÓ8n1ȾTãQ³£«iü#QøP§>oþþ²ØMYìFÌÊÄ,³ãßWD#¯C>ü%2Ëì«hÞ4®ÖÞG£ÝÿÝ,·£õ=z3÷e¬·Båùåùm²n³ßau}DÖ{&øÿYVû¸¬Bû]Yf{.|á·Lö4*TNVöûë]Å"à¨qçÿ.x=þwe ¹Â¤MYé)ÍQUgmØþü«Ýù§¹ «H«YIfÊû9r®zÊÞÐ^³U¬Rx¼iùÂmmrç7b ºÅ3ä{páÅìÐ;蹧ÖAm·¡5çÑÐ[Ѿh 1¢5³ÐA÷môò$Å®pÜF[ÅíÎÎ4{³3ÝÑ4ê$o |½ÇQÖVØT=îøÖó¬v'UÿFENò¿+½Bç<i°EedØþ>Ýáåݨwhõ¿¥mçÌÅñ0Åñ®@¯%CËÍÚ1×åµû%\AJ »þÞ?ÀVI5øvH*QdØÏ"êdS ô¶S[[>+Ò§D+:eoÜ~C)é;øÛö£í®£øJ±>.iptËì¦Cø×£ï¼Û°äÜ´(þv¾aÝßvü©VåºÊ©IÛc9:ºLËÖ¾·ÏÑo5¹"'A¶ØqkEÉà0ÍqÚwE.ccw< ds_õ2V&KcàÀ7~# (À§¿eÁ¿`A oybPëâ»?Q <Åï>¦X9}É~ä×?,ÖJcå¨9pÚ«+ã$°ñ÷*ÈÍb$õQ .îùãouQÀ#"«R©HQýgU*²iQ&|¶§ÖFo ÃçbܵäÈ"n´$s^7Âì''T.å÷s¸Cªí&) TÇ°gÁ¥½¢P)¾ø¸X¸ócªß9¾ª¶ßä_Î(ãa:¶¦®I×UÏ%'`:íQÜ´!Ó+ÒYOÌ«ApÔ1ÁóbÄÃ9ÞIJ7ó3@ ¥wè\VË£L£l xÕá>Ê´r³Í½yµÄþ+³ÏXêñöS%ðPK>¢¡Òêäå1»4:2*©¤îþq3#üÁG¼¢íCR>gnÂÈ2*uiQ`c)¼µÓ;åW!.w2/-*I~Ä÷9 YjiõùÓåi6sGk÷(ÉzÐ{tÕ»)®Úu¼ÉÔãä¦Îwë5ÿΧÞÕ V¾ØÞ°uúòüóüõX'TÄ9¿ÇNÆùÔ\g«iÑÞ->o3âÐyW¯°7äbù]g% }ò -*2Gô²?Ðë¨[þo¸£[ÊøOúWº&hV<¸I²îٵ͵߾ĵ³¸ Í"êÚ=Ä ½ozÙ7î.i,¥ÎÕaXyý~WÞðÂ?(0e*ëÑiÑlÆ6þ7ªyú_ª¦kñ¿ÿ.aÂn{ ÑÛìC¦ÚýOµPËþ§ÅeJ5ldØXÍ+ÁÓÑXàn|q±&ßÐ×á rýè0±óÄtoQOI¼h¤$J´y·&å¡`b^Á,ѧï·ÐÔ¼=tþXit=£)lʬx%;I¼sú;«ÎñcÕ^Nì Ï#Péjk¿ÍÈ´U¼^_eÉ2ÝÖ/ ôoª·¤v ùäýê-º·ð ²:ËT^ª+&ÇU²+U:þÔóg¼\Âæ¨ÇÅ4;·Q§©ZDêcúb=oV5LßxC+Páö·¤<ÏÐÚìySÕ®±Çrçøî¢%Ø#%æÐ-Tç¸æwÁ9cÐ_ïEîpÿn²kñYÅÏ?ÇeaäÞ-_¸óÐQyâ¥ÝìJ5Ô®£íÔ?Õå¾gûë®{wË}ne¾ûèðHàY¾=Ð%Xqx_ËÄt¬@]éDapÑmWmíDµ'×?hVR3Ä0Ô³þ±.DÌ×Ï ®hÕ:Bz%9)x¬L%3V·ú2tÌïÂû86FþÇ?`P°hþãýWàGGÜø®¿nvv^>Ú¯ôù¾ »8¥ÜUSøsÇ/~Q»¥&Ðf ïMÒâ~Þ4Dí"Ü÷ë¤-ÂzN9GoÚùóVO Ée¶Id2ëLKu9í¡GPª3¹µdÜÙ:Wmbønl~°üY¥IÙ«IJo>?½M¹G§ ÷è¥ê8hÝÑJ¶Î«{¯T*úD³~©6`DúaÈ/Ѧê|ÿY¶a,Û]`mØ e».3¡;x8×rNã vOÎG¹öBs±*dÖtÿíº|Í8uà%)¾=çÿPæ¦`Çÿ^gôôÛÞ[ÿW*Þÿ@ûã¦}óÿB»OÒ® ÑòX |É HÍåé¡Dûmüe($´1[Å&Jÿö)²®ÚÑòîc0ð è;8°[éWq+ªp$z;x¸[éj.äqçàgºsG páÎZaMÉ«Á9è<º-ÃÐïï å®H";BMlô̸³*Ùz¡½,Vx²2ÎsXÉ!&b}ÈÆYÌDu>Ót¦Úµà~Iú1«Cþá94w-Å¿aUïö#?Õ?r-çÇ`§Ò8ÔÒ}Aô"ºëô&ß ðìì\@Ì˨=âWay ²!ÄÖâ6fÃT7:&ÊÐû|Bvzú/zý5¿pÉ.²ÿúºýØçjî}êª=Ý-æi§+4è.<Gç1?À¹&Ý1ÓIU:uâ¶ÆeÎoèrt5Ló!¦gAWDÓsO×òäõ !5ß=6Û-ºÎº`({;÷"¬iåðQÉ ÔJÒî7QàéCi?TöÓaÉïBÕ:QSs*Tâ²Jõ#ßûl}@i 45§Ià <û-_tÅ¢ ¨(ÁD ÖÅj>QmOØq«ô¥î&g[É '¼ËSXc [P%(±ÍubeÍ(e£4ÞSxÅÝAâÜ.ÄLÑ<±æT/Pܤ0Ep³§vkö ¯H¸Àôä¬ÔÆÑ8§mñcȬûðUøñÑÒIà×fóZÞ+zfQÙ²Ìàw.KÀÂè÷£e±©Ø6*ö/2¹Îÿ OãfÍÔáuòüIÏ"¸Ô\hxÉq7UUJUÝ©V5ªÿ¼«ÙÇß}Û¸.ì¿ËdöýýQ|Ù¹Ø7dJö{SÁGß×ÃüÃã!>ck7Úÿ©Å¥.·uoÅê0¿ s¹RçYÃÂ^:G£QËä]Fâ²Gx_âQ^åÌMÔGx_Á(»RHàrB «CÖr¬¼¬«°òòxfÔ &ÑzÍ,bg¹(:ãv¾S_©±6YPÏ\]hs¨ÐÙê{~ñ+~y¤¼^6ÿ@Õ2ZRûèÂW?ðÖ5M<kÅÆsüÔõ°U{5bÎÝr>ãÜ-çèÏäñÂóÁù&é#Gñ4-EB¼"!uØbiárlQ¬èîàHËbGÒÏ&"×:RHÅ**ù!ÍÔÝr¦þ<Ä"M¶v 1**§ ¯òO¥¿¥ ²Bün$Ϧ̫¨6'ÕöZÛ3TÛ¨ÍÿØÕ5ü×Øë×0åª~&kø%×0j(§j )Tî;éË.z¸óÐqþ$.þCØ? Åã5G|ù×áAI>+ ^ô)LgºX<záÿ>÷i/ úþÊÙ.õþÑ2¹&é*Pn©³n¦ýZë6¶Õl%v¬[<37dT¬[Ä34ÆHH÷þV|5"^akNÅcË°Â-!+ãjãLí Ûº!ØV¯XD¬®m«¹æ(I|MS7üM%yßÔÊå±é?ðjgJ¢¹ÕáS 0Á3<áz£½h *¬JáCWî¬$)v')ÞÁ§ølxW)2ÈØØ çåò¡ô_ßêC©$ÿu¹|ëÁ`¾ áëøDÔê×%LüFlµa&D*#^JD##ÞuÑ&Fl Ñ.J{ôìÝûr@¶$!= od4CR<x2!c=<K,X<cYHC2<Cy 9ê) wÑ]÷S2ÕS`¡wBdCò<SiýA<<ä)ÈÎï-ÍÇ<rõCx ÄOG²ÈS° Ï<A*åÌSxæÑ9¯Ê§ðÌ{ ¯Ë§ðÌódy ϼg ²NÎ< gÞBl3Oá÷à¥ëóÄK×æ!º ³fÃ¥nì¹ýâõùøÅnì¹þb·aVüùâõyÍEæèBÛÿBý úÍÂðonÐÏÖÐÌÐÓÐÐÐÃÐÀÐÇÐËs~«~~{~c~K~3FûÄâüÄÿ(ügâ´öóíÚ øÿ à_þ à_þ à_þ à_¸dëä ª pÃx²P!ýh¦Rõ;s@·ÎC|JD uµrÖ¼*ÙÜN+U8ýKâ8í®(åüx8%Á+Ø W\MìáíU\Í9p}GoyýÚÒ¤ò v»7^""¯_íîýó|ð5B\ÑËS¶²±=Ú:Ñ2ÝÑï×ø.ïPrîê± ÙLmä¢b!²"-òßĨWéûåA÷F³µz¹Qh½uW"µØ¯ü7Û®ñøö_ÝzzY4fQ.ÎÄ«ÄÄô-Úæ°î¯ËZú .GÇÏ ?úE9ð»D¹¬ßGÈzBþ w×#ÛùÌhÎLo?Dä¯yÖ ýc*#Ð0ïÉÕ%/ Ì/ c/"ÐCêHÄCÄË30'ªÄN¥è2L"e.'xooH2¯ë¦ãVÿÈD«èõòËLÔ]ßýF½JDûè)&ê®ûfH¢µD´¦2Qw=8Dm ¢Dtu×L$Ä´vѶÓæ j ߶ò.Be¤j¬_Ø]M!ì.ƪ{©ÄÖö"yÿÈXÕ?$k×ËÚÑgDô[&Ríz¦dq°Ôb.cU,±MýaÇ3Vµ÷ím=IØg ;±ªí?ÂXáæ1Üy èâ %MÑ´@áa®Ê$I3hþE4¦ûç9ý£L:HO¤´ÿrIw>B4K¦/Ótóe>4ó梹Ðhº¼É²Ê9@·bÓñ$Ñ"úºþ×?UM(6ô%h:(øÿi:¦}ucÓѳù¦ã5ÿGÓQbSs7Óa¿5d:î@VL éû|ËæãÎ[¯6ç¾êj:F20u1 ýÙtèéS©]LùË®¦ão 3Sæcwÿ°éXEÈÔkLÇòV6¯}2vÄyDÚÕtL'Ð~ÝMÇr"Î Ìá~*q)ú¨¦_wÓ±0ZÂüµ_WÁ[©£^í'Ídÿ°éh$øò~×¹?MÇ;Dô`¿kMÇ]?MÇD4ªßµ¦£çaÓ±ú]k:N "}¯5õL$îIeÚJjj Ñîê+MyØYÛë¼ÄT½í³²uý°%U=ïCûawö ƪ^ø?eíq'îÜÂÏ?M`"Õ1¯,ª KÝ*UôÅë%ì£d¬ê°Ïؽµöd6Òy¿KVo¿°æìGD»û\£9ãÎ5g;joô¹Fs~÷}Xs"§û5gÈÏ÷}ÖfV æùüo~Ö ÑÜÙçÍù,ÓWú5çcDªëÔ¡%AÞ÷aÍE4Í)AÍZø>¬9SfWÊ5S/«¤ÞWwr4'éñZ¯£y 1^eqß½S4HéâÙ£4¼K¦wÖãßÚ%KÆëóQ` jjSÓ_ÈkJ£Xçô 5O©k?¡ÿ|L,büX£¿Û(á#3Ôt$ãGRñ#3Uøh5Cx¬a$ñ2¥¦jJô:¬k$ÝBÎDäú©ýE]C}.¡¶ëÐ%Üè]a° jÕ6Ê6ÛX¨¶±Pmc!·×IµáØ;+#VGuKÈPJïUú¿5TÙ1à ®Á¹I}^v×döj.ê´É¥(Yå¤þ(ÁôöÅ~Ìóªi(pQuÚ:1üRå©?å-$¢RC?î-;·-;wh2uîwø²sôdÿ%½1.Ò¹×÷4<Ç+Â=ÑW²bõ7*E¥ß¤ÒÙTzm¤.G§Úç\-äÑ~7ò±~W yÒDBN¦/F±ê8ÞC3÷jÎÆr¾ó½ó0æ,zÿrâ90Ǫ©p%¡ðÅý¥tòÊ^Cé×j:¬ZläÏ6Ñz®mÐO¼ÐÎdt{ô_ªÂÒ÷ªûuonÒzª5µº.{Ó©ý9$á÷Hª£Ôd¡Æ|VQ§ "§«^W·¦J²ú _Ñ/¢F:.8·ÐËJq°ü ?òíò5ôô4¾F¯Qyu/°mD1Ãö-\Ñ·T{; Igr¯I[Í;õ4QϼM¡6³WÂlìÃQªAñß5´Ëçy©IÖ>ýoüÝÀÓÑYMó4Êô Òêª×ïªþJsË®Xߥ$O ðZò¸ZÒvÚÇ$d-2¢$¯%ö:=ä[0ÑÅâI×êFõ ÇÑöéçlk;ò¬µµm}ÒÞZæ>Û.Ì á<ò °7«2]<rãlsþÞoÂàËÓêìHºr8Ýò:·<ÞÖ6¬ô(ºåa}0$Ú®ÚD¡£Ò*Ë7J²Nç]%÷7ªR=ªfe÷$Ó[K¢?t Ì!çźÓ3M^Üæ&ÚÐ[^ÓHÔ±ÛpkE=ìÊfÕ.S5?ªÛÜ<FÚ½mèWsáÿ#, MtÞ.ÈIÎÛðÅé"r³ÅòÿâuÛ>«¥QµGò?Pçlïÿ&KlÜTw@?ev_oÿQöÜûÎ.4ǧ/CíäÜT§;W=ÓÖö¡ VYÃ~óªE¹V¦·|.»¸1gw-îZÜïPÁVP_FgEïlºHòtzØ®Ä}Ôø2îÿ:Ò'b_ÚDCKCW92YJ^Úð¤ô§¼´7Ô 4Ò¦±ñRä9r9m_89^ *HW}åÎìªïxL>zÉ2ò"VPÑûÑ^òÔä[KÒ;iMÎá6IwÜZ|Y{+v&=: ÝÊG&Wå ;Ú#ãÏÞ8+ãî7ÎÍÖôO |ËLÔõèÙzuϾo¢W»~Jõª ßf¿i⡼kSÆâå¿ì´|òö(Þ˧·÷YO²öMÚ}/¦|Æ]´K»ÐÊ=ËhAÚ×ÊaÊοaçD{iH&yãQ?hYFËK¼ø7£Ä 'ÊK¦%Ê"ÀMáDIuYIKÙe ÁE K¦á¾ö¡H]]C¸®$&ÒϵµØ:C¿Iþ$np$"ðÜgFS8ø#G$G%W̤Ç(Iþï|;#õgò·<Æü}"Þ8Òþ³Óéß §Ñ9öoK¹æòÃô»oEàªÑèûW¥ÿÕDE«Ör@ÖwÑm³¾äÂkÑ¥ÃÓߧÔþæÌÙËè÷)E¯e¿OéÃkíïSª§þì|úµÛéä´¼hGü,õûf33)¶Ù)î²Sôµ*Ѳø¸õí9m·*ðð5¨ÀîþÏ[ñFËÏ[ñ]ãôZûqü§¿qõJɳäÉöÌT{¥[ÊmÒ:tÌn©È>!Ç&Tí ï¸ rplÿ/m¤Ï¯TÛþC<Öæ~ZA¶« NWM nèÃP;úéríßö´~¾;6Û¼jÙ9á¡ÖWëè7X}Þe%¤?²ûLÎû9}æ*,mÚÖ-®>sæmlDCh{Õï°Iý&Ã~h¸ª¸¶L>~úÌÍ;Hëç?îãê~ Χ>%ý¡%¤xPII44KôÇ}¬.ü».üà¼õ£?¸s¼K%YQµÊÑcÆ_òO~:¶?W×ö¯ Ë@h½Å3ÏØ)íH8;0 PZHѦx½úÃߦ@.$NóÉ â55>i@ù¤åOP>iÅg )3HIÛDó´m3~o¢K0$QbA)3ê;Ssò]²@²ùè,)ZgùèÖó/ LóémA^ 21ÿÎ]×þTb`üÿo¾üGÌz®3»ëÌ®ç¬_ få 2 Mæ#gå31Ѭ(bcêX>!O]&#LzvðEólvL cK få 2 Mæ#gå31Ѭ(bcêX>!O]Ozõ~!»³ bqÆ»Iù6Ë' ä,c÷þZâÌB &ÁìÌ jÙõB]äÃr.i¶Ïæt"ÇáS¯eA¦´è8Ë'âãhNí?[+þ ü³C3§d>ù5ñE¾hr¿*³`ÊX0ÃX0å6±ü/Ìûö}â`ßV8ØW vßßÁnÎ;Øtû ÌûBö%M!û&¥}ÝQȾ(d_²»û ,V'+ÇÉÊãdåq²ò8Yy(EBáb¬Ø1?ãgb0°à+c|li)>Nåãdù8ÙÒ,sc|±óÉCXy+aå!l +Ï91>¶´´<,'ËÇÉòq²¥9Y>çÆøØÒÒòȬ<2+ÌÊ#³µYyÎñ±¥¥åaù8Y>N-ÍÉò97Æaö¼²væ ë2 5ïÉÁx Q.)dø8Y>Nfø åúi^z ÐK ½Ä£ô^â 4¢Á*o-oUÞ"Z½¸èE ^¤EôwSðÚÂO/z©¡H8 >5ÐZ^°ÊÐòèÅE/½ô"èï¼ÐSôBËÑòb´¼-/FË¡<ú{/Ö¾X¿øB/<½¸èE ^°8ö5XxÒK^jè%¥Oôo ôSéE3ú´~ôâ¢^DzÌóõÊÑòB´¼-/ô÷£f1æVÇ¢&ü ;Ì;L̦ò3eW©Í@!P´´´´th#h3h+h;h'h7h/è è0èèèÈñv) @Å m+ÉØÛ+ÉDª K}nA=½ ÚúD~C@Å a 7¨ T®=Ú ztttT ñÅö5ÙxL¤±G~¦4LTÐ$ÚÍ ªXÄ´ú å,ô÷ úTiH½çCȸp`zm2Í /j°LÌ@õÓá¾xp\³?Mõ%O`"ja§`=AÕ7acÐv%hmÇ"ñ`2cS<Ëè r]\\ñÅÉ´eg&b á:s*DòÕGGÐȾÀB_´!wF°ÎêÓÙ¾PS0Ù Q¦ *6lçê4U kê,妮´`&,tå㫤j(K¼jVÃ?^ÖÏÿʧGhwr\9§r^®ËMäfsWpµ\[È]ÃÝÈÝÂÝÉ=À=Æ=Í=ϽʽɽÏíã~Í}Ì}Æ}ÁæXöàûñù¼Ìüx¬góWðµ|¿ÿ ÿKþïp \q×ËK¼N|K< VIë¤Iíäî2'¿!wQ§©Ô êuê*õõ~õ{ê+êê©ÕÏÔj®ÖV+Òj#5]¤]¬ÍÕj´Ö¤ÝªÝ©mÐжj;´wµ_kµcÚZ'w·èç®q/q_ï~ݽß=Ä3ÁôD½W{·x÷¾ïý¹÷÷¨÷÷Ko{½³.è«õuzC0TÃ00¶;·B³§9¼ȼļҼÝÜnî3íåÇhûqí¸ÞÜ Zo47-·»»ÛʽÄíæsǹ\'´ÏH´K-;¿ßÃ໸ºÊ\ë&×w]¸6º¶º^q Ý Ra º0F$T 9âPq8Süøø²øø±xZì/©ÒÅRPKP«AµI½Y}\ý¡ºO=ªj¦;ì¾Éýªûswê¹Ê³ÝsØ3Ê÷þXÿTïdTjãZcññ¹á4½æs9ǼÂó͸yyy¯ùÈúGó¤IÏÖÒiµ3WÌ âFqÜn*´c1tãîQîÜËÜî§Ü~hÄ-èq¿èÖ.ÓîÕ^Ô¦¹ïv?ãþÔç¼ã½7z×xô¾â}Óûï/¼Nc!ºqÊPÌMzFö$=¹;ÍÍåïâ¹¼Øk¨w-sÝæºÇõø{ñH¤ÞÒpi4]º\ H¤oKÍÒµÒ iôôô¢ôªôôsé°ôW)Wn/wûÈåa²WnË·Ê?_É-òò)¹2D¬\©Ô+JLùrr¿òò¬òòcå òÒ^í«NT/SCêbõ^uæÑ&Bª[!×&í%íb÷åî{Ý»Ý/y>ðä{Çz¼·B®3ÞÑzD¿_ßÖ+oïï?Ö0m~h~l~b~f~n~aþÕ<m*ìQ{Ë9¹n\ 7»»û915_ÌÿcÆt-@+¼ëú¹«0_¸[xTøP$sÅââ>±ÔUv¸Cú©tZj/Oäëä×äcòIYUüJDyF9 |M£ÎU穵EÕÚ¬.U©ËÕêjuºN]¯>¦>«þI½H[ªÄXàá¾ÂýûÏî2èYäyÏsÚÓÞ;Õ»Í{Äû'¯ªß¢ÿPW/4ÆwÃÛ\`.2_¢cd!;¨ÆLåÖB;zòblç?åÿÂ{]·»ÞpýØÕE¨·äi1"^%¾*vÆA³×IHåÁè½²Ke·lÈ£åñl<C-_&_!×ÈQy©¼]î©LTªuÊïµr½¥TÚXíAmvPëðûcgçUÏ;¨Ð{§÷aï^]ëKôWô~Ætã[ÆÆÃhXjþÖ?JÈnº7©æáqǸr~¿ß v¥kë>×Aú'B'q÷ÅCâa±E<&O'E§ÔE!]-ÞNHD®ÈääåÏd^¹\Y¼¢¼¨êêê'jwmæÓîÐî¦=¨=¢}O{R{FûööVä®ußå~²x=ÅÕ]¼c¼Ó½·{[¼½õR½^ÿ©î0ÆãÆãcc¨y¹£øIww÷S?[ÃÝÆ}»»{c÷qî)Þ·¸6| ÿ ÿï¦-r½~#Ln>úCÄùâZ>^Ò!É~ËVÏ·È¿?G(+)G^TMÕÕJu:Iª^¬^ ;þ´úìÑHíJmö´övTé¾Ò½Àý´û÷Q÷HϧÓR¼üï>ïï¯Ñ7{?ñô:ô Qïëô¸±6ùÆ$s lÆÛ´Ö¢0õ窸¹ÜܸÁ¼oâßÅiëºÈõë'®_»g//?ÞÞÞ~,üJ8"C®×Ä÷Ä")!=*}=4G^%WÞ/{a+Û¡Q«« OV©-×Z´ÞîRw=ƾÓ3ÔÓÛ¸À`CoHVi}j\lÌ ¸ÜðA£Áh4¾m4«ëï«5Æm1w÷cÔ<þzÊø¾ññ¢ññ¬ÆÛÆ{Æ?3~aüÊøñ[ãñ©ñãOÆ_¿9f¾ÙÎìhv6»½ÍÌYæ.;.2n÷Wêªt]îºÖµÁµÝÕ]&æJiª¼¯r©²EÙ¯ôU{N=¥ViK Y½Üîî߸=~Ïßxʼ×z¿çýÌ;cã5½»a7¢ù%£m¾{hó93À}çöqG¹Bí ~ÚþþIþ=þC>ßÕÇ¥¸¦»j¡O+]w»p½ìúÔÕ_¸X¸AxNøÐ[¼H¬¥K¥ùÒUÒý°ß?þ :ÊÅòÛjV«½Íó|Ûs½ç§Ô{)juÆÛAï¥Ó]º[OÖgèé5ú|=^¯ß¤ß®ß£?¬?¡?«¿¤¿®¿£ÿzó¡þþ¹þW=×hot1úaËp£ÉÆã2£ÆoÄ%ÆõÆMÆíÆ=ÆÃù5^2^7Þ1~qô¡1ÊôÍËÌ:ÌËà¬77ÛÌæN´üns¹výIÝ8ÎÝ0O`¦,GÅÁ p!.Ê%¸føË`·pÛ¸í1wr»0ÛäNq¾-_ÀñÝø^|?¯â«Ñsùy|Oðëøûø üF~¿ßÛs?9á:N\EðTÌ®±®®)®¹®¥®åhïÕ°Oë\ë]\»\{\{]ûa«¹»N¸º ÅB0H(ÊN¨æÁ (¬X³°TX+l¶ Û ÂNa°[8$±X ÝÄ^q8±JygëÅúo£¸YÜ"n·ÛÅâؽâ)XÔV*J¤ i¢4EÂ*@#ÍBÒjØöõÒ}Òi£´IÚ.Ä|Ý"cô઱+ä±òDyË«åµÐÞõò}òy«¼W>Yü0´ù|\v(J7¥X¤+¢âUÆ*S0ÌUJHI(Kå°°ëûÊfe+ÆóNe·²3üaårB9¥8ÔµZ¬ÂÌ!ª^u¬:EÆÀ<Àܸóâ:õ>u£ºYݪnWwª»Õ½êAø£Çà](кiÅÚ \5/f)Z5üÒÒ°µaî[< z½ÞGï§ÔCGBeè°-=¦·1 ·%æVóc{ð~·×¹Ü]y õ~)ÿ¿=?³ç+®}®\§\Ц°XøHhD¯x ìõÕââCèW0#}"¶HÃ$ý0Oº-ÿôt>Rgy<3ëxùrùZå5åMå}å¤ÒNí¢¾ O¨=´aÚ·´w´¿hîKÜQ÷íî îï¹÷ÀzzÊ=c=ó<u¨çIÏÛ?{Þ¼3½QÒ;1¯ôkô5ú$̪/ïLÅWß Ýþ9¼ ãÔ³$äL8lI®3×ãzÒåÓ8#g27þôeð¹ï`r,ü?/r¯sïr{¹_aätÄÚ£??mæoÃZc?Å5Ëõ9´¼WwVÂXa¢0^uµ0GÝdiÿ2a¹°RXQ°NX/Ü'l6 Í[³FÅa¯°_8ÑqË1á¸pB8)ÂX¹^|£`§¸KܱÐN*fIÂm_F/¿²±êê6<oyybÞ¼ox÷{?ò~Ù.Wï¨÷ë^©OÑgë>}Þ¤_«¯ÒïÀ<ø=ýûúËú{úGúïõ?ëa»âÆRÌ(«;à½<i<Ë7¿ÃñW]Ì>æ@¬_SÃÁqXÇ\lÎ5#ðqÖ÷ÂËöë ¼Ò?Òþ8u ú£7¶k<7rWsë°ú{«7¹¡Í?>þû«U«ïâM¬ùfñóù(5<Ö/ùÞ®ñ®°k¡k|÷§\oÁæ ÃЪ` ý§ 3-sµ°Bx-ÖëëÅûÅ_^Ë«_&Ý"}WºZú¨ô¤;0[ËWÉ7ÊwÈÈàÅ¿Ïö§£?ø\>-ç)íNJOe¨âVæÀ§¯S«UÊ-Ê=ÊCÊãÊð±ÞUö(+QrÔ¶jGÕêhu¼:«Íêløùëá=¾¬¾Ñ}JÍ×zh}1¦j£¬y6U»^L@cT/ÖnÐnö¬öCø4Ç´à_î¨Øç>èþ¾Ù|kÎZë¹Ûó gg«çeÏë!ûÐÛùÞvÞÞÎÞîÞÞ-¼¥Þ¡ðÝÊt]«ÏÒZ3Øzý}£þ´¾ 3Ønxt¿ÖOèÄè`t7ú1Ö ßá.ø Ï/?Æìôq~k9À,C?+f%úxé3k1[5Ë1Wm¸3ÖvÌY»Íc«N§ÐÛ9x}J×°®-×˱Þ;~ì«â)&=¹øcù¤ç6ï)ï·P Æ&èÙðvóq:ãÁ¹Ï±|üXNà®ÃûáSB©X+®?{ÁÒbòfy§ü+¬¹:)eJ¥2y!|Æ{`_E|+ìT{©Ã`{§©~õ*¬úÄÿêÕÚ`ÍÐ.Ñ¢Ú*íaíem7Vöǵ\w7÷`·êlëow?ýx÷/yÞ÷ÌõNå¹CLßûíÖY±ÂØlìÿÔÕäÍÙfõßbþj| ÞgYkÛQðñc7óW®?+Ûøçø_ðí\w¹®Þ~#|)e¢kñfhìëâïÄ®'Mìvlê{ÒQÌ_¢<£|ü®ü{¹«rZ-×\Ùàx¿ÐNjÃÝ î{,;zÀý ûIÏo=xï4ïõÞÕÞ^YªoשðFöÁç£ýcÿtÈõ[Øû"صR¦`Ç>åâ,ñ2Dì x1ßÍqçaLÕ£Qø¸ÍÒRé:i¹¼2kNÝQµYv*ýk»CRRoÕîêï¨û¸»«§g¸óTzÆ{®ð<fYûÅ^¢çëÝôÞúQØ!ÑÃ]J¬<ÖÁ½iì Þ×iVcá9M1«Ìjì/Ì5ça¡ó@}дú¹Ò\ [´Þ|Ä|Ò|ÎÒÐ}?Ç@Ý"ì±tÁ©Ê!½¬õd7hë&n3f4|Ý˹Üjôà:n=¼Ò ÜÆtÖßÚyc?¼®CØiÁî8wû3§8³^X5¼¯ k²ú«û9u'51f[³£V[YùZe¤FL%Ã+}#k%W]R÷ê-[´ «%Ò³GªO϶%çiGÃίKy>míöû{9_#GϯÉv{}Mz[?Ø_÷¬OW_¿^ÙöÇA£ózÞë¾!y¾eúä)ÊÅÁYÔý-ûNÄã$ÙgQâ¤È³+ñDSm-)Zå(âÇÄpe]}.ìðûÌ!Z !~e³*ÖÏ¿ýçÿPK |