summaryrefslogtreecommitdiff
path: root/xxx/inactive/mp.c
diff options
context:
space:
mode:
Diffstat (limited to 'xxx/inactive/mp.c')
-rw-r--r--xxx/inactive/mp.c179
1 files changed, 0 insertions, 179 deletions
diff --git a/xxx/inactive/mp.c b/xxx/inactive/mp.c
deleted file mode 100644
index 1f6c2e6..0000000
--- a/xxx/inactive/mp.c
+++ /dev/null
@@ -1,179 +0,0 @@
-#define FOOLOS_MODULE_NAME "mp"
-
-#include "x86.h"
-#include "lib/logger/log.h" // logger facilities
-#include "lib/bool/bool.h"
-#include "lib/string/string.h"
-#include "smp.h"
-
-
-
-typedef struct mp_fps_struct
-{
- uint32_t sig; //signature "_MP_"
- uint32_t conf; //pointer to config struct
- uint8_t length; //should be 1
- uint8_t version; // 1=1.1, 4=1.4
-
- uint8_t checksum;
-
- uint8_t features1;
- uint8_t features2;
-
- uint8_t res1; //reserved
- uint8_t res2;
- uint8_t res3;
-
-}mp_fps;
-
-typedef struct mp_config_struct
-{
- uint32_t sig; //signature "PCMP"
- uint16_t length; //base table length
- uint8_t version; //revision 1=1.1 4=1.4
- uint8_t checksum;
-
- uint32_t oemid1; //OEM id (ascii)
- uint32_t oemid2;
-
- uint32_t prodid1; //Product id (ascii)
- uint32_t prodid2;
- uint32_t prodid3;
-
- uint32_t oem_table; //pointer (optional)
- uint16_t oem_size; //size of this table
- uint16_t entries; //entry count (following the header)
- uint32_t local_apic; //local apic address (same for every cpu)
- uint16_t length_ext; //extended table length (optional)
- uint8_t check_ext; //checksum for ext. table
-
-}mp_config;
-
-
-
-typedef struct proc_struct
-{
- uint8_t type; //0=processor
- uint8_t apic_id;
- uint8_t apic_ver;
- uint8_t cpu_bits;
- uint32_t cpu_sig;
- uint32_t cpu_flags;
-
-}proc_entry;
-
-//entries are sorted. (otherwise ignore. bochs!)
-uint8_t *walk_mp_table(uint8_t *start_addr,smp_processors *smp)
-{
-
- if(*start_addr==0x0||*start_addr==0x2)
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"entry type: %d",*start_addr);
-
- // that is a processor
- if(*start_addr==0x00)
- {
- proc_entry *pro=start_addr;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"local apic id: %02X",pro->apic_id);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cpu enabled bit: %s",pro->cpu_bits&1?"yes":"no");
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bootstrap cpu bit: %s",pro->cpu_bits&2?"yes":"no");
-
- // that is a enabled processor
- if(pro->cpu_bits&1)
- {
- if(smp->processors>=SMP_MAX_PROC)
- panic(FOOLOS_MODULE_NAME,"we do not support that many processors. recompile with higher SMP_MAX_PROC.");
-
- smp->local_apic_id[smp->processors]=pro->apic_id;
- // that is the bootstrap processor
- if(pro->cpu_bits&2)smp->boot=smp->processors;
- smp->processors++;
-
- }
-
- return start_addr+20;
- }
-
- return start_addr+8;
-}
-
-void do_mp_conf(mp_config *addr,smp_processors *procdata)
-{
- char buf[]="XXXX";
- uint32_t *buf_addr=buf;
- *buf_addr=addr->sig;
-
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config table addr: %08X",addr);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config signature: %s",buf);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config version: %02X",addr->version);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config # of entries: %d",addr->entries);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config local apic addr: 0x%08X",addr->local_apic);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mp_config tabel length: %d",addr->length);
-
- uint8_t *start_addr=addr;
- start_addr+=44;
-
- procdata->processors=0;
- procdata->local_apic_address=addr->local_apic;
-
-
- for(int i=0;i<addr->entries;i++)
- {
- start_addr=walk_mp_table(start_addr,procdata);
- }
-
-
-
-
-}
-bool do_mp_fps(mp_fps *addr,smp_processors *procdata)
-{
-
- if(addr->length!=1)return false;
- if(addr->version!=1&&addr->version!=4)return false;
-
- char buf[]="XXXX";
- uint32_t *buf_addr=buf;
- *buf_addr=addr->sig;
-
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"signature: %s",buf);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"conf: %08X",addr->conf);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"ver: %02X",addr->version);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"f1: %02X",addr->features1);
-
- if(addr->features1!=0)panic(FOOLOS_MODULE_NAME,"Intel default config not supported yet!");
- do_mp_conf(addr->conf,procdata);
-
- return true;
-}
-
-// todo: check checksum,version etc. and narrow down search
-bool mp_find(smp_processors *procdata)
-{
-
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Looking for Mp Floating Ponter Struct...");
- uint8_t *addr=0x8000;
- while(addr<=0xfffff)
- {
- if(strcmp("_MP_",addr,4))
- {
- // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Found at 0x%04X",addr);
- if(do_mp_fps(addr,procdata))return true;
- }
- addr++;
- }
-
- addr=0x190000-1025;
- while(addr<=0x190000+1024)
- {
- if(strcmp("_MP_",addr,4))
- {
- // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Found at 0x%04X",addr);
- if(do_mp_fps(addr,procdata))return true;
- }
- addr++;
- }
-
- return false;
-
-}
-