예제 #1
0
파일: CPUID.cs 프로젝트: xsword911/Cosmos
 //        ; (No Type Info available)
 //; Method 'System.Void  Cosmos.Kernel.Plugs.CPU.GetCPUId(System.UInt32&, System.UInt32&, System.UInt32&, System.UInt32&, System.UInt32)'
 //; Locals:
 //;     (none)
 //; Arguments:
 //;     (0) 16	4	ebp + 018h (Type = System.UInt32&)
 //;     (1) 12	4	ebp + 014h (Type = System.UInt32&)
 //;     (2) 8	4	ebp + 010h (Type = System.UInt32&)
 //;     (3) 4	4	ebp + 0Ch (Type = System.UInt32&)
 //;     (4) 0	4	ebp + 08h (Type = System.UInt32)
 //;     ReturnSize: 0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     new CPUx86.ClrInterruptFlag();
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.EBP, SourceIsIndirect = true, SourceDisplacement = 8
     };
     new CPUx86.CpuId();
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EDI, SourceReg = CPUx86.Registers.EBP, SourceIsIndirect = true, SourceDisplacement = 0x18
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EDI, DestinationIsIndirect = true, SourceReg = CPUx86.Registers.EDX
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EDI, SourceReg = CPUx86.Registers.EBP, SourceIsIndirect = true, SourceDisplacement = 0x14
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EDI, DestinationIsIndirect = true, SourceReg = CPUx86.Registers.ECX
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EDI, SourceReg = CPUx86.Registers.EBP, SourceIsIndirect = true, SourceDisplacement = 0x10
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EDI, DestinationIsIndirect = true, SourceReg = CPUx86.Registers.EBX
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EDI, SourceReg = CPUx86.Registers.EBP, SourceIsIndirect = true, SourceDisplacement = 0xC
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EDI, DestinationIsIndirect = true, SourceReg = CPUx86.Registers.EAX
     };
     new CPUx86.Sti();
 }
예제 #2
0
파일: CPUID.cs 프로젝트: zer09/Cosmos
 //; Method 'System.UInt32  Cosmos.Kernel.Plugs.CPU.HasCPUIDSupport()'
 //; Locals:
 //;     (0) 0	4	ebp - 04h (Type = System.UInt32)
 //; Arguments:
 //;     (none)
 //;     ReturnSize: 4
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     /*XS.Pushfd();
      * new CPUx86.Pop("eax");
      * new CPUx86.Move("ecx", "eax");
      *
      * new CPUx86.Xor("eax", "200000h");
      * new CPUx86.Push("eax");
      * XS.Popfd();
      *
      * XS.Pushfd();
      * new CPUx86.Pop("ebx");
      * new CPUx86.Xor("eax", "ebx");
      * new CPUx86.And("eax", "200000h");
      * new CPUx86.JumpIfZero(".not");
      *
      * new CPUx86.Move("eax", "1");
      * new CPUx86.Jump(".return");
      *
      * new CPUAll.Label(".not");
      * new CPUx86.Xor("eax", "eax");
      *
      * new CPUAll.Label(".return");
      * new CPUx86.Push("ecx");
      * XS.Popfd();
      *
      * new CPUx86.Push("eax");*/
     XS.Push(0);
 }
예제 #3
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.ESP, SourceIsIndirect = true, SourceDisplacement = 0x8
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.CR3, SourceReg = CPUx86.Registers.EAX
     };
 }
예제 #4
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     XS.Mov(XSRegisters.EAX, CPUAll.ElementReference.New("MultiBootInfo_Memory_High"), sourceIsIndirect: true);
     XS.Xor(XSRegisters.EDX, XSRegisters.CPUx86.Registers.EDX);
     XS.Mov(XSRegisters.ECX, 1024);
     XS.Divide(XSRegisters.ECX);
     XS.Add(XSRegisters.EAX, 1);
     XS.Push(XSRegisters.EAX);
 }
예제 #5
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.CR4
     };
     new CPUx86.And {
         DestinationReg = CPUx86.Registers.EAX, SourceValue = 0xFFFFFFEF
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.CR4, SourceReg = CPUx86.Registers.EAX
     };
 }
예제 #6
0
파일: Shutdown.cs 프로젝트: zer09/Cosmos
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     //ACPI Way...ONLY QEMu And Boschs
     XS.Mov(XSRegisters.DX, 0xB004);
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.AX,
         SourceValue    = 0x0 | 0x2000
     };
     new CPUx86.Out {
         DestinationReg = CPUx86.Registers.AX,
         Size           = (byte)CPUx86.Instruction.InstructionSize.Word
     };
     //TODO: ACPI Way...see http://forum.osdev.org/viewtopic.php?t=16990
 }
예제 #7
0
파일: CPUID.cs 프로젝트: zer09/Cosmos
 //        ; (No Type Info available)
 //; Method 'System.Void  Cosmos.Kernel.Plugs.CPU.GetCPUId(System.UInt32&, System.UInt32&, System.UInt32&, System.UInt32&, System.UInt32)'
 //; Locals:
 //;     (none)
 //; Arguments:
 //;     (0) 16	4	ebp + 018h (Type = System.UInt32&)
 //;     (1) 12	4	ebp + 014h (Type = System.UInt32&)
 //;     (2) 8	4	ebp + 010h (Type = System.UInt32&)
 //;     (3) 4	4	ebp + 0Ch (Type = System.UInt32&)
 //;     (4) 0	4	ebp + 08h (Type = System.UInt32)
 //;     ReturnSize: 0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     new CPUx86.ClrInterruptFlag();
     XS.Mov(XSRegisters.EAX, XSRegisters.EBP, sourceDisplacement: 8);
     XS.CpuId();
     XS.Mov(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: 0x18);
     XS.Mov(XSRegisters.EDI, XSRegisters.EDX, destinationIsIndirect: true);
     XS.Mov(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: 0x14);
     XS.Mov(XSRegisters.EDI, XSRegisters.ECX, destinationIsIndirect: true);
     XS.Mov(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: 0x10);
     XS.Mov(XSRegisters.EDI, XSRegisters.EBX, destinationIsIndirect: true);
     XS.Mov(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: 0xC);
     XS.Mov(XSRegisters.EDI, XSRegisters.EAX, destinationIsIndirect: true);
     XS.Sti();
 }
예제 #8
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.EAX, SourceRef = CPUAll.ElementReference.New("MultiBootInfo_Memory_High"), SourceIsIndirect = true
     };
     new CPUx86.Xor {
         DestinationReg = CPUx86.Registers.EDX, SourceReg = CPUx86.Registers.EDX
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.ECX, SourceValue = 1024
     };
     new CPUx86.Divide {
         DestinationReg = CPUx86.Registers.ECX
     };
     new CPUx86.Add {
         DestinationReg = CPUx86.Registers.EAX, SourceValue = 1
     };
     new CPUx86.Push {
         DestinationReg = CPUx86.Registers.EAX
     };
 }
예제 #9
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     new CPUx86.ClrInterruptFlag();
     /* Clear all keyboard buffers (output and command buffers) */
     new CPUAll.Label(".waitBuffer");
     XS.Mov(XSRegisters.DX, 0x64);
     XS.InFromDX(XSRegisters.AL);
     XS.Test(XSRegisters.AL, 2);
     XS.Jump(ConditionalTestEnum.NotEqual, ".waitBuffer");
     XS.Mov(XSRegisters.AL, 0xD1);
     XS.Mov(XSRegisters.DX, 0x64);
     XS.OutToDX(XSRegisters.AL);
     new CPUAll.Label(".clearBuffer");
     XS.Mov(XSRegisters.DX, 0x64);
     XS.InFromDX(XSRegisters.AL);
     XS.Test(XSRegisters.AL, 2);
     XS.Jump(ConditionalTestEnum.NotEqual, ".clearBuffer");
     XS.Mov(XSRegisters.AL, 0xFE);
     XS.Mov(XSRegisters.DX, 0x60);
     XS.OutToDX(XSRegisters.AL);
     new CPUAll.Label(".loop");//failed... halt
     XS.Halt();
     XS.Jump(".loop");
 }
예제 #10
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     XS.FloatInit();
 }
예제 #11
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     XS.Mov(XSRegisters.EAX, XSRegisters.ESP, sourceDisplacement: 0x8);
     XS.Mov(XSRegisters.CR3, XSRegisters.CPUx86.Registers.EAX);
 }
예제 #12
0
파일: Reboot.cs 프로젝트: xsword911/Cosmos
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     new CPUx86.ClrInterruptFlag();
     /* Clear all keyboard buffers (output and command buffers) */
     new CPUAll.Label(".waitBuffer");
     new CPUx86.Mov {
         SourceValue    = 0x64,
         DestinationReg = CPUx86.Registers.DX
     };
     new CPUx86.IN {
         DestinationReg = CPUx86.Registers.AL
     };
     new CPUx86.Test {
         DestinationReg = CPUx86.Registers.AL,
         SourceValue    = 2
     };
     new CPUx86.ConditionalJump {
         Condition        = CPUx86.ConditionalTestEnum.NotEqual,
         DestinationLabel = ".waitBuffer"
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.AL,
         SourceValue    = 0xD1
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.DX,
         SourceValue    = 0x64
     };
     new CPUx86.Out {
         DestinationReg = CPUx86.Registers.AL
     };
     new CPUAll.Label(".clearBuffer");
     new CPUx86.Mov {
         SourceValue    = 0x64,
         DestinationReg = CPUx86.Registers.DX
     };
     new CPUx86.IN {
         DestinationReg = CPUx86.Registers.AL
     };
     new CPUx86.Test {
         DestinationReg = CPUx86.Registers.AL,
         SourceValue    = 2
     };
     new CPUx86.ConditionalJump {
         Condition        = CPUx86.ConditionalTestEnum.NotEqual,
         DestinationLabel = ".clearBuffer"
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.AL,
         SourceValue    = 0xFE
     };
     new CPUx86.Mov {
         DestinationReg = CPUx86.Registers.DX,
         SourceValue    = 0x60
     };
     new CPUx86.Out {
         DestinationReg = CPUx86.Registers.AL
     };
     new CPUAll.Label(".loop");//failed... halt
     new CPUx86.Halt();
     new CPUx86.Jump {
         DestinationLabel = ".loop"
     };
 }
예제 #13
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     XS.Mov(XSRegisters.EAX, XSRegisters.CPUx86.Registers.CR0);
     XS.And(XSRegisters.EAX, 0x7FFFFFFF);
     XS.Mov(XSRegisters.CR0, XSRegisters.CPUx86.Registers.EAX);
 }
예제 #14
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     XS.Mov(XSRegisters.EAX, XSRegisters.CPUx86.Registers.CR4);
     XS.Or(XSRegisters.EAX, 0x00000010);
     XS.Mov(XSRegisters.CR4, XSRegisters.CPUx86.Registers.EAX);
 }
예제 #15
0
 public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo)
 {
     new CPUx86.x87.FloatInit();
 }