Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Oxidize Hafnium's initialization sequence #45

Closed
wants to merge 45 commits into from

Conversation

efenniht
Copy link
Collaborator

@efenniht efenniht commented Sep 6, 2019

Hafnium의 초기화 코드를 모두 Rust로 포팅하였습니다.

  • Closes Remaining C files #32.
  • 포팅된 C 파일: main.c, load.c, fdt.c, fdt_handler.c
    • main.rs라는 이름은 일반적으로 binary를 만드는 crate일 때 사용되는 특별한 이름입니다. 따라서 main.rs 대신 init.rs라는 파일로 main.c의 내용을 포팅했습니다.
    • 남은 C 파일은 layout.c, layout_fake.c, cpu.c, dlog.c, panic.c, plat.c 인데, 이것들은 모두 사연이 있어서 더 이상 포팅하지 않을 파일들입니다.
      • {layout, layout_fake}.c: Hafnium이 링크될 때 저장되는 섹션 별 주소를 읽는 함수들입니다. 완전히 arch-specific 하다고 말하기는 어렵지만 그렇다고 안 그렇다고 하기에도 어려운 코드입니다.
      • {dlog, panic}.c: variadic arguments를 받는 함수들이 남아 있습니다.
      • cpu.c: 부팅 과정에서 스택을 초기화하고 부팅 CPU ID를 저장하기 위해서 일회용의 static 변수가 있습니다. (Initializing static variable cpus by raw pointer causes error in Rust #6)
      • plat.c: 플랫폼별로 달라질 수 있는 함수들이 선언되어 있습니다. #pragma weak가 달려 있어서 다른 선언에 의해 덮어쓰일 수 있는데 (실제로 project/reference/linux_fdt/plat.c 에서 덮어씁니다), Rust에는 해당하는 지시자가 없습니다.
  • Oxidize FDT: FDT는 CPIO와 Memiter와 비슷하되 더 복잡한 파서입니다. 이것은 많이 개선될 여지가 있지만, 그 양에 비해 중요도는 떨어지므로 나중으로 미루도록 하겠습니다.
    • 한 가지 예시는, u64usize가 혼재되어 있는데, 이것의 추상화 레벨을 명확히 만들어서 그 레벨을 넘어갈 때 모두 type cast가 일어나도록 하는 것입니다.
  • New singleton objects: MemoryManager, CpuManager, VmManager, ApiManager
    • 여기저기에 산재해 있던 전역 변수들을 모아서 이들을 관리하는 manager 타입을 만들었습니다.
    • Init sequence에서 이것들의 new method를 호출하도록 합니다.
    • singleton에 안전하게 접근할 수 있도록 래퍼 함수들을 만들었습니다: singleton.rs.
    • 추상화를 더 잘 해서 method에서 singleton을 접근하는 경우를 줄일 수도 있겠으나... 굳이 그러지는 않는 걸로.
    • 일반적인 Rust 코드라면 완전히 초기화 된 vm_manager를 전역 변수 VM_MANAGER 에 할당하는 것이 맞지만, Vm은 초기화할 때 자기 자신의 주소를 필요로 하므로 Vm이 초기화된 이후에는 VmManager가 이동할 수 없습니다. Doubly circular linked list 가 이 모든 일의 원흉입니다.
    • CpuManager를 만들면서, C 파일에서 관리하던 Cpu의 배열을 Rust로 옮겼습니다.
      • 이것은 Initializing static variable cpus by raw pointer causes error in Rust #6 과 관련되어서 그 당시에 실패한 작업인데 이번에는 qemu+gdb로 디버깅하는 법을 익혀서 성공했습니다!
      • 다만 부팅 시에는 여전히 Cpu에 기록된 스택을 사용해야 하므로 딱 하나의 Cpu만 초기화하도록 cpu.c를 수정하였습니다.
    • ApiManager를 만들었으므로 이제 여기에 Modeling an object for api.rs? #44 를 해결하면 됩니다.
  • 사용되지 않는 FFI용 함수 삭제하기
    • api_init, cpu_module_init, vcpu_init, vcpu_set_cpu, vm_find.
    • 몇몇 함수는 실제 Hafnium 코드에서는 사용되지만 유닛 테스트 코드에서 사용됩니다. 그래서,
  • 유닛 테스트 포팅, 조금만 건드리기
    • Convert api.c into Rust code. #9 이후로 사용되지 않던 hf_vcpu_run_return_encode 함수를 삭제하고, 관련 유닛 테스트 코드를 Rust로 옮겼습니다.
    • 이 테스트는 cargo test로 실행할 수 있고, 이 명령을 kokoro test가 돌 때 같이 실행되도록 추가했습니다.
    • FDT를 포팅하면서 관련 유닛 테스트를 포팅하려고 했으나 실패했습니다. 원인은 libhfo2.a가 만들어질 때 실제 arch-dependent (fake) 함수들이 같이 link되지 않아서입니다. fake 함수들을 포팅하면 되겠으나 그것은 너무 일이 커지므로 일단 그대로 두었습니다.
  • 모든 테스트를 통과합니다!

@efenniht efenniht self-assigned this Sep 6, 2019
Copy link
Member

@jeehoonkang jeehoonkang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 일단 이정도로 메시지 남깁니다..
  • 코멘트 반영해주시고, 조만간 다시 코멘트 더 남기겠습니다.

hfo2/src/abi.rs Outdated Show resolved Hide resolved
hfo2/src/api.rs Outdated Show resolved Hide resolved
hfo2/src/api.rs Outdated Show resolved Hide resolved
hfo2/src/arch/fake.rs Show resolved Hide resolved
hfo2/src/arch/mod.rs Show resolved Hide resolved
hfo2/src/cpu.rs Show resolved Hide resolved
hfo2/src/fdt.rs Show resolved Hide resolved
hfo2/src/fdt.rs Show resolved Hide resolved
hfo2/src/fdt.rs Outdated Show resolved Hide resolved
hfo2/src/fdt.rs Outdated Show resolved Hide resolved
hfo2/src/fdt.rs Outdated Show resolved Hide resolved
hfo2/src/load.rs Outdated Show resolved Hide resolved
hfo2/src/utils.rs Show resolved Hide resolved
@efenniht
Copy link
Collaborator Author

PR에 달린 코멘트가 너무 많으므로, 새롭게 PR을 만들도록 하겠습니다.

@efenniht efenniht closed this Sep 11, 2019
jeehoonkang pushed a commit that referenced this pull request Sep 11, 2019
efenniht added a commit to efenniht/hafnium-verification that referenced this pull request Nov 13, 2019
efenniht added a commit to efenniht/hafnium-verification that referenced this pull request Nov 13, 2019
efenniht added a commit to efenniht/hafnium-verification that referenced this pull request Nov 13, 2019
efenniht added a commit that referenced this pull request Nov 26, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Remaining C files
2 participants