/**************************************************************************************
Copyright (c) 2002
The UbixOS Project
$Id$
**************************************************************************************/
#include <vmm/memory.h>
#include <ubixos/io.h>
int countMemory() {
register unsigned long *mem;
unsigned long memCount=-1, tempMemory;
unsigned short memKb=0;
unsigned char irq1State, irq2State;
unsigned long cr0;
/* Save States Of IRQ 1 & 2 */
irq1State=inportByte(0x21);
irq2State=inportByte(0xA1);
/* Shut Off Both IRQS */
outportByte(0x21, 0xFF);
outportByte(0xA1, 0xFF);
/* Save CR0 */
asm(
"movl %%cr0, %%ebx\n"
: "=a"(cr0)
:
: "ebx"
);
asm("wbinvd");
asm(
"movl %%ebx, %%cr0\n"
:
: "a" (cr0 | 0x00000001 | 0x40000000 | 0x20000000)
: "ebx"
);
while(memKb<4096 && memCount!=0) {
memKb++;
if (memCount == -1) memCount = 0;
memCount+=1024*1024;
mem=(unsigned long *)memCount;
tempMemory=*mem;
*mem=0x55AA55AA;
asm("":::"memory");
if (*mem!=0x55AA55AA) {
memCount=0;
}
else {
*mem=0xAA55AA55;
asm("":::"memory");
if (*mem!=0xAA55AA55) {
memCount=0;
}
}
asm("":::"memory");
*mem=tempMemory;
}
asm(
"movl %%ebx, %%cr0\n"
:
: "a" (cr0)
: "ebx"
);
/* Return IRQ 1 & 2's States */
outportByte(0x21, irq1State);
outportByte(0xA1, irq2State);
return(memKb<<20);
}