|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
#include <glib.h>
|
|
Packit |
9eaa09 |
#include <glib-unix.h>
|
|
Packit |
9eaa09 |
#include <stdio.h>
|
|
Packit |
9eaa09 |
#include <stdlib.h>
|
|
Packit |
9eaa09 |
#include "helpers.h"
|
|
Packit |
9eaa09 |
#include "ui.h"
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
gint sort_ints(gconstpointer First, gconstpointer Second)
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
int *first = (int *)First;
|
|
Packit |
9eaa09 |
int *second = (int *)Second;
|
|
Packit |
9eaa09 |
if(*first < *second) {
|
|
Packit |
9eaa09 |
return -1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
if(*first == *second) {
|
|
Packit |
9eaa09 |
return 0;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
if(*first > *second) {
|
|
Packit |
9eaa09 |
return 1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
return 1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
gint sort_all_cpus(gconstpointer First, gconstpointer Second)
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
cpu_ban_t *first, *second;
|
|
Packit |
9eaa09 |
first = (cpu_ban_t *)First;
|
|
Packit |
9eaa09 |
second = (cpu_ban_t *)Second;
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
if(first->number < second->number) {
|
|
Packit |
9eaa09 |
return -1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
if(first->number == second->number) {
|
|
Packit |
9eaa09 |
/* This should never happen */
|
|
Packit |
9eaa09 |
return 0;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
if(first->number > second->number) {
|
|
Packit |
9eaa09 |
return 1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
return 1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
gint sort_all_irqs(gconstpointer First, gconstpointer Second)
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
irq_t *first, *second;
|
|
Packit |
9eaa09 |
first = (irq_t *)First;
|
|
Packit |
9eaa09 |
second = (irq_t *)Second;
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
if(first->vector < second->vector) {
|
|
Packit |
9eaa09 |
return -1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
if(first->vector == second->vector) {
|
|
Packit |
9eaa09 |
/* This should never happen */
|
|
Packit |
9eaa09 |
return 0;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
if(first->vector > second->vector) {
|
|
Packit |
9eaa09 |
return 1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
return 1;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
char * hex_to_bitmap(char hex_digit) {
|
|
Packit |
9eaa09 |
uint8_t digit = 0;
|
|
Packit |
9eaa09 |
if((hex_digit >= '0') && (hex_digit <= '9')) {
|
|
Packit |
9eaa09 |
digit = hex_digit - '0';
|
|
Packit |
9eaa09 |
} else if((hex_digit >= 'a') && (hex_digit <= 'f')) {
|
|
Packit |
9eaa09 |
digit = hex_digit - 'a' + 10;
|
|
Packit |
9eaa09 |
} else if((hex_digit >= 'A') && (hex_digit <= 'F')) {
|
|
Packit |
9eaa09 |
digit = hex_digit - 'A' + 10;
|
|
Packit |
9eaa09 |
} else {
|
|
Packit |
9eaa09 |
return "0000\0";
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
char *bitmap = malloc(5 * sizeof(char));
|
|
Packit |
9eaa09 |
bitmap[4] = '\0';
|
|
Packit |
9eaa09 |
int i;
|
|
Packit |
9eaa09 |
for(i = 3; i >= 0; i--) {
|
|
Packit |
9eaa09 |
bitmap[i] = digit % 2 ? '1' : '0';
|
|
Packit |
9eaa09 |
digit /= 2;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
return bitmap;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
gpointer copy_cpu_ban(gconstpointer src, gpointer data __attribute__((unused)))
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
cpu_ban_t *old = (cpu_ban_t *)src;
|
|
Packit |
9eaa09 |
cpu_ban_t *new = malloc(sizeof(cpu_ban_t));
|
|
Packit |
9eaa09 |
new->number = old->number;
|
|
Packit |
9eaa09 |
new->is_banned = old->is_banned;
|
|
Packit |
9eaa09 |
return new;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
gpointer copy_irq(gconstpointer src, gpointer data __attribute__((unused)))
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
irq_t *old = (irq_t *)src;
|
|
Packit |
9eaa09 |
irq_t *new = malloc(sizeof(irq_t));
|
|
Packit |
9eaa09 |
new->vector = old->vector;
|
|
Packit |
9eaa09 |
new->load = old->load;
|
|
Packit |
9eaa09 |
new->diff = old->diff;
|
|
Packit |
9eaa09 |
new->is_banned = old->is_banned;
|
|
Packit |
9eaa09 |
new->class = old->class;
|
|
Packit |
9eaa09 |
new->assigned_to = g_list_copy(old->assigned_to);
|
|
Packit |
9eaa09 |
return new;
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
void for_each_cpu(GList *list, void (*fp)(cpu_ban_t *cpu, void *data), void *data)
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
GList *entry;
|
|
Packit |
9eaa09 |
entry = g_list_first(list);
|
|
Packit |
9eaa09 |
while(entry) {
|
|
Packit |
9eaa09 |
fp(entry->data, data);
|
|
Packit |
9eaa09 |
entry = g_list_next(entry);
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
void for_each_int(GList *list, void (*fp)(int *number, void *data), void *data)
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
GList *entry;
|
|
Packit |
9eaa09 |
entry = g_list_first(list);
|
|
Packit |
9eaa09 |
while(entry) {
|
|
Packit |
9eaa09 |
fp(entry->data, data);
|
|
Packit |
9eaa09 |
entry = g_list_next(entry);
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
void for_each_irq(GList *list, void (*fp)(irq_t *irq, void *data), void *data)
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
GList *entry;
|
|
Packit |
9eaa09 |
entry = g_list_first(list);
|
|
Packit |
9eaa09 |
while(entry) {
|
|
Packit |
9eaa09 |
fp(entry->data, data);
|
|
Packit |
9eaa09 |
entry = g_list_next(entry);
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
void for_each_node(GList *list, void (*fp)(cpu_node_t *node, void *data), void *data)
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
GList *entry;
|
|
Packit |
9eaa09 |
entry = g_list_first(list);
|
|
Packit |
9eaa09 |
while(entry) {
|
|
Packit |
9eaa09 |
fp(entry->data, data);
|
|
Packit |
9eaa09 |
entry = g_list_next(entry);
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
/* Programmer debugging functions */
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
void dump_irq(irq_t *irq, void *data __attribute__((unused)))
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
printf("IRQ %d\n", irq->vector);
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
void dump_node(cpu_node_t *node, void *data __attribute__((unused)))
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
printf("TYPE %d NUMBER %d\n", node->type, node->number);
|
|
Packit |
9eaa09 |
if(g_list_length(node->irqs) > 0) {
|
|
Packit |
9eaa09 |
for_each_irq(node->irqs, dump_irq, NULL);
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
if(g_list_length(node->children) > 0) {
|
|
Packit |
9eaa09 |
for_each_node(node->children, dump_node, NULL);
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|
|
Packit |
9eaa09 |
void dump_tree()
|
|
Packit |
9eaa09 |
{
|
|
Packit |
9eaa09 |
for_each_node(tree, dump_node, NULL);
|
|
Packit |
9eaa09 |
}
|
|
Packit |
9eaa09 |
|