From f2640c70a5e3259a86820857a08d3b41edcbb0db Mon Sep 17 00:00:00 2001 From: lolo859 Date: Wed, 4 Feb 2026 23:13:24 +0100 Subject: [PATCH] whole archive start --- all.tar.gz | Bin 0 -> 24724 bytes build.sh | 2 +- ccc.cpp | 344 +++++++++++++++++-------- ccc.cpp.ccc | Bin 8129 -> 0 bytes hello.c | 6 + hello.c.ccc | Bin 111 -> 0 bytes log.c | 409 +++++++++++++++++++++++++++++ page.c | 721 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test.c.ccc | Bin 21162 -> 0 bytes 9 files changed, 1377 insertions(+), 105 deletions(-) create mode 100644 all.tar.gz delete mode 100644 ccc.cpp.ccc delete mode 100644 hello.c.ccc create mode 100644 log.c create mode 100644 page.c delete mode 100644 test.c.ccc diff --git a/all.tar.gz b/all.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a358a4dd88221d017b0632f997c0397f5dd5e476 GIT binary patch literal 24724 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 #include #include +#include using namespace std; namespace fs=filesystem; const vector CCC_C_KEYYORD_HEAD {0,0,0}; @@ -157,7 +158,9 @@ const vector c_keywords={ "unsigned", "void", "volatile", - "while" + "while", + "__asm__", + "__attribute__" }; struct symbol { string name; @@ -177,10 +180,19 @@ void insert(node* root,string str,int id) { } curr->token_id=id; } -vector all_tokens; -void get_all_nodes(TSNode node,const string &source_code,map &rec_map) { +struct processed_file { + string path; + uint32_t payload_size; + vector payload; + bool is_payload_compressed; +}; +map> all_tokens; +map rec_map; +vector rec_list; +bool debug=false; +void get_all_nodes(TSNode node,const string &source_code,map &rec_map,const string& file) { if (ts_node_child_count(node)==0) { - all_tokens.push_back(node); + all_tokens[file].push_back(node); string text=source_code.substr(ts_node_start_byte(node),ts_node_end_byte(node)-ts_node_start_byte(node)); if (string(ts_node_type(node))=="string_content" || string(ts_node_type(node))=="system_lib_string" || string(ts_node_type(node))=="identifier" || string(ts_node_type(node))=="number_literal" || string(ts_node_type(node))=="type_identifier" || string(ts_node_type(node))=="field_identifier" || string(ts_node_type(node))=="escape_sequence" || string(ts_node_type(node))=="statement_identifier") { rec_map[text]++; @@ -188,11 +200,14 @@ void get_all_nodes(TSNode node,const string &source_code,map &rec_ma if (string(ts_node_type(node))=="primitive_type" && find(c_keywords.begin(),c_keywords.end(),text)==c_keywords.end()) { rec_map[text]++; } + if (string(ts_node_type(node))=="comment") { + rec_map[text]=2; + } } else { uint32_t child_count=ts_node_child_count(node); for (uint32_t i=0;i generate_string_content(string str) { } return out; } -vector process_all_nodes(vector *nodes,string code,vector &rec_list) { +void print_debug(string text) { + if (debug==true) { + cout< process_file_nodes(vector *nodes,string code,vector &rec_list) { vector out; for (int i=0;isize();i++) { string type=string(ts_node_type(nodes->at(i))); if (type=="#if") { CCC_ADD_COMPOMENT(out,CCC_PREPROCESSOR_CONDITIONAL_IF); - cout<<"if"<at(i)),ts_node_end_byte(nodes->at(i))-ts_node_start_byte(nodes->at(i))); auto it=find(rec_list.begin(),rec_list.end(),text); @@ -342,17 +362,17 @@ vector process_all_nodes(vector *nodes,string code,vector if (!text.empty()) { string text=code.substr(ts_node_start_byte(nodes->at(i)),ts_node_end_byte(nodes->at(i))-ts_node_start_byte(nodes->at(i))); CCC_ADD_COMPOMENT(out,generate_string_content(text)); - cout<<"string ("<at(i)),ts_node_end_byte(nodes->at(i))-ts_node_start_byte(nodes->at(i))); @@ -360,21 +380,21 @@ vector process_all_nodes(vector *nodes,string code,vector if (it!=c_keywords.end()) { size_t index=distance(c_keywords.begin(),it); CCC_ADD_COMPOMENT(out,generate_c_keyword(index)); - cout<<"primitive_type: "< process_all_nodes(vector *nodes,string code,vector if (it!=delimiter.end()) { size_t index=distance(delimiter.begin(),it); CCC_ADD_COMPOMENT(out,generate_delimiter(index)); - cout<<"delimiter: "< process_all_nodes(vector *nodes,string code,vector if (it!=other_grammer.end()) { size_t index=distance(other_grammer.begin(),it); CCC_ADD_COMPOMENT(out,generate_other_grammar(index)); - cout<<"other grammar: "< process_all_nodes(vector *nodes,string code,vector if (it!=c_keywords.end()) { size_t index=distance(c_keywords.begin(),it); CCC_ADD_COMPOMENT(out,generate_c_keyword(index)); - cout<<"c keyword: "< process_all_nodes(vector *nodes,string code,vector if (it!=miscellaneous.end()) { size_t index=distance(miscellaneous.begin(),it); CCC_ADD_COMPOMENT(out,generate_miscellaneous(index)); - cout<<"miscellaneous: "<at(i)),ts_node_end_byte(nodes->at(i))-ts_node_start_byte(nodes->at(i))); + auto it=find(rec_list.begin(),rec_list.end(),text); + if (it==rec_list.end()) { + cout<<"Error: comment in reccurences map not found: "<size()) { if (string(ts_node_type(nodes->at(i+1)))=="\"") { auto it=find(delimiter.begin(),delimiter.end(),""); size_t index=distance(delimiter.begin(),it); CCC_ADD_COMPOMENT(out,generate_delimiter(index)); - cout<<"double quotes mark, inserting delimiter for empty string"<at(i)),ts_node_end_byte(nodes->at(i))-ts_node_start_byte(nodes->at(i))); - cout<<"unknow node type: "<"<(file)),istreambuf_iterator()); - TSParser *parser=ts_parser_new(); - ts_parser_set_language(parser,tree_sitter_c()); - TSTree *tree=ts_parser_parse_string(parser,nullptr,code.c_str(),code.size()); - TSNode root=ts_tree_root_node(tree); - map rec_map; - vector rec_list; - get_all_nodes(root,code,rec_map); - for (auto s:rec_map) { - if (s.second>=2 and s.first.size()>=3 && s.first.size()<=256) { - rec_list.push_back(s.first); - } - } - auto payload=process_all_nodes(&all_tokens,code,rec_list); - vector out={0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,1,0,1,0,0,0,0,1,1}; - for (int i=63;i>=0;i--) { - bool enabled=(rec_list.size()>>i)&0x01; - out.push_back(enabled); - } - for (int i=0;i=0;i--) { - bool enabled=(size>>i)&0x01; - out.push_back(enabled); - } - for (auto c:rec_list[i]) { - for (int i=7;i>=0;i--) { - bool enabled=(c>>i)&0x01; - out.push_back(enabled); - } - } - } - CCC_ADD_COMPOMENT(out,payload); - vector outbytes; + vector payload_bytes; unsigned char current=0; - int bit_index=0; + size_t bit_index=0; for (bool b:out) { current|=(b<<(7-bit_index)); bit_index++; if (bit_index==8) { - outbytes.push_back(current); + payload_bytes.push_back(current); current=0; bit_index=0; } } if (bit_index!=0) { - outbytes.push_back(current); + payload_bytes.push_back(current); } - ofstream fileout(filepath+".ccc",ios::binary); - if (!fileout) { - cout<<"Error: couldn't open output file."< &files_content,vector files_names) { + for (int i=0;i=2 and s.first.size()>=3) { + rec_list.push_back(s.first); + } + } +} +int main(int argc,char **argv) { + if (argc<2) { + cout<<"Usage: ccc [FILES]"<(outbytes.data()),outbytes.size()); - fileout.close(); - cout<<"Reccurences map entry count: "< files; + for (int i=1;i files_content; + for (auto f:files) { + ifstream file(f,ios::binary); + if (!file) { + cout<<"Error: couldn't open provided file."<(file)),istreambuf_iterator()); + files_content.push_back(code); + } + construct_rec_table(files_content,files); + vector files_archive; + for (int i=0;i payload_compressed; + payload_compressed.resize(payload_bytes.size()+payload_bytes.size()/3+128); + lzma_stream strm=LZMA_STREAM_INIT; + if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { + cout<<"Error: couldn't initialize LZMA compressor for file: "<=original_size) { + pfile.is_payload_compressed=false; + pfile.payload=payload_bytes; + pfile.payload_size=original_size; + } else { + pfile.is_payload_compressed=true; + pfile.payload=payload_compressed; + pfile.payload_size=compressed_size; + } + cout< rec_table; + // for (int i=0;i rec_table_compressed; + // rec_table_compressed.resize(rec_table.size()+rec_table.size()/3+128); + // lzma_stream strm=LZMA_STREAM_INIT; + // if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { + // cout<<"Error: couldn't initialize LZMA compressor."< out; + // out.push_back('C'); + // out.push_back(compressed_size>=original_size?'C':'c'); + // vector payload_bytes; + // unsigned char current=0; + // size_t bit_index=0; + // for (bool b:payload) { + // current|=(b<<(7-bit_index)); + // bit_index++; + // if (bit_index==8) { + // payload_bytes.push_back(current); + // current=0; + // bit_index=0; + // } + // } + // if (bit_index!=0) { + // payload_bytes.push_back(current); + // } + // vector payload_compressed; + // payload_compressed.resize(payload_bytes.size()+payload_bytes.size()/3+128); + // strm=LZMA_STREAM_INIT; + // if (lzma_easy_encoder(&strm,9,LZMA_CHECK_CRC64)!=LZMA_OK) { + // cout<<"Error: couldn't initialize LZMA compressor."<=original_size1?'C':'c'); + // if (compressed_size>=original_size) { + // CCC_ADD_COMPOMENT(out,rec_table); + // } else { + // CCC_ADD_COMPOMENT(out,rec_table_compressed); + // } + // if (compressed_size1>=original_size1) { + // CCC_ADD_COMPOMENT(out,payload_bytes); + // } else { + // CCC_ADD_COMPOMENT(out,payload_compressed); + // } + // ofstream fileout("test.ccc",ios::binary); + // if (!fileout) { + // cout<<"Error: couldn't open output file."<(out.data()),out.size()); + // fileout.close(); + // return 0; } diff --git a/ccc.cpp.ccc b/ccc.cpp.ccc deleted file mode 100644 index 2a838435de6a30983f2f372d4998da94fcce01b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8129 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 diff --git a/hello.c b/hello.c index 458e355..fcf50b7 100644 --- a/hello.c +++ b/hello.c @@ -1,6 +1,12 @@ #include #include typedef static unsigned char HEY; +// hello +// hello +// hello +// hello +// hello +// hello int main() { hello[]="hello"; HEY res=8; diff --git a/hello.c.ccc b/hello.c.ccc deleted file mode 100644 index 1dcd819d9526ede3ac7ee72bb77f18d76b979df7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmZ>Ec4mM8W@Zo9NY;$hoSb~-qSRvVdBra$`+dD7&j4Y)>)v9=p!%-X;LGJ6h9$hs z7q;gfUS7cNvoYu6o~0jS-${BsXOL@^N{v6~V48ZzGV|_b1GX7ktIhn14PT+U0 JJ;8h}0RTXsE{p&G diff --git a/log.c b/log.c new file mode 100644 index 0000000..54df5d6 --- /dev/null +++ b/log.c @@ -0,0 +1,409 @@ +#include "../include/log.h" +#include "../include/page.h" +sh_uint8 kernel_log_level=0; +static inline sh_uint8 inb(sh_uint16 port) { + sh_uint8 val; + __asm__ volatile ("inb %1, %0":"=a"(val):"Nd"(port)); + return val; +} +static inline void outb(sh_uint16 port,sh_uint8 val) { + __asm__ volatile ("outb %0, %1"::"a"(val),"Nd"(port)); +} +SH_STATUS sh_log_send_byte(sh_uint8 b) { + while (!(inb(SH_LOG_SERIAL_PORT_COM1+5) & 0x20)); + outb(SH_LOG_SERIAL_PORT_COM1,b); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_send_string(const char* str) { + while (*str) { + sh_log_send_byte(*str++); + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_send_uintn(sh_uint64 n) { + char buf[20]; + sh_uint32 i=0; + if (n==0) { + sh_log_send_byte('0'); + return SH_STATUS_SUCCESS; + } + while (n>0) { + buf[i++]='0'+(n%10); + n/=10; + } + while (i--) { + sh_log_send_byte(buf[i]); + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_send_uintn_hex(sh_uint64 n) { + char buf[16]; + sh_uint32 i=0; + const char hex_digits[]="0123456789ABCDEF"; + if (n==0) { + sh_log_send_byte('0'); + return SH_STATUS_SUCCESS; + } + while (n>0) { + buf[i++]=hex_digits[n & 0xF]; + n>>=4; + } + while (i--) { + sh_log_send_byte(buf[i]); + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_send_double(double value) { + if (value<0) { + sh_log_send_byte('-'); + value=-value; + } + sh_uint64 integer_part=(sh_uint64)value; + double fractional_part=value-(double)integer_part; + SH_STATUS status=sh_log_send_uintn(integer_part); + if (status!=SH_STATUS_SUCCESS) return status; + status=sh_log_send_byte('.'); + if (status!=SH_STATUS_SUCCESS) return status; + for (int i=0;i<6;i++) { + fractional_part*=10.0; + sh_uint64 digit=(sh_uint64)fractional_part; + status=sh_log_send_byte('0'+(sh_uint8)digit); + if (status!=SH_STATUS_SUCCESS) return status; + fractional_part-=(double)digit; + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_send_payload(sh_log_OUTPUT_PAYLOAD *payload) { + if (payload==SH_NULLPTR) { + return SH_STATUS_INVALID_PARAMETER; + } + if (!(sh_log_output_type_valid(payload->output_type))) { + return SH_STATUS_INVALID_PARAMETER; + } + if (!(sh_log_output_source_valid(payload->output_source))) { + return SH_STATUS_INVALID_PARAMETER; + } + if (payload->output_source!=SH_LOG_SOURCE_TEST && payload->output_typeoutput_source==SH_LOG_SOURCE_MAIN) { + sh_log_send_string("Main@"); + } else if (payload->output_source==SH_LOG_SOURCE_CONF) { + sh_log_send_string("Conf@"); + } else if (payload->output_source==SH_LOG_SOURCE_PAGE) { + sh_log_send_string("Page@"); + } else if (payload->output_source==SH_LOG_SOURCE_SLAB) { + sh_log_send_string("Slab@"); + } else if (payload->output_source==SH_LOG_SOURCE_TEST) { + sh_log_send_string("Test@"); + } + if (payload->output_type==SH_LOG_DEBUG) { + sh_log_send_string("Debug] "); + } else if (payload->output_type==SH_LOG_LOG) { + sh_log_send_string("Log] "); + } else if (payload->output_type==SH_LOG_WARNING) { + sh_log_send_string("Warning] "); + } else if (payload->output_type==SH_LOG_ERROR) { + sh_log_send_string("Error] "); + } else if (payload->output_type==SH_LOG_CRITICAL) { + sh_log_send_string("Critical] "); + } else if (payload->output_type==SH_LOG_FATAL) { + sh_log_send_string("Fatal] "); + } else if (payload->output_type==SH_LOG_TEST) { + sh_log_send_string("Test] "); + } + sh_log_send_uintn(payload->tsc_value); + sh_log_send_string(" : "); + sh_log_send_string(payload->message_pointer); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_load_log_level(sh_uint8 log_level) { + kernel_log_level=log_level; + return SH_STATUS_SUCCESS; +} +sh_uint8 sh_log_get_log_level() { + return kernel_log_level; +} +SH_STATUS sh_log_test(const char* str) { + if (str==SH_NULLPTR) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_TEST, + .output_source=SH_LOG_SOURCE_TEST, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + sh_log_send_string("\n"); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_debug(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_DEBUG, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + sh_log_send_string("\n"); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_log(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_LOG, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + sh_log_send_string("\n"); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_warning(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_WARNING, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + sh_log_send_string("\n"); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_error(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_ERROR, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + sh_log_send_string("\n"); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_critical(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_CRITICAL, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + sh_log_send_string("\n"); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_fatal(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_FATAL, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + sh_log_send_string("\n"); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_ltest(const char* str) { + if (str==SH_NULLPTR) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_TEST, + .output_source=SH_LOG_SOURCE_TEST, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_ldebug(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_DEBUG, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_llog(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_LOG, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_lwarning(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_WARNING, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_lerror(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_ERROR, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_lcritical(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_CRITICAL, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_lfatal(const char* str,sh_log_OUTPUT_SOURCE source) { + if (str==SH_NULLPTR || !(sh_log_output_source_valid(source))) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_log_OUTPUT_PAYLOAD payload={ + .output_type=SH_LOG_FATAL, + .output_source=source, + .tsc_value=sh_tsc_get_kernel_current_tsc(), + .message_pointer=str + }; + SH_STATUS status=sh_log_send_payload(&payload); + if (sh_status_error(status)) { + return status; + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_log_mem_stats(sh_log_OUTPUT_SOURCE source) { + sh_page_MEM_STATS mem_stats; + sh_page_get_memory_stats(&mem_stats); + if (sh_log_get_log_level()<=1) { + sh_log_llog("Total memory installed (bytes) : ",source); + sh_log_send_uintn(mem_stats.memory_total_bytes); + sh_log_send_string(" / 0x"); + sh_log_send_uintn_hex(mem_stats.memory_total_bytes); + sh_log_send_string("\n"); + sh_log_llog("Total memory installed (pages) : ",source); + sh_log_send_uintn(mem_stats.memory_total_pages); + sh_log_send_string(" / 0x"); + sh_log_send_uintn_hex(mem_stats.memory_total_pages); + sh_log_send_string("\n"); + sh_log_llog("Free memory : ",source); + sh_log_send_double(mem_stats.free_ratio*100); + sh_log_send_string("%\n"); + sh_log_llog("Used memory : ",source); + sh_log_send_double(mem_stats.used_ratio*100); + sh_log_send_string("%\n"); + sh_log_llog("Free pages : ",source); + sh_log_send_uintn(mem_stats.free_pages); + sh_log_send_string("\n"); + sh_log_llog("Used pages : ",source); + sh_log_send_uintn(mem_stats.used_pages); + sh_log_send_string("\n"); + sh_log_llog("Largest free block (pages) : ",source); + sh_log_send_uintn(mem_stats.largest_free_block); + sh_log_send_string("\n"); + sh_log_llog("Largest used block (pages) : ",source); + sh_log_send_uintn(mem_stats.largest_used_block); + sh_log_send_string("\n"); + sh_log_llog("Free block count : ",source); + sh_log_send_uintn(mem_stats.free_blocks_count); + sh_log_send_string("\n"); + sh_log_llog("Used block count : ",source); + sh_log_send_uintn(mem_stats.used_blocks_count); + sh_log_send_string("\n"); + sh_log_llog("Total memory taken by physical bitmap (bytes) : ",source); + sh_log_send_uintn(mem_stats.physical_bitmap_size_bytes); + sh_log_send_string(" / 0x"); + sh_log_send_uintn_hex(mem_stats.physical_bitmap_size_bytes); + sh_log_send_string("\n"); + sh_log_llog("Total memory taken by physical bitmap (pages) : ",source); + sh_log_send_uintn(mem_stats.physical_bitmap_size_pages); + sh_log_send_string(" / 0x"); + sh_log_send_uintn_hex(mem_stats.physical_bitmap_size_pages); + sh_log_send_string("\n"); + } + return SH_STATUS_SUCCESS; +} diff --git a/page.c b/page.c new file mode 100644 index 0000000..48fe7ea --- /dev/null +++ b/page.c @@ -0,0 +1,721 @@ +#include "../include/page.h" +#include +__attribute__((section(".bss"))) +static sh_uint8 memory_map_buffer[64*1024]; +static sh_uint8 *physical_bitmap; +__attribute__((section(".bss"))) +static sh_uint64 physical_memory_pages_count=0; +__attribute__((section(".bss"))) +static sh_uint64 physical_memory_bytes_count=0; +__attribute__((section(".bss"))) +static sh_uint64 physical_bitmap_size_bytes=0; +__attribute__((section(".bss"))) +static sh_uint64 physical_bitmap_size_pages=0; +static sh_page_VIRTUAL_ADRESS page_table_pool_va_ptr=SH_PAGE_NULL_VA; +SH_STATUS sh_page_load_boot_ptp_va(sh_page_VIRTUAL_ADRESS pt_pool_va) { + page_table_pool_va_ptr=pt_pool_va; + sh_log_ldebug("Page table pool VA: 0x",SH_LOG_SOURCE_PAGE); + sh_log_send_uintn_hex((sh_uint64)page_table_pool_va_ptr); + sh_log_send_string("\n"); + sh_uint8 first_byte=*(sh_uint8*)(page_table_pool_va_ptr); + sh_log_debug("If you can see this message, no fault happened.",SH_LOG_SOURCE_PAGE); + return SH_STATUS_SUCCESS; +} +sh_page_VIRTUAL_ADRESS sh_page_get_boot_ptp_va() { + return page_table_pool_va_ptr; +} +SH_STATUS sh_page_copy_memory_map() { + return sh_mem_copy(memory_map_buffer,(void*)SH_PAGE_MEMORY_MAP_VA,sizeof(memory_map_buffer)); +} +SH_STATUS sh_page_check_memory_map() { + static const sh_uint8 memory_map_sig[8]={'S','h','e','M','m','a','p','B'}; + if (sh_mem_compare(memory_map_sig,memory_map_buffer,sizeof(memory_map_sig))==SH_STATUS_MEM_NOT_EQUAL) { + sh_log_critical("Memory map doesn't have signature on.",SH_LOG_SOURCE_PAGE); + return SH_STATUS_INVALID_SIGNATURE; + } + sh_page_MEMORY_MAP_HEADER *memory_map_header=(sh_page_MEMORY_MAP_HEADER *)memory_map_buffer; + sh_log_ldebug("Memory map entry count: ",SH_LOG_SOURCE_PAGE); + sh_log_send_uintn((sh_uint64)memory_map_header->entry_count); + sh_log_send_string("\n"); + sh_log_ldebug("Memory map entry size: ",SH_LOG_SOURCE_PAGE); + sh_log_send_uintn((sh_uint64)memory_map_header->entry_size); + sh_log_send_string("\n"); + sh_log_ldebug("Memory map syntax version: ",SH_LOG_SOURCE_PAGE); + sh_log_send_uintn((sh_uint64)memory_map_header->mmap_syntax_version); + sh_log_send_string("\n"); + if (memory_map_header->entry_count*memory_map_header->entry_size+sizeof(sh_page_MEMORY_MAP_HEADER)>sizeof(memory_map_buffer)) { + sh_log_error("Memory map overflow allocated buffer.",SH_LOG_SOURCE_PAGE); + return SH_STATUS_MMAP_BUFFER_OVERFLOW; + } + return SH_STATUS_SUCCESS; +} +void sh_page_dump_memory_map() { + sh_page_MEMORY_MAP_HEADER *memory_map_header=(sh_page_MEMORY_MAP_HEADER *)memory_map_buffer; + sh_log_send_string("Memory map dump:\n"); + sh_log_send_string("Header:\n"); + for (sh_uint64 i=0;ientry_count;++i) { + sh_log_send_string("Entry number "); + sh_log_send_uintn(i); + sh_log_send_string(" : "); + for (sh_uint64 y=0;y=page_count) { + return 0; + } + if ((value & (1ULL<page_count_in_bitmap) { + return SH_STATUS_INVALID_PARAMETER; + } + for (sh_uint64 i=0;ipage_table_pa=ptp_pa; + page_table_pool->page_table_va=ptp_va; + page_table_pool->ptp_pages_count=SH_PAGE_PTP_ALLOCATOR_PAGES_COUNT; + page_table_pool->ptp_alloc_bitmap_uint64_count=SH_PAGE_PTP_ALLOCATOR_BITMAP_UINT64; + SH_STATUS status=sh_mem_set_8((sh_uint8*)page_table_pool->ptp_alloc_bitmap,SH_FALSE,sizeof(page_table_pool->ptp_alloc_bitmap)); + if (sh_status_error(status)) { + sh_log_error("Error: couldn't initialize page table pool bitmap.",SH_LOG_SOURCE_PAGE); + return SH_STATUS_PT_POOL_NO_BITMAP_INIT; + } + if (initial_fill_level!=0) { + status=sh_page_set_pages_range_bitmap((sh_uint8*)page_table_pool->ptp_alloc_bitmap,page_table_pool->ptp_pages_count,0,initial_fill_level,SH_TRUE); + if (sh_status_error(status)) { + sh_log_error("Error: couldn't initialize pages tables already alocated.",SH_LOG_SOURCE_PAGE); + return SH_STATUS_PT_POOL_NO_PAGE_SET; + } + } + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_page_dump_ptp_bitmap(sh_page_PAGE_TABLE_POOL *ptp) { + for (sh_uint64 i=0;iptp_alloc_bitmap_uint64_count;++i) { + sh_log_send_string(" 0x"); + sh_log_send_uintn_hex(ptp->ptp_alloc_bitmap[i]); + } + sh_log_send_string("\n"); + return SH_STATUS_SUCCESS; +} +sh_page_PHYSICAL_ADRESS sh_page_ptp_alloc_one_page(sh_page_PAGE_TABLE_POOL *pt_pool) { + if (pt_pool==SH_NULLPTR) { + return SH_STATUS_INVALID_PARAMETER; + } + sh_uint64 page_count=pt_pool->ptp_pages_count; + sh_uint64 bitmap_word_count=(page_count+63)/64; + for (sh_uint64 word=0;wordptp_alloc_bitmap[word]; + if (value==0xFFFFFFFFFFFFFFFFULL) { + continue; + } + for (sh_uint64 bit=0;bit<64;bit++) { + sh_uint64 page_index=(word*64)+bit; + if (page_index>=page_count) { + return 0; + } + if ((value & (1ULL<ptp_alloc_bitmap[word]|=(1ULL<page_table_pa+page_index*SH_PAGE_SIZE; + return pa; + } + } + } + return 0; +} +SH_STATUS sh_page_map_one_page_ptp(sh_page_PAGE_TABLE_POOL *ptp,sh_page_VIRTUAL_ADRESS va,sh_page_PHYSICAL_ADRESS pa,sh_uint64 flags) { + if (ptp==SH_NULLPTR) return SH_STATUS_INVALID_PARAMETER; + if (va%SH_PAGE_SIZE!=0 || pa%SH_PAGE_SIZE!=0) return SH_STATUS_INVALID_PARAMETER; + sh_uint64 pml4_i=(va>>39) & 0x1FF; + sh_uint64 pdpt_i=(va>>30) & 0x1FF; + sh_uint64 pd_i=(va>>21) & 0x1FF; + sh_uint64 pt_i=(va>>12) & 0x1FF; + sh_uint64 *pdpt; + sh_uint64 *pd; + sh_uint64 *pt; + sh_uint64 *pml4=(sh_uint64*)ptp->page_table_va; + if (!(pml4[pml4_i] & SH_PAGE_PRESENT)) { + sh_page_PHYSICAL_ADRESS pdpt_pa=sh_page_ptp_alloc_one_page(ptp); + if (!pdpt_pa) return SH_STATUS_OUT_OF_MEMORY; + pdpt=sh_page_ptp_pa_to_va(ptp,pdpt_pa); + if (!pdpt) return SH_STATUS_INVALID_INTERNAL_PA; + sh_mem_set_8((sh_uint8*)pdpt,0,SH_PAGE_SIZE); + pml4[pml4_i]=pdpt_pa | SH_PAGE_TABLE_FLAGS | SH_PAGE_PRESENT; + } else { + pdpt=sh_page_ptp_pa_to_va(ptp,(pml4[pml4_i] & ~0xFFFULL)); + if (!pdpt) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pdpt[pdpt_i] & SH_PAGE_PRESENT)) { + sh_page_PHYSICAL_ADRESS pd_pa=sh_page_ptp_alloc_one_page(ptp); + if (!pd_pa) return SH_STATUS_OUT_OF_MEMORY; + pd=sh_page_ptp_pa_to_va(ptp,pd_pa); + if (!pd) return SH_STATUS_INVALID_INTERNAL_PA; + sh_mem_set_8((sh_uint8*)pd,0,SH_PAGE_SIZE); + pdpt[pdpt_i]=pd_pa | SH_PAGE_TABLE_FLAGS | SH_PAGE_PRESENT; + } else { + pd=sh_page_ptp_pa_to_va(ptp,(pdpt[pdpt_i] & ~0xFFFULL)); + if (!pd) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pd[pd_i] & SH_PAGE_PRESENT)) { + sh_page_PHYSICAL_ADRESS pt_pa=sh_page_ptp_alloc_one_page(ptp); + if (!pt_pa) return SH_STATUS_OUT_OF_MEMORY; + pt=sh_page_ptp_pa_to_va(ptp,pt_pa); + if (!pt) return SH_STATUS_INVALID_INTERNAL_PA; + sh_mem_set_8((sh_uint8*)pt,0,SH_PAGE_SIZE); + pd[pd_i]=pt_pa | SH_PAGE_TABLE_FLAGS | SH_PAGE_PRESENT; + } else { + pt=sh_page_ptp_pa_to_va(ptp,pd[pd_i] & ~0xFFFULL); + if (!pt) return SH_STATUS_INVALID_INTERNAL_PA; + } + pt[pt_i]=(pa & ~0xFFFULL) | flags | SH_PAGE_PRESENT; + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_page_is_va_mapped_ptp(sh_page_PAGE_TABLE_POOL *ptp,sh_page_VIRTUAL_ADRESS va) { + if (ptp==SH_NULLPTR) return SH_STATUS_INVALID_PARAMETER; + sh_uint64 pml4_i=(va>>39) & 0x1FF; + sh_uint64 pdpt_i=(va>>30) & 0x1FF; + sh_uint64 pd_i=(va>>21) & 0x1FF; + sh_uint64 pt_i=(va>>12) & 0x1FF; + sh_uint64 *pdpt; + sh_uint64 *pd; + sh_uint64 *pt; + sh_uint64 *pml4=(sh_uint64*)ptp->page_table_va; + if (!(pml4[pml4_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_VA_NOT_MAPPED; + } else { + pdpt=sh_page_ptp_pa_to_va(ptp,(pml4[pml4_i] & ~0xFFFULL)); + if (pdpt==0) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pdpt[pdpt_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_VA_NOT_MAPPED; + } else { + pd=sh_page_ptp_pa_to_va(ptp,(pdpt[pdpt_i] & ~0xFFFULL)); + if (pd==0) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pd[pd_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_VA_NOT_MAPPED; + } else { + pt=sh_page_ptp_pa_to_va(ptp,(pd[pd_i] & ~0xFFFULL)); + if (pt==0) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pt[pt_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_VA_NOT_MAPPED; + } else { + return SH_STATUS_VA_MAPPED; + } +} +SH_STATUS sh_page_is_va_range_mapped_ptp(sh_page_PAGE_TABLE_POOL *ptp,sh_page_VIRTUAL_ADRESS va,sh_uint64 size_bytes) { + if (ptp==SH_NULLPTR) return SH_STATUS_INVALID_PARAMETER; + if (va%SH_PAGE_SIZE!=0 || size_bytes%SH_PAGE_SIZE!=0 || size_bytes==0) return SH_STATUS_INVALID_PARAMETER; + sh_uint64 counter=0; + for (sh_uint64 i=0;i>39) & 0x1FF; + sh_uint64 pdpt_i=(va>>30) & 0x1FF; + sh_uint64 pd_i=(va>>21) & 0x1FF; + sh_uint64 pt_i=(va>>12) & 0x1FF; + sh_uint64 *pdpt; + sh_uint64 *pd; + sh_uint64 *pt; + sh_uint64 *pml4=(sh_uint64*)ptp->page_table_va; + if (!(pml4[pml4_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_ERROR_VA_NOT_MAPPED; + } else { + pdpt=sh_page_ptp_pa_to_va(ptp,(pml4[pml4_i] & ~0xFFFULL)); + if (!pdpt) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pdpt[pdpt_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_ERROR_VA_NOT_MAPPED; + } else { + pd=sh_page_ptp_pa_to_va(ptp,(pdpt[pdpt_i] & ~0xFFFULL)); + if (!pd) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pd[pd_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_ERROR_VA_NOT_MAPPED; + } else { + pt=sh_page_ptp_pa_to_va(ptp,pd[pd_i] & ~0xFFFULL); + if (!pt) return SH_STATUS_INVALID_INTERNAL_PA; + } + pt[pt_i]=0x0ULL; + __asm__ volatile("invlpg (%0)" :: "r"(va) : "memory"); + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_page_unmap_contiguous_pages_range_ptp(sh_page_PAGE_TABLE_POOL *ptp,sh_page_VIRTUAL_ADRESS va,sh_uint64 size_bytes) { + if (ptp==SH_NULLPTR) return SH_STATUS_INVALID_PARAMETER; + if (va%SH_PAGE_SIZE!=0 || size_bytes==0 || size_bytes%SH_PAGE_SIZE!=0) return SH_STATUS_INVALID_PARAMETER; + sh_uint64 pages=size_bytes/SH_PAGE_SIZE; + SH_STATUS status=sh_page_is_va_range_mapped_ptp(ptp,va,size_bytes); + if (status==SH_STATUS_VA_PARTIALLY_MAPPED) return SH_STATUS_ERROR_VA_PARTIALLY_MAPPED; + if (status==SH_STATUS_VA_NOT_MAPPED) return SH_STATUS_ERROR_VA_NOT_MAPPED; + for (sh_uint64 i=0;i>39) & 0x1FF; + sh_uint64 pdpt_i=(va>>30) & 0x1FF; + sh_uint64 pd_i=(va>>21) & 0x1FF; + sh_uint64 pt_i=(va>>12) & 0x1FF; + sh_uint64 *pdpt; + sh_uint64 *pd; + sh_uint64 *pt; + sh_uint64 *pml4=(sh_uint64*)ptp->page_table_va; + if (!(pml4[pml4_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_ERROR_VA_NOT_MAPPED; + } else { + pdpt=sh_page_ptp_pa_to_va(ptp,(pml4[pml4_i] & ~0xFFFULL)); + if (!pdpt) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pdpt[pdpt_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_ERROR_VA_NOT_MAPPED; + } else { + pd=sh_page_ptp_pa_to_va(ptp,(pdpt[pdpt_i] & ~0xFFFULL)); + if (!pd) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pd[pd_i] & SH_PAGE_PRESENT)) { + return SH_STATUS_ERROR_VA_NOT_MAPPED; + } else { + pt=sh_page_ptp_pa_to_va(ptp,pd[pd_i] & ~0xFFFULL); + if (!pt) return SH_STATUS_INVALID_INTERNAL_PA; + } + if (!(pt[pt_i] & SH_PAGE_PRESENT)) return SH_STATUS_ERROR_VA_NOT_MAPPED; + *pa=pt[pt_i] & 0x000FFFFFFFFFF000; + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_page_unalloc_one_page(sh_page_PAGE_TABLE_POOL *ptp,sh_page_VIRTUAL_ADRESS va) { + if (ptp==SH_NULLPTR) return SH_STATUS_INVALID_PARAMETER; + if (va%SH_PAGE_SIZE!=0) return SH_STATUS_INVALID_PARAMETER; + sh_page_PHYSICAL_ADRESS equivalent_pa; + SH_STATUS status=sh_page_ptp_va_to_pa(ptp,va,&equivalent_pa); + if (status!=SH_STATUS_SUCCESS) return status; + status=sh_page_unmap_one_page_ptp(ptp,va); // If this call return SH_STATUS_ERROR_VA_NOT_MAPPED, there is a severe bug that should cause kernel panic because sh_page_ptp_va_to_pa should already have returned exact same error code. + if (status!=SH_STATUS_SUCCESS) return status; + status=sh_page_set_pages_range_bitmap(physical_bitmap,physical_memory_pages_count,(sh_uint64)(equivalent_pa/SH_PAGE_SIZE),1,SH_FALSE); + if (status!=SH_STATUS_SUCCESS) return status; + return SH_STATUS_SUCCESS; +} +SH_STATUS sh_page_unalloc_contiguous(sh_page_PAGE_TABLE_POOL *ptp,sh_page_VIRTUAL_ADRESS va,sh_uint64 size_bytes) { + if (ptp==SH_NULLPTR) return SH_STATUS_INVALID_PARAMETER; + if (va%SH_PAGE_SIZE!=0 || size_bytes==0 || size_bytes%SH_PAGE_SIZE!=0) return SH_STATUS_INVALID_PARAMETER; + SH_STATUS status=sh_page_is_va_range_mapped_ptp(ptp,va,size_bytes); + if (status==SH_STATUS_VA_NOT_MAPPED) return SH_STATUS_ERROR_VA_NOT_MAPPED; + if (status==SH_STATUS_VA_PARTIALLY_MAPPED) return SH_STATUS_ERROR_VA_PARTIALLY_MAPPED; + sh_uint64 pages=size_bytes/SH_PAGE_SIZE; + for (sh_uint64 i=0;ientry_count;i++) { + sh_uint64 start_page=memory_map_cursor[i].physical_start/4096; + sh_uint64 end_page=start_page+memory_map_cursor[i].pages_count; + if (memory_map_cursor[i].type==SH_PAGE_CONVENTIONAL_MEMORY && memory_map_cursor[i].pages_count>biggest_segment_pages) { + biggest_segment_pages=memory_map_cursor[i].pages_count; + biggest_segment_index=i; + } + if (verbose) { + sh_log_ldebug("Found memory map segment #",SH_LOG_SOURCE_PAGE); + sh_log_send_uintn(i); + sh_log_send_string(": [0x"); + sh_log_send_uintn_hex(start_page*4096); + sh_log_send_string(" - 0x"); + sh_log_send_uintn_hex(end_page*4096); + sh_log_send_string("] Memory type: "); + sh_log_send_uintn(memory_map_cursor[i].type); + if (memory_map_cursor[i].type==SH_PAGE_CONVENTIONAL_MEMORY) { + sh_log_send_string(" --> usable\n"); + } else { + sh_log_send_string(" --> not usable\n"); + } + if (!(end_page<=SH_PAGE_MAX_PAGES_COUNT)) { + sh_log_lwarning("Memory map segment #",SH_LOG_SOURCE_PAGE); + sh_log_send_uintn(i); + sh_log_send_string(" isn't usable because it overflow over max page count. Enable debug log channel to see more.\n"); + } + } + if (memory_map_cursor[i].type==SH_PAGE_CONVENTIONAL_MEMORY && end_page<=SH_PAGE_MAX_PAGES_COUNT) { + if (end_page>highest_usable_page) { + highest_usable_segment=i; + highest_usable_page=end_page; + } + } + } + physical_memory_pages_count=highest_usable_page; + physical_memory_bytes_count=physical_memory_pages_count*SH_PAGE_SIZE; + if (verbose) { + sh_log_ldebug("Total memory was given by memory map segment #",SH_LOG_SOURCE_PAGE); + sh_log_send_uintn(highest_usable_segment); + sh_log_send_string("\n"); + sh_log_ldebug("Total memory (pages): 0x",SH_LOG_SOURCE_PAGE); + sh_log_send_uintn_hex(physical_memory_pages_count); + sh_log_send_string(". Total memory (bytes) : 0x"); + sh_log_send_uintn_hex(physical_memory_bytes_count); + sh_log_send_string("\n"); + } + if (biggest_segment_pages==0) { + sh_log_error("No suitable conventional memory segment found.",SH_LOG_SOURCE_PAGE); + return SH_STATUS_OUT_OF_MEMORY; + } + if (memory_map_cursor[biggest_segment_index].pages_count<(physical_memory_pages_count/8)) { + sh_log_error("Memory is too low or too fragmented to allocate physical bitmap.",SH_LOG_SOURCE_PAGE); + return SH_STATUS_OUT_OF_MEMORY; + } + sh_page_PHYSICAL_ADRESS pa=memory_map_cursor[biggest_segment_index].physical_start; + sh_page_VIRTUAL_ADRESS va; + physical_bitmap_size_bytes=physical_memory_pages_count/8; + if (physical_memory_pages_count%8!=0) physical_bitmap_size_bytes++; + physical_bitmap_size_pages=physical_bitmap_size_bytes/SH_PAGE_SIZE; + if (physical_bitmap_size_bytes%SH_PAGE_SIZE!=0) physical_bitmap_size_pages++; + SH_STATUS status=sh_page_search_available_va_range(ptp,SH_PAGE_KERNEL_PERM_VA_BASE,(SH_PAGE_KERNEL_PERM_VA_END-SH_PAGE_KERNEL_PERM_VA_BASE+1-0x1000),physical_bitmap_size_pages*SH_PAGE_SIZE,&va); + if (status!=SH_STATUS_SUCCESS) { + sh_log_error("Memory is too low or too fragmented to allocate physical bitmap.",SH_LOG_SOURCE_PAGE); + return status; + } + status=sh_page_map_contiguous_pages_range_ptp(ptp,va,pa,SH_PAGE_PRESENT | SH_PAGE_NX | SH_PAGE_RW,physical_bitmap_size_pages*SH_PAGE_SIZE); + if (status==SH_STATUS_OUT_OF_MEMORY) { + sh_log_error("Memory is too low or too fragmented to allocate physical bitmap.",SH_LOG_SOURCE_PAGE); + return status; + } else if (status!=SH_STATUS_SUCCESS) { + sh_log_error("An unknow error happened during physical bitmap pages mapping. See error below",SH_LOG_SOURCE_PAGE); + return status; + } + physical_bitmap=(sh_uint8*)va; + status=sh_mem_set_8(physical_bitmap,0xFF,physical_bitmap_size_bytes); + if (sh_status_error(status)) { + sh_log_error("An unknow error happened during physical bitmap filling with 0xFF. See error below.",SH_LOG_SOURCE_PAGE); + return status; + } + // second loop : actually set all free regions into physical bitmap + for (sh_uint64 i=0;ientry_count;i++) { + sh_uint64 start_page=memory_map_cursor[i].physical_start/4096; + sh_uint64 end_page=start_page+memory_map_cursor[i].pages_count; + if (end_page<=SH_PAGE_MAX_PAGES_COUNT) { + if (memory_map_cursor[i].type==SH_PAGE_CONVENTIONAL_MEMORY) { + SH_STATUS status=sh_page_set_pages_range_bitmap(physical_bitmap,physical_memory_pages_count,memory_map_cursor[i].physical_start/SH_PAGE_SIZE,memory_map_cursor[i].pages_count,SH_FALSE); + if (sh_status_error(status)) { + sh_log_error("Couldn't set this memory map segment to usable.",SH_LOG_SOURCE_PAGE); + return SH_STATUS_PMAP_NO_PAGES_SET; + } + } + } + } + sh_page_set_pages_range_bitmap(physical_bitmap,physical_memory_pages_count,pa/SH_PAGE_SIZE,physical_bitmap_size_pages,SH_TRUE); + return SH_STATUS_SUCCESS; +} +sh_page_VIRTUAL_ADRESS sh_page_get_physical_bitmap_ptr() { + return (sh_page_VIRTUAL_ADRESS)physical_bitmap; +} +static sh_uint64 popcount64(sh_uint64 x) { + x=x-((x>>1) & 0x5555555555555555ULL); + x=(x & 0x3333333333333333ULL)+((x>>2) & 0x3333333333333333ULL); + x=(x+(x>>4)) & 0x0F0F0F0F0F0F0F0FULL; + x=x+(x>>8); + x=x+(x>>16); + x=x+(x>>32); + return x & 0x7F; +} +SH_STATUS sh_page_get_memory_stats(sh_page_MEM_STATS *mem_stats) { + if (mem_stats==SH_NULLPTR) return SH_STATUS_INVALID_PARAMETER; + mem_stats->memory_total_pages=physical_memory_pages_count; + mem_stats->memory_total_bytes=physical_memory_bytes_count; + sh_uint64 free_pages=0; + sh_uint64 used_pages=0; + sh_uint64 largest_free_block=0; + sh_uint64 largest_used_block=0; + sh_uint64 free_blocks_count=0; + sh_uint64 used_blocks_count=0; + sh_uint64 current_free_block=0; + sh_uint64 current_used_block=0; + sh_uint64 full_uint64_count=physical_memory_pages_count/64; + sh_uint64 remaining_bits=physical_memory_pages_count%64; + sh_uint64 *bitmap64=(sh_uint64*)physical_bitmap; + for (sh_uint64 i=0;i>b) & 1; + if (bit_set) { + current_used_block++; + if (current_free_block) { + free_blocks_count++; + if (current_free_block>largest_free_block) { + largest_free_block=current_free_block; + } + current_free_block=0; + } + } else { + current_free_block++; + if (current_used_block) { + used_blocks_count++; + if (current_used_block>largest_used_block) { + largest_used_block=current_used_block; + } + current_used_block=0; + } + } + } + } + if (remaining_bits) { + sh_uint64 val=bitmap64[full_uint64_count] & ((1ULL<>b) & 1; + if (bit_set) { + current_used_block++; + if (current_free_block) { + free_blocks_count++; + if (current_free_block>largest_free_block) { + largest_free_block=current_free_block; + } + current_free_block=0; + } + } else { + current_free_block++; + if (current_used_block) { + used_blocks_count++; + if (current_used_block>largest_used_block) { + largest_used_block=current_used_block; + } + current_used_block=0; + } + } + } + } + if (current_free_block) { + free_blocks_count++; + if (current_free_block>largest_free_block) { + largest_free_block=current_free_block; + } + } + if (current_used_block) { + used_blocks_count++; + if (current_used_block>largest_used_block) { + largest_used_block=current_used_block; + } + } + mem_stats->free_pages=free_pages; + mem_stats->used_pages=used_pages; + mem_stats->free_ratio=(double)free_pages/(double)physical_memory_pages_count; + mem_stats->used_ratio=(double)used_pages/(double)physical_memory_pages_count; + mem_stats->largest_free_block=largest_free_block; + mem_stats->largest_used_block=largest_used_block; + mem_stats->free_blocks_count=free_blocks_count; + mem_stats->used_blocks_count=used_blocks_count; + mem_stats->physical_bitmap_size_bytes=(physical_memory_pages_count+7)/8; + mem_stats->physical_bitmap_size_pages=(mem_stats->physical_bitmap_size_bytes+4095)/4096; + return SH_STATUS_SUCCESS; +} diff --git a/test.c.ccc b/test.c.ccc deleted file mode 100644 index 0523c48e7205a10978c198113babed5bf4217b4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21162 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 aSx1tx*#RPzelHM6TAsxZ^Bl~KBK{wvu2viX