@@ -21,15 +21,17 @@ static int apic_initialized = 0;
2121 * @brief APICレジスタを読み取る
2222 */
2323static inline uint32_t apic_read (uint32_t reg ) {
24- if (!apic_base ) return 0 ;
24+ if (!apic_base )
25+ return 0 ;
2526 return * (volatile uint32_t * )((uint8_t * )apic_base + reg );
2627}
2728
2829/**
2930 * @brief APICレジスタに書き込む
3031 */
3132static inline void apic_write (uint32_t reg , uint32_t value ) {
32- if (!apic_base ) return ;
33+ if (!apic_base )
34+ return ;
3335 * (volatile uint32_t * )((uint8_t * )apic_base + reg ) = value ;
3436}
3537
@@ -38,16 +40,14 @@ static inline void apic_write(uint32_t reg, uint32_t value) {
3840 */
3941static int check_apic_support (void ) {
4042 uint32_t eax , edx ;
41-
43+
4244 /* CPUID 機能 1: プロセッサ情報と機能ビット */
43- __asm__ volatile (
44- "movl $1, %%eax\n"
45- "cpuid\n"
46- : "=a" (eax ), "=d" (edx )
47- :
48- : "ebx" , "ecx"
49- );
50-
45+ __asm__ volatile ("movl $1, %%eax\n"
46+ "cpuid\n"
47+ : "=a" (eax ), "=d" (edx )
48+ :
49+ : "ebx" , "ecx" );
50+
5151 /* EDXのビット9がAPICサポートを示す */
5252 return (edx & (1 << 9 )) ? 1 : 0 ;
5353}
@@ -57,16 +57,14 @@ static int check_apic_support(void) {
5757 */
5858static uint32_t get_apic_base (void ) {
5959 uint32_t eax , edx ;
60-
60+
6161 /* MSR 0x1B (IA32_APIC_BASE) を読み取る */
62- __asm__ volatile (
63- "movl $0x1B, %%ecx\n"
64- "rdmsr\n"
65- : "=a" (eax ), "=d" (edx )
66- :
67- : "ecx"
68- );
69-
62+ __asm__ volatile ("movl $0x1B, %%ecx\n"
63+ "rdmsr\n"
64+ : "=a" (eax ), "=d" (edx )
65+ :
66+ : "ecx" );
67+
7068 /* 下位12bitをマスクしてベースアドレスを取得 */
7169 return eax & 0xFFFFF000 ;
7270}
@@ -79,14 +77,16 @@ static uint32_t get_apic_base(void) {
7977/**
8078 * @brief ACPI PM Timerの周波数(固定)
8179 */
82- #define ACPI_PM_TIMER_FREQ 3579545 /* 3.579545 MHz */
80+ #define ACPI_PM_TIMER_FREQ 3579545 /* 3.579545 MHz */
8381
8482/**
8583 * @brief ACPI PM Timerから現在のカウント値を読み取る
8684 */
8785static inline uint32_t read_acpi_pm_timer (void ) {
8886 uint32_t value ;
89- __asm__ volatile ("inl %1, %0" : "=a" (value ) : "d" ((uint16_t )ACPI_PM_TIMER_PORT ));
87+ __asm__ volatile ("inl %1, %0"
88+ : "=a" (value )
89+ : "d" ((uint16_t )ACPI_PM_TIMER_PORT ));
9090 return value & 0x00FFFFFF ;
9191}
9292
@@ -95,15 +95,16 @@ static inline uint32_t read_acpi_pm_timer(void) {
9595 */
9696static uint32_t calibrate_apic_timer (void ) {
9797 uint32_t target_ticks = ACPI_PM_TIMER_FREQ / 100 ; /* 10ms */
98-
98+
9999 /* APIC Timer を分周比16、最大値で開始 */
100100 apic_write (APIC_TIMER_DIV , APIC_TIMER_DIV_16 );
101101 apic_write (APIC_TIMER_INIT , 0xFFFFFFFF );
102-
102+
103103 /* ACPI PM Timerの開始値を読み取る */
104104 uint32_t pm_start = read_acpi_pm_timer ();
105- uint32_t pm_end = (pm_start + target_ticks ) & 0x00FFFFFF ; /* 24bitでラップアラウンド */
106-
105+ uint32_t pm_end = (pm_start + target_ticks ) &
106+ 0x00FFFFFF ; /* 24bitでラップアラウンド */
107+
107108 /* ACPI PM Timerが目標値に達するまで待機 */
108109 uint32_t pm_current ;
109110 if (pm_end > pm_start ) {
@@ -117,18 +118,19 @@ static uint32_t calibrate_apic_timer(void) {
117118 pm_current = read_acpi_pm_timer ();
118119 } while (pm_current >= pm_start || pm_current < pm_end );
119120 }
120-
121+
121122 /* APICタイマーのカウントを読み取り */
122123 uint32_t apic_elapsed = 0xFFFFFFFF - apic_read (APIC_TIMER_CURRENT );
123-
124+
124125 uint32_t freq = apic_elapsed * 100 ;
125-
126+
126127 if (freq < 100000 || freq > 100000000 ) {
127128 /* 異常値の場合はデフォ値 */
128- printk ("APIC Timer: Calibration failed (freq=%u), using default\n" , freq );
129+ printk ("APIC Timer: Calibration failed (freq=%u), using default\n" ,
130+ freq );
129131 return 2000000 ; /* 2 MHz */
130132 }
131-
133+
132134 return freq ;
133135}
134136
@@ -144,7 +146,7 @@ int apic_timer_init(void) {
144146 printk ("APIC Timer: CPU does not support APIC\n" );
145147 return -1 ;
146148 }
147-
149+
148150 /* APICベースアドレスを取得 */
149151 uint32_t base_addr = get_apic_base ();
150152 apic_base = (volatile uint32_t * )base_addr ;
@@ -155,7 +157,7 @@ int apic_timer_init(void) {
155157 /* APICを有効化 (Spurious Interrupt Vector Register) */
156158 uint32_t spurious = apic_read (APIC_SPURIOUS );
157159 spurious |= (1 << 8 ); /* APIC Software Enable */
158- spurious |= 0xFF ; /* Spurious Vector = 0xFF */
160+ spurious |= 0xFF ; /* Spurious Vector = 0xFF */
159161 apic_write (APIC_SPURIOUS , spurious );
160162
161163#ifdef INIT_MSG
@@ -164,13 +166,13 @@ int apic_timer_init(void) {
164166#endif
165167 apic_timer_frequency = calibrate_apic_timer ();
166168#ifdef INIT_MSG
167- printk ("APIC Timer: Frequency = %u Hz (%u MHz)\n" ,
168- apic_timer_frequency , apic_timer_frequency / 1000000 );
169+ printk ("APIC Timer: Frequency = %u Hz (%u MHz)\n" , apic_timer_frequency ,
170+ apic_timer_frequency / 1000000 );
169171#endif
170-
172+
171173 /* タイマーをPeriodic モードで設定 */
172174 apic_write (APIC_TIMER_DIV , APIC_TIMER_DIV_16 ); /* 分周比16 */
173-
175+
174176 /* ベクタ番号48、Periodicモード、割り込みマスクなし */
175177 uint32_t lvt = APIC_TIMER_MODE_PERIODIC | 48 ;
176178 apic_write (APIC_TIMER_LVT , lvt );
@@ -182,7 +184,8 @@ int apic_timer_init(void) {
182184 apic_write (APIC_TIMER_INIT , init_count );
183185
184186#ifdef INIT_MSG
185- printk ("APIC Timer: Running at 1000 Hz (initial count = %u)\n" , init_count );
187+ printk ("APIC Timer: Running at 1000 Hz (initial count = %u)\n" ,
188+ init_count );
186189#endif
187190 boot_tick_count = 0 ;
188191 current_tick_count = 0 ;
@@ -210,11 +213,12 @@ int apic_timer_available(void) {
210213void apic_timer_tick (uint32_t irq , void * context ) {
211214 (void )irq ;
212215 (void )context ;
213-
214- if (!apic_initialized ) return ;
215-
216+
217+ if (!apic_initialized )
218+ return ;
219+
216220 current_tick_count ++ ;
217-
221+
218222 /* EOI (End of Interrupt) を送信 */
219223 if (apic_base ) {
220224 apic_write (APIC_EOI , 0 );
@@ -228,10 +232,10 @@ uint64_t apic_get_uptime_us(void) {
228232 if (!apic_initialized ) {
229233 return 0 ;
230234 }
231-
235+
232236 /* current_tick_count は1msごとに増加 */
233237 uint64_t ticks = current_tick_count - boot_tick_count ;
234-
238+
235239 /* ティック数をマイクロ秒に変換 (1 tick = 1ms = 1000us) */
236240 return ticks * 1000ULL ;
237241}
@@ -243,7 +247,7 @@ uint64_t apic_get_uptime_ms(void) {
243247 if (!apic_initialized ) {
244248 return 0 ;
245249 }
246-
250+
247251 /* current_tick_count は1msごとに増加 */
248252 return current_tick_count - boot_tick_count ;
249253}
@@ -259,11 +263,12 @@ uint32_t apic_timer_get_frequency(void) {
259263 * @brief 指定マイクロ秒だけ遅延
260264 */
261265void apic_timer_delay_us (uint32_t us ) {
262- if (!apic_initialized ) return ;
263-
266+ if (!apic_initialized )
267+ return ;
268+
264269 uint64_t start = apic_get_uptime_us ();
265270 uint64_t target = start + us ;
266-
271+
267272 while (apic_get_uptime_us () < target ) {
268273 __asm__ volatile ("pause" );
269274 }
0 commit comments