static ssize_t kmsg_read(fildes_t* file, uint8_t* buffer, size_t size) { size_t start, i = 0; if (BUILTIN_EXPECT(!buffer, 0)) return -EINVAL; if (BUILTIN_EXPECT(!size, 0)) return 0; if (kmessages[(atomic_int32_read(&kmsg_counter) + 1) % KMSG_SIZE] == 0) start = 0; else start = (atomic_int32_read(&kmsg_counter) + 1) % KMSG_SIZE; if (((start + file->offset) % KMSG_SIZE) == atomic_int32_read(&kmsg_counter)) return 0; if (file->offset >= KMSG_SIZE) return 0; for(i=0; i<size; i++, file->offset++) { buffer[i] = kmessages[(start + file->offset) % KMSG_SIZE]; if (((start + file->offset) % KMSG_SIZE) == atomic_int32_read(&kmsg_counter)) return i; } return size; }
int smp_start(void) { int32_t core_id = atomic_int32_read(¤t_boot_id); LOG_INFO("Try to initialize processor (local id %d)\n", core_id); cpu_detection(); atomic_int32_inc(&cpu_online); irq_enable(); return smp_main(); }