mc146818rtc.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. /*
  2. * QEMU MC146818 RTC emulation
  3. *
  4. * Copyright (c) 2003-2004 Fabrice Bellard
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #include "hw.h"
  25. #include "qemu-timer.h"
  26. #include "sysemu.h"
  27. #include "pc.h"
  28. #include "apic.h"
  29. #include "isa.h"
  30. #include "mc146818rtc.h"
  31. //#define DEBUG_CMOS
  32. //#define DEBUG_COALESCED
  33. #ifdef DEBUG_CMOS
  34. # define CMOS_DPRINTF(format, ...) printf(format, ## __VA_ARGS__)
  35. #else
  36. # define CMOS_DPRINTF(format, ...) do { } while (0)
  37. #endif
  38. #ifdef DEBUG_COALESCED
  39. # define DPRINTF_C(format, ...) printf(format, ## __VA_ARGS__)
  40. #else
  41. # define DPRINTF_C(format, ...) do { } while (0)
  42. #endif
  43. #define RTC_REINJECT_ON_ACK_COUNT 20
  44. #define RTC_SECONDS 0
  45. #define RTC_SECONDS_ALARM 1
  46. #define RTC_MINUTES 2
  47. #define RTC_MINUTES_ALARM 3
  48. #define RTC_HOURS 4
  49. #define RTC_HOURS_ALARM 5
  50. #define RTC_ALARM_DONT_CARE 0xC0
  51. #define RTC_DAY_OF_WEEK 6
  52. #define RTC_DAY_OF_MONTH 7
  53. #define RTC_MONTH 8
  54. #define RTC_YEAR 9
  55. #define RTC_REG_A 10
  56. #define RTC_REG_B 11
  57. #define RTC_REG_C 12
  58. #define RTC_REG_D 13
  59. #define REG_A_UIP 0x80
  60. #define REG_B_SET 0x80
  61. #define REG_B_PIE 0x40
  62. #define REG_B_AIE 0x20
  63. #define REG_B_UIE 0x10
  64. #define REG_B_SQWE 0x08
  65. #define REG_B_DM 0x04
  66. #define REG_B_24H 0x02
  67. #define REG_C_UF 0x10
  68. #define REG_C_IRQF 0x80
  69. #define REG_C_PF 0x40
  70. #define REG_C_AF 0x20
  71. typedef struct RTCState {
  72. ISADevice dev;
  73. uint8_t cmos_data[128];
  74. uint8_t cmos_index;
  75. struct tm current_tm;
  76. int32_t base_year;
  77. qemu_irq irq;
  78. qemu_irq sqw_irq;
  79. int it_shift;
  80. /* periodic timer */
  81. QEMUTimer *periodic_timer;
  82. int64_t next_periodic_time;
  83. /* second update */
  84. int64_t next_second_time;
  85. uint16_t irq_reinject_on_ack_count;
  86. uint32_t irq_coalesced;
  87. uint32_t period;
  88. QEMUTimer *coalesced_timer;
  89. QEMUTimer *second_timer;
  90. QEMUTimer *second_timer2;
  91. Notifier clock_reset_notifier;
  92. } RTCState;
  93. static void rtc_set_time(RTCState *s);
  94. static void rtc_copy_date(RTCState *s);
  95. #ifdef TARGET_I386
  96. static void rtc_coalesced_timer_update(RTCState *s)
  97. {
  98. if (s->irq_coalesced == 0) {
  99. qemu_del_timer(s->coalesced_timer);
  100. } else {
  101. /* divide each RTC interval to 2 - 8 smaller intervals */
  102. int c = MIN(s->irq_coalesced, 7) + 1;
  103. int64_t next_clock = qemu_get_clock_ns(rtc_clock) +
  104. muldiv64(s->period / c, get_ticks_per_sec(), 32768);
  105. qemu_mod_timer(s->coalesced_timer, next_clock);
  106. }
  107. }
  108. static void rtc_coalesced_timer(void *opaque)
  109. {
  110. RTCState *s = opaque;
  111. if (s->irq_coalesced != 0) {
  112. apic_reset_irq_delivered();
  113. s->cmos_data[RTC_REG_C] |= 0xc0;
  114. DPRINTF_C("cmos: injecting from timer\n");
  115. qemu_irq_raise(s->irq);
  116. if (apic_get_irq_delivered()) {
  117. s->irq_coalesced--;
  118. DPRINTF_C("cmos: coalesced irqs decreased to %d\n",
  119. s->irq_coalesced);
  120. }
  121. }
  122. rtc_coalesced_timer_update(s);
  123. }
  124. #endif
  125. static void rtc_timer_update(RTCState *s, int64_t current_time)
  126. {
  127. int period_code, period;
  128. int64_t cur_clock, next_irq_clock;
  129. period_code = s->cmos_data[RTC_REG_A] & 0x0f;
  130. if (period_code != 0
  131. && ((s->cmos_data[RTC_REG_B] & REG_B_PIE)
  132. || ((s->cmos_data[RTC_REG_B] & REG_B_SQWE) && s->sqw_irq))) {
  133. if (period_code <= 2)
  134. period_code += 7;
  135. /* period in 32 Khz cycles */
  136. period = 1 << (period_code - 1);
  137. #ifdef TARGET_I386
  138. if (period != s->period) {
  139. s->irq_coalesced = (s->irq_coalesced * s->period) / period;
  140. DPRINTF_C("cmos: coalesced irqs scaled to %d\n", s->irq_coalesced);
  141. }
  142. s->period = period;
  143. #endif
  144. /* compute 32 khz clock */
  145. cur_clock = muldiv64(current_time, 32768, get_ticks_per_sec());
  146. next_irq_clock = (cur_clock & ~(period - 1)) + period;
  147. s->next_periodic_time =
  148. muldiv64(next_irq_clock, get_ticks_per_sec(), 32768) + 1;
  149. qemu_mod_timer(s->periodic_timer, s->next_periodic_time);
  150. } else {
  151. #ifdef TARGET_I386
  152. s->irq_coalesced = 0;
  153. #endif
  154. qemu_del_timer(s->periodic_timer);
  155. }
  156. }
  157. static void rtc_periodic_timer(void *opaque)
  158. {
  159. RTCState *s = opaque;
  160. rtc_timer_update(s, s->next_periodic_time);
  161. if (s->cmos_data[RTC_REG_B] & REG_B_PIE) {
  162. s->cmos_data[RTC_REG_C] |= 0xc0;
  163. #ifdef TARGET_I386
  164. if(rtc_td_hack) {
  165. if (s->irq_reinject_on_ack_count >= RTC_REINJECT_ON_ACK_COUNT)
  166. s->irq_reinject_on_ack_count = 0;
  167. apic_reset_irq_delivered();
  168. qemu_irq_raise(s->irq);
  169. if (!apic_get_irq_delivered()) {
  170. s->irq_coalesced++;
  171. rtc_coalesced_timer_update(s);
  172. DPRINTF_C("cmos: coalesced irqs increased to %d\n",
  173. s->irq_coalesced);
  174. }
  175. } else
  176. #endif
  177. qemu_irq_raise(s->irq);
  178. }
  179. if (s->cmos_data[RTC_REG_B] & REG_B_SQWE) {
  180. /* Not square wave at all but we don't want 2048Hz interrupts!
  181. Must be seen as a pulse. */
  182. qemu_irq_raise(s->sqw_irq);
  183. }
  184. }
  185. static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data)
  186. {
  187. RTCState *s = opaque;
  188. if ((addr & 1) == 0) {
  189. s->cmos_index = data & 0x7f;
  190. } else {
  191. CMOS_DPRINTF("cmos: write index=0x%02x val=0x%02x\n",
  192. s->cmos_index, data);
  193. switch(s->cmos_index) {
  194. case RTC_SECONDS_ALARM:
  195. case RTC_MINUTES_ALARM:
  196. case RTC_HOURS_ALARM:
  197. s->cmos_data[s->cmos_index] = data;
  198. break;
  199. case RTC_SECONDS:
  200. case RTC_MINUTES:
  201. case RTC_HOURS:
  202. case RTC_DAY_OF_WEEK:
  203. case RTC_DAY_OF_MONTH:
  204. case RTC_MONTH:
  205. case RTC_YEAR:
  206. s->cmos_data[s->cmos_index] = data;
  207. /* if in set mode, do not update the time */
  208. if (!(s->cmos_data[RTC_REG_B] & REG_B_SET)) {
  209. rtc_set_time(s);
  210. }
  211. break;
  212. case RTC_REG_A:
  213. /* UIP bit is read only */
  214. s->cmos_data[RTC_REG_A] = (data & ~REG_A_UIP) |
  215. (s->cmos_data[RTC_REG_A] & REG_A_UIP);
  216. rtc_timer_update(s, qemu_get_clock_ns(rtc_clock));
  217. break;
  218. case RTC_REG_B:
  219. if (data & REG_B_SET) {
  220. /* set mode: reset UIP mode */
  221. s->cmos_data[RTC_REG_A] &= ~REG_A_UIP;
  222. data &= ~REG_B_UIE;
  223. } else {
  224. /* if disabling set mode, update the time */
  225. if (s->cmos_data[RTC_REG_B] & REG_B_SET) {
  226. rtc_set_time(s);
  227. }
  228. }
  229. if (((s->cmos_data[RTC_REG_B] ^ data) & (REG_B_DM | REG_B_24H)) &&
  230. !(data & REG_B_SET)) {
  231. /* If the time format has changed and not in set mode,
  232. update the registers immediately. */
  233. s->cmos_data[RTC_REG_B] = data;
  234. rtc_copy_date(s);
  235. } else {
  236. s->cmos_data[RTC_REG_B] = data;
  237. }
  238. rtc_timer_update(s, qemu_get_clock_ns(rtc_clock));
  239. break;
  240. case RTC_REG_C:
  241. case RTC_REG_D:
  242. /* cannot write to them */
  243. break;
  244. default:
  245. s->cmos_data[s->cmos_index] = data;
  246. break;
  247. }
  248. }
  249. }
  250. static inline int rtc_to_bcd(RTCState *s, int a)
  251. {
  252. if (s->cmos_data[RTC_REG_B] & REG_B_DM) {
  253. return a;
  254. } else {
  255. return ((a / 10) << 4) | (a % 10);
  256. }
  257. }
  258. static inline int rtc_from_bcd(RTCState *s, int a)
  259. {
  260. if (s->cmos_data[RTC_REG_B] & REG_B_DM) {
  261. return a;
  262. } else {
  263. return ((a >> 4) * 10) + (a & 0x0f);
  264. }
  265. }
  266. static void rtc_set_time(RTCState *s)
  267. {
  268. struct tm *tm = &s->current_tm;
  269. tm->tm_sec = rtc_from_bcd(s, s->cmos_data[RTC_SECONDS]);
  270. tm->tm_min = rtc_from_bcd(s, s->cmos_data[RTC_MINUTES]);
  271. tm->tm_hour = rtc_from_bcd(s, s->cmos_data[RTC_HOURS] & 0x7f);
  272. if (!(s->cmos_data[RTC_REG_B] & REG_B_24H) &&
  273. (s->cmos_data[RTC_HOURS] & 0x80)) {
  274. tm->tm_hour += 12;
  275. }
  276. tm->tm_wday = rtc_from_bcd(s, s->cmos_data[RTC_DAY_OF_WEEK]) - 1;
  277. tm->tm_mday = rtc_from_bcd(s, s->cmos_data[RTC_DAY_OF_MONTH]);
  278. tm->tm_mon = rtc_from_bcd(s, s->cmos_data[RTC_MONTH]) - 1;
  279. tm->tm_year = rtc_from_bcd(s, s->cmos_data[RTC_YEAR]) + s->base_year - 1900;
  280. rtc_change_mon_event(tm);
  281. }
  282. static void rtc_copy_date(RTCState *s)
  283. {
  284. const struct tm *tm = &s->current_tm;
  285. int year;
  286. s->cmos_data[RTC_SECONDS] = rtc_to_bcd(s, tm->tm_sec);
  287. s->cmos_data[RTC_MINUTES] = rtc_to_bcd(s, tm->tm_min);
  288. if (s->cmos_data[RTC_REG_B] & REG_B_24H) {
  289. /* 24 hour format */
  290. s->cmos_data[RTC_HOURS] = rtc_to_bcd(s, tm->tm_hour);
  291. } else {
  292. /* 12 hour format */
  293. s->cmos_data[RTC_HOURS] = rtc_to_bcd(s, tm->tm_hour % 12);
  294. if (tm->tm_hour >= 12)
  295. s->cmos_data[RTC_HOURS] |= 0x80;
  296. }
  297. s->cmos_data[RTC_DAY_OF_WEEK] = rtc_to_bcd(s, tm->tm_wday + 1);
  298. s->cmos_data[RTC_DAY_OF_MONTH] = rtc_to_bcd(s, tm->tm_mday);
  299. s->cmos_data[RTC_MONTH] = rtc_to_bcd(s, tm->tm_mon + 1);
  300. year = (tm->tm_year - s->base_year) % 100;
  301. if (year < 0)
  302. year += 100;
  303. s->cmos_data[RTC_YEAR] = rtc_to_bcd(s, year);
  304. }
  305. /* month is between 0 and 11. */
  306. static int get_days_in_month(int month, int year)
  307. {
  308. static const int days_tab[12] = {
  309. 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  310. };
  311. int d;
  312. if ((unsigned )month >= 12)
  313. return 31;
  314. d = days_tab[month];
  315. if (month == 1) {
  316. if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0))
  317. d++;
  318. }
  319. return d;
  320. }
  321. /* update 'tm' to the next second */
  322. static void rtc_next_second(struct tm *tm)
  323. {
  324. int days_in_month;
  325. tm->tm_sec++;
  326. if ((unsigned)tm->tm_sec >= 60) {
  327. tm->tm_sec = 0;
  328. tm->tm_min++;
  329. if ((unsigned)tm->tm_min >= 60) {
  330. tm->tm_min = 0;
  331. tm->tm_hour++;
  332. if ((unsigned)tm->tm_hour >= 24) {
  333. tm->tm_hour = 0;
  334. /* next day */
  335. tm->tm_wday++;
  336. if ((unsigned)tm->tm_wday >= 7)
  337. tm->tm_wday = 0;
  338. days_in_month = get_days_in_month(tm->tm_mon,
  339. tm->tm_year + 1900);
  340. tm->tm_mday++;
  341. if (tm->tm_mday < 1) {
  342. tm->tm_mday = 1;
  343. } else if (tm->tm_mday > days_in_month) {
  344. tm->tm_mday = 1;
  345. tm->tm_mon++;
  346. if (tm->tm_mon >= 12) {
  347. tm->tm_mon = 0;
  348. tm->tm_year++;
  349. }
  350. }
  351. }
  352. }
  353. }
  354. }
  355. static void rtc_update_second(void *opaque)
  356. {
  357. RTCState *s = opaque;
  358. int64_t delay;
  359. /* if the oscillator is not in normal operation, we do not update */
  360. if ((s->cmos_data[RTC_REG_A] & 0x70) != 0x20) {
  361. s->next_second_time += get_ticks_per_sec();
  362. qemu_mod_timer(s->second_timer, s->next_second_time);
  363. } else {
  364. rtc_next_second(&s->current_tm);
  365. if (!(s->cmos_data[RTC_REG_B] & REG_B_SET)) {
  366. /* update in progress bit */
  367. s->cmos_data[RTC_REG_A] |= REG_A_UIP;
  368. }
  369. /* should be 244 us = 8 / 32768 seconds, but currently the
  370. timers do not have the necessary resolution. */
  371. delay = (get_ticks_per_sec() * 1) / 100;
  372. if (delay < 1)
  373. delay = 1;
  374. qemu_mod_timer(s->second_timer2,
  375. s->next_second_time + delay);
  376. }
  377. }
  378. static void rtc_update_second2(void *opaque)
  379. {
  380. RTCState *s = opaque;
  381. if (!(s->cmos_data[RTC_REG_B] & REG_B_SET)) {
  382. rtc_copy_date(s);
  383. }
  384. /* check alarm */
  385. if (s->cmos_data[RTC_REG_B] & REG_B_AIE) {
  386. if (((s->cmos_data[RTC_SECONDS_ALARM] & 0xc0) == 0xc0 ||
  387. rtc_from_bcd(s, s->cmos_data[RTC_SECONDS_ALARM]) == s->current_tm.tm_sec) &&
  388. ((s->cmos_data[RTC_MINUTES_ALARM] & 0xc0) == 0xc0 ||
  389. rtc_from_bcd(s, s->cmos_data[RTC_MINUTES_ALARM]) == s->current_tm.tm_min) &&
  390. ((s->cmos_data[RTC_HOURS_ALARM] & 0xc0) == 0xc0 ||
  391. rtc_from_bcd(s, s->cmos_data[RTC_HOURS_ALARM]) == s->current_tm.tm_hour)) {
  392. s->cmos_data[RTC_REG_C] |= 0xa0;
  393. qemu_irq_raise(s->irq);
  394. }
  395. }
  396. /* update ended interrupt */
  397. s->cmos_data[RTC_REG_C] |= REG_C_UF;
  398. if (s->cmos_data[RTC_REG_B] & REG_B_UIE) {
  399. s->cmos_data[RTC_REG_C] |= REG_C_IRQF;
  400. qemu_irq_raise(s->irq);
  401. }
  402. /* clear update in progress bit */
  403. s->cmos_data[RTC_REG_A] &= ~REG_A_UIP;
  404. s->next_second_time += get_ticks_per_sec();
  405. qemu_mod_timer(s->second_timer, s->next_second_time);
  406. }
  407. static uint32_t cmos_ioport_read(void *opaque, uint32_t addr)
  408. {
  409. RTCState *s = opaque;
  410. int ret;
  411. if ((addr & 1) == 0) {
  412. return 0xff;
  413. } else {
  414. switch(s->cmos_index) {
  415. case RTC_SECONDS:
  416. case RTC_MINUTES:
  417. case RTC_HOURS:
  418. case RTC_DAY_OF_WEEK:
  419. case RTC_DAY_OF_MONTH:
  420. case RTC_MONTH:
  421. case RTC_YEAR:
  422. ret = s->cmos_data[s->cmos_index];
  423. break;
  424. case RTC_REG_A:
  425. ret = s->cmos_data[s->cmos_index];
  426. break;
  427. case RTC_REG_C:
  428. ret = s->cmos_data[s->cmos_index];
  429. qemu_irq_lower(s->irq);
  430. #ifdef TARGET_I386
  431. if(s->irq_coalesced &&
  432. s->irq_reinject_on_ack_count < RTC_REINJECT_ON_ACK_COUNT) {
  433. s->irq_reinject_on_ack_count++;
  434. apic_reset_irq_delivered();
  435. DPRINTF_C("cmos: injecting on ack\n");
  436. qemu_irq_raise(s->irq);
  437. if (apic_get_irq_delivered()) {
  438. s->irq_coalesced--;
  439. DPRINTF_C("cmos: coalesced irqs decreased to %d\n",
  440. s->irq_coalesced);
  441. }
  442. break;
  443. }
  444. #endif
  445. s->cmos_data[RTC_REG_C] = 0x00;
  446. break;
  447. default:
  448. ret = s->cmos_data[s->cmos_index];
  449. break;
  450. }
  451. CMOS_DPRINTF("cmos: read index=0x%02x val=0x%02x\n",
  452. s->cmos_index, ret);
  453. return ret;
  454. }
  455. }
  456. void rtc_set_memory(ISADevice *dev, int addr, int val)
  457. {
  458. RTCState *s = DO_UPCAST(RTCState, dev, dev);
  459. if (addr >= 0 && addr <= 127)
  460. s->cmos_data[addr] = val;
  461. }
  462. void rtc_set_date(ISADevice *dev, const struct tm *tm)
  463. {
  464. RTCState *s = DO_UPCAST(RTCState, dev, dev);
  465. s->current_tm = *tm;
  466. rtc_copy_date(s);
  467. }
  468. /* PC cmos mappings */
  469. #define REG_IBM_CENTURY_BYTE 0x32
  470. #define REG_IBM_PS2_CENTURY_BYTE 0x37
  471. static void rtc_set_date_from_host(ISADevice *dev)
  472. {
  473. RTCState *s = DO_UPCAST(RTCState, dev, dev);
  474. struct tm tm;
  475. int val;
  476. /* set the CMOS date */
  477. qemu_get_timedate(&tm, 0);
  478. rtc_set_date(dev, &tm);
  479. val = rtc_to_bcd(s, (tm.tm_year / 100) + 19);
  480. rtc_set_memory(dev, REG_IBM_CENTURY_BYTE, val);
  481. rtc_set_memory(dev, REG_IBM_PS2_CENTURY_BYTE, val);
  482. }
  483. static int rtc_post_load(void *opaque, int version_id)
  484. {
  485. #ifdef TARGET_I386
  486. RTCState *s = opaque;
  487. if (version_id >= 2) {
  488. if (rtc_td_hack) {
  489. rtc_coalesced_timer_update(s);
  490. }
  491. }
  492. #endif
  493. return 0;
  494. }
  495. static const VMStateDescription vmstate_rtc = {
  496. .name = "mc146818rtc",
  497. .version_id = 2,
  498. .minimum_version_id = 1,
  499. .minimum_version_id_old = 1,
  500. .post_load = rtc_post_load,
  501. .fields = (VMStateField []) {
  502. VMSTATE_BUFFER(cmos_data, RTCState),
  503. VMSTATE_UINT8(cmos_index, RTCState),
  504. VMSTATE_INT32(current_tm.tm_sec, RTCState),
  505. VMSTATE_INT32(current_tm.tm_min, RTCState),
  506. VMSTATE_INT32(current_tm.tm_hour, RTCState),
  507. VMSTATE_INT32(current_tm.tm_wday, RTCState),
  508. VMSTATE_INT32(current_tm.tm_mday, RTCState),
  509. VMSTATE_INT32(current_tm.tm_mon, RTCState),
  510. VMSTATE_INT32(current_tm.tm_year, RTCState),
  511. VMSTATE_TIMER(periodic_timer, RTCState),
  512. VMSTATE_INT64(next_periodic_time, RTCState),
  513. VMSTATE_INT64(next_second_time, RTCState),
  514. VMSTATE_TIMER(second_timer, RTCState),
  515. VMSTATE_TIMER(second_timer2, RTCState),
  516. VMSTATE_UINT32_V(irq_coalesced, RTCState, 2),
  517. VMSTATE_UINT32_V(period, RTCState, 2),
  518. VMSTATE_END_OF_LIST()
  519. }
  520. };
  521. static void rtc_notify_clock_reset(Notifier *notifier, void *data)
  522. {
  523. RTCState *s = container_of(notifier, RTCState, clock_reset_notifier);
  524. int64_t now = *(int64_t *)data;
  525. rtc_set_date_from_host(&s->dev);
  526. s->next_second_time = now + (get_ticks_per_sec() * 99) / 100;
  527. qemu_mod_timer(s->second_timer2, s->next_second_time);
  528. rtc_timer_update(s, now);
  529. #ifdef TARGET_I386
  530. if (rtc_td_hack) {
  531. rtc_coalesced_timer_update(s);
  532. }
  533. #endif
  534. }
  535. static void rtc_reset(void *opaque)
  536. {
  537. RTCState *s = opaque;
  538. s->cmos_data[RTC_REG_B] &= ~(REG_B_PIE | REG_B_AIE | REG_B_SQWE);
  539. s->cmos_data[RTC_REG_C] &= ~(REG_C_UF | REG_C_IRQF | REG_C_PF | REG_C_AF);
  540. qemu_irq_lower(s->irq);
  541. #ifdef TARGET_I386
  542. if (rtc_td_hack)
  543. s->irq_coalesced = 0;
  544. #endif
  545. }
  546. static int rtc_initfn(ISADevice *dev)
  547. {
  548. RTCState *s = DO_UPCAST(RTCState, dev, dev);
  549. int base = 0x70;
  550. s->cmos_data[RTC_REG_A] = 0x26;
  551. s->cmos_data[RTC_REG_B] = 0x02;
  552. s->cmos_data[RTC_REG_C] = 0x00;
  553. s->cmos_data[RTC_REG_D] = 0x80;
  554. rtc_set_date_from_host(dev);
  555. s->periodic_timer = qemu_new_timer_ns(rtc_clock, rtc_periodic_timer, s);
  556. #ifdef TARGET_I386
  557. if (rtc_td_hack)
  558. s->coalesced_timer =
  559. qemu_new_timer_ns(rtc_clock, rtc_coalesced_timer, s);
  560. #endif
  561. s->second_timer = qemu_new_timer_ns(rtc_clock, rtc_update_second, s);
  562. s->second_timer2 = qemu_new_timer_ns(rtc_clock, rtc_update_second2, s);
  563. s->clock_reset_notifier.notify = rtc_notify_clock_reset;
  564. qemu_register_clock_reset_notifier(rtc_clock, &s->clock_reset_notifier);
  565. s->next_second_time =
  566. qemu_get_clock_ns(rtc_clock) + (get_ticks_per_sec() * 99) / 100;
  567. qemu_mod_timer(s->second_timer2, s->next_second_time);
  568. register_ioport_write(base, 2, 1, cmos_ioport_write, s);
  569. register_ioport_read(base, 2, 1, cmos_ioport_read, s);
  570. isa_init_ioport_range(dev, base, 2);
  571. qdev_set_legacy_instance_id(&dev->qdev, base, 2);
  572. qemu_register_reset(rtc_reset, s);
  573. return 0;
  574. }
  575. ISADevice *rtc_init(int base_year, qemu_irq intercept_irq)
  576. {
  577. ISADevice *dev;
  578. RTCState *s;
  579. dev = isa_create("mc146818rtc");
  580. s = DO_UPCAST(RTCState, dev, dev);
  581. qdev_prop_set_int32(&dev->qdev, "base_year", base_year);
  582. qdev_init_nofail(&dev->qdev);
  583. if (intercept_irq) {
  584. s->irq = intercept_irq;
  585. } else {
  586. isa_init_irq(dev, &s->irq, RTC_ISA_IRQ);
  587. }
  588. return dev;
  589. }
  590. static ISADeviceInfo mc146818rtc_info = {
  591. .qdev.name = "mc146818rtc",
  592. .qdev.size = sizeof(RTCState),
  593. .qdev.no_user = 1,
  594. .qdev.vmsd = &vmstate_rtc,
  595. .init = rtc_initfn,
  596. .qdev.props = (Property[]) {
  597. DEFINE_PROP_INT32("base_year", RTCState, base_year, 1980),
  598. DEFINE_PROP_END_OF_LIST(),
  599. }
  600. };
  601. static void mc146818rtc_register(void)
  602. {
  603. isa_qdev_register(&mc146818rtc_info);
  604. }
  605. device_init(mc146818rtc_register)