Sourcecode Fortschritt


  • Mod

    Rev. 311:

    FPU-Sicherung Experimenteller Zwischenschritt
    #NM kommt noch zu oft

    Hier mal die Doku der neuen Schritte:

    os.h

    struct oda
    {
        //...
        uintptr_t curTask;           // Address of currentTask
        //...
    }__attribute__((packed));
    

    ckernel.c:

    void setup_x87_fpu()
    {
        //...
        // set TS in cr0
        uint32_t cr0;
        __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
        cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7)
        __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
    }
    
    //...
    
        while (true) // kernel idle loop
        {
            /// FPU-TEST
            float number1 = 2.5;
            float number2 = 2.5;
            float number3 = number1 * number2;
            char str[40];
            float2string(number3,3,str);
            printf("float result: %s\n",str);
            /// TEST
    

    irq.c:

    task_t* pCurrentTask = (task_t*)(pODA->curTask);
    
        if ( (r->int_no < 32) && (r->int_no == 7) ) //exception #NM (number 7)
        {
             settextcolor(12,0);
             printf("#NM: FPU is used\n");
             settextcolor(15,0);
    
             // current task uses FPU
             pCurrentTask->FPU_flag = true;
    
             // save FPU ...
             // ...
    
             // restore FPU ...
             // ...
    
             // set TS in cr0 to zero
    
             uint32_t cr0;
             __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
             cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM
             __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
        }
    

    task.c:

    void tasking_install()
    {
      //...
        pODA->curTask = (uintptr_t)current_task;
        current_task->FPU_flag = false; 
      //...
    }
    
    task_t* create_task(page_directory_t* directory, void* entry, uint8_t privilege, const char* programName)
    {
      //...
        pODA->curTask = (uintptr_t)new_task;
        new_task->FPU_flag = false;
    }
    
    uint32_t task_switch (uint32_t esp)
    {
      //...
        // write active task struct address to ODA
        pODA->curTask = (uintptr_t)current_task;
    
      //...
            // set TS in cr0, if the task has not used the FPU before
        if (current_task->FPU_flag == false);
        {
            uint32_t cr0;
            __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
            cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7)
            __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
        }
    

  • Mod

    Rev. 312:

    Rahmen für FPU-Nutzung bezüglich TS-Bit und #NM stehen, jetzt fehlt noch save und restore (Dank an Tobiking für das Mitdenken!)

    in task_switch:

    // set TS
        if (pODA->curTask == pODA->TaskFPU)
        {
            uint32_t cr0;
            __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
            cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM (exception no. 7)
            __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
        }
        else
        {
            uint32_t cr0;
            __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
            cr0 |= 0x8; // set the TS bit (no. 3) in CR0 to enable #NM (exception no. 7)
            __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
        }
    

    kernel:

    /// FPU-TEST
                if ((CurrentSeconds%5)==0)
                {
                    float number1 = 2.5;
                    float number2 = 2.5;
                    float number3 = number1 * number2;
                    char str[40];
                    float2string(number3,3,str);
                    printf("float result: %s\n",str);
                }
                /// TEST
    

    TTT (hello.c) als Test:

    void Zug(uint16_t Player, char* str, uint16_t* tictactoe, bool ende)
    {
    	memset((void*)str, 0, 80);
    
        for (; ; gets(str))
        {
         /// FLOAT-TEST
         float number1 = 2.5;
         float number2 = 2.5;
         float number3 = number1 * number2;
         char floatStr[40];
         float2string(number3,3,floatStr);
         /// TEST
    

  • Mod

    Rev. 313:

    FPU: fnsave / frstor eingebaut (Danke an Tobiking und taljeth für die Unterstützung)

    In den einzelnen Konsolen erkennt man jetzt sehr schön die bei den einzelnen Tasks anfallenden #NM beim Verwenden einer FPU-Operation.

    Hier der Part im irq-handler für #NM:

    if ( r->int_no == 7 ) //exception #NM (number 7)
        {
             // set TS in cr0 to zero
             uint32_t cr0;
             __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); // read cr0
             cr0 &= ~0x8; // reset the TS bit (no. 3) in CR0 to disable #NM
             __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); // write cr0
    
             settextcolor(12,0);
             printf("#NM: FPU is used. pCurrentTask: %X\n",pCurrentTask);
             settextcolor(15,0);
    
             // current task uses FPU
             pCurrentTask->FPU_flag = true;
    
             // save FPU data ...
             if(pODA->TaskFPU)
             {
                 // fsave or fnsave to pODA->TaskFPU->FPU_ptr
                 __asm__ volatile("fnsave %0" :: "m" (*(char*)(((task_t*)pODA->TaskFPU)->FPU_ptr)));
             }
    
             // store the last task using FPU
             pODA->TaskFPU = (uintptr_t)pCurrentTask;
    
             // restore FPU data ...
             if(pCurrentTask->FPU_ptr)
             {
                 // frstor from pCurrentTask->FPU_ptr
                 __asm__ volatile("frstor %0" :: "m" (*(char*)(pCurrentTask->FPU_ptr)));
             }
             else
             {
                 // allocate memory to pCurrentTask->FPU_ptr
                 pCurrentTask->FPU_ptr = (uintptr_t)malloc(108,4);
             }
        }
    

  • Mod


  • Mod

    Rev. 315:

    - fsave anstelle fnsave (FPU context)
    - FPU_flag entfernt (nicht benötigt)


  • Mod

    Rev. 316:

    gdt.c: "speaking values" as parameters of gdt_set_gate(...)

    PrettyOS [Version 0.0.0.316]                             Console 0: HELLO   .ELF
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    
                                Mr.X TicTacToe 3x3  v0.56                           
    
    --------------------------------------------------------------------------------
    
    *************                                                                   
    | 0 | 1 | 2 |                                                                   
    *************                                                                   
    | 3 | 4 | 5 |                                                                   
    *************                                                                   
    | 6 | 7 | 8 |                                                                   
    *************                                                                   
    
    *************                                                                   
    |   |   | X |                                                                   
    *************                                                                   
    | O | X | O |                                                                   
    *************                                                                   
    | X |   |   |                                                                   
    *************                                                                   
    
    Please type in a number betwen 0 and 8.                                         
    
         FPU is used. pCurrentTask: C0000180h                                       
    #NM: FPU is used. pCurrentTask: C0000180h                                       
    Player X wins
    

  • Mod

    Rev. 317:

    Funktion "screenshot" aus ckernel.c ausgelagert nach console.c:

    ckernel.c:

    if (CurrentSeconds%120==3)
                {
                    char timeStr[10];
                    sprintf(timeStr, "TIME%s", timeBuffer);
                    screenshot(timeStr);
                }
    

    console.c:

    int32_t screenshot(char* name)
    {
        // buffer for video screen
        uint8_t videoscreen[4000+100]; // only signs, no attributes, 50 times CR LF (0xD 0xA) at line end
        int32_t NewLine = 0;
    
        for (uint16_t i=0; i<4000;i++)
        {
            uint16_t j=i+2*NewLine;
            videoscreen[j] = *(uint8_t*)(0xB8000 + 2*i); // only signs, no attributes
            if ((i%80) == 79)
            {
                // CR LF (0xD 0xA)
                videoscreen[j+1]= 0xD;
                videoscreen[j+2]= 0xA;
                NewLine++;
            }
        }
        return flpydsk_write(name, "TXT", (void*)videoscreen, 4100);
    }
    
    PrettyOS [Version 0.0.0.317]                                               Shell
    --------------------------------------------------------------------------------
                                              ##                                    
                                             ##                                     
    
                         Copyright (c) 2010 The PrettyOS Team                       
    
                         This bootscreen has been created by                        
    
                         Cuervo, member of the PrettyOS team                        
    
    Memory size: 128 MiB / 134 MB  (134217728 Bytes)                                
    #0  0:0.0        dev:1237h vend:8086h IRQ:0                                     
    #1  0:1.0        dev:7000h vend:8086h IRQ:0                                     
    #2  0:1.1        dev:7010h vend:8086h IRQ:0                                     
    #3  0:1.2        dev:24CDh vend:8086h IRQ:11  USB EHCI F0000000h MMIO sz:4096   
    
    >>> >>> function: analyzeEHCI                                                   
    HCIVERSION: 0100h HCSPARAMS: 00000004h Ports: 4                                 
    HCCPARAMS: 00000080h No ext. capabil.                                           
    OpRegs Address: F0000020h                                                       
    #4  0:1.3        dev:7113h vend:8086h IRQ:9                                     
    #5  0:2.0        dev:00B8h vend:1013h IRQ:0                                     
    #6  0:3.0        dev:100Eh vend:8086h IRQ:11                                    
    
    1.44 MB FDD device 0                                                            
    
    <RAM Disk at C0005000h DIR> dev                                                 
    35      info                                                                    
    13108   shell                                                                   
    
    #NM: FPU is used. pCurrentTask: C0000070h                                       
    #NM: FPU is used. pCurrentTask: C0000000h
    


  • Revision 318:

    * Maus-Support (sogar mit Scrollwheel, falls von der Maus unterstützt)! IRQs werden angezeigt, mit Status!


  • Mod

    Rev. 319:

    - mouse.c: mouse print auf eine Zeile
    - scheduler.c (Beginn der Auslagerung des Dispatchers/Schedulers, separat von task.c)

    scheduler.h/c wurde versehentlich nicht committed. 🙄



  • Rev. 320:

    - Stylekorrekturen
    - makefile und build.bat auf FloppyImage.img umgestellt
    - scheduler.c/.h jetzt dabei


  • Mod

    Rev. 321:

    Code review:

    BL1, 
    BL2,
    ckernel:
        gdt_install();
        idt_install();       // cf. interrupts.asm
        timer_install(1000); // Sets system frequency to ... Hz
        keyboard_install();
        //...	
        syscall_install();
        fpu_install();
    

    next step: paging, heap, tasking, pci-scan, mouse, ehci, ...

    Thx to MrX, Cuervo, Tobiking, Iteem 👍



  • Revision 322:

    * Mausverbesserungen: Stabilisation, experimenteller Support für 5 Tasten (muss aktiviert werden, ist im Moment instabil und deswegen deaktiviert) und mouse_uninstall(), das sogar die Maus zurücksetzt.

    EDIT:

    * Des weiteren wurden einige Funktionen ausgelagert, z.B. die Funktion zum Setzen der Sample-Rate!



  • Revision 323:

    - makefile-Bug bezüglich Shell behoben
    - rebuild.bat hinzugefügt: führt target clean vorm Build aus



  • Revision 324:

    * Kleinere Optimierungen

    EDIT: Fehler, nicht-Windows nimmt jetzt i586-elf- gcc und binutils.. sry..


  • Mod

    Rev. 325:

    task.c überarbeitet (Code Review)


  • Mod

    Rev. 326:

    weitere Funktionen nach scheduler.c ausgelagert


  • Mod

    Rev. 327:

    Multithreading - erster Versuch.

    Klappt noch ncht komplett, aber Bootscreen erscheint schon als Thread. Nach Laden von TTT hängt jedoch noch was.


  • Mod

    Rev. 328:

    Jetzt geht es mit dem ersten Multithreading. 😕



  • Revision 329:

    - build.sh auf FloppyImage.img umgestellt (In Ermangelung von Linux kann ich dennoch nicht beurteilen, ob diese Datei funktioniert)
    - HELLO.ELF jetzt in version 0.5.7 (Zählweise geändert, Float-Test weg, Wartet am Ende auf Tastendruck)
    - Shell: testch nicht mehr genutzt
    - Float-Test im ckernel.c weg, #NM-Ausgabe in Diagnosis-Modus verlegt
    - "Aufräumarbeiten"


  • Mod

    Rev. 330:

    Zwischenschritt: read/write-Sperre by Floppy Disk Transfer (noch nicht sicher)
    in oda, os.h:

    bool flpy_ReadWriteFlag[4];  // 0: ready      1: busy (blocked)
    

Anmelden zum Antworten