Sfoglia il codice sorgente

* Fix indentation and add licensing and copyright headers to kernel

tags/v0.99.beta17
Jean-Yves Lamoureux jylam 15 anni fa
parent
commit
b814e2fcaf
19 ha cambiato i file con 824 aggiunte e 496 eliminazioni
  1. +87
    -64
      kernel/boot/gdt.c
  2. +93
    -71
      kernel/boot/idt.c
  3. +141
    -68
      kernel/boot/interruptions.c
  4. +59
    -40
      kernel/boot/pic.c
  5. +26
    -11
      kernel/boot/stage2.c
  6. +18
    -0
      kernel/boot/stage2.h
  7. +17
    -2
      kernel/drivers/floppy.c
  8. +23
    -5
      kernel/drivers/floppy.h
  9. +113
    -97
      kernel/drivers/keyboard.c
  10. +16
    -1
      kernel/drivers/memory.c
  11. +15
    -0
      kernel/drivers/memory.h
  12. +13
    -5
      kernel/drivers/processor.c
  13. +80
    -62
      kernel/drivers/processor.h
  14. +37
    -31
      kernel/drivers/timer.c
  15. +17
    -1
      kernel/drivers/timer.h
  16. +4
    -9
      kernel/kernel.c
  17. +3
    -7
      kernel/kernel.h
  18. +16
    -0
      kernel/klibc.c
  19. +46
    -22
      kernel/klibc.h

+ 87
- 64
kernel/boot/gdt.c Vedi File

@@ -1,90 +1,115 @@
/*
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

/*
*'freely' inspired by http://jojo.ouvaton.org/dossiers/boot_sector/tutorial02.html
* (actually, that's mostly copied, with minor compilation fixes)
*/
#include "kernel.h"
#include "klibc.h"

#define GDTBASE 0x800 /* Physical address of GDT */
#define GDTSIZE 0xFF /* Maximum table size (in entries) */

/* Segment descriptor */
struct gdtdesc {
u16 lim0_15;
u16 base0_15;
u8 base16_23;
u8 acces;
u8 lim16_19 : 4;
u8 other : 4;
u8 base24_31;
} __attribute__ ((packed));

/* GDTR register */
struct gdtr {
u16 limite ;
u32 base ;
} __attribute__ ((packed));
#define GDTBASE 0x800 /* Physical address of GDT */
#define GDTSIZE 0xFF /* Maximum table size (in entries) */

/* Segment descriptor */
struct gdtdesc
{
u16 lim0_15;
u16 base0_15;
u8 base16_23;
u8 acces;
u8 lim16_19:4;
u8 other:4;
u8 base24_31;
} __attribute__ ((packed));

/* GDTR register */
struct gdtr
{
u16 limite;
u32 base;
} __attribute__ ((packed));
struct gdtr kgdtr;


struct gdtdesc kgdt[GDTSIZE] = {{0, 0, 0, 0, 0, 0, 0}};
struct gdtdesc kgdt[GDTSIZE] = { {0, 0, 0, 0, 0, 0, 0} };

unsigned int kgdtptr = 1;

void init_code_desc(u32 base, u32 limite, struct gdtdesc* desc);
void init_data_desc(u32 base, u32 limite, struct gdtdesc* desc);
void init_code_desc(u32 base, u32 limite, struct gdtdesc *desc);
void init_data_desc(u32 base, u32 limite, struct gdtdesc *desc);
void add_gdt_desc(struct gdtdesc desc);
void init_gdt(void);



void init_gdt_desc(u32 base, u32 limite, u8 acces, u8 other, struct gdtdesc* desc) {
desc->lim0_15 = (limite & 0xffff);
desc->base0_15 = (base & 0xffff);
desc->base16_23 = (base & 0xff0000)>>16;
desc->acces = acces;
desc->lim16_19 = (limite & 0xf0000)>>16;
desc->other = (other & 0xf);
desc->base24_31 = (base & 0xff000000)>>24;
return;
void init_gdt_desc(u32 base, u32 limite, u8 acces, u8 other,
struct gdtdesc *desc)
{
desc->lim0_15 = (limite & 0xffff);
desc->base0_15 = (base & 0xffff);
desc->base16_23 = (base & 0xff0000) >> 16;
desc->acces = acces;
desc->lim16_19 = (limite & 0xf0000) >> 16;
desc->other = (other & 0xf);
desc->base24_31 = (base & 0xff000000) >> 24;
return;
}


void init_code_desc(u32 base, u32 limite, struct gdtdesc* desc) {
init_gdt_desc(base, limite, 0x9B, 0x0D, desc);
void init_code_desc(u32 base, u32 limite, struct gdtdesc *desc)
{
init_gdt_desc(base, limite, 0x9B, 0x0D, desc);
}

void init_data_desc(u32 base, u32 limite, struct gdtdesc* desc) {
init_gdt_desc(base, limite, 0x93, 0x0D, desc);
void init_data_desc(u32 base, u32 limite, struct gdtdesc *desc)
{
init_gdt_desc(base, limite, 0x93, 0x0D, desc);
}

void add_gdt_desc(struct gdtdesc desc) {
kgdt[kgdtptr] = desc;
kgdtptr++;
void add_gdt_desc(struct gdtdesc desc)
{
kgdt[kgdtptr] = desc;
kgdtptr++;
}

void init_gdt(void) {
struct gdtdesc code, data, stack;
/* initialisation des descripteurs de segment */
init_code_desc(0x0, 0xFFFFF, &code);
init_data_desc(0x0, 0xFFFFF, &data);
init_gdt_desc(0, 0x10, 0x97, 0x0D, &stack);
add_gdt_desc(code);
add_gdt_desc(data);
add_gdt_desc(stack);
/* initialisation de la structure pour GDTR */
kgdtr.limite = GDTSIZE*8;
kgdtr.base = GDTBASE;
/* recopie de la GDT a son adresse */
memcpy((void*)kgdtr.base, kgdt, kgdtr.limite);
/* chargement du registre GDTR */
asm("lgdtl (kgdtr)");
/* initialisation des segments */
asm(" movw $0x10,%ax \n \
void init_gdt(void)
{
struct gdtdesc code, data, stack;

/* initialisation des descripteurs de segment */
init_code_desc(0x0, 0xFFFFF, &code);
init_data_desc(0x0, 0xFFFFF, &data);
init_gdt_desc(0, 0x10, 0x97, 0x0D, &stack);
add_gdt_desc(code);
add_gdt_desc(data);
add_gdt_desc(stack);

/* initialisation de la structure pour GDTR */
kgdtr.limite = GDTSIZE * 8;
kgdtr.base = GDTBASE;

/* recopie de la GDT a son adresse */
memcpy((void *)kgdtr.base, kgdt, kgdtr.limite);

/* chargement du registre GDTR */
asm("lgdtl (kgdtr)");

/* initialisation des segments */
asm(" movw $0x10,%ax \n \
movw %ax, %ds \n \
movw %ax, %es \n \
movw %ax, %fs \n \
@@ -97,5 +122,3 @@ void init_gdt(void) {
ljmp $0x08,$next \n \
next: \n");
}



+ 93
- 71
kernel/boot/idt.c Vedi File

@@ -1,34 +1,52 @@
/*
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

/*
*'freely' inspired by http://jojo.ouvaton.org/dossiers/boot_sector/tutorial02.html
* (actually, that's mostly copied, with minor compilation fixes)
*/
#include "kernel.h"
#include "klibc.h"

#define IDTBASE 0 /* GDT Physical address */
#define IDTSIZE 256 /* Max descriptor count */
#define INTGATE 0x8E00 /* Interruptions */
#define TRAPGATE 0x8F00 /* Syscalls */
#define TASKGATE 0x8500 /* Task switching */
#define IDTBASE 0 /* GDT Physical address */
#define IDTSIZE 256 /* Max descriptor count */
#define INTGATE 0x8E00 /* Interruptions */
#define TRAPGATE 0x8F00 /* Syscalls */
#define TASKGATE 0x8500 /* Task switching */

/* segment descriptor */
struct idtdesc {
u16 offset0_15;
u16 select;
struct idtdesc
{
u16 offset0_15;
u16 select;
u16 type;
u16 offset16_31;
} __attribute__ ((packed));
u16 offset16_31;
} __attribute__ ((packed));

/* IDTR register */
struct idtr {
u16 limite;
u32 base;
} __attribute__ ((packed));
struct idtr
{
u16 limite;
u32 base;
} __attribute__ ((packed));

struct idtr kidtr;

/* IDT table */
struct idtdesc kidt[IDTSIZE] = {{0, 0, 0, 0}};
struct idtdesc kidt[IDTSIZE] = { {0, 0, 0, 0} };

/* pointer on a free IDT entry */
unsigned int kidtptr = 0;
@@ -64,69 +82,73 @@ void k_irq7(void);
void k_irq8(void);


void init_idt_desc(u32 offset, u16 select, u16 type, struct idtdesc* desc) {
desc->offset0_15 = (offset & 0xffff);
desc->select = select;
desc->type = type;
desc->offset16_31 = (offset & 0xffff0000) >> 16;
return;
void init_idt_desc(u32 offset, u16 select, u16 type, struct idtdesc *desc)
{
desc->offset0_15 = (offset & 0xffff);
desc->select = select;
desc->type = type;
desc->offset16_31 = (offset & 0xffff0000) >> 16;
return;
}


void add_idt_desc(struct idtdesc desc) {
kidt[kidtptr++] = desc;
return;
void add_idt_desc(struct idtdesc desc)
{
kidt[kidtptr++] = desc;
return;
}


void init_idt(void) {
struct idtdesc desc;
int i;

for(i=0;i<IDTSIZE;i++) {
init_idt_desc((u32)default_int, 0x08, INTGATE, &desc);
add_idt_desc(desc);
}

init_idt_desc((u32)k_int0, 0x08, INTGATE, &kidt[0]);
init_idt_desc((u32)k_int1, 0x08, INTGATE, &kidt[1]);
init_idt_desc((u32)k_int2, 0x08, INTGATE, &kidt[2]);
init_idt_desc((u32)k_int3, 0x08, INTGATE, &kidt[3]);
init_idt_desc((u32)k_int4, 0x08, INTGATE, &kidt[4]);
init_idt_desc((u32)k_int5, 0x08, INTGATE, &kidt[5]);
init_idt_desc((u32)k_int6, 0x08, INTGATE, &kidt[6]);
init_idt_desc((u32)k_int7, 0x08, INTGATE, &kidt[7]);
init_idt_desc((u32)k_int8, 0x08, INTGATE, &kidt[8]);
init_idt_desc((u32)k_int9, 0x08, INTGATE, &kidt[9]);
init_idt_desc((u32)k_int10, 0x08, INTGATE, &kidt[10]);
init_idt_desc((u32)k_int11, 0x08, INTGATE, &kidt[11]);
init_idt_desc((u32)k_int12, 0x08, INTGATE, &kidt[12]);
init_idt_desc((u32)k_int13, 0x08, INTGATE, &kidt[13]);
init_idt_desc((u32)k_int14, 0x08, INTGATE, &kidt[14]);
init_idt_desc((u32)k_int15, 0x08, INTGATE, &kidt[15]);
init_idt_desc((u32)k_int16, 0x08, INTGATE, &kidt[16]);
init_idt_desc((u32)k_int17, 0x08, INTGATE, &kidt[17]);
init_idt_desc((u32)k_int18, 0x08, INTGATE, &kidt[18]);
init_idt_desc((u32)k_irq0, 0x08, INTGATE, &kidt[32]);
init_idt_desc((u32)k_irq1, 0x08, INTGATE, &kidt[33]);
init_idt_desc((u32)k_irq2, 0x08, INTGATE, &kidt[34]);
init_idt_desc((u32)k_irq3, 0x08, INTGATE, &kidt[35]);
init_idt_desc((u32)k_irq4, 0x08, INTGATE, &kidt[36]);
init_idt_desc((u32)k_irq5, 0x08, INTGATE, &kidt[37]);
init_idt_desc((u32)k_irq6, 0x08, INTGATE, &kidt[38]);
init_idt_desc((u32)k_irq7, 0x08, INTGATE, &kidt[39]);
init_idt_desc((u32)k_irq8, 0x08, INTGATE, &kidt[40]);
kidtr.limite = IDTSIZE*8;
kidtr.base = IDTBASE;
memcpy((void*)kidtr.base, kidt, kidtr.limite);
void init_idt(void)
{
struct idtdesc desc;
int i;


for (i = 0; i < IDTSIZE; i++)
{
init_idt_desc((u32) default_int, 0x08, INTGATE, &desc);
add_idt_desc(desc);
}

init_idt_desc((u32) k_int0, 0x08, INTGATE, &kidt[0]);
init_idt_desc((u32) k_int1, 0x08, INTGATE, &kidt[1]);
init_idt_desc((u32) k_int2, 0x08, INTGATE, &kidt[2]);
init_idt_desc((u32) k_int3, 0x08, INTGATE, &kidt[3]);
init_idt_desc((u32) k_int4, 0x08, INTGATE, &kidt[4]);
init_idt_desc((u32) k_int5, 0x08, INTGATE, &kidt[5]);
init_idt_desc((u32) k_int6, 0x08, INTGATE, &kidt[6]);
init_idt_desc((u32) k_int7, 0x08, INTGATE, &kidt[7]);
init_idt_desc((u32) k_int8, 0x08, INTGATE, &kidt[8]);
init_idt_desc((u32) k_int9, 0x08, INTGATE, &kidt[9]);
init_idt_desc((u32) k_int10, 0x08, INTGATE, &kidt[10]);
init_idt_desc((u32) k_int11, 0x08, INTGATE, &kidt[11]);
init_idt_desc((u32) k_int12, 0x08, INTGATE, &kidt[12]);
init_idt_desc((u32) k_int13, 0x08, INTGATE, &kidt[13]);
init_idt_desc((u32) k_int14, 0x08, INTGATE, &kidt[14]);
init_idt_desc((u32) k_int15, 0x08, INTGATE, &kidt[15]);
init_idt_desc((u32) k_int16, 0x08, INTGATE, &kidt[16]);
init_idt_desc((u32) k_int17, 0x08, INTGATE, &kidt[17]);
init_idt_desc((u32) k_int18, 0x08, INTGATE, &kidt[18]);

init_idt_desc((u32) k_irq0, 0x08, INTGATE, &kidt[32]);
init_idt_desc((u32) k_irq1, 0x08, INTGATE, &kidt[33]);
init_idt_desc((u32) k_irq2, 0x08, INTGATE, &kidt[34]);
init_idt_desc((u32) k_irq3, 0x08, INTGATE, &kidt[35]);
init_idt_desc((u32) k_irq4, 0x08, INTGATE, &kidt[36]);
init_idt_desc((u32) k_irq5, 0x08, INTGATE, &kidt[37]);
init_idt_desc((u32) k_irq6, 0x08, INTGATE, &kidt[38]);
init_idt_desc((u32) k_irq7, 0x08, INTGATE, &kidt[39]);
init_idt_desc((u32) k_irq8, 0x08, INTGATE, &kidt[40]);

kidtr.limite = IDTSIZE * 8;
kidtr.base = IDTBASE;

memcpy((void *)kidtr.base, kidt, kidtr.limite);
#define printf(format, ...) { char __str[255]; sprintf (__str, format, __VA_ARGS__); print(__str);}

printf("Loading IDT from 0x%x\n", kidtr);
#undef printf
asm("lidtl (kidtr)");
}
}

+ 141
- 68
kernel/boot/interruptions.c Vedi File

@@ -1,112 +1,185 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/


#include "kernel.h"
#include "klibc.h"
#include "drivers/timer.h"


void idt_default_int(void) {
print("!! Unknown interrupt\n");
void idt_default_int(void)
{
print("!! Unknown interrupt\n");
}

void idt_int0(void) {
print("!! Divide by 0\n ");
void idt_int0(void)
{
print("!! Divide by 0\n ");
}
void idt_int1(void) {
print("!! Debug exception ");

void idt_int1(void)
{
print("!! Debug exception ");
}
void idt_int2(void) {
print("!! NMI ");

void idt_int2(void)
{
print("!! NMI ");
}
void idt_int3(void) {
print("!! Breakpoint ");

void idt_int3(void)
{
print("!! Breakpoint ");
}
void idt_int4(void) {
print("!! Overflow ");

void idt_int4(void)
{
print("!! Overflow ");
}
void idt_int5(void) {
print("!! BoundCheck ");

void idt_int5(void)
{
print("!! BoundCheck ");
}
void idt_int6(void) {
print("!! Invalid Opcode ");

void idt_int6(void)
{
print("!! Invalid Opcode ");
}
void idt_int7(void) {
print("!! Coprocessor not available ");

void idt_int7(void)
{
print("!! Coprocessor not available ");
}
void idt_int8(void) {
print("!! Double Fault ");

void idt_int8(void)
{
print("!! Double Fault ");
}
void idt_int9(void) {
print("!! Coprocessor segment overrun ");

void idt_int9(void)
{
print("!! Coprocessor segment overrun ");
}
void idt_int10(void) {
print("!! Invalid TSS ");

void idt_int10(void)
{
print("!! Invalid TSS ");
}
void idt_int11(void) {
print("!! Segment not present ");

void idt_int11(void)
{
print("!! Segment not present ");
}
void idt_int12(void) {
print("!! Stack exception ");

void idt_int12(void)
{
print("!! Stack exception ");
}
void idt_int13(void) {
print("!! General protection exception ");

void idt_int13(void)
{
print("!! General protection exception ");
}
void idt_int14(void) {
print("!! Page fault ");

void idt_int14(void)
{
print("!! Page fault ");
}
void idt_int15(void) {
print("!! Intel reserved int ");

void idt_int15(void)
{
print("!! Intel reserved int ");
}
void idt_int16(void) {
print("!! Coprocessor error ");

void idt_int16(void)
{
print("!! Coprocessor error ");
}
void idt_int17(void) {
print("!! Intel reserved (2) ");

void idt_int17(void)
{
print("!! Intel reserved (2) ");
}
void idt_int18(void) {
print("i18 ");

void idt_int18(void)
{
print("i18 ");
}


/* Used by Channel0 timer */
void idt_irq0(void) {
void idt_irq0(void)
{
ticks++;
}
void idt_irq2(void) {
print("IRQ 2");

void idt_irq2(void)
{
print("IRQ 2");
}
void idt_irq3(void) {
print("IRQ 3");

void idt_irq3(void)
{
print("IRQ 3");
}
void idt_irq4(void) {
print("IRQ 4");

void idt_irq4(void)
{
print("IRQ 4");
}
void idt_irq5(void) {
print("IRQ 5");

void idt_irq5(void)
{
print("IRQ 5");
}
void idt_irq6(void) {
print("IRQ 6");

void idt_irq6(void)
{
print("IRQ 6");
}
void idt_irq7(void) {
print("IRQ 7");

void idt_irq7(void)
{
print("IRQ 7");
}
void idt_irq8(void) {
print("IRQ 8");

void idt_irq8(void)
{
print("IRQ 8");
}


extern unsigned char kbdmap[];

/* Keyboard irq is 1 */
void kbd_int(void) {
unsigned char i;
do {
i=inb(0x64);
} while((i & 0x01) == 0);
i=inb(0x60);
i--;
if(i<0x80){
putcar(kbdmap[i*4]);
}
}
void kbd_int(void)
{
unsigned char i;
do
{
i = inb(0x64);
}
while ((i & 0x01) == 0);

i = inb(0x60);
i--;

if (i < 0x80)
{
putcar(kbdmap[i * 4]);
}
}

+ 59
- 40
kernel/boot/pic.c Vedi File

@@ -1,3 +1,20 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/


#include "klibc.h"

#define PIC_MASTER_ICW1 0x20
@@ -9,32 +26,32 @@

void init_pic(void)
{
/* MASTER */
outbp(PIC_MASTER_ICW1,0x11); // Init 8259A-1
/* MASTER */
outbp(PIC_MASTER_ICW1, 0x11); // Init 8259A-1
/* ICW2 - start vector = 32 */
outbp(PIC_MASTER_ICW2,0x20); // IRQ 0-7 mapped to 0x20-0x27
outbp(PIC_MASTER_ICW2, 0x20); // IRQ 0-7 mapped to 0x20-0x27
/* IICW3 */
outbp(PIC_MASTER_ICW2,0x04); // 8259A-1 has slave
outbp(PIC_MASTER_ICW2, 0x04); // 8259A-1 has slave
/* ICW4 */
outbp(PIC_MASTER_ICW2,0x01);
outbp(PIC_MASTER_ICW2, 0x01);
/* Int mask */
outbp(PIC_MASTER_ICW2,0xFF);
/* SLAVE */
outbp(PIC_SLAVE_ICW1,0x11);
/* ICW2 - start vector = 96 */
outbp(PIC_SLAVE_ICW2,0x70);
/* ICW3 */
outbp(PIC_SLAVE_ICW2,0x02);
/* ICW4 */
outbp(PIC_SLAVE_ICW2,0x01);
/* Int Mask */
outbp(PIC_SLAVE_ICW2,0xFF);
/* Unmask irqs */
outbp(0x21,0xFD);
outbp(PIC_MASTER_ICW2, 0xFF);
/* SLAVE */
outbp(PIC_SLAVE_ICW1, 0x11);
/* ICW2 - start vector = 96 */
outbp(PIC_SLAVE_ICW2, 0x70);
/* ICW3 */
outbp(PIC_SLAVE_ICW2, 0x02);
/* ICW4 */
outbp(PIC_SLAVE_ICW2, 0x01);
/* Int Mask */
outbp(PIC_SLAVE_ICW2, 0xFF);
/* Unmask irqs */
outbp(0x21, 0xFD);
}

static unsigned int cached_irq_mask = 0xffff;
@@ -45,29 +62,31 @@ static unsigned int cached_irq_mask = 0xffff;

void disable_interrupt(char irq)
{
unsigned int mask = 1 << irq;
cached_irq_mask |= mask;
if (irq & 8) {
outb(0xA1, cached_A1);
} else {
outb(0x21, cached_21);
unsigned int mask = 1 << irq;

cached_irq_mask |= mask;
if (irq & 8)
{
outb(0xA1, cached_A1);
}
else
{
outb(0x21, cached_21);
}
}

void enable_interrupt(char irq)
{
unsigned int mask = ~(1 << irq);
cached_irq_mask &= mask;
if (irq & 8) {
outb(0xA1, cached_A1);
} else {
outb(0x21, cached_21);
unsigned int mask = ~(1 << irq);

cached_irq_mask &= mask;
if (irq & 8)
{
outb(0xA1, cached_A1);
}
else
{
outb(0x21, cached_21);
}

}





+ 26
- 11
kernel/boot/stage2.c Vedi File

@@ -1,19 +1,33 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#include "kernel.h"
#include "klibc.h"

extern int kmain(void);


/* Entry point
* bootsect.asm loaded this file at 0x0100:0x0, which is mapped
* at 0x8:0x1000 (selector+8bytes, offset 1000 (0x100 + 0x0)
*/
/* Entry point bootsect.asm loaded this file at 0x0100:0x0, which is mapped
at 0x8:0x1000 (selector+8bytes, offset 1000 (0x100 + 0x0) */

/* 0x1000 */
void _start(void) {
void _start(void)
{
clearscreen();

clearscreen();
init_gdt();
print("Loading IDT\n");
init_idt();
@@ -21,10 +35,11 @@ void _start(void) {
init_pic();
print("Running kmain()\n");
sti;
kmain(); /* Call kernel's kmain() */
while(1) { /* Never return */
print("hlt;\n");
kmain(); /* Call kernel's kmain() */

while (1)
{ /* Never return */
print("hlt;\n");
}
}


+ 18
- 0
kernel/boot/stage2.h Vedi File

@@ -1 +1,19 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/



extern int _start(void);

+ 17
- 2
kernel/drivers/floppy.c Vedi File

@@ -1,3 +1,18 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#include "kernel.h"
#include "klibc.h"
@@ -20,7 +35,7 @@ int floppy_get_info(struct floppy_info *floppy_info)
"2.88mb 3.5in"
};

memcpy(floppy_info->drive[0].type, drive_type[a],
strlen(drive_type[a]) + 1);
memcpy(floppy_info->drive[1].type, drive_type[b],
@@ -29,7 +44,7 @@ int floppy_get_info(struct floppy_info *floppy_info)
floppy_info->count = 0;
if (a != 0)
floppy_info->count++;
if (b != 0)
if (b != 0)
floppy_info->count++;

return 0;


+ 23
- 5
kernel/drivers/floppy.h Vedi File

@@ -1,14 +1,32 @@
struct floppy_drive {
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

struct floppy_drive
{
char type[16];
u8 status;
u8 status;
};

struct floppy_info {
int count;
struct floppy_info
{
int count;
struct floppy_drive drive[2];
};

int floppy_get_info(struct floppy_info *floppy_info);
void floppy_print_info(struct floppy_info *floppy_info);

int floppy_get_status(void);
int floppy_get_status(void);

+ 113
- 97
kernel/drivers/keyboard.c Vedi File

@@ -1,101 +1,117 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#include "kernel.h"

unsigned char kbdmap[] = {
0x1B, 0x1B, 0x1B, 0x1B, /* esc (0x01) */
'1', '!', '1', '1',
'2', '@', '2', '2',
'3', '#', '3', '3',
'4', '$', '4', '4',
'5', '%', '5', '5',
'6', '^', '6', '6',
'7', '&', '7', '7',
'8', '*', '8', '8',
'9', '(', '9', '9',
'0', ')', '0', '0',
'-', '_', '-', '-',
'=', '+', '=', '=',
0x08, 0x08, 0x7F, 0x08, /* backspace */
0x09, 0x09, 0x09, 0x09, /* tab */
'q', 'Q', 'q', 'q',
'w', 'W', 'w', 'w',
'e', 'E', 'e', 'e',
'r', 'R', 'r', 'r',
't', 'T', 't', 't',
'y', 'Y', 'y', 'y',
'u', 'U', 'u', 'u',
'i', 'I', 'i', 'i',
'o', 'O', 'o', 'o',
'p', 'P', 'p', 'p',
'[', '{', '[', '[',
']', '}', ']', ']',
0x0A, 0x0A, 0x0A, 0x0A, /* enter */
0xFF, 0xFF, 0xFF, 0xFF, /* ctrl */
'a', 'A', 'a', 'a',
's', 'S', 's', 's',
'd', 'D', 'd', 'd',
'f', 'F', 'f', 'f',
'g', 'G', 'g', 'g',
'h', 'H', 'h', 'h',
'j', 'J', 'j', 'j',
'k', 'K', 'k', 'k',
'l', 'L', 'l', 'l',
';', ':', ';', ';',
0x27, 0x22, 0x27, 0x27, /* '" */
'`', '~', '`', '`', /* `~ */
0xFF, 0xFF, 0xFF, 0xFF, /* Lshift (0x2a) */
'\\', '|', '\\', '\\',
'z', 'Z', 'z', 'z',
'x', 'X', 'x', 'x',
'c', 'C', 'c', 'c',
'v', 'V', 'v', 'v',
'b', 'B', 'b', 'b',
'n', 'N', 'n', 'n',
'm', 'M', 'm', 'm',
0x2C, 0x3C, 0x2C, 0x2C, /* ,< */
0x2E, 0x3E, 0x2E, 0x2E, /* .> */
0x2F, 0x3F, 0x2F, 0x2F, /* /? */
0xFF, 0xFF, 0xFF, 0xFF, /* Rshift (0x36) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x37) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x38) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x39) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3a) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3b) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3c) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3d) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3e) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3f) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x40) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x41) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x42) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x43) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x44) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x45) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x46) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x47) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x48) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x49) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4a) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4b) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4c) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4d) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4e) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4f) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x50) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x51) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x52) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x53) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x54) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x55) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x56) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x57) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x58) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x59) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5a) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5b) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5c) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5d) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5e) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5f) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x60) */
0xFF, 0xFF, 0xFF, 0xFF /* (0x61) */
0x1B, 0x1B, 0x1B, 0x1B, /* esc (0x01) */
'1', '!', '1', '1',
'2', '@', '2', '2',
'3', '#', '3', '3',
'4', '$', '4', '4',
'5', '%', '5', '5',
'6', '^', '6', '6',
'7', '&', '7', '7',
'8', '*', '8', '8',
'9', '(', '9', '9',
'0', ')', '0', '0',
'-', '_', '-', '-',
'=', '+', '=', '=',
0x08, 0x08, 0x7F, 0x08, /* backspace */
0x09, 0x09, 0x09, 0x09, /* tab */
'q', 'Q', 'q', 'q',
'w', 'W', 'w', 'w',
'e', 'E', 'e', 'e',
'r', 'R', 'r', 'r',
't', 'T', 't', 't',
'y', 'Y', 'y', 'y',
'u', 'U', 'u', 'u',
'i', 'I', 'i', 'i',
'o', 'O', 'o', 'o',
'p', 'P', 'p', 'p',
'[', '{', '[', '[',
']', '}', ']', ']',
0x0A, 0x0A, 0x0A, 0x0A, /* enter */
0xFF, 0xFF, 0xFF, 0xFF, /* ctrl */
'a', 'A', 'a', 'a',
's', 'S', 's', 's',
'd', 'D', 'd', 'd',
'f', 'F', 'f', 'f',
'g', 'G', 'g', 'g',
'h', 'H', 'h', 'h',
'j', 'J', 'j', 'j',
'k', 'K', 'k', 'k',
'l', 'L', 'l', 'l',
';', ':', ';', ';',
0x27, 0x22, 0x27, 0x27, /* '" */
'`', '~', '`', '`', /* `~ */
0xFF, 0xFF, 0xFF, 0xFF, /* Lshift (0x2a) */
'\\', '|', '\\', '\\',
'z', 'Z', 'z', 'z',
'x', 'X', 'x', 'x',
'c', 'C', 'c', 'c',
'v', 'V', 'v', 'v',
'b', 'B', 'b', 'b',
'n', 'N', 'n', 'n',
'm', 'M', 'm', 'm',
0x2C, 0x3C, 0x2C, 0x2C, /* ,< */
0x2E, 0x3E, 0x2E, 0x2E, /* .> */
0x2F, 0x3F, 0x2F, 0x2F, /* /? */
0xFF, 0xFF, 0xFF, 0xFF, /* Rshift (0x36) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x37) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x38) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x39) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3a) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3b) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3c) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3d) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3e) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x3f) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x40) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x41) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x42) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x43) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x44) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x45) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x46) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x47) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x48) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x49) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4a) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4b) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4c) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4d) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4e) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x4f) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x50) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x51) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x52) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x53) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x54) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x55) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x56) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x57) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x58) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x59) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5a) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5b) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5c) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5d) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5e) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x5f) */
0xFF, 0xFF, 0xFF, 0xFF, /* (0x60) */
0xFF, 0xFF, 0xFF, 0xFF /* (0x61) */
};

+ 16
- 1
kernel/drivers/memory.c Vedi File

@@ -1,4 +1,19 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#include "kernel.h"
#include "klibc.h"
#include "memory.h"


+ 15
- 0
kernel/drivers/memory.h Vedi File

@@ -0,0 +1,15 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

+ 13
- 5
kernel/drivers/processor.c Vedi File

@@ -1,11 +1,19 @@
/*
* processor.c
*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* Created by Jean-Yves Lamoureux on 12/19/09.
* Copyright 2009 Frob. All rights reserved.
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#include "kernel.h"
#include "klibc.h"
#include "processor.h"
@@ -14,7 +22,7 @@
int processor_get_info(struct processor_info *processor_info)
{
processor_info->id = 0;
/* Vendor String */
int code = CPUID_GETVENDORSTRING;
unsigned int where[5];


+ 80
- 62
kernel/drivers/processor.h Vedi File

@@ -1,81 +1,99 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

enum cpuid_requests {
enum cpuid_requests
{
CPUID_GETVENDORSTRING,
CPUID_GETFEATURES,
CPUID_GETTLB,
CPUID_GETSERIAL,
CPUID_INTELEXTENDED=0x80000000,
CPUID_INTELEXTENDED = 0x80000000,
CPUID_INTELFEATURES,
CPUID_INTELBRANDSTRING,
CPUID_INTELBRANDSTRINGMORE,
CPUID_INTELBRANDSTRINGEND,
};

enum {
CPUID_FEAT_ECX_SSE3 = 1 << 0,
CPUID_FEAT_ECX_PCLMUL = 1 << 1,
CPUID_FEAT_ECX_DTES64 = 1 << 2,
CPUID_FEAT_ECX_MONITOR = 1 << 3,
CPUID_FEAT_ECX_DS_CPL = 1 << 4,
CPUID_FEAT_ECX_VMX = 1 << 5,
CPUID_FEAT_ECX_SMX = 1 << 6,
CPUID_FEAT_ECX_EST = 1 << 7,
CPUID_FEAT_ECX_TM2 = 1 << 8,
CPUID_FEAT_ECX_SSSE3 = 1 << 9,
CPUID_FEAT_ECX_CID = 1 << 10,
CPUID_FEAT_ECX_FMA = 1 << 12,
CPUID_FEAT_ECX_CX16 = 1 << 13,
CPUID_FEAT_ECX_ETPRD = 1 << 14,
CPUID_FEAT_ECX_PDCM = 1 << 15,
CPUID_FEAT_ECX_DCA = 1 << 18,
CPUID_FEAT_ECX_SSE4_1 = 1 << 19,
CPUID_FEAT_ECX_SSE4_2 = 1 << 20,
CPUID_FEAT_ECX_x2APIC = 1 << 21,
CPUID_FEAT_ECX_MOVBE = 1 << 22,
CPUID_FEAT_ECX_POPCNT = 1 << 23,
CPUID_FEAT_ECX_XSAVE = 1 << 26,
CPUID_FEAT_ECX_OSXSAVE = 1 << 27,
CPUID_FEAT_ECX_AVX = 1 << 28,
CPUID_FEAT_EDX_FPU = 1 << 0,
CPUID_FEAT_EDX_VME = 1 << 1,
CPUID_FEAT_EDX_DE = 1 << 2,
CPUID_FEAT_EDX_PSE = 1 << 3,
CPUID_FEAT_EDX_TSC = 1 << 4,
CPUID_FEAT_EDX_MSR = 1 << 5,
CPUID_FEAT_EDX_PAE = 1 << 6,
CPUID_FEAT_EDX_MCE = 1 << 7,
CPUID_FEAT_EDX_CX8 = 1 << 8,
CPUID_FEAT_EDX_APIC = 1 << 9,
CPUID_FEAT_EDX_SEP = 1 << 11,
CPUID_FEAT_EDX_MTRR = 1 << 12,
CPUID_FEAT_EDX_PGE = 1 << 13,
CPUID_FEAT_EDX_MCA = 1 << 14,
CPUID_FEAT_EDX_CMOV = 1 << 15,
CPUID_FEAT_EDX_PAT = 1 << 16,
CPUID_FEAT_EDX_PSE36 = 1 << 17,
CPUID_FEAT_EDX_PSN = 1 << 18,
CPUID_FEAT_EDX_CLF = 1 << 19,
CPUID_FEAT_EDX_DTES = 1 << 21,
CPUID_FEAT_EDX_ACPI = 1 << 22,
CPUID_FEAT_EDX_MMX = 1 << 23,
CPUID_FEAT_EDX_FXSR = 1 << 24,
CPUID_FEAT_EDX_SSE = 1 << 25,
CPUID_FEAT_EDX_SSE2 = 1 << 26,
CPUID_FEAT_EDX_SS = 1 << 27,
CPUID_FEAT_EDX_HTT = 1 << 28,
CPUID_FEAT_EDX_TM1 = 1 << 29,
CPUID_FEAT_EDX_IA64 = 1 << 30,
CPUID_FEAT_EDX_PBE = 1 << 31
enum
{
CPUID_FEAT_ECX_SSE3 = 1 << 0,
CPUID_FEAT_ECX_PCLMUL = 1 << 1,
CPUID_FEAT_ECX_DTES64 = 1 << 2,
CPUID_FEAT_ECX_MONITOR = 1 << 3,
CPUID_FEAT_ECX_DS_CPL = 1 << 4,
CPUID_FEAT_ECX_VMX = 1 << 5,
CPUID_FEAT_ECX_SMX = 1 << 6,
CPUID_FEAT_ECX_EST = 1 << 7,
CPUID_FEAT_ECX_TM2 = 1 << 8,
CPUID_FEAT_ECX_SSSE3 = 1 << 9,
CPUID_FEAT_ECX_CID = 1 << 10,
CPUID_FEAT_ECX_FMA = 1 << 12,
CPUID_FEAT_ECX_CX16 = 1 << 13,
CPUID_FEAT_ECX_ETPRD = 1 << 14,
CPUID_FEAT_ECX_PDCM = 1 << 15,
CPUID_FEAT_ECX_DCA = 1 << 18,
CPUID_FEAT_ECX_SSE4_1 = 1 << 19,
CPUID_FEAT_ECX_SSE4_2 = 1 << 20,
CPUID_FEAT_ECX_x2APIC = 1 << 21,
CPUID_FEAT_ECX_MOVBE = 1 << 22,
CPUID_FEAT_ECX_POPCNT = 1 << 23,
CPUID_FEAT_ECX_XSAVE = 1 << 26,
CPUID_FEAT_ECX_OSXSAVE = 1 << 27,
CPUID_FEAT_ECX_AVX = 1 << 28,

CPUID_FEAT_EDX_FPU = 1 << 0,
CPUID_FEAT_EDX_VME = 1 << 1,
CPUID_FEAT_EDX_DE = 1 << 2,
CPUID_FEAT_EDX_PSE = 1 << 3,
CPUID_FEAT_EDX_TSC = 1 << 4,
CPUID_FEAT_EDX_MSR = 1 << 5,
CPUID_FEAT_EDX_PAE = 1 << 6,
CPUID_FEAT_EDX_MCE = 1 << 7,
CPUID_FEAT_EDX_CX8 = 1 << 8,
CPUID_FEAT_EDX_APIC = 1 << 9,
CPUID_FEAT_EDX_SEP = 1 << 11,
CPUID_FEAT_EDX_MTRR = 1 << 12,
CPUID_FEAT_EDX_PGE = 1 << 13,
CPUID_FEAT_EDX_MCA = 1 << 14,
CPUID_FEAT_EDX_CMOV = 1 << 15,
CPUID_FEAT_EDX_PAT = 1 << 16,
CPUID_FEAT_EDX_PSE36 = 1 << 17,
CPUID_FEAT_EDX_PSN = 1 << 18,
CPUID_FEAT_EDX_CLF = 1 << 19,
CPUID_FEAT_EDX_DTES = 1 << 21,
CPUID_FEAT_EDX_ACPI = 1 << 22,
CPUID_FEAT_EDX_MMX = 1 << 23,
CPUID_FEAT_EDX_FXSR = 1 << 24,
CPUID_FEAT_EDX_SSE = 1 << 25,
CPUID_FEAT_EDX_SSE2 = 1 << 26,
CPUID_FEAT_EDX_SS = 1 << 27,
CPUID_FEAT_EDX_HTT = 1 << 28,
CPUID_FEAT_EDX_TM1 = 1 << 29,
CPUID_FEAT_EDX_IA64 = 1 << 30,
CPUID_FEAT_EDX_PBE = 1 << 31
};

struct processor_info {
int id;
struct processor_info
{
int id;
char vendor[13];
unsigned int features;
};


int processor_get_info(struct processor_info *processor_info);
void processor_print_info(struct processor_info *processor_info);
void processor_print_info(struct processor_info *processor_info);

+ 37
- 31
kernel/drivers/timer.c Vedi File

@@ -1,3 +1,18 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#include "kernel.h"
#include "klibc.h"
@@ -7,36 +22,27 @@ u32 ticks = 0;

void timer_phase(int hz)
{
unsigned int divisor = 1193180 / hz; /* Calculate our divisor */
/*
0x43 is the Mode/Command register
From http://wiki.osdev.org/Programmable_Interval_Timer#Read_Back_Status_Byte :
Bits Usage
6 and 7 Select channel :
0 0 = Channel 0
0 1 = Channel 1
1 0 = Channel 2
1 1 = Read-back command (8254 only)
4 and 5 Access mode :
0 0 = Latch count value command
0 1 = Access mode: lobyte only
1 0 = Access mode: hibyte only
1 1 = Access mode: lobyte/hibyte
1 to 3 Operating mode :
0 0 0 = Mode 0 (interrupt on terminal count)
0 0 1 = Mode 1 (hardware re-triggerable one-shot)
0 1 0 = Mode 2 (rate generator)
0 1 1 = Mode 3 (square wave generator)
1 0 0 = Mode 4 (software triggered strobe)
1 0 1 = Mode 5 (hardware triggered strobe)
1 1 0 = Mode 2 (rate generator, same as 010b)
1 1 1 = Mode 3 (square wave generator, same as 011b)
0 BCD/Binary mode: 0 = 16-bit binary, 1 = four-digit BCD
unsigned int divisor = 1193180 / hz; /* Calculate our divisor */
/*
0x43 is the Mode/Command register

From
http://wiki.osdev.org/Programmable_Interval_Timer#Read_Back_Status_Byte
: Bits Usage 6 and 7 Select channel : 0 0 = Channel 0 0 1 = Channel 1
1 0 = Channel 2 1 1 = Read-back command (8254 only) 4 and 5 Access mode
: 0 0 = Latch count value command 0 1 = Access mode: lobyte only 1 0 =
Access mode: hibyte only 1 1 = Access mode: lobyte/hibyte 1 to 3
Operating mode : 0 0 0 = Mode 0 (interrupt on terminal count) 0 0 1 =
Mode 1 (hardware re-triggerable one-shot) 0 1 0 = Mode 2 (rate
generator) 0 1 1 = Mode 3 (square wave generator) 1 0 0 = Mode 4
(software triggered strobe) 1 0 1 = Mode 5 (hardware triggered strobe)
1 1 0 = Mode 2 (rate generator, same as 010b) 1 1 1 = Mode 3 (square
wave generator, same as 011b) 0 BCD/Binary mode: 0 = 16-bit binary, 1 =
four-digit BCD

*/
unsigned short command = 0b00110110;
unsigned short command = 0 b00110110;
outb(0x43, command);
outb(0x40, divisor & 0xFF); /* Set low byte of divisor */
outb(0x40, divisor >> 8); /* Set high byte of divisor */
}
outb(0x40, divisor & 0xFF); /* Set low byte of divisor */
outb(0x40, divisor >> 8); /* Set high byte of divisor */
}

+ 17
- 1
kernel/drivers/timer.h Vedi File

@@ -1,2 +1,18 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

extern u32 ticks;
void timer_phase(int hz);
void timer_phase(int hz);

+ 4
- 9
kernel/kernel.c Vedi File

@@ -1,8 +1,8 @@
/*
* libcaca
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
* 2006-2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id$
@@ -14,11 +14,6 @@
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

/*
* This file contains replacement functions for the standard C library
* that must be used when building libcaca and libcaca into a kernel.
*/

#include "config.h"
#include "caca_types.h"



+ 3
- 7
kernel/kernel.h Vedi File

@@ -1,7 +1,8 @@
/*
* libcaca Canvas for ultrafast compositing of Unicode letters
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id$
@@ -13,11 +14,6 @@
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

/*
* This file contains replacement functions for the standard C library
* that must be used when building libcaca and libcaca into a kernel.
*/






+ 16
- 0
kernel/klibc.c Vedi File

@@ -1,3 +1,19 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#include "config.h"
#include "caca_types.h"



+ 46
- 22
kernel/klibc.h Vedi File

@@ -1,3 +1,25 @@
/*
* libcaca
* libcaca Colour ASCII-Art library
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* 2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
* All Rights Reserved
*
* $Id: kernel.h 4154 2009-12-20 13:33:11Z jylam $
*
* This library is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

/*
* This file contains replacement functions for the standard C library
* that must be used when building libcaca and libcaca into a kernel.
*/


/* Various typedefs -- some are x86-specific */
#define CUSTOM_INTTYPES

@@ -16,10 +38,10 @@
#define __BYTE_ORDER 1
#define __BIG_ENDIAN 2

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long int u64;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long int u64;

#ifndef size_t
typedef unsigned int size_t;
@@ -29,12 +51,14 @@ typedef struct file
void *mem;
} FILE;

struct timeval {
struct timeval
{
int tv_sec;
int tv_usec;
};

struct timezone {
struct timezone
{
int tz_minuteswest;
int tz_dsttime;
};
@@ -48,7 +72,7 @@ int rand(void);
int abs(int j);
void exit(int status);
void srand(unsigned int s);
int atexit(void (*function)(void));
int atexit(void (*function) (void));
FILE *stdin, *stdout, *stderr;

/* string.h functions */
@@ -63,11 +87,11 @@ char *strdup(const char *s);
char *strchr(const char *s, int c);

/* stdarg.h functions */
typedef void * va_list;
typedef void *va_list;
#define va_start(v,a) v = (void *)((uintptr_t)(&a) + sizeof(a))
#define va_end(v)
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
/* va_arg*/
/* va_arg */
#define args_list char *
#define _arg_stack_size(type) (((sizeof(type)-1)/sizeof(int)+1)*sizeof(int))
#define args_start(ap, fmt) do { \
@@ -78,15 +102,15 @@ ap = (char *)((unsigned int)&fmt + _arg_stack_size(&fmt)); \

/* stdio.h functions */
FILE *fopen(const char *path, const char *mode);
int feof(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
int fclose(FILE *fp);
int feof(FILE * stream);
char *fgets(char *s, int size, FILE * stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE * stream);
int fclose(FILE * fp);

int printf(const char *format, ...);

int fprintf(FILE *stream, const char *format, ...);
int fflush(FILE *stream);
int fprintf(FILE * stream, const char *format, ...);
int fflush(FILE * stream);
int sprintf(char *str, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
void itoa(int n, char s[]);
@@ -109,13 +133,13 @@ double sin(double x);
double sqrt(double x);

/* errno.h functions */
#define ENOENT 2 /* No such file or directory */
#define ENOMEM 12 /* Out of memory */
#define EBUSY 16 /* Device or resource busy */
#define ENODEV 19 /* No such device */
#define EINVAL 22 /* Invalid argument */
#define ENOTTY 25 /* Not a typewriter */
#define ENOSYS 38 /* Function not implemented */
#define ENOENT 2 /* No such file or directory */
#define ENOMEM 12 /* Out of memory */
#define EBUSY 16 /* Device or resource busy */
#define ENODEV 19 /* No such device */
#define EINVAL 22 /* Invalid argument */
#define ENOTTY 25 /* Not a typewriter */
#define ENOSYS 38 /* Function not implemented */
extern int errno;

/* arpa/inet.h functions */


Caricamento…
Annulla
Salva