/SPARTAN/trunk/include/memstr.h |
---|
32,6 → 32,7 |
#include <typedefs.h> |
#include <arch/types.h> |
extern char *memcpy(void * dst, const void *src, size_t cnt); |
extern char *memcopy(void * dst, const void *src, size_t cnt); |
extern void memsetw(__address dst, size_t cnt, __u16 x); |
44,5 → 45,6 |
*/ |
extern char *_memcopy(void *dst, const void *src, size_t cnt); |
extern void _memsetb(__address dst, size_t cnt, __u8 x); |
extern void _memsetw(__address dst, size_t cnt, __u16 x); |
#endif |
/SPARTAN/trunk/src/lib/memstr.c |
---|
70,3 → 70,22 |
for(i=0; i<cnt; i++) |
p[i] = x; |
} |
/** Fill block of memory |
* |
* Fill cnt words at dst address with the value x. |
* The filling is done word-by-word. |
* |
* @param dst Origin address to fill. |
* @param cnt Number of words to fill. |
* @param x Value to fill. |
* |
*/ |
void _memsetw(__address dst, size_t cnt, __u16 x) |
{ |
int i; |
__u8 *p = (__u8 *) dst; |
for(i=0; i<cnt; i++) |
p[i] = x; |
} |
/SPARTAN/trunk/src/build.amd64 |
---|
1,6 → 1,10 |
#! /bin/sh |
set -e |
# Generate context_offset.h |
(cd ../arch/amd64/src;make gencontext;./gencontext) |
# Create links to ia32 architecture |
ln -sf ../../../arch/ia32/src/drivers ../arch/amd64/src/ |
ln -sf ../../../arch/ia32/include/ega.h ../arch/amd64/include/ |
(cd ../arch/amd64/src;make gencontext;./gencontext) |
make all ARCH=amd64 |
/SPARTAN/trunk/arch/amd64/include/asm.h |
---|
32,6 → 32,7 |
#include <arch/types.h> |
#include <config.h> |
void asm_delay_loop(__u32 t); |
/* TODO: implement the real stuff */ |
42,4 → 43,77 |
static inline void cpu_sleep(void) { __asm__("hlt"); }; |
static inline __u8 inb(__u16 port) |
{ |
__u8 out; |
asm ( |
"mov %0, %%dx;" |
"inb %%dx,%%al;" |
"mov %%al, %1;" |
:"=m"(out) |
:"m"(port) |
:"dx","al" |
); |
return out; |
} |
static inline __u8 outb(__u16 port,__u8 b) |
{ |
asm ( |
"mov %0,%%dx;" |
"mov %1,%%al;" |
"outb %%al,%%dx;" |
: |
:"m"( port), "m" (b) |
:"dx","al" |
); |
} |
/** Set priority level low |
* |
* Enable interrupts and return previous |
* value of EFLAGS. |
*/ |
static inline pri_t cpu_priority_low(void) { |
pri_t v; |
__asm__ volatile ( |
"pushfq\n" |
"popq %0\n" |
"sti\n" |
: "=r" (v) |
); |
return v; |
} |
/** Set priority level high |
* |
* Disable interrupts and return previous |
* value of EFLAGS. |
*/ |
static inline pri_t cpu_priority_high(void) { |
pri_t v; |
__asm__ volatile ( |
"pushfq\n" |
"popq %0\n" |
"cli\n" |
: "=r" (v) |
); |
return v; |
} |
/** Restore priority level |
* |
* Restore EFLAGS. |
*/ |
static inline void cpu_priority_restore(pri_t pri) { |
__asm__ volatile ( |
"pushq %0\n" |
"popfq\n" |
: : "r" (pri) |
); |
} |
#endif |
/SPARTAN/trunk/arch/amd64/Makefile.inc |
---|
15,8 → 15,9 |
arch_sources = arch/dummy.s \ |
arch/fpu_context.c \ |
arch/putchar.c \ |
arch/boot/boot.S \ |
arch/boot/memmap.S \ |
arch/pm.c \ |
arch/context.S |
arch/context.S \ |
arch/drivers/ega.c \ |
arch/supplib.c |
/SPARTAN/trunk/arch/amd64/src/putchar.c |
---|
File deleted |
/SPARTAN/trunk/arch/amd64/src/gencontext.c |
---|
0,0 → 1,36 |
#include <stdio.h> |
typedef long long __u64; |
typedef __u64 pri_t; |
#define __amd64_TYPES_H__ |
#include "../include/context.h" |
#define FILENAME "context_offset.h" |
int main(void) |
{ |
FILE *f; |
struct context ctx; |
struct context *pctx = &ctx; |
f = fopen(FILENAME,"w"); |
if (!f) { |
perror(FILENAME); |
return 1; |
} |
fprintf(f,"#define OFFSET_SP 0x%x\n",((int)&pctx->sp) - (int )pctx); |
fprintf(f,"#define OFFSET_PC 0x%x\n",((int)&pctx->pc) - (int )pctx); |
fprintf(f,"#define OFFSET_RBX 0x%x\n",((int)&pctx->rbx) - (int )pctx); |
fprintf(f,"#define OFFSET_RBP 0x%x\n",((int)&pctx->rbp) - (int )pctx); |
fprintf(f,"#define OFFSET_R12 0x%x\n",((int)&pctx->r12) - (int )pctx); |
fprintf(f,"#define OFFSET_R13 0x%x\n",((int)&pctx->r13) - (int )pctx); |
fprintf(f,"#define OFFSET_R14 0x%x\n",((int)&pctx->r14) - (int )pctx); |
fprintf(f,"#define OFFSET_R15 0x%x\n",((int)&pctx->r15) - (int )pctx); |
fprintf(f,"#define OFFSET_PRI 0x%x\n",((int)&pctx->pri) - (int )pctx); |
fclose(f); |
return 0; |
} |
/SPARTAN/trunk/arch/amd64/src/supplib.c |
---|
0,0 → 1,52 |
/* |
* Copyright (C) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <memstr.h> |
/* TODO: Rewrite to assembler */ |
char *memcpy(void *dst, const void *src, size_t cnt) |
{ |
_memcopy(dst, src, cnt); |
} |
char *memcopy(void * dst, const void *src, size_t cnt) |
{ |
_memcopy(dst, src, cnt); |
} |
void memsetw(__address dst, size_t cnt, __u16 x) |
{ |
_memsetw(dst, cnt, x); |
} |
void memsetb(__address dst, size_t cnt, __u8 x) |
{ |
_memsetb(dst, cnt, x); |
} |
/SPARTAN/trunk/arch/amd64/src/dummy.s |
---|
28,13 → 28,10 |
.text |
.global memcopy |
.global memcpy |
.global cpu_priority_high |
.global cpu_priority_low |
.global cpu_priority_read |
.global cpu_priority_restore |
.global memsetb |
.global userspace |
.global before_thread_runs_arch |
.global panic_printf |
54,13 → 51,10 |
.global dummy |
.global asm_delay_loop |
memcpy: |
memcopy: |
cpu_priority_high: |
cpu_priority_low: |
cpu_priority_restore: |
cpu_priority_read: |
memsetb: |
asm_delay_loop: |
before_thread_runs_arch: |
userspace: |