[GOOD] BUILD 0.1.0.450 DATE 8/29/2011 AT 10:30 AM

====================================================
+ Changed 'align 0x4' line above multiboot header in loader.asm to
'align 4'
+ Removed -e option for echo in build.sh
+ Modified build.sh for linux
+ Fixed triple fault when enabling paging
+ Fixed page faults at memory manager initialization
+ Fixed 'mem' console function
+ Added more info about page fault at crash screen
+ Added Panic() macro
+ Added verbose mode for memory manager

[ BAD] BUILD 0.1.0.390 DATE 8/27/2011 AT 10:54 PM
====================================================
+ Added stdlib routines, separated in different files
+ Rewritten physical memory manager
+ Added virtual mem manager
+ Added memory allocation/freeing
+ Added memory library
+ Added temporary allocation (at end of kernel), until paging is started
- Removed functionality from debug console function 'mem'
- Removed system.h, the one remaining function now in stdio.h
This commit is contained in:
Tiberiu Chibici 2021-09-14 18:48:57 +03:00
parent b6ddeca1c3
commit 913e65b856
326 changed files with 6990 additions and 12229 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,635 +0,0 @@
================================================================
IBM PC KEYBOARD INFORMATION FOR SOFTWARE DEVELOPERS
================================================================
Your host: Chris Giese
http://www.execpc.com/~geezer/os
Distribute freely. Last revised on Jan 3, 2002
Sources:
PORTS.A of Ralf Brown's interrupt list collection
repairfaq.org keyboard FAQ(doesn't appear to exsist)
Linux source code
Test hardware:
New Samsung KB3T001SAXAA 104-key keyboard
Old Maxi 2186035-00-21 101-key keyboard
NO WARRANTY. NO GUARANTEE. I have tried to make this information
accurate. I don't know if I succeeded. Corrections or additional
information would be welcome.
This is a plain-text document. If you use a word-processor to view
it, use a fixed-pitch font (like Courier) so columnar data and
ASCII art lines up properly.
Lessons learned:
- Both the 8048 MCU in the keyboard and the 8042 controller
on the motherboard accept command bytes.
- There is a bit (KCC) in the poorly-named "Command Byte" which
seems to enable AT-to-XT scancode conversion (scancode set 2
to scancode set 1). After booting DOS, my keyboard uses
scancode set 2 with this conversion bit turned on. If I turn
the bit off and switch to scancode set 1, operation remains
the same.
- Scancode set 3 is probably the most elegant, in that it returns
a one-byte make code for _every_ key. Unfortunately, not all
keyboards support it.
- The scancodes of some keys depend on the internal num lock state
of the keyboard.
================================================================
KEYBOARD I/O REGISTERS ON THE PC
================================================================
60h data
64h command (write)
64h Status (read)
Bits in Status register (names from Linux source)
b7 PERR parity error in data received from keyboard
b6 GTO receive timeout
b5 transmit timeout (or PS/2 mouse?)
b4 keyboard is locked
b3 0=60h was the port last accessed, 1=61h was last (?)
b2 System Flag status: 0=power-up/reset, 1=selftest OK (?)
b1 IBF input buffer full (data from host to keyboard)
b0 OBF output buffer full (data from keyboard to host)
Bits in Output Port of 8042 chip (Table P0383 in PORTS.A)
The Output Port is written by controller command D1h,
and read by controller command D0h
b7 keyboard data output
b6 keyboard clock output
b5 input buffer NOT full
b4 output buffer NOT empty
b3 (varies)
b2 (varies)
b1 A20 gate
b0 system reset (THIS BIT SHOULD ALWAYS BE SET TO 1)
Bits in Input Port of 8042 chip
The Input Port is read by controller command C0h
b7 keyboard NOT locked
b6-b0 (varies)
Bits in "Command Byte" (confusing name; from Table P0404 in PORTS.A)
The "Command Byte" is written by controller command 60h
and read by controller command 20h
(names from Linux source)
b7 (reserved)
b6 KCC convert set 2 scancodes to set 1 ("IBM PC compatibility mode")
b5 DMS disables PS/2 mouse when set
b4 disables keyboard when set
b3 ignore keyboard lock switch when set
b2 SYS System Flag (same as b2 in Status register, it seems)
b1 enables IRQ12 from PS/2 mouse when set
b0 EKI enables IRQ1 on keyboard output buffer full
Result Byte for interface self-tests (Table P0406 in PORTS.A)
Returned by controller commands A9h or ABh
0 no error
1 clock line stuck low
2 clock line stuck high
3 data line stuck low
4 data line stuck high
================================================================
CONTROLLER COMMANDS (from Table P0401 of PORTS.A)
================================================================
Before writing each byte of these commands to port 64h,
poll the status register (port 60h) until bit b1=0.
20h-2Fh reads byte with address=lower 5 bits of command
The byte at address 0 is the "Command Byte".
60h-7Fh nn writes byte nn to address=lower 5 bits of command
The byte at address 0 is the "Command Byte".
A7h disables PS/2 mouse port (MCA only?)
A8h enables PS/2 mouse port (MCA only?)
A9h self-test mouse interface, returns Result Byte (see above)
AAh self-test controller; returns 55h if success, FCh if failure
ABh self-test keyboard interface, returns Result Byte (see above)
ADh disables keyboard (sets b4 of "Command Byte")
AEh enables keyboard (clears b4 of "Command Byte")
C0h reads Input Port
D0h reads Output Port
D1h nn writes Output Port
Important: bit 0 (system reset) should always be set here,
as the system may hang constantly. To reset the PC, pulse
b0 of the Output Port with command FEh instead.
DDh disable A20 (Not all systems support this byte)
DFh enable A20 (Not all systems support this byte)
E0h read test inputs. return value=
b1 kbd data
b0 kbd clock
EDh nn write LEDs. nn=
b2 Caps Lock
b1 Num Lock
b0 Scroll Lock
F0h-FFh pulse bit(s) of Output Port low for 6 microseconds.
If b0-b3 of the command is low, the corresponding bit
in the Output Port will be pulsed low. b0=system reset,
and should ALWAYS be PULSED low, never set low constantly.
================================================================
KEYBOARD COMMANDS (from Table P0386 of PORTS.A)
================================================================
Before writing each byte of these commands to port 60h,
poll the status register (port 60h) until bit b1=0.
Unless otherwise noted: each command responds with FAh (ACKnowledge)
or FEh (Resend) after receiving each byte of the command.
EDh nn write LEDs, as above
EEh echo, keyboard responds with EEh
EFh no-operation (reserved)
F0h nn selects scancode set nn=1-3 or 0 to return current set
F2h read ID. Keyboard responds with ACK (FAh) and two optional
ID bytes:
(none) AT keyboard
83h ABh (?)
ABh 41h MF2, translation mode
ABh 83h MF2, pass-through mode
F3h nn set typematic (auto-repeat) rate/delay. nn=
b7 unused
b6..5 Repeat delay (00=250 msec ... 11=1000msec)
b4..0 Repeat rate (00000=30 Hz ... 11111=2 Hz).
F4h clears output buffer, enables keyboard
F5h disables keyboard, resets to defaults
F6h sets keyboard defaults
F7h make all keys typematic (auto-repeat) [*]
F8h make all keys make-break [*]
F9h make all keys make-only [*]
FAh make all keys typematic and make-break [*]
FBh nn make one key typematic [*]
FCh nn make one key make-break [*]
FDh nn make one key make-only [*]
[*] these commands may work only for
scancode set 3; I'm not sure.
FEh resend previous scan code
FFh reset keyboard CPU, do power-on self-test, return
self-test result byte
non-key status bytes
--------------------
00h Key detection error or buffer full.
AAh Power-on/reset diagnostics successful.
E0h (scancode sets 1 and 2) Prefix byte for "gray" keys
(keys not on original 83-/84-key keyboard)
EEh Sent in response to ECHO command.
F0h (scancode sets 2 and 3) Prefix byte for break codes.
FAh ACKknowledge; response to most commands.
FCh Diagnostics failed (MF keyboard).
FDh Diagnostics failed (AT keyboard).
The keyboard stops scanning and waits for next command
after returning code FCh or FDh
FEh Last command was invalid or had parity error; resend it.
FFh Key detection error or buffer full.
====================================================================
SCANCODES FOR SCANCODE SET 1 (XT)
====================================================================
US 104-key keyboard, set 1 scancodes
"Make" code is generated when key is pressed.
"Break" code is generated when key is released.
Hex value of make code for each key is shown.
Most keys:
one-byte make code = nn
one-byte repeat code = nn
one-byte break code = 80h + nn
"Gray" keys (not on original 84-key keyboard):
two-byte make code = E0nn
two-byte repeat code = E0nn
two-byte break code = E0 followed by 80h + nn
"Gray" keys noted by [1] are NumLock-sensitive.
When the keyboard's internal NumLock is active:
four-byte make code = E02AE0nn
two-byte repeat code = E0nn
four-byte break code = E0 followed by 80h + nn followed by E0AA
____ ___________________ ___________________ ___________________
| | | | | | | | | | | | | | | | |
|Esc | |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10 |F11 |F12 |
| | | | | | | | | | | | | | | | |
| 01| | 3B| 3C| 3D| 3E| | 3F| 40| 41| 42| | 43| 44| 57| 58|
|____| |____|____|____|____| |____|____|____|____| |____|____|____|____|
__________________________________________________________________________
| | | | | | | | | | | | | | | |
|~ |! |@ |# |$ |% |^ |& |* |( |) |_ |+ || |bksp|
|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |\ | |
| 29| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 2B| 0E|
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
| | | | | | | | | | | | | | |
|Tab |Q |W |E |R |T |Y |U |I |O |P |{ |} | |
| | | | | | | | | | | |[ |] | |
| 0F| 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| |
|____|____|____|____|____|____|____|____|____|____|____|____|____| |
| | | | | | | | | | | | | |
|Caps|A |S |D |F |G |H |J |K |L |: |" | Enter |
| | | | | | | | | | |; |' | |
| 3A| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 1C|
|____|____|____|____|____|____|____|____|____|____|____|____|______________|
| | | | | | | | | | | | |
| L Shift |Z |X |C |V |B |N |M |< |> |? | R Shift |
| | | | | | | | |, |. |/ | |
| 2A| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35| 36|
|_________|____|____|____|____|____|____|____|____|____|____|______________|
| | | | | | | | |
|L Ctrl | L win | L Alt | space | R Alt | R win | menu |R Ctrl |
| |[1] | | | |[1] |[1] | |
| 1D| E05B| 38| 39| E038| E05C| E05D| E01D|
|_______|_______|_______|__________________|_______|_______|_______|_______|
[2] For PrintScreen/SysRq key: make code = E02AE037,
repeat code = E037, break code = E0B7E0AA
[3] The Pause/Break key does not repeat, and it does not
generate a break code. Its make code is E11D45E19DC5
____ ____ ____
| | | |
|Prt |Scrl|Paus|
|Scrn|Lock|Brk |
| [2]| 46| [3]|
|____|____|____|
____ ____ ____ ____ ____ ____ ____
| | | | | | | | |
|Ins |Home|PgUp| |Num |/ |* |- |
|[1] |[1] |[1] | |Lock| | | |
|E052|E047|E049| | 45|E035| 37| 4A|
|____|____|____| |____|____|____|____|
| | | | | | | | |
|Del |End |PgDn| |7 |8 |9 | |
|[1] |[1] |[1] | |Home|(U) |PgUp| |
|E053|E04F|E051| | 47| 48| 49| |
|____|____|____| |____|____|____| |
| | | |+ |
|4 |5 |6 | |
|(L) | |(R) | |
| 4B| 4C| 4D| 4E|
____ |____|____|____|____|
| | | | | | |
|(U) | |1 |2 |3 | |
|[1] | |End |(D) |PgDn| |
|E048| | 4F| 50| 51|Ent |
____|____|____ |____|____|____| |
| | | | | | | |
|(L) |(D) |(R) | |0 |. | |
|[1] |[1] |[1] | |Ins |Del | |
|E04B|E050|E04D| | 52| 53|E01C|
|____|____|____| |_________|____|____|
code key code key code key code key
---- --- ---- --- ---- --- ---- ---
01 Esc 0F Tab 1D L Ctrl 2B \|
02 1! 10 Q 1E A 2C Z
03 2" 11 W 1F S 2D X
04 3# 12 E 20 D 2E C
05 4$ 13 R 21 F 2F V
06 5% 14 T 22 G 30 B
07 6^ 15 Y 23 H 31 N
08 7& 16 U 24 J 32 M
09 8* 17 I 25 K 33 ,<
0A 9( 18 O 26 L 34 .>
0B 0) 19 P 27 ;: 35 /?
0C -_ 1A [{ 28 '" 36 R Shift
0D =+ 1B ]} 29 `~ 37 *
0E BackSpace 1C Enter 2A L Shift 38 L Alt
code key code key code key code key
---- --- ---- --- ---- --- ---- ---
39 Space 41 F7 49 PageUp 9 51 PageDown 3
3A CapsLock 42 F8 4A - 52 Insert 0
3B F1 43 F9 4B (left) 4 53 Del .
3C F2 44 F10 4C 5
3D F3 45 NumLock 4D (right) 6 57 F11
3E F4 46 ScrollLock 4E + 58 F12
3F F5 47 Home 7 4F End 1
40 F6 48 (up) 8 50 (down) 2
code key
---- ---
E01C Enter (on numeric keypad)
E01D R Ctrl
E02A make code prefix for keyboard internal numlock
E02AE037 PrintScreen make code
E035 /
E037 PrintScreen repeat code
E038 R Alt
E047 Home
E048 (up)
E049 PageUp
E04B (left)
E04D (right)
E04F End
E050 (down)
E051 PageDown
E052 Insert
E053 Del
E05B L Win
E05C R Win
E05D Menu
E0AA break code suffix for keyboard internal numlock
E0B7E0AA PrintScreen break code
E11D45E19DC5 Pause
====================================================================
SCANCODES FOR SCANCODE SET 2 (AT)
====================================================================
US 104-key keyboard, set 2 scancodes,
8042 AT-to-XT scancode translation OFF
"Make" code is generated when key is pressed.
"Break" code is generated when key is released.
Hex value of make code for each key is shown.
Most keys:
one-byte make code = nn
one-byte repeat code = nn
two-byte break code = F0nn
"Gray" keys (not on original 84-key keyboard):
two-byte make code = E0nn
two-byte repeat code = E0nn
three-byte break code = E0F0nn
"Gray" keys noted by [1] are NumLock-sensitive.
When the keyboard's internal NumLock is active:
four-byte make code = E012E0nn
two-byte repeat code = E0nn
six-byte break code = E0F0nnE0F012
____ ___________________ ___________________ ___________________
| | | | | | | | | | | | | | | | |
|Esc | |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10 |F11 |F12 |
| | | | | | | | | | | | | | | | |
| 76| | 05| 06| 04| 0C| | 03| 0B| 83| 0A| | 01| 09| 78| 07|
|____| |____|____|____|____| |____|____|____|____| |____|____|____|____|
__________________________________________________________________________
| | | | | | | | | | | | | | | |
|~ |! |@ |# |$ |% |^ |& |* |( |) |_ |+ || |bksp|
|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |\ | |
| 0E| 16| 1E| 26| 25| 2E| 36| 3D| 3E| 46| 45| 4E| 55| 5D| 66|
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
| | | | | | | | | | | | | | |
|Tab |Q |W |E |R |T |Y |U |I |O |P |{ |} | |
| | | | | | | | | | | |[ |] | |
| 0D| 15| 1D| 24| 2D| 2C| 35| 3C| 43| 44| 4D| 54| 5B| |
|____|____|____|____|____|____|____|____|____|____|____|____|____| |
| | | | | | | | | | | | | |
|Caps|A |S |D |F |G |H |J |K |L |: |" | Enter |
| | | | | | | | | | |; |' | |
| 58| 1C| 1B| 23| 2B| 34| 33| 3B| 42| 4B| 4C| 52| 5A|
|____|____|____|____|____|____|____|____|____|____|____|____|______________|
| | | | | | | | | | | | |
| L Shift |Z |X |C |V |B |N |M |< |> |? | R Shift |
| | | | | | | | |, |. |/ | |
| 12| 1A| 22| 21| 2A| 32| 31| 3A| 41| 49| 4A| 59|
|_________|____|____|____|____|____|____|____|____|____|____|______________|
| | | | | | | | |
|L Ctrl | L win | L Alt | space | R Alt | R win | menu |R Ctrl |
| |[1] | | | |[1] |[1] | |
| 14| E01F| 11| 29| E011| E027| E02F| E014|
|_______|_______|_______|__________________|_______|_______|_______|_______|
[2] For PrintScreen/SysRq key: make code = E012E07C,
repeat code = E07C, break code = E0F07CE0F012
[3] The Pause/Break key does not repeat, and it does not
generate a break code. Its make code is E11477E1F014F077
____ ____ ____
| | | |
|Prt |Scrl|Paus|
|Scrn|Lock|Brk |
| [2]| 7E| [3]|
|____|____|____|
____ ____ ____ ____ ____ ____ ____
| | | | | | | | |
|Ins |Home|PgUp| |Num |/ |* |- |
|[1] |[1] |[1] | |Lock| | | |
|E070|E06C|E07D| | 77|E04A| 7C| 7B|
|____|____|____| |____|____|____|____|
| | | | | | | | |
|Del |End |PgDn| |7 |8 |9 | |
|[1] |[1] |[1] | |Home|(U) |PgUp| |
|E071|E069|E07A| | 6C| 75| 7D| |
|____|____|____| |____|____|____| |
| | | |+ |
|4 |5 |6 | |
|(L) | |(R) | |
| 6B| 73| 74| 79|
____ |____|____|____|____|
| | | | | | |
|(U) | |1 |2 |3 | |
|[1] | |End |(D) |PgDn| |
|E075| | 69| 72| 7A|Ent |
____|____|____ |____|____|____| |
| | | | | | | |
|(L) |(D) |(R) | |0 |. | |
|[1] |[1] |[1] | |Ins |Del | |
|E06B|E072|E074| | 70| 71|E05A|
|____|____|____| |_________|____|____|
code key code key code key code key
---- --- ---- --- ---- --- ---- ---
01 F9 66 BackSpace
21 C 41 ,<
03 F5 22 X 42 K 69 End 1
04 F3 23 D 43 I
05 F1 24 E 44 O 6B (left) 4
06 F2 25 4$ 45 0) 6C Home 7
07 F12 26 3# 46 9(
70 Ins 0
09 F10 29 Space 49 .> 71 Del .
0A F8 2A V 4A /? 72 (down) 2
0B F6 2B F 4B L 73 5
0C F4 2C T 4C ;: 74 (right) 6
0D Tab 2D R 4D P 75 (up) 8
0E `~ 2E 5% 4E -_ 76 Esc
77 NumLock
11 L Alt 31 N 52 '" 78 F11
12 L Shift 32 B 79 +
33 H 54 [{ 7A PageDown 3
14 L Ctrl 34 G 55 =+ 7B -
15 Q 35 Y 7C *
16 1! 36 6^ 58 CapsLock 7D PageUp 9
59 R Shift 7E ScrollLock
1A Z 3A M 5A Enter
1B S 3B J 5B ]} 83 F7
1C A 3C U
1D W 3D 7& 5D \|
1E 2@ 3E 8*
code key
---- ---
E011 R Alt
E012E07C PrintScreen make code
E014 R Ctrl
E01F L Win
E027 R Win
E02F Menu
E04A /
E05A Enter (on numeric keypad)
E069 End
E06B Left
E06C Home
E070 Ins
E071 Del
E072 (down)
E074 (right)
E075 (up)
E07A PageDown
E07C PrintScreen repeat code
E07D PageUp
E0F07CE0F012 PrintScreen break code
E11477E1F014F077 Pause
====================================================================
SCANCODES FOR SCANCODE SET 3
====================================================================
US 104-key keyboard, set 3 scancodes
"Make" code is generated when key is pressed.
"Break" code is generated when key is released.
Hex value of make code for each key is shown.
All keys:
one-byte make code = nn
one-byte repeat code = nn
two-byte break code = F0nn
When operating in scancode set 3, the keyboard
does not maintain an internal NumLock state.
____ ___________________ ___________________ ___________________
| | | | | | | | | | | | | | | | |
|Esc | |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10 |F11 |F12 |
| | | | | | | | | | | | | | | | |
| 08| | 07| 0F| 17| 1F| | 27| 2F| 37| 3F| | 47| 4F| 56| 5E|
|____| |____|____|____|____| |____|____|____|____| |____|____|____|____|
__________________________________________________________________________
| | | | | | | | | | | | | | | |
|~ |! |@ |# |$ |% |^ |& |* |( |) |_ |+ || |bksp|
|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |\ | |
| 0E| 16| 1E| 26| 25| 2E| 36| 3D| 3E| 46| 45| 4E| 55| 5C| 66|
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
| | | | | | | | | | | | | | |
|Tab |Q |W |E |R |T |Y |U |I |O |P |{ |} | |
| | | | | | | | | | | |[ |] | |
| 0D| 15| 1D| 24| 2D| 2C| 35| 3C| 43| 44| 4D| 54| 5B| |
|____|____|____|____|____|____|____|____|____|____|____|____|____| |
| | | | | | | | | | | | | |
|Caps|A |S |D |F |G |H |J |K |L |: |" | Enter |
| | | | | | | | | | |; |' | |
| 14| 1C| 1B| 23| 2B| 34| 33| 3B| 42| 4B| 4C| 52| 5A|
|____|____|____|____|____|____|____|____|____|____|____|____|______________|
| | | | | | | | | | | | |
| L Shift |Z |X |C |V |B |N |M |< |> |? | R Shift |
| | | | | | | | |, |. |/ | |
| 12| 1A| 22| 21| 2A| 32| 31| 3A| 41| 49| 4A| 59|
|_________|____|____|____|____|____|____|____|____|____|____|______________|
| | | | | | | | |
|L Ctrl | L win | L Alt | space | R Alt | R win | menu |R Ctrl |
| | | | | | | | |
| 11| 8B| 19| 29| 39| 8C| 8D| 58|
|_______|_______|_______|__________________|_______|_______|_______|_______|
____ ____ ____
| | | |
|Prt |Scrl|Paus|
|Scrn|Lock|Brk |
| 57| 5F| 62|
|____|____|____|
____ ____ ____ ____ ____ ____ ____
| | | | | | | | |
|Ins |Home|PgUp| |Num |/ |* |- |
| | | | |Lock| | | |
| 67| 6E| 6F| | 76| 77| 7E| 84|
|____|____|____| |____|____|____|____|
| | | | | | | | |
|Del |End |PgDn| |7 |8 |9 | |
| | | | |Home|(U) |PgUp| |
| 64| 65| 6D| | 6C| 75| 7D| |
|____|____|____| |____|____|____| |
| | | |+ |
|4 |5 |6 | |
|(L) | |(R) | |
| 6B| 73| 74| 7C|
____ |____|____|____|____|
| | | | | | |
|(U) | |1 |2 |3 | |
| | |End |(D) |PgDn| |
| 63| | 69| 72| 7A|Ent |
____|____|____ |____|____|____| |
| | | | | | | |
|(L) |(D) |(R) | |0 |. | |
| | | | |Ins |Del | |
| 61| 60| 6A| | 70| 71| 79|
|____|____|____| |_________|____|____|
code key code key code key code key
---- --- ---- --- ---- --- ---- ---
07 F1 2A V 4A /? 6B (left) 4
08 Esc 2B F 4B L 6C Home 7
2C T 4C ;: 6D PageDown
0D Tab 2D R 4D P 6E Home
0E `~ 2E 5% 4E -_ 6F PageUp
0F F2 2F F6 4F F10 70 Ins 0
71 Del .
11 L Ctrl 31 N 52 '" 72 (down) 2
12 L Shift 32 B 73 5
33 H 54 [{ 74 (right) 6
14 CapsLock 34 G 55 =+ 75 (up) 8
15 Q 35 Y 56 F11 76 NumLock
16 1! 36 6^ 57 PrintScr 77 /
17 F3 37 F7 58 R Ctrl
59 R Shift 79 Enter (on numeric keypad)
19 L Alt 39 R Alt 5A Enter 7A PageDown 3
1A Z 3A M 5B ]}
1B S 3B J 5C \| 7C +
1C A 3C U 7D PageUp 9
1D W 3D 7& 5E F12 7E *
1E 2@ 3E 8* 5F ScrollLock
1F F4 3F F8 60 (down) 84 -
61 (left)
21 C 41 ,< 62 Pause 8B L Win
22 X 42 K 63 (up) 8C R Win
23 D 43 I 64 Del 8D Menu
24 E 44 O 65 End
25 4$ 45 0) 66 BackSpace
26 3# 46 9( 67 Ins
27 F5 47 F9
69 End 1
29 Space 49 .> 6A (right)

Binary file not shown.

Binary file not shown.

60
.cproject Normal file
View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?>
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="0.235109146">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.235109146" moduleId="org.eclipse.cdt.core.settings" name="Default">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="lux" buildProperties="" description="" id="0.235109146" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
<folderInfo id="0.235109146." name="/" resourcePath="">
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.208941372" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.208941372.1250096185" name=""/>
<builder autoBuildTarget="all" cleanBuildTarget="clean" command="C:\Dev\lux\scripts\build.bat" enableAutoBuild="false" enableCleanBuild="true" enabledIncrementalBuild="true" id="org.eclipse.cdt.build.core.settings.default.builder.1098307088" incrementalBuildTarget="all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelizationNumber="1" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.2003174864" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
<tool id="org.eclipse.cdt.build.core.settings.holder.1584520418" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1344643729" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths"/>
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1387975986" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
<tool id="org.eclipse.cdt.build.core.settings.holder.1069888371" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.334291700" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lux/Kernel/include}&quot;"/>
</option>
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.677646028" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
<tool id="org.eclipse.cdt.build.core.settings.holder.566170281" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.690281848" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lux/Kernel/include}&quot;"/>
</option>
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1614219111" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
</toolChain>
</folderInfo>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="lux.null.1792253379" name="lux"/>
</storageModule>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<scannerConfigBuildInfo instanceId="0.235109146">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
<storageModule moduleId="refreshScope" versionNumber="1">
<resource resourceType="PROJECT" workspacePath="/lux"/>
</storageModule>
</cproject>

4
.directory Normal file
View File

@ -0,0 +1,4 @@
[Dolphin]
Timestamp=2011,8,29,9,19,19
Version=2
ViewMode=2

78
.project Normal file
View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>lux</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
<dictionary>
<key>?name?</key>
<value></value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.append_environment</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
<value>all</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildArguments</key>
<value></value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildCommand</key>
<value>C:\Dev\lux\scripts\build.bat</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
<value>clean</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.contents</key>
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
<value>false</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
<value>all</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.stopOnError</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
<value>false</value>
</dictionary>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,66 @@
#Mon Aug 15 18:15:44 EEST 2011
eclipse.preferences.version=1
org.eclipse.cdt.codan.checkers.errnoreturn=Warning
org.eclipse.cdt.codan.checkers.errnoreturn.params={implicit\=>false}
org.eclipse.cdt.codan.checkers.errreturnvalue=Error
org.eclipse.cdt.codan.checkers.errreturnvalue.params={}
org.eclipse.cdt.codan.checkers.noreturn=Error
org.eclipse.cdt.codan.checkers.noreturn.params={implicit\=>false}
org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error
org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error
org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning
org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={}
org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error
org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={}
org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning
org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={no_break_comment\=>"no break",last_case_param\=>true,empty_case_param\=>false}
org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning
org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={unknown\=>false,exceptions\=>()}
org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error
org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error
org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error
org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error
org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error
org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info
org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={pattern\=>"^[a-z]",macro\=>true,exceptions\=>()}
org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning
org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={}
org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error
org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error
org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error
org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning
org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={}
org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning
org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={}
org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning
org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={macro\=>true,exceptions\=>()}
org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning
org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={paramNot\=>false}
org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning
org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={else\=>false,afterelse\=>false}
org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning
org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={}
org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning
org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={}
org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning
org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={exceptions\=>("@(\#)","$Id")}
org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}

View File

@ -0,0 +1,3 @@
#Tue Aug 16 15:19:43 EEST 2011
eclipse.preferences.version=1
org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

955
FONT.TXT
View File

@ -1,955 +0,0 @@
1 8 0 0 0 0 0 0 0 0
1 8 0 0 0 0 0 0 0 -1
1 8 0 0 0 0 0 0 0 -2
1 8 0 0 0 0 0 0 0 -3
1 8 0 0 0 0 0 0 0 -4
1 8 0 0 0 0 0 0 0 -5
1 8 0 0 0 0 0 0 0 -6
1 8 0 0 0 0 0 0 0 -7
1 8 0 0 0 0 0 0 0 -8
1 8 0 0 0 0 0 0 0 -9
1 8 0 0 0 0 0 0 0 -10
1 8 0 0 0 0 0 0 0 -11
1 8 0 0 0 0 0 0 0 -12
1 8 0 0 0 0 0 0 0 -13
1 8 0 0 0 0 0 0 0 -14
1 8 0 0 0 0 0 0 0 -15
1 8 0 0 0 0 0 0 0 -16
1 8 0 0 0 0 0 0 0 -17
1 8 0 0 0 0 0 0 0 -18
1 8 0 0 0 0 0 0 0 -19
1 8 0 0 0 0 0 0 0 -20
1 8 0 0 0 0 0 0 0 -21
1 8 0 0 0 0 0 0 0 -22
1 8 0 0 0 0 0 0 0 -23
1 8 0 0 0 0 0 0 0 -24
1 8 0 0 0 0 0 0 0 -25
1 8 0 0 0 0 0 0 0 -26
1 8 0 0 0 0 0 0 0 -27
1 8 0 0 0 0 0 0 0 -28
1 8 0 0 0 0 0 0 0 -29
1 8 0 0 0 0 0 0 0 -30
1 8 0 0 0 0 0 0 0 -31
5 8
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 8
1 1 1 1 1 0 1 0
3 8
0 1 0 1
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
7 8
0 0 1 0 1 0 0
0 0 1 0 1 0 0
1 1 1 1 1 1 1
0 0 1 0 1 0 0
1 1 1 1 1 1 1
0 0 1 0 1 0 0
0 0 1 0 1 0 0
0 0 0 0 0 0 0
5 8
0 0 1 0 0
0 1 1 1 1
1 0 1 0 0
0 1 1 1 0
0 0 1 0 1
1 1 1 1 0
0 0 1 0 0
0 0 0 0 0
5 8
0 0 0 0 0
1 1 0 0 1
1 1 0 1 0
0 0 1 0 0
0 1 0 1 1
1 0 0 1 1
0 0 0 0 0
0 0 0 0 0
6 8
0 0 1 1 0 0
0 1 0 1 0 0
0 0 1 0 0 0
0 1 0 1 0 0
1 0 0 0 1 1
1 0 0 0 1 0
0 1 1 1 0 1
0 0 0 0 0 0
1 8
1 1 0 0 0 0 0 0
3 8
0 0 1
0 1 0
1 0 0
1 0 0
1 0 0
0 1 0
0 0 1
0 0 0
3 8
1 0 0
0 1 0
0 0 1
0 0 1
0 0 1
0 1 0
1 0 0
0 0 0
7 8
0 0 0 1 0 0 0
1 0 0 1 0 0 1
0 1 0 1 0 1 0
0 0 1 1 1 0 0
0 1 0 1 0 1 0
1 0 0 1 0 0 1
0 0 0 1 0 0 0
0 0 0 0 0 0 0
7 8
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
1 1 1 1 1 1 1
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
2 8
0 0
0 0
0 0
0 0
1 1
1 1
0 1
1 0
6 8
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
1 1 1 1 1 1
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 8
0 0
0 0
0 0
0 0
1 1
1 1
0 0
0 0
7 8
0 0 0 0 0 0 1
0 0 0 0 0 1 0
0 0 0 0 1 0 0
0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 1 0 0 0 0 0
1 0 0 0 0 0 0
0 0 0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 1
1 0 1 0 1
1 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
3 8
0 1 0
1 1 0
0 1 0
0 1 0
0 1 0
0 1 0
1 1 1
0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
1 1 1 1 1
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
0 0 0 0 1
0 0 1 1 0
0 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
6 8
0 0 0 1 1 0
0 0 1 0 1 0
0 1 0 0 1 0
1 0 0 0 1 0
1 1 1 1 1 1
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 0 0
5 8
1 1 1 1 1
1 0 0 0 0
1 0 0 0 0
1 1 1 1 0
0 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 0
1 1 1 1 0
1 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
5 8
1 1 1 1 1
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
0 1 0 0 0
0 1 0 0 0
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 1
0 1 1 1 1
0 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
2 8
0 0
1 1
1 1
0 0
1 1
1 1
0 0
0 0
2 8
0 0
1 1
1 1
0 0
1 1
1 1
0 1
1 0
4 8
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
0 0 0 0
5 8
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
4 8
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 1 1 1
1 0 1 0 1
1 0 1 1 1
1 0 0 0 0
0 1 1 1 1
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
0 0 0 0 0
5 8
1 1 1 1 0
1 0 0 0 1
1 0 0 0 1
1 1 1 1 0
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
5 8
1 1 1 1 0
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 1 1 1 0
0 0 0 0 0
5 8
1 1 1 1 1
1 0 0 0 0
1 0 0 0 0
1 1 1 1 0
1 0 0 0 0
1 0 0 0 0
1 1 1 1 1
0 0 0 0 0
5 8
1 1 1 1 1
1 0 0 0 0
1 0 0 0 0
1 1 1 1 0
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 0
1 0 1 1 0
1 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
5 8
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
0 0 0 0 0
3 8
1 1 1
0 1 0
0 1 0
0 1 0
0 1 0
0 1 0
1 1 1
0 0 0
5 8
0 0 1 1 1
0 0 0 1 0
0 0 0 1 0
0 0 0 1 0
0 0 0 1 0
1 0 0 1 0
0 1 1 0 0
0 0 0 0 0
5 8
1 0 0 0 1
1 0 0 0 1
1 0 0 1 0
1 1 1 0 0
1 0 0 1 0
1 0 0 0 1
1 0 0 0 1
0 0 0 0 0
5 8
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
1 0 0 0 1
1 1 1 1 1
0 0 0 0 0
7 8
1 0 0 0 0 0 1
1 1 0 0 0 1 1
1 0 1 0 1 0 1
1 0 0 1 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
0 0 0 0 0 0 0
5 8
1 0 0 0 1
1 0 0 0 1
1 1 0 0 1
1 0 1 0 1
1 0 0 1 1
1 0 0 0 1
1 0 0 0 1
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
4 8
1 1 1 0
1 0 0 1
1 0 0 1
1 1 1 0
1 0 0 0
1 0 0 0
1 0 0 0
0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 1 1
5 8
1 1 1 0 0
1 0 0 1 0
1 0 0 1 0
1 1 1 0 0
1 0 1 0 0
1 0 0 1 0
1 0 0 0 1
0 0 0 0 0
5 8
0 1 1 1 0
1 0 0 0 1
1 0 0 0 0
0 1 1 1 0
0 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
5 8
1 1 1 1 1
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
5 8
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
0 1 1 1 0
0 0 0 0 0
5 8
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 0 0 0 0
7 8
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
0 1 0 1 0 1 0
0 1 0 1 0 1 0
0 0 1 0 1 0 0
0 0 1 0 1 0 0
0 0 0 0 0 0 0
5 8
1 0 0 0 1
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
1 0 0 0 1
1 0 0 0 1
0 0 0 0 0
5 8
1 0 0 0 1
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 1 1 1 0
0 0 0 0 0
5 8
1 1 1 1 1
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
1 0 0 0 0
1 1 1 1 1
0 0 0 0 0
3 8
1 1 1
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 1 1
0 0 0
7 8
1 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 1 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 0 0 0 1 0
0 0 0 0 0 0 1
0 0 0 0 0 0 0
3 8
1 1 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
1 1 1
0 0 0
5 8
0 0 1 0 0
0 1 0 1 0
1 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
5 8
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
2 8
1 0
0 1
0 0
0 0
0 0
0 0
0 0
0 0
6 8
0 0 0 0 0 0
0 0 0 0 0 0
0 1 1 1 0 0
0 0 0 0 1 0
0 1 1 1 1 0
1 0 0 0 1 0
0 1 1 1 0 1
0 0 0 0 0 0
4 8
1 0 0 0
1 0 0 0
1 1 1 0
1 0 0 1
1 0 0 1
1 0 0 1
1 1 1 0
0 0 0 0
4 8
0 0 0 0
0 0 0 0
0 1 1 0
1 0 0 1
1 0 0 0
1 0 0 1
0 1 1 0
0 0 0 0
4 8
0 0 0 1
0 0 0 1
0 1 1 1
1 0 0 1
1 0 0 1
1 0 0 1
0 1 1 1
0 0 0 0
4 8
0 0 0 0
0 0 0 0
0 1 1 0
1 0 0 1
1 1 1 1
1 0 0 0
0 1 1 1
0 0 0 0
4
0 0 1 0
0 1 0 1
0 1 0 0
1 1 1 0
0 1 0 0
0 1 0 0
0 1 0 0
0 0 0 0
4 8
0 0 0 0
0 0 0 0
0 1 1 0
1 0 0 1
1 0 0 1
0 1 1 1
0 0 0 1
1 1 1 1
4 8
1 0 0 0
1 0 0 0
1 1 1 0
1 0 0 1
1 0 0 1
1 0 0 1
1 0 0 1
0 0 0 0
1 8
1 0 1 1 1 1 1 0
3 8
0 0 1
0 0 0
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
1 1 0
4 8
1 0 0 0
1 0 0 0
1 0 0 1
1 0 1 0
1 1 0 0
1 0 1 0
1 0 0 1
0 0 0 0
2 8
1 0
1 0
1 0
1 0
1 0
1 0
1 1
0 0
7 8
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 1 1 0 1 1 0
1 0 0 1 0 0 1
1 0 0 1 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
0 0 0 0 0 0 0
4 8
0 0 0 0
0 0 0 0
1 1 1 0
1 0 0 1
1 0 0 1
1 0 0 1
1 0 0 1
0 0 0 0
4 8
0 0 0 0
0 0 0 0
0 1 1 0
1 0 0 1
1 0 0 1
1 0 0 1
0 1 1 0
0 0 0 0
4 8
0 0 0 0
0 0 0 0
1 1 1 0
1 0 0 1
1 0 0 1
1 1 1 0
1 0 0 0
1 0 0 0
4 8
0 0 0 0
0 0 0 0
0 1 1 1
1 0 0 1
1 0 0 1
0 1 1 1
0 0 0 1
0 0 0 1
4 8
0 0 0 0
0 0 0 0
1 0 1 1
1 1 0 0
1 0 0 0
1 0 0 0
1 0 0 0
0 0 0 0
4 8
0 0 0 0
0 0 0 0
0 1 1 1
1 0 0 0
0 1 1 0
0 0 0 1
1 1 1 0
0 0 0 0
4 8
0 1 0 0
0 1 0 0
1 1 1 1
0 1 0 0
0 1 0 0
0 1 0 1
0 0 1 0
0 0 0 0
4 8
0 0 0 0
0 0 0 0
1 0 0 1
1 0 0 1
1 0 0 1
1 0 0 1
0 1 1 0
0 0 0 0
5 8
0 0 0 0 0
0 0 0 0 0
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 0 0 0 0
7 8
0 0 0 0 0 0 0
0 0 0 0 0 0 0
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 1 0 0 1
0 1 0 1 0 1 0
0 0 1 0 1 0 0
0 0 0 0 0 0 0
5 8
0 0 0 0 0
0 0 0 0 0
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
1 0 0 0 1
0 0 0 0 0
4 8
0 0 0 0
0 0 0 0
1 0 0 1
1 0 0 1
1 0 0 1
0 1 1 1
0 0 0 1
1 1 1 1
4 8
0 0 0 0
0 0 0 0
1 1 1 1
0 0 0 1
0 1 1 0
1 0 0 0
1 1 1 1
0 0 0 0
3 8
0 0 1
0 1 0
0 1 0
1 0 0
0 1 0
0 1 0
0 0 1
0 0 0
1 8
1 1 1 1 1 1 1 0
3 8
1 0 0
0 1 0
0 1 0
0 0 1
0 1 0
0 1 0
1 0 0
0 0 0
7 8
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 1 1 0 0 0 0
1 0 0 1 0 0 1
0 0 0 0 1 1 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

255
Kernel/debug/commands.c Normal file
View File

@ -0,0 +1,255 @@
#include <debugio.h>
#include <time.h>
#include <stdio.h>
#include <memory-add.h>
#include "../hal/mouse/mouse.h"
#include "../drivers/floppy/floppy.h"
string ConsoleCommands[] =
{
"osver",
"time",
"cls",
"help",
"dump",
"mem",
"crash",
"mouse",
"read",
"reboot",
"restart",
};
int32 ConsoleCommandsCount = 11;
/*****************************************
* osver - get os info *
*****************************************/
void CommandOsver()
{
ConsoleWrite ("%#%s%# 32bit operating system\n", Color(0,ColorYellow), OS_STRING, Color(0,ColorLightGray));
int32 i = 0;
for (i = 0; i < 30; i++)
ConsoleWrite ("%#%c", ColorDarkGray, 205);
ConsoleWrite ("\n%#OS version: %#%s\n", ColorDarkGray, ColorLightGray, OS_VERSION);
ConsoleWrite ("%#Build: %#%s ", ColorDarkGray, ColorLightGray, OS_BUILD);
ConsoleWrite ("%#built on %#%s %#at %#%s\n", ColorDarkGray, ColorLightGray, OS_BUILD_DATE, ColorDarkGray, ColorLightGray, OS_BUILD_TIME);
ConsoleWrite ("%#(c) Copyright %#CTA Systems Inc.\n", ColorDarkGray ,ColorLightGray);
}
/*****************************************
* time - get date and time *
*****************************************/
void CommandTime()
{
const char* Months[] = {
"", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
};
const char* Weekdays[] = {
"", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
};
Time time = TimeConvertToTime(TimeGetInternalTime());
ConsoleWrite ("Current time: ");
ConsoleWrite ("%#%d:%d%d:%d%d.%d%d%d\n", Color(0,ColorLightGreen) ,(int)time.Hour,
time.Minute/10, time.Minute%10, time.Second/10, time.Second%10, time.Milisecond/100, (time.Milisecond/10)%10, time.Milisecond%10);
ConsoleWrite ("Date: %#%s, %s %d, %d\n", Color(0,ColorLightGreen), Weekdays[time.WeekDay],
Months[time.Month], time.Day, time.Year);
}
/*****************************************
* help - help provider *
*****************************************/
void CommandHelp(string params[], int32 count)
{
if (count <= 1)
{
ConsoleWrite ("Available commands:\n");
int i;
for (i = 0; i < ConsoleCommandsCount; i++)
ConsoleWrite(" > %#%s\n", Color(0,ColorWhite), ConsoleCommands[i]);
return;
}
ConsoleWrite("%#! Help for %s command is not implemented yet.\n", Color(0,ColorLightRed), params[1]);
}
/*****************************************
* dump - dumps memory content *
*****************************************/
inline char hex (int32 digit)
{
return (digit < 10) ? (digit + '0') : (digit - 10 + 'A');
}
void CommandDump (string argv[], int32 argc)
{
unsigned pause = 1, i = 0;
// Verify correct number of arguments
if (argc < 3) {
ConsoleWrite("%#! Correct syntax: %#dump %#[start_address] [end_address]\n",
ColorLightRed, ColorWhite, ColorLightGray);
ConsoleWrite("%#Start %#and %#end %#addresses are in hex.\n",
ColorLightGray, ColorDarkGray, ColorLightGray, ColorDarkGray);
return;
}
// Disable pause
if (argc==4 && strcmp(argv[3], "!p") == 0)
pause = 0;
// Dump memory
unsigned char *start, *end;
start = (unsigned char *) ConvertStringToIntHex(argv[1]);
end = (unsigned char *) ConvertStringToIntHex(argv[2]);
unsigned char* count;
while (start <= end) {
// Write address
ConsoleWrite("%#%x%#: ", Color(0,ColorLightMagenta), (unsigned int)start, Color(0,ColorLightGray));
// Write hex data
for (count = start; count < start+16; count++) {
if (*count == 0) ConsoleWrite ("%#00 ", Color(0,ColorDarkGray));
else ConsoleWrite ("%#%c%c ", Color(0,ColorWhite), hex(*count/16), hex(*count%16));
}
// Write ASCII data
ConsoleWrite(" ");
for (count = start; count < start+16; count++) {
if (*count < 32) ConsoleWrite(".");
else ConsoleWrite("%#%c", Color(0,ColorLightGreen), *count);
}
// New line
ConsoleWrite("\n\r");
start+=16; i++;
// Pause
if ((i%22 == 0) && (pause==1)) {
ConsoleWrite("\n\r%#Press %#any key %#to continue scrolling, %#Esc %#to exit.",
0x8, 0x7, 0x8, 0x7, 0x8);
Key k = ReadKey();
if (k.Scancode == KeyboardKeyEscape) return;
ConsoleWrite("\n\n\r");
}
}
}
#define _CommandMemTotalRows 10
void _CommandMemPrintMemmap()
{
uint8 color = Color(ColorGreen, ColorRed);
uint32 total = MemoryGetFramesTotal();
char c = ' ';
// Print memory map
int32 i, old = 0, n = 0, blocks, used;
for (i = 0; i < 80; i++)
ConsoleWrite("%#%c", ColorLightGray, 220);
for (i = 1; i <= 80*_CommandMemTotalRows; i++, old++)
{
n = (total * i) / (80 * _CommandMemTotalRows);
blocks = n - old;
used = 0;
for (; old < n; old++)
used += (MemPhGetFrame(old) != 0);
if (used <= blocks / 5) c = ' ';
else if (used > 4 * blocks / 5) c = 219;
else if (used <= 2 * blocks / 5) c = 176;
else if (used <= 3 * blocks / 5) c = 177;
else c = 178;
ConsoleWrite("%#%c", color, c);
}
for (i = 0; i < 80; i++)
ConsoleWrite("%#%c", ColorDarkGray, 223);
}
void CommandMem (string argv[], int32 argc)
{
if (argc < 2)
{
ConsoleWrite ("Physical memory map:\n");
_CommandMemPrintMemmap();
ConsoleWrite ("Free space: %#%ukb (%u frames)\n", ColorLightMagenta, MemoryGetFree(), MemoryGetFramesFree());
ConsoleWrite ("Used space: %#%ukb (%u frames)\n\n", ColorLightMagenta, MemoryGetUsed(), MemoryGetFramesUsed());
ConsoleWrite ("Total space: %#%ukb (%u frames)\n", ColorLightMagenta, MemoryGetTotal(), MemoryGetFramesTotal());
return;
}
if (strcmp(argv[1], "alloc") == 0)
{
uint32 addr = 0;
if (argc < 3) addr = (uint32)kmalloc(0x4);
else addr = (uint32)kmalloc(ConvertStringToUInt(argv[2]));
ConsoleWrite("Returned address: %#0x%x\n", ColorWhite, addr);
}
else if (strcmp(argv[1], "free") == 0)
{
if (argc < 3) {
ConsoleWrite ("%#! Missing parameter: address to free.", ColorRed);
return;
}
kfree((void*)ConvertStringToIntHex(argv[2]));
ConsoleWrite("Done.\n");
}
else ConsoleWrite("%#! Invalid command. Available commands are: alloc, free.", ColorLightRed);
}
void CommandCrash()
{
int a = 10, b = 0;
ConsoleWrite ("%d", a/b);
}
void CommandMouse()
{
MouseState s = MouseGetState();
ConsoleWrite("X=%d Y=%d Buttons=", s.Position.X, s.Position.Y);
if (!s.Buttons) ConsoleWrite("<none>");
if (s.Buttons & 1) ConsoleWrite("<left>");
if (s.Buttons & 2) ConsoleWrite("<right>");
if (s.Buttons & 4) ConsoleWrite("<mid>");
ConsoleWrite("\n");
}
void CommandRead(string argv[], int32 argc)
{
if (argc < 2)
{
ConsoleWrite("%#! Missing parameter - sector!\n", ColorLightRed);
return;
}
uint32 sector = ConvertStringToUInt(argv[1]);
ConsoleWrite("Returned value: 0x%x\n", FloppyRead(0, sector));
}

255
Kernel/debug/commands.c~ Normal file
View File

@ -0,0 +1,255 @@
#include <debugio.h>
#include <time.h>
#include <stdio.h>
#include <memory-add.h>
#include "../hal/mouse/mouse.h"
#include "../drivers/floppy/floppy.h"
string ConsoleCommands[] =
{
"osver",
"time",
"cls",
"help",
"dump",
"mem",
"crash",
"mouse",
"read",
"reboot",
"restart",
};
int32 ConsoleCommandsCount = 11;
/*****************************************
* osver - get os info *
*****************************************/
void CommandOsver()
{
ConsoleWrite ("%#%s%# 32bit operating system\n", Color(0,ColorYellow), OS_STRING, Color(0,ColorLightGray));
int32 i = 0;
for (i = 0; i < 30; i++)
ConsoleWrite ("%#%c", ColorDarkGray, 205);
ConsoleWrite ("\n%#OS version: %#%s\n", ColorDarkGray, ColorLightGray, OS_VERSION);
ConsoleWrite ("%#Build: %#%s ", ColorDarkGray, ColorLightGray, OS_BUILD);
ConsoleWrite ("%#built on %#%s %#at %#%s\n", ColorDarkGray, ColorLightGray, OS_BUILD_DATE, ColorDarkGray, ColorLightGray, OS_BUILD_TIME);
ConsoleWrite ("%#(c) Copyright %#CTA Systems Inc.\n", ColorDarkGray ,ColorLightGray);
}
/*****************************************
* time - get date and time *
*****************************************/
void CommandTime()
{
const char* Months[] = {
"", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
};
const char* Weekdays[] = {
"", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
};
Time time = TimeConvertToTime(TimeGetInternalTime());
ConsoleWrite ("Current time: ");
ConsoleWrite ("%#%d:%d%d:%d%d.%d%d%d\n", Color(0,ColorLightGreen) ,(int)time.Hour,
time.Minute/10, time.Minute%10, time.Second/10, time.Second%10, time.Milisecond/100, (time.Milisecond/10)%10, time.Milisecond%10);
ConsoleWrite ("Date: %#%s, %s %d, %d\n", Color(0,ColorLightGreen), Weekdays[time.WeekDay],
Months[time.Month], time.Day, time.Year);
}
/*****************************************
* help - help provider *
*****************************************/
void CommandHelp(string params[], int32 count)
{
if (count <= 1)
{
ConsoleWrite ("Available commands:\n");
int i;
for (i = 0; i < ConsoleCommandsCount; i++)
ConsoleWrite(" > %#%s\n", Color(0,ColorWhite), ConsoleCommands[i]);
return;
}
ConsoleWrite("%#! Help for %s command is not implemented yet.\n", Color(0,ColorLightRed), params[1]);
}
/*****************************************
* dump - dumps memory content *
*****************************************/
inline char hex (int32 digit)
{
return (digit < 10) ? (digit + '0') : (digit - 10 + 'A');
}
void CommandDump (string argv[], int32 argc)
{
unsigned pause = 1, i = 0;
// Verify correct number of arguments
if (argc < 3) {
ConsoleWrite("%#! Correct syntax: %#dump %#[start_address] [end_address]\n",
ColorLightRed, ColorWhite, ColorLightGray);
ConsoleWrite("%#Start %#and %#end %#addresses are in hex.\n",
ColorLightGray, ColorDarkGray, ColorLightGray, ColorDarkGray);
return;
}
// Disable pause
if (argc==4 && strcmp(argv[3], "!p") == 0)
pause = 0;
// Dump memory
unsigned char *start, *end;
start = (unsigned char *) ConvertStringToIntHex(argv[1]);
end = (unsigned char *) ConvertStringToIntHex(argv[2]);
unsigned char* count;
while (start <= end) {
// Write address
ConsoleWrite("%#%x%#: ", Color(0,ColorLightMagenta), (unsigned int)start, Color(0,ColorLightGray));
// Write hex data
for (count = start; count < start+16; count++) {
if (*count == 0) ConsoleWrite ("%#00 ", Color(0,ColorDarkGray));
else ConsoleWrite ("%#%c%c ", Color(0,ColorWhite), hex(*count/16), hex(*count%16));
}
// Write ASCII data
ConsoleWrite(" ");
for (count = start; count < start+16; count++) {
if (*count < 32) ConsoleWrite(".");
else ConsoleWrite("%#%c", Color(0,ColorLightGreen), *count);
}
// New line
ConsoleWrite("\n\r");
start+=16; i++;
// Pause
if ((i%22 == 0) && (pause==1)) {
ConsoleWrite("\n\r%#Press %#any key %#to continue scrolling, %#Esc %#to exit.",
0x8, 0x7, 0x8, 0x7, 0x8);
Key k = ReadKey();
if (k.Scancode == KeyboardKeyEscape) return;
ConsoleWrite("\n\n\r");
}
}
}
#define _CommandMemTotalRows 10
void _CommandMemPrintMemmap()
{
uint8 color = Color(ColorGreen, ColorRed);
uint32 total = MemoryGetFramesTotal();
char c = ' ';
// Print memory map
int32 i, old = 0, n = 0, blocks, used;
for (i = 0; i < 80; i++)
ConsoleWrite("%#%c", ColorLightGray, 220);
for (i = 1; i <= 80*_CommandMemTotalRows; i++, old++)
{
n = (total * i) / (80 * _CommandMemTotalRows);
blocks = n - old;
used = 0;
for (; old < n; old++)
used += (MemPhGetFrame(old) != 0);
if (used <= blocks / 5) c = ' ';
else if (used > 4 * blocks / 5) c = 219;
else if (used <= 2 * blocks / 5) c = 176;
else if (used <= 3 * blocks / 5) c = 177;
else c = 178;
ConsoleWrite("%#%c", color, c);
}
for (i = 0; i < 80; i++)
ConsoleWrite("%#%c", ColorDarkGray, 223);
}
void CommandMem (string argv[], int32 argc)
{
if (argc < 2)
{
ConsoleWrite ("Memory map:\n");
_CommandMemPrintMemmap();
ConsoleWrite ("Free space: %#%ukb (%u frames)\n", ColorLightMagenta, MemoryGetFree(), MemoryGetFramesFree());
ConsoleWrite ("Used space: %#%ukb (%u frames)\n\n", ColorLightMagenta, MemoryGetUsed(), MemoryGetFramesUsed());
ConsoleWrite ("Total space: %#%ukb (%u frames)\n", ColorLightMagenta, MemoryGetTotal(), MemoryGetFramesTotal());
return;
}
if (strcmp(argv[1], "alloc") == 0)
{
uint32 addr = 0;
if (argc < 3) addr = (uint32)kmalloc(0x4);
else addr = (uint32)kmalloc(ConvertStringToUInt(argv[2]));
ConsoleWrite("Returned address: %#0x%x\n", ColorWhite, addr);
}
else if (strcmp(argv[1], "free") == 0)
{
if (argc < 3) {
ConsoleWrite ("%#! Missing parameter: address to free.", ColorRed);
return;
}
kfree((void*)ConvertStringToIntHex(argv[2]));
ConsoleWrite("Done.\n");
}
else ConsoleWrite("%#! Invalid command. Available commands are: alloc, free.", ColorLightRed);
}
void CommandCrash()
{
int a = 10, b = 0;
ConsoleWrite ("%d", a/b);
}
void CommandMouse()
{
MouseState s = MouseGetState();
ConsoleWrite("X=%d Y=%d Buttons=", s.Position.X, s.Position.Y);
if (!s.Buttons) ConsoleWrite("<none>");
if (s.Buttons & 1) ConsoleWrite("<left>");
if (s.Buttons & 2) ConsoleWrite("<right>");
if (s.Buttons & 4) ConsoleWrite("<mid>");
ConsoleWrite("\n");
}
void CommandRead(string argv[], int32 argc)
{
if (argc < 2)
{
ConsoleWrite("%#! Missing parameter - sector!\n", ColorLightRed);
return;
}
uint32 sector = ConvertStringToUInt(argv[1]);
ConsoleWrite("Returned value: 0x%x\n", FloppyRead(0, sector));
}

131
Kernel/debug/console-base.c Normal file
View File

@ -0,0 +1,131 @@
#include <debugio.h>
#include <memory.h>
#include <stdio.h>
uint8* VideoPtr = (uint8*) 0xb8000;
Point ConsoleCursor = {0, 0};
UPoint ConsoleSize = {80, 25};
uint8 ConsoleDefaultColor = CONSOLE_DEFAULT_COLOR;
/**************************************
* Basic console operations *
**************************************/
void ConsoleClear()
{
uint32 temp;
for (temp = 0; temp < ConsoleSize.X * ConsoleSize.Y; temp++)
{
VideoPtr[2 * temp] = 0;
VideoPtr[2 * temp + 1] = ConsoleDefaultColor;
}
ConsoleCursor.X = ConsoleCursor.Y = 0;
ConsoleCursorUpdateHardware();
}
void ConsoleScroll (uint32 lines)
{
// Sanity check, don't scroll too much
if (lines > ConsoleSize.Y) lines = ConsoleSize.Y;
uint32 x, y;
for (y = 0; y < ConsoleSize.Y - lines; y++)
for (x = 0; x < 2*ConsoleSize.X; x++)
VideoPtr[y * ConsoleSize.X * 2 + x] = VideoPtr[(y+lines)*ConsoleSize.X*2 + x];
for (y = ConsoleSize.Y - lines; y < ConsoleSize.Y; y++)
for (x = 0; x < ConsoleSize.X; x++)
{
VideoPtr[2 * (y * ConsoleSize.X + x)] = 0;
VideoPtr[2 * (y * ConsoleSize.X + x) + 1] = ConsoleDefaultColor;
}
ConsoleCursor.Y -= lines;
}
/**************************************
* Cursor position *
**************************************/
Point ConsoleGetCursor()
{
return ConsoleCursor;
}
extern void ConsoleSetCursor(Point p)
{
ConsoleCursor = p;
}
void ConsoleCursorIncreasePos (int32 delta)
{
// Increase X, Y positions
ConsoleCursor.Y += delta / ConsoleSize.X;
ConsoleCursor.X += delta % ConsoleSize.X;
// Next line if X > Screen width
while (ConsoleCursor.X >= (int32)ConsoleSize.X)
{
ConsoleCursor.Y++;
ConsoleCursor.X -= ConsoleSize.X;
}
// Previous line if X < 0
while (ConsoleCursor.X < 0)
{
ConsoleCursor.Y--;
ConsoleCursor.X += ConsoleSize.X;
}
// Scroll if Y > Screen height
if (ConsoleCursor.Y >= (int32)ConsoleSize.Y)
ConsoleScroll(1);
}
void ConsoleCursorNewline()
{
ConsoleCursor.X = 0;
if (++ConsoleCursor.Y >= (int32)ConsoleSize.Y)
ConsoleScroll(1);
}
void ConsoleCursorUpdateHardware()
{
uint16 temp = (uint16) (ConsoleCursor.Y * ConsoleSize.X + ConsoleCursor.X);
uint16* port = (uint16*) 0x463 ;
outportb(*port, 14);
outportb(*port + 1, (temp >> 8) & 0xff);
outportb(*port, 15);
outportb(*port + 1, temp & 0xff);
}
uint8 Color (uint8 back, uint8 fore)
{
return ((back<<4) | fore);
}
void ConsoleSetDefaultColor(uint8 color)
{
ConsoleDefaultColor = color;
}
uint8 ConsoleGetDefaultColor ()
{
return ConsoleDefaultColor;
}
UPoint ConsoleGetSize()
{
return ConsoleSize;
}
void ConsoleCursorGoto(Point p)
{
if (p.X >= 0 && p.X < (int32)ConsoleSize.X) ConsoleCursor.X = p.X;
if (p.Y >= 0 && p.Y < (int32)ConsoleSize.Y) ConsoleCursor.Y = p.Y;
}

162
Kernel/debug/console-in.c Normal file
View File

@ -0,0 +1,162 @@
#include <debugio.h>
#include <stdio.h>
#include <ctype.h>
#include "../hal/keyboard/keyboard.h"
// extern uint8* VideoPtr;
extern UPoint ConsoleCursor;
// extern UPoint ConsoleSize;
// extern uint8 ConsoleDefaultColor;
extern void _write_char (char c);
extern void _write_string (string s);
int _next_word_index (string s, int32 direction, int32 current, int32 len)
{
int32 tmp = current;
if (direction < 0) {
--tmp;
while ((isspace((unsigned char)s[tmp]) || ispunct((unsigned char)s[tmp])) && tmp > 0) --tmp;
while (isalnum((unsigned char)s[tmp]) && tmp > 0) --tmp;
if (tmp != 0) tmp++;
}
else {
++tmp;
while (isalnum((unsigned char)s[tmp]) && tmp < len) ++tmp;
while ((isspace((unsigned char)s[tmp]) || ispunct((unsigned char)s[tmp])) && tmp < len) ++tmp;
}
return tmp;
}
void _string_crop (string s, int32 start, int32 end, int32* len)
{
int32 i;
for (i = end; i < *len; i++)
s[i-(end-start)] = s[i];
*len = *len - (end - start);
s[*len] = 0;
}
void _string_insert (string s, char what, int32 position, int32* len)
{
int32 i;
for (i = *len; i > position; i--)
s[i] = s[i-1];
s[position] = what;
*len = *len + 1;
s[*len] = 0;
}
void ConsoleReadString (string s, int32 buffer_size, char end_char)
{
Key key;
int32 cursor=0, length = 0, old_length = 0;
UPoint cursor_original = ConsoleCursor;
s[0] = 0;
do {
// Read a key from keyboard
key = ReadKey();
// Process scancode
switch (key.Scancode)
{
// Left arrow
case KeyboardKeyLeft:
if (cursor > 0)
{
if (KeyboardGetKeyStatus(KeyboardKeyRightCtrl) || KeyboardGetKeyStatus(KeyboardKeyLeftCtrl))
cursor = _next_word_index(s, -1, cursor, length);
else --cursor;
}
break;
// Right arrow
case KeyboardKeyRight:
if (cursor < length)
{
if (KeyboardGetKeyStatus(KeyboardKeyRightCtrl) || KeyboardGetKeyStatus(KeyboardKeyLeftCtrl))
cursor = _next_word_index(s, 1, cursor, length);
else ++cursor;
}
break;
// Delete key
case KeyboardKeyDelete:
{
if (cursor == length) break;
int32 start_d = cursor, end_d;
if (KeyboardGetKeyStatus(KeyboardKeyRightCtrl) || KeyboardGetKeyStatus(KeyboardKeyLeftCtrl))
end_d = _next_word_index(s, 1, cursor, length);
else end_d = cursor + 1;
_string_crop(s, start_d, end_d, &length);
break;
}
// Backspace key
case KeyboardKeyBackspace:
{
if (cursor == 0) break;
int32 end = cursor;
if (KeyboardGetKeyStatus(KeyboardKeyRightCtrl) || KeyboardGetKeyStatus(KeyboardKeyLeftCtrl))
cursor = _next_word_index(s, -1, cursor, length);
else cursor --;
_string_crop(s, cursor, end, &length);
break;
}
// Home key
case KeyboardKeyHome:
cursor = 0; break;
// End key
case KeyboardKeyEnd:
cursor = length; break;
// Rest of keys
default:
// Ignore non-character keys
if (key.Character == 0 || iscntrl(key.Character)) break;
_string_insert(s, key.Character, cursor, &length);
++cursor;
break;
}
// Redraw string
ConsoleCursor = cursor_original;
// Remove old string if still there
int32 i;
if (old_length > length)
for (i = 0; i < old_length; i++)
_write_char(' ');
old_length = length;
ConsoleCursor = cursor_original;
_write_string(s);
ConsoleCursor = cursor_original;
ConsoleCursorIncreasePos(cursor);
ConsoleCursorUpdateHardware();
} while (key.Character != end_char && length < buffer_size);
ConsoleWriteChar('\n');
}

155
Kernel/debug/console-out.c Normal file
View File

@ -0,0 +1,155 @@
#include <debugio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
extern uint8* VideoPtr;
extern UPoint ConsoleCursor;
extern UPoint ConsoleSize;
extern uint8 ConsoleDefaultColor;
/**************************************
* Write operations*
**************************************/
void _write_char(char c)
{
switch (c)
{
case '\n':
ConsoleCursorNewline(); break;
case '\r':
ConsoleCursor.X = 0; break;
case '\t':
ConsoleCursorIncreasePos(6 - ConsoleCursor.X % 6); break;
case '\b':
ConsoleCursorIncreasePos(-1);
VideoPtr[2 * (ConsoleCursor.Y * ConsoleSize.X + ConsoleCursor.X)] = 0;
break;
default:
VideoPtr[2 * (ConsoleCursor.Y * ConsoleSize.X + ConsoleCursor.X)] = c;
VideoPtr[2 * (ConsoleCursor.Y * ConsoleSize.X + ConsoleCursor.X) + 1] = ConsoleDefaultColor;
ConsoleCursorIncreasePos(1);
break;
}
}
void _write_string (string s)
{
int32 len = strlen(s), i;
for (i = 0; i < len; i++)
_write_char(s[i]);
}
void ConsoleWriteChar (char c)
{
_write_char(c);
ConsoleCursorUpdateHardware();
}
void ConsoleWriteString (string s)
{
_write_string(s);
ConsoleCursorUpdateHardware();
}
int32 ConsoleWrite (string format, ...)
{
if (!format || !*format) return 0;
va_list args;
va_start (args, format);
uint32 i, len = strlen(format);
uint8 temp_color = ConsoleDefaultColor;
for (i = 0; i < len; i++)
if (format[i] != '%') _write_char(format[i]);
else
{
++i;
switch (format[i]) {
// Character
case 'c': {
char c = va_arg (args, char);
_write_char(c);
break;
}
// String
case 's': {
int32* c = (int32*) va_arg (args, string);
_write_string((string)c);
break;
}
// Integers
case 'd':
case 'i': {
int32 c = va_arg(args, int32); char temp[32];
ConvertIntToString(temp, c, 10);
_write_string(temp);
break;
}
// Integers - hex
case 'X':
case 'x': {
int32 c = va_arg(args, int32); char temp[32];
ConvertUIntToString(temp, c, 16);
_write_string(temp);
break;
}
// Integers - unsigned
case 'u': {
int32 c = va_arg(args, uint32); char temp[32];
ConvertUIntToString (temp, c, 10);
_write_string(temp);
break;
}
// Colors
case '#': {
uint8 c = va_arg(args, uint8);
ConsoleDefaultColor = c;
break; }
default: va_end(args); return 1;
};
}
va_end(args);
ConsoleDefaultColor = temp_color;
ConsoleCursorUpdateHardware();
return i;
}
void ConsoleSetChar(Point pos, char c)
{
VideoPtr[2 * (pos.Y * ConsoleSize.X + pos.X)] = c;
}
void ConsoleSetColor(Point pos, uint8 color)
{
VideoPtr[2 * (pos.Y * ConsoleSize.X + pos.X) + 1] = color;
}
char ConsoleGetChar(Point pos)
{
return (char)VideoPtr[2 * (pos.Y * ConsoleSize.X + pos.X)];
}
uint8 ConsoleGetColor (Point pos)
{
return VideoPtr[2 * (pos.Y * ConsoleSize.X + pos.X) + 1];
}

93
Kernel/debug/console.c Normal file
View File

@ -0,0 +1,93 @@
#include <debugio.h>
#include <stdlib.h>
#include <ctype.h>
#include "commands.c"
void _process_command (string params[16], int32 count);
void _command_does_not_exist(string command);
void ConsoleMain()
{
char buffer[512];
string params[CONSOLE_MAX_PARAMS];
CommandOsver();
for (;;)
{
// Read a string
ConsoleWrite("\n%#] ", Color(ColorBlack, ColorYellow));
ConsoleReadString(buffer, 512, '\n');
// Split buffer in params
params[0] = buffer;
int32 i=0, len = strlen(buffer), param_count = 0;
while (i < len && param_count < CONSOLE_MAX_PARAMS)
{
// Skip spaces before
while (i < len && isspace(buffer[i])) buffer[i++] = 0;
if (i == len) break;
params[param_count++] = &buffer[i];
// Skip non-spaces
while (i < len && !isspace(buffer[i])) i++;
}
// Send command to processing
_process_command(params, param_count);
}
}
void _process_command (string params[CONSOLE_MAX_PARAMS], int32 count)
{
int32 Cmd = -1;
if (count == 0)
{
ConsoleWrite ("%#! You must enter a command!\n", Color(0, ColorLightRed));
return;
}
// Lookup command in list
int32 i;
for (i = 0; i < ConsoleCommandsCount && Cmd == -1; i++)
if (strcmp(params[0], ConsoleCommands[i]) == 0) Cmd = i;
switch (Cmd)
{
case -1: _command_does_not_exist(params[0]); break;
case 0: CommandOsver(); break;
case 1: CommandTime(); break;
case 2: ConsoleClear(); break;
case 3: CommandHelp(params, count); break;
case 4: CommandDump (params, count); break;
case 5: CommandMem(params, count); break;
case 6: CommandCrash(); break;
case 7: CommandMouse(); break;
case 8: CommandRead(params, count); break;
case 9:
case 10: SystemReboot(); break;
default: ConsoleWrite ("%#! Command %#%s%# was not implemented (yet)!\n",
Color(0,ColorLightRed), Color(0,ColorWhite), params[0], Color(0,ColorLightRed)); break;
}
}
void _command_does_not_exist(string command)
{
if (strlen(command) > 20)
{
command[18] = command[19] = command[20] = '.';
command[21] = null;
}
ConsoleWrite ("%#! Command %#%s%# does not exist!\n",
Color(0,ColorLightRed), Color(0,ColorWhite), command, Color(0,ColorLightRed));
}

View File

@ -0,0 +1,63 @@
#include <time.h>
#include <stdio.h>
#include "cmos.h"
uint8 CmosRead (uint8 address)
{
outportb(0x70, address); iowait();
return inportb(0x71);
}
void CmosWrite (uint8 address, uint8 val)
{
outportb(0x70, address); iowait();
outportb(0x71, val);
}
void CmosSetRTC (const Time* time)
{
unsigned char BCD = ((CmosRead(0x0b)&4)==0) ? 1 : 0;
unsigned char ampm = ((CmosRead(0x0b)&2)==0) ? 1 : 0;
uint8 year = time->Year % 100;
uint8 century = time->Year / 100;
CmosWrite (0, (BCD) ? (time->Second%10) | (time->Second/10*16) : time->Second); // Seconds
CmosWrite (2, (BCD) ? (time->Minute%10) | (time->Minute/10*16) : time->Minute); // Minutes
if (ampm && time->Hour > 12) // Hours
CmosWrite (4, (BCD) ? (((time->Hour - 12) % 10) | ((time->Hour - 12)/10*16) | 0x80) : (time->Hour | 0x80) );
else if (ampm && time->Hour == 0) // Midnight convention: 12 PM = 00:00
CmosWrite (4, (BCD) ? 0x92 : 0x8C);
else CmosWrite (4, (BCD) ? (time->Hour%10) | (time->Hour/10*16) : time->Hour); // 24h / AM
CmosWrite (7, (BCD) ? (time->Day%10) | (time->Day/10*16) : time->Day); // Day
CmosWrite (8, (BCD) ? (time->Month%10) | (time->Month/10*16) : time->Month); // Month
CmosWrite (9, (BCD) ? (year%10) | (year/10*16) : year); // Year
CmosWrite (0x32, (BCD) ? (century%10) | (century/10*16) : century); // Century
}
void CmosGetRTC(Time* tim)
{
unsigned char BCD = ((CmosRead(0x0b)&4)==0) ? 1 : 0;
unsigned char am_pm = ((CmosRead(0x0b)&2)==0) ? 1 : 0;
tim->Second = (BCD) ? (CmosRead(0x00)%16) + 10*(CmosRead(0x00)/16): CmosRead(0x00);
tim->Minute = (BCD) ? (CmosRead(0x02)%16) + 10*(CmosRead(0x02)/16): CmosRead(0x02);
// Time is PM
if (am_pm && (CmosRead(0x04)&80)) {
tim->Hour = (BCD) ? ((CmosRead(0x04)-0x80)%16) + 10*((CmosRead(0x04)-0x80)/16): CmosRead(0x04)-0x80;
tim->Hour += 12;
}
// 24Hour format, or AM
else tim->Hour = (BCD) ? (CmosRead(0x04)%16) + 10*(CmosRead(0x04)/16): CmosRead(0x04);
tim->WeekDay = (BCD) ? (CmosRead(0x06)%16) + 10*(CmosRead(0x06)/16): CmosRead(0x06);
tim->Day = (BCD) ? (CmosRead(0x07)%16) + 10*(CmosRead(0x07)/16): CmosRead(0x07);
tim->Month = (BCD) ? (CmosRead(0x08)%16) + 10*(CmosRead(0x08)/16): CmosRead(0x08);
tim->Year = (BCD) ? (CmosRead(0x09)%16) + 10*(CmosRead(0x09)/16): CmosRead(0x09);
tim->Year += 100 * ((BCD) ? (CmosRead(0x32)%16) + 10*(CmosRead(0x32)/16): CmosRead(0x32));
}

View File

@ -0,0 +1,12 @@
#ifndef __CMOS__H
#define __CMOS__H
#include <types.h>
#include <time.h>
extern uint8 CmosRead (uint8 address);
extern void CmosWrite (uint8 address, uint8 val);
extern void CmosSetRTC (const Time* time);
extern void CmosGetRTC(Time* tim);
#endif

111
Kernel/drivers/dma/dma.c Normal file
View File

@ -0,0 +1,111 @@
/*
* dma.c
*
* Created on: Aug 20, 2011
* Author: Tiberiu
*/
#include <stdio.h>
#include "dma.h"
void DmaSetAddress (uint8 channel, uint8 low, uint8 high)
{
uint16 port = 0;
switch (channel)
{
case 0: port = DmaRegisterChannel0Address; break;
case 1: port = DmaRegisterChannel1Address; break;
case 2: port = DmaRegisterChannel2Address; break;
case 3: port = DmaRegisterChannel3Address; break;
case 4: port = DmaRegisterChannel4Address; break;
case 5: port = DmaRegisterChannel5Address; break;
case 6: port = DmaRegisterChannel6Address; break;
case 7: port = DmaRegisterChannel7Address; break;
default: return;
}
outportb(port, low); iowait();
outportb(port, high);
}
void DmaSetCount (uint8 channel, uint8 low, uint8 high)
{
uint16 port = 0;
switch (channel)
{
case 0: port = DmaRegisterChannel0Count; break;
case 1: port = DmaRegisterChannel1Count; break;
case 2: port = DmaRegisterChannel2Count; break;
case 3: port = DmaRegisterChannel3Count; break;
case 4: port = DmaRegisterChannel4Count; break;
case 5: port = DmaRegisterChannel5Count; break;
case 6: port = DmaRegisterChannel6Count; break;
case 7: port = DmaRegisterChannel7Count; break;
default: return;
}
outportb(port, low); iowait();
outportb(port, high);
}
void DmaSetExternalPageRegisters (uint8 channel, uint8 val)
{
uint16 port = 0;
switch (channel)
{
case 1: port = DmaRegisterChannel1PageAddress; break;
case 2: port = DmaRegisterChannel2PageAddress; break;
case 3: port = DmaRegisterChannel3PageAddress; break;
case 5: port = DmaRegisterChannel5PageAddress; break;
case 6: port = DmaRegisterChannel6PageAddress; break;
case 7: port = DmaRegisterChannel7PageAddress; break;
default: return;
}
outportb(port, val);
}
void DmaResetFlipFlop (uint8 channel)
{
uint16 port = (channel < 4) ? DmaRegisterFlipFlopReset : 2*DmaRegisterFlipFlopReset+0xC0;
outportb(port, 0);
}
void DmaReset ()
{
outportb(DmaRegisterMasterReset, 0);
}
void DmaUnmaskAll()
{
outportb(DmaRegisterMaskReset, 0);
}
void DmaMaskChannel(uint8 channel)
{
if (channel >= 8) return;
uint16 port = (channel < 4) ? (DmaRegisterSingleChannelMask) : (2*DmaRegisterSingleChannelMask + 0xC0);
outportb(port, channel%4 | 4);
}
void DmaUnmaskChannel (uint8 channel)
{
if (channel >= 8) return;
uint16 port = (channel < 4) ? (DmaRegisterSingleChannelMask) : (2*DmaRegisterSingleChannelMask + 0xC0);
outportb(port, channel%4);
}
void DmaSetMode (uint8 channel, uint8 mode)
{
if (channel >= 8) return;
uint16 port = (channel < 4) ? (DmaRegisterMode) : (2*DmaRegisterMode + 0xC0);
DmaMaskChannel(channel);
outportb(port, (channel%4) | mode );
DmaUnmaskAll();
}

80
Kernel/drivers/dma/dma.h Normal file
View File

@ -0,0 +1,80 @@
/*
* dma.h
*
* Created on: Aug 20, 2011
* Author: Tiberiu
*/
#ifndef DMA_H_
#define DMA_H_
#include <types.h>
enum DmaRegisters
{
DmaRegisterStatus = 0x08,
DmaRegisterCommand = 0x08,
DmaRegisterRequest = 0x09,
DmaRegisterSingleChannelMask = 0x0A,
DmaRegisterMode = 0x0B,
DmaRegisterFlipFlopReset = 0x0C,
DmaRegisterIntermediate = 0x0D,
DmaRegisterMasterReset = 0x0D,
DmaRegisterMaskReset = 0x0E,
DmaRegisterMultichannelMask = 0x0F,
DmaRegisterChannel0Address = 0x00,
DmaRegisterChannel1Address = 0x02,
DmaRegisterChannel2Address = 0x04,
DmaRegisterChannel3Address = 0x06,
DmaRegisterChannel4Address = 0xC0,
DmaRegisterChannel5Address = 0xC4,
DmaRegisterChannel6Address = 0xC8,
DmaRegisterChannel7Address = 0xCC,
DmaRegisterChannel0Count = 0x01,
DmaRegisterChannel1Count = 0x03,
DmaRegisterChannel2Count = 0x05,
DmaRegisterChannel3Count = 0x07,
DmaRegisterChannel4Count = 0xC2,
DmaRegisterChannel5Count = 0xC6,
DmaRegisterChannel6Count = 0xCA,
DmaRegisterChannel7Count = 0xCE,
DmaRegisterChannel1PageAddress = 0x83,
DmaRegisterChannel2PageAddress = 0x81,
DmaRegisterChannel3PageAddress = 0x82,
DmaRegisterChannel5PageAddress = 0x8B,
DmaRegisterChannel6PageAddress = 0x89,
DmaRegisterChannel7PageAddress = 0x8A
};
enum DmaModes
{
DmaModeChannelMask = 0x3,
DmaModeSelfTest = 0,
DmaModeWrite = 0x8,
DmaModeRead = 0x4,
DmaModeAutoReinit = 0x10,
DmaModeDown = 0x20,
DmaModeTransferOnDemand = 0,
DmaModeTransferSingleDma = 0x40,
DmaModeTransferBlockDma = 0x80,
DmaModeTransferCascade = 0xC0
};
extern void DmaSetAddress (uint8 channel, uint8 low, uint8 high);
extern void DmaSetCount (uint8 channel, uint8 low, uint8 high);
extern void DmaSetExternalPageRegisters (uint8 channel, uint8 val);
extern void DmaSetMode (uint8 channel, uint8 mode);
extern void DmaResetFlipFlop (uint8 channel);
extern void DmaReset ();
extern void DmaMaskChannel(uint8 channel);
extern void DmaUnmaskChannel (uint8 channel);
extern void DmaUnmaskAll ();
#endif /* DMA_H_ */

34
Kernel/drivers/drivers.c Normal file
View File

@ -0,0 +1,34 @@
#include "drivers.h"
#include "cmos/cmos.h"
#include "pit/pit.h"
#include "floppy/floppy.h"
#include "time.h"
#include "../hal/cpu/irq.h"
#include <debugio.h>
void DriversInstall_Clock()
{
// Set up PIT
PitSetFrequency(PIT_FREQUENCY);
// Update internal clock
Time time;
CmosGetRTC(&time);
TimeSetInternalTime(TimeConvertToTimeSystem(time));
Log("%#[Drivers] %#Read RTC time: ", ColorWhite, ColorLightGray);
Log("%#%u/%u/%u %u:%u:%u.%u\n", ColorLightCyan, time.Month, time.Day,
time.Year, time.Hour, time.Minute, time.Second, time.Milisecond);
}
void DriversInstall()
{
// Install clock
DriversInstall_Clock();
// Install fdc
IrqInstallHandler(6, FloppyIrqHandler);
FloppyInitialize();
}

6
Kernel/drivers/drivers.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef __DRIVERS__H
#define __DRIVERS__H
extern void DriversInstall();
#endif

View File

@ -0,0 +1,384 @@
/*
* floppy.c
*
* Created on: Aug 20, 2011
* Author: Tiberiu
*/
#include <debugio.h>
#include <stdio.h>
#include <types.h>
#include <time.h>
#include <storage.h>
#include "floppy.h"
#include "../dma/dma.h"
#include "../cmos/cmos.h"
FloppyType fdTypes[] = {
/* Sectors
* | Sectors per track
* | | Heads
* | | | Tracks
* | | | | Gap1
* | | | | | Data rate
* | | | | | | Spec1
* | | | | | | | SRT HLT HUT Motor Spinup time
* | | | | | | | | | | | Motor Spindown time
* | | | | | | | | | | | | Interrupt timeout
* | | | | | | | | | | | | | Disk type name string*/
{ 0, 0,0, 0,0x00,0x00,0x00,0x00,0x00,0x00, 0, 0, 0, "none"},
{ 720, 9,2,40,0x2A,0x01,0xDF,0x0C,0x04,0x00,1000,1000,3000, "5.25\" 360k"},
{ 2400,15,2,80,0x1B,0x00,0xDF,0x0A,0x08,0x00, 400,1000,3000, "5.25\" 1.2M"},
{ 1440, 9,2,80,0x2A,0x02,0xDF,0x0F,0x04,0x00,1000,1000,3000, "3.5\" 720k"},
{ 2880,18,2,80,0x1B,0x00,0xCF,0x0C,0x08,0x00, 400,1000,3000, "3.5\" 1.44M"},
//{ 2880,18,2,80,0x1B,0x00,0xCF,0x0C,0x08,0x00,2000,3000,3000, "3.5\" 1.44M"},
{ 5760,36,2,80,0x1B,0x03,0xAF,0x0A,0x0F,0x00, 400,1000,3000, "3.5\" 2.88M AMI BIOS"},
{ 5760,36,2,80,0x1B,0x03,0xAF,0x0A,0x0F,0x00, 400,1000,3000, "3.5\" 2.88M"},
};
int8 fd0, fd1;
/**************************************
* IRQ handler etc *
**************************************/
volatile uint8 FloppyIrqFired;
void FloppyIrqHandler(_RegsStack32* UNUSED(r))
{
FloppyIrqFired = 1;
}
void FloppyWaitIrq()
{
TimerStart(fdTypes[4].InterruptTimeout);
while (!FloppyIrqFired && !TimerIsDone());
if (!FloppyIrqFired) {
Error("%#[Floppy] %#Irq timeout [%ums] !\n", ColorBrown, ColorLightRed, fdTypes[4].InterruptTimeout);
}
}
/**************************************
* Installation *
**************************************/
void FloppyInitialize()
{
// Detect drives
uint8 fd = CmosRead(0x10);
fd0 = fd >> 4;
fd1 = fd & 0xf;
if (fd0 > 6) fd0 = 0;
if (fd1 > 6) fd1 = 0;
if (!fd0 && !fd1) {
Error("%#[Floppy] %#No supported floppy drives found.", ColorBrown, ColorLightRed);
outportb(FloppyRegisterDigitalOutput, 0);
return;
}
Log("%#[Floppy] %#Detected floppy drives:", ColorBrown, ColorLightGray);
if (fd0) Log(" %#fd0=%#%s", ColorLightCyan, Color(ColorCyan, ColorWhite), fdTypes[fd0].Name);
if (fd1) Log(" %#fd1=%#%s", ColorLightCyan, Color(ColorCyan, ColorWhite), fdTypes[fd1].Name);
Log("\n");
// Reset floppy controller
FloppyReset();
// Configure and lock
FloppyConfigure();
FloppySendCommand(FloppyCommandLock | 0x80);
FloppyReadData();
// Enable perpendicular mode for 3.5" ED floppies
if (fd0 > 4)
{
FloppySendCommand(FloppyCommandPerpendicularMode);
FloppySendCommand(1);
}
if (fd1 > 4)
{
FloppySendCommand(FloppyCommandPerpendicularMode);
FloppySendCommand(2);
}
// Initialize DMA
FloppyInitDma();
}
void FloppyInitDma()
{
DmaMaskChannel(2);
DmaResetFlipFlop(2);
DmaSetAddress(2, 0, 0x10);
DmaResetFlipFlop(2);
DmaSetCount(2, 0xff, 0x23);
DmaSetExternalPageRegisters(2,0);
DmaUnmaskChannel(2);
}
/**************************************
* Controller reset *
**************************************/
void FloppyReset()
{
FloppyIrqFired = 0; int32 i = 0;
Log("%#[Floppy] %#Resetting...\n", ColorBrown, ColorLightGray);
// Clear reset bit from DOR
outportb(FloppyRegisterDigitalOutput, 0);
for (i = 0; i < 1000; i++);
outportb(FloppyRegisterDigitalOutput, 4|8);
// Wait for IRQ6
FloppyWaitIrq(fd0);
// Recalibrate every drive
if (fd0)
{
FloppyMotor(0,1);
FloppySelectDrive(0);
FloppyRecalibrate(0);
FloppyMotor(0,0);
}
if (fd1)
{
FloppyMotor(1,1);
FloppySelectDrive(1);
FloppyRecalibrate(1);
FloppyMotor(1,0);
}
}
/**************************************
* Configure floppy controller *
**************************************/
void FloppyConfigure()
{
FloppySendCommand(FloppyCommandConfigure);
FloppySendCommand(0);
FloppySendCommand(1<<6 | 7);
FloppySendCommand(0);
}
/**************************************
* Base commands *
**************************************/
void FloppySendCommand (uint8 command)
{
int32 t;
for (t = 0; t < 5000 && ((inportb(FloppyRegisterMainStatus) & FloppyMsrRQM) == 0); t++) ;
outportb (FloppyRegisterFIFO, command);
}
uint8 FloppyReadData ()
{
int32 t;
for (t = 0; t < 5000 && ((inportb(FloppyRegisterMainStatus) & FloppyMsrRQM) == 0); t++) ;
return inportb (FloppyRegisterFIFO);
}
/**************************************
* Sense interrupt *
**************************************/
void FloppySenseInterrupt(uint8 *st0, uint8 *cyl)
{
FloppySendCommand(FloppyCommandSenseInterrupt);
*st0 = FloppyReadData();
*cyl = FloppyReadData();
}
/**************************************
* Specify *
**************************************/
void FloppySpecify (uint8 fd)
{
FloppySendCommand(FloppyCommandSpecify);
FloppySendCommand((fdTypes[fd].SRT << 4) | fdTypes[fd].HUT);
FloppySendCommand(fdTypes[fd].HLT << 1);
}
/**************************************
* Motor on/off *
**************************************/
void FloppyMotor (uint8 fd_number, uint8 status)
{
if (fd_number >= 2) return;
uint8 fd = (fd_number == 0) ? fd0 : fd1;
uint8 temp = inportb(FloppyRegisterDigitalOutput);
// Turn motor on/off
if (status) temp |= 0x1<<(4+fd_number);
else temp &= ~(0x1<<(4+fd_number));
outportb(FloppyRegisterDigitalOutput, temp);
// Wait for spinup/spindown
if (status) TimerStart(fdTypes[fd].Spinup);
else TimerStart(fdTypes[fd].Spindown);
Log("%#[Floppy] %#Waiting for motor...\n", ColorBrown, ColorLightGray);
while (!TimerIsDone());
}
/**************************************
* Select drive *
**************************************/
void FloppySelectDrive(uint8 number)
{
if (number >= 2) return;
uint8 fd = (number == 0) ? fd0 : fd1;
// Set CCR
outportb(FloppyRegisterConfigurationControl, fdTypes[fd].DataRate);
// Specify
FloppySpecify(fd);
// Select drive
uint8 dor = inportb(FloppyRegisterDigitalOutput);
dor = (dor & ~0xFF) | number;
}
/**************************************
* RECALIBRATE *
* motor must be on, drive selected *
**************************************/
void FloppyRecalibrate(uint8 fd_number)
{
if (fd_number >= 2) return;
uint8 st0, cyl, timeout = 10;
do {
Log("%#[Floppy] %#Recalibrating: attempt %u/10\n", ColorBrown, ColorLightGray, 11-timeout);
FloppyIrqFired = 0;
FloppySendCommand(FloppyCommandRecalibrate);
FloppySendCommand(fd_number);
FloppyWaitIrq();
FloppySenseInterrupt(&st0, &cyl);
timeout--;
} while((st0 & 0x20) == 0 && timeout > 0);
}
/**************************************
* SEEK *
* motor must be on, drive selected *
**************************************/
void FloppySeek(uint8 fd_number, uint8 cylinder, uint8 head)
{
if (fd_number >= 2) return;
uint8 st0, cyl, timeout = 10;
do {
Log("%#[Floppy] %#Seeking: attempt %u/10\n", ColorBrown, ColorLightGray, 11-timeout);
FloppyIrqFired = 0;
FloppySendCommand(FloppyCommandSeek);
FloppySendCommand(head<<2 | fd_number);
FloppySendCommand(cylinder);
FloppyWaitIrq();
FloppySenseInterrupt(&st0, &cyl);
timeout--;
} while(cyl != cylinder && timeout > 0);
}
/**************************************
* READ/WRITE *
* motor must be on, drive selected *
**************************************/
void FloppyRW(uint8 isWrite, uint8 fd_number, uint8 head, uint8 cylinder, uint8 sector)
{
if (fd_number >= 2) return;
uint8 fd = (fd_number == 0) ? fd0 : fd1;
uint8 timeout = 10;
uint8 result[7], i, error;
do
{
error = 0;
Log("%#[Floppy] %#Read/write operation: attempt %u/10\n", ColorBrown, ColorLightGray, 11-timeout);
FloppyIrqFired = 0;
if (isWrite) FloppySendCommand(FloppyCommandWriteData | FloppyModeMultitrack | FloppyModeMagneticEncoding);
else FloppySendCommand(FloppyCommandReadData | FloppyModeMultitrack | FloppyModeMagneticEncoding);
FloppySendCommand(head<<2 | fd_number);
FloppySendCommand(cylinder);
FloppySendCommand(head);
FloppySendCommand(sector);
FloppySendCommand(2);
FloppySendCommand(fdTypes[fd].SectorsPerTrack);
FloppySendCommand(fdTypes[fd].Gap);
FloppySendCommand(0xff);
FloppyWaitIrq();
for (i = 0; i < 7; i++)
result[i] = FloppyReadData();
// Disk is write protected, don't try again
if (result[1] & 2)
{
Error("%#[Floppy] %#Error: disk is write protected!\n", ColorBrown, ColorLightRed);
return;
}
// Any other error - try again
if (result[0] & 0xC8) error = 1;
if (result[1] & 0xB5) error = 1;
if (result[2] & 0x77) error = 1;
if (result[6] & 0x02) error = 1;
timeout--;
} while (timeout > 0 && !error);
}
uint32 FloppyRead(uint8 drive, uint32 lba)
{
if (drive >= 2) return 0;
uint8 fd = (drive == 0) ? fd0 : fd1;
// Convert LBA to CHS
uint32 cyl=0, head=0, sect=1;
ConvertLbaToChs(fdTypes[fd].SectorsPerTrack, lba, &cyl, &head, &sect);
Log("%#[Floppy] %#Converted LBA=%u to Cyl=%u Head=%u Sect=%u\n", ColorBrown, ColorLightGray, lba, cyl, head, sect);
FloppyInitDma();
// Reset drive if necessary
if ((inportb(FloppyRegisterMainStatus) & 0xC0) != 0x80)
FloppyReset();
// Start motor, select drive
FloppyMotor(drive, 1);
FloppySelectDrive(drive);
// Seek to correct location
FloppySeek(drive, cyl, head);
// Start DMA read
DmaMaskChannel(2);
DmaSetMode(2, 0x46);
DmaUnmaskChannel(2);
FloppyRW(0, drive, head, cyl, sect);
FloppyMotor(drive, 0);
return 0x1000;
}
// Log("%#[Drivers] %#Initializing blah blah %d...", ColorWhite, ColorLightGray,PIT_FREQUENCY);

View File

@ -0,0 +1,86 @@
/*
* floppy.h
*
* Created on: Aug 20, 2011
* Author: Tiberiu
*/
#ifndef FLOPPY_H_
#define FLOPPY_H_
#include <types.h>
enum FloppyRegisters
{
FloppyRegisterStatusA = 0x3F0, // read-only
FloppyRegisterStatusB = 0x3F1, // read-only
FloppyRegisterDigitalOutput = 0x3F2,
FloppyRegisterTapeDrive = 0x3F3,
FloppyRegisterMainStatus = 0x3F4, // read-only
FloppyRegisterDatarateSelect = 0x3F4, // write-only
FloppyRegisterFIFO = 0x3F5,
FloppyRegisterDigitalInput = 0x3F7, // read-only
FloppyRegisterConfigurationControl = 0x3F7 // write-only
};
enum FloppyCommands
{
FloppyCommandReadTrack = 2, // generates IRQ6
FloppyCommandSpecify = 3, // * set drive parameters
FloppyCommandSenseDriveStatus = 4,
FloppyCommandWriteData = 5, // * write to the disk
FloppyCommandReadData = 6, // * read from the disk
FloppyCommandRecalibrate = 7, // * seek to cylinder 0
FloppyCommandSenseInterrupt = 8, // * ack IRQ6, get status of last command
FloppyCommandWriteDeletedData = 9,
FloppyCommandReadID = 10, // generates IRQ6
FloppyCommandReadDeletedData = 12,
FloppyCommandFormatTrack = 13, // *
FloppyCommandSeek = 15, // * seek both heads to cylinder X
FloppyCommandVersion = 16, // * used during initialization, once
FloppyCommandScanEqual = 17,
FloppyCommandPerpendicularMode = 18, // * used during initialization, once, maybe
FloppyCommandConfigure = 19, // * set controller parameters
FloppyCommandLock = 20, // * protect controller params from a reset
FloppyCommandVerify = 22,
FloppyCommandScanLowOrEqual = 25,
FloppyCommandScanHighOrEqual = 29,
FloppyModeMultitrack = 0x80,
FloppyModeMagneticEncoding = 0x40, // always set for read/write/verify/format
FloppyModeSkip = 0x20
};
enum FloppyMSRMasks
{
FloppyMsrRQM = 0x80,
FloppyMsrDIO = 0x40,
FloppyMsrNDMA = 0x20,
FloppyMsrBusy = 0x10
};
typedef struct {
uint32 Size, SectorsPerTrack, Heads, Tracks;
uint8 Gap, DataRate, Spec1, SRT, HLT, HUT;
uint32 Spinup, Spindown, InterruptTimeout;
string Name;
} FloppyType;
extern void FloppyInitialize();
extern void FloppyIrqHandler(_RegsStack32 *r);
extern void FloppyWaitIrq();
extern void FloppyInitDma();
extern void FloppyReset();
extern void FloppyConfigure();
extern void FloppySendCommand (uint8 command);
extern uint8 FloppyReadData ();
extern void FloppySenseInterrupt(uint8 *st0, uint8 *cyl);
extern void FloppySpecify (uint8 fd);
extern void FloppyMotor (uint8 fd_number, uint8 status);
extern void FloppySelectDrive(uint8 number);
extern void FloppyRecalibrate(uint8 fd_number);
extern void FloppyRW(uint8 isWrite, uint8 fd_number, uint8 head, uint8 cylinder, uint8 sector);
extern uint32 FloppyRead(uint8 drive, uint32 lba);
#endif /* FLOPPY_H_ */

13
Kernel/drivers/pit/pit.c Normal file
View File

@ -0,0 +1,13 @@
#include <stdio.h>
#include <time.h>
#include "pit.h"
void PitSetFrequency(uint32 frequency)
{
uint32 divisor = 1193180 / frequency; // Calculate the divisor
outportb(0x43, 0x36); // Set our command byte 0x36
outportb(0x40, divisor & 0xff); // Set low byte
outportb(0x40, divisor>>8); // Set high byte
TimeSetInternalFrequency(frequency);
}

7
Kernel/drivers/pit/pit.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef __PIT__H
#define __PIT__H
extern void PitSetFrequency(uint32 frequency);
#endif

19
Kernel/hal/clock/clock.c Normal file
View File

@ -0,0 +1,19 @@
#include <time.h>
#include "clock.h"
#define MILISECONDS_IN_DAY 86400000
volatile TimeSystem _internal_time;
uint32 _internal_frequency_hz;
void TimeHandler(_RegsStack32* UNUSED(r))
{
if (_internal_frequency_hz == 0) return;
_internal_time.Time += 1000/_internal_frequency_hz;
if (_internal_time.Time >= MILISECONDS_IN_DAY)
{
_internal_time.Date++;
_internal_time.Time-=MILISECONDS_IN_DAY;
}
}

9
Kernel/hal/clock/clock.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef __CLOCK__H
#define __CLOCK__H
#include <time.h>
extern void TimeHandler(_RegsStack32 *r);
#endif

View File

@ -1,14 +1,17 @@
; GLOBAL DESCRIPTOR TABLE
;
;
bits 32 bits 32
; !!! GDT !!! ; !!! GDT !!!
; This will set up our new segment registers. We need to do ; This will set up our new segment registers. We need to do
; something special in order to set CS. We do what is called a ; something special in order to set CS. We do what is called a
; far jump. A jump that includes a segment as well as an offset. ; far jump. A jump that includes a segment as well as an offset.
; This is declared in C as 'extern void gdt_flush();'
global _i86_GdtFlush ; Allows the C code to link to this global GdtFlush ; Allows the C code to link to this
extern _gp ; Says that '_gp' is in another file extern gp ; Says that 'gp' is in another file
_i86_GdtFlush: GdtFlush:
lgdt [_gp] ; Load the GDT with our '_gp' which is a special pointer lgdt [gp] ; Load the GDT with our 'gp' which is a special pointer
mov ax, 0x10 ; 0x10 is the offset in the GDT to our data segment mov ax, 0x10 ; 0x10 is the offset in the GDT to our data segment
mov ds, ax mov ds, ax
mov es, ax mov es, ax

View File

@ -5,15 +5,13 @@
#define MAX_DESCRIPTORS 5 #define MAX_DESCRIPTORS 5
#include "gdt.h" #include "gdt.h"
extern void i86_GdtInstall();
/* Our GDT, with 3 entries, and finally our special GDT pointer */ /* Our GDT, with 3 entries, and finally our special GDT pointer */
struct GdtEntry gdt[MAX_DESCRIPTORS]; struct GdtEntry gdt[MAX_DESCRIPTORS];
struct GdtPointer gp; struct GdtPointer gp;
/* Setup a descriptor in the Global Descriptor Table */ /* Setup a descriptor in the Global Descriptor Table */
void i86_GdtSetGate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran) void GdtSetGate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran)
{ {
/* Sanity check */ /* Sanity check */
if (num >= MAX_DESCRIPTORS) return; if (num >= MAX_DESCRIPTORS) return;
@ -32,45 +30,45 @@ void i86_GdtSetGate(int num, unsigned long base, unsigned long limit, unsigned c
gdt[num].access = access; gdt[num].access = access;
} }
/*struct gdt_entry* i86_GdtGetGate(int num) struct GdtEntry* GdtGetGate(int num)
{ {
if (num>MAX_DESCRIPTORS) return 0; if (num>MAX_DESCRIPTORS) return 0;
return &gdt[num]; return &gdt[num];
}*/ }
/* Should be called by main. This will setup the special GDT /* Should be called by main. This will setup the special GDT
* pointer, set up the first 3 entries in our GDT, and then * pointer, set up the first 3 entries in our GDT, and then
* finally call gdt_flush() in our assembler file in order * finally call gdt_flush() in our assembler file in order
* to tell the processor where the new GDT is and update the * to tell the processor where the new GDT is and update the
* new segment registers */ * new segment registers */
void i86_GdtInstall() void GdtInstall()
{ {
/* Setup the GDT pointer and limit */ /* Setup the GDT pointer and limit */
gp.limit = (sizeof(struct GdtEntry) * 3) - 1; gp.limit = (sizeof(struct GdtEntry) * 3) - 1;
gp.base = (unsigned int)&gdt; gp.base = (unsigned int)&gdt;
/* Our NULL descriptor */ /* Our NULL descriptor */
i86_GdtSetGate(0, 0, 0, 0, 0); GdtSetGate(0, 0, 0, 0, 0);
/* The second entry is our Code Segment. The base address /* The second entry is our Code Segment. The base address
* is 0, the limit is 4GBytes, it uses 4KByte granularity, * is 0, the limit is 4GBytes, it uses 4KByte granularity,
* uses 32-bit opcodes, and is a Code Segment descriptor. * uses 32-bit opcodes, and is a Code Segment descriptor.
* Please check the table above in the tutorial in order * Please check the table above in the tutorial in order
* to see exactly what each value means */ * to see exactly what each value means */
i86_GdtSetGate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); GdtSetGate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF);
/* The third entry is our Data Segment. It's EXACTLY the /* The third entry is our Data Segment. It's EXACTLY the
* same as our code segment, but the descriptor type in * same as our code segment, but the descriptor type in
* this entry's access byte says it's a Data Segment */ * this entry's access byte says it's a Data Segment */
i86_GdtSetGate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); GdtSetGate(2, 0, 0xFFFFFFFF, 0x92, 0xCF);
/* User mode Code segment*/ /* User mode Code segment*/
i86_GdtSetGate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF); GdtSetGate(3, 0, 0xFFFFFFFF, 0xFA, 0xCF);
/* User mode data segment*/ /* User mode data segment*/
i86_GdtSetGate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF); GdtSetGate(4, 0, 0xFFFFFFFF, 0xF2, 0xCF);
/* Flush out the old GDT and install the new changes! */ /* Flush out the old GDT and install the new changes! */
i86_GdtFlush(); GdtFlush();
} }

View File

@ -30,9 +30,9 @@ struct GdtPointer
/* This will be a function in start.asm. We use this to properly /* This will be a function in start.asm. We use this to properly
* reload the new segment registers */ * reload the new segment registers */
extern void i86_GdtInstall(); extern void GdtInstall();
extern void i86_GdtFlush(); extern void GdtFlush();
extern void i86_GdtSetGate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran); extern void GdtSetGate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran);
//extern struct GdtEntry* i86_GdtGetGate(int num); extern struct GdtEntry* GdtGetGate(int num);
#endif #endif

View File

@ -2,8 +2,8 @@ bits 32
; !!! IDT !!! ; !!! IDT !!!
; Loads the IDT defined in '_idtp' ; Loads the IDT defined in '_idtp'
global _i86_IdtLoad global IdtLoad
extern _idtp extern idtp
_i86_IdtLoad: IdtLoad:
lidt [_idtp] lidt [idtp]
ret ret

View File

@ -2,17 +2,17 @@
* idt.h - INTERRUPT DESCRIPTOR TABLE * * idt.h - INTERRUPT DESCRIPTOR TABLE *
* Contains structures and function declarations for IDT * * Contains structures and function declarations for IDT *
******************************************************************/ ******************************************************************/
#include <system.h> #include <stdlib.h>
#include "idt.h" #include "idt.h"
extern void i86_IdtLoad(); extern void IdtLoad();
/* Declare an IDT of 256 entries. */ /* Declare an IDT of 256 entries. */
struct IdtEntry idt[256]; struct IdtEntry idt[256];
struct IdtPointer idtp; struct IdtPointer idtp;
/* Use this function to set an entry in the IDT. Alot simpler /* Use this function to set an entry in the IDT. Alot simpler
* than twiddling with the GDT ;) */ * than twiddling with the GDT ;) */
void i86_IdtSetGate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags) void IdtSetGate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags)
{ {
/* The interrupt routine's base address */ /* The interrupt routine's base address */
idt[num].base_lo = (base & 0xFFFF); idt[num].base_lo = (base & 0xFFFF);
@ -25,13 +25,13 @@ void i86_IdtSetGate(unsigned char num, unsigned long base, unsigned short sel, u
idt[num].flags = flags; idt[num].flags = flags;
} }
struct IdtEntry* i86_IdtGetGate(unsigned char num) struct IdtEntry* IdtGetGate(unsigned char num)
{ {
return &idt[num]; return &idt[num];
} }
/* Installs the IDT */ /* Installs the IDT */
void i86_IdtInstall() void IdtInstall()
{ {
/* Sets the special IDT pointer up, just like in 'gdt.c' */ /* Sets the special IDT pointer up, just like in 'gdt.c' */
idtp.limit = (sizeof (struct IdtEntry) * 256) - 1; idtp.limit = (sizeof (struct IdtEntry) * 256) - 1;
@ -41,5 +41,5 @@ void i86_IdtInstall()
memset (&idt, 0, sizeof(struct IdtEntry) * 256); memset (&idt, 0, sizeof(struct IdtEntry) * 256);
/* Points the processor's internal register to the new IDT */ /* Points the processor's internal register to the new IDT */
i86_IdtLoad(); IdtLoad();
} }

View File

@ -24,8 +24,8 @@ struct IdtPointer
/* This exists in 'start.asm', and is used to load our IDT */ /* This exists in 'start.asm', and is used to load our IDT */
extern void i86_IdtSetGate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags); extern void IdtSetGate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags);
extern struct IdtEntry* i86_IdtGetGate(unsigned char num); extern struct IdtEntry* IdtGetGate(unsigned char num);
extern void i86_IdtInstall(); extern void IdtInstall();
#endif #endif

View File

@ -1,25 +1,25 @@
bits 32 bits 32
; !!! IRQ !!! ; !!! IRQ !!!
global _i86_irq0 global Irq_0
global _i86_irq1 global Irq_1
global _i86_irq2 global Irq_2
global _i86_irq3 global Irq_3
global _i86_irq4 global Irq_4
global _i86_irq5 global Irq_5
global _i86_irq6 global Irq_6
global _i86_irq7 global Irq_7
global _i86_irq8 global Irq_8
global _i86_irq9 global Irq_9
global _i86_irq10 global Irq_10
global _i86_irq11 global Irq_11
global _i86_irq12 global Irq_12
global _i86_irq13 global Irq_13
global _i86_irq14 global Irq_14
global _i86_irq15 global Irq_15
; 32: IRQ0 ; 32: IRQ0
_i86_irq0: Irq_0:
cli cli
push byte 0 push byte 0
push byte 32; Note that these don't push an error code on the stack: push byte 32; Note that these don't push an error code on the stack:
@ -27,113 +27,113 @@ _i86_irq0:
jmp irq_common_stub jmp irq_common_stub
; 33: IRQ1 ; 33: IRQ1
_i86_irq1: Irq_1:
cli cli
push byte 0 push byte 0
push byte 33 push byte 33
jmp irq_common_stub jmp irq_common_stub
; 34: IRQ2 ; 34: IRQ2
_i86_irq2: Irq_2:
cli cli
push byte 0 push byte 0
push byte 34 push byte 34
jmp irq_common_stub jmp irq_common_stub
; 35: IRQ3 ; 35: IRQ3
_i86_irq3: Irq_3:
cli cli
push byte 0 push byte 0
push byte 35 push byte 35
jmp irq_common_stub jmp irq_common_stub
; 36: IRQ4 ; 36: IRQ4
_i86_irq4: Irq_4:
cli cli
push byte 0 push byte 0
push byte 36 push byte 36
jmp irq_common_stub jmp irq_common_stub
; 37: IRQ5 ; 37: IRQ5
_i86_irq5: Irq_5:
cli cli
push byte 0 push byte 0
push byte 37 push byte 37
jmp irq_common_stub jmp irq_common_stub
; 38: IRQ6 ; 38: IRQ6
_i86_irq6: Irq_6:
cli cli
push byte 0 push byte 0
push byte 38 push byte 38
jmp irq_common_stub jmp irq_common_stub
; 39: IRQ7 ; 39: IRQ7
_i86_irq7: Irq_7:
cli cli
push byte 0 push byte 0
push byte 39 push byte 39
jmp irq_common_stub jmp irq_common_stub
; 40: IRQ8 ; 40: IRQ8
_i86_irq8: Irq_8:
cli cli
push byte 0 push byte 0
push byte 40 push byte 40
jmp irq_common_stub jmp irq_common_stub
; 41: IRQ9 ; 41: IRQ9
_i86_irq9: Irq_9:
cli cli
push byte 0 push byte 0
push byte 41 push byte 41
jmp irq_common_stub jmp irq_common_stub
; 42: IRQ10 ; 42: IRQ10
_i86_irq10: Irq_10:
cli cli
push byte 0 push byte 0
push byte 42 push byte 42
jmp irq_common_stub jmp irq_common_stub
; 43: IRQ11 ; 43: IRQ11
_i86_irq11: Irq_11:
cli cli
push byte 0 push byte 0
push byte 43 push byte 43
jmp irq_common_stub jmp irq_common_stub
; 44: IRQ12 ; 44: IRQ12
_i86_irq12: Irq_12:
cli cli
push byte 0 push byte 0
push byte 44 push byte 44
jmp irq_common_stub jmp irq_common_stub
; 45: IRQ13 ; 45: IRQ13
_i86_irq13: Irq_13:
cli cli
push byte 0 push byte 0
push byte 45 push byte 45
jmp irq_common_stub jmp irq_common_stub
; 46: IRQ14 ; 46: IRQ14
_i86_irq14: Irq_14:
cli cli
push byte 0 push byte 0
push byte 46 push byte 46
jmp irq_common_stub jmp irq_common_stub
; 47: IRQ15 ; 47: IRQ15
_i86_irq15: Irq_15:
cli cli
push byte 0 push byte 0
push byte 47 push byte 47
jmp irq_common_stub jmp irq_common_stub
extern _i86_IrqHandler extern IrqHandler
; This is a stub that we have created for IRQ based ISRs. This calls ; This is a stub that we have created for IRQ based ISRs. This calls
; '_i86_irq_handler' in our C code. We need to create this in an 'irq.c' ; 'Irq__handler' in our C code. We need to create this in an 'irq.c'
irq_common_stub: irq_common_stub:
pusha pusha
push ds push ds
@ -147,7 +147,7 @@ irq_common_stub:
mov gs, ax mov gs, ax
mov eax, esp mov eax, esp
push eax push eax
mov eax, _i86_IrqHandler mov eax, IrqHandler
call eax call eax
pop eax pop eax
pop gs pop gs

91
Kernel/hal/cpu/irq.c Normal file
View File

@ -0,0 +1,91 @@
#include <stdio.h>
#include "pic.h"
#include "irq.h"
#include "idt.h"
/* These are own ISRs that point to our special IRQ handler
* instead of the regular 'fault_handler' function */
extern void Irq_0();
extern void Irq_1();
extern void Irq_2();
extern void Irq_3();
extern void Irq_4();
extern void Irq_5();
extern void Irq_6();
extern void Irq_7();
extern void Irq_8();
extern void Irq_9();
extern void Irq_10();
extern void Irq_11();
extern void Irq_12();
extern void Irq_13();
extern void Irq_14();
extern void Irq_15();
/* This array is actually an array of function pointers. We use
* this to handle custom IRQ handlers for a given IRQ */
void *IrqRoutines[16] =
{
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
/* This installs a custom IRQ handler for the given IRQ */
void IrqInstallHandler (int irq, void (*handler)(_RegsStack32 *r))
{
IrqRoutines[irq] = handler;
}
void IrqUninstallHandler (int irq)
{
IrqRoutines[irq] = 0;
}
/* We first remap the interrupt controllers, and then we install
* the appropriate ISRs to the correct entries in the IDT. This
* is just like installing the exception handlers */
void IrqInstall()
{
PicRemap(32,40);
IdtSetGate(32, (unsigned)Irq_0, 0x08, 0x8E);
IdtSetGate(33, (unsigned)Irq_1, 0x08, 0x8E);
IdtSetGate(34, (unsigned)Irq_2, 0x08, 0x8E);
IdtSetGate(35, (unsigned)Irq_3, 0x08, 0x8E);
IdtSetGate(36, (unsigned)Irq_4, 0x08, 0x8E);
IdtSetGate(37, (unsigned)Irq_5, 0x08, 0x8E);
IdtSetGate(38, (unsigned)Irq_6, 0x08, 0x8E);
IdtSetGate(39, (unsigned)Irq_7, 0x08, 0x8E);
IdtSetGate(40, (unsigned)Irq_8, 0x08, 0x8E);
IdtSetGate(41, (unsigned)Irq_9, 0x08, 0x8E);
IdtSetGate(42, (unsigned)Irq_10, 0x08, 0x8E);
IdtSetGate(43, (unsigned)Irq_11, 0x08, 0x8E);
IdtSetGate(44, (unsigned)Irq_12, 0x08, 0x8E);
IdtSetGate(45, (unsigned)Irq_13, 0x08, 0x8E);
IdtSetGate(46, (unsigned)Irq_14, 0x08, 0x8E);
IdtSetGate(47, (unsigned)Irq_15, 0x08, 0x8E);
}
// Default IRQ handler, launches other handler if installed.
// Also sends end-of-interrupt messages to PIC
void IrqHandler (_RegsStack32 *r)
{
/* This is a blank function pointer */
void (*handler)(_RegsStack32 *r);
/* Find out if we have a custom handler to run for this
* IRQ, and then finally, run it */
handler = IrqRoutines[r->int_no - 32];
if (handler) handler(r);
/* If the IDT entry that was invoked was greater than 40
* (meaning IRQ8 - 15), then we need to send an EOI to
* the slave controller */
if (r->int_no >=40) outportb(0xA0, 0x20);
/* In either case, we need to send an EOI to the master
* interrupt controller too */
outportb(0x20, 0x20);
}

10
Kernel/hal/cpu/irq.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef __IRQ_H
#define __IRQ_H
#include <stdio.h>
extern void IrqInstallHandler (int irq, void (*handler)(_RegsStack32 *r));
extern void IrqUninstallHandler (int irq);
extern void IrqInstall();
#endif

View File

@ -1,196 +1,196 @@
bits 32 bits 32
; !!! ISRs !!! ; !!! ISRs !!!
global _i86_isr0 global isr_exception_0
global _i86_isr1 global isr_exception_1
global _i86_isr2 global isr_exception_2
global _i86_isr3 global isr_exception_3
global _i86_isr4 global isr_exception_4
global _i86_isr5 global isr_exception_5
global _i86_isr6 global isr_exception_6
global _i86_isr7 global isr_exception_7
global _i86_isr8 global isr_exception_8
global _i86_isr9 global isr_exception_9
global _i86_isr10 global isr_exception_10
global _i86_isr11 global isr_exception_11
global _i86_isr12 global isr_exception_12
global _i86_isr13 global isr_exception_13
global _i86_isr14 global isr_exception_14
global _i86_isr15 global isr_exception_15
global _i86_isr16 global isr_exception_16
global _i86_isr17 global isr_exception_17
global _i86_isr18 global isr_exception_18
global _i86_isr19 global isr_exception_19
global _i86_isr20 global isr_exception_20
global _i86_isr21 global isr_exception_21
global _i86_isr22 global isr_exception_22
global _i86_isr23 global isr_exception_23
global _i86_isr24 global isr_exception_24
global _i86_isr25 global isr_exception_25
global _i86_isr26 global isr_exception_26
global _i86_isr27 global isr_exception_27
global _i86_isr28 global isr_exception_28
global _i86_isr29 global isr_exception_29
global _i86_isr30 global isr_exception_30
global _i86_isr31 global isr_exception_31
_i86_isr0: isr_exception_0:
cli cli
push byte 0; A normal ISR stub that pops a dummy error code to keep a push byte 0; A normal ISR stub that pops a dummy error code to keep a
; uniform stack frame ; uniform stack frame
push byte 0 push byte 0
jmp isr_common_stub jmp isr_common_stub
_i86_isr1: isr_exception_1:
cli cli
push byte 0 push byte 0
push byte 1 push byte 1
jmp isr_common_stub jmp isr_common_stub
_i86_isr2: isr_exception_2:
cli cli
push byte 0 push byte 0
push byte 2 push byte 2
jmp isr_common_stub jmp isr_common_stub
_i86_isr3: isr_exception_3:
cli cli
push byte 0 push byte 0
push byte 3 push byte 3
jmp isr_common_stub jmp isr_common_stub
_i86_isr4: isr_exception_4:
cli cli
push byte 0 push byte 0
push byte 4 push byte 4
jmp isr_common_stub jmp isr_common_stub
_i86_isr5: isr_exception_5:
cli cli
push byte 0 push byte 0
push byte 5 push byte 5
jmp isr_common_stub jmp isr_common_stub
_i86_isr6: isr_exception_6:
cli cli
push byte 0 push byte 0
push byte 6 push byte 6
jmp isr_common_stub jmp isr_common_stub
_i86_isr7: isr_exception_7:
cli cli
push byte 0 push byte 0
push byte 7 push byte 7
jmp isr_common_stub jmp isr_common_stub
_i86_isr8: isr_exception_8:
cli cli
push byte 8 push byte 8
jmp isr_common_stub jmp isr_common_stub
_i86_isr9: isr_exception_9:
cli cli
push byte 0 push byte 0
push byte 9 push byte 9
jmp isr_common_stub jmp isr_common_stub
_i86_isr10: isr_exception_10:
cli cli
push byte 10 push byte 10
jmp isr_common_stub jmp isr_common_stub
_i86_isr11: isr_exception_11:
cli cli
push byte 11 push byte 11
jmp isr_common_stub jmp isr_common_stub
_i86_isr12: isr_exception_12:
cli cli
push byte 12 push byte 12
jmp isr_common_stub jmp isr_common_stub
_i86_isr13: isr_exception_13:
cli cli
push byte 13 push byte 13
jmp isr_common_stub jmp isr_common_stub
_i86_isr14: isr_exception_14:
cli cli
push byte 14 push byte 14
jmp isr_common_stub jmp isr_common_stub
_i86_isr15: isr_exception_15:
cli cli
push byte 0 push byte 0
push byte 15 push byte 15
jmp isr_common_stub jmp isr_common_stub
_i86_isr16: isr_exception_16:
cli cli
push byte 0 push byte 0
push byte 16 push byte 16
jmp isr_common_stub jmp isr_common_stub
_i86_isr17: isr_exception_17:
cli cli
push byte 0 push byte 0
push byte 17 push byte 17
jmp isr_common_stub jmp isr_common_stub
_i86_isr18: isr_exception_18:
cli cli
push byte 0 push byte 0
push byte 18 push byte 18
jmp isr_common_stub jmp isr_common_stub
_i86_isr19: isr_exception_19:
cli cli
push byte 0 push byte 0
push byte 19 push byte 19
jmp isr_common_stub jmp isr_common_stub
_i86_isr20: isr_exception_20:
cli cli
push byte 0 push byte 0
push byte 20 push byte 20
jmp isr_common_stub jmp isr_common_stub
_i86_isr21: isr_exception_21:
cli cli
push byte 0 push byte 0
push byte 21 push byte 21
jmp isr_common_stub jmp isr_common_stub
_i86_isr22: isr_exception_22:
cli cli
push byte 0 push byte 0
push byte 22 push byte 22
jmp isr_common_stub jmp isr_common_stub
_i86_isr23: isr_exception_23:
cli cli
push byte 0 push byte 0
push byte 23 push byte 23
jmp isr_common_stub jmp isr_common_stub
_i86_isr24: isr_exception_24:
cli cli
push byte 0 push byte 0
push byte 24 push byte 24
jmp isr_common_stub jmp isr_common_stub
_i86_isr25: isr_exception_25:
cli cli
push byte 0 push byte 0
push byte 25 push byte 25
jmp isr_common_stub jmp isr_common_stub
_i86_isr26: isr_exception_26:
cli cli
push byte 0 push byte 0
push byte 26 push byte 26
jmp isr_common_stub jmp isr_common_stub
_i86_isr27: isr_exception_27:
cli cli
push byte 0 push byte 0
push byte 27 push byte 27
jmp isr_common_stub jmp isr_common_stub
_i86_isr28: isr_exception_28:
cli cli
push byte 0 push byte 0
push byte 28 push byte 28
jmp isr_common_stub jmp isr_common_stub
_i86_isr29: isr_exception_29:
cli cli
push byte 0 push byte 0
push byte 29 push byte 29
jmp isr_common_stub jmp isr_common_stub
_i86_isr30: isr_exception_30:
cli cli
push byte 0 push byte 0
push byte 30 push byte 30
jmp isr_common_stub jmp isr_common_stub
_i86_isr31: isr_exception_31:
cli cli
push byte 0 push byte 0
push byte 31 push byte 31
jmp isr_common_stub jmp isr_common_stub
extern _i86_FaultHandler extern IsrsFaultHandler
isr_common_stub: isr_common_stub:
pusha pusha
@ -205,7 +205,7 @@ isr_common_stub:
mov gs, ax mov gs, ax
mov eax, esp ; Push us the stack mov eax, esp ; Push us the stack
push eax push eax
mov eax, _i86_FaultHandler mov eax, IsrsFaultHandler
call eax ; A special call, preserves the 'eip' register call eax ; A special call, preserves the 'eip' register
pop eax pop eax
pop gs pop gs

114
Kernel/hal/cpu/isrs.c Normal file
View File

@ -0,0 +1,114 @@
#include <debugio.h>
#include "isrs.h"
#include "idt.h"
// Assembly coded
extern void isr_exception_0();
extern void isr_exception_1();
extern void isr_exception_2();
extern void isr_exception_3();
extern void isr_exception_4();
extern void isr_exception_5();
extern void isr_exception_6();
extern void isr_exception_7();
extern void isr_exception_8();
extern void isr_exception_9();
extern void isr_exception_10();
extern void isr_exception_11();
extern void isr_exception_12();
extern void isr_exception_13();
extern void isr_exception_14();
extern void isr_exception_15();
extern void isr_exception_16();
extern void isr_exception_17();
extern void isr_exception_18();
extern void isr_exception_19();
extern void isr_exception_20();
extern void isr_exception_21();
extern void isr_exception_22();
extern void isr_exception_23();
extern void isr_exception_24();
extern void isr_exception_25();
extern void isr_exception_26();
extern void isr_exception_27();
extern void isr_exception_28();
extern void isr_exception_29();
extern void isr_exception_30();
extern void isr_exception_31();
void* IdtFaultHandlers[32] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
void IsrsInstall()
{
IdtSetGate(0, (unsigned)isr_exception_0, 0x08, 0x8E);
IdtSetGate(1, (unsigned)isr_exception_1, 0x08, 0x8E);
IdtSetGate(2, (unsigned)isr_exception_2, 0x08, 0x8E);
IdtSetGate(3, (unsigned)isr_exception_3, 0x08, 0x8E);
IdtSetGate(4, (unsigned)isr_exception_4, 0x08, 0x8E);
IdtSetGate(5, (unsigned)isr_exception_5, 0x08, 0x8E);
IdtSetGate(6, (unsigned)isr_exception_6, 0x08, 0x8E);
IdtSetGate(7, (unsigned)isr_exception_7, 0x08, 0x8E);
IdtSetGate(8, (unsigned)isr_exception_8, 0x08, 0x8E);
IdtSetGate(9, (unsigned)isr_exception_9, 0x08, 0x8E);
IdtSetGate(10, (unsigned)isr_exception_10, 0x08, 0x8E);
IdtSetGate(11, (unsigned)isr_exception_11, 0x08, 0x8E);
IdtSetGate(12, (unsigned)isr_exception_12, 0x08, 0x8E);
IdtSetGate(13, (unsigned)isr_exception_13, 0x08, 0x8E);
IdtSetGate(14, (unsigned)isr_exception_14, 0x08, 0x8E);
IdtSetGate(15, (unsigned)isr_exception_15, 0x08, 0x8E);
IdtSetGate(16, (unsigned)isr_exception_16, 0x08, 0x8E);
IdtSetGate(17, (unsigned)isr_exception_17, 0x08, 0x8E);
IdtSetGate(18, (unsigned)isr_exception_18, 0x08, 0x8E);
IdtSetGate(19, (unsigned)isr_exception_19, 0x08, 0x8E);
IdtSetGate(20, (unsigned)isr_exception_20, 0x08, 0x8E);
IdtSetGate(21, (unsigned)isr_exception_21, 0x08, 0x8E);
IdtSetGate(22, (unsigned)isr_exception_22, 0x08, 0x8E);
IdtSetGate(23, (unsigned)isr_exception_23, 0x08, 0x8E);
IdtSetGate(24, (unsigned)isr_exception_24, 0x08, 0x8E);
IdtSetGate(25, (unsigned)isr_exception_25, 0x08, 0x8E);
IdtSetGate(26, (unsigned)isr_exception_26, 0x08, 0x8E);
IdtSetGate(27, (unsigned)isr_exception_27, 0x08, 0x8E);
IdtSetGate(28, (unsigned)isr_exception_28, 0x08, 0x8E);
IdtSetGate(29, (unsigned)isr_exception_29, 0x08, 0x8E);
IdtSetGate(30, (unsigned)isr_exception_30, 0x08, 0x8E);
IdtSetGate(31, (unsigned)isr_exception_31, 0x08, 0x8E);
}
void IsrsInstallHandler(int interr, void (*function)(_RegsStack32 *r))
{
if (interr < 32) IdtFaultHandlers[interr] = function;
}
void IsrsUninstallHandler(int interr)
{
if (interr < 32) IdtFaultHandlers[interr] = 0;
}
extern void CrashMessage(_RegsStack32 *r);
// Default fault handler; calls other handlers, or displays error message.
void IsrsFaultHandler(_RegsStack32 *r)
{
/* Is this a fault whose number is from 0 to 31? */
if (r->int_no < 32)
{
void (*func)(_RegsStack32 *r);
func = IdtFaultHandlers[r->int_no];
// Halt system if unhandled
if (!func) {
CrashMessage(r);
asm ("cli");
asm ("hlt");
}
else (*func)(r);
}
}

10
Kernel/hal/cpu/isrs.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef __ISRS_H_
#define __ISRS_H_
#include <types.h>
extern void IsrsInstall();
extern void IsrsInstallHandler(int interr, void (*function)(_RegsStack32 *r));
extern void IsrsUninstallHandler(int interr);
#endif

View File

@ -1,7 +1,7 @@
#include <system.h> #include <stdio.h>
#include "pic.h" #include "pic.h"
void i86_PicRemap(int pic1, int pic2) void PicRemap(int pic1, int pic2)
{ {
// Send ICW1 // Send ICW1
outportb(0x20, 0x11); outportb(0x20, 0x11);

6
Kernel/hal/cpu/pic.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef _PIC_H
#define _PIC_H
extern void PicRemap(int pic1, int pic2);
#endif

96
Kernel/hal/crash.c Normal file
View File

@ -0,0 +1,96 @@
/*
* crash.c
*
* Created on: Aug 19, 2011
* Author: Tiberiu
*/
#include <debugio.h>
string errorCodes[] =
{
"Division by zero", //0
"Debugger", //1
"Non maskable interrupt", //2
"Breakpoint", //3
"Overflow", //4
"Bounds", //5
"Invalid opcode", //6
"Coprocessor not available", //7
"Double fault", //8
"Coprocessor segment overrun",//9
"Invalid task state segment", //A
"Segment not present", //B
"Stack fault", //C
"General protection fault", //D
"Page fault", //E
"", //F
"Math fault", //10
"Alignment check", //11
"Machine check", //12
"SIMD floating-point exception" //13
};
void CrashMessage(_RegsStack32 *r)
{
ConsoleSetDefaultColor(ColorLightRed);
ConsoleWrite("\n"); uint32 i;
for (i = 0; i < 80; i++) ConsoleWrite("%c", 205);
ConsoleWrite("%#\t\t\t\tSomething went terribly wrong :(\n\n", ColorWhite);
ConsoleWrite("There was an unhandled exception: ");
if (r->int_no < 20)
ConsoleWrite("%#%s (INT%u)", ColorWhite, errorCodes[r->int_no], r->int_no);
else ConsoleWrite("%#INT%u", ColorWhite, r->int_no);
ConsoleWrite("\nTo protect your computer, it had to be halted.\n\n");
ConsoleWrite("Here, this might help find the problem:\n");
Point a = {4, -1}, b = {22, -1}, c = {40, -1}, d = {58, -1};
ConsoleSetDefaultColor(ColorWhite);
ConsoleCursorGoto(a); ConsoleWrite("eax=0x%x", r->eax);
ConsoleCursorGoto(b); ConsoleWrite("ebx=0x%x", r->ebx);
ConsoleCursorGoto(c); ConsoleWrite("ecx=0x%x", r->ecx);
ConsoleCursorGoto(d); ConsoleWrite("edx=0x%x\n", r->edx);
ConsoleCursorGoto(a); ConsoleWrite("edi=0x%x", r->edi);
ConsoleCursorGoto(b); ConsoleWrite("esi=0x%x", r->esi);
ConsoleCursorGoto(c); ConsoleWrite("ebp=0x%x", r->ebp);
ConsoleCursorGoto(d); ConsoleWrite("esp=0x%x\n", r->esp);
ConsoleCursorGoto(a); ConsoleWrite("gs=0x%x", r->gs);
ConsoleCursorGoto(b); ConsoleWrite("fs=0x%x", r->fs);
ConsoleCursorGoto(c); ConsoleWrite("es=0x%x", r->es);
ConsoleCursorGoto(d); ConsoleWrite("ds=0x%x\n", r->ds);
ConsoleCursorGoto(a); ConsoleWrite("eip=0x%x", r->eip);
ConsoleCursorGoto(b); ConsoleWrite("cs=0x%x", r->cs);
ConsoleCursorGoto(c); ConsoleWrite("eflags=0x%x", r->eflags);
ConsoleCursorGoto(d); ConsoleWrite("useresp=0x%x\n", r->useresp);
ConsoleCursorGoto(a); ConsoleWrite("gs=0x%x", r->ss);
ConsoleCursorGoto(b); ConsoleWrite("fs=0x%x", r->int_no);
ConsoleCursorGoto(c); ConsoleWrite("err_code=0x%x", r->err_code);
// Useful info about page fault
if (r->int_no == 0xE)
{
uint32 faulting_address;
asm volatile("mov %%cr2, %0" : "=r" (faulting_address));
ConsoleCursorGoto(d); ConsoleWrite("address=0x%x\n", faulting_address);
ConsoleCursorGoto(a); ConsoleWrite("reason: ");
if (!(r->err_code & 1)) ConsoleWrite("%#PAGE_NOT_PRESENT; ", ColorLightGray);
if (r->err_code & 2) ConsoleWrite("%#WRITE_OPERATION; ", ColorLightGray);
if (r->err_code & 4) ConsoleWrite("%#CPU_IN_USER_MODE; ", ColorLightGray);
if (r->err_code & 8) ConsoleWrite("%#CPU_RESERVED_PAGE_ENTRY_OVERWRITTEN; ", ColorLightGray);
if (r->err_code & 0x10) ConsoleWrite("%#INSTRUCTION_FETCH; ", ColorLightGray);
}
ConsoleSetDefaultColor(ColorLightRed);
ConsoleWrite("\n");
for (i = 0; i < 80; i++) ConsoleWrite("%c", 205);
}

97
Kernel/hal/crash.c~ Normal file
View File

@ -0,0 +1,97 @@
/*
* crash.c
*
* Created on: Aug 19, 2011
* Author: Tiberiu
*/
#include <debugio.h>
string errorCodes[] =
{
"Division by zero", //0
"Debugger", //1
"Non maskable interrupt", //2
"Breakpoint", //3
"Overflow", //4
"Bounds", //5
"Invalid opcode", //6
"Coprocessor not available", //7
"Double fault", //8
"Coprocessor segment overrun",//9
"Invalid task state segment", //A
"Segment not present", //B
"Stack fault", //C
"General protection fault", //D
"Page fault", //E
"", //F
"Math fault", //10
"Alignment check", //11
"Machine check", //12
"SIMD floating-point exception" //13
};
void CrashMessage(_RegsStack32 *r)
{
ConsoleSetDefaultColor(ColorLightRed);
ConsoleWrite("\n"); uint32 i;
for (i = 0; i < 80; i++) ConsoleWrite("%c", 205);
ConsoleWrite("%#\t\t\t\tSomething went terribly wrong :(\n\n", ColorWhite);
ConsoleWrite("There was an unhandled exception: ");
if (r->int_no < 20)
ConsoleWrite("%#%s (INT%u)", ColorWhite, errorCodes[r->int_no], r->int_no);
else ConsoleWrite("%#INT%u", ColorWhite, r->int_no);
ConsoleWrite("\nTo protect your computer, it had to be halted.\n\n");
ConsoleWrite("Here, this might help find the problem:\n");
Point a = {4, -1}, b = {22, -1}, c = {40, -1}, d = {58, -1};
ConsoleSetDefaultColor(ColorWhite);
ConsoleCursorGoto(a); ConsoleWrite("eax=0x%x", r->eax);
ConsoleCursorGoto(b); ConsoleWrite("ebx=0x%x", r->ebx);
ConsoleCursorGoto(c); ConsoleWrite("ecx=0x%x", r->ecx);
ConsoleCursorGoto(d); ConsoleWrite("edx=0x%x\n", r->edx);
ConsoleCursorGoto(a); ConsoleWrite("edi=0x%x", r->edi);
ConsoleCursorGoto(b); ConsoleWrite("esi=0x%x", r->esi);
ConsoleCursorGoto(c); ConsoleWrite("ebp=0x%x", r->ebp);
ConsoleCursorGoto(d); ConsoleWrite("esp=0x%x\n", r->esp);
ConsoleCursorGoto(a); ConsoleWrite("gs=0x%x", r->gs);
ConsoleCursorGoto(b); ConsoleWrite("fs=0x%x", r->fs);
ConsoleCursorGoto(c); ConsoleWrite("es=0x%x", r->es);
ConsoleCursorGoto(d); ConsoleWrite("ds=0x%x\n", r->ds);
ConsoleCursorGoto(a); ConsoleWrite("eip=0x%x", r->eip);
ConsoleCursorGoto(b); ConsoleWrite("cs=0x%x", r->cs);
ConsoleCursorGoto(c); ConsoleWrite("eflags=0x%x", r->eflags);
ConsoleCursorGoto(d); ConsoleWrite("useresp=0x%x\n", r->useresp);
ConsoleCursorGoto(a); ConsoleWrite("gs=0x%x", r->ss);
ConsoleCursorGoto(b); ConsoleWrite("fs=0x%x", r->int_no);
ConsoleCursorGoto(c); ConsoleWrite("err_code=0x%x", r->err_code);
// Useful info about page fault
if (r->int_no == 0xE)
{
uint32 faulting_address;
asm volatile("mov %%cr2, %0" : "=r" (faulting_address));
ConsoleCursorGoto(d); ConsoleWrite("address=0x%x\n", faulting_address);
ConsoleCursorGoto(a); ConsoleWrite("reason: ");
if (!(r->err_code & 1)) ConsoleWrite("%#PAGE_NOT_PRESENT; ", ColorLightGray);
if (r->err_code & 2) ConsoleWrite("%#WRITE_OPERATION; ", ColorLightGray);
if (r->err_code & 4) ConsoleWrite("%#CPU_IN_USER_MODE; ", ColorLightGray);
if (r->err_code & 8) ConsoleWrite("%#CPU_RESERVED_PAGE_ENTRY_OVERWRITTEN; ", ColorLightGray);
if (r->err_code & 0x10) ConsoleWrite("%#INSTRUCTION_FETCH; ", ColorLightGray);
}
ConsoleSetDefaultColor(ColorLightRed);
ConsoleWrite("\n");
for (i = 0; i < 80; i++) ConsoleWrite("%c", 205);
}

35
Kernel/hal/hal.c Normal file
View File

@ -0,0 +1,35 @@
// HARDWARE ABSTRACTION LAYER
#include "cpu/gdt.h"
#include "cpu/idt.h"
#include "cpu/isrs.h"
#include "cpu/irq.h"
#include "clock/clock.h"
#include "keyboard/keyboard.h"
#include "mouse/mouse.h"
#include <debugio.h>
void HalInitialize()
{
// Initialize cpu
GdtInstall(); Log("%#[HAL] %#Installed GDT\n", ColorYellow, ColorLightGreen);
IdtInstall(); Log("%#[HAL] %#Installed IDT\n", ColorYellow, ColorLightGreen);
IsrsInstall(); Log("%#[HAL] %#Installed ISRs\n", ColorYellow, ColorLightGreen);
IrqInstall(); Log("%#[HAL] %#Installed IRQs\n", ColorYellow, ColorLightGreen);
// Start interrupts
asm volatile ("sti");
Log("%#[HAL] %#Interrupts are started...\n", ColorYellow, ColorLightMagenta);
// Install keyboard
IrqInstallHandler(0, TimeHandler);
IrqInstallHandler(1, KeyboardHandler);
IrqInstallHandler(12, MouseHandler);
KeyboardInstallA(); Log("%#[HAL] %#Installing keyboard... %#[1/2] ", ColorYellow, ColorLightGray, ColorLightGreen);
KeyboardInstallB(); Log("%#[2/2]\n", ColorLightGreen);
// Install mouse driver
MouseInstall(); Log("%#[HAL] %#Installed mouse driver\n", ColorYellow, ColorLightGreen);
}

6
Kernel/hal/hal.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef __HAL__H
#define __HAL__H
extern void HalInitialize();
#endif

View File

@ -0,0 +1,327 @@
#include <stdio.h>
#include "keyboard.h"
#define KeybCmdWriteLED 0xed
#define KeybCmdEcho 0xee
#define KeybCmdSetScancodeSet 0xf0
#define KeybCmdGetID 0xf2
#define KeybCmdSetRepeatDelay 0xf3
#define KeybCmdEnable 0xf4
#define KeybCmdSetDefaultDisable 0xf5
#define KeybCmdSetDefault 0xf6
#define KeybCmdResend 0xfe
#define KeybCmdReset 0xff
volatile uint8 KeyState[16];
volatile uint8 KeyboardLastStatus;
volatile uint8 KeyboardLastScancode;
uint8 KeyboardScancodeSet = 2;
// Byte map:
// 0 If set, next code is break
// 1 'Gray' key
// 2 'Weird' key (Pause/Break)
// 3 Scroll
// 4 Num
// 5 Caps
// 6 If set, LEDs changed
uint8 KeyboardModifiers;
const char KeyboardMap[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\t', '`', 0,
0, 0, 0, 0, 0, 'q', '1', 0, 0, 0, 'z', 's', 'a', 'w', '2', 0,
0, 'c', 'x', 'd', 'e', '4', '3', 0, 0, ' ', 'v', 'f', 't', 'r', '5', 0,
0, 'n', 'b', 'h', 'g', 'y', '6', 0, 0, 0, 'm', 'j', 'u', '7', '8', 0,
0, ',', 'k', 'i', 'o', '0', '9', 0, 0, '.', '/', 'l', ';', 'p', '-', 0,
0, 0, '\'', 0, '[', '=', 0, 0, 0, 0, '\n', ']', 0, '\\', 0, 0,
0, 0, 0, 0, 0, 0, '\b', 0, 0, '1', '/', '4', '7', '\n', 0, 0,
'0', '.', '2', '5', '6', '8', 0, 0, 0, '+', '3', '-', '*', '9', 0, 0
};
const char KeyboardMapShift[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\t', '~', 0,
0, 0, 0, 0, 0, 'Q', '!', 0, 0, 0, 'Z', 'S', 'A', 'W', '@', 0,
0, 'C', 'X', 'D', 'E', '$', '#', 0, 0, ' ', 'V', 'F', 'T', 'R', '%', 0,
0, 'N', 'B', 'H', 'G', 'Y', '^', 0, 0, 0, 'M', 'J', 'U', '&', '*', 0,
0, '<', 'K', 'I', 'O', ')', '(', 0, 0, '>', '?', 'L', ':', 'P', '_', 0,
0, 0, '\"', 0, '{', '+', 0, 0, 0, 0, '\n', '}', 0, '|', 0, 0,
0, 0, 0, 0, 0, 0, '\b', 0, 0, '1', '/', '4', '7', '\n', 0, 0,
'0', '.', '2', '5', '6', '8', 0, 0, 0, '+', '3', '-', '*', '9', 0, 0
};
void KeyboardSetKeyStatus (uint8 scancode, uint8 status)
{
int32 index = scancode>>3, pos = scancode & 0x7;
if (status) KeyState[index] |= 1<<pos;
else KeyState[index] &= ~(1<<pos);
}
uint8 KeyboardGetKeyStatus (uint8 scancode)
{
int32 index = scancode>>3, pos = scancode & 0x7;
return KeyState[index] & (1<<pos);
}
void _process_scancode(uint8 scancode)
{
switch (scancode)
{
// Messages from keyboard controller
case 0x00: // Error 0x00
case 0xFC: // Diagnostics failed (MF kb)
case 0xFD: // Diagnostics failed (AT kb)
case 0xFF: KeyboardWaitOutport();
outportb(0x60, KeybCmdEnable);
return; // Error 0xFF, reenable keyboard
case 0xAA: // BAT test successful.
case 0xFA: // ACKnowledge
case 0xFE: // Last command invalid or parity error
case 0xEE: return; // Echo response
// Break
case 0xF0: KeyboardModifiers |= 1; return;
// Special character (gray, etc)
case 0xE0: KeyboardModifiers |= 2; return;
case 0xE1: KeyboardModifiers |= 4; return;
// Remap some characters:
case 0x83: scancode = KeyboardKeyF7; break;
// LEDs
case KeyboardKeyScrollLock:
if ((KeyboardModifiers & 1) == 0) {
KeyboardModifiers ^= 1<<3;
KeyboardModifiers |= 1<<6;
} break;
case KeyboardKeyNumLock:
if ((KeyboardModifiers & 1) == 0) {
KeyboardModifiers ^= 1<<4;
KeyboardModifiers |= 1<<6;
} break;
case KeyboardKeyCapsLock:
if ((KeyboardModifiers & 1) == 0) {
KeyboardModifiers ^= 1<<5;
KeyboardModifiers |= 1<<6;
} break;
}
// Remap most gray characters
if (KeyboardModifiers & 2) switch (scancode)
{
case 0x10: scancode = KeyboardKeyMediaWebSearch; break;
case 0x11: scancode = KeyboardKeyRightAlt; break;
case 0x12: return; // Fake shift, ignore
case 0x14: scancode = KeyboardKeyRightCtrl; break;
case 0x15: scancode = KeyboardKeyMediaPrevious; break;
case 0x18: scancode = KeyboardKeyMediaWebFavorites; break;
case 0x1F: scancode = KeyboardKeyLeftWin; break;
case 0x20: scancode = KeyboardKeyMediaWebRefresh; break;
case 0x21: scancode = KeyboardKeyMediaVolDown; break;
case 0x23: scancode = KeyboardKeyMediaMute; break;
case 0x27: scancode = KeyboardKeyRightWin; break;
case 0x28: scancode = KeyboardKeyMediaWebStop; break;
case 0x2B: scancode = KeyboardKeyMediaCalculator; break;
case 0x2F: scancode = KeyboardKeyMenu; break;
case 0x30: scancode = KeyboardKeyMediaWebForward; break;
case 0x32: scancode = KeyboardKeyMediaVolUp; break;
case 0x34: scancode = KeyboardKeyMediaPause; break;
case 0x37: scancode = KeyboardKeyPower; break;
case 0x38: scancode = KeyboardKeyMediaWebBack; break;
case 0x3A: scancode = KeyboardKeyMediaWebHome; break;
case 0x3B: scancode = KeyboardKeyMediaStop; break;
case 0x3F: scancode = KeyboardKeySleep; break;
case 0x40: scancode = KeyboardKeyMediaComputer; break;
case 0x48: scancode = KeyboardKeyMediaEmail; break;
case 0x4A: scancode = KeyboardKeyNumpadSlash; break;
case 0x4D: scancode = KeyboardKeyMediaNext; break;
case 0x50: scancode = KeyboardKeyMediaSelect; break;
case 0x5A: scancode = KeyboardKeyNumpadEnter; break;
case 0x5E: scancode = KeyboardKeyWake; break;
case 0x69: scancode = KeyboardKeyEnd; break;
case 0x6B: scancode = KeyboardKeyLeft; break;
case 0x6C: scancode = KeyboardKeyHome; break;
case 0x70: scancode = KeyboardKeyInsert; break;
case 0x71: scancode = KeyboardKeyDelete; break;
case 0x72: scancode = KeyboardKeyDown; break;
case 0x74: scancode = KeyboardKeyRight; break;
case 0x75: scancode = KeyboardKeyUp; break;
case 0x7A: scancode = KeyboardKeyPageDown; break;
case 0x7C: scancode = KeyboardKeyPrintScreen; break;
case 0x7D: scancode = KeyboardKeyPageUp; break;
}
// Pause/break
if (KeyboardModifiers & 4)
{
KeyboardSetKeyStatus(KeyboardKeyPause, 1 - (KeyboardModifiers & 1));
if (scancode == 0x77) KeyboardModifiers = 0;
return;
}
KeyboardSetKeyStatus(scancode, 1 - (KeyboardModifiers & 1));
// Give functions something to wait for :P
KeyboardLastScancode = scancode;
KeyboardLastStatus = KeyboardModifiers;
KeyboardModifiers &= ~7;
}
void KeyboardHandler (_RegsStack32* UNUSED(r))
{
// Get scancode from keyboard
uint8 scancode = inportb(0x60);
// Process scancode
_process_scancode(scancode);
// LED update
if (KeyboardModifiers & (1<<6))
{
KeyboardSetLEDs(KeyboardModifiers & (1<<3), KeyboardModifiers & (1<<4), KeyboardModifiers & (1<<5));
KeyboardModifiers &= ~(1<<6);
}
}
void KeyboardSetLEDs (uint8 scroll, uint8 num, uint8 caps)
{
uint8 status = 0;
status |= (scroll > 0);
status |= (num > 0) << 1;
status |= (caps > 0) << 2;
KeyboardWaitOutport();
outportb (0x60, KeybCmdWriteLED);
KeyboardWaitOutport();
outportb (0x60, status);
}
/***************************************
* Set repeat rate/delay *
***************************************
Values for inter-character delay (bits 4-0)
(characters per second; default is 10.9)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
----+----+----+----+----+----+----+----+----
0 |30.0|26.7|24.0|21.8|20.0|18.5|17.1|16.0
8 |15.0|13.3|12.0|10.9|10.0|9.2 |8.6 |8.0
16 |7.5 |6.7 |6.0 |5.5 |5.0 |4.6 |4.3 |4.0
24 |3.7 |3.3 |3.0 |2.7 |2.5 |2.3 |2.1 |2.0
Values for delay:
(miliseconds; default is 500)
0 | 1 | 2 | 3
-----+-----+-----+-----
250 | 500 | 750 | 1000
***************************************/
void KeyboardSetRepeatRate(uint8 rate, uint8 delay)
{
if (rate>3 || delay>31) return;
uint8 out = rate<<5 | delay;
KeyboardWaitOutport();
outportb(0x60, KeybCmdSetRepeatDelay);
KeyboardWaitOutport();
outportb(0x60, out);
}
/***************************************
* Set scancode set *
***************************************
1 Set to scancode set 1
2 Set to scancode set 2
3 Set to scancode set 3
***************************************/
void KeyboardSetScancodeSet(uint8 set)
{
if (set>3 || set <= 0) return;
KeyboardWaitOutport();
outportb (0x60, KeybCmdSetScancodeSet);
KeyboardWaitOutport();
outportb (0x60, set);
KeyboardScancodeSet = set;
}
void KeyboardWaitOutport()
{
int fail_safe=200000;
while ((inportb(0x64)&2)!=0 && fail_safe>0) fail_safe--;
}
void KeyboardWaitInport()
{
int fail_safe=200000;
while ((inportb(0x64)&1)==0 && fail_safe>0) fail_safe--;
}
void KeyboardInstallA()
{
KeyboardWaitOutport();
outportb(0x60, KeybCmdReset); // Reset kb
// Initialize variables
KeyboardLastStatus = 0;
KeyboardModifiers = 0;
int32 i;
for (i = 0; i < 16; i++)
KeyState[i] = 0;
}
void KeyboardInstallB()
{
// Wait for BAT test results
KeyboardWaitInport();
unsigned char temp;
do temp = inportb(0x60);
while (temp!=0xAA && temp!=0xFC);
// Error
if (temp == 0xFC) return;
// Set new repeat rate
KeyboardSetRepeatRate(1, 11);
// Set scancode set 2
KeyboardSetScancodeSet(2); // Set new scancode set
KeyboardWaitOutport();
outportb(0x64, 0x20); // Get "Command unsigned char"
do { temp = inportb(0x60);
} while (temp==0xFA || temp==0xAA);
temp &= ~(1<<6); // Unset bit6: disable conversion
KeyboardWaitOutport();
outportb(0x64, 0x60); // Function to write cmd unsigned char
KeyboardWaitOutport();
outportb(0x60, temp); // Send it
}

View File

@ -0,0 +1,52 @@
#ifndef __KEYBOARD__H
#define __KEYBOARD__H
#include <types.h>
extern const char KeyboardMap[0x80];
extern const char KeyboardMapShift[0x80];
extern volatile uint8 KeyboardLastStatus;
extern volatile uint8 KeyboardLastScancode;
extern void KeyboardSetKeyStatus (uint8 scancode, uint8 status);
extern uint8 KeyboardGetKeyStatus (uint8 scancode);
extern void KeyboardHandler (_RegsStack32 *r);
extern void KeyboardSetLEDs (uint8 scroll, uint8 num, uint8 caps);
/***************************************
* Set repeat rate/delay *
***************************************
Values for inter-character delay (bits 4-0)
(characters per second; default is 10.9)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
----+----+----+----+----+----+----+----+----
0 |30.0|26.7|24.0|21.8|20.0|18.5|17.1|16.0
8 |15.0|13.3|12.0|10.9|10.0|9.2 |8.6 |8.0
16 |7.5 |6.7 |6.0 |5.5 |5.0 |4.6 |4.3 |4.0
24 |3.7 |3.3 |3.0 |2.7 |2.5 |2.3 |2.1 |2.0
Values for delay:
(miliseconds; default is 500)
0 | 1 | 2 | 3
-----+-----+-----+-----
250 | 500 | 750 | 1000
***************************************/
extern void KeyboardSetRepeatRate(uint8 rate, uint8 delay);
/***************************************
* Set scancode set *
***************************************
1 Set to scancode set 1
2 Set to scancode set 2
3 Set to scancode set 3
***************************************/
extern void KeyboardSetScancodeSet(uint8 set);
extern void KeyboardWaitOutport();
extern void KeyboardWaitInport();
extern void KeyboardInstallA();
extern void KeyboardInstallB();
#endif

116
Kernel/hal/mouse/mouse.c Normal file
View File

@ -0,0 +1,116 @@
#include <stdio.h>
#include <debugio.h>
#include "mouse.h"
#include "../keyboard/keyboard.h"
uint8 MouseCycle = 0;
uint8 MouseCycleExpected = 3;
uint8 Packets[4];
Point MousePosition = {0,0};
Point MouseMinimumPosition = {0,0}, MouseMaximumPosition = {80, 25};
Point Prev = {0,0};
#define SpeedLimit 0x8
// IRQ12
void MouseHandler (_RegsStack32* UNUSED(r))
{
uint8 data = inportb(0x60);
Point delta;
if (MouseCycle == 0 && (data == 0 || data == 0xFA || data == 0xFF || data == 0xAA)) return;
Packets[MouseCycle++] = data;
// Cycle ended
if (MouseCycle >= MouseCycleExpected)
{
MouseCycle = 0;
if (Packets[0] & 0xC0) return; // Discard packet
// Update X position
if (Packets[0] & 0x10) delta.X = (int32) (Packets[1] | 0xFFFFFF00);
else delta.X = (int32) Packets[1];
// Update Y position
if (Packets[0] & 0x20) delta.Y = -1 * (int32) (Packets[2] | 0xFFFFFF00);
else delta.Y = -1 * (int32)Packets[2];
if (delta.X >= SpeedLimit) delta.X = SpeedLimit;
if (delta.X <= -SpeedLimit) delta.X = -SpeedLimit;
if (delta.Y >= SpeedLimit) delta.Y = SpeedLimit;
if (delta.Y <= -SpeedLimit) delta.Y = -SpeedLimit;
MousePosition.X += delta.X;
MousePosition.Y += delta.Y;
// Check limits
if (MousePosition.X < MouseMinimumPosition.X) MousePosition.X = MouseMinimumPosition.X;
if (MousePosition.Y < MouseMinimumPosition.Y) MousePosition.Y = MouseMinimumPosition.Y;
if (MousePosition.X >= MouseMaximumPosition.X) MousePosition.X = MouseMaximumPosition.X - 1;
if (MousePosition.Y >= MouseMaximumPosition.Y) MousePosition.Y = MouseMaximumPosition.Y - 1;
/* TESTING ONLY */
ConsoleSetColor(Prev, 0xFF - ConsoleGetColor(Prev));
ConsoleSetColor(MousePosition, 0xFF - ConsoleGetColor(MousePosition));
Prev = MousePosition;
}
}
void MouseSendCommand(uint8 command)
{
KeyboardWaitOutport();
outportb(0x64, 0xD4);
KeyboardWaitOutport();
outportb(0x60, command);
}
uint8 MouseReadData ()
{
KeyboardWaitInport();
return inportb(0x60);
}
void MouseInstall()
{
KeyboardWaitOutport();
outportb(0x64, 0xA8);
// Enable interrupts
KeyboardWaitOutport();
outportb(0x64, 0x20);
KeyboardWaitInport();
uint8 temp = inportb(0x60) | 2;
temp &= ~0x20;
KeyboardWaitOutport();
outportb(0x64, 0x60);
KeyboardWaitOutport();
outportb(0x60, temp);
// Reset mouse, and enable it
MouseSendCommand(MouseCommandReset);
MouseReadData(); MouseReadData();
MouseSendCommand(MouseCommandSetDefaults);
MouseReadData(); // Read ack
MouseSendCommand(MouseCommandEnableDataReporting);
MouseReadData(); // Read ack
}
void MouseSetLimits (Point min_pos, Point max_pos)
{
MouseMinimumPosition = min_pos;
MouseMaximumPosition = max_pos;
}
MouseState MouseGetState()
{
MouseState ret = { Packets[0] & 0x7, MousePosition};
return ret;
}

36
Kernel/hal/mouse/mouse.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef __MOUSE__H
#define __MOUSE__H
#include <types.h>
typedef struct
{
uint8 Buttons;
Point Position;
} MouseState;
enum MouseCommands
{
MouseCommandReset = 0xFF,
MouseCommandResend = 0xFE,
MouseCommandSetDefaults = 0xF6,
MouseCommandDisableDataReporting = 0xF5,
MouseCommandEnableDataReporting = 0xF4,
MouseCommandSetSampleRate = 0xF3,
MouseCommandGetDeviceID = 0xF2,
MouseCommandSetRemoteMode = 0xF0,
MouseCommandSetWrapMode = 0xEE,
MouseCommandReadData = 0xEB,
MouseCommandSetStreamMode = 0xEA,
MouseCommandStatusRequest = 0xE9,
MouseCommandSetResolution = 0xE8,
MouseCommandSetScaling_2_1 = 0xE7,
MouseCommandSetScaling_1_1 = 0xE6
};
extern void MouseInstall();
extern void MouseHandler (_RegsStack32 *r);
extern void MouseSetLimits (Point min_pos, Point max_pos);
extern MouseState MouseGetState();
#endif

27
Kernel/hal/sysinfo.c Normal file
View File

@ -0,0 +1,27 @@
/*
* sysinfo.c
*
* Provides information about system, and useful utilities
*
* Created on: Aug 17, 2011
* Author: Tiberiu
*/
#include <stdio.h>
#include <multiboot.h>
#include <debugio.h>
#include <memory.h>
#include <../drivers/cmos/cmos.h>
#include "keyboard/keyboard.h"
void SystemReboot()
{
Log("Rebooting system...\n");
KeyboardWaitOutport();
outportb (0x64, 0xFE);
asm("cli");
asm("hlt");
}

40
Kernel/hal/vfs.c Normal file
View File

@ -0,0 +1,40 @@
#include<fileio.h>
#include<storage.h>
#define MAX_FS_COUNT 64
uint32 FsRead(FsNode *node, uint32 offset, uint32 size, uint8 *buffer)
{
if (node->Read != NULL) return node->Read(node, offset, size, buffer);
return NULL;
}
uint32 FsWrite(FsNode *node, uint32 offset, uint32 size, uint8 *buffer)
{
if (node->Write != NULL) return node->Write(node, offset, size, buffer);
return NULL;
}
void FsOpen(FsNode *node, uint8 read, uint8 write)
{
if (node->Open != NULL) return node->Open(node, read, write);
}
void FsClose(FsNode *node)
{
if (node->Close != NULL) return node->Close();
}
DirectoryEntry *FsReadDir(FsNode *node, uint32 index)
{
if (node->ReadDir != NULL && (node->Flags&7) == FsDirectory)
return node->ReadDir(node, index);
return NULL;
}
FsNode *FsFindDir(FsNode *node, char *name)
{
if (node->FindDir != NULL && (node->Flags&7) == FsDirectory)
return node->FindDir(node, name);
return NULL;
}

88
Kernel/include/debugio.h Normal file
View File

@ -0,0 +1,88 @@
#ifndef __DEBUGIO__H
#define __DEBUGIO__H
#include <types.h>
#include <settings.h>
#include <stdarg.h>
enum Colors
{
ColorBlack = 0x0,
ColorBlue = 0x1,
ColorGreen = 0x2,
ColorCyan = 0x3,
ColorRed = 0x4,
ColorMagenta = 0x5,
ColorBrown = 0x6,
ColorLightGray = 0x7,
ColorDarkGray = 0x8,
ColorLightBlue = 0x9,
ColorLightGreen = 0xA,
ColorLightCyan = 0xB,
ColorLightRed = 0xC,
ColorLightMagenta = 0xD,
ColorYellow = 0xE,
ColorWhite = 0xF
};
extern uint8 Color (uint8 back, uint8 fore);
// Cursor position
extern Point ConsoleGetCursor();
extern void ConsoleSetCursor(Point p);
extern void ConsoleCursorGoto(Point p);
extern void ConsoleCursorIncreasePos (int32 delta);
extern void ConsoleCursorNewline();
extern void ConsoleCursorUpdateHardware();
// Get/set properties
extern void ConsoleSetDefaultColor(uint8 color);
extern uint8 ConsoleGetDefaultColor ();
extern UPoint ConsoleGetSize();
extern void ConsoleSetChar(Point pos, char c);
extern void ConsoleSetColor(Point pos, uint8 color);
extern char ConsoleGetChar(Point pos);
extern uint8 ConsoleGetColor (Point pos);
// Basic console operations
extern void ConsoleClear();
extern void ConsoleScroll (uint32 lines);
// Console write operations
extern void ConsoleWriteChar (char c);
extern void ConsoleWriteString (string s);
extern int32 ConsoleWrite (string format, ...);
// Console read operations
extern void ConsoleReadString (string s, int32 buffer_size, char end_char);
// Console main loop
extern void ConsoleMain();
// Debug print
#if VERBOSE_MODE==1
#define Log(...) ConsoleWrite(__VA_ARGS__)
#else
#define Log(...)
#endif
// Error print
#if VERBOSE_ERROR==1
#define Error(...) ConsoleWrite(__VA_ARGS__)
#else
#define Error(...)
#endif
// Panic
#if VERBOSE_PANIC==1
#define Panic(...) { ConsoleWrite("%#[PANIC] KERNEL PANIC: ", ColorLightRed); \
ConsoleWrite(__VA_ARGS__); \
asm volatile ("cli\nhlt"); }
#else
#define Panic(...)
#endif
#endif

70
Kernel/include/fileio.h Normal file
View File

@ -0,0 +1,70 @@
/*
* fileio.h
*
* Created on: Aug 23, 2011
* Author: Tiberiu
*/
#ifndef FILEIO_H_
#define FILEIO_H_
#include <types.h>
enum FsFlags
{
FsFile = 0x1,
FsDirectory = 0x2,
FsCharDevice = 0x3,
FsBlockDevice = 0x4,
FsPipe = 0x5,
FsSymbolLink = 0x6,
FsMountPoint = 0x8
};
typedef uint32 (*ReadRoutine)(struct _FsNode*, uint32, uint32, uint8*);
typedef uint32 (*WriteRoutine)(struct _FsNode*, uint32, uint32, uint8*);
typedef void (*OpenRoutine)(struct _FsNode*);
typedef void (*CloseRoutine)(struct _FsNode*);
typedef struct _DirectoryEntry (*ReadDirRoutine)(struct _FsNode*,uint32);
typedef struct _FsNode* (*FindDirRoutine)(struct _FsNode*,char *name);
typedef struct _FsNode
{
char Name[128]; // The filename.
uint32 Permissions; // The permissions mask.
uint32 UserId; // The owning user.
uint32 GroupId; // The owning group.
uint32 Flags; // Includes the node type. See enum above.
uint32 INode; // This is device-specific - provides a way for a filesystem to identify files.
uint32 Length; // Size of the file, in bytes.
uint32 Implementation; // An implementation-defined number.
ReadRoutine Read;
WriteRoutine Write;
OpenRoutine Open;
CloseRoutine Close;
ReadDirRoutine ReadDir;
FindDirRoutine FindDir;
struct _FsNode *Ptr; // Used by mountpoints and symlinks.
} FsNode;
typedef struct _DirectoryEntry
{
char Name[128];
uint32 INode;
} DirectoryEntry;
extern uint32 FsRead(FsNode *node, uint32 offset, uint32 size, uint8 *buffer);
extern uint32 FsWrite(FsNode *node, uint32 offset, uint32 size, uint8 *buffer);
extern void FsOpen(FsNode *node, uint8 read, uint8 write);
extern void FsClose(FsNode *node);
extern DirectoryEntry *FsReadDir(FsNode *node, uint32 index);
extern FsNode *FsFindDir(FsNode *node, char *name);
#ifdef NEVER
void VfsRegisterFilesys();
void VfsMount();
#endif
#endif /* FILEIO_H_ */

View File

@ -0,0 +1,97 @@
/*
* memory-add.h
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#ifndef MEMORY_ADD_H_
#define MEMORY_ADD_H_
#include <memory.h>
#include <stdlib.h>
#include <debugio.h>
/***************************************************
* Paging *
***************************************************/
typedef uint32 Page;
enum PageFlags
{
PagePresent = 0x1,
PageWriteable = 0x2,
PageUser = 0x4,
PageWriteThough = 0x8,
PageNotCacheable = 0x10,
PageAccessed = 0x20,
PageDirty = 0x40,
PagePAT = 0x80,
PageCpuGlobal = 0x100,
PageLvl4Global = 0x200,
PageFrame = 0xFFFFF000
};
typedef struct {
Page Pages[1024];
} PageTable;
typedef struct {
PageTable* Tables[1024];
uint32 TablesPhysical[1024];
uint32 PhysicalAddr;
} PageDirectory;
extern PageDirectory* CurrentDirectory;
extern PageDirectory* KernelDirectory;
extern void PagingInitialize(uint32 SystemMemory);
extern void PagingSwitchPageDirectory (PageDirectory* dir);
extern Page* PagingGetPage(uint32 addr, uint8 make, PageDirectory* dir);
/***************************************************
* Physical memory manager *
***************************************************/
extern uint32 TotalFrames;
extern uint32 TotalMemory;
extern uint32 UsedFrames;
void MemPhInitialize(uint32 SystemMemoryKb);
extern void MemPhSetFrame (uint32 frame, uint8 value);
uint32 MemPhGetFrame (uint32 frame);
uint32 MemPhFindFreeFrame();
void MemPhAllocFrame(Page* page, uint8 isKernel, uint8 isWriteable);
void MemPhFreeFrame(Page* page);
void MemPhReserveFrames (uint32 address, uint32 length);
/***************************************************
* Memory heap *
***************************************************/
typedef struct
{
OrderedArray Index;
uint32 StartAddress, EndAddress, MaxAddress;
// bit 0: supervisor-only bit 1: read-only
uint8 Flags;
} MemHeap;
extern MemHeap* KernelHeap;
extern uint32 MemHeapFindSmallestHole (uint32 size, uint8 page_align, MemHeap* heap);
extern int32 MemHeapCompare (uint32 a, uint32 b);
extern MemHeap* MemHeapCreate(uint32 start, uint32 end, uint32 max, uint8 flags);
extern void MemHeapExpand(uint32 newsz, MemHeap* heap, PageDirectory* pd);
extern uint32 MemHeapContract(uint32 newsz, MemHeap* heap, PageDirectory* pd);
extern uint32 MemHeapAlloc (uint32 size, uint8 isPageAligned, MemHeap* heap, PageDirectory* pd);
extern void MemHeapFree (uint32 address, MemHeap* heap, PageDirectory* pd);
#define LogMem(...) { Log("%#[Mem] ", ColorLightCyan); Log(__VA_ARGS__); }
#define ErrorMem(...) { Error("%#[Mem] ", ColorLightCyan); Error(__VA_ARGS__); }
#endif /* MEMORY_ADD_H_ */

View File

@ -0,0 +1,96 @@
/*
* memory-add.h
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#ifndef MEMORY_ADD_H_
#define MEMORY_ADD_H_
#include <memory.h>
#include <stdlib.h>
#include <debugio.h>
/***************************************************
* Paging *
***************************************************/
typedef uint32 Page;
enum PageFlags
{
PagePresent = 0x1,
PageWriteable = 0x2,
PageUser = 0x4,
PageWriteThough = 0x8,
PageNotCacheable = 0x10,
PageAccessed = 0x20,
PageDirty = 0x40,
PagePAT = 0x80,
PageCpuGlobal = 0x100,
PageLvl4Global = 0x200,
PageFrame = 0xFFFFF000
};
typedef struct {
Page Pages[1024];
} PageTable;
typedef struct {
PageTable* Tables[1024];
uint32 TablesPhysical[1024];
uint32 PhysicalAddr;
} PageDirectory;
extern PageDirectory* CurrentDirectory;
extern PageDirectory* KernelDirectory;
extern void PagingInitialize(uint32 SystemMemory);
extern void PagingSwitchPageDirectory (PageDirectory* dir);
extern Page* PagingGetPage(uint32 addr, uint8 make, PageDirectory* dir);
/***************************************************
* Physical memory manager *
***************************************************/
extern uint32 TotalFrames;
extern uint32 TotalMemory;
void MemPhInitialize(uint32 SystemMemoryKb);
extern void MemPhSetFrame (uint32 frame, uint8 value);
uint32 MemPhGetFrame (uint32 frame);
uint32 MemPhFindFreeFrame();
void MemPhAllocFrame(Page* page, uint8 isKernel, uint8 isWriteable);
void MemPhFreeFrame(Page* page);
void MemPhReserveFrames (uint32 address, uint32 length);
/***************************************************
* Memory heap *
***************************************************/
typedef struct
{
OrderedArray Index;
uint32 StartAddress, EndAddress, MaxAddress;
// bit 0: supervisor-only bit 1: read-only
uint8 Flags;
} MemHeap;
extern MemHeap* KernelHeap;
extern uint32 MemHeapFindSmallestHole (uint32 size, uint8 page_align, MemHeap* heap);
extern int32 MemHeapCompare (uint32 a, uint32 b);
extern MemHeap* MemHeapCreate(uint32 start, uint32 end, uint32 max, uint8 flags);
extern void MemHeapExpand(uint32 newsz, MemHeap* heap, PageDirectory* pd);
extern uint32 MemHeapContract(uint32 newsz, MemHeap* heap, PageDirectory* pd);
extern uint32 MemHeapAlloc (uint32 size, uint8 isPageAligned, MemHeap* heap, PageDirectory* pd);
extern void MemHeapFree (uint32 address, MemHeap* heap, PageDirectory* pd);
#define LogMem(...) { Log("%#[Mem] ", ColorLightCyan); Log(__VA_ARGS__); }
#define ErrorMem(...) { Error("%#[Mem] ", ColorLightCyan); Error(__VA_ARGS__); }
#endif /* MEMORY_ADD_H_ */

29
Kernel/include/memory.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef __MEMORY__H
#define __MEMORY__H
#include <types.h>
#include <settings.h>
#include <multiboot.h>
/***************************************************
* Basic memory operations: alloc, free *
***************************************************/
extern void* kmalloc (uint32 size);
extern void* kmalloc_a (uint32 size);
extern void* kmalloc_p (uint32 size, uint32* phys);
extern void* kmalloc_ap (uint32 size, uint32* phys);
extern void kfree (void* addr);
extern void MemoryTempInitialize (uint32 kernel_end);
extern void MemoryInitialize (MultibootInfo* info);
extern uint32 MemoryGetTotal();
extern uint32 MemoryGetFree(); // Returns total free physical memory in kilobytes
extern uint32 MemoryGetUsed(); // Total used physical memory in kbytes
extern uint32 MemoryGetFrameSize(); // Same as above functions, but in frames
extern uint32 MemoryGetFramesTotal();
extern uint32 MemoryGetFramesUsed();
extern uint32 MemoryGetFramesFree();
#endif

29
Kernel/include/memory.h~ Normal file
View File

@ -0,0 +1,29 @@
#ifndef __MEMORY__H
#define __MEMORY__H
#include <types.h>
#include <settings.h>
#include <multiboot.h>
/***************************************************
* Basic memory operations: alloc, free *
***************************************************/
extern void* kmalloc (uint32 size);
extern void* kmalloc_a (uint32 size);
extern void* kmalloc_p (uint32 size, uint32* phys);
extern void* kmalloc_ap (uint32 size, uint32* phys);
extern void kfree (void* addr);
extern void MemoryTempInitialize (uint32 kernel_end);
extern void MemoryInitialize (MultibootInfo* info);
extern uint32 MemoryGetTotal();
extern uint32 MemoryGetFree(); // Returns total free physical memory in bytes
extern uint32 MemoryGetUsed(); // Total used physical memory in bytes
extern uint32 MemoryGetFrameSize(); // Same as above functions, but in frames
extern uint32 MemoryGetFramesTotal();
extern uint32 MemoryGetFramesUsed();
extern uint32 MemoryGetFramesFree();
#endif

119
Kernel/include/multiboot.h Normal file
View File

@ -0,0 +1,119 @@
/*
* multiboot.h
*
* Created on: Aug 17, 2011
* Author: Tiberiu
*/
#ifndef MULTIBOOT_H_
#define MULTIBOOT_H_
#include <types.h>
// Flags to be set in the 'flags' member of the multiboot info structure.
#define MultibootInfo_MEMORY 0x00000001 // is there basic lower/upper memory information?
#define MultibootInfo_BOOTDEV 0x00000002 // is there a boot device set?
#define MultibootInfo_CMDLINE 0x00000004 // is the command-line defined?
#define MultibootInfo_MODS 0x00000008 // are there modules to do something with?
// These next two are mutually exclusive
#define MultibootInfo_AOUT_SYMS 0x00000010 // is there a symbol table loaded?
#define MultibootInfo_ELF_SHDR 0X00000020 // is there an ELF section header table?
#define MultibootInfo_MEM_MAP 0x00000040 // is there a full memory map?
#define MultibootInfo_DRIVE_INFO 0x00000080 // Is there drive info?
#define MultibootInfo_CONFIG_TABLE 0x00000100 // Is there a config table?
#define MultibootInfo_BOOT_LOADER_NAME 0x00000200 // Is there a boot loader name?
#define MultibootInfo_APM_TABLE 0x00000400 // Is there a APM table?
#define MultibootInfo_VIDEO_INFO 0x00000800 // Is there video information?
// The symbol table for a.out.
typedef struct
{
uint32 TableSize;
uint32 StrSize;
uint32 Address;
uint32 Reserved;
} MultibootAoutSymbolTable;
// The section header table for ELF.
typedef struct
{
uint32 Number;
uint32 Size;
uint32 Address;
uint32 Shndx;
} MultibootElfSectionHeaderTable;
typedef struct
{
uint32 Flags; // Multiboot info version number
uint32 MemoryLower; // Available memory from BIOS
uint32 MemoryUpper;
uint32 BootDevice; // "root" partition
uint32 CommandLine; // Kernel command line
uint32 ModulesCount; // Boot-Module list
uint32 ModulesAddress;
union
{
MultibootAoutSymbolTable AoutSymbols;
MultibootElfSectionHeaderTable ElfSectionHeaderTable;
} Symbols;
uint32 MemoryMapLength; // Memory Mapping buffer
uint32 MemoryMapAddress;
uint32 DrivesLength; // Drive Info buffer
uint32 DrivesAddress;
uint32 ConfigurationTable; // ROM configuration table
uint32 BootLoaderName; // Boot Loader Name
uint32 ApmTable; // APM table
uint32 VbeControlInfo; // Video
uint32 VbeModeInfo;
uint16 VbeMode;
uint16 VbeInterfaceSegment;
uint16 VbeInterfaceOffset;
uint16 VbeInterfaceLength;
} MultibootInfo;
typedef struct
{
uint32 Size;
uint64 Address;
uint64 Length;
#define MULTIBOOT_MEMORY_AVAILABLE 1
#define MULTIBOOT_MEMORY_RESERVED 2
uint32 Type;
} __attribute__((packed)) MultibootMemoryMapEntry;
typedef struct
{
// the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive
uint32 ModuleStart;
uint32 ModuleEnd;
// Module command line
uint32 CommandLine;
// padding to take it to 16 bytes (must be zero)
uint32 _Padding;
} MultibootModule;
#endif

38
Kernel/include/settings.h Normal file
View File

@ -0,0 +1,38 @@
/*
* settings.h
*
* Created on: Aug 16, 2011
* Author: Tiberiu
*/
#ifndef SETTINGS_H_
#define SETTINGS_H_
// OS info
#define OS_STRING "lux"
#define OS_VERSION "0.1 [pre-Alpha]"
#define OS_BUILD_DATE __DATE__
#define OS_BUILD_TIME __TIME__
#include <version.h>
// Logger
#define VERBOSE_MODE 1
#define VERBOSE_ERROR 1
#define VERBOSE_PANIC 1
// Clock
#define PIT_FREQUENCY 100
// Console
#define CONSOLE_MAX_PARAMS 32
#define CONSOLE_DEFAULT_COLOR 0x7
// Memory manager
#define KERNEL_HEAP_START 0xC0000000
#define KERNEL_HEAP_INITIAL_SIZE 0x100000
#define KERNEL_HEAP_END (KERNEL_HEAP_START + KERNEL_HEAP_INITIAL_SIZE)
#endif /* SETTINGS_H_ */

View File

@ -0,0 +1,37 @@
/*
* settings.h
*
* Created on: Aug 16, 2011
* Author: Tiberiu
*/
#ifndef SETTINGS_H_
#define SETTINGS_H_
// OS info
#define OS_STRING "lux"
#define OS_VERSION "0.1 [pre-Alpha]"
#define OS_BUILD_DATE __DATE__
#define OS_BUILD_TIME __TIME__
#include <version.h>
// Logger
#define VERBOSE_MODE 1
#define VERBOSE_ERROR 1
#define VERBOSE_PANIC 1
// Clock
#define PIT_FREQUENCY 100
// Console
#define CONSOLE_MAX_PARAMS 32
#define CONSOLE_DEFAULT_COLOR 0x7
// Memory manager
#define KERNEL_HEAP_START 0xC0000000
#define KERNEL_HEAP_END 0xCFFFF000
#define KERNEL_HEAP_INITIAL_SIZE 0x100000
#endif /* SETTINGS_H_ */

View File

@ -1,17 +1,9 @@
#ifndef __STDARG_H #ifndef __STDARG__H
#define __STDARG_H #define __STDARG__H
/******************************
* [filename] *
* - [description] *
******************************/
// INTERFACE REQUIRED HEADERS
#include <va_list.h> #include <va_list.h>
// INTERFACE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {

29
Kernel/include/stdio.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef __STDIO__H
#define __STDIO__H
#include <types.h>
#define inb(port) inportb(port)
#define outb(port) outportb(port)
extern uint8 inportb (uint16 _port);
static inline void outportb (uint16 _port, uint8 _data) {
asm volatile ("outb %1, %0" : : "dN" (_port), "a" (_data));
}
static inline void iowait() {
asm volatile ("outb %al, $0x80");
}
static inline void MagicBreakpoint()
{
asm volatile ("xchg %bx, %bx");
}
extern void SystemReboot();
extern Key ReadKey();
extern KeyEvent ReadKeyEvent();
#endif

69
Kernel/include/stdlib.h Normal file
View File

@ -0,0 +1,69 @@
#ifndef __STDLIB__H
#define __STDLIB__H
#include <types.h>
#define IsDigit(c) (c >= '0' && c <= '9')
#define IsHexDigit(c) ( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') )
#define IsUpper(c) (c >= 'A' && c <= 'Z')
#define IsLower(c) (c >= 'a' && c <= 'z')
#define IsAlpha(c) (IsLower(c) || IsUpper(c))
#define IsAlphaNum(c) (IsAlpha(c) || IsDigit(c))
#define ToLower(c) ((IsUpper(c)) ? (c - 'A' + 'a') : c)
#define ToUpper(c) ((IsLower(c)) ? (c - 'a' + 'A') : c)
#define Max(a,b) ((a > b) ? (a) : (b))
#define Min(a,b) ((a < b) ? (a) : (b))
#define Abs(a) ((a < 0) ? (a * -1) : (a))
/***************************************************
* String operations: len, cmp, cpy *
***************************************************/
extern uint32 strlen (string s);
extern int32 strcmp (string a, string b);
extern string strcpy (string s1, const string s2);
/***************************************************
* Number operations: len *
***************************************************/
extern uint32 numlen (int32 number, int32 base);
extern uint32 unumlen (uint32 number, int32 base);
/***************************************************
* Memory operations: cpy, cmp, set *
***************************************************/
void* memcpy (void *dest, const void *src, uint32 count);
int32 memcmp (const void *s1, const void *s2, uint32 count);
void* memset (void *dest, uint8 val, uint32 count);
/***************************************************
* Conversion operations: num-str/str-num *
***************************************************/
extern int32 ConvertIntToString (string buffer, int32 number, int32 base);
extern uint32 ConvertUIntToString (string buffer, uint32 number, int32 base);
extern int32 ConvertStringToInt (string buffer);
extern uint32 ConvertStringToUInt (string buffer);
extern uint32 ConvertStringToIntHex (string buffer);
/***************************************************
* Ordered array implementation *
***************************************************/
typedef int (*ComparePredicate) (uint32, uint32);
typedef struct {
uint32* Data;
uint32 Size;
uint32 SizeLimit;
ComparePredicate Compare;
} OrderedArray;
extern OrderedArray OrderedArrayCreate (uint32 maxSize, ComparePredicate p);
extern OrderedArray OrderedArrayPlace (uint32 addr, uint32 maxSize, ComparePredicate p);
extern void OrderedArrayDispose (OrderedArray* arr);
extern uint32 OrderedArraySearch (uint32 key, OrderedArray* arr, ComparePredicate predicate);
extern void OrderedArrayInsert (uint32 item, OrderedArray* arr);
extern uint32 OrderedArrayLookup (uint32 index, OrderedArray* arr);
extern void OrderedArrayDeleteIndex (uint32 index, OrderedArray* arr);
#endif

69
Kernel/include/stdlib.h~ Normal file
View File

@ -0,0 +1,69 @@
#ifndef __STDLIB__H
#define __STDLIB__H
#include <types.h>
#define IsDigit(c) (c >= '0' && c <= '9')
#define IsHexDigit(c) ( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') )
#define IsUpper(c) (c >= 'A' && c <= 'Z')
#define IsLower(c) (c >= 'a' && c <= 'z')
#define IsAlpha(c) (IsLower(c) || IsUpper(c))
#define IsAlphaNum(c) (IsAlpha(c) || IsDigit(c))
#define ToLower(c) ((IsUpper(c)) ? (c - 'A' + 'a') : c)
#define ToUpper(c) ((IsLower(c)) ? (c - 'a' + 'A') : c)
#define Max(a,b) ((a > b) ? (a) : (b))
#define Min(a,b) ((a < b) ? (a) : (b))
#define Abs(a) ((a < 0) ? (a * -1) : (a))
/***************************************************
* String operations: len, cmp, cpy *
***************************************************/
extern uint32 strlen (string s);
extern int32 strcmp (string a, string b);
extern string strcpy (string s1, const string s2);
/***************************************************
* Number operations: len *
***************************************************/
extern uint32 numlen (int32 number, int32 base);
extern uint32 unumlen (uint32 number, int32 base);
/***************************************************
* Memory operations: cpy, cmp, set *
***************************************************/
void* memcpy (void *dest, const void *src, uint32 count);
int32 memcmp (const void *s1, const void *s2, uint32 count);
void* memset (void *dest, uint8 val, uint32 count);
/***************************************************
* Conversion operations: num-str/str-num *
***************************************************/
extern int32 ConvertIntToString (string buffer, int32 number, int32 base);
extern uint32 ConvertUIntToString (string buffer, uint32 number, int32 base);
extern int32 ConvertStringToInt (string buffer);
extern uint32 ConvertStringToUInt (string buffer);
extern uint32 ConvertStringToIntHex (string buffer);
/***************************************************
* Ordered array implementation *
***************************************************/
typedef int (*ComparePredicate) (uint32, uint32);
typedef struct {
uint32* Data;
uint32 Size;
uint32 SizeLimit;
ComparePredicate Compare;
} OrderedArray;
extern OrderedArray OrderedArrayCreate (uint32 maxSize, ComparePredicate p);
extern OrderedArray OrderedArrayPlace (uint32 addr, uint32 maxSize, ComparePredicate p);
extern void OrderedArrayDispose (OrderedArray* arr);
extern uint32 OrderedArraySearch (uint32 key, OrderedArray* arr, ComparePredicate predicate);
extern void OrderedArrayInsert (uint32 item, OrderedArray* arr);
extern uint32 OrderedArrayLookup (uint32 index, OrderedArray* arr);
extern void OrderedArrayDeleteIndex (uint32 index, OrderedArray* arr);
#endif

65
Kernel/include/storage.h Normal file
View File

@ -0,0 +1,65 @@
/*
* storage.h
*
* Created on: Aug 23, 2011
* Author: Tiberiu
*/
#ifndef STORAGE_H_
#define STORAGE_H_
#include <types.h>
// Storage device
typedef struct {
char MountPointName[32];// E.g. "fd0"; you should avoid spaces, or special chars, or otherwise get weird paths like "Mom's floppy\virus.exe"
uint32 DeviceID; // Autocompleted by VFS
uint32 BlockSize; // E.g. sector size
uint32 BlockCount; // How many blocks are loaded in memory per read
/********************************************************
* READ DATA *
* Params: *
* > offset: read starting from block ~ *
* Returns: address to data, NULL for error *
********************************************************/
uint32 (*ReadData) (uint32 offset);
/********************************************************
* WRITE DATA *
* Params: *
* > offset: write starting from block ~ *
* > address: where to write from *
* Returns: NULL for error *
********************************************************/
uint32 (*WriteData) (uint32 offset, uint32 address);
uint32 FileSystemID; // Autocompleted by 'mount'... at least should be
} StorageDevice;
typedef struct {
uint32 FileSystemID; // Autocompleted by VFS
/********************************************************
* DETECT IF THIS IS THE FS ON STORAGE DEVICE *
* Params: *
* > *s: Pointer to device info & routines *
* Returns: positive if match, NULL otherwise *
********************************************************/
uint32 (*Detect) (StorageDevice *s);
uint32 (*Open) (StorageDevice *s, string path);
uint32 (*CreateNode) (StorageDevice *s, string path);
uint32 (*DeleteNode) (StorageDevice *s, string path);
} FileSystem;
extern void ConvertLbaToChs(uint32 SectorsPerTrack, uint32 lba, uint32 *cyl, uint32 *head, uint32 *sector);
#endif /* STORAGE_H_ */

37
Kernel/include/time.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef __TIME__H
#define __TIME__H
#include <types.h>
// User friendly time structure
struct _Time
{
int32 Year;
uint8 Month, WeekDay, Day; // Day starts monday
uint8 Hour, Minute, Second;
uint16 Milisecond;
} __attribute__((packed));
// System time structure
struct _TimeSystem {
uint32 Date, Time;
} __attribute__((packed));
typedef struct _Time Time;
typedef struct _TimeSystem TimeSystem;
extern TimeSystem TimeConvertToTimeSystem (Time t);
extern Time TimeConvertToTime (TimeSystem InternalTime);
extern uint16 TimeCalculateWeekday (Time t);
extern TimeSystem TimeGetInternalTime();
extern uint32 TimeGetInternalFrequency ();
extern void TimeSetInternalTime(TimeSystem t);
extern void TimeSetInternalFrequency (uint32 f);
extern void TimerStart (uint32 ms);
extern uint8 TimerIsDone ();
#endif

267
Kernel/include/types.h Normal file
View File

@ -0,0 +1,267 @@
#ifndef __TYPES__H
#define __TYPES__H
// Get rid of annoying unused params warnings
#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif
/****************************************
* NULL constant *
****************************************/
#define null 0
#define NULL 0
/****************************************
* Int definitions *
****************************************/
typedef signed char int8;
typedef unsigned char uint8;
typedef short int16;
typedef unsigned short uint16;
typedef int int32;
typedef unsigned uint32;
typedef long long int64;
typedef unsigned long long uint64;
/****************************************
* Limits definitions *
****************************************/
#define INT8_MIN (-128)
#define INT16_MIN (-32768)
#define INT32_MIN (-2147483647 - 1)
#define INT64_MIN (-9223372036854775807LL - 1)
#define INT8_MAX 127
#define INT16_MAX 32767
#define INT32_MAX 2147483647
#define INT64_MAX 9223372036854775807LL
#define UINT8_MAX 0xff /* 255U */
#define UINT16_MAX 0xffff /* 65535U */
#define UINT32_MAX 0xffffffff /* 4294967295U */
#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */
/****************************************
* Registers *
****************************************/
// 32 bit registers
typedef struct {
uint32 eax, ebx, ecx, edx, esi, edi, ebp, esp, eflags;
uint8 cflag;
} _R32BIT;
// 16 bit registers
typedef struct {
uint16 ax, bx, cx, dx, si, di, bp, sp, es, cs, ss, ds, flags;
uint8 cflag;
} _R16BIT ;
// 16 bit registers expressed in 32 bit registers
typedef struct {
uint16 ax, axh, bx, bxh, cx, cxh, dx, dxh;
uint16 si, di, bp, sp, es, cs, ss, ds, flags;
uint8 cflags;
} _R16BIT32 ;
// 8 bit registers
typedef struct {
uint8 al, ah, bl, bh, cl, ch, dl, dh;
} _R8BIT;
// 8 bit registers expressed in 32 bit registers
typedef struct {
uint8 al, ah; uint16 axh;
uint8 bl, bh; uint16 bxh;
uint8 cl, ch; uint16 cxh;
uint8 dl, dh; uint16 dxh;
} _R8BIT32;
// 8 and 16 bit registers union
typedef union {
_R16BIT x;
_R8BIT h;
}_INTR16;
// 32 bit, 16 bit and 8 bit registers union
typedef union {
_R32BIT x;
_R16BIT32 l;
_R8BIT32 h;
} _INTR32;
/* This defines what the stack looks like after an ISR was running */
typedef struct
{
uint32 gs, fs, es, ds; /* pushed the segs last */
uint32 edi, esi, ebp, esp, ebx, edx, ecx, eax; /* pushed by 'pusha' */
uint32 int_no, err_code; /* our 'push byte #' and ecodes do this */
uint32 eip, cs, eflags, useresp, ss; /* pushed by the processor automatically */
} _RegsStack32;
/****************************************
* Keyboard data types *
****************************************/
enum KeyboardKeys {
KeyboardKeyF9 = 0x01,
KeyboardKeyF7 = 0x02,
KeyboardKeyF5 = 0x03,
KeyboardKeyF3 = 0x04,
KeyboardKeyF1 = 0x05,
KeyboardKeyF2 = 0x06,
KeyboardKeyF12 = 0x07,
KeyboardKeyMediaNext = 0x08,
KeyboardKeyF10 = 0x09,
KeyboardKeyF8 = 0x0A,
KeyboardKeyF6 = 0x0B,
KeyboardKeyF4 = 0x0C,
KeyboardKeyTab = 0x0D,
KeyboardKeyTilda = 0x0E,
KeyboardKeyMediaPrevious = 0x0F,
KeyboardKeyMediaStop = 0x10,
KeyboardKeyLeftAlt = 0x11,
KeyboardKeyLeftShift = 0x12,
KeyboardKeyMediaPause = 0x13,
KeyboardKeyLeftCtrl = 0x14,
KeyboardKeyQ = 0x15,
KeyboardKey1 = 0x16,
KeyboardKeyMediaVolUp = 0x17,
KeyboardKeyMediaVolDown = 0x18,
KeyboardKeyMediaSelect = 0x19,
KeyboardKeyZ = 0x1A,
KeyboardKeyS = 0x1B,
KeyboardKeyA = 0x1C,
KeyboardKeyW = 0x1D,
KeyboardKey2 = 0x1E,
KeyboardKeyLeftWin = 0x1F,
KeyboardKeyMediaEmail = 0x20,
KeyboardKeyC = 0x21,
KeyboardKeyX = 0x22,
KeyboardKeyD = 0x23,
KeyboardKeyE = 0x24,
KeyboardKey4 = 0x25,
KeyboardKey3 = 0x26,
KeyboardKeyRightWin = 0x27,
KeyboardKeyMediaCalculator = 0x28,
KeyboardKeySpace = 0x29,
KeyboardKeyV = 0x2A,
KeyboardKeyF = 0x2B,
KeyboardKeyT = 0x2C,
KeyboardKeyR = 0x2D,
KeyboardKey5 = 0x2E,
KeyboardKeyMenu = 0x2F,
KeyboardKeyMediaComputer = 0x30,
KeyboardKeyN = 0x31,
KeyboardKeyB = 0x32,
KeyboardKeyH = 0x33,
KeyboardKeyG = 0x34,
KeyboardKeyY = 0x35,
KeyboardKey6 = 0x36,
KeyboardKeyPower = 0x37,
KeyboardKeyMediaWebSearch = 0x38,
KeyboardKeyMediaWebHome = 0x39,
KeyboardKeyM = 0x3A,
KeyboardKeyJ = 0x3B,
KeyboardKeyU = 0x3C,
KeyboardKey7 = 0x3D,
KeyboardKey8 = 0x3E,
KeyboardKeySleep = 0x3F,
KeyboardKeyWake = 0x40,
KeyboardKeyComma = 0x41,
KeyboardKeyK = 0x42,
KeyboardKeyI = 0x43,
KeyboardKeyO = 0x44,
KeyboardKey0 = 0x45,
KeyboardKey9 = 0x46,
KeyboardKeyMediaWebBack = 0x47,
KeyboardKeyMediaWebForward = 0x48,
KeyboardKeyPeriod = 0x49,
KeyboardKeySlash = 0x4A,
KeyboardKeyL = 0x4B,
KeyboardKeySemicolon = 0x4C,
KeyboardKeyP = 0x4D,
KeyboardKeyDash = 0x4E,
KeyboardKeyMediaWebStop = 0x4F,
KeyboardKeyMediaWebRefresh = 0x50,
KeyboardKeyMediaWebFavorites = 0x51,
KeyboardKeyApostrophe = 0x52,
KeyboardKeyRightAlt = 0x53,
KeyboardKeyLeftBracket = 0x54,
KeyboardKeyEqual = 0x55,
KeyboardKeyPrintScreen = 0x56,
KeyboardKeyPause = 0x57,
KeyboardKeyCapsLock = 0x58,
KeyboardKeyRightShift = 0x59,
KeyboardKeyReturn = 0x5A,
KeyboardKeyRightBracket = 0x5B,
KeyboardKeyRightCtrl = 0x5C,
KeyboardKeyBackSlash = 0x5D,
KeyboardKeyInsert = 0x5E,
KeyboardKeyDelete = 0x5F,
KeyboardKeyHome = 0x60,
KeyboardKeyEnd = 0x61,
KeyboardKeyPageUp = 0x62,
KeyboardKeyPageDown = 0x63,
KeyboardKeyLeft = 0x64,
KeyboardKeyDown = 0x65,
KeyboardKeyBackspace = 0x66,
KeyboardKeyRight = 0x67,
KeyboardKeyUp = 0x68,
KeyboardKeyNumpad1 = 0x69,
KeyboardKeyNumpadSlash = 0x6A,
KeyboardKeyNumpad4 = 0x6B,
KeyboardKeyNumpad7 = 0x6C,
KeyboardKeyNumpadEnter = 0x6D,
KeyboardKeyMediaMute = 0x6E,
KeyboardKeyNumpad0 = 0x70,
KeyboardKeyNumpadColon = 0x71,
KeyboardKeyNumpad2 = 0x72,
KeyboardKeyNumpad5 = 0x73,
KeyboardKeyNumpad6 = 0x74,
KeyboardKeyNumpad8 = 0x75,
KeyboardKeyEscape = 0x76,
KeyboardKeyNumLock = 0x77,
KeyboardKeyF11 = 0x78,
KeyboardKeyNumpadPlus = 0x79,
KeyboardKeyNumpad3 = 0x7A,
KeyboardKeyNumpadMinus = 0x7B,
KeyboardKeyNumpadAsterisk = 0x7C,
KeyboardKeyNumpad9 = 0x7D,
KeyboardKeyScrollLock = 0x7E
};
typedef struct {
char Character;
uint8 Scancode;
} Key;
typedef struct {
uint8 Pressed;
char Character;
uint8 Scancode;
} KeyEvent;
/****************************************
* Other data types *
****************************************/
typedef struct {
int32 X, Y;
} Point;
typedef struct
{
uint32 X, Y;
} UPoint;
typedef char* string;
#endif

17
Kernel/include/va_list.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef __VA_LIST__H
#define __VA_LIST__H
#ifdef __cplusplus
extern "C"
{
#endif
/* va list parameter list */
typedef unsigned char *va_list;
#ifdef __cplusplus
}
#endif
#endif

1
Kernel/include/version.h Normal file
View File

@ -0,0 +1 @@
#define OS_BUILD "0.1.0.450"

View File

@ -0,0 +1 @@
-e #define OS_BUILD "0.1.0.418"

View File

@ -0,0 +1,84 @@
/*
* memory_alloc.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <memory-add.h>
extern uint32 mem_kernel_end;
extern uint8 mem_initialized;
// Used prior to proper initialization
uint32 _malloc_init1 (uint32 size, uint8 page_aligned)
{
uint32 ret = mem_kernel_end;
if (page_aligned && (ret & 0xfff)) ret = (ret & 0xfffff000) + 0x1000;
mem_kernel_end = size + ret;
LogMem("%#Allocated %u bytes (%spage aligned) at end of kernel (0x%x).\n", ColorLightMagenta, size, ((page_aligned) ? "" : "not "), ret);
return (ret);
}
uint32 _malloc_init2 (uint32 size, uint8 page_aligned, uint32* phys)
{
uint32 ret = MemHeapAlloc(size, page_aligned, KernelHeap, KernelDirectory);
if (phys)
{
Page *pg = PagingGetPage(ret, 0, KernelDirectory);
*phys = (*pg & PageFrame) + (ret & 0xFFF);
LogMem("%#Allocated %u bytes (%spage aligned) at address 0x%x (phys=%x).\n", ColorLightMagenta, size, ((page_aligned) ? "" : "not "), ret, *phys);
}
else {
LogMem("%#Allocated %u bytes (%spage aligned) at address 0x%x.\n", ColorLightMagenta, size, ((page_aligned) ? "" : "not "), ret);
}
return ret;
}
// Allocate 'size' bytes
void* kmalloc (uint32 size)
{
if (!mem_initialized) return 0;
if (mem_initialized == 1) return (void*)_malloc_init1(size, 0);
return (void*)_malloc_init2(size,0,0);
}
// Allocate 'size' bytes, page aligned
void* kmalloc_a(uint32 size)
{
if (!mem_initialized) return 0;
if (mem_initialized == 1) return (void*)_malloc_init1(size, 1);
return (void*)_malloc_init2(size,1,0);
}
void* kmalloc_p(uint32 size, uint32* phys)
{
if (!mem_initialized) return 0;
if (mem_initialized == 1) {
*phys = _malloc_init1(size,0);
return (void*)(*phys);
}
return (void*)_malloc_init2(size,0,phys);
}
void* kmalloc_ap(uint32 size, uint32* phys)
{
if (!mem_initialized) return 0;
uint32 ret;
if (mem_initialized == 1) {
*phys = ret = _malloc_init1(size,1);
}
else ret = _malloc_init2(size,1,phys);
return (void*)ret;
}

View File

@ -0,0 +1,87 @@
/*
* memory_alloc.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <memory-add.h>
extern uint32 mem_kernel_end;
extern uint8 mem_initialized;
// Used prior to proper initialization
uint32 _malloc_init1 (uint32 size, uint8 page_aligned)
{
uint32 ret = mem_kernel_end;
if (page_aligned && (ret & 0xfff)) ret = (ret & 0xfffff000) + 0x1000;
mem_kernel_end = size + ret;
LogMem("%#Allocated %u bytes (%spage aligned) at end of kernel (0x%x).\n", ColorLightMagenta, size, ((page_aligned) ? "" : "not "), ret);
return (ret);
}
uint32 _malloc_init2 (uint32 size, uint8 page_aligned, uint32* phys)
{
uint32 ret = MemHeapAlloc(size, page_aligned, KernelHeap, KernelDirectory);
if (phys)
{
Page *pg = PagingGetPage(ret, 0, KernelDirectory);
*phys = (*pg & PageFrame) + (ret & 0xFFF);
LogMem("%#Allocated %u bytes (%spage aligned) at address 0x%x (phys=%x).\n", ColorLightMagenta, size, ((page_aligned) ? "" : "not "), ret, *phys);
}
else {
LogMem("%#Allocated %u bytes (%spage aligned) at address 0x%x.\n", ColorLightMagenta, size, ((page_aligned) ? "" : "not "), ret);
}
return ret;
}
// Allocate 'size' bytes
void* kmalloc (uint32 size)
{
if (!mem_initialized) return 0;
if (mem_initialized == 1) return (void*)_malloc_init1(size, 0);
return (void*)_malloc_init2(size,0,0);
}
// Allocate 'size' bytes, page aligned
void* kmalloc_a(uint32 size)
{
if (!mem_initialized) return 0;
if (mem_initialized == 1) return (void*)_malloc_init1(size, 1);
return (void*)_malloc_init2(size,1,0);
}
void* kmalloc_p(uint32 size, uint32* phys)
{
if (!mem_initialized) return 0;
if (mem_initialized == 1) {
*phys = _malloc_init1(size,0);
return (void*)(*phys);
}
return (void*)_malloc_init2(size,0,phys);
}
void* kmalloc_ap(uint32 size, uint32* phys)
{
if (!mem_initialized) return 0;
uint32 ret;
if (mem_initialized == 1) {
*phys = ret = _malloc_init1(size,1);
}
else ret = _malloc_init2(size,1,phys);
LogMem("%#kmalloc_ap requested, returned 0x%x, phys = 0x%x.\n", ColorMagenta, ret, *phys);
return (void*)ret;
}

View File

@ -0,0 +1,20 @@
/*
* memory_free.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <memory-add.h>
extern uint8 mem_initialized;
void kfree(void* addr)
{
if (mem_initialized < 2) {
ErrorMem("%#Tried to free at address 0x%x when memory manager is uninitialized.\n", ColorLightRed, (uint32)addr);
return;
}
MemHeapFree((uint32)addr, KernelHeap, KernelDirectory);
}

View File

@ -0,0 +1,48 @@
/*
* memory_info.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <memory-add.h>
// MemoryGetFree(), MemoryGetTotal(), MemoryGet blah blah...
// Returns total physical memory in bytes
uint32 MemoryGetTotal()
{
return (TotalMemory);
}
// Returns total free physical memory in bytes
uint32 MemoryGetFree()
{
return (TotalFrames - UsedFrames) * 0x4;
}
// Total used physical memory in bytes
uint32 MemoryGetUsed()
{
return UsedFrames * 0x4;
}
// Same as above functions, but in frames
uint32 MemoryGetFrameSize()
{
return 0x4;
}
uint32 MemoryGetFramesTotal()
{
return TotalFrames;
}
uint32 MemoryGetFramesUsed()
{
return UsedFrames;
}
uint32 MemoryGetFramesFree()
{
return (TotalFrames - UsedFrames);
}

View File

@ -0,0 +1,48 @@
/*
* memory_info.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <memory-add.h>
// MemoryGetFree(), MemoryGetTotal(), MemoryGet blah blah...
// Returns total physical memory in bytes
uint32 MemoryGetTotal()
{
return (TotalMemory);
}
// Returns total free physical memory in bytes
uint32 MemoryGetFree()
{
return (TotalFrames - UsedFrames) * 0x4;
}
// Total used physical memory in bytes
uint32 MemoryGetUsed()
{
return UsedFrames * 0x4;
}
// Same as above functions, but in frames
uint32 MemoryGetFrameSize()
{
return 0x1000;
}
uint32 MemoryGetFramesTotal()
{
return TotalFrames;
}
uint32 MemoryGetFramesUsed()
{
return UsedFrames;
}
uint32 MemoryGetFramesFree()
{
return (TotalFrames - UsedFrames);
}

View File

@ -0,0 +1,88 @@
/*
* memory-init.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <memory-add.h>
#include <multiboot.h>
#include <debugio.h>
#include "../../drivers/cmos/cmos.h"
#include <stdio.h>
uint32 mem_kernel_end = 0;
uint8 mem_initialized = 0;
uint32 _memory_get_total_mem(MultibootInfo* info)
{
// Grub was nice enough to give us info
if (info->Flags & MultibootInfo_MEMORY) return (1024 + info->MemoryUpper);
// No? Get info from CMOS
uint8 low, high;
uint32 total;
low = CmosRead(0x30);
high = CmosRead(0x31);
total = (uint32)(low | high<<8) + 1024;
ErrorMem("%#Missing memory info from bootloader. Reading from CMOS: %ukb\n", ColorLightRed, total);
return total;
}
void _memory_reserve_system(MultibootInfo* info)
{
MagicBreakpoint();
if ((info->Flags & MultibootInfo_MEM_MAP) != 0)
{
MultibootMemoryMapEntry* location = (MultibootMemoryMapEntry*)info->MemoryMapAddress;
while ((uint32)location < (info->MemoryMapAddress + info->MemoryMapLength))
{
if (location->Type > 1)
MemPhReserveFrames((uint32)location->Address, (uint32)location->Length);
location = (MultibootMemoryMapEntry*) ((uint32)location + location->Size + sizeof(uint32));
}
}
else
{
ErrorMem("%#Missing %#memory map%# info from bootloader.\n", ColorLightRed, ColorWhite, ColorLightRed);
// Standard memory hole at 15mb
MemPhReserveFrames(0x00F00000, 0x00100000);
}
// Standard reserved memory areas
MemPhReserveFrames(0x0, 0x400 + 256); // Real mode IVT, BDA
MemPhReserveFrames(0x1000, 0x2400); // DMA buffer
MemPhReserveFrames(0x9FC00, 385*1024); // EBDA, Video memory, ROM area
}
void MemoryInitialize (MultibootInfo* info)
{
uint32 totalSystemMemory = _memory_get_total_mem(info);
MemPhInitialize(totalSystemMemory);
PagingInitialize(0x200000);
_memory_reserve_system(info);
KernelHeap = MemHeapCreate(KERNEL_HEAP_START, KERNEL_HEAP_START
+ KERNEL_HEAP_INITIAL_SIZE, 0xCFFFF000, 3); // is kernel, writeable
LogMem("Done initializing memory!");
mem_initialized = 2;
}
void MemoryTempInitialize (uint32 kernel_end)
{
mem_initialized = 1;
mem_kernel_end = kernel_end;
LogMem("Initialized temporary memory manager, allocating from %#0x%x.\n", kernel_end);
}

View File

@ -0,0 +1,92 @@
/*
* memory-init.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <memory-add.h>
#include <multiboot.h>
#include <debugio.h>
#include "../../drivers/cmos/cmos.h"
#include <stdio.h>
uint32 mem_kernel_end = 0;
uint8 mem_initialized = 0;
uint32 _memory_get_total_mem(MultibootInfo* info)
{
// Grub was nice enough to give us info
if (info->Flags & MultibootInfo_MEMORY) return (1024 + info->MemoryUpper);
// No? Get info from CMOS
uint8 low, high;
uint32 total;
low = CmosRead(0x30);
high = CmosRead(0x31);
total = (uint32)(low | high<<8) + 1024;
ErrorMem("%#Missing memory info from bootloader. Reading from CMOS: %ukb\n", ColorLightRed, total);
return total;
}
void _memory_reserve_system(MultibootInfo* info)
{
MagicBreakpoint();
if ((info->Flags & MultibootInfo_MEM_MAP) != 0)
{
MultibootMemoryMapEntry* location = (MultibootMemoryMapEntry*)info->MemoryMapAddress;
while ((uint32)location < (info->MemoryMapAddress + info->MemoryMapLength))
{
if (location->Type > 1)
MemPhReserveFrames((uint32)location->Address, (uint32)location->Length);
location = (MultibootMemoryMapEntry*) ((uint32)location + location->Size + sizeof(uint32));
}
}
else
{
ErrorMem("%#Missing %#memory map%# info from bootloader.\n", ColorLightRed, ColorWhite, ColorLightRed);
// Standard memory hole at 15mb
MemPhReserveFrames(0x00F00000, 0x00100000);
}
// Standard reserved memory areas
MemPhReserveFrames(0x0, 0x400 + 256); // Real mode IVT, BDA
MemPhReserveFrames(0x1000, 0x2400); // DMA buffer
MemPhReserveFrames(0x9FC00, 385*1024); // EBDA, Video memory, ROM area
}
void MemoryInitialize (MultibootInfo* info)
{
uint32 totalSystemMemory = _memory_get_total_mem(info);
MemPhInitialize(totalSystemMemory);
PagingInitialize(0x200000);
LogMem("Reserving important areas...\n");
_memory_reserve_system(info);
LogMem("Allocating kernel heap...\n");
KernelHeap = MemHeapCreate(KERNEL_HEAP_START, KERNEL_HEAP_START
+ KERNEL_HEAP_INITIAL_SIZE, 0xCFFFF000, 3); // is kernel, writeable
LogMem("Done initializing memory!");
mem_initialized = 2;
}
void MemoryTempInitialize (uint32 kernel_end)
{
mem_initialized = 1;
mem_kernel_end = kernel_end;
LogMem("Initialized temporary memory manager, allocating from %#0x%x.\n", kernel_end);
}

44
Kernel/library/stdio.c Normal file
View File

@ -0,0 +1,44 @@
#include <stdio.h>
#include "../hal/keyboard/keyboard.h"
uint8 inportb (uint16 _port) {
uint8 rv;
__asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port));
return rv;
}
Key ReadKey()
{
Key key;
do {
KeyboardLastScancode = 0xFF ;
while (KeyboardLastScancode == 0xFF) ;
key.Scancode = KeyboardLastScancode;
} while (KeyboardLastStatus & 1);
if (KeyboardGetKeyStatus(KeyboardKeyLeftShift) || KeyboardGetKeyStatus(KeyboardKeyRightShift))
key.Character = KeyboardMapShift[key.Scancode];
else key.Character = KeyboardMap[key.Scancode];
return key;
}
KeyEvent ReadKeyEvent()
{
KeyEvent key;
KeyboardLastScancode = 0xFF ;
while (KeyboardLastScancode == 0xFF) ;
key.Scancode = KeyboardLastScancode;
key.Pressed = 1 - (KeyboardLastStatus & 1);
if (KeyboardGetKeyStatus(KeyboardKeyLeftShift) || KeyboardGetKeyStatus(KeyboardKeyRightShift))
key.Character = KeyboardMapShift[key.Scancode];
else key.Character = KeyboardMap[key.Scancode];
return key;
}

View File

@ -0,0 +1,100 @@
/*
* convert_ops.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <stdlib.h>
const string _Numbers = "0123456789abcdefghijklmnopqrstuvwxyz";
int32 ConvertIntToString (string buffer, int32 number, int32 base)
{
if (base > 36 || base < 2) return 0;
int32 len = numlen (number, base), beg = 0, i;
uint32 n = (uint32) number;
// If number is negative and in base 10, we put a '-' in front
if (number < 0 && base == 10) buffer[beg++] = '-';
// Put every digit in string
for (i = len-1; i>=beg; i--)
{
buffer[i] = _Numbers[n % base];
n /= base;
}
buffer[len] = 0;
return number;
}
uint32 ConvertUIntToString (string buffer, uint32 number, int32 base)
{
if (base > 36 || base < 2) return 0;
int32 len = unumlen (number, base), i;
// Put every digit in string
for (i = len-1; i >= 0; i--)
{
buffer[i] = _Numbers[number % base];
number /= base;
}
buffer[len] = 0;
return number;
}
int32 ConvertStringToInt (string buffer)
{
int8 negative = (buffer[0] == '-');
int32 pos = (buffer[0] == '-' );
int32 number = 0;
while (IsDigit(buffer[pos]))
{
number = number*10 + (buffer[pos] - '0');
pos++;
}
if (negative) return -number;
return number;
}
uint32 ConvertStringToUInt (string buffer)
{
int32 pos = 0;
int32 number = 0;
while (IsDigit(buffer[pos]))
{
number = number*10 + (buffer[pos] - '0');
pos++;
}
return number;
}
uint32 ConvertStringToIntHex (string buffer)
{
int32 pos = 0;
uint32 number = 0;
// Skip first 2 digits if it is in format 0xXXXX...
if (buffer[1] == 'x' || buffer[1] == 'X') pos = 2;
while (IsHexDigit(buffer[pos]))
{
number = number*0x10;
if (IsDigit(buffer[pos])) number += buffer[pos] - '0';
else if (buffer[pos] >= 'a' && buffer[pos] <= 'f') number += 10 + buffer[pos] - 'a';
else if (buffer[pos] >= 'A' && buffer[pos] <= 'F') number += 10 + buffer[pos] - 'A';
pos++;
}
return number;
}

View File

@ -0,0 +1,42 @@
/*
* mem_ops.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <types.h>
void *memcpy(void *dest, const void *src, uint32 count)
{
uint8* d = (uint8*) dest;
const uint8* s = (const uint8*) src;
while (count-- != 0)
*d++ = *s++;
return dest;
}
int32 memcmp(const void *s1, const void *s2, uint32 count)
{
const uint8 *us1 = (const uint8*) s1;
const uint8 *us2 = (const uint8*) s2;
while (count-- != 0)
{
if (*us1 != *us2) return (*us1 < *us2) ? -1 : 1;
us1++; us2++;
}
return 0;
}
void *memset(void *dest, uint8 val, uint32 count)
{
uint8 *temp = (uint8 *)dest;
while (count-- != 0)
*temp++ = val;
return dest;
}

View File

@ -0,0 +1,39 @@
/*
* num_ops.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <types.h>
uint32 numlen (int32 number, int32 base)
{
// Sanity check
if (base < 2) return 0;
uint32 len = (number < 0 && base == 10); // add minus sign
if (number == 0) return 1;
while (number) {
number /= base;
++len;
}
return len;
}
uint32 unumlen (uint32 number, int32 base)
{
// Sanity check
if (base < 2) return 0;
uint32 len = 0;
if (number == 0) return 1;
while (number) {
number /= base;
++len;
}
return len;
}

View File

@ -0,0 +1,112 @@
/*
* ord-arr.c
*
* Created on: Aug 25, 2011
* Author: Tiberiu
*/
/*
* memory.c
*
* Created on: Aug 24, 2011
* Author: Tiberiu
*/
#include <stdlib.h>
#include <memory.h>
int StandardComparePredicate (uint32 a, uint32 b)
{
if (a > b) return 1;
else if (a == b) return 0;
return -1;
}
OrderedArray OrderedArrayCreate (uint32 maxSize, ComparePredicate p)
{
OrderedArray ret;
ret.Data = (unsigned*) kmalloc(maxSize);
memset(ret.Data, 0, maxSize);
ret.Size = 0;
ret.SizeLimit = maxSize;
ret.Compare = (p == 0) ? StandardComparePredicate : p;
return ret;
}
OrderedArray OrderedArrayPlace (uint32 addr, uint32 maxSize, ComparePredicate p)
{
OrderedArray ret;
ret.Data = (unsigned*)addr;
memset(ret.Data, 0, maxSize);
ret.Size = 0;
ret.SizeLimit = maxSize;
ret.Compare = (p == 0) ? StandardComparePredicate : p;
return ret;
}
void OrderedArrayDispose (OrderedArray* arr)
{
kfree(arr->Data);
}
uint32 OrderedArrayBinarySearch (uint32 key, uint32* array, uint32 length, ComparePredicate predicate)
{
if (!predicate) return 0;
uint32 left = 0, right = length, mid;
while (left < right)
{
mid = left + (right-left) / 2;
int r = (*predicate)(key, array[mid]);
if (r > 0) left = mid + 1;
else if (r < 0) right = mid;
else return mid;
}
mid = left + (right-left) / 2;
return mid;
}
uint32 OrderedArraySearch (uint32 key, OrderedArray* arr, ComparePredicate predicate)
{
uint32 r = OrderedArrayBinarySearch(key,arr->Data,arr->Size,predicate);
if (arr->Data[r] != key) return 0xffffffff;
return r;
}
void OrderedArrayInsert (uint32 item, OrderedArray* arr)
{
if (arr->Size >= arr->SizeLimit) return;
uint32 location = OrderedArrayBinarySearch(item, arr->Data, arr->Size, arr->Compare);
uint32 i;
for (i = arr->Size; i > location && arr->Size > 0; i--)
arr->Data[i] = arr->Data[i-1];
arr->Data[location] = item;
arr->Size++;
}
uint32 OrderedArrayLookup (uint32 index, OrderedArray* arr)
{
if (index >= arr->Size) return 0;
return arr->Data[index];
}
void OrderedArrayDeleteIndex (uint32 index, OrderedArray* arr)
{
if (index >= arr->Size) return;
uint32 i;
for (i = index + 1; i < arr->Size; i++)
arr->Data[i - 1] = arr->Data[i];
arr->Size--;
}

View File

@ -0,0 +1,39 @@
/*
* str_ops.c
*
* Created on: Aug 27, 2011
* Author: Tiberiu
*/
#include <types.h>
uint32 strlen (string s)
{
string end = s;
while (*end != '\0')
end++;
return (uint32)(end - s);
}
int32 strcmp (string a, string b)
{
unsigned char c1, c2;
while (*a != '\0' && *b != '\0' && *a == *b) {
a++; b++;
}
c1 = (*(unsigned char*) a);
c2 = (*(unsigned char*) b);
return ((c1 < c2) ? -1 : (c1 > c2));
}
string strcpy (string s1, const string s2)
{
char *dst = s1;
const char *src = s2;
while ((*dst++ = *src++) != '\0') ;
return s1;
}

18
Kernel/library/storage.c Normal file
View File

@ -0,0 +1,18 @@
/*
* storage.c
*
* Created on: Aug 23, 2011
* Author: Tiberiu
*/
#include <storage.h>
void ConvertLbaToChs(uint32 SectorsPerTrack, uint32 lba, uint32 *cyl, uint32 *head, uint32 *sector)
{
// Avoid division by 0
if (SectorsPerTrack == 0) return;
*head = (lba % (SectorsPerTrack * 2)) / SectorsPerTrack;
*cyl = lba / (SectorsPerTrack * 2);
*sector = lba % SectorsPerTrack + 1;
}

98
Kernel/library/time.c Normal file
View File

@ -0,0 +1,98 @@
#include <time.h>
extern volatile TimeSystem _internal_time;
extern uint32 _internal_frequency_hz;
// Length of months (summed)
const int16 MonthLen[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
TimeSystem TimeConvertToTimeSystem (Time t)
{
TimeSystem sys = {0,0};
t.Year--; t.Month--; t.Day--; t.WeekDay--;
sys.Time = (uint32)(t.Hour * 3600000) + (uint32)(t.Minute * 60000) + (uint32)(t.Second * 1000) + (uint32)t.Milisecond;
if (t.Year < 0) return sys;
sys.Date = (uint32)(t.Day) + (uint32)(MonthLen[t.Month])
+ (uint32)((t.Year/4) * (365*4 + 1)) + (uint32)(t.Year%4 * 365);
return sys;
}
Time TimeConvertToTime (TimeSystem InternalTime)
{
Time t;
t.Milisecond = InternalTime.Time % 1000;
t.Second = (InternalTime.Time / 1000) % 60;
t.Minute = (InternalTime.Time / 60000) % 60;
t.Hour = (InternalTime.Time / 3600000);
uint32 DayOfYear = (InternalTime.Date % 1461) % 365;
t.Year = (InternalTime.Date / 1461)*4 + (InternalTime.Date % 1461)/365 + 1;
t.Month = 11;
while ((int32)DayOfYear < (MonthLen[t.Month] + (t.Year % 4 == 0 && t.Month>1))) t.Month--;
t.WeekDay = InternalTime.Date % 7;
t.Day = DayOfYear - MonthLen[t.Month] - (t.Year % 4 == 0 && t.Month>1);
t.Month++; t.WeekDay++; t.Day++;
return t;
}
uint16 TimeCalculateWeekday (Time t)
{
t.Year--;
uint32 d = (uint32)(t.Day-1) + (uint32)(MonthLen[t.Month-1]) +
+ (uint32)((t.Year/4) * (365*4 + 1)) + (uint32)(t.Year%4 * 365);
return 1 + (d%7);
}
TimeSystem TimeGetInternalTime()
{
return _internal_time;
}
void TimeSetInternalTime(TimeSystem t)
{
_internal_time = t;
}
uint32 TimeGetInternalFrequency ()
{
return _internal_frequency_hz;
}
void TimeSetInternalFrequency (uint32 f)
{
_internal_frequency_hz = f;
}
TimeSystem _timer;
#define MILISECONDS_IN_DAY 86400000
void TimerStart (uint32 ms)
{
_timer = TimeGetInternalTime();
_timer.Time += ms;
if (_timer.Time >= MILISECONDS_IN_DAY)
{
_timer.Date++;
_timer.Time-=MILISECONDS_IN_DAY;
}
}
uint8 TimerIsDone ()
{
TimeSystem now = TimeGetInternalTime();
if (_timer.Date >= now.Date && _timer.Time > now.Time) return 0;
return 1;
}

98
Kernel/loader.asm Normal file
View File

@ -0,0 +1,98 @@
bits 32
global start
; multiboot header
MODULEALIGN equ 1<<0
MEMINFO equ 1<<1
VIDEOINFO equ 1<<2
FLAGS equ MODULEALIGN | MEMINFO | VIDEOINFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
align 4
section .__mbHeader
MultiBootHeader:
dd MAGIC
dd FLAGS
dd CHECKSUM
section .text
STACKSIZE equ 0x4000 ; that's 16k.
start:
XCHG BX, BX ; magic breakpoint
mov ecx, eax
; lgdt [trickgdt]
; mov ax, 0x10;
; mov ds, ax
; mov es, ax
; mov fs, ax
; mov gs, ax
; mov ss, ax
; jmp 0x08:HigherHalf ; NOTE: Must be absolute jump!
HigherHalf:
; Verify booted with multiboot compliant bootloader
mov esp, stack+STACKSIZE
cmp ecx, 0x2BADB002
jne .bad
push ebx
extern k_main
call k_main
; Show error message, and halt system
.bad:
extern ConsoleClear
extern ConsoleWrite
extern CommandOsver
call ConsoleClear
call CommandOsver
mov eax, [ErrorColor]
push eax
push ErrorString
call ConsoleWrite
cli
hlt
; some variables
ErrorString db 0xA, "%#! Fatal error: Not booted with multiboot compliant bootloader (e.g. GRUB).", 0x0
ErrorColor db 0x0C
; tells the assembler to include this data in the '.setup' section
section .setup
trickgdt:
dw gdt_end - gdt - 1 ; size of the GDT
dd gdt ; linear address of GDT
gdt:
dd 0, 0 ; null gate
db 0xFF, 0xFF, 0, 0, 0, 10011010b, 11001111b, 0x40 ; code selector 0x08: base 0x40000000, limit 0xFFFFFFFF, type 0x9A, granularity 0xCF
db 0xFF, 0xFF, 0, 0, 0, 10010010b, 11001111b, 0x40 ; data selector 0x10: base 0x40000000, limit 0xFFFFFFFF, type 0x92, granularity 0xCF
gdt_end:
; stack
section .bss
align 32
stack:
resb STACKSIZE ; This reserves 64KBytes of memory here

Some files were not shown because too many files have changed in this diff Show More