📄 cpu_config.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000,2001 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2002 by Monami software, Limited Partners. * * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ * ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 * に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· * この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 * み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ * (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する * ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚を倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: cpu_config.c,v 1.2 2002/04/06 12:23:01 honda Exp $ *//* * プロセッサ巴赂モジュ〖ル∈i386脱∷ */#include "jsp_kernel.h"#include "check.h"#include "task.h"#include "i386.h"UW nest = 0; /* 充り哈みネスト搀眶 */FP exc_table[0x20]; /* 充り哈みハンドラの悼击テ〖ブル */static SEGDESC gdt[3]; /* グロ〖バルディスクリプタテ〖ブル */static GATEDESC idt[256]; /* 充り哈みディスクリプタテ〖ブル */static voidset_segment_descriptor(int sel, unsigned addr, unsigned limit, unsigned type, unsigned dpl);static voidset_gate_descriptor(int sel, unsigned selector, void *func, unsigned type, unsigned dpl);/* * プロセッサ巴赂の介袋步 */voidcpu_initialize(){ DESCPTR desc_ptr; /* Flat model */ set_segment_descriptor(0, 0x0, 0x00000, 0x00, 0); set_segment_descriptor(1, 0x0, 0xfffff, I386_TYPE_SEG_CODE | I386_TYPE_SEG_READABLE, 0); set_segment_descriptor(2, 0x0, 0xfffff, I386_TYPE_SEG_DATA | I386_TYPE_SEG_WRITEABLE, 0); desc_ptr.limit = sizeof(gdt) - 1; desc_ptr.base = (unsigned)gdt; Asm("movl %0, %%eax": : "g"(&desc_ptr) : "eax"); Asm("lgdt (%eax) \n" "ljmp $0x8, $csinit \n" /* パイプラインに黎粕みした炭吾をクリアする */ "csinit: \n" "movw $0x10, %ax \n" "movw %ax, %ds \n" "movw %ax, %es \n" "movw %ax, %fs \n" "movw %ax, %gs \n" "movw %ax, %ss"); desc_ptr.limit = sizeof(idt) - 1; desc_ptr.base = (unsigned)idt; Asm("movl %0, %%eax " : : "g"(&desc_ptr) : "eax"); Asm("lidt (%eax) "); set_gate_descriptor( 0, 0x8, exception0, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 1, 0x8, exception1, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 2, 0x8, exception2, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 3, 0x8, exception3, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 4, 0x8, exception4, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 5, 0x8, exception5, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 6, 0x8, exception6, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 7, 0x8, exception7, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 8, 0x8, exception8, I386_TYPE_GATE_INTR, 0); set_gate_descriptor( 9, 0x8, exception9, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(10, 0x8, exception10, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(11, 0x8, exception11, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(12, 0x8, exception12, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(13, 0x8, exception13, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(14, 0x8, exception14, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(16, 0x8, exception16, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(17, 0x8, exception17, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(18, 0x8, exception18, I386_TYPE_GATE_INTR, 0); set_gate_descriptor(19, 0x8, exception19, I386_TYPE_GATE_INTR, 0);}/* * プロセッサ巴赂の姜位借妄 */voidcpu_terminate(){}/* * i386セグメントデスクリプタの肋年 */static voidset_segment_descriptor(int sel, unsigned addr, unsigned limit, unsigned type, unsigned dpl){ SEGDESC *desc; desc = &gdt[sel]; desc->base_L = (addr & 0xffffff); desc->base_H = ((addr >> 24) & 0xff); desc->limit_L = (limit & 0xffff); desc->limit_H = ((limit >> 16) & 0xf); desc->type = (type & 0xf); desc->s = 1; /* code/data segment */ desc->dpl = dpl; desc->p = 1; /* segment is existing */ desc->avl = 0; /* unused */ desc->x = 0; /* reserved */ desc->db = 1; /* 32bits segment */ desc->g = 1; /* 4KB limits */}static voidset_gate_descriptor(int sel, unsigned selector, void *func, unsigned type, unsigned dpl){ GATEDESC *desc; desc = &idt[sel]; desc->offset_L = ((unsigned)func & 0xffff); desc->offset_H = (((unsigned)func >> 16) & 0xffff); desc->selector = selector; desc->copy = 0; desc->type = type; desc->s = 0; desc->dpl = dpl; desc->p = 1;}voiddefine_inh(INHNO inhno, FP inthdr){#if 0 if (inhno >= 256 || inthdr == NULL) { return; /*??? Should I generate assertion? */ }#endif set_gate_descriptor(inhno, 0x8, inthdr, I386_TYPE_GATE_INTR, 0);}voiddefine_exc(EXCNO excno, FP exchdr){#if 0 if (inhno >= 0x20 || inthdr == NULL) { return; /*??? Should I generate assertion? */ }#endif exc_table[excno] = exchdr;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -