Skip to content

Commit 5f54285

Browse files
committed
Add parameter to support read physical memory
Signed-off-by: quic_wya <[email protected]>
1 parent fa2ac04 commit 5f54285

File tree

5 files changed

+59
-70
lines changed

5 files changed

+59
-70
lines changed

memory/dmabuf/dmabuf.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ void Dmabuf::save_dma_buf(std::string addr){
414414
ulong page = sgl_ptr->page_link & ~ 0x3;
415415
physaddr_t paddr = page_to_phy(page) + sgl_ptr->offset;
416416
size_t len = sgl_ptr->length;
417-
void* buf = read_phys_memory(paddr, len, "dmabuf");
417+
void* buf = read_memory(paddr, len, "dmabuf",false);
418418
fwrite(buf, len, 1, dma_file);
419419
FREEBUF(buf);
420420
}

memory/swapinfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ char* Swapinfo::do_swap_page(ulonglong task_addr,ulonglong uvaddr){
354354
return memory_page_cahe[paddr];
355355
}
356356
if(debug)fprintf(fp, "read %llx from page_vaddr:%llx, page_paddr:%llx\n\n",uvaddr,page_start,(ulonglong)paddr);
357-
void* buf = (char*)read_phys_memory(paddr, page_size, "do_swap_page");
357+
void* buf = (char*)read_memory(paddr, page_size, "do_swap_page",false);
358358
if (buf == nullptr){
359359
if(debug)fprintf(fp, "read %llx from memory failed \n",uvaddr);
360360
return nullptr;
@@ -384,7 +384,7 @@ char* Swapinfo::do_swap_page(ulonglong task_addr,ulonglong uvaddr){
384384
if (is_kvaddr(swap_page)){
385385
ulong page_paddr = page_to_phy(swap_page);
386386
if(debug)fprintf(fp, "read %llx from swapcache page_vaddr:%lx, page_paddr:%lx\n\n",uvaddr,swap_page,page_paddr);
387-
void* buf = read_phys_memory(page_paddr, page_size, "do_swap_page");
387+
void* buf = read_memory(page_paddr, page_size, "do_swap_page",false);
388388
if (buf == nullptr){
389389
if(debug)fprintf(fp, "read swap page %llx from memory failed \n",uvaddr);
390390
return nullptr;

memory/zraminfo.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ char* Zraminfo::read_object(std::shared_ptr<zram> zram_ptr,struct zram_table_ent
218218
return nullptr;
219219
}
220220
if(debug)fprintf(fp, "obj:0x%llx~0x%llx\n",(ulonglong)(paddr + offset),(ulonglong)(paddr + offset + obj_size));
221-
tmpbuf = read_phys_memory(paddr + offset,obj_size,"zram obj");
221+
tmpbuf = read_memory(paddr + offset,obj_size,"zram obj",false);
222222
memcpy(obj_buf, tmpbuf, obj_size);
223223
FREEBUF(tmpbuf);
224224
}else{ //this object is in two pages
@@ -237,7 +237,7 @@ char* Zraminfo::read_object(std::shared_ptr<zram> zram_ptr,struct zram_table_ent
237237
return nullptr;
238238
}
239239
if(debug)fprintf(fp, "obj:0x%llx~0x%llx\n",(ulonglong)(paddr + offset),(ulonglong)(paddr + offset + sizes[0]));
240-
tmpbuf = read_phys_memory(paddr + offset,sizes[0],"zram obj part0");
240+
tmpbuf = read_memory(paddr + offset,sizes[0],"zram obj part0",false);
241241
memcpy(obj_buf, tmpbuf, sizes[0]);
242242
FREEBUF(tmpbuf);
243243

@@ -247,7 +247,7 @@ char* Zraminfo::read_object(std::shared_ptr<zram> zram_ptr,struct zram_table_ent
247247
return nullptr;
248248
}
249249
if(debug)fprintf(fp, "obj:0x%llx~0x%llx\n",(ulonglong)paddr,(ulonglong)(paddr + sizes[1]));
250-
tmpbuf = read_phys_memory(paddr,sizes[1],"zram obj part1");
250+
tmpbuf = read_memory(paddr,sizes[1],"zram obj part1",false);
251251
memcpy(obj_buf + sizes[0], tmpbuf, sizes[1]);
252252
FREEBUF(tmpbuf);
253253
}
@@ -412,7 +412,7 @@ void Zraminfo::parser_obj(ulong page_addr,std::shared_ptr<size_class> class_ptr,
412412
physaddr_t obj_start = page_start + offset;
413413
physaddr_t obj_end = obj_start + class_ptr->size;
414414
while (obj_end < page_end){
415-
buf = read_phys_memory(obj_start + field_offset(link_free,handle),sizeof(unsigned long),"link_free handle");
415+
buf = read_memory(obj_start + field_offset(link_free,handle),sizeof(unsigned long),"link_free handle",false);
416416
handle_addr = ULONG(buf);
417417
FREEBUF(buf);
418418
std::shared_ptr<zobj> zsobj = parser_obj(zspage_ptr->obj_index,handle_addr,obj_start,obj_end);
@@ -423,7 +423,7 @@ void Zraminfo::parser_obj(ulong page_addr,std::shared_ptr<size_class> class_ptr,
423423
}
424424
// part of last obj in one page
425425
obj_end = page_end;
426-
buf = read_phys_memory(obj_start + field_offset(link_free,handle),sizeof(unsigned long),"link_free handle");
426+
buf = read_memory(obj_start + field_offset(link_free,handle),sizeof(unsigned long),"link_free handle",false);
427427
handle_addr = ULONG(buf);
428428
FREEBUF(buf);
429429
std::shared_ptr<zobj> zsobj = parser_obj(zspage_ptr->obj_index,handle_addr,obj_start,obj_end);

plugin.cpp

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -363,14 +363,14 @@ std::vector<ulong> PaserPlugin::for_each_vma(ulong& task_addr){
363363
return vma_list;
364364
}
365365

366-
ulonglong PaserPlugin::read_structure_field(ulong kvaddr,const std::string& type,const std::string& field){
366+
ulonglong PaserPlugin::read_structure_field(ulong addr,const std::string& type,const std::string& field,bool virt){
367367
int offset = type_offset(type,field);
368368
int size = type_size(type,field);
369369
std::string note = type + "_" + field;
370-
ulong addr = kvaddr + offset;
370+
addr += offset;
371371
ulonglong result = 0;
372372
void *buf = (void *)GETBUF(size);
373-
if (!readmem(addr, KVADDR, buf, size, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
373+
if (!readmem(addr, (virt ? KVADDR : PHYSADDR), buf, size, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
374374
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()), addr);
375375
FREEBUF(buf);
376376
return 0;
@@ -395,17 +395,17 @@ ulonglong PaserPlugin::read_structure_field(ulong kvaddr,const std::string& type
395395
return result;
396396
}
397397

398-
std::string PaserPlugin::read_cstring(ulong kvaddr,int len, const std::string& note){
398+
std::string PaserPlugin::read_cstring(ulong addr,int len, const std::string& note,bool virt){
399399
char res[len];
400-
if (!readmem(kvaddr, KVADDR, res, len, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
401-
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()), kvaddr);
400+
if (!readmem(addr, (virt ? KVADDR : PHYSADDR), res, len, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
401+
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()), addr);
402402
return nullptr;
403403
}
404404
return std::string(res);
405405
}
406406

407-
bool PaserPlugin::read_bool(ulong kvaddr,const std::string& note){
408-
void *buf = read_memory(kvaddr,sizeof(bool),note);
407+
bool PaserPlugin::read_bool(ulong addr,const std::string& note,bool virt){
408+
void *buf = read_memory(addr,sizeof(bool),note,virt);
409409
if(buf == nullptr){
410410
return false;
411411
}
@@ -414,8 +414,8 @@ bool PaserPlugin::read_bool(ulong kvaddr,const std::string& note){
414414
return res;
415415
}
416416

417-
int PaserPlugin::read_int(ulong kvaddr,const std::string& note){
418-
void *buf = read_memory(kvaddr,sizeof(int),note);
417+
int PaserPlugin::read_int(ulong addr,const std::string& note,bool virt){
418+
void *buf = read_memory(addr,sizeof(int),note,virt);
419419
if(buf == nullptr){
420420
return 0;
421421
}
@@ -424,8 +424,8 @@ int PaserPlugin::read_int(ulong kvaddr,const std::string& note){
424424
return res;
425425
}
426426

427-
uint PaserPlugin::read_uint(ulong kvaddr,const std::string& note){
428-
void *buf = read_memory(kvaddr,sizeof(uint),note);
427+
uint PaserPlugin::read_uint(ulong addr,const std::string& note,bool virt){
428+
void *buf = read_memory(addr,sizeof(uint),note,virt);
429429
if(buf == nullptr){
430430
return 0;
431431
}
@@ -434,8 +434,8 @@ uint PaserPlugin::read_uint(ulong kvaddr,const std::string& note){
434434
return res;
435435
}
436436

437-
long PaserPlugin::read_long(ulong kvaddr,const std::string& note){
438-
void *buf = read_memory(kvaddr,sizeof(long),note);
437+
long PaserPlugin::read_long(ulong addr,const std::string& note,bool virt){
438+
void *buf = read_memory(addr,sizeof(long),note,virt);
439439
if(buf == nullptr){
440440
return 0;
441441
}
@@ -444,8 +444,8 @@ long PaserPlugin::read_long(ulong kvaddr,const std::string& note){
444444
return res;
445445
}
446446

447-
ulong PaserPlugin::read_ulong(ulong kvaddr,const std::string& note){
448-
void *buf = read_memory(kvaddr,sizeof(ulong),note);
447+
ulong PaserPlugin::read_ulong(ulong addr,const std::string& note,bool virt){
448+
void *buf = read_memory(addr,sizeof(ulong),note,virt);
449449
if(buf == nullptr){
450450
return 0;
451451
}
@@ -454,8 +454,8 @@ ulong PaserPlugin::read_ulong(ulong kvaddr,const std::string& note){
454454
return res;
455455
}
456456

457-
ulonglong PaserPlugin::read_ulonglong(ulong kvaddr,const std::string& note){
458-
void *buf = read_memory(kvaddr,sizeof(ulonglong),note);
457+
ulonglong PaserPlugin::read_ulonglong(ulong addr,const std::string& note,bool virt){
458+
void *buf = read_memory(addr,sizeof(ulonglong),note,virt);
459459
if(buf == nullptr){
460460
return 0;
461461
}
@@ -464,8 +464,8 @@ ulonglong PaserPlugin::read_ulonglong(ulong kvaddr,const std::string& note){
464464
return res;
465465
}
466466

467-
ushort PaserPlugin::read_ushort(ulong kvaddr,const std::string& note){
468-
void *buf = read_memory(kvaddr,sizeof(ushort),note);
467+
ushort PaserPlugin::read_ushort(ulong addr,const std::string& note,bool virt){
468+
void *buf = read_memory(addr,sizeof(ushort),note,virt);
469469
if(buf == nullptr){
470470
return 0;
471471
}
@@ -474,8 +474,8 @@ ushort PaserPlugin::read_ushort(ulong kvaddr,const std::string& note){
474474
return res;
475475
}
476476

477-
short PaserPlugin::read_short(ulong kvaddr,const std::string& note){
478-
void *buf = read_memory(kvaddr,sizeof(short),note);
477+
short PaserPlugin::read_short(ulong addr,const std::string& note,bool virt){
478+
void *buf = read_memory(addr,sizeof(short),note,virt);
479479
if(buf == nullptr){
480480
return 0;
481481
}
@@ -484,47 +484,37 @@ short PaserPlugin::read_short(ulong kvaddr,const std::string& note){
484484
return res;
485485
}
486486

487-
void* PaserPlugin::read_memory(ulong kvaddr,int len, const std::string& note){
488-
void* buf = (void *)GETBUF(len);
489-
if (!readmem(kvaddr, KVADDR, buf, len, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
490-
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()), kvaddr);
491-
FREEBUF(buf);
492-
return nullptr;
493-
}
494-
return buf;
495-
}
496-
497-
void* PaserPlugin::read_phys_memory(ulong paddr, int len, const std::string& note){
487+
void* PaserPlugin::read_memory(ulong addr,int len, const std::string& note, bool virt){
498488
void* buf = (void *)GETBUF(len);
499-
if (!readmem(paddr, PHYSADDR, buf, len, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR)){
500-
fprintf(fp, "Can't read %s at %lx\n", TO_CONST_STRING(note.c_str()), paddr);
489+
if (!readmem(addr, (virt ? KVADDR : PHYSADDR), buf, len, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
490+
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()), addr);
501491
FREEBUF(buf);
502492
return nullptr;
503493
}
504494
return buf;
505495
}
506496

507-
void* PaserPlugin::read_struct(ulong kvaddr,const std::string& type){
497+
void* PaserPlugin::read_struct(ulong addr,const std::string& type,bool virt){
508498
int size = type_size(type);
509499
void* buf = (void *)GETBUF(size);
510-
if (!readmem(kvaddr, KVADDR, buf, size, TO_CONST_STRING(type.c_str()), RETURN_ON_ERROR|QUIET)) {
511-
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(type.c_str()),kvaddr);
500+
if (!readmem(addr, (virt ? KVADDR : PHYSADDR), buf, size, TO_CONST_STRING(type.c_str()), RETURN_ON_ERROR|QUIET)) {
501+
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(type.c_str()),addr);
512502
FREEBUF(buf);
513503
return nullptr;
514504
}
515505
return buf;
516506
}
517507

518-
bool PaserPlugin::read_struct(ulong kvaddr,void* buf, int len, const std::string& note){
519-
if (!readmem(kvaddr, KVADDR, buf, len, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
520-
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()),kvaddr);
508+
bool PaserPlugin::read_struct(ulong addr,void* buf, int len, const std::string& note,bool virt){
509+
if (!readmem(addr, (virt ? KVADDR : PHYSADDR), buf, len, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
510+
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()),addr);
521511
return false;
522512
}
523513
return true;
524514
}
525515

526-
ulong PaserPlugin::read_pointer(ulong kvaddr, const std::string& note){
527-
void *buf = read_memory(kvaddr,sizeof(void *),note);
516+
ulong PaserPlugin::read_pointer(ulong addr, const std::string& note,bool virt){
517+
void *buf = read_memory(addr,sizeof(void *),note,virt);
528518
if(buf == nullptr){
529519
return 0;
530520
}
@@ -533,10 +523,10 @@ ulong PaserPlugin::read_pointer(ulong kvaddr, const std::string& note){
533523
return res;
534524
}
535525

536-
unsigned char PaserPlugin::read_byte(ulong kvaddr, const std::string& note){
526+
unsigned char PaserPlugin::read_byte(ulong addr, const std::string& note,bool virt){
537527
unsigned char val;
538-
if (!readmem(kvaddr, KVADDR, &val, 1, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
539-
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()), kvaddr);
528+
if (!readmem(addr, (virt ? KVADDR : PHYSADDR), &val, 1, TO_CONST_STRING(note.c_str()), RETURN_ON_ERROR|QUIET)) {
529+
fprintf(fp, "Can't read %s at %lx\n",TO_CONST_STRING(note.c_str()), addr);
540530
return -1;
541531
}
542532
return val;

plugin.h

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -123,22 +123,21 @@ class PaserPlugin {
123123
std::vector<ulong> for_each_threads();
124124
std::vector<ulong> for_each_vma(ulong& task_addr);
125125

126-
ulonglong read_structure_field(ulong kvaddr,const std::string& type,const std::string& field);
127-
std::string read_cstring(ulong kvaddr,int len, const std::string& note);
128-
void* read_struct(ulong kvaddr,const std::string& type);
129-
bool read_struct(ulong kvaddr,void* buf, int len, const std::string& type);
130-
void* read_memory(ulong kvaddr,int len, const std::string& note);
131-
void* read_phys_memory(ulong paddr, int len, const std::string& note);
132-
ulong read_pointer(ulong kvaddr, const std::string& note);
133-
short read_short(ulong kvaddr,const std::string& note);
134-
ushort read_ushort(ulong kvaddr,const std::string& note);
135-
ulonglong read_ulonglong(ulong kvaddr,const std::string& note);
136-
ulong read_ulong(ulong kvaddr,const std::string& note);
137-
long read_long(ulong kvaddr,const std::string& note);
138-
uint read_uint(ulong kvaddr,const std::string& note);
139-
int read_int(ulong kvaddr,const std::string& note);
140-
bool read_bool(ulong kvaddr,const std::string& note);
141-
unsigned char read_byte(ulong kvaddr, const std::string& note);
126+
ulonglong read_structure_field(ulong addr,const std::string& type,const std::string& field,bool virt=true);
127+
std::string read_cstring(ulong addr,int len, const std::string& note,bool virt=true);
128+
void* read_struct(ulong addr,const std::string& type,bool virt=true);
129+
bool read_struct(ulong addr,void* buf, int len, const std::string& type,bool virt=true);
130+
void* read_memory(ulong addr,int len, const std::string& note,bool virt=true);
131+
ulong read_pointer(ulong addr, const std::string& note,bool virt=true);
132+
short read_short(ulong addr,const std::string& note,bool virt=true);
133+
ushort read_ushort(ulong addr,const std::string& note,bool virt=true);
134+
ulonglong read_ulonglong(ulong addr,const std::string& note,bool virt=true);
135+
ulong read_ulong(ulong addr,const std::string& note,bool virt=true);
136+
long read_long(ulong addr,const std::string& note,bool virt=true);
137+
uint read_uint(ulong addr,const std::string& note,bool virt=true);
138+
int read_int(ulong addr,const std::string& note,bool virt=true);
139+
bool read_bool(ulong addr,const std::string& note,bool virt=true);
140+
unsigned char read_byte(ulong addr, const std::string& note,bool virt=true);
142141
int csymbol_exists(const std::string& note);
143142
ulong csymbol_value(const std::string& note);
144143
bool is_kvaddr(ulong addr);

0 commit comments

Comments
 (0)