diff --git a/sound/soc/codecs/wcd-kdt_sample-v2.c b/sound/soc/codecs/wcd-kdt_sample-v2.c
index dba66e5..22b38ec 100644
--- a/sound/soc/codecs/wcd-kdt_sample-v2.c
+++ b/sound/soc/codecs/wcd-kdt_sample-v2.c
@@ -2484,9 +2484,6 @@
 {
  struct snd_soc_codec *codec = kdt_sample->codec;
 
-#ifdef CONFIG_KDT_RPI_SAMPLE 
- switch_dev_unregister(&kdt_sample->sdev);
-#endif //CONFIG_KDT_RPI_SAMPLE
  kdt_sample->kdt_sample_cb->free_irq(codec, kdt_sample->intr_ids->kdt_sample_sw_intr, kdt_sample);
  kdt_sample->kdt_sample_cb->free_irq(codec, kdt_sample->intr_ids->kdt_sample_btn_press_intr,
  kdt_sample);
@@ -2496,6 +2493,14 @@
  kdt_sample->kdt_sample_cb->free_irq(codec, kdt_sample->intr_ids->kdt_sample_hs_rem_intr, kdt_sample);
  kdt_sample->kdt_sample_cb->free_irq(codec, kdt_sample->intr_ids->hph_left_ocp, kdt_sample);
  kdt_sample->kdt_sample_cb->free_irq(codec, kdt_sample->intr_ids->hph_right_ocp, kdt_sample);
+#ifdef CONFIG_KDT_RPI_SAMPLE  
+ //switch_dev_unregister(&kdt_sample->sdev);
+ if (kdt_sample->sdev.name){
+     switch_dev_unregister(&kdt_sample->sdev);
+ memset(&kdt_sample->sdev, 0, sizeof(struct switch_dev));
+
+ }
+#endif //CONFIG_KDT_RPI_SAMPLE
  if (kdt_sample->kdt_sample_cb && kdt_sample->kdt_sample_cb->register_notifier)
  kdt_sample->kdt_sample_cb->register_notifier(codec, &kdt_sample->nblock, false);
  mutex_destroy(&kdt_sample->codec_resource_lock);

작년부터 제가 쓴 '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 책의 저자 직강 강의를 제작했습니다. 모든 강의가 마무리됐다는 소식을 전하기 위해 영상을 만들어 올립니다.

인프런에 로드맵 형태로 강의가 업로드됐는데요. 인프런 배너로 로드맵을 프로모션해주신 인프런 매니저님께 감사의 말씀드리고 싶습니다.

현재 30% 할인 쿠폰이 적용되어 프로모션 중이니 참고하세요.

시스템 소프트웨어 개발자를 위한 Arm - basic course
https://www.inflearn.com/roadmaps/763

'시스템 소프트웨어 개발의 모든 것 - 시스템 반도체와 전기 자동차 중심' 
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 - 1부 저자 직강'
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 - 2부 저자 직강'


시스템 소프트웨어 개발자를 위한 Arm - advanced course
https://www.inflearn.com/roadmaps/760

'Arm 아키텍처의 구조와 원리 3-1부: 트러스터존(TrustZone)' 
'Arm 아키텍처의 구조와 원리 3-2부: 가상화'
'Arm 아키텍처의 구조와 원리 3-4부: 메모리모델 & 배리어'
'Arm 아키텍처의 구조와 원리 3-3부: 캐시' 
'Arm 아키텍처의 구조와 원리 3-5부: 메모리 매니지먼트'
'Arm 아키텍처와 리눅스 커널 인터페이스'

앞으로 시스템 소프트웨에 개발에 도움이 되는 유익한 콘텐츠를 발굴해 
꾸준히 공유하도록 하겠습니다.

감사합니다.

 

 

 

 

Below link is pretty good.

 

https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/#

 

RISC-V Interpreter

Credit to Danny Qiu for the creation of the original MIPS interpreter.

www.cs.cornell.edu

 

 

drivers/tty/tty_buffer.c
static void flush_to_ldisc(struct work_struct *work)
{
struct tty_port *port = container_of(work, struct tty_port, buf.work);
struct tty_bufhead *buf = &port->buf;

mutex_lock(&buf->lock);

// check point to get dump

Code walkthrough 

 

MP:FFFFFFFF800030B8|ret_from_exception:     c.ldsp     x8,0x100(x2)   ; x8,256(x2)
MP:FFFFFFFF800030BA|                        csrci      sstatus,0x2   ; sstatus,2
MP:FFFFFFFF800030BE|                        andi       x8,x8,0x100   ; x8,x8,256
MP:FFFFFFFF800030C2|                        c.bnez     x8,0xFFFFFFFF800030D8   ; x8,restore_all
MP:FFFFFFFF800030C4|resume_userspace:       ld         x8,0x0(x4)    ; x8,0(x4)
MP:FFFFFFFF800030C8|                        andi       x9,x8,0x60E   ; x9,x8,1550
MP:FFFFFFFF800030CC|                        c.bnez     x9,0xFFFFFFFF8000312A   ; x9,work_pending
MP:FFFFFFFF800030CE|                        c.addi4spn x8,0x120      ; x8,288
MP:FFFFFFFF800030D0|                        sd         x8,0x10(x4)   ; x8,16(x4)
MP:FFFFFFFF800030D4|                        csrw       sscratch,x4
MP:FFFFFFFF800030D8|restore_all:            c.ldsp     x10,0x100(x2)   ; x10,256(x2)
MP:FFFFFFFF800030DA|                        c.ldsp     x12,0x0(x2)   ; x12,0(x2)
MP:FFFFFFFF800030DC|                        sc.d       x0,x12,(x2)
MP:FFFFFFFF800030E0|                        csrw       sstatus,x10
MP:FFFFFFFF800030E4|                        csrw       sepc,x12
MP:FFFFFFFF800030E8|                        c.ldsp     x1,0x8(x2)    ; x1,8(x2)
MP:FFFFFFFF800030EA|                        c.ldsp     x3,0x18(x2)   ; x3,24(x2)
MP:FFFFFFFF800030EC|                        c.ldsp     x4,0x20(x2)   ; x4,32(x2)
MP:FFFFFFFF800030EE|                        c.ldsp     x5,0x28(x2)   ; x5,40(x2)
MP:FFFFFFFF800030F0|                        c.ldsp     x6,0x30(x2)   ; x6,48(x2)
MP:FFFFFFFF800030F2|                        c.ldsp     x7,0x38(x2)   ; x7,56(x2)
MP:FFFFFFFF800030F4|                        c.ldsp     x8,0x40(x2)   ; x8,64(x2)
...
MP:FFFFFFFF80003122|                        c.ldsp     x31,0xF8(x2)   ; x31,248(x2)
MP:FFFFFFFF80003124|                        c.ldsp     x2,0x10(x2)   ; x2,16(x2)
MP:FFFFFFFF80003126|                        sret

100명 돌파 30% 할인 쿠폰 발행 
 100명 돌파(1,2부)를 기념하여 30% 할인 쿠폰(유데미)을 발행합니다.
감사합니다. 선착순 100명입니다.

  • 제목: 시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 2부- 저자직강
  • 쿠폰 : 04B86316BE5DBE6FE937 (기한 ~3/2/2024)
  • 유데미 강의 링크 : 링크 

시스템 반도체, 자동차 분야 등
시스템 소프트웨어 개발자라면 
꼭 알아야 할 Arm 아키텍처.

 

스마트폰은 물론 AI용 SoC 시스템 반도체, 전기자동차 Automotive(자율주행, 인포테인먼트) 그리고 클라우드 서버 및 맥북에서 사용되는 Arm 프로세서는 모두 Armv8-A 기반 64비트 Cortex-A 프로세서 (Cortex-A53, Cortex-A57, Cortex-A72 등...) 입니다. 현재 시스템 소프트웨어 업계에서 가장 많이 필요한 기반 지식이 요구되는 내용이 Armv8-A 아키텍처라고 볼 수 있어요. 그런데, 최신 Arm 아키텍처인 Armv8-A와 Armv7-A 아키텍처가 너무 어렵게만 느껴지셨나요?

 

이 강의에서는 Armv8-A와 Armv7-A 아키텍처의 핵심 중 핵심인 아래와 같은 내용을 다룹니다.

 

  • 1부 복습
  • 익셉션을 알아야 하는 이유
  • Armv7-익셉션(Exception)
  • Armv8-익셉션(Exception)
  • GIC(Generic Interrupt Controller)
  • AAPCS(Arm Procedure Call Standard)를 알아야 하는 이유
  • Armv7-AAPCS
  • Armv8-AAPCS  

 

시스템 소프트웨어 개발자, 임베디드 시스템(BSP) 프로그래머 주목!

시스템 반도체, 전기 자동차 분야(자율주행, 인포테인먼트)를 포함한 시스템 소프트웨어 분야에서 역량을 키우고 싶은 주니어 개발자   

시스템 반도체, 전기 자동차 분야와 같은 시스템 소프트웨어 개발을 하고 싶은 취업 준비생 

시스템 소프트웨어 분야(메모리, 파일 시스템, 운영체제)의 대학원 진학을 목표로 하는 대학생

시스템 소프트웨어 분야로 커리어를 전환하려는 다른 분야의 개발자 

많은 리눅스 임베디드 개발자를 희망하는 분들이라면 컴퓨터 구조나 운영체제를 배웁니다. 그리고 CS 이론도 어느 정도 공부합니다. 최근에 떠오르고 있는 시스템 반도체와 전기 자동차 시스템 소프트웨어 개발자는 리눅스 디바이스 드라이버, RTOS 혹은 부트로더를 분석합니다. 하지만 그것만으로는 무엇인가 부족하다는 것을 스스로 느낍니다. 전문 시스템 소프트웨어 개발자가 되기 위해 반드시 Arm 아키텍처를 알아야 한다는 사실을 알고 있지만, 막상 Arm 스펙 문서를 펼치는 순간 쉽지 않은 길이며 독학은 어렵겠다는 판단을 하게 됩니다.  


Arm 아키텍처의 핵심을 
이해하기 쉽게 설명해드립니다!

  • 1️⃣ Arm 아키텍처의 레지스터와 어셈블리 명령어에 대한 이해와 동작 모드와 익셉션 레벨 등 핵심 이론을 이해할 수 있습니다.  
  • 2️⃣ Arm 아키텍처를 이루는 주요 내용을 코드 수준에서 다시 경험하며 Arm 아키텍처에 대한 이해 수준이 훨씬 더 높아집니다.
  • 3️⃣ Arm 아키텍처가 지원하는 다양한 기능을 적극 활용함으로써 높은 안정성과 성능을 보장받는 시스템 프로그램(드라이버, 부트로더)을 개발할 수 있습니다. 
  • 4️⃣ 실전 프로젝트 개발에 필요한 각종 이론 및 사례를 스스로 이해할 수 있습니다. 

시스템 소프트웨어 개발의 핵심은 CPU 및 컴퓨터 구조라 해도 과언이 아닙니다. IT 업계에서 가장 필요로 하는 CPU 프로세서인, 최신 Arm 아키텍처(Armv8-A, Armv7-A)에 관한 핵심 이론을 쉽게 설명했습니다!

Arm 아키텍처가 어려운 이유는 Arm 아키텍처를 하드웨어 프로세서 관점으로만 배우기 때문입니다. 이 강의는 코드 분석과 구체적인 사례 소개로 Arm 아키텍처를 구성하는 내용이 실제 어떻게 사용되는지 설명합니다. 이 강의가 실력있는 시스템 소프트웨어 개발자가 될 수 있는 중추적인 역할을 해드릴 것입니다. 

 

⭐️ 강의의 차별화 포인트 

‘시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리’ 저자 직강 강의입니다.

 

먼저 시스템 반도체의 시스템 소프트웨어 개발 과정을 상세하게 설명하고, 시스템 소프트웨어 개발자(시스템 반도체 분야)가 되기 알아야 하는 내용을 소개합니다. 이와 더불어 Arm 아키텍처를 왜 배워야 하는지 상세히 설명합니다. 

 

시스템 반도체 개발 과정에서 Arm 아키텍처를 왜 잘 알아야 하는지 설명합니다. 또한 Arm 프로세서의 생태계와 비즈니스 모델에 대해서 설명합니다.



Arm 스펙 문서를 세세하게 분석하면서 Arm 아키텍처(Armv8-A, Armv7-A)에 대한 깊이 있는 내용을 설명합니다.



Arm 아키텍처의 스펙이 실제 소프트웨어로 어떻게 구현됐는지 어셈블리 명령어로 분석합니다. 큰 그림으로 전체 실행 흐름을 설명하고 실무에서 활용하면 좋은 다양한 디버깅 스킬도 함께 설명합니다. 



실무에서 많이 활용되는 TRACE32 디버거를 활용해 직접 디버깅을 하면서 Arm 아키텍처를 구성하는 '어셈블리 명령어', '레지스터', '동작 모드, '익셉션 레벨'의 동작 원리를 설명합니다.

 

 

책 집필/강의경력을 바탕으로
누구보다 깊고 상세하게!

국내 시스템 소프트웨어 분야에서 전무후무한! 'Arm 아키텍처(Armv8-A, Armv7-A)'와 '리눅스 커널' 책을 쓴 저자입니다. 또한 최신 시스템 소프트웨어 트렌드(전기자동차, 시스템 반도체- 시스템 소프트웨어)를 가장 잘 알고 있는 현업 개발자이자, 시스템 소프트웨어 분야에서 가장 지식 전파 활동을 활발하게 하는 교육자입니다. 

  • '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리'(2023년) 저자
  • '디버깅을 통해 배우는 리눅스 커널의 구조와 원리' (2021년, 대한민국 학술원 우수도서상) 저자
  • '프로그래머스 데브 코스: 리눅스 시스템 및 커널 전문가' 메인 강사
  • 2022년 6월, 한국컴퓨터종합학술대회 (KCC2022) - 튜토리얼 발표 [ftrace를 이용해 리눅스 커널 정복하기]
  • LG전자 '리눅스 커널' 및 'Armv8 아키텍처' 사내 강사(국내 및 해외 개발자 포함) - (2020년~2024) 

국내에서 어느 누구보다 Arm 아키텍처(Armv8-A, Armv7-A)를 이루는 주요 기능을 잘 설명할 수 있는 교육자라고 자신있게 말씀드릴 수 있습니다. 

100명 돌파 30% 할인 쿠폰 발행 
 100명 돌파(1,2부)를 기념하여 30% 할인 쿠폰(유데미)을 발행합니다.
감사합니다. 선착순 100명입니다.

  • (기한 ~3/2/2024)
  • 제목: 시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 1부- 저자직강
  • 쿠폰 : 4BE03378E2449FFFB149 (기한 ~3/2/2024)
  • 유데미 강의 링크 : 링크 

시스템 반도체, 자동차 분야 등
시스템 소프트웨어 개발자라면 
꼭 알아야 할 Arm 아키텍처.

 

스마트폰은 물론 AI용 SoC 시스템 반도체, 전기자동차 Automotive(자율주행, 인포테인먼트) 그리고 클라우드 서버 및 맥북에서 사용되는 Arm 프로세서는 모두 Armv8-A 기반 64비트 Cortex-A 프로세서 (Cortex-A53, Cortex-A57, Cortex-A72 등...) 입니다. 현재 시스템 소프트웨어 업계에서 가장 많이 필요한 기반 지식이 요구되는 내용이 Armv8-A 아키텍처라고 볼 수 있어요. 그런데, 최신 Arm 아키텍처인 Armv8-A와 Armv7-A 아키텍처가 너무 어렵게만 느껴지셨나요?

 

이 강의에서는 Armv8-A와 Armv7-A 아키텍처의 근간이 되는 아래와 같은 내용을 다룹니다.

 

- Arm 아키텍처 소개

- 레지스터

- 어셈블리 명령어

- 동작 모드

- 익셉션 레벨 

 

시스템 소프트웨어 개발자, 임베디드 시스템(BSP) 프로그래머 주목!

시스템 반도체, 전기 자동차 분야(자율주행, 인포테인먼트)를 포함한 시스템 소프트웨어 분야에서 역량을 키우고 싶은 주니어 개발자   

시스템 반도체, 전기 자동차 분야와 같은 시스템 소프트웨어 개발을 하고 싶은 취업 준비생 

시스템 소프트웨어 분야(메모리, 파일 시스템, 운영체제)의 대학원 진학을 목표로 하는 대학생

시스템 소프트웨어 분야로 커리어를 전환하려는 다른 분야의 개발자 

많은 리눅스 임베디드 개발자를 희망하는 분들이라면 컴퓨터 구조나 운영체제를 배웁니다. 그리고 CS 이론도 어느 정도 공부합니다. 최근에 떠오르고 있는 시스템 반도체와 전기 자동차 시스템 소프트웨어 개발자는 리눅스 디바이스 드라이버, RTOS 혹은 부트로더를 분석합니다. 하지만 그것만으로는 무엇인가 부족하다는 것을 스스로 느낍니다. 전문 시스템 소프트웨어 개발자가 되기 위해 반드시 Arm 아키텍처를 알아야 한다는 사실을 알고 있지만, 막상 Arm 스펙 문서를 펼치는 순간 쉽지 않은 길이며 독학은 어렵겠다는 판단을 하게 됩니다.  


Arm 아키텍처의 핵심을 
이해하기 쉽게 설명해드립니다!

  • 1️⃣ Arm 아키텍처의 레지스터와 어셈블리 명령어에 대한 이해와 동작 모드와 익셉션 레벨 등 핵심 이론을 이해할 수 있습니다.  
  • 2️⃣ Arm 아키텍처를 이루는 주요 내용을 코드 수준에서 다시 경험하며 Arm 아키텍처에 대한 이해 수준이 훨씬 더 높아집니다.
  • 3️⃣ Arm 아키텍처가 지원하는 다양한 기능을 적극 활용함으로써 높은 안정성과 성능을 보장받는 시스템 프로그램(드라이버, 부트로더)을 개발할 수 있습니다. 
  • 4️⃣ 실전 프로젝트 개발에 필요한 각종 이론 및 사례를 스스로 이해할 수 있습니다. 

시스템 소프트웨어 개발의 핵심은 CPU 및 컴퓨터 구조라 해도 과언이 아닙니다. IT 업계에서 가장 필요로 하는 CPU 프로세서인, 최신 Arm 아키텍처(Armv8-A, Armv7-A)에 관한 핵심 이론을 쉽게 설명했습니다!

Arm 아키텍처가 어려운 이유는 Arm 아키텍처를 하드웨어 프로세서 관점으로만 배우기 때문입니다. 이 강의는 코드 분석과 구체적인 사례 소개로 Arm 아키텍처를 구성하는 내용이 실제 어떻게 사용되는지 설명합니다. 이 강의가 실력있는 시스템 소프트웨어 개발자가 될 수 있는 중추적인 역할을 해드릴 것입니다. 

 

⭐️ 강의의 차별화 포인트 

‘시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리’ 저자 직강 강의입니다.

 

먼저 시스템 반도체의 시스템 소프트웨어 개발 과정을 상세하게 설명하고, 시스템 소프트웨어 개발자(시스템 반도체 분야)가 되기 알아야 하는 내용을 소개합니다. 이와 더불어 Arm 아키텍처를 왜 배워야 하는지 상세히 설명합니다. 

 

시스템 반도체 개발 과정에서 Arm 아키텍처를 왜 잘 알아야 하는지 설명합니다. 또한 Arm 프로세서의 생태계와 비즈니스 모델에 대해서 설명합니다.



Arm 스펙 문서를 세세하게 분석하면서 Arm 아키텍처(Armv8-A, Armv7-A)에 대한 깊이 있는 내용을 설명합니다.



Arm 아키텍처의 스펙이 실제 소프트웨어로 어떻게 구현됐는지 어셈블리 명령어로 분석합니다. 큰 그림으로 전체 실행 흐름을 설명하고 실무에서 활용하면 좋은 다양한 디버깅 스킬도 함께 설명합니다. 



실무에서 많이 활용되는 TRACE32 디버거를 활용해 직접 디버깅을 하면서 Arm 아키텍처를 구성하는 '어셈블리 명령어', '레지스터', '동작 모드, '익셉션 레벨'의 동작 원리를 설명합니다.

 

 

책 집필/강의경력을 바탕으로
누구보다 깊고 상세하게!

국내 시스템 소프트웨어 분야에서 전무후무한! 'Arm 아키텍처(Armv8-A, Armv7-A)'와 '리눅스 커널' 책을 쓴 저자입니다. 또한 최신 시스템 소프트웨어 트렌드(전기자동차, 시스템 반도체- 시스템 소프트웨어)를 가장 잘 알고 있는 현업 개발자이자, 시스템 소프트웨어 분야에서 가장 지식 전파 활동을 활발하게 하는 교육자입니다. 

  • '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리'(2023년) 저자
  • '디버깅을 통해 배우는 리눅스 커널의 구조와 원리' (2021년, 대한민국 학술원 우수도서상) 저자
  • '프로그래머스 데브 코스: 리눅스 시스템 및 커널 전문가' 메인 강사
  • 2022년 6월, 한국컴퓨터종합학술대회 (KCC2022) - 튜토리얼 발표 [ftrace를 이용해 리눅스 커널 정복하기]
  • LG전자 '리눅스 커널' 및 'Armv8 아키텍처' 사내 강사(국내 및 해외 개발자 포함) - (2020년~2024) 

국내에서 어느 누구보다 Arm 아키텍처(Armv8-A, Armv7-A)를 이루는 주요 기능을 잘 설명할 수 있는 교육자라고 자신있게 말씀드릴 수 있습니다. 

https://elixir.bootlin.com/linux/v6.8-rc1/source/arch/riscv/kernel/entry.S
SYM_CODE_START(handle_exception)
/*
 * If coming from userspace, preserve the user thread pointer and load
 * the kernel thread pointer.  If we came from the kernel, the scratch
 * register will contain 0, and we should continue on the current TP.
 */
csrrw tp, CSR_SCRATCH, tp
bnez tp, .Lsave_context
...
/*
 * MSB of cause differentiates between
 * interrupts and exceptions
 */
bge s4, zero, 1f

/* Handle interrupts */
tail do_irq


https://elixir.bootlin.com/linux/v6.8-rc1/source/arch/riscv/kernel/traps.c#L366
asmlinkage void noinstr do_irq(struct pt_regs *regs)
{
irqentry_state_t state = irqentry_enter(regs);

if (IS_ENABLED(CONFIG_IRQ_STACKS) && on_thread_stack())
call_on_irq_stack(regs, handle_riscv_irq);
else
handle_riscv_irq(regs);

irqentry_exit(regs, state);
}

https://elixir.bootlin.com/linux/v6.8-rc1/source/arch/riscv/kernel/traps.c#L355
static void noinstr handle_riscv_irq(struct pt_regs *regs)
{
struct pt_regs *old_regs;

irq_enter_rcu();
old_regs = set_irq_regs(regs);
handle_arch_irq(regs);
set_irq_regs(old_regs);
irq_exit_rcu();
}

https://elixir.bootlin.com/linux/v6.8-rc1/source/drivers/irqchip/irq-riscv-intc.c#L127
(where)
static int __init riscv_intc_init_common(struct fwnode_handle *fn)
{
...
rc = set_handle_irq(&riscv_intc_irq);
if (rc) {
pr_err("failed to set irq handler\n");
return rc;
}

https://elixir.bootlin.com/linux/v6.8-rc1/source/drivers/irqchip/irq-riscv-intc.c#L23
static asmlinkage void riscv_intc_irq(struct pt_regs *regs)
{
unsigned long cause = regs->cause & ~CAUSE_IRQ_FLAG;

if (unlikely(cause >= BITS_PER_LONG))
panic("unexpected interrupt cause");

generic_handle_domain_irq(intc_domain, cause);
}

https://elixir.bootlin.com/linux/v6.8-rc1/source/kernel/irq/irqdesc.c#L726
int generic_handle_domain_irq(struct irq_domain *domain, unsigned int hwirq)
{
return handle_irq_desc(irq_resolve_mapping(domain, hwirq));
}

Interrupt handling routines are architecture-dependent. The way interrupts are managed and processed can vary significantly between different computer architectures. Interrupt handling routines can be different between RISC-V and Armv8.

Understanding interrupt handling routines is crucial when dealing with real-time operating systems (RTOS) and the Linux kernel. Since RTOS and Linux kernel rely heavily on interrupt handling to efficiently manage and respond to events in a timely manner.

Here's a general outline of how interrupt handling might be implemented in Linux kernel based on RISC-V architecture:


[1] When interrupt is triggered from peripheral like device signals interrupt, interrupt handling routine is performed to handle interrupt request. Based on RISC-V architecture, 'handle_exception' is exception handler.

arch/riscv/kernel/entry.S
SYM_CODE_START(handle_exception)
...
la ra, ret_from_exception

/*
 * MSB of cause differentiates between
 * interrupts and exceptions
 */
bge s4, zero, 1f

/* Handle interrupts */
tail do_irq

[2] The call do_irq() function is made inside handle_exception as above.

do_irq() -> handle_riscv_irq() -> riscv_intc_irq() -> generic_handle_domain_irq()

[3] If IRQ is considered to be inter-processor interrupt, sbi_ipi_handle() is called.
Where sbi_ipi_handle() is set to chained handler in arch/riscv/kernel/sbi-ipi.c
 
[4] If IRQ is triggered from peripheral device(like sensor, touch, etc), plic_handle_irq() is called.
Where plic_handle_irq() is set to chained handler in drivers/irqchip/irq-sifive-plic.c.

[5] It is known that timer interrupt is handled in RISC-V in different ways. If timer IRQ is triggered, handle_percpu_devid_irq () is called.

The subroutine of [3],[4][5] will call the corresponding interrupt handler to take care of interrupt handling.

          <idle>-0       [000] d.h..   643.355357: irq_handler_entry: irq=16 name=virtio2
          <idle>-0       [000] d.h..   643.355397: <stack trace>
 => trace_event_raw_event_irq_handler_entry+0x96/0xf6
 => __traceiter_irq_handler_entry+0x2e/0x44
 => __handle_irq_event_percpu+0x13a/0x196
 => handle_irq_event+0x78/0xd2
 => handle_fasteoi_irq+0xa8/0x236
 => generic_handle_domain_irq+0x28/0x36
 => plic_handle_irq+0x86/0xfe
 => generic_handle_domain_irq+0x28/0x36
 => riscv_intc_irq+0x34/0x4c
 => do_irq+0x56/0x8e
 => ret_from_exception+0x0/0x64
 => default_idle_call+0x3a/0xd0
 => do_idle+0x214/0x23e
 => cpu_startup_entry+0x2e/0x30
 => kernel_init+0x0/0x168
 => arch_post_acpi_subsys_init+0x0/0x28
 => console_on_rootfs+0x0/0x70

'RISC-V' 카테고리의 다른 글

[RISC-V] system call return (s mode -> u mode)  (0) 2024.02.29
[RISC-V]: Interrupt handling - code walkthrough  (0) 2024.01.29

1. Please install utility to run crash-utility  

$ sudo apt-get install git build-essential bison zlib1g-dev libncurses5-dev libncursesw5-dev  pkg-config flex swig -y

2. Pull crash-utility source code with below command.

$ git clone https://github.com/crash-utility/crash.git

3. Build crash-utility Source code 

$ cd crash
$ make target=ARM64 -j3

(Warninig)

You may see error messages compiling crash-utility due to 'j' option.
In this case, please build crash-utility without 'j' option

$ cd crash
$ make target=ARM64 

After crash-utility is sucessfully compiled, 'crash' is generated.

4. Place the vmcore and vmlinux in the same directory. And copy 'crash' to the same directory where vmcore and vmlinux are placed.

$ ls
$ crash vmcore vmlinux
$ chmod 777 crash 
(Warning)

Please make sure that vmcore is matched to vmlinux. And then you need to use the below
command to start crash utility

5. Run crash-utility using below command

$ ./crash vmcore vmlinux

+ Recent posts