|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2024 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // VirtIO エントロピーデバイス ! 9: // ! 10: ! 11: #include "virtio_entropy.h" ! 12: #include "virtio_def.h" ! 13: ! 14: // コンストラクタ ! 15: VirtIOEntropyDevice::VirtIOEntropyDevice(uint slot_) ! 16: : inherited(OBJ_VIRTIO_ENTROPY, slot_) ! 17: { ! 18: // 短縮形 ! 19: AddAlias("vent"); ! 20: ! 21: device_id = VirtIO::DEVICE_ID_ENTROPY; ! 22: int num_max = 4; ! 23: vqueues.emplace_back(0, "RequestQ", num_max); ! 24: ! 25: // 割り込み名 ! 26: strlcpy(intrname, "VIOEnt", sizeof(intrname)); ! 27: // 完了通知メッセージ ! 28: msgid = MessageID::VIRTIO_ENTROPY_DONE; ! 29: ! 30: monitor.func = ToMonitorCallback(&VirtIOEntropyDevice::MonitorUpdate); ! 31: monitor.SetSize(MONITOR_WIDTH, 2 + 4 * 1 + num_max + 3); ! 32: monitor.Regist(ID_MONITOR_VIRTIO_ENTROPY); ! 33: } ! 34: ! 35: // デストラクタ ! 36: VirtIOEntropyDevice::~VirtIOEntropyDevice() ! 37: { ! 38: } ! 39: ! 40: void ! 41: VirtIOEntropyDevice::MonitorUpdate(Monitor *, TextScreen& screen) ! 42: { ! 43: int y = 0; ! 44: ! 45: screen.Clear(); ! 46: ! 47: y = MonitorUpdateDev(screen, y); ! 48: y++; ! 49: y = MonitorUpdateVirtQueue(screen, y, vqueues[0]); ! 50: y++; ! 51: y = MonitorUpdateVirtQDesc(screen, y, vqueues[0]); ! 52: } ! 53: ! 54: // ディスクリプタを一つ処理する。 ! 55: void ! 56: VirtIOEntropyDevice::ProcessDesc(VirtIOReq& req) ! 57: { ! 58: uint32 data = 0; ! 59: ! 60: while (req.pos < req.len) { ! 61: if ((req.pos & 3) == 0) { ! 62: data = rnd(); ! 63: } ! 64: ReqWriteU8(req, data & 0xff); ! 65: data >>= 8; ! 66: } ! 67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.