-
Notifications
You must be signed in to change notification settings - Fork 13
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
Merge mit pdos [4] (related to #261) #281
Conversation
get rid of static for walk() and freewalk()
fix bugs in read/write return values when there's an error
get rid of static for walk() and freewalk()
kernel-rs/src/uart.rs
Outdated
}; | ||
use core::ptr; | ||
|
||
use self::UartCtrlRegs::{FCR, IER, ISR, LCR, LSR, RBR, THR}; | ||
|
||
const UART_TX_BUF_SIZE: usize = 32; | ||
|
||
const IER_TX_ENABLE: u8 = 1 << 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bitflag면 bitflags! 를 사용하는게 어떨가 합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 PR에서 uart.rs
에 추가한 const들은 bitflags를 사용하기 껄끄러울 것 같습니다 😥 @jeehoonkang
- write 시 비트 별로 적는 것이 아닌
ptr::write_volatile()
을 사용합니다. (bitflags::insert()
와 다른 의미로 이해했습니다) - 이 const 변수들은
UART0
에 임의의 수를 더해 얻어지는*mut u8
주소에 있는 값을 읽고 쓰는 용도입니다.- (
UartCtrlRegs::read(), write()
할 때 사용되지만,UartCtrlRegs
의 값을 읽고 쓰는 것이 아니어서 bitflags를 사용하기 애매합니다.)
Lines 39 to 46 in 237d4be
fn reg(self) -> *mut u8 { match self { THR | RBR => UART0 as *mut u8, IER => (UART0 + 1) as *mut u8, FCR | ISR => (UART0 + 2) as *mut u8, LCR => (UART0 + 3) as *mut u8, LSR => (UART0 + 5) as *mut u8, }
- (
Uart::init()
에서 아직 하드코딩된 값을 write하는 경우가 있습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 넵 알겠습니다.
- 혹시 enum은 가능한가요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jeehoonkang 교수님, enum이 가능하긴 한데 좋은 코드는 아닌 것 같습니다.
IER_TX_ENABLE, FCR_FIFO_CLEAR, LSR_RX_READ
는 모두 같은 값 (1)을 가져, enum 안에 모두 넣을 수는 없습니다.- 아래와 같이 같은 enum으로 취급할 수 있긴 합니다.. enum과 const의 명명법이 달라서 아래와 같이 명명했는데, 가독성을 조금 포기하고 통일성을 주려면
IERTXENABLE, FCRFIFIOCLEAR, LSRRXREAD
로 하면 될 것 같습니다!
enum UartRegBits {
IerTxEnable= 1 << 0;
생략
}
impl UartRegBtis {
const FCR_FIFO_CLEAR:UartRegBits = UartRegBits::IerTxEnable;
const LSR_RX_READ:UartRegBits = UartRegBits::IerTxEnable;
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
음.. 일반적으로 이 상수들에 어떤 structure가 있는지 제가 이해하지 못해서 조언드리기 어려울 것 같은데요, 정우님이 생각하시기에 structure가 가장 잘 드러나는 방식으로 리팩토링해주시면 감사하겠습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 리팩토링 전처럼 const 변수들을 그대로 사용하는 것은 적절치 않고
- 해당 const 상수들 중 같은 값을 갖는 상수들이 있고
UartCtrlRegs::write(self, v: u8)
의v
가 하드코딩된 값 혹은 임의의 값이 주어지기 때문에
UartRegBits::bits()
함수를 만들었습니다!
@kimjungwow 정우님 혹시 uartputc sync를 사용함에 있어서 ctrl+P 결과가 제대로 출력되거나 하지는 않나요? |
kernel-rs/src/uart.rs
Outdated
}; | ||
use core::ptr; | ||
|
||
use self::UartCtrlRegs::{FCR, IER, ISR, LCR, LSR, RBR, THR}; | ||
|
||
const UART_TX_BUF_SIZE: usize = 32; | ||
|
||
const IER_TX_ENABLE: u8 = 1 << 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 넵 알겠습니다.
- 혹시 enum은 가능한가요.
@coolofficials 이 PR에서는 아직 ctrl+P 결과가 출력되지는 않습니다. 하지만 (논의가 진행 중인) #282 에서 변경한 내용들을 이 PR에 적용하면 정상적으로 출력됩니다! |
이거랑 #285 중에 뭘 먼저 머지하는게 좋을까요? 정우님이 판단해주세요. |
넵 알겠습니다. 수정해주시고 리뷰 재요청 해주세요 |
수정은 다 되었고, CI 통과하기를 기다리고 있었습니다! 리뷰 요청드립니다. 😊 @jeehoonkang |
@kimjungwow
|
|
@coolofficials #188 에서 논의를 이어가도 될까요? 😁 |
@kimjungwow 아 제가 저 당시 생각 정리가 좀 덜 되어 여쭤본건데, xv6 코드를 읽고 의도를 파악하여 #286 에 담아봤습니다. 리뷰 부탁드려요 👍 |
Rust 코드에 반영되었는지 한 번 더 확인 후 리뷰 요청 드리겠습니다 (related to #261 )
uart.c
에서 하드 코딩된 값을 사용하는 대신, define으로 설정함 ->uart.rs
에 반영 완료trampoline.S
에만 적용되어 Rust 해당 사항 없음vm.c
의walk(), freewalk()
에서 static 제거 -> Rust는 해당 사항 없음 (pub 함수도 아님)usertests.c
변경 : Rust 해당 사항 없음usertests.c
변경 : Rust 해당 사항 없음usertests.c
변경 : Rust 해당 사항 없음File::write, InodeGuard::write
도 차후의 PR (mit-pdos/xv6-riscv@5e392531c07966fd8a6bee50e3e357c553fb2a2f)을 따라 미리 변경 (주석도 적었습니다)trampoline.S
내 주석의tf
를trapframe
으로 변경 : Rust 해당 사항 없음