Changeset d5b37b6 in mainline for uspace/app/kio/kio.c
- Timestamp:
- 2025-04-17T15:14:03Z (5 days ago)
- Branches:
- master
- Children:
- 690ad20
- Parents:
- 571cc2d
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2025-04-11 17:35:09)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2025-04-17 15:14:03)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/kio/kio.c
r571cc2d rd5b37b6 1 1 /* 2 2 * Copyright (c) 2006 Ondrej Palkovsky 3 * Copyright (c) 2025 Jiří Zárevúcky 3 4 * All rights reserved. 4 5 * … … 34 35 */ 35 36 37 #include <_bits/decls.h> 38 #include <libarch/config.h> 36 39 #include <stdio.h> 37 40 #include <async.h> … … 47 50 #include <adt/prodcons.h> 48 51 #include <tinput.h> 52 #include <uchar.h> 49 53 #include <vfs/vfs.h> 50 54 … … 61 65 static prodcons_t pc; 62 66 63 /* Pointer to kio area */64 static char32_t *kio = (char32_t *) AS_AREA_ANY;65 static size_t kio_length;66 67 67 /* Notification mutex */ 68 68 static FIBRIL_MUTEX_INITIALIZE(mtx); 69 69 70 static size_t last_notification; 70 #define READ_BUFFER_SIZE (PAGE_SIZE / sizeof(char32_t)) 71 72 static size_t current_at; 73 static char32_t read_buffer[READ_BUFFER_SIZE]; 71 74 72 75 /** Klog producer … … 151 154 static void kio_notification_handler(ipc_call_t *call, void *arg) 152 155 { 156 size_t kio_written = (size_t) ipc_get_arg1(call); 157 153 158 /* 154 159 * Make sure we process only a single notification … … 159 164 fibril_mutex_lock(&mtx); 160 165 161 size_t kio_written = (size_t) ipc_get_arg1(call); 162 163 /* This works just fine even when kio_written overflows. */ 164 size_t new_chars = kio_written - last_notification; 165 last_notification = kio_written; 166 167 if (new_chars > kio_length) { 168 /* We missed some data. */ 169 // TODO: Send a message with the number of lost bytes to the consumer. 170 new_chars = kio_length; 171 } 172 173 size_t offset = (kio_written - new_chars) % kio_length; 174 175 /* Copy data from the ring buffer */ 176 if (offset + new_chars > kio_length) { 177 size_t split = kio_length - offset; 178 179 producer(split, kio + offset); 180 producer(new_chars - split, kio); 181 } else { 182 producer(new_chars, kio + offset); 166 while (current_at != kio_written) { 167 size_t read = kio_read(read_buffer, READ_BUFFER_SIZE, current_at); 168 if (read == 0) 169 break; 170 171 current_at += read; 172 173 if (read > READ_BUFFER_SIZE) { 174 /* We missed some data. */ 175 // TODO: Send a message with the number of lost characters to the consumer. 176 read = READ_BUFFER_SIZE; 177 } 178 179 producer(read, read_buffer); 183 180 } 184 181 … … 189 186 int main(int argc, char *argv[]) 190 187 { 191 size_t pages;192 errno_t rc = sysinfo_get_value("kio.pages", &pages);193 if (rc != EOK) {194 fprintf(stderr, "%s: Unable to get number of kio pages\n",195 NAME);196 return rc;197 }198 199 uintptr_t faddr;200 rc = sysinfo_get_value("kio.faddr", &faddr);201 if (rc != EOK) {202 fprintf(stderr, "%s: Unable to get kio physical address\n",203 NAME);204 return rc;205 }206 207 size_t size = pages * PAGE_SIZE;208 kio_length = size / sizeof(char32_t);209 210 rc = physmem_map(faddr, pages, AS_AREA_READ | AS_AREA_CACHEABLE,211 (void *) &kio);212 if (rc != EOK) {213 fprintf(stderr, "%s: Unable to map kio\n", NAME);214 return rc;215 }216 217 188 prodcons_initialize(&pc); 218 rc = async_event_subscribe(EVENT_KIO, kio_notification_handler, NULL);189 errno_t rc = async_event_subscribe(EVENT_KIO, kio_notification_handler, NULL); 219 190 if (rc != EOK) { 220 191 fprintf(stderr, "%s: Unable to register kio notifications\n",
Note:
See TracChangeset
for help on using the changeset viewer.