Back to home page

Quest Cross Reference

 
 

    


0001 Monday 2011-01-24 md
0002 
0003   I'm picking up my project to revamp the virtual memory system in
0004   Quest.  I have some utility functions from the summer, though it
0005   turns out they were missing a lot.  I've ripped out the virtual
0006   memory manipulation found in _fork and changed it to use
0007   clone_page_directory instead.  I found a bug in duplicate_TSS where
0008   it happened to modify both the parent and the child stacks when
0009   forking.  I've changed it to modify only the child's stack, doing a
0010   physical address lookup using the child's page directory explicitly.
0011   This bug did not crop up in practice because it would only overwrite
0012   a variable on the stack in the parent, and that variable happened
0013   not to be needed any longer.
0014 
0015 Wednesday 2011-01-19 md
0016 
0017   Implement disjunctive dependencies and subtree dependencies for
0018   module system.  For example, the VFS might depend on
0019   {"storage___ata|netsetup"} and netsetup might depend on {"net___"}.
0020   This ensures either ATA or networking is supported, and the network
0021   is configured only after all available networking modules have been
0022   loaded.
0023 
0024 Thursday 2010-12-09 md
0025 
0026   Measured round-trip VM-ENTER/VM-EXIT at about 1500 cycles.
0027 
0028 Monday 2010-12-06 md
0029 
0030   There's a bug somewhere that's preventing my old BIOS mode 013h
0031   graphical demos from working inside of VMX/VM86.  This worked
0032   originally on percy last year.  I tested "real" real-mode and the
0033   graphics worked, so the problem is something to do with either my
0034   virtualization code, or something else in the Quest bootup sequence.
0035 
0036 Friday 2010-12-02 md
0037 
0038   Merged old VMX/VM86 code that creates hardware VT virtual machines
0039   using VM86 to emulate real mode.
0040 
0041 Monday 2010-11-22 md
0042 
0043   Scratched a long-standing itch by implementing a "module system" for
0044   drivers and other components which can be loaded in any particular
0045   order, with dependencies.
0046 
0047 Friday 2010-11-19 md
0048 
0049   So it turns out that the LAPIC IDs on baldrick are not contiguously
0050   numbered, which breaks a few assumptions.  I instituted a numbering
0051   system accessible via a percpu variable, and that fixed that
0052   problem.  The LAPIC ID numbering scheme for Xeon non-HT processors
0053   fixes the least significant bit at 0.  In addition, the LAPIC ID
0054   register disagrees with the CPUID initial LAPIC value and the ACPI
0055   MADT entry.  I'm not sure how IPIs are managing to work, but if I
0056   stick with the initial LAPIC value things seem to be ok.  According
0057   to the manual 3A, the LAPIC ID 0x16 breaks down to "cluster ID 2,
0058   processor 3" on this Xeon.
0059 
0060 Thursday 2010-11-18 md
0061 
0062   I'm hesitant to finish implementing synchronous IPC because of the
0063   various problems it has, especially on SMP.  What is the meaning of
0064   sync. IPC across CPUs?  On a single CPU it is simple because you can
0065   just switch threads back and forth.  With multiple CPUs then you
0066   have to consider whether or not the thread is currently running on
0067   the target CPU: do you wrest control away from some poor hapless
0068   third thread if that is currently running?  What do you do with the
0069   source CPU while the target CPU is processing your message?  There's
0070   a lot of potential for inefficiency or unpredictable interference
0071   from other threads.  Also sync. IPC has lots of disadvantages when
0072   it comes to providing service to large numbers of client threads.
0073   Asynchronous IPC scales better but has issues with buffer
0074   management, and possible unpredictability.
0075 
0076   Barrelfish implements async. IPC by using shared memory to exploit
0077   cache coherency protocols.  This seems like the best way to go for
0078   interprocessor communication.  Might need some kind of hybrid
0079   sync/async communication depending on where the target is running.
0080 
0081 Wednesday 2010-11-17 md
0082 
0083   Fixed up synchronous IPC call/replywait functions.  Debating further
0084   designs.
0085 
0086 Tuesday 2010-11-16 md
0087 
0088   Micro-benchmarked SYSENTER vs software INT.  SYSENTER takes ~128
0089   cycles where software INT takes ~300 cycles.  Is that worth losing
0090   two register parameters?
0091 
0092   Back to measuring IPC.  Kernel thread to thread.  One thread sends 2
0093   words to the other, then there is a response of 2 words.  Times in
0094   cycles.
0095 
0096   Call (REG): avg 342, stddev 25
0097   Call (MEM): avg 366, stddev 33
0098   Ret (REG): avg 361, stddev 24
0099   Ret (MEM): avg 385, stddev 25
0100 
0101   Seems to be a fairly consistent 24 cycle difference between using
0102   two registers to pass two parameters, or writing (and reading) those
0103   two parameters from memory in the TSS.  Still, that is just within
0104   one standard deviation from the average, so it's not necessarily
0105   that big a deal.
0106 
0107   Discussion of Nehalem L1 cache leads me to believe that 8 of those
0108   24 cycles come from the two memory references to retrieve the passed
0109   parameters.  The remaining 16 cycles are due to "lookup_TSS (str
0110   ())" in order to get the pointer to the current TSS.  That can
0111   probably be eliminated or reduced with better book-keeping.
0112 
0113 Monday 2010-11-15 md
0114 
0115   Non-root PCI buses show up in ACPI with an "ADR" field that is not
0116   actually the bus number, but rather the device number of the
0117   PCI-to-PCI bridge device.  Then you must read the bus number from
0118   the PCI configuration space header of that bridge.  Now I can obtain
0119   PCI routing information from ACPI alone.
0120 
0121   Added fast_send/recv register-passing IPC mechanism.  Seems to take
0122   about 400-600 cycles per message.  Investigating SYSENTER for fast
0123   userspace invocation of the IPC mechanism.  The problem with
0124   SYSENTER is that it does not save the user's EIP/ESP for you.  You
0125   must find some way of passing them to the kernel.  Usually by
0126   storing them in registers.  Which takes away two registers from
0127   syscall/IPC purposes.
0128 
0129 Wednesday 2010-09-01 md
0130 
0131   Introduced UDP logging to help avoid overhead.  It seems to drop
0132   lines a bit, though.  Since the overhead seems to hold consistently
0133   at about 120us, I tried introducing a constant "fudge" factor of
0134   0x40000 cycles.  This seems to do a pretty good job of avoiding
0135   massive budget overruns while not messing up the local APIC timer.
0136   Putting the logger and lwip threads on the fourth VCPU has some
0137   interesting results which can be observed in the output: for example
0138   if you set the ratio to C=1 over T=50 then the logging thread output
0139   actually slows considerably.
0140 
0141 Tuesday 2010-08-31 md
0142 
0143   Measuring scheduler overhead by recording how much larger tdelta is
0144   than cur->b.  In English, how much time elapsed between the previous
0145   invocation of the scheduler and the current time, compared to the
0146   budget of the VCPU that was supposed to be running then.  I am
0147   finding a pretty consistent pattern of ~120us difference.  When I
0148   attempt to account for the overhead by subtracting it from the
0149   computed tdelta, I manage to reduce it to dozens of nanoseconds,
0150   but, I also bottom out the local APIC timer resolution (setting it
0151   to a value of 1).
0152 
0153 Monday 2010-08-30 md
0154 
0155   Finished tweaking main VCPU algorithm and implemented it using the
0156   current VCPU architecture.  In the meantime, I noticed that my
0157   per-CPU macros don't work with 64-bit data, because they use 64-bit
0158   operations that are not allowed on IA-32.  I have to use
0159   special-cased macros that do two 32-bit movs instead.
0160 
0161 Thursday 2010-08-26 md
0162 
0163   I noticed that __exit destroys the current page directory.  That
0164   means we are reliant on the TLB cache until the next CR3 load.  But
0165   my optimization from yesterday means that a kernel thread switch
0166   will not load CR3.  So calling __exit and switching to an idle task,
0167   for example, would try to continue using the destroyed page
0168   directory.
0169 
0170 Wednesday 2010-08-25 md
0171 
0172   Optimize software task switch so it does not load CR3 when switching
0173   into a kernel thread, or if CR3 already has the desired value.
0174 
0175 Tuesday 2010-08-24 md
0176 
0177   Implemented software task switching but still re-using the TSS data
0178   structure for software task information.
0179 
0180 Thursday 2010-08-19 md
0181 
0182   Worked out a bit of theory on second-level VCPU scheduling.
0183   Implemented VCPU internal scheduling with fixed quantum.
0184 
0185 Wednesday 2010-08-18 md
0186 
0187   Merged basic two-level VCPU scheduler.  Added some basic accounting
0188   mechanisms.
0189 
0190 Tuesday 2010-08-10 md
0191 
0192   New branch for VCPU scheduler.
0193 
0194 Monday 2010-08-09 md
0195 
0196   Added some performance measuring code.
0197 
0198 Friday 2010-08-06 md
0199 
0200   Added API to access other CPU's variables.  Need this to queue tasks
0201   back on their assigned CPU (at least, until proper inter-CPU
0202   messaging exists).  Now the "MPQ" per-CPU queue scheduler will keep
0203   pulling tasks from the local queue, then fall back to a global
0204   queue.
0205 
0206 Thursday 2010-08-05 md
0207 
0208   Tinkering with a per-CPU queue scheduler.
0209 
0210 Wednesday 2010-08-04 md
0211 
0212   Finished implementing per-CPU memory areas including per-CPU
0213   initialization functions which are invoked immediately after the
0214   memory areas are configured for each CPU.
0215   
0216   All per-CPU variables are declared in a special non-loaded section
0217   so they all gain distinct addresses.  Then space is allocated after
0218   the number of CPUs is determined.  A segment descriptor for each
0219   space is setup, and each CPU loads a spare segment register with it
0220   (like %fs).  Per-CPU variable access is done, via macros, relative
0221   to that segment override.  The segment selector is currently stored
0222   in %dr3 so that when we return from userspace, we can setup %fs with
0223   the proper value again.  In the future, when we switch to software
0224   tasks, it will be possible to avoid using %dr3 by exploiting the
0225   fact that every CPU has a different selector in %tr.  For example,
0226   you can allocate the per-CPU TSS next to the per-CPU %fs descriptor,
0227   so in the end all you need to do is
0228 
0229     str %eax; leal 8(%eax), %eax; movw %ax, %fs
0230 
0231   which should be faster than debug registers.
0232 
0233   Another section is declared, adjacent to read-only data, which
0234   contains a null-terminated array of pointers to initialization
0235   functions.  Each CPU invokes these functions to initialize per-CPU
0236   variables.  This is similar to how C++ global constructors work.
0237 
0238   Ye notes that if we have software task switching then we can have
0239   separate GDTs per CPU and then hard-code the per-CPU segment number.
0240   Or, perhaps the LDT will work.
0241 
0242 Tuesday 2010-08-03 md
0243 
0244   Started implementing per-CPU memory areas based on segment register
0245   %fs and debug register %dr3.
0246 
0247 Monday 2010-08-02 md
0248 
0249   Investigating options for per-CPU memory areas.  Using %dr3 has some
0250   advantages, like the fact that task-switch does not touch it.  Best
0251   measurements I can make show a 30-50 cycle cost to read %dr3, and a
0252   110-170 cycle cost to write %dr3.  Reading LAPIC ID register seems
0253   to cost around 25-45 cycles.  Loading an index into segment register
0254   %fs takes about 15-25 cycles.  Probably looking at up to 25-45
0255   cycles for a segment load plus memory read: though this is likely
0256   coming from cache.  STR is another option for getting an index
0257   quickly, but only works with software task switching because then
0258   each CPU gets one exclusive TSS entry.
0259 
0260 Friday 2010-07-30 md
0261 
0262   Did some measurement of scheduler tick jitter.
0263 
0264 Thursday 2010-07-29 md
0265 
0266   Adding the beginning of a performance monitoring counter module.
0267 
0268 Tuesday 2010-07-27 md
0269 
0270   I found some more information about the protocol headers surrounding
0271   ARP and IP packets in IEEE 802.11 frames.  I think part of my
0272   problem is that I was tagging every packet as "ARP" even if it
0273   wasn't.  At least that would cause tcpdump to get confused.  I'm
0274   also trying to maintain a proper timestamp function and some
0275   semblance of synchronization with the IBSS.  I imported a duration
0276   function from the old rtl8180 driver.  Another problem is that many
0277   packets are missing from the Kismet output.  I'm not sure why: is my
0278   transmitter failing to launch packets?  Or is Kismet just not
0279   picking them up?
0280 
0281   I've realized that lwIP etharp input is expecting Ethernet frame
0282   headers and that I'm not supplying that.  A quick hack to rewrite
0283   headers received into Ethernet format, and to cut off the Ethernet
0284   header on transmitted packets, and now I can ping/echo.  There is
0285   still a lot of packet loss.  Not sure where the loss is occurring:
0286   is transmitter dropping packets?  Is receiver still doing that?  Is
0287   even Kismet getting all the packets?
0288 
0289 Monday 2010-07-26 md
0290 
0291   I wrote a function to quickly parse the SSID from various MAC
0292   frames, but it had a couple of flaws: the length variable was
0293   unsigned, but I was using a "len > 0" test in a loop, which is
0294   dangerous.  Then it was mis-reading the length of the header, and
0295   also forgetting to skip the first 2 bytes of every EI.  Somehow,
0296   that it managed to work at all is amazing.  Anyway, it would lead to
0297   seemingly random "crashes" (spinning w/o interrupts) that are now
0298   resolved.  In other news, my laptop seems to be fairly happy with
0299   the combination of beacon frames and probe responses that I throw at
0300   it.  I've observed some ARP and IP packets in the wild, attempting
0301   to duplicate their structure in combination with lwIP now.
0302   Unfortunately, for some reason, my rtl8187b transmitter is deciding
0303   to glob separate packets together to spit out some giant mal-formed
0304   thing, according to Kismet.
0305 
0306 Sunday 2010-07-25 md
0307 
0308   Set priority of rx_thread to highest, in an effort to ensure that it
0309   runs as soon as possible after the IRQ handler queues it.  That
0310   still could mean up to a 10ms delay before a CPU quantum is
0311   finished.  Found bug in bulk transfer clean-up of non-short packets:
0312   it is redundant to set the QH vertical pointer back to TERMINATE
0313   since the HC did it already.  But since the HC did it already,
0314   another thread might have started using that QH.  Therefore, we
0315   might end up cutting off someone's TDs.  That's what kept happening
0316   to the rx_thread when the status thread cleaned itself up.
0317 
0318 Saturday 2010-07-24 md
0319 
0320   Finally implemented exit_kernel_thread and start_kernel_thread with
0321   arguments.  It writes the new stack with the appropriate values.  I
0322   don't think it is possible to do hardware thread switching that
0323   avoids flushing the TLB.  The Intel manual says it loads CR3 every
0324   time you task switch.  This issue will have to be revisited with
0325   either a full implementation of software task switching, or a hybrid
0326   scheme.
0327 
0328 Friday 2010-07-23 md
0329 
0330   I decided that the rtl8187b driver was dropping too many
0331   packets because it is too slow at processing and requeuing TDs.
0332   I tried doing a direct call to schedule() in the USB IRQ
0333   handler to expedite matters, but it seemed to cause other
0334   problems.  I removed all logging and observed that, in the
0335   Kismet tcpdump, Quest seemed to be producing ACKs in a much
0336   more timely manner.  So perhaps there is something to this.  So
0337   I added a separate logging thread which is preemptible, going
0338   to move all serial port output to this thread in hopes of
0339   speeding up debugging output.
0340 
0341 Thursday 2010-07-22 md
0342 
0343   Moving packet formation out of rtl8187b into a software MAC
0344   implementation based on Linux's idea of mac80211.  Also, there seems
0345   to be a problem having multiple threads directly queue up
0346   transmission TDs.  It seems that every transmission bulk output has
0347   to be paired with a status bulk input.  That seems to defeat the
0348   point of having four transmission endpoints, but oh well.  Putting
0349   tranmission into its own thread with a feeder circular buffer.
0350 
0351 Wednesday 2010-07-21 md
0352 
0353   Importing a lot of Linux headers in order to set the stage for
0354   software MAC.
0355 
0356 Tuesday 2010-07-20 md
0357 
0358   First confirmed successful packet transmission.  Seems I do need to
0359   initialize radio completely.  Don't need to add frame checksum
0360   myself, apparently the card does it after all.  Start to separate TX
0361   code to do more than one kind of packet.
0362 
0363 Monday 2010-07-19 md
0364 
0365   Various attempts to get transmission working.  Trying various
0366   approaches to frame checksum.  Imported CRC32 code from Linux.
0367   Seems card sends me a status update after each TX: parsing status
0368   code and displaying info based what Linux driver does.  Try to skip
0369   some radio initialization, since it takes forever.
0370 
0371 Friday 2010-07-16 md
0372 
0373   Parse and dump debugging info about some more kinds of received packets.
0374 
0375 Wednesday 2010-07-14 md
0376 
0377   Imported a bunch of initialization code from Linux driver.  First
0378   successful packet reception.  Ensure that all TDs are unlinked even
0379   in the case of a short packet.  Use the IEEE 802.11 constant and
0380   struct definitions from Linux.  Do some parsing of simple packets,
0381   like Beacon.
0382 
0383 Tuesday 2010-07-13 md
0384 
0385   Instead of having a single QH for bulk transfers, have a list of
0386   them and use the first available.  This permits concurrent bulk
0387   transfers.  Begin rtl8187b driver: there is no publicly available
0388   datasheet.  Begin the process of reverse-engineering by importing
0389   pieces of the Linux driver wholesale.  There are many tables of
0390   constants with no documentation, especially in the rtl8225 radio
0391   initialization code.  Not sure what to do, but copy it.  Also, it
0392   appears there is a 93c*6 model EEPROM buried in the card, so import
0393   Linux's generic driver for that (which can operate via USB, or any
0394   transfer mechanism).  Successfully read the hardware address from
0395   EEPROM.
0396 
0397 Friday 2010-07-09 md
0398 
0399   Give up on probing for root device: there is now a "root=..."
0400   command-line option added to every GRUB configuration and parsed in
0401   boot/init.c startup.  Implement a TFTP client using the LWIP client
0402   API, arrange for it to be viewed as a "filesystem" by the simple VFS
0403   code.
0404 
0405 Wednesday 2010-07-07 md
0406 
0407   It is necessary to switch to GRUB2 if we want network-booting
0408   support.  Why?  Because GRUB-legacy does not support the Intel 8254x
0409   cards (ugh).  GRUB2 doesn't support any cards, but it does support
0410   PXE, which apparently provides a simple API for TFTP and UDP code,
0411   and gPXE can fill that role.  However, Quest will not work with
0412   GRUB2: I found that the reason is because GRUB2 does not put modules
0413   in low physical memory -- for whatever reason, it likes to put them
0414   higher up.  But the old Quest init code assumes all modules are in
0415   low physical memory: modified it to explicitly map all memory it
0416   uses.  After applying a workaround "fix" to gPXE, I've put new
0417   images in the repository, and we have network booting.  Also, for
0418   good measure, I added a CTRL-ALT-DEL handler to the keyboard driver.
0419 
0420 Friday 2010-07-02 md
0421 
0422   Finally got the Intel 82544GM NIC working.  There was some funky
0423   initialization that was possibly required.  But the main problem
0424   seemed to be that the NIC would not add a frame checksum unless you
0425   set a certain bit in the TX descriptor.  This manifested by having
0426   everything seem to work, LEDs flashing on both ends, but no packets
0427   arriving.  Then I got the idea to check the ethtool output for RX
0428   errors on the Linux side; sure enough, rx_fcs_error count was
0429   rising.
0430 
0431 Thursday 2010-07-01 md
0432 
0433   Found a cache of Intel 8254x compatible cards.  Doesn't work with
0434   the e1000 driver I wrote for QEMU.  Had to read the hardware address
0435   using the bitbanging 4-wire method instead of the easy EERD way that
0436   QEMU supports.  Not so hard to do after reading the Linux driver
0437   source.  Probably should get the SPI NVM-reading code in there too,
0438   for future reference.  I think the 82577LM is going to need it.
0439 
0440 Wednesday 2010-06-30 md
0441 
0442   Short packet transfers should be considered complete, many network
0443   cards seem to terminate transmission with a short packet.  Got the
0444   ASIX driver working, that should handle many common USB Ethernet
0445   adapters.
0446 
0447 Tuesday 2010-06-29 md
0448 
0449   Better logging of USB device info.  Began a driver for the ASIX chip
0450   commonly found in USB Ethernet adapters.
0451 
0452 Thursday 2010-06-24 md
0453 
0454   Small project for a long bus ride: trying to clean up and separate
0455   the code which does virtual memory manipulation like
0456   clone_page_directory, which is currently mixed into _fork, _exec,
0457   and other places.
0458 
0459 Wednesday 2010-06-23 md
0460 
0461   Leave NAKs alone, try to let HC clean it up.  Make sure kernel
0462   threads do not get woken up until after scheduling is really
0463   enabled.
0464 
0465 Tuesday 2010-06-22 md
0466 
0467   Short packet detection, necessary for USB network drivers.  Managed
0468   to get an echo server working with QEMU's emulated USB network
0469   adapter.  Bulk transfers now have an output parameter called
0470   "actual_length".  The USB network driver, and others, are going to
0471   require some kind of kernel threads.  Since there is no per-device
0472   IRQ, instead the drivers need kernel threads which block while
0473   waiting for their TDs to complete.  I suppose there are other ways
0474   to do this, but this was actually rather simple.  I've consolidated
0475   the "kernel thread" creating code into a new API:
0476   start_kernel_thread.  It is also useful for running the LWIP TCP
0477   timers, instead of hacking that into the PIT IRQ handler.
0478 
0479 Monday 2010-06-21 md
0480 
0481   Wake up tasks blocked on USB transfers when the IRQ comes.  Clean up
0482   UHCI a tad, and add String descriptors.
0483 
0484 Sunday 2010-06-20 md
0485 
0486   Add a crude version of blocking usleep integrated with the scheduler.
0487 
0488 Saturday 2010-06-19 md
0489 
0490   Have VFAT driver skip 32256 bytes into the disk before reading the
0491   partition.  Just like our simple EXT2 driver.
0492 
0493 Friday 2010-06-18 md
0494 
0495   Finally introduce a simple but proper PCI IRQ routing framework.
0496   The only way to get the correct information is by parsing the MP
0497   tables, or by interpreting AML code in ACPI (ACPICA handles this).
0498   Remove various hacks associated with IRQ handling.
0499 
0500 Thursday 2010-06-17 md
0501 
0502   Fixed a bunch of things and finally worked out what was wrong with
0503   my PCI drivers.  First of all, the INT_LN field in PCI configuration
0504   space is just useless on modern systems.  You must parse PCI routing
0505   table information from ACPI or MP tables.  Secondly, I didn't
0506   realize that not only are PCI IRQs by default level-triggered
0507   active-LOW, but the IO-APIC has to be configured with polarity too.
0508   Emulators just don't care about this sort of stuff.  Also, ACPICA
0509   does something special when you invoke "\_PIC(1)" method, else you
0510   can't get the right PCI routing tables out of it.  Now I can get the
0511   IRQ from the UHCI controller device.  Also it turns out there is no
0512   standard vendor, product ID for UHCI: you have to rely on the class,
0513   subclass, and progIF fields.
0514 
0515 Monday 2010-06-14 md
0516 
0517   Create a framework for USB drivers, each with a probe function.
0518   Enumerate devices and invoke probe to get the drivers to the
0519   addresses they need.  Move hub, umsc drivers into this framework.
0520 
0521 Saturday 2010-06-12 md
0522 
0523   Created uhci_enumerate and the beginning of a hub driver with
0524   probe_hub.
0525 
0526 Friday 2010-06-11 md
0527 
0528   Separate USB mass storage controller driver into its own file.
0529 
0530 Thursday 2010-06-10 md
0531 
0532   First successful USB mass storage sector read.  Add array of toggle
0533   bits, one for each possible endpoint, to maintain state and
0534   correctly set the TDs.
0535 
0536 Wednesday 2010-06-09 md
0537 
0538   Fix up UHCI driver a bit, use PCI decode_bar to get the base address
0539   properly.  Add a bulk transfer function.
0540 
0541 Monday 2010-06-07 md
0542 
0543   Get USB working on percy and my laptop.  Added Quest-specific stub
0544   to MAME.  Added "getcode" variation of "getchar" syscall, to replace
0545   the old code in MAME which stole keycodes directly from the I/O
0546   port.  We use IRQ-driver keyboard I/O now.
0547 
0548 Sunday 2010-06-06 md
0549 
0550   Merge Ye Li's USB UHCI driver.  Probe PCI bus for UHCI controller.
0551 
0552 Saturday 2010-06-05 md
0553 
0554   Add what I got for e1000e (Intel 82567LM/82577LM).  It doesn't work.
0555   Use -fno-strict-aliasing because we do stupid pointer tricks.
0556 
0557 Friday 2010-06-04 md
0558 
0559   Poll TX as well as RX.  Also, it is okay to output serial-port
0560   logging if we are using GDBSTUB_TCP.
0561 
0562 Thursday 2010-06-03 md
0563 
0564   Got e1000 packet reception, IRQ, and transmission working.  Create
0565   an ethernet_device to integrate with LWIP.
0566 
0567 Wednesday 2010-06-02 md
0568 
0569   Begin e1000 driver, configure descriptors, reset the card, and
0570   enable reception.
0571 
0572 Tuesday 2010-06-01 md
0573 
0574   Network cards now must also support a polling interface.  This is
0575   used to implement GDBSTUB_TCP: over-the-network kernel debugger.
0576 
0577 Monday 2010-05-31 md
0578 
0579   Create a framework for ethernet cards and have the PCnet driver
0580   implement it.
0581 
0582 Sunday 2010-05-30 md
0583 
0584   Implement PCnet transmit.  Import LWIP source into Quest.  Add
0585   ethernetif template and modify it for Quest.  Get a basic echo
0586   server working with PCnet card, and use DHCP client.
0587 
0588 Saturday 2010-05-29 md
0589 
0590   Got IRQ handling working for PCnet.
0591 
0592 Friday 2010-05-28 md
0593 
0594   Careful about preserving registers across syscalls.  Finally add
0595   check on argv in _exec.  Import database of PCI vendors and cards.
0596   Enumerate the PCI bus.  Implement basic PCI bus API.  Begin PCnet
0597   driver: PCI bus scan, initialization, and reset.
0598 
0599 Thursday 2010-05-27 md
0600 
0601   Syscalls can clobber memory and flags too, so make sure gcc is
0602   aware.  Preserve %ebx register properly during splash screen, so
0603   terminal_server doesn't output garbage for the first character.
0604   Improper inline asm turns out to be the culprit with the
0605   optimization woes.
0606 
0607 Sunday 2010-05-23 md
0608 
0609   Begin PCI driver.  But before that, there seems to be a problem with
0610   gcc optimization enabled.