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.