add rdtsc for x86
This commit is contained in:
parent
e453de93ac
commit
c684832d80
|
@ -1,6 +1,8 @@
|
|||
#ifndef __TYPES_H__
|
||||
#define __TYPES_H__
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
typedef char i8;
|
||||
typedef unsigned char u8;
|
||||
typedef short int i16;
|
||||
|
|
|
@ -12,8 +12,16 @@ ulong _uptime() {
|
|||
return seconds * 1000 + (useconds + 500) / 1000;
|
||||
}
|
||||
|
||||
static inline long long rdtsc() {
|
||||
int lo, hi;
|
||||
asm volatile ("rdtscp": "=a"(lo), "=d"(hi) : : "%ecx");
|
||||
return ((long long)hi << 32) | lo;
|
||||
}
|
||||
|
||||
static long long init_tsc;
|
||||
|
||||
ulong _cycles() {
|
||||
return 0;
|
||||
return rdtsc() - init_tsc;
|
||||
}
|
||||
|
||||
void gui_init();
|
||||
|
@ -21,5 +29,6 @@ void gui_init();
|
|||
void _ioe_init() {
|
||||
gui_init();
|
||||
gettimeofday(&boot_time, NULL);
|
||||
init_tsc = rdtsc();
|
||||
}
|
||||
|
||||
|
|
|
@ -110,14 +110,27 @@ int _peek_key() {
|
|||
}
|
||||
}
|
||||
|
||||
static inline long long rdtsc() {
|
||||
int lo, hi;
|
||||
asm volatile ("rdtscp": "=a"(lo), "=d"(hi) : : "%ecx");
|
||||
return ((long long)hi << 32) | lo;
|
||||
}
|
||||
|
||||
static long long init_tsc;
|
||||
|
||||
void _ioe_init() {
|
||||
vga_init();
|
||||
init_tsc = rdtsc();
|
||||
}
|
||||
|
||||
ulong i386_uptime = 0;
|
||||
|
||||
ulong _cycles() {
|
||||
return rdtsc() - init_tsc;
|
||||
}
|
||||
|
||||
ulong _uptime() {
|
||||
return i386_uptime ++;
|
||||
return i386_uptime;
|
||||
}
|
||||
|
||||
_Screen _screen;
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
# Hello World
|
||||
|
||||
最简单的Hello World程序,使用`_putc`打印一些字符,然后`_halt(0)`终止。
|
||||
|
||||
能够运行在任何实现了AM的平台上。
|
|
@ -0,0 +1,2 @@
|
|||
void print(const char *);
|
||||
void printi(int);
|
|
@ -0,0 +1,18 @@
|
|||
#include <hello.h>
|
||||
#include <am.h>
|
||||
|
||||
int main() {
|
||||
_trm_init();
|
||||
_ioe_init();
|
||||
|
||||
ulong t = _uptime();
|
||||
|
||||
for (int i = 0; i <= 10000; i ++) {
|
||||
printi(_cycles());
|
||||
print("\n");
|
||||
}
|
||||
|
||||
printi(_uptime() - t);
|
||||
print("ms\n");
|
||||
_halt(0);
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
#include <hello.h>
|
||||
#include <am.h>
|
||||
|
||||
void print(const char *s) {
|
||||
for (; *s; s ++) {
|
||||
_putc(*s);
|
||||
}
|
||||
}
|
||||
|
||||
static void print_i(int i) {
|
||||
if (i > 0) {
|
||||
print_i(i / 10);
|
||||
_putc('0' + (i % 10));
|
||||
}
|
||||
}
|
||||
|
||||
void printi(int i) {
|
||||
if (i == 0) _putc('0');
|
||||
else print_i(i);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue